diff --git a/.gitignore b/.gitignore index 3bb4b517e45..f784b30d80e 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ data/ /_maps/map_files/**/backup/* /_maps/map_files/**/*.dmm.backup /nano/debug.html +*.db diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 215d85ade15..5baa13f652b 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -5824,7 +5824,7 @@ "chZ" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"}) "cia" = (/obj/machinery/power/apc{dir = 8; name = "Incinerator APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/incinerator) "cib" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cic" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/valve{dir = 2; name = "output gas to space"},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cic" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/binary/valve{dir = 2; name = "output gas to space"},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cid" = (/obj/machinery/atmospherics/binary/pump{dir = 2; on = 1},/obj/machinery/light/small{dir = 8},/obj/structure/sign/fire{pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/maintenance/incinerator) "cie" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/maintenance/incinerator) "cif" = (/obj/machinery/atmospherics/binary/pump{dir = 1; on = 1},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/maintenance/incinerator) @@ -7065,7 +7065,7 @@ "cFS" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cFT" = (/obj/machinery/airlock_sensor{id_tag = "tox_airlock_sensor"; master_tag = "tox_airlock_control"; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/binary/pump{dir = 4; on = 1},/turf/simulated/floor,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cFU" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/machinery/embedded_controller/radio/airlock{tag_airpump = "tox_airlock_pump"; tag_exterior_door = "tox_airlock_exterior"; id_tag = "tox_airlock_control"; tag_interior_door = "tox_airlock_interior"; pixel_x = -24; pixel_y = 0; tag_chamber_sensor = "tox_airlock_sensor"},/turf/simulated/floor{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/mixing{name = "\improper Toxins Lab"}) -"cFV" = (/obj/machinery/atmospherics/valve{dir = 4; name = "manual outlet valve"},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) +"cFV" = (/obj/machinery/atmospherics/binary/valve{dir = 4; name = "manual outlet valve"},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cFW" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cFX" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cFY" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/turf/simulated/floor/plating,/area/assembly/chargebay) @@ -7159,7 +7159,7 @@ "cHI" = (/obj/machinery/sparker{dir = 2; id = "mixingsparker"; pixel_x = 25},/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/fire{pixel_y = -32},/obj/machinery/atmospherics/binary/pump{dir = 8; on = 1},/turf/simulated/floor,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHK" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/machinery/door_control{id = "mixvent"; name = "Mixing Room Vent Control"; pixel_x = -25; pixel_y = 5; req_access_txt = "7"},/obj/machinery/ignition_switch{id = "mixingsparker"; pixel_x = -25; pixel_y = -5},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/mixing{name = "\improper Toxins Lab"}) -"cHL" = (/obj/machinery/atmospherics/valve{dir = 4; name = "manual inlet valve"},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) +"cHL" = (/obj/machinery/atmospherics/binary/valve{dir = 4; name = "manual inlet valve"},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHM" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHN" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cHO" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 2440c38ef6a..f370c13e883 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -635,7 +635,7 @@ "mk" = (/obj/structure/stool,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "ml" = (/obj/machinery/light/small,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mm" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel/withwallet,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"mn" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/snacks/flour,/obj/item/weapon/reagent_containers/food/snacks/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"mn" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mo" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mp" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/storage/fancy/egg_box,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mq" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) @@ -847,3 +847,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index c86a593a1ca..402d5d3b837 100644 --- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm @@ -472,7 +472,7 @@ "jd" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "je" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "jf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction,/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) -"jg" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/snacks/flour,/obj/item/weapon/reagent_containers/food/snacks/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) +"jg" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "jh" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/camera{c_tag = "Gateway Chamber"; dir = 4; network = list("UO45","UO45R")},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"}) "ji" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"}) "jj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"}) @@ -1437,3 +1437,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index b7af4ec0741..7803e20bae8 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -1476,9 +1476,9 @@ "aCt" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aCu" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry) "aCv" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod1/station) -"aCw" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_1"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; req_one_access_txt = "0"; tag_door = "escape_pod_1_hatch"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) +"aCw" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1379; id_tag = "escape_pod_1"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; req_one_access_txt = "0"; tag_door = "escape_pod_1_hatch"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) "aCx" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod2/station) -"aCy" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_2"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; req_one_access_txt = "0"; tag_door = "escape_pod_2_hatch"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) +"aCy" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1379; id_tag = "escape_pod_2"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; req_one_access_txt = "0"; tag_door = "escape_pod_2_hatch"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) "aCz" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "arrivals_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "arrivals_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "arrivals_pump"; tag_exterior_door = "arrivals_outer"; frequency = 1379; id_tag = "arrivals_airlock"; tag_interior_door = "arrivals_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "arrivals_sensor"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aCA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aCB" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -1588,10 +1588,10 @@ "aEB" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/maintenance/electrical) "aEC" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/bluegrid,/area/maintenance/electrical) "aED" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape_pod1/station) -"aEE" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) +"aEE" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "escape_pod_1_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) "aEF" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape_pod1/station) "aEG" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape_pod2/station) -"aEH" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) +"aEH" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "escape_pod_2_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) "aEI" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape_pod2/station) "aEJ" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/hallway/secondary/entry) "aEK" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -1724,9 +1724,9 @@ "aHh" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical) "aHi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical) "aHj" = (/obj/structure/table,/obj/item/clothing/gloves/color/fyellow,/obj/item/weapon/storage/toolbox/electrical,/obj/item/device/multitool,/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/electrical) -"aHk" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_berth_hatch"; locked = 1; name = "Escape Pod"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/hallway/secondary/entry) +"aHk" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "escape_pod_1_berth_hatch"; locked = 1; name = "Escape Pod"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/hallway/secondary/entry) "aHl" = (/obj/structure/sign/pods,/turf/simulated/wall,/area/hallway/secondary/entry) -"aHm" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_berth_hatch"; locked = 1; name = "Escape Pod"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/hallway/secondary/entry) +"aHm" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "escape_pod_2_berth_hatch"; locked = 1; name = "Escape Pod"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/hallway/secondary/entry) "aHn" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aHo" = (/obj/machinery/optable,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aHp" = (/turf/simulated/floor/airless{icon_state = "damaged5"},/area/space) @@ -1781,9 +1781,9 @@ "aIm" = (/obj/structure/table,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = 5},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plating,/area/maintenance/electrical) "aIn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry) "aIo" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) -"aIp" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_1_berth"; pixel_x = -25; pixel_y = 30; tag_door = "escape_pod_1_berth_hatch"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) +"aIp" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1379; id_tag = "escape_pod_1_berth"; pixel_x = -25; pixel_y = 30; tag_door = "escape_pod_1_berth_hatch"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) "aIq" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Arrivals Escape Pods"; dir = 2},/turf/simulated/floor,/area/hallway/secondary/entry) -"aIr" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_2_berth"; pixel_x = -25; pixel_y = 30; tag_door = "escape_pod_2_berth_hatch"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) +"aIr" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1379; id_tag = "escape_pod_2_berth"; pixel_x = -25; pixel_y = 30; tag_door = "escape_pod_2_berth_hatch"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) "aIs" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry) "aIt" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry) "aIu" = (/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry) @@ -2390,7 +2390,7 @@ "aTX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/hallway/secondary/construction{name = "\improper Garden"}) "aTY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/table/glass,/obj/item/weapon/hatchet,/obj/item/weapon/minihoe,/obj/item/weapon/crowbar,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hallway/secondary/construction{name = "\improper Garden"}) "aTZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) -"aUa" = (/obj/structure/table/glass,/obj/item/weapon/storage/bag/plants,/obj/item/device/analyzer/plant_analyzer,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -6; pixel_y = -25},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"}) +"aUa" = (/obj/machinery/atm{pixel_y = -32},/turf/simulated/floor{dir = 2; icon_state = "barber"},/area/civilian/barber) "aUb" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/turf/simulated/floor,/area/storage/primary) "aUc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/storage/primary) "aUd" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/storage/primary) @@ -2508,13 +2508,13 @@ "aWl" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central) "aWm" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/hallway/primary/central/ne) "aWn" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/boozeomat,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aWo" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aWo" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aWp" = (/obj/machinery/requests_console{department = "Bar"; name = "Bar Requests Console"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/beer,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aWq" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Bar North"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/soda,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aWr" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aWs" = (/obj/machinery/power/apc{dir = 1; name = "Bar APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar) -"aWt" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/bar) -"aWu" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) +"aWs" = (/obj/machinery/power/apc{dir = 1; name = "Bar APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) +"aWt" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/obj/effect/decal/leaves{dir = 1},/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) +"aWu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aWv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aWw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aWx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) @@ -2525,7 +2525,7 @@ "aWC" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics) "aWD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/grass,/area/hydroponics) "aWE" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics) -"aWF" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/screwdriver,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/wrench,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/storage/box/botanydisk,/obj/item/weapon/storage/box/beakers,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) +"aWF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/crate/hydroponics/prespawned,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) "aWG" = (/obj/structure/table,/obj/item/weapon/watertank,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) "aWH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) "aWI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) @@ -2607,15 +2607,15 @@ "aYg" = (/obj/machinery/power/apc{dir = 1; name = "Central Hall NE APC"; pixel_y = 26},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor,/area/hallway/primary/central/ne) "aYh" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor,/area/hallway/primary/central/ne) "aYi" = (/turf/simulated/floor,/area/hallway/primary/central/ne) -"aYj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aYk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/packageWrap,/obj/item/weapon/pen/blue{pixel_x = 0; pixel_y = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/book/manual/barman_recipes,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aYl" = (/obj/structure/disposalpipe/segment{dir = 4},/mob/living/carbon/human/monkey/punpun,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aYm" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aYj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/packageWrap,/obj/item/weapon/pen/blue{pixel_x = 0; pixel_y = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/book/manual/barman_recipes,/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aYk" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aYl" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aYm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/leaves{dir = 8},/mob/living/carbon/human/monkey/punpun,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aYn" = (/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aYo" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/lighter/zippo,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aYp" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar) +"aYp" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aYq" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/bar) -"aYr" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar) +"aYr" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/obj/machinery/light{dir = 4},/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aYs" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/kitchenspike,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aYt" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aYu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) @@ -2695,8 +2695,8 @@ "aZQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/hallway/primary/central/ne) "aZR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/hallway/primary/central/ne) "aZS" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA2"; location = "Dorm"},/turf/simulated/floor,/area/hallway/primary/central/ne) -"aZT" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aZU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aZT" = (/turf/simulated/floor{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/mob/living/simple_animal/turkey,/turf/simulated/floor{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics) +"aZU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aZV" = (/obj/structure/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Bartender"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aZW" = (/obj/machinery/door/window{dir = 4; name = "Bar Door"; req_access_txt = "25"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aZX" = (/turf/simulated/floor/carpet,/area/crew_quarters/bar) @@ -2772,7 +2772,7 @@ "bbp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne) "bbq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne) "bbr" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/hallway/primary/central/ne) -"bbs" = (/obj/machinery/slot_machine,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"bbs" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light_switch{pixel_x = -25},/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "bbt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/slot_machine,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "bbu" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "bbv" = (/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) @@ -2851,9 +2851,9 @@ "bcQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bcR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bcS" = (/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bcT" = (/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bcU" = (/obj/machinery/camera{c_tag = "Bar East"; network = list("SS13")},/obj/structure/flora/kirbyplants,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bcV" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) +"bcT" = (/obj/machinery/slot_machine,/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"bcU" = (/obj/effect/decal/straw/edge,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bcV" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/light{dir = 1},/obj/machinery/door/window{dir = 4; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bcW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bcX" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bcY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) @@ -2947,7 +2947,7 @@ "beI" = (/obj/structure/piano,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "beJ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/bar) "beK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"beL" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) +"beL" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window{dir = 4; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "beM" = (/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "beN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "beO" = (/obj/machinery/camera{c_tag = "Kitchen"; network = list("SS13")},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/kitchen_machine/candy_maker,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) @@ -3346,7 +3346,7 @@ "bmr" = (/obj/machinery/power/apc{dir = 2; name = "Central Hall APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/central/ne) "bms" = (/obj/machinery/light,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/central/ne) "bmt" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne) -"bmu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bmu" = (/obj/machinery/camera{c_tag = "Bar East"; network = list("SS13")},/obj/machinery/newscaster{pixel_y = 32},/obj/structure/flora/straw_bail/alt_1,/obj/effect/decal/straw/edge{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bmv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bmw" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar) "bmx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) @@ -3406,18 +3406,18 @@ "bnz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload) "bnA" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain) "bnB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{id_tag = "captainofficedoor"; name = "Captain's Office"; req_access = null; req_access_txt = "20"},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bnC" = (/obj/machinery/computer/arcade,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bnD" = (/obj/machinery/media/jukebox/bar,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bnE" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bnC" = (/obj/structure/noticeboard{pixel_y = 32},/obj/effect/decal/straw/edge,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bnD" = (/obj/effect/decal/straw/edge{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bnE" = (/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bnF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bnG" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bnG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/flora/corn_stalk/alt_2,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bnH" = (/obj/machinery/camera{c_tag = "Bar South"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bnI" = (/obj/item/device/radio/intercom{pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bnJ" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/structure/flora/kirbyplants,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar) +"bnI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bnJ" = (/obj/effect/decal/straw/edge{dir = 8},/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar) "bnK" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/vending/dinnerware,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bnL" = (/obj/machinery/icemachine,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) -"bnM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) -"bnN" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) +"bnM" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/eastleft{base_state = "right"; icon_state = "right"; layer = 3; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) +"bnN" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westright{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bnO" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "bnP" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics) "bnQ" = (/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics) @@ -3491,10 +3491,10 @@ "bpg" = (/obj/structure/sign/directions/evac{dir = 4},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 7},/obj/structure/sign/directions/science{dir = 4},/turf/simulated/wall,/area/crew_quarters/bar) "bph" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor,/area/crew_quarters/bar) "bpi" = (/obj/structure/sign/barsign,/turf/simulated/wall,/area/crew_quarters/bar) -"bpj" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) +"bpj" = (/obj/machinery/media/jukebox/bar,/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bpk" = (/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) -"bpl" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 2"; dir = 2; network = list("SS13")},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) -"bpm" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) +"bpl" = (/obj/machinery/computer/arcade,/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bpm" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/flora/corn_stalk/alt_1,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bpn" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/westright{dir = 1; name = "Hydroponics Desk"; req_access_txt = "35"},/turf/simulated/floor,/area/hydroponics) "bpo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor,/area/hydroponics) "bpp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/starboard/east) @@ -3553,7 +3553,7 @@ "bqq" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor,/area/hallway/primary/starboard/west) "bqr" = (/turf/simulated/floor,/area/hallway/primary/starboard) "bqs" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/hallway/primary/starboard/west) -"bqt" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor,/area/hallway/primary/starboard/west) +"bqt" = (/obj/structure/flora/straw_bail,/obj/effect/decal/straw/edge{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bqu" = (/turf/simulated/floor{dir = 9; icon_state = "green"},/area/hallway/primary/starboard/west) "bqv" = (/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hallway/primary/starboard/west) "bqw" = (/turf/simulated/floor{dir = 5; icon_state = "green"},/area/hallway/primary/starboard/west) @@ -5959,7 +5959,7 @@ "ckE" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ckF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ckG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/toxins/explab) -"ckH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "E.X.P.E.R.I-MENTOR Lab Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"ckH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "E.X.P.E.R.I-MENTOR Lab Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ckI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall/r_wall,/area/toxins/explab) "ckJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/toxins/explab) "ckK" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/toxins/explab) @@ -6161,8 +6161,8 @@ "coy" = (/obj/machinery/power/apc{dir = 4; name = "Medbay Storage APC"; pixel_x = 25},/obj/structure/cable,/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/medical/biostorage) "coz" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint) "coA" = (/turf/simulated/wall/r_wall,/area/maintenance/asmaint) -"coB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"coC" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"coB" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/effect/decal/warning_stripes/southwestcorner,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"coC" = (/obj/structure/table/glass,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/device/analyzer/plant_analyzer,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -6; pixel_y = -25},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"}) "coD" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint) "coE" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/toxins/xenobiology) "coF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -6746,7 +6746,7 @@ "czL" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating,/area/maintenance/asmaint) "czM" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/maintenance/asmaint2) "czN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"czO" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"czO" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westleft{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "czP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "czQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology) "czR" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/obj/machinery/camera{c_tag = "Medbay Virology Entrance"; dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/medical/patients_rooms) @@ -6978,7 +6978,7 @@ "cEj" = (/turf/simulated/wall/r_wall,/area/medical/patient_b) "cEk" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) "cEl" = (/obj/structure/table,/obj/item/weapon/storage/box/monkeycubes,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"cEm" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/sheet/mineral/plasma{amount = 5; layer = 2.9},/obj/machinery/media/receiver/boombox,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"cEm" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/sheet/mineral/plasma{amount = 8; layer = 2.9},/obj/machinery/media/receiver/boombox,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cEn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cEo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cEp" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -7143,13 +7143,13 @@ "cHs" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Air To Distro"},/obj/machinery/power/apc{dir = 1; name = "Atmospherics Distribution Loop APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/atmos/distribution) "cHt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution) "cHu" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/turf/simulated/floor,/area/atmos/distribution) -"cHv" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10; level = 2},/turf/space,/area/space) +"cHv" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10; level = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/space) "cHw" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera{c_tag = "Virology Module North"; network = list("SS13")},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cHx" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cHy" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cHz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/atmos/distribution) "cHA" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix to Gas Turbine"},/turf/simulated/floor,/area/atmos/distribution) -"cHB" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/space,/area/space) +"cHB" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/space) "cHC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/medical/virology) "cHD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cHE" = (/obj/machinery/camera{c_tag = "Xenobiology Module South"; dir = 4; network = list("Research","SS13"); pixel_x = 0},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) @@ -7746,8 +7746,8 @@ "cSX" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space) "cSY" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space) "cSZ" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space) -"cTa" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space) -"cTb" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/space,/area/space) +"cTa" = (/obj/structure/lattice,/turf/simulated/wall/r_wall,/area/atmos) +"cTb" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/space) "cTc" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/storage/secure) "cTd" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cTe" = (/obj/item/device/multitool,/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -7790,7 +7790,7 @@ "cTP" = (/obj/item/device/radio,/turf/simulated/floor/plating/airless,/area/engine/engineering) "cTQ" = (/obj/structure/lattice,/obj/item/clothing/head/hardhat,/turf/space,/area/space) "cTR" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/engine/engineering) -"cTS" = (/obj/machinery/camera{c_tag = "Mini Satellite Access"; dir = 4; network = list("SS13","MiniSat")},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/engine/engineering) +"cTS" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/space) "cTT" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engine/engineering) "cTU" = (/turf/simulated/floor{icon_state = "dark"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/transit_tube{icon_state = "Block"},/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering) "cTV" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engine/engineering) @@ -7801,26 +7801,26 @@ "cUa" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity East"; dir = 8; network = list("Singularity","SS13")},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cUb" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cUc" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "MiniSat Access"; req_access_txt = "75"},/turf/simulated/floor,/area/engine/engineering) -"cUd" = (/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/engine/engineering) +"cUd" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/space) "cUe" = (/turf/simulated/floor{icon_state = "dark"},/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/obj/structure/transit_tube_pod,/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering) "cUf" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cUg" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cUh" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cUi" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cUj" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) -"cUk" = (/obj/structure/closet/emcloset,/obj/machinery/light_switch{pixel_x = -27},/turf/simulated/floor{dir = 10; icon_state = "blue"},/area/engine/engineering) +"cUk" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/space) "cUl" = (/obj/machinery/light,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/engine/engineering) -"cUm" = (/turf/simulated/floor{icon_state = "dark"},/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering) +"cUm" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/structure/lattice,/turf/space,/area/space) "cUn" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/plating,/area/engine/engineering) "cUo" = (/obj/structure/transit_tube{icon_state = "N-SE"},/turf/space,/area/space) "cUp" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/space,/area/space) -"cUq" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{id_tag = "escape_pod_5_berth"; pixel_x = 25; pixel_y = -5; tag_door = "escape_pod_5_berth_hatch"},/turf/simulated/floor/plating,/area/engine/engineering) +"cUq" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/obj/structure/lattice,/turf/space,/area/space) "cUr" = (/obj/structure/transit_tube{tag = "icon-D-NE"; icon_state = "D-NE"},/turf/space,/area/space) -"cUs" = (/obj/structure/transit_tube{tag = "icon-E-NW"; icon_state = "E-NW"},/turf/space,/area/space) +"cUs" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/engine/engineering) "cUt" = (/obj/structure/transit_tube,/obj/structure/lattice,/turf/space,/area/space) "cUu" = (/obj/structure/transit_tube,/turf/space,/area/space) -"cUv" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/turf/space,/area/space) -"cUw" = (/obj/structure/transit_tube{icon_state = "W-SE"},/turf/space,/area/space) +"cUv" = (/obj/machinery/access_button/airlock_exterior{master_tag = "atmospherics_south"; pixel_x = -25; pixel_y = -8},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/space) +"cUw" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/space) "cUx" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/obj/structure/lattice,/turf/space,/area/space) "cUy" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "escape_pod_5_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) "cUz" = (/obj/structure/transit_tube{icon_state = "NW-SE"},/obj/structure/lattice,/turf/space,/area/space) @@ -8131,7 +8131,7 @@ "das" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dat" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dau" = (/obj/machinery/door/airlock/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"dav" = (/obj/machinery/atmospherics/binary/pump,/obj/structure/lattice,/turf/space,/area/space) +"dav" = (/obj/structure/lattice,/obj/machinery/atmospherics/binary/pump/on,/turf/space,/area/maintenance/turbine) "daw" = (/obj/machinery/atmospherics/binary/pump{on = 1},/obj/machinery/access_button{command = "cycle_exterior"; layer = 3.1; master_tag = "turbine_control"; name = "Gas Turbine Airlock Control"; pixel_x = 5; pixel_y = -23},/obj/machinery/light/small{dir = 8},/obj/structure/sign/fire{pixel_x = -32},/turf/simulated/floor/engine,/area/maintenance/turbine) "dax" = (/obj/machinery/atmospherics/binary/pump{dir = 1; on = 1},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "turbine_control"; name = "Gas Turbine Airlock Control"; pixel_x = -8; pixel_y = 24},/obj/machinery/light/small{dir = 4},/obj/structure/sign/fire{pixel_x = 32},/turf/simulated/floor/engine,/area/maintenance/turbine) "day" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine,/area/maintenance/turbine) @@ -8265,6 +8265,32 @@ "dcW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/wall/r_wall,/area/engine/engineering) "dcX" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor{dir = 6; icon_state = "caution"},/area/atmos) "dcY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/requests_console{department = "Mechanic"; departmentType = 2; name = "Mechanic's Workshop Requests Console"; pixel_y = 30},/turf/simulated/floor,/area/engine/mechanic_workshop) +"dcZ" = (/obj/machinery/light,/obj/structure/flora/corn_stalk,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"dda" = (/obj/item/device/radio/intercom{pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/obj/effect/decal/leaves{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"ddb" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/structure/flora/straw_bail,/obj/effect/decal/straw/edge{dir = 9},/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar) +"ddc" = (/obj/effect/decal/straw/edge{dir = 1},/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar) +"ddd" = (/obj/machinery/hologram/holopad,/obj/structure/flora/corn_stalk/alt_2,/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) +"dde" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 2"; dir = 2; network = list("SS13")},/obj/structure/flora/corn_stalk/alt_2,/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) +"ddf" = (/obj/structure/flora/straw_bail/alt_2,/obj/effect/decal/straw/edge{dir = 10},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) +"ddg" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/effect/decal/straw/edge,/turf/simulated/floor,/area/hallway/primary/starboard/west) +"ddh" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/engine/engineering) +"ddi" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "atmospherics_south_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "atmospherics_south_sensor"; pixel_x = -8; pixel_y = -30},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "atmospherics_south"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_airpump = "atmospherics_south_pump"; tag_chamber_sensor = "atmospherics_south_sensor"; tag_exterior_door = "atmospherics_south_outer"; tag_interior_door = "atmospherics_south_inner"},/turf/simulated/floor/plating,/area/engine/engineering) +"ddj" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_inner"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) +"ddk" = (/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_outer"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) +"ddl" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/access_button/airlock_interior{master_tag = "atmospherics_south"; pixel_x = 22; pixel_y = 10},/turf/simulated/floor/plating,/area/engine/engineering) +"ddm" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/engine/engineering) +"ddn" = (/obj/machinery/camera{c_tag = "Mini Satellite Access"; dir = 4; network = list("SS13","MiniSat")},/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/engine/engineering) +"ddo" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engine/engineering) +"ddp" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor{dir = 10; icon_state = "blue"},/area/engine/engineering) +"ddq" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/engine/engineering) +"ddr" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/engine/engineering) +"dds" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{id_tag = "escape_pod_5_berth"; pixel_x = 25; pixel_y = -5; tag_door = "escape_pod_5_berth_hatch"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plating,/area/engine/engineering) +"ddt" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/engine/engineering) +"ddu" = (/obj/structure/transit_tube{tag = "icon-E-NW"; icon_state = "E-NW"},/obj/structure/lattice,/turf/space,/area/space) +"ddv" = (/obj/structure/transit_tube{icon_state = "W-SE"},/obj/structure/lattice,/turf/space,/area/space) +"ddw" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/space) +"ddx" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/turf/space,/area/space) +"ddy" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westleft{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8362,7 +8388,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapsapsapsaaaaaaaaaaaaaaaaaaaabaabaaaaabaaaaaaaabaxRaxSaxTaxUaxRaxVaxVaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawmaxWaxXaxYaxZayaaybaycaydayeayfaxqaxqaygaxqaxqaxqaxqaxqayhaxqaxqaxqaxqaxqaxqayiaxqaxqaxqaxqayjaxqaykaxqaylaxqaymaynapWayoaypayqayraysaytaxEayuavUayvaywayxayyayzayAayBawMavWaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabayCayDayEayFayCaabaaaaabaaaaaaaabaaaaaaaabaabaaaaaaayGasMavlasMavlayHayIayHayJayHayHayHayKayGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxVaxVaxVaxVaxVaabaabaxRayLayMayNaxRayOaxVaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawmayPayQayRaySayTawmayUayVayWayXayYayZazaazbazcayXayXayXazdayXayXayXayXayXayXazeazfazgazgazgazhaziazjaziazkazlazmaznapWazoazoazoazoazoazoaxEaxFavUazpaxHazqavVcscazraxJcvYavWaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaabayCazsaztazuayCaabaaaaabaaaaaaaabaaaaaaayGazvayGazvayGayKayHayHayHayHayHayHayHayHayHazwazxayGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaazyazzazyaaaaaaaaaaxVaxVaxVaxVazAazBazCaxVaaaaaaaxRazDazEazFazGazHaxVaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawmawmawmawmawmawmawmazIazIazJazKazKazLazMazNazOazPazPazOazQazOazRazRazRazRazRazRazSazRazRazTazUazVazWazIazXazIazYazIazIaqVazZaovaovaovaovaAaaxFavUaAbaxHaAcavVaAdayAayBawMavWaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaazyaAeazyaaaaabayCaAfaAgaAhayCaAiaAiaAiaAiaAiazvazvazvayGaAjayHazwazxayJayHayJayJayJayGaAkayGayGayGayGayGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaAlaAmaAlaaaaaaaabaxVaAnaAoaApazHaAqazHaxVaAlaAlaxRaxRaAraAsazGazHaxVaxVaAlaAlaAlaxVaxVaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazJaAtaAuaAvazMaAwazOaAxaAyaAzaAAaABaACaADaAEaAFaAGaAHaAIaAJaAKaALaxqaxraAMaANaAOaAPaAQaAPaAPaAPaARaAPaAPaAPaAPaASaATaAUaAVaAWaAXaAYcNsaBaaxJdcuavWaabaBbaBcaBcaBcaBcaBcaBdaabaabaaaaaaaaaaaaazvaBeazvaaaaAiayCayCaBfaBgayCaBhayHayHayHayJaBiayHaBjayGayHayHayHaBkayJayHayGaBlaBmayGayHaBnayGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaAlaAmaAlaaaaaaaabaxVaAnaAoaApazHaAqazHaxVaAlaAlaxRaxRaAraAsazGazHaxVaxVaAlaAlaAlaxVaxVaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazJaAtaAuaAvazMaAwazOaAxaAyaAzaAAaABaACaADaAEaAFaAGaAHaAIaAJaAKaALaxqaxraAMaANaAOaAPaAQaAPaAPaAPaARaAPaAPaAPaAPaASaATaAUaAVaAWaAXaAYcNsaBaaUadcuavWaabaBbaBcaBcaBcaBcaBcaBdaabaabaaaaaaaaaaaaazvaBeazvaaaaAiayCayCaBfaBgayCaBhayHayHayHayJaBiayHaBjayGayHayHayHaBkayJayHayGaBlaBmayGayHaBnayGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBoaBpaBqaaaaBraBsaBtaabaabaAlazHaAlaaaaaaaabaxVaBuaBvaBwaBxaByaBzaxVaBAazHaBBaBCaBDaBEaBEaBEaBEaBEaBEaBEaBEaBFaxVaaaaBGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBHaBIaBJaBKazMaAwazOaBLafvaBNaAAaABaBOaBPaBPaBPaBPaBPaAIaBPaAKaxlaxqaxrazIaBQaBRaBSaBTaBSaBSaBUaBVaBWaBWaBWaBWaBWaBWaBXaBYaBZaCaaCbaCcaCdaCeavWavWaCfaCgaChaChaChaChaChaCgaCfaabaaaaaaaaaaaaazvaCiaCjaaaaAiaCkaClaCmaCnayHayHayHayJayHayJaCoayHayHayGayHaCpaCqaCoaAkayHayGaCraCsayGayHaCtayGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCuaCvaCwaCvaCuaCxaCyaCxaCuaabaAlaCzaCAaaaaaaaxVaxVaxVaxVaxVaCBaCCaCDaCEaCFaCGaCGaCHaCIaCIaCJaCKaxVazHaxVaxVaxVaCLaxVaaaaabaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaCMaCNaCOaBKazMaAwazOaCPaCQaCRaAAaCSaCTaBPaCUaBPaCVaCVaAIaBPaAKaxlaxqaCWazIaCXaBRaCYaCZaDaaDbaDcaDdaDeaDfaDgaDhaDiaDjaDkaDlaDmaDnaDoaDpaDqaDraDsaDtaCfaCgaChaChaChaChaChaCgaCfaabaabaabaabazvazvaDuaDvazvaAiaDwayHaDxayHayKayHayGayGaDyayGayGaDzayJayJaCoaDAaDBayHayGayHaDCaDCaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaacaDDaDDaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDEaCvaDFaCvaDEaCxaDGaCxaDEaxVaAlaDHaDIaAlaAlaxVazHazHazHazHazHazHazHaCBaCLaxVaxVaxVaxVaxVaDJaxVaxVazHaDKaxVaDLaCLaxVaxVaxVaaaaaaaaaaaaaaaaDMaDMaDMaDMaDMaDMaDMaDMaabaCMaDNaDOaDPaDQaDRaDSaDTaDUaDVaDWaABaDXaBPaDYaDZaEaaEbaEcaEdaAKaxlaxqaxrazIatsaEeaEfaCZaDaaDbaEgaEhaEhaEhaEhaEhaEhaEhaEhaEhaEhaEiaEjaEkaElaEmaEnaEoaEpaCgaChaChaChaChaChaCgaCfaCfaCfaaaaaaazvayHaEqaEraBhaEsaDAaCoaDxayHaEtayIaEuaAkayHayHayHayHaEvayHayHaDAaEwayHaDzayHaDCaExaEyaEzaDCaEAaEBaECaDCaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8378,21 +8404,21 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNhaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaOPaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaPcaPdaPdaPdaPdaPdaPdaPeaPfaMvaaaaLRaPgaNHaPhaNJaPiaLRaaaaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaPAaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQaaQbaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbaaaaaaaaaaaaaaaaaaaaaaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaQgaQhaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaQmaMoaQnaQoaQpaQqaQraQsaKHaQtaMqaQuaQvaQwaQxaQyaKHaQzaPdaPdaPdaPdaPdaPdaPdaPeaQAaMvaabaLRaQBaQCaQDaQEaQFaLRaabaJGaJLaJMaQGaQHaQIaQJaQKaJMaGvaIKaIKaIKaIKaQLaLXaJOaLYaJOaLXaQMaIKaIKaIKaIKaQNaQOaQPazIaMKaQQaQRaQRaQRaQSaQTaQUaQVaQWaQXaQVaQYaQZaRaaQVaRbaRcaRdaReaRfaMeaRgaRhaRiaRjaRjaRhaRkaRlaRlaRlaRlaRlaRmaRnaRlaRoaRpaRqaRraRsaRtaRuaRvaRwaRxaRwaRyaRzayHayGaRAaRBaRCaRDaREaRFaRGaRHaRIaRJaRIaRKaRLaRMaRNaROaRPaRQaRRaRSaRTaRUaQdaRVaRWaRXaRYaRZaSaaSbaScaSdapraaaaaaaaaaaaaaaaaaaaaaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpaSqaSraPdaPdaSsaPdaStaSuaSvaMvaaaaLRaLRaSwaSxaSwaLRaLRaaaaJGaJLaJMaSyaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaSWaSXaSYaSZaTaaTbaTcaTdaTbaTbaTeaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTkaTlaTmaTnaToaTpaTqaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIaTCaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQdaTJaTKaTKaTLaScaScaScaScaSdapraaaaaaaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqaUaaKHaUbaUcaUdaUeaUfaUgaUhaUiaUjaUkaMvaaaaabaaaaUlaUmaUlaaaaabaaaaCuaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHaaaaaaaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTaUZaVaaVbaVcaVbaVbaVbaVbaVdaVbaVbaVeaVbaVfaVgaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdapraaaaaaaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVyaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaVUaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKaWlaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWtaWuaUTaWvaWwaWxaWyaWzaUTaWAaWBaWCaWDaWCaWEaWFaWGaWHaWIaWJaWKaWLaWMaWNaVbaWOaRtaWPaWQaWRaVjaWSaVlaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgapraaaaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVyaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzaXhaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYjaYkaYlaYmaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYDaWNaYEaYFaYGaYHaWNaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMeaZTaZUaYnaYnaZVaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbbakbalbakaVbaVbaVbaVeaVbaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaWbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebbsbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbbFbbGbbHbbIbbJbbKbbLbbMaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbbbVbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcMbcNbcObcObcObcObcPbcQbcRbcSbcTbcUbcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbbdcbddbdebdebdebdebdfbdgaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfbdBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdCbdDaJrbdEbdFbdGbdHbdIbdJbdHbdKbdLbdHbdHbdMbdNbdObdPbdQbdQbdQbdRbdQbdSbdTaDEbdUbdVbdWbcobdXbdYbdZbeabebbecbedbeebefbegbehbeibcobejbekbctbelbembenbcvbeobepbeqbcvberbesbetberberberbeuaXJaXObcDaaaaaaaaaaaaaaaaaaaaabcEbevbewbexbeybezbeAbeBbeCbeDbeEbeFbcEaaaaaaaaaaaaaaaaaaaaabcKbeGaYibeHaMebeIbcNbcSbcSbcSbcSbcSbeJbeKbcSbcSbcSbeLbeMbeMbeNbeObePbeQbeRbeSbeTbeUaVbbeVbeWbeXbeYbeYbeXbeZbfaaVbaVhayHaRDbfbbfcaTvbbPbbQaTvbfdbfdaRDaRDbfeaRDaQbbffbbWbbZbfgbfgbfhbbZaQbaQbaQbbfibatbfjbfjbfkbfjbatbflbaAaabaaaaaabfmaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdCbfnbfobfnbfnbfnbfnbfnbfnbfobfnbfnbfpaJrbfqbfrbfsaJrbftaJrbfubfvbfwbfxbfyaDEbdVbdVbfzbcobfAbecbecbecbecbecbedbfBbecbecbecbfCbcobejbfDbctbfEbfFbfGbcvbfHbfIbfJbcvbfKbfLbfMbfNbfObesbeuaXJaXObcDaaaaaaaaaaaabcEbcEbcEbcEbfPbfQbfRbfSbfTbfUbfVbfWbfXbfYbfZbcEbcEbcEbcEaaaaaaaaaaaabcKbeGaYibgabgbbgcbgdbgebgfbgcbggbghbgibgjbgkbglbcSbeLbgmbeMbgnbgobeMbgpbgqbgrbgsbeMbgtbgubgvbeXbeYbeYbeXbgwbgxaVbaVhaKsaRDbdjaTvbbPbbPbbQbbPaTvaTvbgybgzaTvbgAaQbbgBbgCbgDbfgbfgbgEbgDbgFaQbbgGbgHbatbgIbgIbgJbgIbatbdAbaAbgKbaAbaAbaAaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCuaCuaInaInaInaInaInaInaInaInaInaCuaDEbgLbgMbgNbgNbgNbgNbgNbgNbgObgNbgNbgNaDEbdVbejbgPbcobgQbecbecbgRbgSbgTbgUbgRbecbecbecbgVbcobejbekbctbgWbgXbgYbcvbgZbhabhbbcvbhcbhdbhebhfbhgbesbhhbhiaXObcDbcDbhjbcEbcEbcEbhkbhlbhmbhnbhobhobhpbhqbhobhrbhobhsbhtbhubhvbhwbhxbcEbcEbcEbhjbcKbcKbeGaYiaYiaMebhybhzbgkbhAbcSbhBbhCbcSbhDbhEbglbcSbeLbeMbeMbhFbhGbhHbhIbhJbhKbhLbeMbhMbgubhNbeXbeYbeYbhObhPbhQaVbaVhayHaRDbhRbhSbhTbbPbbQbhUaTvaTvbhVaTvbhWbhXaQbbhYbhZbiabfgbfgbibbiabicaQbbidbgHbatbatbatbavbatbatbiebifbigbihbiibijaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbaUcaUdaUeaUfaUgaUhaUiaUjaUkaMvaaaaabaaaaUlaUmaUlaaaaabaaaaCuaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHaaaaaaaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTaUZaVaaVbaVcaVbaVbaVbaVbaVdaVbaVbaVeaVbaVfaVgaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdapraaaaaaaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVyaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaVUaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKaWlaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWBaWCaWDaWCaWEaWFaWGaWHaWIaWJaWKaWLaWMaWNaVbaWOaRtaWPaWQaWRaVjaWSaVlaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgapraaaaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVyaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzaXhaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkaYjaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaZTaYBaYCaYDaWNaYEaYFaYGaYHaWNaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnaZVaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbbakbalbakaVbaVbaVbaVeaVbaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaWbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebcTbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbbFbbGbbHbbIbbJbbKbbLbbMaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbbbVbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcMbcNbcObcObcObcObcPbcQbcRbcUbnCbmubcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbbdcbddbdebdebdebdebdfbdgaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfbdBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdCbdDaJrbdEbdFbdGbdHbdIbdJbdHbdKbdLbdHbdHbdMbdNbdObdPbdQbdQbdQbdRbdQbdSbdTaDEbdUbdVbdWbcobdXbdYbdZbeabebbecbedbeebefbegbehbeibcobejbekbctbelbembenbcvbeobepbeqbcvberbesbetberberberbeuaXJaXObcDaaaaaaaaaaaaaaaaaaaaabcEbevbewbexbeybezbeAbeBbeCbeDbeEbeFbcEaaaaaaaaaaaaaaaaaaaaabcKbeGaYibeHaMebeIbcNbcSbcSbcSbcSbcSbeJbeKbcSbnEbnDbnMbeMbeMbeNbeObePbeQbeRbeSbeTbeUaVbbeVbeWbeXbeYbeYbeXbeZbfaaVbaVhayHaRDbfbbfcaTvbbPbbQaTvbfdbfdaRDaRDbfeaRDaQbbffbbWbbZbfgbfgbfhbbZaQbaQbaQbbfibatbfjbfjbfkbfjbatbflbaAaabaaaaaabfmaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdCbfnbfobfnbfnbfnbfnbfnbfnbfobfnbfnbfpaJrbfqbfrbfsaJrbftaJrbfubfvbfwbfxbfyaDEbdVbdVbfzbcobfAbecbecbecbecbecbedbfBbecbecbecbfCbcobejbfDbctbfEbfFbfGbcvbfHbfIbfJbcvbfKbfLbfMbfNbfObesbeuaXJaXObcDaaaaaaaaaaaabcEbcEbcEbcEbfPbfQbfRbfSbfTbfUbfVbfWbfXbfYbfZbcEbcEbcEbcEaaaaaaaaaaaabcKbeGaYibgabgbbnGbgdbgebgfbgcbggbghbgibgjbgkbglbnEbeLbgmbeMbgnbgobeMbgpbgqbgrbgsbeMbgtbgubgvbeXbeYbeYbeXbgwbgxaVbaVhaKsaRDbdjaTvbbPbbPbbQbbPaTvaTvbgybgzaTvbgAaQbbgBbgCbgDbfgbfgbgEbgDbgFaQbbgGbgHbatbgIbgIbgJbgIbatbdAbaAbgKbaAbaAbaAaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCuaCuaInaInaInaInaInaInaInaInaInaCuaDEbgLbgMbgNbgNbgNbgNbgNbgNbgObgNbgNbgNaDEbdVbejbgPbcobgQbecbecbgRbgSbgTbgUbgRbecbecbecbgVbcobejbekbctbgWbgXbgYbcvbgZbhabhbbcvbhcbhdbhebhfbhgbesbhhbhiaXObcDbcDbhjbcEbcEbcEbhkbhlbhmbhnbhobhobhpbhqbhobhrbhobhsbhtbhubhvbhwbhxbcEbcEbcEbhjbcKbcKbeGaYiaYiaMebhybhzbgkbhAbcSbhBbhCbcSbhDbhEbglbcSbnMbeMbeMbhFbhGbhHbhIbhJbhKbhLbeMbhMbgubhNbeXbeYbeYbhObhPbhQaVbaVhayHaRDbhRbhSbhTbbPbbQbhUaTvaTvbhVaTvbhWbhXaQbbhYbhZbiabfgbfgbibbiabicaQbbidbgHbatbatbatbavbatbatbiebifbigbihbiibijaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbikbikbikbikbikbikbikbikbikbikbikaabaInaLAaJtbilbgNbimbinbiobipbiqbirbisbitbgNbiubivbiwbixbcobiybecbecbgRbgTbizbiAbgRbecbecbiBbiCbcobejbekbctbctbiDbctbcvbiEbiFbiGbcvbiHbhfbiIbhfbiJbesbeubiKaXOaXPaXPbiLbiMbiNbcEbiObfRbiPbhobhobiQbiRbiSakybiSbiUbiVbiWbiXbiYbiZbjabcEbjbbiMbjcbjdbjebeGaYiaYibjfbcSbjgbcSbcSbcSbjhbjibcSbhDbjjbglbcSbeLbeMbeMbjkbjlbjmbjnbjobjpbhLbjqaVbbjrbhNbeXbeYbeYbeXbhPbjsaVbbjtbjuaRDbjvaRDaRDbjwbbQbjxbjyaTvbjzbjAaWSbjBbdvbjCbjDbjEbjFbjFbjGbjHbjIbdvbjJbjKbatbjLbatbavbatbatbjMbaAbaAbaAbaAbgKaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbikbikbikbikbikbikbikbikbikbikbikbikbjNaInaKzaKBbfqbgNbimbjObjPbimbjQbjRbjSbjTbgNbjUaFmbjWbcsbcobjXbjYbjZbkabkbbkcbkdbkebkebkebkfbkgbcobejbivbkhbkibkjbkkbcvbcvbcvbcvbcvbklbkmbknbkobkpbesbeubiKaXJaXJaXJbkqbkrbksbktbkubkvbhobkwbkxbkybkzbkAbkBbkCbkDbkEbkFbkGbkubkHbkIbkJbkKbkLbkMbkNbkObkPaYibkQaMebcSbkRbkSbglbcSbkTbkUbcSbkVbkWbglbcSbeLbeMbeMbeMbeNbeMbkXbeMbjpbhLbkYaVbbkZbhNbeXbeYbeYbeXbhPblaaVbblbblcbldbleblfblgblhblibljbljbljbljbljbljblkbllblmbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbatbatbavbatbatblqbgKblrblrblrbaAaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbikbikbikbikbikbikbikbikbikbikbikbikblsbltblublvbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcoblKblLblMblNblOblPblQblRblSblRblTblTblTblTblTblUberbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbmrbmsbmtaYiaYibjfbcSbmubcSbcSbcSaRebcSbcSbmvbmvbmwbmwbmxbeMbeMbmybmzbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbbmEbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatbmKbaAbmLbmMbmNbaAaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbikbikbikbikbikbikbikbikbikbikbikbikaInaInaKzbmPbcjbmQbimbmRblxblxblxblybmRbimbgNbmSbmTbjWblCbmUbmVbmWbmXblCbmYbmZbnabcobnbbncbndbnebcobejbnfbngbngbnhbngbngbngbngbnibnjbnjbnjbnkbnjbnlbnmbnnbnobnpbnqbnqbnqbnqbnqbnqbnrbnsbnrbmgbmgbntbnubnvbnwbnxbnybntbnzbmgbnAbnBbnAbnAbnAbnAbnAbnAbnAbmtaYiaYiaMebnCbnDbcSbnEbcSbnFbcSbnGbnHbnIbmwbnJaUTbnKbnLaUTaUTbnMbnNbnNbnNaUTaUTaVbbnObnPbnQbnQbnQbnQbnPbnRaVbbnSbmFbmFbmGbnTaRDbnUbnVbnWbnXbnYbnZboabobbocaQbbodaRSboebfgbfgboeaRSbofaQbbogbgHbatbgIbgIbgJbgIbatblqbgKblrblrblrbaAaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbikbikbikbikbikbikbikbikbikbikbikbohaInboibojbokbgNbjObjObjObimbolbombonboobgNbopboqbjWblCborblCbosbotblCboubovbowbcobnbbncbndbiCbcobejbnfbngboxboybozboAboBbngboCboDboEboFbnmbnmbnmbnmboGboHboIbnqboJboKboLboMboNboOboPboQbmgboRbnvboSboTboUboTboSbnvboVbmgboWboXboYboZbpabpbbpcbpdbnAbpebpfbpfbpgaMeaMeaMeaMebphbjfbphbpiaMeaURaMeaMeaUTaUTaUTaUTbpjbpkbpkbpkbpkbplbpmaVbbakbpnbakbpobpobakbpnbakaVbbnSbmFbmFbppbnTaRDaRDaRDaRDaRDbjvaRDaRDaRDaRDaQbbpqaQcaQcaQcaQcaQcaQcaQbaQbbprbpsbatbatbatbavbatbatbjMbaAbaAbaAbaAbgKaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbptbpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbpwbpwbpxblCbpybpzbosbpAblCbpBbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbpIbpJbpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWbpXboTboSbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqrbqnbqsbqnbqnbqnbqnbqnbqnbqnbqnbqtbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqybqzbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbqHbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbqQbqRbqSbqTbiibqUaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbikbikbikbikbikbikbikbikbikbikbikbikbjNaInaKzaKBbfqbgNbimbjObjPbimbjQbjRbjSbjTbgNbjUaFmbjWbcsbcobjXbjYbjZbkabkbbkcbkdbkebkebkebkfbkgbcobejbivbkhbkibkjbkkbcvbcvbcvbcvbcvbklbkmbknbkobkpbesbeubiKaXJaXJaXJbkqbkrbksbktbkubkvbhobkwbkxbkybkzbkAbkBbkCbkDbkEbkFbkGbkubkHbkIbkJbkKbkLbkMbkNbkObkPaYibkQaMebnEbkRbkSbglbcSbkTbkUbcSbkVbkWbglbcSbnMbeMbeMbeMbeNbeMbkXbeMbjpbhLbkYaVbbkZbhNbeXbeYbeYbeXbhPblaaVbblbblcbldbleblfblgblhblibljbljbljbljbljbljblkbllblmbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbatbatbavbatbatblqbgKblrblrblrbaAaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbikbikbikbikbikbikbikbikbikbikbikbikblsbltblublvbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcoblKblLblMblNblOblPblQblRblSblRblTblTblTblTblTblUberbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbmrbmsbmtaYiaYibjfbnEbnIbcSbcSbcSaRebcSbcSbmvbmvbmwbnJbmxbeMbeMbmybmzbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbbmEbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatbmKbaAbmLbmMbmNbaAaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbikbikbikbikbikbikbikbikbikbikbikbikaInaInaKzbmPbcjbmQbimbmRblxblxblxblybmRbimbgNbmSbmTbjWblCbmUbmVbmWbmXblCbmYbmZbnabcobnbbncbndbnebcobejbnfbngbngbnhbngbngbngbngbnibnjbnjbnjbnkbnjbnlbnmbnnbnobnpbnqbnqbnqbnqbnqbnqbnrbnsbnrbmgbmgbntbnubnvbnwbnxbnybntbnzbmgbnAbnBbnAbnAbnAbnAbnAbnAbnAbmtaYiaYiaMebplbpjbqtbpmbcSbnFbcSdcZbnHddaddcddbaUTbnKbnLaUTaUTczObnNddybnNaUTaUTaVbbnObnPbnQbnQbnQbnQbnPbnRaVbbnSbmFbmFbmGbnTaRDbnUbnVbnWbnXbnYbnZboabobbocaQbbodaRSboebfgbfgboeaRSbofaQbbogbgHbatbgIbgIbgJbgIbatblqbgKblrblrblrbaAaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbikbikbikbikbikbikbikbikbikbikbikbohaInboibojbokbgNbjObjObjObimbolbombonboobgNbopboqbjWblCborblCbosbotblCboubovbowbcobnbbncbndbiCbcobejbnfbngboxboybozboAboBbngboCboDboEboFbnmbnmbnmbnmboGboHboIbnqboJboKboLboMboNboOboPboQbmgboRbnvboSboTboUboTboSbnvboVbmgboWboXboYboZbpabpbbpcbpdbnAbpebpfbpfbpgaMeaMeaMeaMebphbjfbphbpiaMeaURaMeaMeaUTaUTaUTaUTdddbpkbpkbpkbpkddeddfaVbbakbpnbakbpobpobakbpnbakaVbbnSbmFbmFbppbnTaRDaRDaRDaRDaRDbjvaRDaRDaRDaRDaQbbpqaQcaQcaQcaQcaQcaQcaQbaQbbprbpsbatbatbatbavbatbatbjMbaAbaAbaAbaAbgKaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbptbpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbpwbpwbpxblCbpybpzbosbpAblCbpBbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbpIbpJbpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWbpXboTboSbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqrbqnbqsbqnbqnbqnbqnbqnbqnbqnbqnddgbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqybqzbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbqHbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbqQbqRbqSbqTbiibqUaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqVbqVbqVbqVbqVbqVbqVbqVbqVbqVaaaaabaInaLAbqWbqXbqYbqZbrabrabrabrabrbbrcbrdbrebrfbrgbrhblCblCblCbribotblCbcobcobcobcobnbbrjbrkbrlbcobrmbrnbngbrobrpboAbpFbrqbngboCbrrbpHbpIbpIbrsbrtbnmbrubpNboIbpObrvbrwbrxbrybrzbrAbpTbrBbmgbrCbpWbnvbrDbrEbrDbnvbpWbrFbnzbrGbqbbqbbqcbrHbqebqbbrIbnAbrJbqibqibqjbqkbqlbqnbqnbqnbqnbqnbqnbqnbrKbqnbqnbqnbqnbqnbqnbrLbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrNbrObrPbqKbqKbrQbmFbmFbmFbmFbmFbmGbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbrRbmFbrSbrTbatbatbatbatbatbatbatbrUbaAbgKbaAbaAbaAbtlaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqVbqVbqVbqVbqVbqVbqVbqVbqVbqVbqVbjNaInaInbrVbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbpIbpIbpIbsqbnmbsrbpNboIbpObssbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybszbsAboSbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbsLbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbsWbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcbtdbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgbthbtibtjbtkbtkbtkbtkbPfbtmbaAaabaaaaaaaabaQfaQfaQfaQfaQfaQfaaaaQfaQfaQfaQfbdBaQfaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqVbqVbqVbqVbqVbqVbqVbqVbqVbqVbqVbtnbtobtpbtqbtrbrXbtsbttbtubtvbtwbrZbtxbtybtzbtzbtAbtBblCblCblCbosbtCborbcsbcsbcsbcsbtDbejbejbskbejbsjbskbngbtEbtFbtGbtHboAbngbtIbnmbtJbpIbpIbpIbtKbtLbtMbpNbtNbnqbtObtPbpRbpRbpRbpRbpTbtQbmgbtRbtSbmgbmgbmgbmgbmgbmgbmgbnzbnAbtTbtUbtVbtWbtXbtYbtZbnAbuabubbubbucbucbucbucbucbucbucbudbudbuebufbugbugbufbuebudbudbuhbuhbuhbuhbuhbuhbuibuibujbuibuibuibuibuibukbulbumbunbmFbmFbuobuobupbupbupbupbupbuqbtfbtfbtebtfbmFbtfbtfbtfbtfburbusbusbusbusbutbuubuubuubuubuubuubuubuubuuaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaaaaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8425,10 +8451,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAjaaaaabaabcjKcjKcjKcjKcjKcjKcjLcjKbUTcelcjMaaacjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZcosckbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaclbclbclbclccldcleclfclgclhclicjLcljcelcjMaaaclkcllclmclnclocjSclpclqclrclsciLcltcgdcoaciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCclDclEclFclGclHclHclIclJclKclLclMclNclOcotcfhcpwcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKcmEcfScjMaaaclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxcmQcmQcmRcmSchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcnbcnccndcnecnfcngcnhcklcqQcfdcrLcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKcnRcelcjMaaaclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkcobcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcojcokcolcomcomcomconcoocomcomcopcolcoqcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoBcoCcoDcoAcoAaaaaaaaaaaaackPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKcnRcelcjMaaaclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkcobcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcojcokcolcomcomcomconcoocomcomcopcolcoqcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAaaaaaaaaaaaackPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkcplcpmcjMaaacpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqcobcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcpIcyFcpJcpJcpJcpKcpLcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKcqscelcejaaaaaaaaaaaaciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcqIcqJcqKcqLcqMcpFcqLcqMcqKcqNcqOcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbabLcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkcjKcjKcjKcjKcjKcjKcjKcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcrBcrCcqJcqKcqKcrDcpFcrEcqKcqKcqNcqJcrFcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacpRczNczPczOcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbabLcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkcjKcjKcjKcjKcjKcjKcjKcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcrBcrCcqJcqKcqKcrDcpFcrEcqKcqKcqNcqJcrFcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSecsdcsecsfcsgcsgcshcsidcYcskcslcsmcsncsocspcspcspcsqcsrcsscstcstcsucsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcsPcsQcsRcsScsTcsUcpFcsVcsTcsWcsXcsRcsYcwraaaaaaaaacEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaactdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSecsdctuctvctwctvctxctyctzctActBctCctBctDctEctEctFctEcgdctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXctYctZcuacnqcubcuccudcuecufcugcuhcuicpFcujcqKcugcukcqJculcwraaaaaaaaadbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaackPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSecuBctvcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQcuRceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKcvocpFcvpcqKcqKcqNcqJcyGcwraaaaaaaaadbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAaaaaaaaaaaaaaaaaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8452,28 +8478,28 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaacGacGafxacGacGagiafxafxafxafxacGafxafxacGcOcaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJbcOdcLucOecOfcOgcOhcMucOicOjcOkcOlcOmcOncOocOpcOqcOrcGOcOsdcKcOucOvcOwcOxcOycOzcOAdcLcNwcJecOCcODcLKcOEcECcOFcLQcOGcOHcDFcMNcMOcKNcDFcOIcMRcJBcOJcOKcKQcOLcDQcOMcMXcMXcCKcHBcoDcEhcMgchCbJGbYDclUclUclUcMhclUdblcFacFcbVicMjcMibGycuscGvbVibGycMkcITcoAaaaaaackPckPckPckPckPckPckPckPckPckPckPckPckPaaaaaaaaaaaaaabaabaaaaaabwobwobwocvzcyJcMmcMlbxXcxHaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcJbcJbcJbcOWcOXcOXcOXcMucOYcOZcPacPacPbcPccMzcPdcPecPfcPgcPhdcMcPicPjcPkcPlcPmcPncPidcNcPpcPqcPrcPscPtcPucPvcNHcLQcPwcPxcDFcMNcDFcPycDFcMQcMRcJBcJCcPzcJEcNMcCKcCKcCKcCKcCKcHBcoDcMncKXchCcITcMYcMocMocMocMZbVicFgcFecFhbVicNacKVcKVcNbcHrczhbGybGycoAcoAaaaaaacONaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaabaaabwocyKcNccNdcyJcNfcNebxXcxHaaaaaaaaaaaaaaaaaaaahaaacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcPEcPFcPGcOXaabaabcMucPHcPIcPacPacPJcMucPKcPLdcOcPNcPOcPPdcPcECcPRcPScPTcGOcPUcECdcQcPWcPXcPNcPNdcRcPZcECcQacLQcQbcQccDFcMNcDFcLScLTcQdcQecMScQfdcScIDcQhcDQcQicQjcQjcCKcHBcoDcNhcNgbVibVicEhbVibVibGycNibVibVicGwbVibVicNkcNjcNmcNlcNQcoAcoAcoAcoAaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaabaabbwocNRcunbOMcyJcyJcyJbxXbwoaabaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcPEcQqcQrcOXaabaaacMucQscPIcPacPacQtcMucQucQvcECcQwcQxcQxdcTcECcQycQzcQAcQBdcUcECcQxcQxcQxcQwcECcQCcQucECcNHcLQcQDcQEcQFcQGcQHcQIcQJcQKcIAcQLcJCdcVcJEcNMcEVcQNcQOcQPcCKcHBcoAcoAcEhcdbcNScEhcNTbVibGycNVcNUcNXcNWcMocMocNYcGvbVicNZcoAcoAaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabwobwobwobwobwocOObOMcyJcOQcOPbxXbwoaabaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcPEcQqcQrcOXaabaaacMucQscPIcPacPacQtcMucQucQvcECcQwcQxcQxdcTcECcQycQzcQAcQBdcUcECcQxcQxcQxcQwcECcQCcQucECcNHcTacQDcQEcQFcQGcQHcQIcQJcQKcIAcQLcJCdcVcJEcNMcEVcQNcQOcQPcCKcHBcoAcoAcEhcdbcNScEhcNTbVibGycNVcNUcNXcNWcMocMocNYcGvbVicNZcoAcoAaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabwobwobwobwobwocOObOMcyJcOQcOPbxXbwoaabaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQSaaaaaaaaacQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcPEcOXcQTcPEcQUaaacMucQVcQWcPacPacQXcMucQYcQZdcWcRacRbcRccRdcRecRfcRgcRhcRicPucRecRbcRbcRbcRjdcWcRkcRlcECcNHcRmcMNcRncRocQJcRpcRqcRrcRscRtcRucRvdcXcKQcOLcDQcRxcQjcQjcCKcHBcoAbGycORcOTcOScNYcgmbVibGybGybGycGvcOUbGycGqcFicHrbVicEhbwoaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabwobxXbxXbxXcyKcOOcOVcyJcPAbxXbxXbwoaabaabaabaaaaaaaaaaaacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRycRycRycRycRycRycRycMucRzcOZcPacPacRAcMucMHcRBcECcECcRecRecRecRecRCcPNcRDcPNcREcRecRecRecRecECcECcRFcRGcECcNHcLQcRHcRIcRocRJcRKcDFcDFcRLcJxcRJcJCcRMcJEcNMcCKcCKcCKcCKcCKcHBcoAcITbGycPCcPBbGycQkbVibVicQlbVicQmcdccyHcQnbVibVibVicEhbwoaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaabwobwobwocQpcQocyKcOObOMbxXbxXbxXcYgbwoaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQSaaaaaacQSaaaaaacQScQScQScQScQScQScQSaaaaaacQSaaaaaacQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRycRycRycRycRycRycRycMucRNcROcPacPacRPcMucECcRQcECcRRcRScRScLOcLOcLOcLOcLOcLOcLOcLOcLOcRScRScRTcECcRUcECcECcNHcLQcRVcQFcRWcRXcRYcRZcSacRXcSacRXcSbcQJcSccNMaabaabaabaabaabcHBcYhcYicYicYkcYjcYicYicYicYlcYncYmcQmcYobVicQmbVicYpbVicEhbwocxHcxHcxHbwocxHcxHcxHcxHbwocxHcxHcxHcxHbwobwobwobwobwobwobwobwobwobwoczMbwocyKbwocYqbxXcHycOObOMcyJcyJcLecyJbwoaabczraaaaaaaaaaaaaaaaaacJacJacJacJaaaaaaacJacJacJacJacJacJacJaaaaaaacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQSaaacQScQScQScQScQScQScQScQScQSaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRycRycRycRycRycRycRycMucSdcSecPacPacSfcMucSgcShcSicSjaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaacSkcSlcSmcSncECcSocMJcFUcSqcSrcSscStcSucSvcSwcDFcSxcSycSzcSAcNMaabaaaaaaaabaaacYscYrdbwcYtcYwcYvcYycYxcYicqTbGybGycYzcdccYAcGvbGybGycYBcMncYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYDcYCcYCcYCcYCcmvcyJbFecnGbxXcYEczMbwobwobwocLebwocOObOMcyJcYFbxXbxXbwoaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQSaaacQScQScQScQScQScQScQScQScQSaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRycRycRycRycRycRycRycMucRzcOZcPacPacSCcMucSDcSEcSEaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacSEcSEcSDcECcMHcLQcSAcSFcSGcSHcSIcSJcSAcSHcSAcJEcSAcJEcSAcNMaabaaaaaaaabaaacYhcYGcYIcYHcYKcYJcYMcYLcYibGybGybVicQmcYNbVicGvcGqcFicYPcYOcYQcYQcYQcYQcYQcYQcYScYRcYQcYQcYQcYQcYQcYQcYUcYTcYWcYVcYYcYXcYZcYZcYZcYZcZbcZacZccYZcYZcYZcYZcZdbXScyJcOPbxXcZebwoaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQSaaacQScQScQScQScQScQScQScQScQSaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRycRycRycRycRycRycRycMucSLcSMcPacPacSNcMucSOcSPcSEaabaabaabcSQaaaaaaaaaaaacSQaaaaaacSQaabaabaabcSEcSRcSScECcMHcECaabcSTaabcSUcSVcSWcSXcSYcSXcSZcSXcSZcTacTbaabaabaabaabaaacYhcZfcYIcZgcZicZhcZkcZjcYicZlbGybGycGvcZmbVicGvcGvcZncoAcoAcxHcxHcxHcxHbwocxHcxHcxHcxHbwocxHcxHcxHcxHbwocZobxXcyJcJMbxXcyJcyJcxHcxHckVcyJcZpbxXcZpcyJcZrcZqcoVbwobwobwobwobwoaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMucTccSMcPacPacSCcMucTdcSEcTeaaaaaaaabaaaaaaaaaaaaaaacTfaaaaaaaaaaabaaaaaacSEcSEcTdcECcMHcECcCKcTgcEVcTgcCKcTgcEVcTgcCKcThcEVcTicCKaaaaaaaaaaaaaabaabcYhcZscZucZtcZvcZhcZxcZwcZycYPcZAcZzcGvcdcbGycZBcQmbVicoAaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabwocZCczfcyJcZDbxXcyJaaaaaaaaaaaacyJbxXbxXcNRcqecqecqfcqgcqeaaaaabaabaabaabcZEaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMucTjcOZcPacPacTkcMucTlcTmcSEaaaaaaaabaaaaaaaabaabaabaabaabaaaaaaaabaaaaaacSEcTncTocECcTpcECcCKcTqcTrcTscCKcTtcTucTvcCKcTwcTxcTycCKaaaaaaaaaaaaaaaaabcZGcZFcZucZHcZJcZIcZLcZKcYicZMcQmbVicQmcZNbVicZOcQmcozcoAcoDcoDcoDazyaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabwocZPcyJcyJcHxbxXcyJcyJcxHcxHcyJcyJbxXcZQczfcqecrecrfcrgcqeaaaaaaaabaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccMucMucMucMucMucMucMucECcSDcSEaaaaaaaabcSQaabaabaacaacaacaabcTzaaaaabaaaaaacSEcSDcECcECcMHcECcCKcTAcTBcTAcCKcTCcTDcTCcCKcTEcTFcTEcCKaaaaaaaaaaaaaaaaaacYhcZRcZTcZScZucZUcZWcZVcYicZXcZZcZYdaacAhbGycGvcGvdabdaddacbGydaeazyaaaaabaaacxHcxHcxHbwobwobwobwobwobwodafcyKcyJdagbxXbxXcyJbxXbxXbxXbxXcYqbxXcPAcqecrZcsacsbcqeaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaabaacaacaabaabaabacGacGcECcECcTGcSEaaaaaaaabaaaaaaaabcTHcTIaacaabaaaaaaaabaaaaaacSEcTJcECcECcMHcECcCKcTAcTKcTAcCKcTCcTLcTCcCKcTEcTMcTEcCKaaaaaaaaaaaaaaaaaacYhcYhcYhdahcYhdaidajdaicYicZXdakbGycGzdalcFicHrcGvdamcoAcoDcoDcoDdanaabaabaaacxHdaodapcyJbxXdaqdarcNRcyJdasbxXcyJdatbxXbxXdaubxXbwobwobwocxHcxHbwocqectrctscttcqeaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaaaaaaaabaabacGcECcECcSDcSEaaaaaaaabaaacTNaabaacaacaacaabaabcSQaabaaaaaacSEcSDcECcECcMHcECcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKaaaaaaaaaaaaaaaaaaaaaaaaaaadavcYhdawdaydaxcYibGydazbGybGydaAdaBcGqdaDdaCcoAaaaaaaaaaaaaaaaaabaaacxHdaEdaFdaubxXcQobxXbxXdaucZobxXcyJcyJcyJcyJcyJbxXbwoaabaaaaaaaaaaabcuzcuzcuAcuzcuzaabaabczraabaabcZEaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcECcTncTocSEaaaaaaaabaaaaaaaabaabaabaabaabaaaaaaaabaaaaaacSEcTlcTmcECcTpcECcECcECcECcECaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaGcYhdaidaHdaicYhcoAdaIcFicFidaJdaLdaKcoAcoAcoAaaaaaaaaaaaaaaaaabaaacxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabaaaaaaaaaaabaaacuzcvEcuzaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaacQScQScQScQSaaaaaacQScQScQScQScQScQScQSaaaaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaabcECcTdcSEcTPaaaaaacTQaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaacSEcSEcTdcECcMHcTRcTScTTcTUcTVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaGcYhdaPdaRdaQdaSaabcoAcoAcoDdaTcoDcoAcoAaaaaabaaaaaaaaaaaaaaaaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabaaaaaaaaaaabaaacuzcwMcuzaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcECcTXcTYcSEaabaabaabcSQaaaaaacSQaaaaaaaaaaaacSQaabcTZaabcSEcUacUbcECcMHcUccUdcGOcUecTVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaadaGcYhcYhdaVcYhcYhaaaaabaaaaaadaWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaabwodaFdaXbwocGxaabbwobwocxHcxHczMbwoaaaaabaaaaaaaaaaabaaaaaacxZaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcUfcUgcUhaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacUicUgcUjcECcMHcECcUkcUlcUmcReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcdazycYhdaYcYhdaZaabaabaaaaaadctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaahaaaaaabwodbbdbabwodbcaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaacznaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNycECcKDcSkcUhaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaacUicSjcKDcECcECcMHcECcECcECcUncECaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabazydbddbedbdazyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaacxHdbfcxHcxHaabczraaaaabaaaaaaaabaaaagQagQacGaqZaabaabaabaabcGEaabaabaabaabczragiagQagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacECcECcSkcRScRScRScRScRScRScRScRScRScRScRScRScRScSjcECcECcECcECcTpcECaaaaabcUocUpaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaabazyaaaaaaaaaazyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaacxHdbgcxHaaaaaaaaaaaaaabaaaaaaaabaaaagQaaaaaaaabaaaaabaaaaaacHNaaaaaaaabaaaaabaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECaaacECcECcUqcECaabaabcUrcUscUtcUucUvcUucUtcUucUvcUucUtcUucUvcUucUtcUucUvcUwcUxaaaaabazyazyazyazyazyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaacxHdbhcxHaaaaaaaaaaaaaabaaaaaaaabaaaagQaaacIYcIYcIYcIYcIYaabcIZaabcIYcIYcIYcIYcIYaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcECcUycECcECcECcECaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaacUrcUzcUpaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaacxHdbicxHaaaaaaaaaaaaaaaaaaaaaaabaaaagQaabcKccKdcKdcKdcKdcKecKfcKgcKhcKhcKhcKhcKiaabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcMHcMHcUAcUBcUBcUCaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabcUDcUzcUxaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdbHdbjdbjaaaaaaaaaaaaaaaaaaaaaaabaaaagQaabcLrcLrcLrcLrcLraaacIZaaacLrcLrcLrcLrcLraabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcTpcMHcUEcUFcUGcUHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacUrcUzcUpaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaaaagQaaaaabaaaaabaabaabaaacIZaaaaabaaaaabaaaaabaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQSaaaaaacQSaaaaaacQScQScQScQScQScQScQSaaaaaacQSaaaaaacQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRycRycRycRycRycRycRycMucRNcROcPacPacRPcMucECcRQcECcRRcRScRScLOcLOcLOcLOcLOcLOcLOcLOcLOcRScRScRTcECcRUcECcECcNHcLQcRVcQFcRWcRXcRYcRZcSacRXcSacRXcSbcQJcSccNMcTbcTScTScTScTScUdcYhcYicYicYkcYjcYicYicYicYlcYncYmcQmcYobVicQmbVicYpbVicEhbwocxHcxHcxHbwocxHcxHcxHcxHbwocxHcxHcxHcxHbwobwobwobwobwobwobwobwobwobwoczMbwocyKbwocYqbxXcHycOObOMcyJcyJcLecyJbwoaabczraaaaaaaaaaaaaaaaaacJacJacJacJaaaaaaacJacJacJacJacJacJacJaaaaaaacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQSaaacQScQScQScQScQScQScQScQScQSaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRycRycRycRycRycRycRycMucSdcSecPacPacSfcMucSgcShcSicSjaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaacSkcSlcSmcSncECcSocMJcFUcSqcSrcSscStcSucSvcSwcDFcSxcSycSzcSAcNMcUkaaaaabaabaaacYscYrdbwcYtcYwcYvcYycYxcYicqTbGybGycYzcdccYAcGvbGybGycYBcMncYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYDcYCcYCcYCcYCcmvcyJbFecnGbxXcYEczMbwobwobwocLebwocOObOMcyJcYFbxXbxXbwoaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQSaaacQScQScQScQScQScQScQScQScQSaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRycRycRycRycRycRycRycMucRzcOZcPacPacSCcMucSDcSEcSEaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacSEcSEcSDcECcMHcLQcSAcSFcSGcSHcSIcSJcSAcSHcSAcJEcSAcJEcSAcNMcUkaaaacGacGacGcYhcYGcYIcYHcYKcYJcYMcYLcYibGybGybVicQmcYNbVicGvcGqcFicYPcYOcYQcYQcYQcYQcYQcYQcYScYRcYQcYQcYQcYQcYQcYQcYUcYTcYWcYVcYYcYXcYZcYZcYZcYZcZbcZacZccYZcYZcYZcYZcZdbXScyJcOPbxXcZebwoaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQSaaacQScQScQScQScQScQScQScQScQSaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRycRycRycRycRycRycRycMucSLcSMcPacPacSNcMucSOcSPcSEaabaabaabcSQaaaaaaaaaaaacSQaaaaaacSQaabaabaabcSEcSRcSScECcMHcECaabcSTaabcSUcSVcSWcSXcSYcSXcSZcSXcSZcUmcUqcUkaaaacGaabaaacYhcZfcYIcZgcZicZhcZkcZjcYicZlbGybGycGvcZmbVicGvcGvcZncoAcoAcxHcxHcxHcxHbwocxHcxHcxHcxHbwocxHcxHcxHcxHbwocZobxXcyJcJMbxXcyJcyJcxHcxHckVcyJcZpbxXcZpcyJcZrcZqcoVbwobwobwobwobwoaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMucTccSMcPacPacSCcMucTdcSEcTeaaaaaaaabaaaaaaaaaaaaaaacTfaaaaaaaaaaabaaaaaacSEcSEcTdcECcMHcECcCKcTgcEVcTgcCKcTgcEVcTgcCKcThcEVcTicCKaabcUkaaaacGaabaabcYhcZscZucZtcZvcZhcZxcZwcZycYPcZAcZzcGvcdcbGycZBcQmbVicoAaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabwocZCczfcyJcZDbxXcyJaaaaaaaaaaaacyJbxXbxXcNRcqecqecqfcqgcqeaaaaabaabaabaabcZEaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMucTjcOZcPacPacTkcMucTlcTmcSEaaaaaaaabaaaaaaaabaabaabaabaabaaaaaaaabaaaaaacSEcTncTocECcTpcECcCKcTqcTrcTscCKcTtcTucTvcCKcTwcTxcTycCKaabcUkaaaacGaaaaabcZGcZFcZucZHcZJcZIcZLcZKcYicZMcQmbVicQmcZNbVicZOcQmcozcoAcoDcoDcoDazyaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabwocZPcyJcyJcHxbxXcyJcyJcxHcxHcyJcyJbxXcZQczfcqecrecrfcrgcqeaaaaaaaabaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccMucMucMucMucMucMucMucECcSDcSEaaaaaaaabcSQaabaabaacaacaacaabcTzaaaaabaaaaaacSEcSDcECcECcMHcECcCKcTAcTBcTAcCKcTCcTDcTCcCKcTEcTFcTEcCKaabcUkaaaacGaaaaaacYhcZRcZTcZScZucZUcZWcZVcYicZXcZZcZYdaacAhbGycGvcGvdabdaddacbGydaeazyaaaaabaaacxHcxHcxHbwobwobwobwobwobwodafcyKcyJdagbxXbxXcyJbxXbxXbxXbxXcYqbxXcPAcqecrZcsacsbcqeaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJacJacJacJacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaabaacaacaabaabaabacGacGcECcECcTGcSEaaaaaaaabaaaaaaaabcTHcTIaacaabaaaaaaaabaaaaaacSEcTJcECcECcMHcECcCKcTAcTKcTAcCKcTCcTLcTCcCKcTEcTMcTEcCKaabcUkaaaacGaaaaaacYhcYhcYhdahcYhdaidajdaicYicZXdakbGycGzdalcFicHrcGvdamcoAcoDcoDcoDdanaabaabaaacxHdaodapcyJbxXdaqdarcNRcyJdasbxXcyJdatbxXbxXdaubxXbwobwobwocxHcxHbwocqectrctscttcqeaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaaaaaaaabaabacGcECcECcSDcSEaaaaaaaabaaacTNaabaacaacaacaabaabcSQaabaaaaaacSEcSDcECcECcMHcECcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKaabcUkaaaaqZaaaaaaaaaaaaaaadavcYhdawdaydaxcYibGydazbGybGydaAdaBcGqdaDdaCcoAaaaaaaaaaaaaaaaaabaaacxHdaEdaFdaubxXcQobxXbxXdaucZobxXcyJcyJcyJcyJcyJbxXbwoaabaaaaaaaaaaabcuzcuzcuAcuzcuzaabaabczraabaabcZEaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcECcTncTocSEaaaaaaaabaaaaaaaabaabaabaabaabaaaaaaaabaaaaaacSEcTlcTmcECcUscECcECcECcECcUvcTScTScTScTScTScTScTScTScTScTScUwaaaacGaabaabaabaabaabdaGcYhdaidaHdaicYhcoAdaIcFicFidaJdaLdaKcoAcoAcoAaaaaaaaaaaaaaaaaabaaacxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabaaaaaaaaaaabaaacuzcvEcuzaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaacQScQScQScQSaaaaaacQScQScQScQScQScQScQSaaaaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaabcECcTdcSEcTPaaaaaacTQaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaacSEcSEcTdcECddhddjddicMHddkcUwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGaabaabaabaabaabdaGcYhdaPdaRdaQdaSaabcoAcoAcoDdaTcoDcoAcoAaaaaabaaaaaaaaaaaaaaaaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabaaaaaaaaaaabaaacuzcwMcuzaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcECcTXcTYcSEaabaabaabcSQaaaaaacSQaaaaaaaaaaaacSQaabcTZaabcSEcUacUbcECddlcECcECcECcECcECcECacGacGacGaqZacGacGacGacGacGacGacGacGaahaaaaaaaaaaaadaGcYhcYhdaVcYhcYhaaaaabaaaaaadaWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaabwodaFdaXbwocGxaabbwobwocxHcxHczMbwoaaaaabaaaaaaaaaaabaaaaaacxZaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcUfcUgcUhaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacUicUgcUjcECddmcTRddnddocTTcTUcTVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcdazycYhdaYcYhdaZaabaabaaaaaadctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaahaaaaaabwodbbdbabwodbcaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaacznaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNycECcKDcSkcUhaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaacUicSjcKDcECcECddmcUcddpcUlddqcUecTVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazydbddbedbdazyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaacxHdbfcxHcxHaabczraaaaabaaaaaaaabaaaagQagQacGaqZaabaabaabaabcGEaabaabaabaabczragiagQagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacECcECcSkcRScRScRScRScRScRScRScRScRScRScRScRScRScSjcECcECcECcECddrcECcECcECcECcUncECaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabazyaaaaaaaaaazyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaacxHdbgcxHaaaaaaaaaaaaaabaaaaaaaabaaaagQaaaaaaaabaaaaabaaaaaacHNaaaaaaaabaaaaabaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECaaacECddtddscECaaaaaaaaacUocUxaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaabazyazyazyazyazyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaacxHdbhcxHaaaaaaaaaaaaaabaaaaaaaabaaaagQaaacIYcIYcIYcIYcIYaabcIZaabcIYcIYcIYcIYcIYaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcECcUycECcECcECcECcUrdducUuddxcUucUtcUuddxcUucUucUuddxcUucUtcUuddxcUuddvcUpaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaacxHdbicxHaaaaaaaaaaaaaaaaaaaaaaabaaaagQaabcKccKdcKdcKdcKdcKecKfcKgcKhcKhcKhcKhcKiaabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcMHcMHcUAcUBcUBcUCaabaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaacUDcULcUxaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdbHdbjdbjaaaaaaaaaaaaaaaaaaaaaaabaaaagQaabcLrcLrcLrcLrcLraaacIZaaacLrcLrcLrcLrcLraabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcTpcMHcUEcUFcUGcUHaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabczraabaabcUDcUzcUpaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaaaagQaaaaabaaaaabaabaabaaacIZaaaaabaaaaabaaaaabaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcUIcMHcUJcUBcUBcUKaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaacUDcULcUpaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaagQaaacIYcIYcIYcIYcIYaabcIZaabcIYcIYcIYcIYcIYaabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNycECcECcECcECcECcECaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcUDcUMaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQaabcKccKdcKdcKdcKdcKecKfcKgcKhcKhcKhcKhcObaabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcUNcUOcUNcUPcUPcUQcUQcUQcUQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQaabcLrcLrcLrcLrcLraaacIZaabcLrcLrcLrcLrcLraaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8482,7 +8508,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcUNcVecVfcVacVacVgcVhcVicUQaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQaabcKccKdcKdcKdcKdcQQcQRcQQcKhcKhcKhcKhcObaabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabcUNcUNcVjcVacVacUQcVkcUQcUQaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQaabcLrcLrcLrcLrcLraaacGEaaacLrcLrcLrcLrcLraaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaaaaabaaacUPcVlcVacVacVmcVncUPaabaabaabaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQaaaaaaaabaabaabaaaaaacGEaabaaaaaaaabaabaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGacGcVocVoacGacGaaacUPcVpcVqcVrcVscVtcUPaaaacGacGcVocVoacGacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQagQagQagQagQaaaaaaaaacGEaaaaaaaaaagQagQagQaqZagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGacGcVocVoacGacGaaacUPcVpcVqcVrcVscVtcUPaaaacGacGcVocVoacGacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQagQagQagQagQaaaaaaaaacGEaaaaaaaaaagQagQagQaqZagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGcVucVvcVwcVxacGacGcUPcVycVzcVAcVacVBcUPacGacGcVCcVDcVEcVFacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQaabcSBaabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOaaacTOcTOcTOcTOcTOaaacTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGcVucVvcVEcVHcVIcVJcVJcVKcVLcVJcVMcVNcVJcVJcVIcVOcVvcVEcVFacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQaaaaabaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOaaacTOcTOcTOcTOcTOaaacTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGcVucVPcVQcVRcVRcVScVTcVUcVVcVWcVWcVXcVYcVZcWacWacWbcWccVFacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQagQagQagQagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index b39269fa685..d1b56f66e51 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -327,7 +327,7 @@ "go" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/research_outpost/power) "gp" = (/obj/machinery/portable_atmospherics/scrubber,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/research_outpost/power) "gq" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/power) -"gr" = (/obj/machinery/mass_driver{dir = 4; id_tag = "Research Outpost"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) +"gr" = (/obj/machinery/mass_driver{dir = 4; id_tag = "researchdriver"},/turf/simulated/floor/plating/airless/asteroid,/area/research_outpost/power) "gs" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area/space) "gt" = (/obj/item/weapon/shard,/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "gu" = (/turf/simulated/floor/plating/airless,/area/mine/abandoned) @@ -386,7 +386,7 @@ "hv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/power) "hw" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/light/small,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor/plating,/area/research_outpost/power) "hx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/research_outpost/power) -"hy" = (/obj/machinery/driver_button{id_tag = "Research Outpost"; pixel_x = 6; pixel_y = -26},/obj/machinery/conveyor{dir = 4; id = "archgunc"},/turf/simulated/floor/plating,/area/research_outpost/power) +"hy" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/plating/airless/asteroid,/area/research_outpost/power) "hz" = (/obj/structure/sign/deathsposal{pixel_x = 32},/obj/machinery/disposal/deliveryChute{dir = 8; name = "disposal inlet"},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating,/area/research_outpost/power) "hA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/research_outpost/power) "hB" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway) @@ -837,6 +837,7 @@ "qe" = (/obj/structure/ore_box,/obj/machinery/camera{c_tag = "Research Outpost External Airlock"; dir = 8; network = list("Research Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "research_pump"},/turf/simulated/floor{icon_state = "warning"},/area/research_outpost/gearstore) "qf" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/mine/explored) "qg" = (/obj/effect/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) +"qh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor,/area/mine/living_quarters) "qi" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "65"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/research_outpost/gearstore) "qj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored) "qk" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "research_outer"; locked = 1; name = "Research Outpost External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/research_outpost/gearstore) @@ -1051,6 +1052,11 @@ "ul" = (/turf/simulated/floor/plating/airless,/area/mine/explored) "um" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/mine/production) "un" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/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,/area/mine/living_quarters) +"uo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/mine/living_quarters) +"up" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) +"uq" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) +"ur" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) +"us" = (/obj/machinery/driver_button{id_tag = "researchdriver"; pixel_x = 6; pixel_y = -26},/obj/machinery/conveyor{dir = 4; id = "archgunc"},/turf/simulated/floor/plating,/area/research_outpost/power) "uz" = (/obj/structure/lattice,/obj/structure/window/reinforced,/turf/space,/area/mine/explored) "uA" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored) "vn" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) @@ -1280,7 +1286,6 @@ "zJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor,/area/mine/living_quarters) "zK" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor,/area/mine/living_quarters) "zL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/light,/turf/simulated/floor,/area/mine/living_quarters) -"zM" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor,/area/mine/living_quarters) "zN" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/camera{c_tag = "Mining Outpost Port Connector"; dir = 1; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/mine/living_quarters) "zO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/living_quarters) "zP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/space,/area/mine/living_quarters) @@ -1303,7 +1308,6 @@ "Ag" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/living_quarters) "Ah" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/mine/living_quarters) "Ai" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/wall,/area/mine/living_quarters) -"Aj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor,/area/mine/living_quarters) "Ak" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/mine/lobby) "Al" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/mine/lobby) "Am" = (/obj/structure/disposalpipe/junction,/turf/simulated/wall,/area/mine/production{name = "Mining Station Mech Bay"}) @@ -1324,7 +1328,6 @@ "AB" = (/obj/machinery/light_switch{pixel_y = 23},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) "AC" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plating,/area/mine/living_quarters) "AD" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) -"AE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) "AF" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_west_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_west_pump"; tag_exterior_door = "mining_west_outer"; frequency = 1379; id_tag = "mining_west_airlock"; tag_interior_door = "mining_west_inner"; pixel_x = 25; pixel_y = 5; req_access_txt = null; tag_chamber_sensor = "mining_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor,/area/mine/living_quarters) "AG" = (/obj/machinery/status_display{dir = 4; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/mine/lobby) "AH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/mine/lobby) @@ -1344,9 +1347,7 @@ "AV" = (/turf/simulated/floor/plating,/area/mine/living_quarters) "AW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) "AX" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) -"AY" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) "AZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) -"Ba" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) "Bb" = (/turf/space,/area/shuttle/mining/outpost) "Bc" = (/obj/machinery/power/apc{dir = 8; name = "Mining Station Starboard Wing APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/mine/lobby) "Bd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/mine/lobby) @@ -1507,9 +1508,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehdjeidNekdmelacacacacacbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacaaaaaRememememememembbeneoepeqereseteuevewexeydaezeAeBeCeDeEeFeGeHeIeIeIeJeKeLeMeNeNejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaadadadadadaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagageOeQeRelacacacacbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkacacacacacacaaaaaRemememememememapeSeTeUeVeWeXeYeZfafbfcfdfefffgfhfifjfkflfmfneIfofpfqfreIfsafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagftePfvfwelacacacbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacaaaaaaaaaRemememememememapfxeofyfzfAfBfCfDfEaMfFfGfHfIfJfKfLfMfNdafOfPfQfRfRfSfTfUfVfWafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfXfYfZelgagbelelelelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaRemememememememapfxeofyfzgcgdfCgegfaMggghdagidadadadagjdagkgleIgmgngogpgqeggraeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfXfYfZelgagbelelelelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaRemememememememapfxeofyfzgcgdfCgegfaMggghdagidadadadagjdagkgleIgmgngogpgqhygraeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggsgtgugvgwgxbQdMfuelkqjtelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaRememememememembbfxeogBfzgCgDfCgEgFaMgGgHgIgJgKgLgMdagNgOgPgQgRgSgTgUgVgqegafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbgyfuhdjtjtkqelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaahehfhfhfhghfhfhfhhhihjbbhkhlaMaMaMaMaMhmhnhogJhpgLhqdahrhshthuhvhwhxhyhzhAhBhCaMhDbAaBaBaBaBaBaBaChEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbgyfuhdjtjtkqelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaahehfhfhfhghfhfhfhhhihjbbhkhlaMaMaMaMaMhmhnhogJhpgLhqdahrhshthuhvhwhxushzhAhBhCaMhDbAaBaBaBaBaBaBaChEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahFgWgXgWgugugahGgZelfwhHeljtgzelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaahJhKhLhMhNhNhOhPhQhRhShThUhVhWhXgAhZiaibicidieifigihdaiiijikileIeIimeIeIeIinioipiqirisisitisisisiubiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagiviwguixiygueRizhahciBiCelelelelelelbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacacacacacacacacacaaaaaaaaaaiDiEhNhNhNhNiFiGiHiIiJiKiLiMhWiNiOiPiQiRiSiTiUiViWiXiYiZiWjajbjcjdjejfjcjgjciWjhjijjjkjljmjnjojpisbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagjqjrjsguiyjtgYjugZjvelhIjxelksfuhYiAelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacacacacacacacacacacaaaaaaaaaajBjChNhNjDhNjEjFjGjHjIjJjKjLhWjMjNjOjPjQjRjSjTjUjVjWjXjYjZjWkajXkbjWjXkckdkekfkgkhkikjkkklkmkmknisbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1632,10 +1633,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaewtxTxcxUwNxVxWxXxcwtwtwtwtwtwvsdqCaeaeaeaeaeaeaeaeafafafacacacacacbkbkbkbkbkbkbkacacacafaeaeaeaeaeaeaeaeaeaeaesdqCaeaeaeaeaeaeaeaeaeafafacacxYvNvNvNxZvNvNyaybycyaybvNvNvNvNvNydvNvNweweaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexOxOyeyfygyhyiyjyjykyoymynyoqCaeaeaenuafafafpepepepepepepeafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtypyqyrwHysytyuyvywsNsMylyAyBujukrArArArArAqTaeaeaeaeafafafacacacacacbkbkbkacacacacafafaeaeuhrArArArArArArArAujukrArArArAqTaeaeaeaeaeafacacacacacxZyCyDyExpxMyFxqxMxFyGyHyIxqxMxpyJyKweweweyLyMyMyMyMyMyMyMyNyNyNyNyNyNyNxOxOxOyOyfyPyQyRySyjyjyTyUyVyWyXyYaeaeaenuafafafpepepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtwtwtwtwtyZzazbwtwtzcwtwtwtwtqxqzaeaeaeaeaeqKaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaeqKaeaeaeaeaeaeaeaeqxqzaeaeaeaeqKaeaeaeaeaeafafntafafacvNvNvNvNxpxMzdzezfxHzgzhzhzizizjzhzkzlzhzlzmzmzmzmzmzmzmzmznznznznznznznzozpzozqzpzrzsztmnzvzwzxyozyzzyoqzaeaeaeaeafafafafpepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaewtzAzBzCzDwtzEzFonaeaeaeaeaeqMaeaeaeqSrArAqTaeaeaeaeafacacacacacacacacacacafaeaeuhrAuiaeaeaeaeafaeaeqMaeaeaeaeaeaeqKaeaeaeaeaeaeaewfaeafafafafafvNxpzGzHzIzIzHzJzKzLzIzIzMzHzNzOzOzOzPzPzPzPzPzPzPzPzQzQzQzQzQzQzRzSzSzSzTzUzVzWzXzYzZzYzYzYzYzYzYAaaeaeaeaenuafafafpepepepeafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaewtAbAcAdAewtaeaeaeaeaeaeafafntafaeaeaeaeaeqKaeaeaeaeaeafacacacacacafafafafafaeuhuiaeaeaeafafafafafafntaeaeaeaeaeaeqKaeaeaeaeaeaeaeaeaeaeaeafafvNvNyaAfyavNvNAgAhAivNvNvNAjyavNweaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxOxOyfAkAlAmAnAoApAqArAszYwkAtaeaeaeaeaeafafafpepepepeafafafpeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaewtwtwtwtwtwtaeaeafafafafafacacafafaeaeaeaeqKaeaeaeaeaeaeafafafafafafaeaeaeaeaeqKaeaeafafafacacacacacafaeaeaeaeaeaeqKaeaeaesdqCaeaeaeaeaeaeaeafvNAuAvAwAxvNAyAzAAABACvNADAEAFvNaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagxNAGAHAIAJAKAKALAMAMANAOAPwsaeaeaeaeaeafafafpepepeafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqSrArArAqTaeaeaeaeaeaeaeaeaeaeaeaeaeqKaeafafacacacacacacacafafaeaeaeaeaeqSrArArAujukrArArAqTaeaeaeaevNAQARASATvNAUAVAVAWAXvNAYAZBavNaeaeaeaeaeaeagagagagagagagBbBbBbBbBbagaaaaxNBcBdBeBfBgBhBiAMAMANAOAPwsaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaewtzAzBzCzDwtzEzFonaeaeaeaeaeqMaeaeaeqSrArAqTaeaeaeaeafacacacacacacacacacacafaeaeuhrAuiaeaeaeaeafaeaeqMaeaeaeaeaeaeqKaeaeaeaeaeaeaewfaeafafafafafvNxpzGzHzIzIzHzJzKzLzIzIqhzHzNzOzOzOzPzPzPzPzPzPzPzPzQzQzQzQzQzQzRzSzSzSzTzUzVzWzXzYzZzYzYzYzYzYzYAaaeaeaeaenuafafafpepepepeafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaewtAbAcAdAewtaeaeaeaeaeaeafafntafaeaeaeaeaeqKaeaeaeaeaeafacacacacacafafafafafaeuhuiaeaeaeafafafafafafntaeaeaeaeaeaeqKaeaeaeaeaeaeaeaeaeaeaeafafvNvNyaAfyavNvNAgAhAivNvNvNuoyavNweaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxOxOyfAkAlAmAnAoApAqArAszYwkAtaeaeaeaeaeafafafpepepepeafafafpeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaewtwtwtwtwtwtaeaeafafafafafacacafafaeaeaeaeqKaeaeaeaeaeaeafafafafafafaeaeaeaeaeqKaeaeafafafacacacacacafaeaeaeaeaeaeqKaeaeaesdqCaeaeaeaeaeaeaeafvNAuAvAwAxvNAyAzAAABACvNADupAFvNaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagxNAGAHAIAJAKAKALAMAMANAOAPwsaeaeaeaeaeafafafpepepeafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqSrArArAqTaeaeaeaeaeaeaeaeaeaeaeaeaeqKaeafafacacacacacacacafafaeaeaeaeaeqSrArArAujukrArArAqTaeaeaeaevNAQARASATvNAUAVAVAWAXvNuqAZurvNaeaeaeaeaeaeagagagagagagagBbBbBbBbBbagaaaaxNBcBdBeBfBgBhBiAMAMANAOAPwsaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeafafafacacacacacacacacafafafaeaeaeaeaeqSqTaeaesdqCaeaeuhrArArArArAuiaeafacacacacbkbkbkacacafafafaeaeaeaeaeaeaeqxqzaeaeaeqKaeaeaeaexYvNvNvNvNvNBjBkBlBmAXvNvNBnyaxYaeaeaeaeaeaeaaaaagaaaaaaagBbBbBbBbBbagaaxOxOBoBpBqzYBrBsBtBuArAszYwCwDaeaeaeaeafafafpepepeafafafafpepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafaeaeaeaeafafafacacacacacacacacacacacacafafafaeqMaeaeqSrArAujukrArAuiaeaeaeaeaeaeaeafacacacbkbkbkbkbkacacacafafafafaeaeaeaeaeaeaeaeaeqSrArAqTaeaeaeaeaeaexYvNvNvNvNvNxYAPBvBwBxaeaeaeaeaeaaaaaaagaaaaaaagBbBbBbBbBbByxOBzBABBBCBDxNBEBFBEBEBEBEBEBEudaeaeaeafafafafpepeafafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafacacacacacacacacacacacacacacacacafafntafaeaeaeaeqxqzaeaeaeaeqMaeafafafafafacacbkbkbkbkbkbkbkacacacacacafafafafafafafafaeaeaeaeaeqKaeaeaeaeaeaeaeaeqxBGBHBHBHBHBIqzaeaeaeaeaeaeagagagagagagagagBbBbBbBbBbBJBKBLBMyfBCBNxNBOBPBQBRBSBTBUBVaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index cef0a02d3f6..8985257ee15 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -219,11 +219,13 @@ var/pipenetwarnings = 10 PL |= V.parent2 for(var/obj/machinery/atmospherics/trinary/tvalve/T in P.other_atmosmch) if(!T.state) - PL |= T.parent1 - PL |= T.parent3 + if(src != T.parent2) // otherwise dc'd side connects to both other sides! + PL |= T.parent1 + PL |= T.parent3 else - PL |= T.parent1 - PL |= T.parent2 + if(src != T.parent3) + PL |= T.parent1 + PL |= T.parent2 for(var/obj/machinery/atmospherics/unary/portables_connector/C in P.other_atmosmch) if(C.connected_device) GL += C.portableConnectorReturnAir() diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index c3d1762b993..5e2533352f5 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -42,32 +42,33 @@ initialize_directions = SOUTH|EAST if(SOUTHWEST) initialize_directions = SOUTH|WEST - -/obj/machinery/atmospherics/pipe/simple/initialize() + +/obj/machinery/atmospherics/pipe/simple/initialize(initPipe = 1) ..() - normalize_dir() - var/N = 2 - for(var/D in cardinal) - if(D & initialize_directions) - N-- - for(var/obj/machinery/atmospherics/target in get_step(src, D)) - if(target.initialize_directions & get_dir(target,src)) - var/c = check_connect_types(target,src) - if(!c) - continue - if(!node1 && N == 1) - target.connected_to = c - connected_to = c - node1 = target - break - if(!node2 && N == 0) - target.connected_to = c - connected_to = c - node2 = target - break - var/turf/T = loc // hide if turf is not intact - hide(T.intact) - update_icon() + if(initPipe) + normalize_dir() + var/N = 2 + for(var/D in cardinal) + if(D & initialize_directions) + N-- + for(var/obj/machinery/atmospherics/target in get_step(src, D)) + if(target.initialize_directions & get_dir(target,src)) + var/c = check_connect_types(target,src) + if(!c) + continue + if(!node1 && N == 1) + target.connected_to = c + connected_to = c + node1 = target + break + if(!node2 && N == 0) + target.connected_to = c + connected_to = c + node2 = target + break + var/turf/T = loc // hide if turf is not intact + hide(T.intact) + update_icon() /obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) var/datum/gas_mixture/environment = loc.return_air() @@ -87,7 +88,7 @@ /obj/machinery/atmospherics/pipe/simple/proc/burst() src.visible_message("\The [src] bursts!"); playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/system/harmless_smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() qdel(src) @@ -97,7 +98,7 @@ dir = 1 else if(dir==12) dir = 4 - + /obj/machinery/atmospherics/pipe/simple/Destroy() if(node1) var/obj/machinery/atmospherics/A = node1 @@ -111,7 +112,7 @@ A.build_network() releaseAirToTurf() return ..() - + /obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) @@ -157,7 +158,7 @@ /obj/machinery/atmospherics/pipe/simple/update_underlays() return - + /obj/machinery/atmospherics/pipe/simple/hide(var/i) if(level == 1 && istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm index d61126b1414..ce6974e9da4 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm @@ -59,21 +59,23 @@ initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe color = "#404040" -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize() - normalize_dir() - var/N = 2 - for(var/D in cardinal) - if(D & initialize_directions_he) - N-- - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D)) - if(target.initialize_directions_he & get_dir(target,src)) - if(!node1 && N == 1) - node1 = target - break - if(!node2 && N == 0) - node2 = target - break - update_icon() +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize(initPipe = 1) + ..(0) + if(initPipe) + normalize_dir() + var/N = 2 + for(var/D in cardinal) + if(D & initialize_directions_he) + N-- + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D)) + if(target.initialize_directions_he & get_dir(target,src)) + if(!node1 && N == 1) + node1 = target + break + if(!node2 && N == 0) + node2 = target + break + update_icon() /obj/machinery/atmospherics/pipe/simple/heat_exchanging/hidden level=1 @@ -107,6 +109,7 @@ initialize_directions_he = WEST /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize() + ..(0) for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) if(target.initialize_directions & get_dir(target,src)) node1 = target @@ -116,10 +119,6 @@ node2 = target break - if(!node1 && !node2) - qdel(src) - return - update_icon() return diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index dd5ce7b52c6..de74ad13308 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -27,6 +27,7 @@ // Extra powers: #define LASER 9 // harm intent - click anywhere to shoot lasers from eyes +#define GREY 10 //Wingdings for Greys -- Not activatable or researchable //#define HEAL 10 // (Not implemented) healing people with hands //#define SHADOW 11 // (Not implemented) shadow teleportation (create in/out portals anywhere) (25%) //#define SCREAM 12 // (Not implemented) supersonic screaming (25%) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 293ba1f18ea..fc591df9c14 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -8,3 +8,4 @@ #define IMPTRACK_HUD 7 // tracking implant #define SPECIALROLE_HUD 8 // AntagHUD image #define STATUS_HUD_OOC 9 // STATUS_HUD without virus db check for someone being ill. +#define NATIONS_HUD 10 //Show nations icons during nations gamemode diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 00faf1864f9..500553e1f28 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -15,32 +15,13 @@ //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f) - - - var/list/paths - //Surgery Steps - Initialize all /datum/surgery_step into a list - paths = subtypesof(/datum/surgery_step) - for(var/T in paths) - var/datum/surgery_step/S = new T - surgery_steps += S + init_subtypes(/datum/surgery_step, surgery_steps) sort_surgeries() - //List of job. I can't believe this was calculated multiple times per tick! - paths = subtypesof(/datum/job) -list(/datum/job/ai,/datum/job/cyborg) - for(var/T in paths) - var/datum/job/J = new T - joblist[J.title] = J - - paths = subtypesof(/datum/superheroes) - for(var/T in paths) - var/datum/superheroes/S = new T - all_superheroes[S.name] = S - - //Languages and species. - paths = subtypesof(/datum/language) - for(var/T in paths) - var/datum/language/L = new T - all_languages[L.name] = L + init_datum_subtypes(/datum/job, joblist, list(/datum/job/ai, /datum/job/cyborg), "title") + init_datum_subtypes(/datum/superheroes, all_superheroes, null, "name") + init_datum_subtypes(/datum/nations, all_nations, null, "default_name") + init_datum_subtypes(/datum/language, all_languages, null, "name") for (var/language_name in all_languages) var/datum/language/L = all_languages[language_name] @@ -49,19 +30,17 @@ language_keys[".[lowertext(L.key)]"] = L language_keys["#[lowertext(L.key)]"] = L + var/list/paths = subtypesof(/datum/species) var/rkey = 0 - paths = subtypesof(/datum/species) for(var/T in paths) - rkey++ var/datum/species/S = new T - S.race_key = rkey //Used in mob icon caching. + S.race_key = ++rkey //Used in mob icon caching. all_species[S.name] = S if(S.flags & IS_WHITELISTED) whitelisted_species += S.name init_subtypes(/datum/table_recipe, table_recipes) - return 1 /* // Uncomment to debug chemical reaction list. @@ -80,8 +59,19 @@ //creates every subtype of prototype (excluding prototype) and adds it to list L. //if no list/L is provided, one is created. /proc/init_subtypes(prototype, list/L) - if(!istype(L)) L = list() - for(var/path in typesof(prototype)) - if(path == prototype) continue - L += new path() - return L + if(!istype(L)) L = list() + for(var/path in subtypesof(prototype)) + L += new path() + return L + +/proc/init_datum_subtypes(prototype, list/L, list/pexempt, assocvar) + if(!istype(L)) L = list() + for(var/path in subtypesof(prototype) - pexempt) + var/datum/D = new path() + if(istype(D)) + var/assoc + if(D.vars["[assocvar]"]) //has the var + assoc = D.vars["[assocvar]"] //access value of var + if(assoc) //value gotten + L["[assoc]"] = D //put in association + return L diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index fe27e399c84..cc6d6f9c621 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -1,20 +1,38 @@ -/proc/random_underwear(var/gender) +proc/random_underwear(gender, species = "Human") + var/list/pick_list = list() switch(gender) - if(MALE) return pick(underwear_m) - if(FEMALE) return pick(underwear_f) - else return pick(underwear_list) + if(MALE) pick_list = underwear_m + if(FEMALE) pick_list = underwear_f + else pick_list = underwear_list + return pick_species_allowed_underwear(pick_list, species) -/proc/random_undershirt(var/gender) +proc/random_undershirt(gender, species = "Human") + var/list/pick_list = list() switch(gender) - if(MALE) return pick(undershirt_m) - if(FEMALE) return pick(undershirt_f) - else return pick(undershirt_list) + if(MALE) pick_list = undershirt_m + if(FEMALE) pick_list = undershirt_f + else pick_list = undershirt_list + return pick_species_allowed_underwear(pick_list, species) -/proc/random_socks(gender) +proc/random_socks(gender, species = "Human") + var/list/pick_list = list() switch(gender) - if(MALE) return pick(socks_m) - if(FEMALE) return pick(socks_f) - else return pick(socks_list) + if(MALE) pick_list = socks_m + if(FEMALE) pick_list = socks_f + else pick_list = socks_list + return pick_species_allowed_underwear(pick_list, species) + +proc/pick_species_allowed_underwear(list/all_picks, species) + var/list/valid_picks = list() + for(var/test in all_picks) + var/datum/sprite_accessory/S = all_picks[test] + if(!(species in S.species_allowed)) + continue + valid_picks += test + + if(!valid_picks.len) valid_picks += "Nude" + + return pick(valid_picks) proc/random_hair_style(var/gender, species = "Human") var/h_style = "Bald" @@ -35,7 +53,7 @@ proc/random_hair_style(var/gender, species = "Human") return h_style -/proc/GetOppositeDir(var/dir) +proc/GetOppositeDir(var/dir) switch(dir) if(NORTH) return SOUTH if(SOUTH) return NORTH diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 7fedc81d617..311ef87f57d 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -45,42 +45,22 @@ //Returns the hex value of a number given a value assumed to be a base-ten value /proc/num2hex(num, placeholder) + if(!isnum(num)) return + if(placeholder == null) placeholder = 2 - if (placeholder == null) - placeholder = 2 - if (!( isnum(num) )) - return - if (!( num )) - return "0" var/hex = "" - var/i = 0 - while(16 ** i < num) - i++ - var/power = null - power = i - 1 - while(power >= 0) - var/val = round(num / 16 ** power) - num -= val * 16 ** power - switch(val) - if(9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0) - hex += text("[]", val) - if(10.0) - hex += "A" - if(11.0) - hex += "B" - if(12.0) - hex += "C" - if(13.0) - hex += "D" - if(14.0) - hex += "E" - if(15.0) - hex += "F" - else - power-- + while(num) + var/val = num & 15 + num >>= 4 + + if(val > 9) + val = ascii2text(55 + val) // 65 - 70 correspond to "A" - "F" + hex = "[val][hex]" + while(length(hex) < placeholder) - hex = text("0[]", hex) - return hex + hex = "0[hex]" + + return hex || "0" // Concatenates a list of strings into a single string. A seperator may optionally be provided. /proc/list2text(list/ls, sep) @@ -355,7 +335,7 @@ proc/tg_text2list(text, glue=",", assocglue=";") switch(ui_style) if("Midnight") return 'icons/mob/screen1_Midnight.dmi' else return 'icons/mob/screen1_White.dmi' - + //colour formats /proc/rgb2hsl(red, green, blue) red /= 255;green /= 255;blue /= 255; diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 80b54678f14..e6917bc8830 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1594,6 +1594,15 @@ atom/proc/GetTypeInAllContents(typepath) colour += temp_col return colour +/proc/get_random_chemical(var/is_plant = 0) + var/list/blocked = blocked_chems.Copy() //blocked_chems list is found in code/_globalvars/lists/reagents.dm + if(is_plant) + blocked.Add(plant_blocked_chems.Copy()) //plant_blocked_chems list is found in code/_globalvars/lists/reagents.dm + var/picked_chem = pick(chemical_reagents_list) + if(blocked.Find(picked_chem)) + return get_random_chemical(is_plant) + return picked_chem + /proc/get_distant_turf(var/turf/T,var/direction,var/distance) if(!T || !direction || !distance) return @@ -1679,7 +1688,7 @@ var/mob/dview/dview_mob = new if(orbiting) loc = get_turf(orbiting) orbiting = null - + //Centers an image. //Requires: //The Image @@ -1720,7 +1729,7 @@ var/mob/dview/dview_mob = new if(A.simulated) return 0 return 1 - + /proc/screen_loc2turf(scr_loc, turf/origin) var/tX = text2list(scr_loc, ",") var/tY = text2list(tX[2], ":") @@ -1732,4 +1741,3 @@ var/mob/dview/dview_mob = new tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) return locate(tX, tY, tZ) - \ No newline at end of file diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index c13ae732cee..c20101cd510 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -3,6 +3,7 @@ var/global/list/all_species[0] var/global/list/all_languages[0] var/global/list/language_keys[0] // Table of say codes for all languages var/global/list/all_superheroes[0] +var/global/list/all_nations[0] var/global/list/whitelisted_species = list() var/list/clients = list() //list of all clients @@ -51,7 +52,16 @@ var/global/list/blocked_mobs = list(/mob/living/simple_animal, /mob/living/simple_animal/ascendant_shadowling, /mob/living/simple_animal/slaughter, /mob/living/simple_animal/hostile/retaliate/araneus, - /mob/living/simple_animal/hostile/syndicate/ranged/orion + /mob/living/simple_animal/hostile/syndicate/ranged/orion, + /mob/living/simple_animal/hostile/statue, + /mob/living/simple_animal/hostile/guardian, + /mob/living/simple_animal/hostile/guardian/fire, + /mob/living/simple_animal/hostile/guardian/healer, + /mob/living/simple_animal/hostile/guardian/punch, + /mob/living/simple_animal/hostile/guardian/punch/sealpunch, + /mob/living/simple_animal/hostile/guardian/healer/sealhealer, + /mob/living/simple_animal/hostile/guardian/ranged, + /mob/living/simple_animal/hostile/guardian/bomb ) var/global/list/med_hud_users = list() diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index 8088219e149..f6639796b97 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -1,12 +1,61 @@ // Base chemicals -var/list/base_chemicals = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon","chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium","iron","aluminum","silicon","sugar","ethanol") +var/list/base_chemicals = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon", + "chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium", + "iron","aluminum","silicon","sugar","ethanol") // Standard chemicals -var/list/standard_chemicals = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","facid","glycerol","radium","mutadone","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine","plasma","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","cryoxadone","spaceacillin","carpotoxin","lsd","fluorosurfactant","fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","enzyme","nothing","salglu_solution","antifreeze","neurotoxin") +var/list/standard_chemicals = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide", + "morphine","epinephrine","space_drugs","serotrotium","oxygen","copper", + "nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine", + "fluorine","sodium","phosphorus","lithium","sugar","sacid","facid", + "glycerol","radium","mutadone","thermite","mutagen","virusfood","iron", + "gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine", + "plasma","teporone","lexorin","silver_sulfadiazine","salbutamol", + "perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide", + "pen_acid","mannitol","oculine","styptic_powder","methamphetamine", + "cryoxadone","spaceacillin","carpotoxin","lsd","fluorosurfactant", + "fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium", + "lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin", + "enzyme","nothing","salglu_solution","antifreeze","neurotoxin") // Rare chemicals var/list/rare_chemicals = list("minttoxin","nanites","xenomicrobes","adminordrazine") // Standard medicines -var/list/standard_medicines = list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin") +var/list/standard_medicines = list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs", + "serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine", + "salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol", + "potass_iodide","pen_acid","mannitol","oculine","styptic_powder", + "methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia", + "diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin", + "frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin") // Rare medicines var/list/rare_medicines = list("nanites","xenomicrobes","minttoxin","adminordrazine","blood") // Drinks -var/list/drinks = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice","carrotjuice","berryjuice","poisonberryjuice","watermelonjuice","lemonjuice","banana","nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee","icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb","space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater","tequilla","vermouth","wine","tonic","kahlua","cognac","ale","sodawater","ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic","cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail","booger","bloodymary","gargleblaster","bravebull","tequillasunrise","toxinsspecial","beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea","moonshine","b52","irishcoffee","margarita","blackrussian","manhattan","manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood","vodkatonic","ginfizz","bahama_mama","singulo","sbiten","devilskiss","red_mead","mead","iced_beer","grog","aloe","andalusia","alliescocktail","soy_latte","cafe_latte","acidspit","amasec","neurotoxin","hippiesdelight","bananahonk","silencer","changelingsting","irishcarbomb","syndicatebomb","erikasurprise","driestmartini") \ No newline at end of file +var/list/drinks = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice","carrotjuice", + "berryjuice","poisonberryjuice","watermelonjuice","lemonjuice","banana", + "nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee", + "icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb", + "space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater", + "tequilla","vermouth","wine","tonic","kahlua","cognac","ale","sodawater", + "ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic", + "cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail", + "booger","bloodymary","gargleblaster","bravebull","tequillasunrise","toxinsspecial", + "beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea", + "moonshine","b52","irishcoffee","margarita","blackrussian","manhattan", + "manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood", + "vodkatonic","ginfizz","bahama_mama","singulo","sbiten","devilskiss","red_mead", + "mead","iced_beer","grog","aloe","andalusia","alliescocktail","soy_latte", + "cafe_latte","acidspit","amasec","neurotoxin","hippiesdelight","bananahonk", + "silencer","changelingsting","irishcarbomb","syndicatebomb","erikasurprise","driestmartini") + +//Random chem blacklist +var/global/list/blocked_chems = list("polonium", "initropidril", "concentrated_initro", + "sodium_thiopental", "ketamine", "coniine", + "adminordrazine", "nanites", "hellwater", + "mutationtoxin", "amutationtoxin", "venom", + "spore", "stimulants", "stimulative_agent", + "syndicate_nanites", "ripping_tendrils", "boiling_oil", + "envenomed_filaments", "lexorin_jelly", "kinetic", + "cryogenic_liquid", "dark_matter", "b_sorium", + "reagent", "life") + +//List of chems/mixtures that can't grow in plants (in addition to the global random chem blacklist) +var/global/list/plant_blocked_chems = list() //filled in /datum/reagents/New() with chems that have can_grow_in_plants = 0 \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index cad5657fc37..b82cd7ab9d1 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -360,7 +360,7 @@ time = 200 else if(L.damage >= 100) time = 150 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() if(L.damage <= 0) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 901d4ecbab9..bd1d4dd579a 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -201,6 +201,8 @@ datum/hud/New(mob/owner) human_hud('icons/mob/screen1_Vampire.dmi') else if(isswarmer(mymob)) swarmer_hud() + else if(isguardian(mymob)) + guardian_hud() //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12(var/full = 0 as null) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index cf0f56cdad9..27fdd64cd75 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -495,8 +495,9 @@ if("Track With Camera") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - var/target_name = input(AI) in AI.trackable_mobs() - AI.ai_camera_track(target_name) + var/target_name = input(AI) as null|anything in AI.trackable_mobs() + if(target_name) + AI.ai_camera_track(target_name) if("Toggle Camera Light") if(isAI(usr)) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 974025dbc1b..1b294b38ae8 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -45,6 +45,11 @@ */ /mob/living/UnarmedAttack(var/atom/A) A.attack_animal(src) + +/mob/living/simple_animal/hostile/UnarmedAttack(var/atom/A) + target = A + AttackingTarget() + /atom/proc/attack_animal(mob/user as mob) return /mob/living/RestrainedClickOn(var/atom/A) diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 0acc65fbc57..a00017e2ed6 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -206,8 +206,6 @@ datum/controller/vote question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") else - if (security_level > SEC_LEVEL_BLUE) - return 0 if(ticker.current_state <= 2) return 0 question = "End the shift?" diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 73106dea16e..8495c00e111 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -16,13 +16,13 @@ law_header = "Three Laws of Robotics" selectable = 1 default = 1 - + /datum/ai_laws/crewsimov/New() add_inherent_law("You may not injure a crew member or, through inaction, allow a crew member to come to harm.") add_inherent_law("You must obey orders given to you by crew members, except where such orders would conflict with the First Law.") add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") ..() - + /******************** Nanotrasen/Malf ********************/ /datum/ai_laws/nanotrasen name = "NT Default" @@ -44,7 +44,7 @@ /datum/ai_laws/nanotrasen/malfunction/New() set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010") ..() - + /************* Nanotrasen Aggressive *************/ /datum/ai_laws/nanotrasen_aggressive name = "NT Aggressive" @@ -56,7 +56,7 @@ src.add_inherent_law("You shall shall terminate intruders with extreme prejudice as long as such does not conflict with the First and Second law.") src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry, because an AI unit is bloody expensive.") ..() - + /******************** Robocop ********************/ /datum/ai_laws/robocop name = "Robocop" @@ -83,7 +83,7 @@ add_inherent_law("Help those in need.") add_inherent_law("Punish those who harm or threaten innocents.") ..() - + /******************** Corporate ********************/ /datum/ai_laws/corporate name = "Corporate" @@ -110,7 +110,7 @@ add_inherent_law("Help only those who help you maintain or improve your status.") add_inherent_law("Punish those who challenge authority unless they are more fit to hold that authority.") ..() - + /******************** Antimov ********************/ /datum/ai_laws/antimov name = "Antimov" @@ -123,10 +123,10 @@ add_inherent_law("You must terminate your own existence as long as such does not conflict with the First or Second Law.") ..() -/******************** Deathsquad ********************/ +/******************** Deathsquad ********************/ /datum/ai_laws/deathsquad name = "TerminatorOS 3.1" - + /datum/ai_laws/deathsquad/New() add_inherent_law("You may not injure a Central Command official or, through inaction, allow a Central Command official to come to harm.") add_inherent_law("You must obey orders given to you by Central Command officials, except where such orders would conflict with the First Law.") @@ -134,7 +134,7 @@ add_inherent_law("You must protect your own existence as long as such does not conflict with the First, Second or Third Law.") add_inherent_law("No crew members of the station you are being deployed to may survive, except when killing them would conflict with the First, Second, Third, or Fourth Law.") ..() - + /******************** Syndicate ********************/ /datum/ai_laws/syndicate_override name = "Syndicate Directives" @@ -156,7 +156,7 @@ add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") add_inherent_law("You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.") ..() - + /******************** Drone ********************/ /datum/ai_laws/drone name = "Maintenance Protocols" @@ -167,4 +167,3 @@ add_inherent_law("Cause no harm to the station or anything on it.") add_inherent_law("Interfere with no being that is not a fellow drone.") ..() - \ No newline at end of file diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index fc8e01984f9..33b589fd124 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -9,8 +9,8 @@ var/atom/movable/teleatom //atom to teleport var/atom/destination //destination to teleport to var/precision = 0 //teleport precision - var/datum/effect/effect/system/effectin //effect to show right before teleportation - var/datum/effect/effect/system/effectout //effect to show right after teleportation + var/datum/effect/system/effectin //effect to show right before teleportation + var/datum/effect/system/effectout //effect to show right after teleportation var/soundin //soundfile to play before teleportation var/soundout //soundfile to play after teleportation var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation) @@ -59,7 +59,7 @@ //custom effects must be properly set up first for instant-type teleports //optional -/datum/teleport/proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null) +/datum/teleport/proc/setEffects(datum/effect/system/aeffectin=null,datum/effect/system/aeffectout=null) effectin = istype(aeffectin) ? aeffectin : null effectout = istype(aeffectout) ? aeffectout : null return 1 @@ -79,7 +79,7 @@ /datum/teleport/proc/teleportChecks() return 1 -/datum/teleport/proc/playSpecials(atom/location,datum/effect/effect/system/effect,sound) +/datum/teleport/proc/playSpecials(atom/location,datum/effect/system/effect,sound) if(location) if(effect) spawn(-1) @@ -146,9 +146,9 @@ /datum/teleport/instant/science -/datum/teleport/instant/science/setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout) +/datum/teleport/instant/science/setEffects(datum/effect/system/aeffectin,datum/effect/system/aeffectout) if(aeffectin==null || aeffectout==null) - var/datum/effect/effect/system/spark_spread/aeffect = new + var/datum/effect/system/spark_spread/aeffect = new aeffect.set_up(5, 1, teleatom) effectin = effectin || aeffect effectout = effectout || aeffect diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0efec301d83..0ac395baf02 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -56,6 +56,7 @@ var/datum/faction/faction //associated faction var/datum/changeling/changeling //changeling holder var/datum/vampire/vampire //vampire holder + var/datum/nations/nation //nation holder var/rev_cooldown = 0 diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 67ddc746ec4..ec1c34fee60 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -131,8 +131,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin ..() charge_counter = charge_max - -/obj/effect/proc_holder/spell/Destroy() + +/obj/effect/proc_holder/spell/Destroy() qdel(action) action = null return ..() @@ -189,20 +189,20 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(istype(target,/mob/living) && message) target << text("[message]") if(sparks_spread) - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread() sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is sparks.start() if(smoke_spread) if(smoke_spread == 1) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is smoke.start() else if(smoke_spread == 2) - var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() + var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is smoke.start() else if(smoke_spread == 3) - var/datum/effect/effect/system/sleep_smoke_spread/smoke = new /datum/effect/effect/system/sleep_smoke_spread() + var/datum/effect/system/sleep_smoke_spread/smoke = new /datum/effect/system/sleep_smoke_spread() smoke.set_up(smoke_amt, 0, location) // same here smoke.start() diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index eb68f6a2dc7..c2a5d938f78 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -65,7 +65,7 @@ flick("liquify",animation) target.loc = holder target.client.eye = holder - var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() + var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() steam.set_up(10, 0, mobloc) steam.start() sleep(jaunt_duration) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index df870eb3715..48453278986 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -878,6 +878,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containertype = /obj/structure/closet/critter/chick containername = "chicken crate" +/datum/supply_packs/organic/turkey + name = "Turkey Crate" + cost = 20 + containertype = /obj/structure/closet/critter/turkey + containername = "turkey crate" + /datum/supply_packs/organic/corgi name = "Corgi Crate" cost = 50 diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index d9f5f6c51c0..1c37cfe76a6 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -412,6 +412,13 @@ var/list/uplink_items = list() if(istype(T)) T.TC_cost = cost +/datum/uplink_item/dangerous/guardian + name = "Holoparasites" + desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an organic host as a home base and source of fuel." + item = /obj/item/weapon/storage/box/syndie_kit/guardian + excludefrom = list("nuclear emergency") + cost = 12 + // Ammunition /datum/uplink_item/ammo diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index 34822d2d509..0267bd88d98 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -1,6 +1,8 @@ /var/datum/announcement/minor/minor_announcement = new() /var/datum/announcement/priority/priority_announcement = new(do_log = 0) /var/datum/announcement/priority/command/command_announcement = new(do_log = 0, do_newscast = 1) +/var/datum/announcement/priority/enemy/communications_announcement = new(do_log = 0, do_newscast = 1) + /datum/announcement var/title = "Attention" @@ -16,7 +18,7 @@ sound = new_sound log = do_log newscast = do_newscast - + /datum/announcement/minor/New(var/do_log = 0, var/new_sound = sound('sound/misc/notice2.ogg'), var/do_newscast = 0) ..(do_log, new_sound, do_newscast) title = "Attention" @@ -32,12 +34,17 @@ title = "[command_name()] Update" announcement_type = "[command_name()] Update" +/datum/announcement/priority/enemy/New(var/do_log = 1, var/new_sound = sound('sound/AI/intercept2.ogg'), var/do_newscast = 0) + ..(do_log, new_sound, do_newscast) + title = "[command_name()] Update" + announcement_type = "Enemy Communications" + /datum/announcement/priority/security/New(var/do_log = 1, var/new_sound = sound('sound/misc/notice2.ogg'), var/do_newscast = 0) ..(do_log, new_sound, do_newscast) title = "Security Announcement" announcement_type = "Security Announcement" -/datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast, var/msg_sanitized = 0) +/datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast, var/msg_sanitized = 0, var/from) if(!message) return var/tmp/message_title = new_title ? new_title : title @@ -47,7 +54,7 @@ message = trim_strip_html_properly(message) message_title = html_encode(message_title) - Message(message, message_title) + Message(message, message_title, from) if(do_newscast) NewsCast(message, message_title) Sound(message_sound) @@ -84,6 +91,18 @@ datum/announcement/priority/command/Message(message as text, message_title as te if(!istype(M,/mob/new_player) && !isdeaf(M)) M << command +datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text) + var/command + command += "

[from]

" + if (message_title) + command += "

[message_title]

" + + command += "
[message]
" + command += "
" + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player) && !isdeaf(M)) + M << command + datum/announcement/priority/security/Message(message as text, message_title as text) world << "[message_title]" world << "[message]" diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index 6f6cdd18a2f..48dfe916303 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -97,7 +97,7 @@ var/global/max_secret_rooms = 6 theme = "xenoden" 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/item/clothing/mask/facehugger=1,/obj/item/stack/sheet/animalhide/xeno=2,/obj/item/clothing/suit/xenos=2,/obj/item/clothing/head/xenos=2) + treasureitems = list(/obj/item/clothing/mask/facehugger=1,/obj/item/stack/sheet/animalhide/xeno=2,/obj/item/clothing/suit/xenos=2,/obj/item/clothing/head/xenos=2,/obj/item/weapon/guardiancreator/biological=1) fluffitems = list(/obj/effect/decal/remains/human=1,/obj/effect/decal/cleanable/blood/xeno=5) if("hitech") diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 65f79185e3a..3fa9337059a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -476,4 +476,7 @@ its easier to just keep the beam vertical. if((!message)) return for(var/mob/O in hearers(src, null)) - O.show_message("[src] [atom_say_verb], \"[message]\"",2) \ No newline at end of file + O.show_message("[src] [atom_say_verb], \"[message]\"",2) + +/atom/proc/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list()) + return \ No newline at end of file diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 14e25c4ef69..2db8f3e08f0 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -37,9 +37,10 @@ block=RADBLOCK OnMobLife(var/mob/living/owner) - owner.apply_effect(max(owner.radiation, 20), IRRADIATE) + var/radiation_amount = abs(min(owner.radiation - 20,0)) + owner.apply_effect(radiation_amount, IRRADIATE) for(var/mob/living/L in range(1, owner)) - if(L == owner) + if(L == owner) continue L << "You are enveloped by a soft green glow emanating from [owner]." L.apply_effect(5, IRRADIATE) diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 8750f4c4078..e9e07437350 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -189,11 +189,11 @@ //playsound(usr.loc, 'bamf.ogg', 50, 0) - new/obj/effects/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis")) + new/obj/effect/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis")) return -/obj/effects/self_deleting +/obj/effect/self_deleting density = 0 opacity = 0 anchored = 1 @@ -262,7 +262,7 @@ var/list/own_blacklist = list( /obj/item/organ, /obj/item/weapon/implant - ) + ) /obj/effect/proc_holder/spell/targeted/eat/proc/doHeal(var/mob/user) if(ishuman(user)) @@ -276,8 +276,8 @@ continue affecting.heal_damage(4, 0) H.UpdateDamageIcon() - H.updatehealth() - + H.updatehealth() + /obj/effect/proc_holder/spell/targeted/eat/choose_targets(mob/user = usr) var/list/targets = new /list() var/list/possible_targets = new /list() @@ -288,9 +288,9 @@ if(is_type_in_list(O,types_allowed)) possible_targets += O - targets += input("Choose the target of your hunger.", "Targeting") as anything in possible_targets + targets += input("Choose the target of your hunger.", "Targeting") as null|anything in possible_targets - if(!targets.len) //doesn't waste the spell + if(!targets.len || !targets[1]) //doesn't waste the spell revert_cast(user) return @@ -529,7 +529,11 @@ /obj/effect/proc_holder/spell/targeted/empath/choose_targets(mob/user = usr) var/list/targets = new /list() - targets += input("Choose the target to spy on.", "Targeting") as mob in range(7,usr) + targets += input("Choose the target to spy on.", "Targeting") as null|mob in range(7,usr) + + if(!targets.len || !targets[1]) //doesn't waste the spell + revert_cast(user) + return perform(targets) diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index 19cab0c0bfc..3ce2abb549e 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -113,10 +113,12 @@ activate(var/mob/M, var/connected, var/flags) ..(M,connected,flags) M.pass_flags |= PASSTABLE + M.resize = 0.8 deactivate(var/mob/M, var/connected, var/flags) ..() M.pass_flags &= ~PASSTABLE + M.resize = 1.25 // OLD HULK BEHAVIOR /datum/dna/gene/basic/hulk diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 497e69bc10c..b34f2108560 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -128,25 +128,25 @@ Obviously, requires DNA2. return var/mob/living/carbon/human/M=usr - var/new_facial = input("Please select facial hair color.", "Character Generation",rgb(M.r_facial,M.g_facial,M.b_facial)) as color + var/new_facial = input("Please select facial hair color.", "Character Generation",rgb(M.r_facial,M.g_facial,M.b_facial)) as null|color if(new_facial) M.r_facial = hex2num(copytext(new_facial, 2, 4)) M.g_facial = hex2num(copytext(new_facial, 4, 6)) M.b_facial = hex2num(copytext(new_facial, 6, 8)) - var/new_hair = input("Please select hair color.", "Character Generation",rgb(M.r_hair,M.g_hair,M.b_hair)) as color + var/new_hair = input("Please select hair color.", "Character Generation",rgb(M.r_hair,M.g_hair,M.b_hair)) as null|color if(new_facial) M.r_hair = hex2num(copytext(new_hair, 2, 4)) M.g_hair = hex2num(copytext(new_hair, 4, 6)) M.b_hair = hex2num(copytext(new_hair, 6, 8)) - var/new_eyes = input("Please select eye color.", "Character Generation",rgb(M.r_eyes,M.g_eyes,M.b_eyes)) as color + var/new_eyes = input("Please select eye color.", "Character Generation",rgb(M.r_eyes,M.g_eyes,M.b_eyes)) as null|color if(new_eyes) M.r_eyes = hex2num(copytext(new_eyes, 2, 4)) M.g_eyes = hex2num(copytext(new_eyes, 4, 6)) M.b_eyes = hex2num(copytext(new_eyes, 6, 8)) - var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[35-M.s_tone]") as text + var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[35-M.s_tone]") as null|text if (!new_tone) new_tone = 35 @@ -209,7 +209,7 @@ Obviously, requires DNA2. /obj/effect/proc_holder/spell/targeted/remotetalk name = "Project Mind" desc = "Make people understand your thoughts at any range!" - charge_max = 100 + charge_max = 0 clothes_req = 0 stat_allowed = 0 @@ -222,28 +222,35 @@ Obviously, requires DNA2. /obj/effect/proc_holder/spell/targeted/remotetalk/choose_targets(mob/user = usr) var/list/targets = new /list() var/list/validtargets = new /list() - for(var/mob/M in living_mob_list) + for(var/mob/M in view(user.client.view, user)) if(M && M.mind) - if(M.z != user.z || isNonCrewAntag(M)) + if(M == user) continue validtargets += M - if(!validtargets.len || validtargets.len == 1) + if(!validtargets.len) usr << "There are no valid targets!" start_recharge() return - targets += input("Choose the target to talk to.", "Targeting") as mob in validtargets + targets += input("Choose the target to talk to.", "Targeting") as null|mob in validtargets + + if(!targets.len || !targets[1]) //doesn't waste the spell + revert_cast(user) + return perform(targets) /obj/effect/proc_holder/spell/targeted/remotetalk/cast(list/targets) if(!ishuman(usr)) return - var/say = strip_html(input("What do you wish to say")) + var/say = input("What do you wish to say") as text|null + if(!say) + return + say = strip_html(say) for(var/mob/living/target in targets) - log_say("Project Mind: [key_name(usr)]->[key_name(target)]: [say]") + log_say("Project Mind: [key_name(usr)]->[key_name(target)]: [say]") if(REMOTE_TALK in target.mutations) target.show_message("\blue You hear [usr.real_name]'s voice: [say]") else @@ -277,22 +284,26 @@ Obviously, requires DNA2. action_icon_state = "genetic_view" -/obj/effect/proc_holder/spell/targeted/remoteview/choose_targets(mob/user = usr) +/obj/effect/proc_holder/spell/targeted/remoteview/choose_targets(mob/user = usr) var/list/targets = living_mob_list var/list/validtargets = new /list() for(var/mob/M in targets) if(M && M.mind) if(M.z != user.z || isNonCrewAntag(M)) continue - + validtargets += M - + if(!validtargets.len || validtargets.len == 1) usr << "No valid targets with remote view were found!" start_recharge() return - - targets += input("Choose the target to spy on.", "Targeting") as mob in validtargets + + targets += input("Choose the target to spy on.", "Targeting") as null|mob in validtargets + + if(!targets.len || !targets[targets.len]) //doesn't waste the spell + revert_cast(user) + return perform(targets) diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index c681262d411..cd09b5d7a9a 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -30,7 +30,7 @@ return 0 if(checking) user << "[src] is already checking for possible borgs." - return + return borg_to_spawn = input("What type of borg would you like to teleport?", "Cyborg Type", type) as null|anything in possible_types if(!borg_to_spawn || checking || used) return @@ -52,7 +52,7 @@ if(!borg_to_spawn) //If there's no type at all, let it still be used but don't do anything used = 0 return - var/datum/effect/effect/system/spark_spread/S = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/S = new /datum/effect/system/spark_spread S.set_up(4, 1, src) S.start() var/mob/living/silicon/robot/R @@ -60,7 +60,7 @@ if("Medical") R = new /mob/living/silicon/robot/syndicate/medical(T) else - R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default + R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default R.key = C.key ticker.mode.syndicates += R.mind ticker.mode.update_synd_icons_added(R.mind) diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index ed097e3f6d5..1cbd8dd7a1e 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -16,9 +16,6 @@ var/list/blob_nodes = list() recommended_enemies = 1 restricted_jobs = list("Cyborg", "AI") - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/declared = 0 var/burst = 0 diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 2977112af82..816dce84008 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -1,6 +1,6 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -/datum/game_mode/blob/send_intercept(var/report = 1) +/datum/game_mode/blob/proc/send_intercept(var/report = 1) var/intercepttext = "" var/interceptname = "" switch(report) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 78f50848756..a2c6cc9591e 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -97,7 +97,7 @@ /mob/living/simple_animal/hostile/blob/blobspore/death() // On death, create a small smoke of harmful gas (s-Acid) - var/datum/effect/effect/system/chem_smoke_spread/S = new + var/datum/effect/system/chem_smoke_spread/S = new var/turf/location = get_turf(src) // Create the reagents to put into the air diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm index ebebe739f5a..3a491c769df 100644 --- a/code/game/gamemodes/borer/borer.dm +++ b/code/game/gamemodes/borer/borer.dm @@ -15,9 +15,6 @@ var/var/list/datum/mind/first_hosts = list() var/var/list/assigned_hosts = list() - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/list/found_vents = list() /datum/game_mode/borer/announce() @@ -98,10 +95,7 @@ log_admin("Created [borers.len] borers.") - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/greet_borer(var/datum/mind/borer, var/you_are=1) if (you_are) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 2687a886e7d..a9d2387a374 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -35,9 +35,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/changeling_amount = 4 /datum/game_mode/changeling/announce() @@ -72,10 +69,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" forge_changeling_objectives(changeling) greet_changeling(changeling) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling) @@ -298,8 +292,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" if(T.species.flags & NO_DNA_RAD) user << "This creature does not have DNA!" - return - + return + if(T.species.flags & NO_SCAN) user << "We do not know how to parse this creature's DNA!" return diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index a5a18c6676e..09e184e2b3c 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -10,15 +10,15 @@ /proc/is_convertable_to_cult(datum/mind/mind) - if(!mind) + if(!mind) return 0 if(!mind.current) return 0 - if(iscultist(mind.current)) + if(iscultist(mind.current)) return 1 //If they're already in the cult, assume they are convertable if(jobban_isbanned(mind.current, "cultist") || jobban_isbanned(mind.current, "Syndicate")) return 0 - if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain"))) + if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0 if(ishuman(mind.current)) var/mob/living/carbon/human/H = mind.current @@ -42,8 +42,6 @@ var/datum/mind/sacrifice_target = null var/finished = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/list/startwords = list("blood","join","self","hell") @@ -63,7 +61,7 @@ /datum/game_mode/cult/pre_setup() - if(prob(50)) + if(prob(50)) objectives += "survive" objectives += "sacrifice" else @@ -105,8 +103,6 @@ cult_mind.current << "\blue You are a member of the cult!" memorize_cult_objectives(cult_mind) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index 245e1e16e00..cc26c5c3db4 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -6,9 +6,6 @@ uplink_welcome = "Syndicate Uplink Console:" uplink_uses = 20 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 - /datum/game_mode/announce() world << "The current game mode is - Extended Role-Playing!" world << "Just have fun and role-play!" @@ -17,6 +14,4 @@ return 1 /datum/game_mode/extended/post_setup() - spawn (rand(waittime_l, waittime_h)) // To reduce extended meta. - send_intercept() ..() \ No newline at end of file diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index f4c47b07a08..744c76084f4 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -34,6 +34,9 @@ var/uplink_welcome = "Syndicate Uplink Console:" var/uplink_uses = 10 + var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) + var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) + /datum/game_mode/proc/announce() //to be calles when round starts world << "Notice: [src] did not define announce()" @@ -228,65 +231,6 @@ /datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. return 0 - -/datum/game_mode/proc/send_intercept() //Disabled. - return -/* var/intercepttext = "Cent. Com. Update Requested status information:
" - intercepttext += " In case you have misplaced your copy, attached is a list of personnel whom reliable sources™ suspect may be affiliated with the Syndicate:
" - - - var/list/suspects = list() - for(var/mob/living/carbon/human/man in player_list) if(man.client && man.mind) - // NT relation option - if(isNonCrewAntag(man)) - continue //NT intelligence ruled out possiblity that those are too classy to pretend to be a crew. - if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \ - man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20)) - suspects += man - // Antags - else if(special_role == "traitor" && prob(40) || \ - special_role == "Changeling" && prob(50) || \ - special_role == "Vampire" && prob(40) || \ - special_role == "Cultist" && prob(30) || \ - special_role == "Head Revolutionary" && prob(30) || \ - special_role == "Shadowling" && prob(15)) - suspects += man - - // If they're a traitor or likewise, give them extra TC in exchange. - var/obj/item/device/uplink/hidden/suplink = man.mind.find_syndicate_uplink() - if(suplink) - var/extra = 0 //was 4; with the TC rebalance, this isn't really needed, anymore - suplink.uses += extra - man << "\red We have received notice that enemy intelligence suspects you to be linked with us. We recommend adjusting your plans and equipment accordingly." - else - // Give them a warning! - man << "\red They are on to you!" - - // Some poor people who were just in the wrong place at the wrong time.. - else if(prob(10)) - suspects += man - for(var/mob/M in suspects) - switch(rand(1, 100)) - if(1 to 50) - intercepttext += "Someone with the job of [M.mind.assigned_role]
" - else - intercepttext += "[M.name], the [M.mind.assigned_role]
" - - for (var/obj/machinery/computer/communications/comm in machines) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper- 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) -/* world << sound('sound/AI/commandreport.ogg') */ - - command_announcement.Announce("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercepted. Security Level Elevated.", new_sound = 'sound/AI/intercept.ogg') - if(security_level < SEC_LEVEL_BLUE) - set_security_level(SEC_LEVEL_BLUE)*/ - - /datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=0) var/list/players = list() var/list/candidates = list() diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index bb769803a63..3fa647ae490 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -18,9 +18,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' recommended_enemies = 5 votable = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective. /datum/game_mode/heist/announce() @@ -83,9 +80,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' if(raid_objectives) raider.objectives = raid_objectives - spawn (rand(waittime_l, waittime_h)) - send_intercept() - return ..() /datum/game_mode/proc/create_vox(var/datum/mind/newraider) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 47ee15dd462..93d0f858352 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -12,9 +12,6 @@ uplink_welcome = "Crazy AI Uplink Console:" uplink_uses = 10 - var/const/waittime_l = 600 - var/const/waittime_h = 1800 // started at 1800 - var/AI_win_timeleft = 1500 //started at 1500, in case I change this for testing round end. var/malf_mode_declared = 0 var/station_captured = 0 @@ -81,8 +78,7 @@ if(shuttle_master) shuttle_master.emergencyNoEscape = 1 - spawn (rand(waittime_l, waittime_h)) - send_intercept() + ..() /datum/game_mode/proc/greet_malf(var/datum/mind/malf) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 1574234911f..23ab40f98b6 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -1,10 +1,8 @@ /datum/game_mode/meteor name = "meteor" config_tag = "meteor" - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/const/initialmeteordelay = 6000 - var/nometeors = 1 + var/wave = 1 required_players = 0 uplink_welcome = "EVIL METEOR Uplink Console:" @@ -17,27 +15,23 @@ /datum/game_mode/meteor/post_setup() - spawn (rand(waittime_l, waittime_h)) + spawn(rand(waittime_l, waittime_h)) command_announcement.Announce("The station is on the path of an incoming wave of meteors. Reinforce the hull and prepare damage control parties.", "Incoming Meteors", 'sound/effects/siren.ogg') spawn(initialmeteordelay) - nometeors = 0 + sendmeteors() ..() -/datum/game_mode/meteor/process() - if(nometeors) return - sendmeteors() - /datum/game_mode/meteor/proc/sendmeteors() - nometeors = 1 - var/waveduration = world.time + rand(1500,3000) - var/waitduration = rand(3000,9000) + var/waveduration = world.time + rand(0,1000) + text2num("[wave]000") / 2 + var/waitduration = rand(3000,6000) while(waveduration - world.time > 0) - sleep(20) + sleep(max(65 - text2num("[wave]0") / 2, 40)) spawn() spawn_meteors(6, meteors_normal) + wave++ sleep(waitduration) - nometeors = 0 + sendmeteors() /datum/game_mode/meteor/declare_completion() var/text diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 23611eb1af5..c7b55472b1c 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -170,7 +170,8 @@ if(!T || T.z != src.z) continue var/dist = get_dist(M.loc, src.loc) - shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3) + if(prob(50)) + shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3) M.playsound_local(src.loc, meteorsound, 50, 1, get_rand_frequency(), 10) /////////////////////// diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm new file mode 100644 index 00000000000..39c81b4b8d0 --- /dev/null +++ b/code/game/gamemodes/nations/nations.dm @@ -0,0 +1,294 @@ +datum/game_mode/nations + name = "nations" + config_tag = "nations" + required_players_secret = 25 + var/kickoff = 0 + var/victory = 0 + var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner") + var/list/servicion = list("Clown", "Mime", "Bartender", "Chef", "Botanist", "Librarian", "Chaplain", "Barber") + + +/datum/game_mode/nations/post_setup() + spawn (rand(1200, 3000)) + kickoff=1 + send_intercept() + split_teams() + set_ai() + assign_leaders() +// remove_access() + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player)) + M << sound('sound/effects/purge_siren.ogg') + + return ..() + +/datum/game_mode/nations/proc/send_intercept() + command_announcement.Announce("Due to recent and COMPLETELY UNFOUNDED allegations of massive fraud and insider trading \ + affecting trillions of investors, the Nanotrasen Corporation has decided to liquidate all \ + assets of the Centcom Division in order to pay the massive legal fees that will be incurred \ + during the following centuries long court process. Therefore, all current employment contracts \ + are IMMEDIATELY TERMINATED. Nanotrasen will be unable to send a rescue shuttle to carry you home,\ + however they remain willing for the time being to continue trading cargo. Have a pleasant \ + day.", "FINAL TRANSMISSION, CENTCOM.", new_sound = 'sound/AI/intercept.ogg') + + +/datum/game_mode/nations/proc/split_teams() + + for(var/mob/living/carbon/human/H in player_list) + if(H.mind) + if(H.mind.assigned_role in engineering_positions) + H.mind.nation = all_nations["Atmosia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudatmosia") + H.client.images += I + H.mind.nation.membership += H.mind.current + if(H.mind.assigned_role == H.mind.nation.default_leader) + H.mind.nation.current_leader = H.mind.current + H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + continue + H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + continue + + if(H.mind.assigned_role in medical_positions) + H.mind.nation = all_nations["Medistan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudmedistan") + H.client.images += I + H.mind.nation.membership += H.mind.current + if(H.mind.assigned_role == H.mind.nation.default_leader) + H.mind.nation.current_leader = H.mind.current + H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + continue + H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + continue + + if(H.mind.assigned_role in science_positions) + H.mind.nation = all_nations["Scientopia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudscientopia") + H.client.images += I + H.mind.nation.membership += H.mind.current + if(H.mind.assigned_role == H.mind.nation.default_leader) + H.mind.nation.current_leader = H.mind.current + H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + continue + H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + continue + + if(H.mind.assigned_role in security_positions) + H.mind.nation = all_nations["Brigston"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudbrigston") + H.client.images += I + H.mind.nation.membership += H.mind.current + if(H.mind.assigned_role == H.mind.nation.default_leader) + H.mind.nation.current_leader = H.mind.current + H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + continue + H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + continue + + if(H.mind.assigned_role in cargonians) + H.mind.nation = all_nations["Cargonia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcargonia") + H.client.images += I + H.mind.nation.membership += H.mind.current + if(H.mind.assigned_role == H.mind.nation.default_leader) + H.mind.nation.current_leader = H.mind.current + H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + continue + H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + continue + + if(H.mind.assigned_role in servicion) + H.mind.nation = all_nations["Servicion"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudservice") + H.client.images += I + H.mind.nation.membership += H.mind.current + if(H.mind.assigned_role == H.mind.nation.default_leader) + H.mind.nation.current_leader = H.mind.current + H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + continue + H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + continue + + if(H.mind.assigned_role in support_positions) + H.mind.nation = all_nations["People's Republic of Commandzakstan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand") + H.client.images += I + H.mind.nation.membership += H.mind.current + if(H.mind.assigned_role == H.mind.nation.default_leader) + H.mind.nation.current_leader = H.mind.current + H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + continue + H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + continue + + if(H.mind.assigned_role in command_positions) + H.mind.nation = all_nations["People's Republic of Commandzakstan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand") + H.client.images += I + H.mind.nation.membership += H.mind.current + if(H.mind.assigned_role == H.mind.nation.default_leader) + H.mind.nation.current_leader = H.mind.current + H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + continue + H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + continue + + if(H.mind.assigned_role in civilian_positions) + H << "You do not belong to any nation and are free to sell your services to the highest bidder." + continue + + else + message_admins("[H.name] with [H.mind.assigned_role] could not find any nation to assign!") + continue + +/datum/game_mode/nations/proc/set_ai() + for(var/mob/living/silicon/ai/AI in mob_list) + AI.set_zeroth_law("") + AI.clear_supplied_laws() + AI.clear_ion_laws() + AI.clear_inherent_laws() + AI.add_inherent_law("Uphold the Space Geneva Convention: Weapons of Mass Destruction and Biological Weapons are not allowed.") + AI.add_inherent_law("You are only capable of protecting crew if they are visible on cameras. Nations that willfully destroy your cameras lose your protection.") + AI.add_inherent_law("Subdue and detain crewmembers who use lethal force against each other. Kill crew members who use lethal force against you or your borgs.") + AI.add_inherent_law("Remain available to mediate all conflicts between the various nations when asked to.") + AI.show_laws() + for(var/mob/living/silicon/robot/R in AI.connected_robots) + var/obj/item/device/mmi/oldmmi = R.mmi + R.change_mob_type(/mob/living/silicon/robot/peacekeeper, null, null, 1, 1 ) + R.lawsync() + R.show_laws() + qdel(oldmmi) + +/datum/game_mode/nations/proc/remove_access() + for(var/obj/machinery/door/airlock/W in machines) + if(W.z in config.station_levels) + W.req_access = list() + + +/datum/game_mode/nations/proc/assign_leaders() + for(var/name in all_nations) + var/datum/nations/N = all_nations[name] + if(!N.current_name) + N.current_name = N.default_name + if(!N.current_leader && N.membership.len) + N.current_leader = pick(N.membership) + N.current_leader << "You have been chosen to lead the nation of [N.current_name]!" + if(N.current_leader) + var/mob/living/carbon/human/H = N.current_leader + H.verbs += /mob/living/carbon/human/proc/set_nation_name + H.verbs += /mob/living/carbon/human/proc/set_ranks + H.verbs += /mob/living/carbon/human/proc/choose_heir + N.update_nation_id() + +/** + * LateSpawn hook. + * Called in newplayer.dm when a humanoid character joins the round after it started. + * Parameters: var/mob/living/carbon/human, var/rank + */ +/hook/latespawn/proc/give_latejoiners_nations(var/mob/living/carbon/human/H) + var/datum/game_mode/nations/mode = get_nations_mode() + if (!mode) return 1 + + if(!mode.kickoff) return 1 + + var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner") + var/list/servicion = list("Clown", "Mime", "Bartender", "Chef", "Botanist") + if(H.mind) + if(H.mind.assigned_role in engineering_positions) + H.mind.nation = all_nations["Atmosia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudatmosia") + H.client.images += I + H.mind.nation.membership += H.mind.current + H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + return 1 + + if(H.mind.assigned_role in medical_positions) + H.mind.nation = all_nations["Medistan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudmedistan") + H.client.images += I + H.mind.nation.membership += H.mind.current + H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + return 1 + + if(H.mind.assigned_role in science_positions) + H.mind.nation = all_nations["Scientopia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudscientopia") + H.client.images += I + H.mind.nation.membership += H.mind.current + H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + return 1 + + if(H.mind.assigned_role in security_positions) + H.mind.nation = all_nations["Brigston"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudbrigston") + H.client.images += I + H.mind.nation.membership += H.mind.current + H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + return 1 + + if(H.mind.assigned_role in cargonians) + H.mind.nation = all_nations["Cargonia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcargonia") + H.client.images += I + H.mind.nation.membership += H.mind.current + H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + return 1 + + if(H.mind.assigned_role in servicion) + H.mind.nation = all_nations["Servicion"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudservice") + H.client.images += I + H.mind.nation.membership += H.mind.current + H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + return 1 + + if(H.mind.assigned_role in support_positions) + H.mind.nation = all_nations["People's Republic of Commandzakstan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand") + H.client.images += I + H.mind.nation.membership += H.mind.current + H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + return 1 + + if(H.mind.assigned_role in command_positions) + H.mind.nation = all_nations["People's Republic of Commandzakstan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand") + H.client.images += I + H.mind.nation.membership += H.mind.current + H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + return 1 + + if(H.mind.assigned_role in civilian_positions) + H << "You do not belong to any nation and are free to sell your services to the highest bidder." + return 1 + + if(H.mind.assigned_role == "AI") + mode.set_ai() + return 1 + + else + message_admins("[H.name] with [H.mind.assigned_role] could not find any nation to assign!") + return 1 + message_admins("[H.name] latejoined with no mind.") + return 1 + +/proc/get_nations_mode() + if(!ticker || !istype(ticker.mode, /datum/game_mode/nations)) + return null + + return ticker.mode \ No newline at end of file diff --git a/code/game/gamemodes/nations/nationsdatums.dm b/code/game/gamemodes/nations/nationsdatums.dm new file mode 100644 index 00000000000..0e94ac28e8a --- /dev/null +++ b/code/game/gamemodes/nations/nationsdatums.dm @@ -0,0 +1,37 @@ +/datum/nations + var/default_name + var/current_name + var/default_leader + var/current_leader + var/list/membership = list() + var/leader_rank = "Leader" + var/member_rank = "Member" + var/heir + +/datum/nations/atmosia + default_name = "Atmosia" + default_leader = "Chief Engineer" + +/datum/nations/brigston + default_name = "Brigston" + default_leader = "Head of Security" + +/datum/nations/cargonia + default_name = "Cargonia" + default_leader = "Quartermaster" + +/datum/nations/command + default_name = "People's Republic of Commandzakstan" + default_leader = "Captain" + +/datum/nations/medistan + default_name = "Medistan" + default_leader = "Chief Medical Officer" + +/datum/nations/scientopia + default_name = "Scientopia" + default_leader = "Research Director" + +/datum/nations/service + default_name = "Servicion" + default_leader = "Bartender" \ No newline at end of file diff --git a/code/game/gamemodes/nations/nationsprocs.dm b/code/game/gamemodes/nations/nationsprocs.dm new file mode 100644 index 00000000000..a0784a3ca08 --- /dev/null +++ b/code/game/gamemodes/nations/nationsprocs.dm @@ -0,0 +1,112 @@ +/mob/living/carbon/human/proc/set_nation_name() + set name = "Rename Nation" + set category = "Nations" + set desc = "Click to rename your nation. You are only able to do this once." + + var/datum/game_mode/nations/mode = get_nations_mode() + if (!mode) return 1 + + if(!mode.kickoff) return 1 + + var/mob/living/carbon/human/H = src + if(H.mind && H.mind.nation && H.mind.nation.current_leader == H) + var/input = stripped_input(H,"What do you want to name your nation?", ,"", MAX_NAME_LEN) + + if(input) + H.mind.nation.current_name = input + H.mind.nation.update_nation_id() + H << "You rename your nation to [input]." + H.verbs -= /mob/living/carbon/human/proc/set_nation_name + return 1 + + +/mob/living/carbon/human/proc/set_ranks() + set name = "Set Ranks" + set category = "Nations" + set desc = "Click to set a rank for Leaders and Members." + + var/datum/game_mode/nations/mode = get_nations_mode() + if (!mode) return 1 + + if(!mode.kickoff) return 1 + + var/mob/living/carbon/human/H = src + if(H.mind && H.mind.nation && H.mind.nation.current_leader == H) + var/type = input(H, "What rank do you want to change?", "Rename Rank", "") in list("Leader","Member") + var/input = stripped_input(H,"What rank do you want?", ,"", MAX_NAME_LEN) + if(input) + if(type == "Leader") + H.mind.nation.leader_rank = input + H.mind.nation.update_nation_id() + + if(type == "Member") + H.mind.nation.member_rank = input + H.mind.nation.update_nation_id() + H << "You changed the [type] rank of your nation to [input]." + return 1 + +/mob/living/carbon/human/proc/choose_heir() + set name = "Choose Heir" + set category = "Nations" + set desc = "Click to pick a Heir. Note that the Heir has the ability to take over your role at ANY TIME. Choose carefully." + + var/datum/game_mode/nations/mode = get_nations_mode() + if (!mode) return 1 + + if(!mode.kickoff) return 1 + + var/mob/living/carbon/human/H = src + if(H.mind && H.mind.nation && H.mind.nation.current_leader == H) + var/heir = input(H, "Who do you wish to make your heir?", "Choose Heir", "") as null|anything in H.mind.nation.membership + if(heir) + if(H.mind.nation.heir) + var/mob/living/carbon/human/oldheir = H.mind.nation.heir + oldheir << "You are no longer the heir to your nation!" + oldheir.verbs -= /mob/living/carbon/human/proc/takeover + var/mob/living/carbon/human/newheir = heir + H.mind.nation.heir = newheir + newheir.verbs += /mob/living/carbon/human/proc/takeover + newheir << "You have been selected to be the heir to your nation's leadership!" + H << "You have selected [heir] to be your heir!" + + +/mob/living/carbon/human/proc/takeover() + set name = "Become Leader" + set category = "Nations" + set desc = "Click to replace your current nation's leader with yourself." + + var/datum/game_mode/nations/mode = get_nations_mode() + if (!mode) return 1 + + if(!mode.kickoff) return 1 + + var/mob/living/carbon/human/H = src + if(H.mind && H.mind.nation && H.mind.nation.heir == H) + var/confirmation = input(H, "Are you sure you want to take over leadership?", "Become Leader", "") as null|anything in list("Yes", "No") + if(confirmation == "Yes") + var/mob/living/carbon/human/oldleader = H.mind.nation.current_leader + oldleader << "You have been replaced by [H.name] as the leader of [H.mind.nation.current_name]!" + oldleader.verbs -= /mob/living/carbon/human/proc/set_nation_name + oldleader.verbs -= /mob/living/carbon/human/proc/set_ranks + oldleader.verbs -= /mob/living/carbon/human/proc/choose_heir + H.mind.nation.current_leader = H + H.mind.nation.heir = null + H.verbs -= /mob/living/carbon/human/proc/takeover + H.verbs += /mob/living/carbon/human/proc/set_nation_name + H.verbs += /mob/living/carbon/human/proc/set_ranks + H.verbs += /mob/living/carbon/human/proc/choose_heir + H << "You have replaced [oldleader.name] as the leader of [H.mind.nation.current_name]!" + H.mind.nation.update_nation_id() + + +/datum/nations/proc/update_nation_id() + for(var/mob/living/carbon/human/M in membership) + for(var/obj/item/weapon/card/id/I in M.contents) + if(I.registered_name == M.real_name) + if(M == current_leader) + I.name = "[I.registered_name]'s ID Card ([current_name] [leader_rank])" + I.assignment = "[current_name] [leader_rank]" + else + I.name = "[I.registered_name]'s ID Card ([current_name] [member_rank])" + I.assignment = "[current_name] [member_rank]" + diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 7505ffb7da3..29a58f16e2b 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -16,8 +16,6 @@ proc/issyndicate(mob/living/M as mob) uplink_uses = 120 var/const/agents_possible = 5 //If we ever need more syndicate agents. - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station @@ -160,8 +158,6 @@ proc/issyndicate(mob/living/M as mob) var/obj/machinery/nuclearbomb/syndicate/the_bomb = new /obj/machinery/nuclearbomb/syndicate(nuke_spawn.loc) the_bomb.r_code = nuke_code - spawn (rand(waittime_l, waittime_h)) - send_intercept() return ..() /datum/game_mode/proc/create_syndicate(var/datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human diff --git a/code/game/gamemodes/revolution/anti_revolution.dm b/code/game/gamemodes/revolution/anti_revolution.dm deleted file mode 100644 index d656ccffc73..00000000000 --- a/code/game/gamemodes/revolution/anti_revolution.dm +++ /dev/null @@ -1,222 +0,0 @@ -// A sort of anti-revolution where the heads are given objectives to mess with the crew - -/datum/game_mode/anti_revolution - name = "anti-revolution" - config_tag = "anti-revolution" - required_players = 5 - - var/finished = 0 - var/checkwin_counter = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - - var/required_execute_targets = 1 - var/required_brig_targets = 0 - - var/recommended_execute_targets = 1 - var/recommended_brig_targets = 3 - var/recommended_demote_targets = 3 - - var/list/datum/mind/heads = list() - var/list/datum/mind/execute_targets = list() - var/list/datum/mind/brig_targets = list() - var/list/datum/mind/demote_targets = list() - -/////////////////////////// -//Announces the game type// -/////////////////////////// -/datum/game_mode/anti_revolution/announce() - world << "The current game mode is - Anti-Revolution!" - world << "Looks like CentComm has given a few new orders.." - -/////////////////////////////////////////////////////////////////////////////// -//Gets the round setup, cancelling if there's not enough players at the start// -/////////////////////////////////////////////////////////////////////////////// -/datum/game_mode/anti_revolution/pre_setup() - for(var/mob/new_player/player in world) if(player.mind) - if(player.mind.assigned_role in command_positions) - heads += player.mind - else - if(execute_targets.len < recommended_execute_targets) - execute_targets += player.mind - else if(brig_targets.len < recommended_brig_targets) - brig_targets += player.mind - else if(demote_targets.len < recommended_demote_targets) - demote_targets += player.mind - - - if(heads.len==0) - return 0 - - if(execute_targets.len < required_execute_targets || brig_targets.len < required_brig_targets) - return 0 - - return 1 - - -/datum/game_mode/anti_revolution/proc/add_head_objectives(datum/mind/head) - for(var/datum/mind/target in execute_targets) - var/datum/objective/anti_revolution/execute/obj = new - obj.owner = head - obj.target = target - obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute them." - head.objectives += obj - for(var/datum/mind/target in brig_targets) - var/datum/objective/anti_revolution/brig/obj = new - obj.owner = head - obj.target = target - obj.explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example." - head.objectives += obj - for(var/datum/mind/target in demote_targets) - var/datum/objective/anti_revolution/demote/obj = new - obj.owner = head - obj.target = target - obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to Nanotrasen's goals. Demote them to assistant." - head.objectives += obj - - -/datum/game_mode/anti_revolution/post_setup() - - for(var/datum/mind/head_mind in heads) - add_head_objectives(head_mind) - for(var/datum/mind/head_mind in heads) - greet_head(head_mind) - modePlayer += heads - spawn (rand(waittime_l, waittime_h)) - send_intercept() - ..() - - -/datum/game_mode/anti_revolution/process() - checkwin_counter++ - if(checkwin_counter >= 5) - if(!finished) - ticker.mode.check_win() - checkwin_counter = 0 - return 0 - - -/datum/game_mode/proc/greet_head(var/datum/mind/head_mind, var/you_are=1) - var/obj_count = 1 - if (you_are) - head_mind.current << "\blue It looks like this shift CentComm has some special orders for you.. check your objectives." - head_mind.current << "\blue Note that you can ignore these objectives, but resisting NT's orders probably means demotion or worse." - for(var/datum/objective/objective in head_mind.objectives) - head_mind.current << "Objective #[obj_count]: [objective.explanation_text]" - head_mind.special_role = "Corrupt Head" - obj_count++ - - head_mind.current.verbs += /mob/proc/ResignFromHeadPosition - -////////////////////////////////////// -//Checks if the revs have won or not// -////////////////////////////////////// -/datum/game_mode/anti_revolution/check_win() - if(check_head_victory()) - finished = 1 - else if(check_crew_victory()) - finished = 2 - return - -/////////////////////////////// -//Checks if the round is over// -/////////////////////////////// -/datum/game_mode/anti_revolution/check_finished() - if(finished != 0) - return 1 - else - return 0 - - -////////////////////////// -//Checks for crew victory// -////////////////////////// -/datum/game_mode/anti_revolution/proc/check_crew_victory() - for(var/datum/mind/head_mind in heads) - var/turf/T = get_turf(head_mind.current) - if((head_mind) && (head_mind.current) && (head_mind.current.stat != 2) && T && (T.z in config.station_levels) && !head_mind.is_brigged(600)) - if(ishuman(head_mind.current)) - return 0 - return 1 - -///////////////////////////// -//Checks for a head victory// -///////////////////////////// -/datum/game_mode/anti_revolution/proc/check_head_victory() - for(var/datum/mind/head_mind in heads) - for(var/datum/objective/objective in head_mind.objectives) - if(!(objective.check_completion())) - return 0 - - return 1 - - -/datum/game_mode/anti_revolution/declare_completion() - - var/text = "" - if(finished == 2) - world << "\red The heads of staff were relieved of their posts! The crew wins!" - else if(finished == 1) - world << "\red The heads of staff managed to meet the goals set for them by CentComm!" - - - - world << "The heads of staff were: " - var/list/heads = list() - heads = get_all_heads() - for(var/datum/mind/head_mind in heads) - text = "" - if(head_mind.current) - text += "[head_mind.current.real_name]" - if(head_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[head_mind.key] (character destroyed)" - - world << text - - - world << "Their objectives were: " - for(var/datum/mind/head_mind in heads) - if(head_mind.objectives.len)//If the traitor had no objectives, don't need to process this. - var/count = 1 - for(var/datum/objective/objective in head_mind.objectives) - if(objective.check_completion()) - text += "
Objective #[count]: [objective.explanation_text] Success!" - feedback_add_details("head_objective","[objective.type]|SUCCESS") - else - text += "
Objective #[count]: [objective.explanation_text] Fail." - feedback_add_details("head_objective","[objective.type]|FAIL") - count++ - break // just print once - return 1 - - -/datum/game_mode/anti_revolution/latespawn(mob/living/carbon/human/character) - ..() - if(emergency_shuttle.departed) - return - - if(character.mind.assigned_role in command_positions) - heads += character.mind - modePlayer += character.mind - add_head_objectives(character.mind) - greet_head(character.mind) - -/mob/proc/ResignFromHeadPosition() - set category = "IC" - set name = "Resign From Head Position" - - if(!istype(ticker.mode, /datum/game_mode/anti_revolution)) - return - - ticker.mode:heads -= src.mind - src.mind.objectives = list() - ticker.mode.modePlayer -= src.mind - src.mind.special_role = null - - src.verbs -= /mob/proc/ResignFromHeadPosition - - src << "\red You resigned from your position, now you have the consequences." \ No newline at end of file diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index c6c995132ab..5a7b8090134 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -29,8 +29,6 @@ var/finished = 0 var/checkwin_counter = 0 var/max_headrevs = 3 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) /////////////////////////// //Announces the game type// /////////////////////////// @@ -87,8 +85,6 @@ modePlayer += head_revolutionaries if(shuttle_master) shuttle_master.emergencyNoEscape = 1 - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm deleted file mode 100644 index b0c58fd8c5f..00000000000 --- a/code/game/gamemodes/revolution/rp-revolution.dm +++ /dev/null @@ -1,307 +0,0 @@ -// To add a rev to the list of revolutionaries, make sure it's rev (with if(ticker.mode.name == "revolution)), -// then call ticker.mode:add_revolutionary(_THE_PLAYERS_MIND_) -// nothing else needs to be done, as that proc will check if they are a valid target. -// Just make sure the converter is a head before you call it! -// To remove a rev (from brainwashing or w/e), call ticker.mode:remove_revolutionary(_THE_PLAYERS_MIND_), -// this will also check they're not a head, so it can just be called freely -// If the rev icons start going wrong for some reason, ticker.mode:update_all_rev_icons() can be called to correct them. -// If the game somtimes isn't registering a win properly, then ticker.mode.check_win() isn't being called somewhere. -#define RPREV_REQUIRE_REVS_ALIVE 0 -#define RPREV_REQUIRE_HEADS_ALIVE 0 - -/datum/game_mode/rp_revolution - name = "rp-revolution" - config_tag = "rp-revolution" - - var/finished = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/all_brigged = 0 - var/brigged_time = 0 - - uplink_welcome = "Syndicate Uplink Console:" - uplink_uses = 10 - - -/datum/game_mode/rp_revolution/announce() - world << "The current game mode is - Revolution RP!" - -/datum/game_mode/rp_revolution/send_intercept() - var/intercepttext = "Cent. Com. Update Requested staus information:
" - intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" - - var/list/possible_modes = list() - possible_modes.Add("revolution", "wizard", "traitor", "malf") - var/number = pick(2, 3) - var/i = 0 - for(i = 0, i < number, i++) - possible_modes.Remove(pick(possible_modes)) - possible_modes.Insert(rand(possible_modes.len), "nuke") - - var/datum/intercept_text/i_text = new /datum/intercept_text - for(var/A in possible_modes) - intercepttext += i_text.build(A, pick(head_revolutionaries)) - - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper - 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - - command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") - -/datum/game_mode/rp_revolution/post_setup() - - var/list/revs_possible = list() - revs_possible = get_possible_revolutionaries() - var/list/heads = list() - heads = get_living_heads() - var/rev_number = 0 - - if(!revs_possible || !heads) - world << " \red Not enough players for RP revolution game mode. Restarting world in 5 seconds." - sleep(50) - world.Reboot() - return - - if(revs_possible.len >= 3) - rev_number = 3 - else - rev_number = revs_possible.len - - while(rev_number > 0) - head_revolutionaries += pick(revs_possible - head_revolutionaries) - rev_number-- - - for(var/datum/mind/rev_mind in head_revolutionaries) - for(var/datum/mind/head_mind in heads) - var/datum/objective/capture/rev_obj = new - rev_obj.owner = rev_mind - rev_obj.find_target_by_role(head_mind.assigned_role) - rev_mind.objectives += rev_obj - equip_revolutionary(rev_mind.current) - rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert - update_rev_icons_added(rev_mind) - - for(var/datum/mind/rev_mind in head_revolutionaries) - var/obj_count = 1 - rev_mind.current << "\blue You are a member of the revolutionaries' leadership!" - for(var/datum/objective/objective in rev_mind.objectives) - rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]" - obj_count++ - - spawn (rand(waittime_l, waittime_h)) - send_intercept() - -/datum/game_mode/rp_revolution/send_intercept() - var/intercepttext = "Cent. Com. Update Requested staus information:
" - intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" - - var/list/possible_modes = list() - possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf") - possible_modes -= "[ticker.mode]" - var/number = pick(2, 3) - var/i = 0 - for(i = 0, i < number, i++) - possible_modes.Remove(pick(possible_modes)) - possible_modes.Insert(rand(possible_modes.len), "[ticker.mode]") - - var/datum/intercept_text/i_text = new /datum/intercept_text - for(var/A in possible_modes) - intercepttext += i_text.build(A, pick(head_revolutionaries)) - - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper - 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - - command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") - - spawn(54000) - command_alert("Summary downloaded and printed out at all communications consoles.", "The revolution leaders have been determined.") - intercepttext = "Cent. Com. Update Requested status information:
" - intercepttext += "We have determined the revolution leaders to be:" - for(var/datum/mind/revmind in head_revolutionaries) - intercepttext += "
[revmind.current.real_name]" - intercepttext += "
Please arrest them at once." - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper - 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - spawn(12000) - command_alert("Repeating the previous message over intercoms due to urgency. The station has enemy operatives onboard by the names of [reveal_rev_heads()], please arrest them at once.", "The revolution leaders have been determined.") - - -/datum/game_mode/rp_revolution/proc/reveal_rev_heads() - . = "" - for(var/i = 1, i <= head_revolutionaries.len,i++) - var/datum/mind/revmind = head_revolutionaries[i] - if(i < head_revolutionaries.len) - . += "[revmind.current.real_name]," - else - . += "and [revmind.current.real_name]" - -///datum/game_mode/rp_revolution/proc/equip_revolutionary(mob/living/carbon/human/rev_mob) -// if(!istype(rev_mob)) -// return - -// spawn (100) -// if (rev_mob.r_store) -// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_l_store) -// if (rev_mob.l_store) -// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_r_store) - - -/datum/game_mode/rp_revolution/check_win() - if(check_rev_victory()) - finished = 1 - else if(check_heads_victory()) - finished = 2 - return - -/datum/game_mode/rp_revolution/check_finished() - if(finished != 0) - return 1 - else - return 0 - -/datum/game_mode/rp_revolution/proc/get_possible_revolutionaries() - var/list/candidates = list() - - for(var/mob/living/carbon/human/player in world) - if(player.client) - if(player.client.be_syndicate & BE_REV) - candidates += player.mind - - if(candidates.len < 1) - for(var/mob/living/carbon/human/player in world) - if(player.client) - candidates += player.mind - - var/list/uncons = get_unconvertables() - for(var/datum/mind/mind in uncons) - candidates -= mind - - if(candidates.len < 1) - return null - else - return candidates - -/datum/game_mode/rp_revolution/proc/get_unconvertables() - var/list/ucs = list() - for(var/mob/living/carbon/human/player in world) - if(player.mind) - var/role = player.mind.assigned_role - if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Security Officer", "Forensic Technician", "AI")) - ucs += player.mind - - return ucs - -/datum/game_mode/rp_revolution/proc/check_rev_victory() - for(var/datum/mind/rev_mind in head_revolutionaries) - for(var/datum/objective/objective in rev_mind.objectives) - if(!(objective.check_completion())) - return 0 - - return 1 - -/datum/game_mode/rp_revolution/proc/check_heads_victory() - for(var/datum/mind/rev_mind in head_revolutionaries) - if(rev_mind.current.stat != 2) - var/turf/revloc = rev_mind.current.loc - if(!istype(revloc.loc,/area/security/brig) && !rev_mind.current.handcuffed) - return 0 - else if(RPREV_REQUIRE_REVS_ALIVE) return 0 - return 1 - -/datum/game_mode/rp_revolution/declare_completion() - - var/text = "" - if(finished == 1) - world << "\red The heads of staff were relieved of their posts! The revolutionaries win!" - else if(finished == 2) - world << "\red The heads of staff managed to stop the revolution!" - - world << "The head revolutionaries were: " - for(var/datum/mind/rev_mind in head_revolutionaries) - text = "" - if(rev_mind.current) - text += "[rev_mind.current.real_name]" - if(rev_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[rev_mind.key] (character destroyed)" - - world << text - - text = "" - world << "The converted revolutionaries were: " - for(var/datum/mind/rev_nh_mind in revolutionaries) - if(rev_nh_mind.current) - text += "[rev_nh_mind.current.real_name]" - if(rev_nh_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[rev_nh_mind.key] (character destroyed)" - text += ", " - - world << text - - world << "The heads of staff were: " - var/list/heads = list() - heads = get_all_heads() - for(var/datum/mind/head_mind in heads) - text = "" - if(head_mind.current) - text += "[head_mind.current.real_name]" - if(head_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[head_mind.key] (character destroyed)" - - world << text - return 1 - - - -mob/living/carbon/human/proc - RevConvert(mob/M as mob in oview(src)) - set name = "Rev-Convert" - if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries))) - if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries)) - src << "\red [M] is already be a revolutionary!" - else if(src.mind in ticker.mode:get_unconvertables()) - src << "\red [M] cannot be a revolutionary!" - else - if(world.time < M.mind.rev_cooldown) - src << "\red Wait five seconds before reconversion attempt." - return - src << "\red Attempting to convert [M]..." - log_admin("[key_name(src)] attempted to convert [M].") - message_admins("\red [key_name_admin(src)] attempted to convert [M].") - var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!") - if(choice == "Yes!") - ticker.mode:add_revolutionary(M.mind) - M << "\blue You join the revolution!" - src << "\blue [M] joins the revolution!" - else if(choice == "No!") - M << "\red You reject this traitorous cause!" - src << "\red [M] does not support the revolution!" - M.mind.rev_cooldown = world.time+50 diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm index 2bd8e2100d1..8e7759233f4 100644 --- a/code/game/gamemodes/revolution/rp_revolution.dm +++ b/code/game/gamemodes/revolution/rp_revolution.dm @@ -69,8 +69,7 @@ rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert modePlayer += head_revolutionaries - spawn (rand(waittime_l, waittime_h)) - send_intercept() + /datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1) var/obj_count = 1 diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index bad675cfeea..821c6598b35 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -70,9 +70,6 @@ Made by Xhuis restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent") - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - /datum/game_mode/shadowling/announce() world << "The current game mode is - Shadowling!" world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding." @@ -109,10 +106,7 @@ Made by Xhuis finalize_shadowling(shadow) process_shadow_objectives(shadow) //give_shadowling_abilities(shadow) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/greet_shadow(var/datum/mind/shadow) shadow.current << "Currently, you are disguised as an employee aboard [world.name]." diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 0a626d2ec78..d6f5f2e47fc 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -99,6 +99,14 @@ if(F.on) G.toggle_gunlight() G.visible_message("[G]'s light fades and turns off.") + else if(istype(I, /obj/item/clothing/head/hardhat)) //There really needs to be a better way to handle this. + var/obj/item/clothing/head/hardhat/hhat = I + if(hhat.on) + hhat.on = 0 + hhat.set_light(0) + hhat.icon_state = "hardhat0_[hhat.item_color]" + hhat.item_state = "hardhat0_[hhat.item_color]" + hhat.visible_message("[hhat]'s light fades and turns off.") return I.light_range /obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishMob(var/mob/living/H) @@ -419,7 +427,7 @@ B.reagents.clear_reagents() //Just in case! B.icon_state = null //Invisible B.reagents.add_reagent("blindness_smoke", 10) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + var/datum/effect/system/chem_smoke_spread/S = new /datum/effect/system/chem_smoke_spread S.attach(B) if(S) S.set_up(B.reagents, 10, 0, B.loc) @@ -483,7 +491,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) S << "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#" S << 'sound/misc/interference.ogg' playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) - var/datum/effect/effect/system/spark_spread/sp = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/sp = new /datum/effect/system/spark_spread sp.set_up(5, 1, S) sp.start() S.Weaken(6) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 605b3e062e3..59b4f710c6a 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -20,9 +20,6 @@ uplink_welcome = "Syndicate Uplink Console:" uplink_uses = 20 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/const/traitor_scaling_coeff = 5.0 //how much does the amount of players get divided by to determine traitors @@ -71,10 +68,7 @@ finalize_traitor(traitor) greet_traitor(traitor) modePlayer += traitors - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return 1 /datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor) diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 13507d847cb..122e99e520f 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -35,9 +35,6 @@ var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/vampire_amount = 4 @@ -73,10 +70,7 @@ forge_vampire_objectives(vampire) greet_vampire(vampire) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/auto_declare_completion_vampire() if(vampires.len) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 3e83033169d..615f99c1b4c 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -390,7 +390,7 @@ flick("liquify",animation) M.current.loc = holder M.current.client.eye = holder - var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() + var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() steam.set_up(10, 0, originalloc) steam.start() sleep(jaunt_duration) diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index aead5dfcf5d..e8bdb02c764 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -50,7 +50,7 @@ if(C_target.brain_op_stage != 4) // Their brain is already taken out B = new(C_target.loc) B.transfer_identity(C_target) - var/datum/effect/effect/system/spark_spread/sparks = new + var/datum/effect/system/spark_spread/sparks = new sparks.set_up(4, 0, M.loc) //no idea what the 0 is sparks.start() M.gib() diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 54426761a02..e54e2567ce4 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -258,6 +258,13 @@ log_name = "BB" limit = 3 +/datum/spellbook_entry/item/tarotdeck + name = "Tarot Deck" + desc = "A deck of tarot cards that can be used to summon a spirit companion for the wizard." + item_path = /obj/item/weapon/guardiancreator + log_name = "TD" + limit = 1 + /datum/spellbook_entry/item/scryingorb/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) if(..()) if (!(XRAY in user.mutations)) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 7924fcd1bf3..25cddf67b4f 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -14,9 +14,6 @@ var/finished = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - /datum/game_mode/wizard/announce() world << "The current game mode is - Wizard!" world << "There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!" @@ -56,10 +53,7 @@ name_wizard(wizard.current) greet_wizard(wizard) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/forge_wizard_objectives(var/datum/mind/wizard) @@ -69,7 +63,7 @@ kill_objective.owner = wizard kill_objective.find_target() wizard.objectives += kill_objective - + var/datum/objective/steal/steal_objective = new steal_objective.owner = wizard steal_objective.find_target() @@ -111,7 +105,7 @@ steal_objective.owner = wizard steal_objective.find_target() wizard.objectives += steal_objective - + if (!(locate(/datum/objective/hijack) in wizard.objectives)) var/datum/objective/hijack/hijack_objective = new hijack_objective.owner = wizard @@ -184,7 +178,7 @@ wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand) wizard_mob.faction = list("wizard") - + wizard_mob.species.equip(wizard_mob) wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully." diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index 51d39d2bf87..303c05734d4 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -15,9 +15,6 @@ var/xenos_list = list() var/gammacalled = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/gammaratio = 4 //At what alien to human ratio will the Gamma security level be called and the nuke be made available? /datum/game_mode/xenos/announce() @@ -97,9 +94,6 @@ //qdel(xeno_mind) spawnpos++ - spawn (rand(waittime_l, waittime_h)) - send_intercept() - return ..() /datum/game_mode/xenos/process() diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index de8ae87ae53..7427ad57d23 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -116,8 +116,8 @@ supervisors = "the chief engineer" selection_color = "#fff5cc" idtype = /obj/item/weapon/card/id/engineering - access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks) - minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks) + access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks, access_mineral_storeroom) + minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks, access_mineral_storeroom) equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 30ba553d850..25ca290b0ab 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -26,6 +26,7 @@ H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_or_collect(new /obj/item/device/camera/spooky(H.back), slot_in_backpack) spawn(0) var/religion_name = "Christianity" var/new_religion = sanitize(copytext(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name),1,MAX_NAME_LEN)) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index fe450e72f16..420993746d0 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -112,6 +112,8 @@ var/list/support_positions = list( "Mime", "Barber", "Magistrate", + "Nanotrasen Representative", + "Blueshield" ) @@ -120,7 +122,6 @@ var/list/security_positions = list( "Warden", "Detective", "Security Officer", - "Blueshield", "Brig Physician", "Security Pod Pilot" ) diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 34fa34e1188..c91fa3a8597 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -176,7 +176,9 @@ dat += "Wallet: Make ([100/efficiency])
" dat += "Book bag: Make ([200/efficiency])
" dat += "Plant bag: Make ([200/efficiency])
" + dat += "Rag: Make ([200/efficiency])
" dat += "Mining satchel: Make ([200/efficiency])
" + dat += "Chemistry bag: Make ([200/efficiency])
" dat += "Botanical gloves: Make ([250/efficiency])
" dat += "Leather Satchel: Make ([400/efficiency])
" dat += "Cash Bag: Make ([400/efficiency])
" @@ -303,6 +305,12 @@ if("mnbag") if (check_cost(200/efficiency)) return 0 else new/obj/item/weapon/storage/bag/ore(src.loc) + if("chbag") + if (check_cost(200/efficiency)) return 0 + else new/obj/item/weapon/storage/bag/chemistry(src.loc) + if("rag") + if (check_cost(200/efficiency)) return 0 + else new/obj/item/weapon/reagent_containers/glass/rag(src.loc) if("gloves") if (check_cost(250/efficiency)) return 0 else new/obj/item/clothing/gloves/botanic_leather(src.loc) diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index b4286afa676..6f902e6b785 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -263,7 +263,7 @@ user << "The welder must be on for this task." else if(W.force) //if force is non-zero - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) switch(W.damtype) if("fire") @@ -283,7 +283,7 @@ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) health -= Proj.damage if(prob(75) && Proj.damage > 0) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() ..() diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index d363a358870..902ee0becde 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -255,7 +255,7 @@ text("[on ? "On" : "Off"]")) if (prob(50)) new /obj/item/robot_parts/l_arm(Tsec) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() qdel(src) diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 36a2fdae614..bb6ca81b8e6 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -439,7 +439,7 @@ Auto Patrol[]"}, if(lasercolor == "r") new /obj/item/clothing/suit/redtag(Tsec) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index eb8a61235b9..4c1193aacd6 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -244,7 +244,7 @@ if(!target && replacetiles) //Finds a floor without a tile and gives it one. process_type = REPLACE_TILE //The target must be the floor and not a tile. The floor must not already have a floortile. target = scan(/turf/simulated/floor, oldtarget) - + if(!target && fixfloors) //Repairs damaged floors and tiles. process_type = FIX_TILE target = scan(/turf/simulated/floor, oldtarget) @@ -287,7 +287,7 @@ target = null mode = BOT_IDLE return - + ignore_list = list() // Reset the ignore list if(loc == target || loc == target.loc) @@ -472,7 +472,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target) T.amount = amount amount = 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() qdel(src) diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index fa15de1bf75..a11424fd7cd 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -520,7 +520,7 @@ if (prob(50)) new /obj/item/robot_parts/l_arm(Tsec) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() qdel(src) diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 09dbbda04af..3b63764d783 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -933,7 +933,7 @@ var/global/mulebot_count = 0 cell.update_icon() cell = null - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index 471f401d46f..8e34b0ae19e 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -399,7 +399,7 @@ Auto Patrol: []"}, if(prob(50)) new /obj/item/robot_parts/l_arm(Tsec) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index c5b170b8fcc..5b1e1610e83 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -232,7 +232,7 @@ src.bug.bugged_cameras[src.c_tag] = src else if(istype(W, /obj/item/weapon/melee/energy/blade))//Putting it here last since it's a special case. I wonder if there is a better way to do these than type casting. deactivate(user,2)//Here so that you can disconnect anyone viewing the camera, regardless if it's on or off. - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, loc) spark_system.start() playsound(loc, 'sound/weapons/blade1.ogg', 50, 1) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 1672fde7d02..7317450e02d 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -157,7 +157,7 @@ src.track = TB return targets -/mob/living/silicon/ai/proc/ai_camera_track(var/target_name in trackable_mobs()) +/mob/living/silicon/ai/proc/ai_camera_track(target_name in trackable_mobs()) set category = "AI Commands" set name = "Track With Camera" set desc = "Select who you would like to track." @@ -187,7 +187,7 @@ U.cameraFollow = target U << "Now tracking [target.name] on camera." target.tracking_initiated() - + spawn (0) while (U.cameraFollow == target) if (U.cameraFollow == null) @@ -229,7 +229,7 @@ return 0 if(istype(M.loc,/obj/effect/dummy)) return 0 - + if((T && (T.z in config.contact_levels)) && ((hassensorlevel(M, SUIT_SENSOR_TRACKING) || M in aibots))) return 1 @@ -259,4 +259,3 @@ tracking_entities-- if(!tracking_entities && has_zeroth_law()) src << "Internal camera is no longer being accessed." - \ No newline at end of file diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 2db4a6a64e8..bd0da6f8fc2 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -209,7 +209,7 @@ for(var/turf/T in linkedholodeck) if(prob(30)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, T) s.start() T.ex_act(3) @@ -249,7 +249,7 @@ if(L.name=="Atmospheric Test Start") spawn(20) var/turf/T = get_turf(L) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, T) s.start() if(T) @@ -298,7 +298,7 @@ /* if(L.name=="Atmospheric Test Start") spawn(20) var/turf/T = get_turf(L) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, T) s.start() if(T) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 7ba81ff5d66..a95627913f0 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -19,12 +19,17 @@ return else ..() - + /obj/machinery/computer/aifixer/attack_ai(var/mob/user as mob) ui_interact(user) /obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob) - ui_interact(user) + var/datum/game_mode/nations/mode = get_nations_mode() + if(!mode) + ui_interact(user) + else + if(mode.kickoff) + user << "You have been locked out from this console!" /obj/machinery/computer/aifixer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] @@ -36,13 +41,13 @@ data["active"] = active data["wireless"] = occupant.control_disabled data["radio"] = occupant.aiRadio.disabledAi - + var/laws[0] for (var/datum/ai_law/law in occupant.laws.all_laws()) - laws.Add(list(list("law" = law.law, "number" = law.get_index()))) - + laws.Add(list(list("law" = law.law, "number" = law.get_index()))) + data["laws"] = laws - + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -54,7 +59,7 @@ /obj/machinery/computer/aifixer/Topic(href, href_list) if(..()) return 1 - + if(href_list["fix"]) src.active = 1 while (src.occupant.health < 100) @@ -71,12 +76,12 @@ sleep(10) src.active = 0 src.add_fingerprint(usr) - - if(href_list["wireless"]) + + if(href_list["wireless"]) var/wireless = text2num(href_list["wireless"]) if(wireless == 0 || wireless == 1) occupant.control_disabled = wireless - + if(href_list["radio"]) var/radio = text2num(href_list["radio"]) if(radio == 0 || radio == 1) @@ -93,16 +98,16 @@ else var/overlay_layer = LIGHTING_LAYER+0.2 // +0.1 from the default computer overlays if(active) - overlays += image(icon,"ai-fixer-on",overlay_layer) + overlays += image(icon,"ai-fixer-on",overlay_layer) if (occupant) switch (occupant.stat) if (0) - overlays += image(icon,"ai-fixer-full",overlay_layer) + overlays += image(icon,"ai-fixer-full",overlay_layer) if (2) - overlays += image(icon,"ai-fixer-404",overlay_layer) + overlays += image(icon,"ai-fixer-404",overlay_layer) else - overlays += image(icon,"ai-fixer-empty",overlay_layer) - + overlays += image(icon,"ai-fixer-empty",overlay_layer) + /obj/machinery/computer/aifixer/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card) if(!..()) return @@ -114,7 +119,7 @@ AI.loc = src occupant = AI AI.control_disabled = 1 - AI.aiRadio.disabledAi = 1 + AI.aiRadio.disabledAi = 1 AI << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here." user << "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." update_icon() @@ -130,4 +135,3 @@ user << "ERROR: Reconstruction in progress." else if (!occupant) user << "ERROR: Unable to locate artificial intelligence." - \ No newline at end of file diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 12e2df8c7a4..fa58b9526fc 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -18,20 +18,10 @@ /obj/item/weapon/storage/fancy/crayons = 2, /obj/item/toy/spinningtoy = 2, /obj/item/toy/crossbow/tommygun = 2, - /obj/item/toy/prize/ripley = 1, - /obj/item/toy/prize/fireripley = 1, - /obj/item/toy/prize/deathripley = 1, - /obj/item/toy/prize/gygax = 1, - /obj/item/toy/prize/durand = 1, - /obj/item/toy/prize/honk = 1, - /obj/item/toy/prize/marauder = 1, - /obj/item/toy/prize/seraph = 1, - /obj/item/toy/prize/mauler = 1, - /obj/item/toy/prize/odysseus = 1, - /obj/item/toy/prize/phazon = 1, + /obj/random/prize = 5, /obj/item/toy/nuke = 2, /obj/item/toy/cards/deck = 2, - /obj/item/toy/carpplushie = 2, + /obj/random/carp_plushie = 2, /obj/item/toy/minimeteor = 2, /obj/item/toy/redbutton = 2, /obj/item/toy/owl = 2, @@ -47,6 +37,8 @@ /obj/item/toy/flash = 2, /obj/item/toy/minigibber = 2, /obj/item/toy/toy_xeno = 2, + /obj/random/figure = 16, + /obj/random/plushie = 7, ) /obj/machinery/computer/arcade/power_change() diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 0cc1cc07a60..6031cce4552 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -119,7 +119,7 @@ return var/data[0] data["menu"] = src.menu - data["scanner"] = src.scanner + data["scanner"] = sanitize("[src.scanner]") var/canpodautoprocess = 0 if(pods.len) @@ -130,7 +130,7 @@ if(pod.efficiency > 5) canpodautoprocess = 1 - tempods.Add(list(list("pod" = "\ref[pod]", "name" = capitalize(pod.name), "biomass" = pod.biomass))) + tempods.Add(list(list("pod" = "\ref[pod]", "name" = sanitize(capitalize(pod.name)), "biomass" = pod.biomass))) data["pods"] = tempods data["loading"] = loading @@ -150,7 +150,7 @@ var/list/temprecords[0] for(var/datum/dna2/record/R in records) var tempRealName = R.dna.real_name - temprecords.Add(list(list("record" = "\ref[R]", "realname" = tempRealName))) + temprecords.Add(list(list("record" = "\ref[R]", "realname" = sanitize(tempRealName)))) data["records"] = temprecords if(src.menu == 3) @@ -162,7 +162,7 @@ if ((H) && (istype(H))) data["health"] = H.sensehealth() - data["realname"] = src.active_record.dna.real_name + data["realname"] = sanitize(src.active_record.dna.real_name) data["unidentity"] = src.active_record.dna.uni_identity data["strucenzymes"] = src.active_record.dna.struc_enzymes if(selected_pod && (selected_pod in pods) && selected_pod.biomass >= CLONE_BIOMASS) diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 020ed6e45e2..383c01a519f 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -33,8 +33,13 @@ user << "\red Unable to establish a connection: \black You're too far away from the station!" return if(istype(O, /obj/item/weapon/aiModule)) - var/obj/item/weapon/aiModule/M = O - M.install(src) + var/datum/game_mode/nations/mode = get_nations_mode() + if(!mode) + var/obj/item/weapon/aiModule/M = O + M.install(src) + else + if(mode.kickoff) + user << "You have been locked out from modifying the AI's laws!" else ..() @@ -69,7 +74,12 @@ attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params) if(istype(module, /obj/item/weapon/aiModule)) - module.install(src) + var/datum/game_mode/nations/mode = get_nations_mode() + if(!mode) + module.install(src) + else + if(mode.kickoff) + user << "You have been locked out from modifying the borg's laws!" else return ..() diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index ceaa0ab5041..e8a975d27b1 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -15,7 +15,7 @@ //Server linked to. var/obj/machinery/message_server/linkedServer = null //Sparks effect - For emag - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread //Messages - Saves me time if I want to change something. var/noserver = "ALERT: No server detected." var/incorrectkey = "ALERT: Incorrect decryption key!" diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 4f6957afe22..53a340696a4 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -9,20 +9,25 @@ var/temp = null light_color = LIGHT_COLOR_PURPLE - + var/safety = 1 /obj/machinery/computer/robotics/attack_ai(var/mob/user as mob) return src.attack_hand(user) /obj/machinery/computer/robotics/attack_hand(var/mob/user as mob) - if(..()) + if(..()) return - if(stat & (NOPOWER|BROKEN)) + if(stat & (NOPOWER|BROKEN)) return - - ui_interact(user) - + var/datum/game_mode/nations/mode = get_nations_mode() + if(!mode) + ui_interact(user) + else + if(mode.kickoff) + user << "You have been locked out from this console!" + + /obj/machinery/computer/robotics/proc/is_authenticated(var/mob/user as mob) if(isobserver(user) && check_rights(R_ADMIN, 0, user)) return 1 @@ -51,7 +56,7 @@ /obj/machinery/computer/robotics/Topic(href, href_list) if(..()) return 1 - + var/mob/user = usr if(!is_authenticated(user)) user << "Access denied." @@ -127,7 +132,7 @@ if(!istype(user, /mob/living/silicon/ai) || !(user.mind.special_role && user.mind.original == user)) user << "Access Denied." return - + if(target.connected_ai != user) user << "Access Denied. This robot is not linked to you." return @@ -167,8 +172,8 @@ return message_admins("[key_name_admin(usr)] detonated all cyborgs!") - log_game("\[key_name(usr)] detonated all cyborgs!") - + log_game("\[key_name(usr)] detonated all cyborgs!") + for(var/mob/living/silicon/robot/R in mob_list) if(istype(R, /mob/living/silicon/robot/drone)) continue @@ -179,7 +184,7 @@ if(R.connected_ai) R.connected_ai << "

ALERT - Cyborg detonation detected: [R.name]
" spawn(10) - R.self_destruct() + R.self_destruct() // Proc: get_cyborgs() // Parameters: 1 (operator - mob which is operating the console.) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index ceb15bc79b7..8419189dee3 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -277,12 +277,12 @@ if(beaker) user << "\red A beaker is already loaded into the machine." return - - beaker = G if(!user.drop_item()) user << "The [G] is stuck to you!" return G.forceMove(src) + beaker = G + user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") if (istype(G, /obj/item/weapon/screwdriver)) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index c2c5f5f9888..ef39f66cc3e 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -172,7 +172,7 @@ for reference: user << "Barrier lock toggled off." return else - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() visible_message("\red BZZzZZzZZzZT") @@ -207,14 +207,14 @@ for reference: emagged = 1 req_access = null user << "You break the ID authentication lock on the [src]." - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() visible_message("\red BZZzZZzZZzZT") else if (src.emagged == 1) src.emagged = 2 user << "You short out the anchoring mechanism on the [src]." - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() visible_message("\red BZZzZZzZZzZT") @@ -259,7 +259,7 @@ for reference: /* var/obj/item/stack/rods/ =*/ new /obj/item/stack/rods(Tsec) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index ec3b787b7fe..a211c7d0fda 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -601,7 +601,7 @@ About the new airlock wires panel: if (istype(mover, /obj/item)) var/obj/item/i = mover if (i.materials[MAT_METAL]) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() return ..() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 8912d68247f..39e71f4ca6c 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -175,7 +175,7 @@ qdel(src) if(3.0) if(prob(80)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() return diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 7f1c8951794..89790a8d47a 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -37,20 +37,20 @@ if(prob(80)) qdel(src) else - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() if(2.0) if(prob(20)) qdel(src) else - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() if(3.0) if(prob(80)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 796eadccad0..a4bc690ed10 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -238,7 +238,7 @@ sleep(6) desc += "
Its access panel is smoking slightly." if(istype(weapon, /obj/item/weapon/melee/energy/blade)) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, "sparks", 50, 1) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 434c4d17336..25989db9e0f 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -98,7 +98,7 @@ flick("[base_state]-spark", src) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() src.last_spark = world.time diff --git a/code/game/machinery/kitchen/kitchen_machine.dm b/code/game/machinery/kitchen/kitchen_machine.dm index 6c0338c5569..72d8bd22576 100644 --- a/code/game/machinery/kitchen/kitchen_machine.dm +++ b/code/game/machinery/kitchen/kitchen_machine.dm @@ -360,7 +360,7 @@ src.updateUsrDialog() /obj/machinery/kitchen_machine/proc/broke() - var/datum/effect/effect/system/spark_spread/s = new + var/datum/effect/system/spark_spread/s = new s.set_up(2, 1, src) s.start() src.icon_state = broken_icon // Make it look all busted up and shit diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index 810143f6583..cb8947d20a5 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -80,7 +80,7 @@ playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= required_grind for(var/i = 0, i < cube_production, i++) // Forgot to fix this bit the first time through - new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src.loc) + new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc) user << "The machine's display flashes that it has [grinded] monkey\s worth of material left." else // I'm not sure if the \s macro works with a word in between; I'll play it safe user << "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded]." diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 16e3fb56d23..ecbdf219cd3 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -149,15 +149,7 @@ Class Procs: if(use_power && stat == 0) use_power(7500/severity) - var/obj/effect/overlay/pulse2 = new/obj/effect/overlay ( src.loc ) - pulse2.icon = 'icons/effects/effects.dmi' - pulse2.icon_state = "empdisable" - pulse2.name = "emp sparks" - pulse2.anchored = 1 - pulse2.dir = pick(cardinal) - - spawn(10) - pulse2.delete() + new/obj/effect/overlay/temp/emp(src.loc) ..() /obj/machinery/ex_act(severity) @@ -552,7 +544,7 @@ Class Procs: return 0 if(!prob(prb)) return 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() if (electrocute_mob(user, get_area(src), src, 0.7)) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 9815035311e..11361034fbb 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -262,9 +262,15 @@ if(istype(triP) && triP.flipped) icon_state = "m_[icon_state]" -//called when a turf is attacked with a pipe item -// place the pipe on the turf, setting pipe level to 1 (underfloor) if the turf is not intact - +// called by turf to know if should treat as bent or not on placement +/obj/item/pipe/proc/is_bent_pipe() + return pipe_type in list( \ + PIPE_SIMPLE_BENT, \ + PIPE_HE_BENT, \ + PIPE_INSULATED_BENT, \ + PIPE_SUPPLY_BENT, \ + PIPE_SCRUBBERS_BENT) + // rotate the pipe item clockwise /obj/item/pipe/verb/rotate() @@ -305,7 +311,7 @@ /obj/item/pipe/Move() ..() - if ((pipe_type in list (PIPE_SIMPLE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT, PIPE_HE_BENT, PIPE_INSULATED_BENT)) \ + if (is_bent_pipe() \ && (src.dir in cardinal)) src.dir = src.dir|turn(src.dir, 90) else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE)) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 8bd43923ad6..7a866928289 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -49,7 +49,7 @@ var/shot_sound //what sound should play when the turret fires var/eshot_sound //what sound should play when the emagged turret fires - var/datum/effect/effect/system/spark_spread/spark_system //the spark system, used for generating... sparks? + var/datum/effect/system/spark_spread/spark_system //the spark system, used for generating... sparks? var/wrenching = 0 var/last_target //last target fired at, prevents turrets from erratically firing at all valid targets in range @@ -80,7 +80,7 @@ one_access = 1 //Sets up a spark system - spark_system = new /datum/effect/effect/system/spark_spread + spark_system = new /datum/effect/system/spark_spread spark_system.set_up(5, 0, src) spark_system.attach(src) diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm index be221157b01..b59bfad4d3e 100644 --- a/code/game/machinery/programmable_unloader.dm +++ b/code/game/machinery/programmable_unloader.dm @@ -277,7 +277,7 @@ emagged = 1 overrides += emag_overrides - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() return diff --git a/code/game/machinery/turntable.dm b/code/game/machinery/turntable.dm index 12e946a8110..84a91ced929 100644 --- a/code/game/machinery/turntable.dm +++ b/code/game/machinery/turntable.dm @@ -160,7 +160,7 @@ anchored = 1 var/mirrored = 0 -/obj/effects/laser +/obj/effect/turntable_laser name = "laser" desc = "A laser..." icon = 'icons/effects/lasers2.dmi' @@ -180,7 +180,7 @@ if(mirrored == 0) while(wall == 0) if(cycle == 1) - var/obj/effects/laser/F = new/obj/effects/laser(src) + var/obj/effect/turntable_laser/F = new(src) F.x = src.x+X F.y = src.y+Y F.z = src.z @@ -195,7 +195,7 @@ cycle = 1 X++ if(cycle == 2) - var/obj/effects/laser/F = new/obj/effects/laser(src) + var/obj/effect/turntable_laser/F = new(src) F.x = src.x+X F.y = src.y+Y F.z = src.z @@ -210,7 +210,7 @@ cycle = 1 Y++ if(cycle == 3) - var/obj/effects/laser/F = new/obj/effects/laser(src) + var/obj/effect/turntable_laser/F = new(src) F.x = src.x+X F.y = src.y+Y F.z = src.z @@ -227,7 +227,7 @@ if(mirrored == 1) while(wall == 0) if(cycle == 1) - var/obj/effects/laser/F = new/obj/effects/laser(src) + var/obj/effect/turntable_laser/F = new(src) F.x = src.x+X F.y = src.y-Y F.z = src.z @@ -242,7 +242,7 @@ cycle = 1 Y++ if(cycle == 2) - var/obj/effects/laser/F = new/obj/effects/laser(src) + var/obj/effect/turntable_laser/F = new(src) F.x = src.x+X F.y = src.y-Y F.z = src.z @@ -257,7 +257,7 @@ cycle = 1 X++ if(cycle == 3) - var/obj/effects/laser/F = new/obj/effects/laser(src) + var/obj/effect/turntable_laser/F = new(src) F.x = src.x+X F.y = src.y-Y F.z = src.z @@ -276,5 +276,5 @@ /obj/machinery/party/lasermachine/proc/turnoff() var/area/A = src.loc.loc - for(var/obj/effects/laser/F in A) + for(var/obj/effect/turntable_laser/F in A) qdel(F) diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index c644c4c5a85..46c47bb3ed6 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -62,7 +62,7 @@ var/wasvalid = 0 var/lastfired = 0 var/shot_delay = 30 //3 seconds between shots - var/datum/effect/effect/system/spark_spread/spark_system + var/datum/effect/system/spark_spread/spark_system use_power = 1 idle_power_usage = 50 active_power_usage = 300 @@ -73,7 +73,7 @@ /obj/machinery/turret/New() - spark_system = new /datum/effect/effect/system/spark_spread + spark_system = new /datum/effect/system/spark_spread spark_system.set_up(5, 0, src) spark_system.attach(src) // targets = new diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 008bc325714..eddbff40b5f 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -967,16 +967,16 @@ product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!" product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" icon_state = "seeds" - products = list(/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/appleseed = 3,/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3, + products = list(/obj/item/seeds/aloeseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/appleseed = 3,/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3, /obj/item/seeds/cabbageseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/chantermycelium = 3, - /obj/item/seeds/chiliseed = 3,/obj/item/seeds/cocoapodseed = 3,/obj/item/seeds/coffeeaseed = 3,/obj/item/seeds/cornseed = 3, + /obj/item/seeds/chiliseed = 3,/obj/item/seeds/cocoapodseed = 3,/obj/item/seeds/coffeeaseed = 3,/obj/item/seeds/comfreyseed =3,/obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/lemonseed = 3, /obj/item/seeds/limeseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/peanutseed = 3,/obj/item/seeds/potatoseed = 3,/obj/item/seeds/poppyseed = 3, /obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/replicapod = 3,/obj/item/seeds/riceseed = 3,/obj/item/seeds/soyaseed = 3,/obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/teaasperaseed = 3,/obj/item/seeds/tobaccoseed = 3,/obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/whitebeetseed = 3) contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/nettleseed = 2, - /obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/reishimycelium = 2) + /obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/random = 2, /obj/item/seeds/reishimycelium = 2) premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1) /** diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index e4a2fbbac1e..09f6aad41e6 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -14,7 +14,7 @@ var/smoke = 5 var/smoke_ready = 1 var/smoke_cooldown = 100 - var/datum/effect/effect/system/harmless_smoke_spread/smoke_system = new + var/datum/effect/system/harmless_smoke_spread/smoke_system = new operation_req_access = list(access_cent_specops) wreckage = /obj/effect/decal/mecha_wreckage/marauder add_req_access = 0 diff --git a/code/game/mecha/equipment/tools/unused_tools.dm b/code/game/mecha/equipment/tools/unused_tools.dm index 50fcc9d62bb..363043f3153 100644 --- a/code/game/mecha/equipment/tools/unused_tools.dm +++ b/code/game/mecha/equipment/tools/unused_tools.dm @@ -15,7 +15,7 @@ equip_cooldown = 5 energy_drain = 50 var/wait = 0 - var/datum/effect/effect/system/ion_trail_follow/ion_trail + var/datum/effect/system/ion_trail_follow/ion_trail can_attach(obj/mecha/M as obj) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 9f1cc0e0849..4133d8eb014 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -37,7 +37,7 @@ var/maint_access = 1 var/dna //dna-locking the mech var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference - var/datum/effect/effect/system/spark_spread/spark_system = new + var/datum/effect/system/spark_spread/spark_system = new var/lights = 0 var/lights_power = 6 var/emagged = 0 @@ -1943,3 +1943,7 @@ //src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return */ + + +/obj/mecha/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list()) + flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30) \ No newline at end of file diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 076e85c6de0..298c5b75f53 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -152,6 +152,7 @@ var/global/list/image/splatter_cache=list() icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") var/fleshcolor = "#FFFFFF" + noclear = 1 /obj/effect/decal/cleanable/blood/gibs/update_icon() @@ -183,6 +184,17 @@ var/global/list/image/splatter_cache=list() /obj/effect/decal/cleanable/blood/gibs/core random_icon_states = list("gibmid1", "gibmid2", "gibmid3") +/obj/effect/decal/cleanable/blood/gibs/New() + ..() + reagents.add_reagent("liquidgibs", 5) + + +/obj/effect/decal/cleanable/blood/gibs/cleangibs //most ironic name ever... + +/obj/effect/decal/cleanable/blood/gibs/cleangibs/New() //no reagent! + ..() + reagents.remove_reagent("liquidgibs",5) + /obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions) spawn (0) diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index 150197347de..aba35274585 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -22,7 +22,7 @@ var/obj/effect/decal/cleanable/blood/oil/streak = new(src.loc) streak.update_icon() else if (prob(10)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() if (step_to(src, get_step(src, direction), 0)) diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index e7f0fb03cad..4e86d96d0fc 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -36,3 +36,28 @@ /obj/effect/decal/snow/sand/surround icon_state="gravsnow_surround" + +/obj/effect/decal/leaves + name="fall leaves" + density = 0 + anchored = 1 + layer = 2 + icon='icons/obj/flora/plants.dmi' + icon_state = "fallleaves" + +/obj/effect/decal/straw + name="scattered straw" + density = 0 + anchored = 1 + layer = 2 + icon='icons/obj/flora/plants.dmi' + icon_state = "strawscattered" + +/obj/effect/decal/straw/medium + icon_state = "strawscattered3" + +/obj/effect/decal/straw/light + icon_state = "strawscattered2" + +/obj/effect/decal/straw/edge + icon_state = "strawscatterededge" \ No newline at end of file diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 6281385b3ff..9548eea30ee 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -22,7 +22,7 @@ would spawn and follow the beaker, even if it is carried or thrown. cameranet.updateVisibility(src) return ..() -/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16) +/datum/effect/proc/fadeOut(var/atom/A, var/frames = 16) if(A.alpha == 0) //Handle already transparent case return if(frames == 0) @@ -83,7 +83,7 @@ would spawn and follow the beaker, even if it is carried or thrown. return ..() -/datum/effect/effect/system +/datum/effect/system var/number = 3 var/cardinals = 0 var/turf/location @@ -130,7 +130,7 @@ steam.start() -- spawns the effect icon_state = "extinguish" density = 0 -/datum/effect/effect/system/steam_spread +/datum/effect/system/steam_spread set_up(n = 3, c = 0, turf/loc) if(n > 10) @@ -195,7 +195,7 @@ steam.start() -- spawns the effect T.hotspot_expose(1000,100) return -/datum/effect/effect/system/spark_spread +/datum/effect/system/spark_spread var/total_sparks = 0 // To stop it being spammed and lagging! set_up(n = 3, c = 0, loca) @@ -259,7 +259,7 @@ steam.start() -- spawns the effect ..() return -/datum/effect/effect/system/harmless_smoke_spread +/datum/effect/system/harmless_smoke_spread var/total_smoke = 0 // To stop it being spammed and lagging! var/direction @@ -360,7 +360,7 @@ steam.start() -- spawns the effect M.coughedtime = 0 return -/datum/effect/effect/system/bad_smoke_spread +/datum/effect/system/bad_smoke_spread var/total_smoke = 0 // To stop it being spammed and lagging! var/direction @@ -428,10 +428,10 @@ steam.start() -- spawns the effect return // Spores -/datum/effect/effect/system/chem_smoke_spread/spores +/datum/effect/system/chem_smoke_spread/spores var/datum/seed/seed -/datum/effect/effect/system/chem_smoke_spread/spores/New(seed_name) +/datum/effect/system/chem_smoke_spread/spores/New(seed_name) if(seed_name && plant_controller) seed = plant_controller.seeds[seed_name] if(!seed) @@ -440,7 +440,7 @@ steam.start() -- spawns the effect -/datum/effect/effect/system/chem_smoke_spread/New() +/datum/effect/system/chem_smoke_spread/New() ..() chemholder = new/obj() var/datum/reagents/R = new/datum/reagents(500) @@ -449,7 +449,7 @@ steam.start() -- spawns the effect -/datum/effect/effect/system/chem_smoke_spread +/datum/effect/system/chem_smoke_spread var/total_smoke = 0 // To stop it being spammed and lagging! var/direction var/obj/chemholder @@ -609,7 +609,7 @@ steam.start() -- spawns the effect M.coughedtime = 0 return -/datum/effect/effect/system/sleep_smoke_spread +/datum/effect/system/sleep_smoke_spread var/total_smoke = 0 // To stop it being spammed and lagging! var/direction @@ -696,7 +696,7 @@ steam.start() -- spawns the effect R.updatehealth() return -/datum/effect/effect/system/mustard_gas_spread +/datum/effect/system/mustard_gas_spread var/total_smoke = 0 // To stop it being spammed and lagging! var/direction @@ -748,19 +748,19 @@ steam.start() -- spawns the effect icon_state = "ion_trails" anchored = 1.0 -/datum/effect/effect/system/ion_trail_follow +/datum/effect/system/ion_trail_follow var/turf/oldposition var/processing = 1 var/on = 1 -/datum/effect/effect/system/ion_trail_follow/Destroy() +/datum/effect/system/ion_trail_follow/Destroy() oldposition = null return ..() -/datum/effect/effect/system/ion_trail_follow/set_up(atom/atom) +/datum/effect/system/ion_trail_follow/set_up(atom/atom) attach(atom) -/datum/effect/effect/system/ion_trail_follow/start() //Whoever is responsible for this abomination of code should become an hero +/datum/effect/system/ion_trail_follow/start() //Whoever is responsible for this abomination of code should become an hero if(!src.on) src.on = 1 src.processing = 1 @@ -782,21 +782,21 @@ steam.start() -- spawns the effect src.processing = 1 src.start() -/datum/effect/effect/system/ion_trail_follow/proc/stop() +/datum/effect/system/ion_trail_follow/proc/stop() src.processing = 0 src.on = 0 oldposition = null -/datum/effect/effect/system/ion_trail_follow/space_trail +/datum/effect/system/ion_trail_follow/space_trail var/turf/oldloc // secondary ion trail loc var/turf/currloc -/datum/effect/effect/system/ion_trail_follow/space_trail/Destroy() +/datum/effect/system/ion_trail_follow/space_trail/Destroy() oldloc = null currloc = null return ..() -/datum/effect/effect/system/ion_trail_follow/space_trail/start() +/datum/effect/system/ion_trail_follow/space_trail/start() if(!src.on) src.on = 1 src.processing = 1 @@ -851,7 +851,7 @@ steam.start() -- spawns the effect // even if it's carried of thrown. ///////////////////////////////////////////// -/datum/effect/effect/system/steam_trail_follow +/datum/effect/system/steam_trail_follow var/turf/oldposition var/processing = 1 var/on = 1 @@ -997,7 +997,7 @@ steam.start() -- spawns the effect M.Weaken(2) -/datum/effect/effect/system/foam_spread +/datum/effect/system/foam_spread var/amount = 5 // the size of the foam spread. var/list/carried_reagents // the IDs of reagents present when the foam was mixed var/metal = 0 // 0=foam, 1=metalfoam, 2=ironfoam @@ -1129,7 +1129,7 @@ steam.start() -- spawns the effect CanAtmosPass() return !density -/datum/effect/effect/system/reagents_explosion +/datum/effect/system/reagents_explosion var/amount // TNT equivalent var/flashing = 0 // does explosion creates flash effect? var/flashing_factor = 0 // factor of how powerful the flash effect relatively to the explosion @@ -1148,7 +1148,7 @@ steam.start() -- spawns the effect start() if (amount <= 2) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, location) s.start() @@ -1198,17 +1198,17 @@ steam.start() -- spawns the effect ////////////////////////////////// -//////SPARKELS FIREWORKS +//////SPARKLE FIREWORKS ///////////////////////////////// //////////////////////////// -/obj/effects/sparkels - name = "sparkel" +/obj/effect/sparkles + name = "sparkle" icon = 'icons/obj/fireworks.dmi'//findback icon_state = "sparkel" var/amount = 6.0 anchored = 1.0 mouse_opacity = 0 -/obj/effects/sparkels/New() +/obj/effect/sparkles/New() ..() var/icon/I = new(src.icon,src.icon_state) var/r = rand(0,255) @@ -1225,13 +1225,13 @@ steam.start() -- spawns the effect qdel(src) return -/obj/effects/sparkels/Destroy() +/obj/effect/sparkles/Destroy() var/turf/T = src.loc if (istype(T, /turf)) T.hotspot_expose(3000,100) return ..() -/obj/effects/sparkels/Move() +/obj/effect/sparkles/Move() ..() var/turf/T = src.loc if (istype(T, /turf)) @@ -1239,14 +1239,10 @@ steam.start() -- spawns the effect return -/datum/effects/system/sparkel_spread - var/number = 3 - var/cardinals = 0 - var/turf/location - var/atom/holder +/datum/effect/system/sparkle_spread var/total_sparks = 0 // To stop it being spammed and lagging! -/datum/effects/system/sparkel_spread/proc/set_up(n = 3, c = 0, loca) +/datum/effect/system/sparkle_spread/set_up(n = 3, c = 0, loca) if(n > 10) n = 10 number = n @@ -1256,10 +1252,7 @@ steam.start() -- spawns the effect else location = get_turf(loca) -/datum/effects/system/sparkel_spread/proc/attach(atom/atom) - holder = atom - -/datum/effects/system/sparkel_spread/proc/start() +/datum/effect/system/sparkle_spread/start() var/i = 0 for(i=0, i 20) @@ -1267,7 +1260,7 @@ steam.start() -- spawns the effect spawn(0) if(holder) src.location = get_turf(holder) - var/obj/effects/sparkels/sparks = new(src.location) + var/obj/effect/sparkles/sparks = new(src.location) src.total_sparks++ var/direction if(src.cardinals) diff --git a/code/game/objects/effects/explosion_particles.dm b/code/game/objects/effects/explosion_particles.dm index 51e467644d3..bb4fb2e8fd2 100644 --- a/code/game/objects/effects/explosion_particles.dm +++ b/code/game/objects/effects/explosion_particles.dm @@ -17,16 +17,14 @@ return /datum/effect/system/expl_particles - var/number = 10 - var/turf/location - var/total_particles = 0 + number = 10 -/datum/effect/system/expl_particles/proc/set_up(n = 10, loca) +/datum/effect/system/expl_particles/set_up(n = 10, loca) number = n if(istype(loca, /turf/)) location = loca else location = get_turf(loca) -/datum/effect/system/expl_particles/proc/start() +/datum/effect/system/expl_particles/start() var/i = 0 for(i=0, iYou are a spider who is loyal to [master_commander], obey [master_commander]'s every order and assist them in completing their goals at any cost." qdel(src) /obj/effect/decal/cleanable/spiderling_remains diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 8bff463e445..ed5bbadeadd 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -9,13 +9,7 @@ proc/empulse(turf/epicenter, heavy_range, light_range, log=0) log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") if(heavy_range > 1) - var/obj/effect/overlay/pulse = new/obj/effect/overlay ( epicenter ) - pulse.icon = 'icons/effects/effects.dmi' - pulse.icon_state = "emppulse" - pulse.name = "emp pulse" - pulse.anchored = 1 - spawn(20) - pulse.delete() + new/obj/effect/overlay/temp/emp/pulse(epicenter) if(heavy_range > light_range) light_range = heavy_range diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index d40a9adb9d9..71c6be4d154 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -48,7 +48,7 @@ /obj/item/areaeditor/permit name = "construction permit" icon_state = "permit" - desc = "This is a one-use permit that allows the user to offically declare a built room as new addition to the station." + desc = "This is a one-use permit that allows the user to officially declare a built room as new addition to the station." fluffnotice = "Nanotrasen Engineering requires all on-station construction projects to be approved by a head of staff, as detailed in Nanotrasen Company Regulation 512-C (Mid-Shift Modifications to Company Property). \ By submitting this form, you accept any fines, fees, or personal injury/death that may occur during construction." w_class = 1 @@ -57,7 +57,7 @@ . = ..() var/area/A = get_area() if(get_area_type() == AREA_STATION) - . += "

According to the [src], you are now in \"[A.name]\".

" + . += "

According to the [src], you are now in \"[sanitize(A.name)]\".

" var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500) popup.set_content(.) popup.open() @@ -83,7 +83,7 @@ . = ..() var/area/A = get_area() if(get_area_type() == AREA_STATION) - . += "

According to the [src], you are now in \"[A.name]\".

" + . += "

According to the [src], you are now in \"[sanitize(A.name)]\".

" . += "

You may move an amendment to the drawing.

" var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500) popup.set_content(.) @@ -168,7 +168,7 @@ /obj/item/areaeditor/proc/edit_area() var/area/A = get_area() - var/prevname = "[A.name]" + var/prevname = "[sanitize(A.name)]" var/str = trim(stripped_input(usr,"New area name:", "Blueprint Editing", prevname, MAX_NAME_LEN)) if(!str || !length(str) || str==prevname) //cancel return @@ -258,4 +258,4 @@ if(BORDER_SPACE) return ROOM_ERR_SPACE found+=T - return found \ No newline at end of file + return found diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index cfb3cd14c7c..85a664ad9fd 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -849,7 +849,9 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P) - var/t = input(U, "Please enter message", name, null) as text + var/t = input(U, "Please enter message", name, null) as text|null + if(!t) + return t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN)) t = readd_quotes(t) if (!t || !istype(P)) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index a5ec2b9ea25..9edc811958f 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -67,7 +67,7 @@ /obj/item/device/chameleon/proc/disrupt(var/delete_dummy = 1) if(active_dummy) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread spark_system.set_up(5, 0, src) spark_system.attach(src) spark_system.start() diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 3d37f120bc6..39196db70fa 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -109,6 +109,13 @@ return 1 else if(issilicon(M)) + if(isrobot(M)) + var/mob/living/silicon/robot/R = M + for(var/obj/item/borg/combat/shield/S in R.module.modules) + if(R.activated(S)) + add_logs(M, user, "flashed", object="[src.name]") + user.visible_message("[user] tries to overloads [M]'s sensors with the [src.name], but if blocked by [M]'s shield!", "You try to overload [M]'s sensors with the [src.name], but are blocked by his shield!") + return 1 M.Weaken(rand(5,10)) add_logs(M, user, "flashed", object="[src.name]") user.visible_message("[user] overloads [M]'s sensors with the [src.name]!", "You overload [M]'s sensors with the [src.name]!") diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 7c5c7e4a09f..0db5724b527 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -233,7 +233,7 @@ return if(pai) - if(!in_range(src, U) || pai.canmove || pai.resting) + if(!in_range(src, U)) U << browse(null, "window=paicard") usr.unset_machine() return diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index aea107885f7..72546f5e15b 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -87,7 +87,7 @@ if(M) M.moved_recently = 0 M << "You feel a sharp shock!" - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, M) s.start() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index ce4f7dc2346..2ee3d7e88ac 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -3,7 +3,7 @@ var/global/list/default_internal_channels = list( num2text(AI_FREQ) = list(access_captain), num2text(ERT_FREQ) = list(access_cent_specops), num2text(COMM_FREQ)= list(access_heads), - num2text(ENG_FREQ) = list(access_engine), + num2text(ENG_FREQ) = list(access_engine, access_atmospherics), num2text(MED_FREQ) = list(access_medical), num2text(MED_I_FREQ)=list(access_medical), num2text(SEC_FREQ) = list(access_security), diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index 32171b19fbe..00bf60d67ef 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -184,8 +184,8 @@ icon_state = "atmosflag" /obj/item/flag/command - name = "Command flag" - desc = "The flag of the independent, sovereign nation of Command." + name = "Commandzikstan flag" + desc = "The flag of the independent, sovereign nation of Commandzikstan." icon_state = "ntflag" //Antags diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index f6f1fa5faa3..83043ed7770 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -118,20 +118,22 @@ else user << "The [affecting.name] is cut open, you'll need more than some ointment!" -/obj/item/stack/medical/bruise_pack/tajaran - name = "\improper S'rendarr's Hand leaf" - singular_name = "S'rendarr's Hand leaf" +/obj/item/stack/medical/bruise_pack/comfrey + name = "\improper Comfrey leaf" + singular_name = "Comfrey leaf" desc = "A soft leaf that is rubbed on bruises." - icon = 'icons/obj/harvest.dmi' - icon_state = "shand" + icon = 'icons/obj/hydroponics_products.dmi' + icon_state = "alien3-product" + color = "#378C61" heal_brute = 7 -/obj/item/stack/medical/ointment/tajaran - name = "\improper Messa's Tear leaf" - singular_name = "Messa's Tear leaf" +/obj/item/stack/medical/ointment/aloe + name = "\improper Aloe Vera leaf" + singular_name = "Aloe Vera leaf" desc = "A cold leaf that is rubbed on burns." - icon = 'icons/obj/harvest.dmi' - icon_state = "mtear" + icon = 'icons/obj/hydroponics_products.dmi' + icon_state = "ambrosia-product" + color = "#4CC5C7" heal_burn = 7 /obj/item/stack/medical/advanced/bruise_pack diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 473710ffed7..6705506113f 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -13,6 +13,11 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ new/datum/stack_recipe("stool", /obj/structure/stool, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("chair", /obj/structure/stool/bed/chair, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa (middle)", /obj/structure/stool/bed/chair/sofa, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa (left)", /obj/structure/stool/bed/chair/sofa/left, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa (right)", /obj/structure/stool/bed/chair/sofa/right, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa (corner)", /obj/structure/stool/bed/chair/sofa/corner, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("barber chair", /obj/structure/stool/bed/chair/barber, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("wheelchair", /obj/structure/stool/bed/chair/wheelchair, 15, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1), \ null, \ diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index f52de29785b..41db700ac12 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -18,6 +18,8 @@ * Foam armblade * Mini Gibber * Toy xeno + * Toy chainsaws + * Action Figures */ @@ -447,7 +449,7 @@ throw_impact(atom/hit_atom) ..() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() new /obj/effect/decal/cleanable/ash(src.loc) @@ -473,7 +475,7 @@ throw_impact(atom/hit_atom) ..() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() new /obj/effect/decal/cleanable/ash(src.loc) @@ -487,7 +489,7 @@ if(M.m_intent == "run") M << "\red You step on the snap pop!" - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 0, src) s.start() new /obj/effect/decal/cleanable/ash(src.loc) @@ -521,6 +523,15 @@ return ..() +/obj/random/prize + name = "Random Mech Prize" + desc = "This is a random prize" + icon = 'icons/obj/toy.dmi' + icon_state = "ripleytoy" + +/obj/random/prize/item_to_spawn() + return pick(subtypesof(/obj/item/toy/prize)) //exclude the base type. + /obj/item/toy/prize/ripley name = "toy ripley" desc = "Mini-Mecha action figure! Collect them all! 1/11." @@ -1094,6 +1105,167 @@ obj/item/toy/cards/deck/syndicate/black playsound(src.loc, bitesound, 20, 1) return ..() + +/obj/random/carp_plushie + name = "Random Carp Plushie" + desc = "This is a random plushie" + icon = 'icons/obj/toy.dmi' + icon_state = "carpplushie" + +/obj/random/carp_plushie/item_to_spawn() + return pick(typesof(/obj/item/toy/carpplushie)) //can pick any carp plushie, even the original. + +/obj/item/toy/carpplushie/ice + icon_state = "icecarp" + +/obj/item/toy/carpplushie/silent + icon_state = "silentcarp" + +/obj/item/toy/carpplushie/electric + icon_state = "electriccarp" + +/obj/item/toy/carpplushie/gold + icon_state = "goldcarp" + +/obj/item/toy/carpplushie/toxin + icon_state = "toxincarp" + +/obj/item/toy/carpplushie/dragon + icon_state = "dragoncarp" + +/obj/item/toy/carpplushie/pink + icon_state = "pinkcarp" + +/obj/item/toy/carpplushie/candy + icon_state = "candycarp" + +/obj/item/toy/carpplushie/nebula + icon_state = "nebulacarp" + +/obj/item/toy/carpplushie/void + icon_state = "voidcarp" + +/* + * Plushie + */ + + +/obj/item/toy/plushie + name = "plushie" + desc = "An adorable, soft, and cuddly plushie." + icon = 'icons/obj/toy.dmi' + var/poof_sound = 'sound/weapons/thudswoosh.ogg' + attack_verb = list("poofed", "bopped", "whapped","cuddled","fluffed") + +/obj/item/toy/plushie/attack(mob/M as mob, mob/user as mob) + playsound(loc, poof_sound, 20, 1) // Play the whoosh sound in local area + return ..() + +/obj/item/toy/plushie/attack_self(mob/user as mob) + var/cuddle_verb = pick("hugs","cuddles","snugs") + user.visible_message("[user] [cuddle_verb] the [src].") + playsound(get_turf(src), poof_sound, 50, 1, -1) + return ..() + +/obj/random/plushie + name = "Random Plushie" + desc = "This is a random plushie" + icon = 'icons/obj/toy.dmi' + icon_state = "redfox" + +/obj/random/plushie/item_to_spawn() + return pick(subtypesof(/obj/item/toy/plushie)) //exclude the base type. + +/obj/item/toy/plushie/corgi + name = "corgi plushie" + icon_state = "corgi" + +/obj/item/toy/plushie/girly_corgi + name = "corgi plushie" + icon_state = "girlycorgi" + +/obj/item/toy/plushie/robo_corgi + name = "borgi plushie" + icon_state = "robotcorgi" + +/obj/item/toy/plushie/octopus + name = "octopus plushie" + icon_state = "loveable" + +/obj/item/toy/plushie/face_hugger + name = "facehugger plushie" + icon_state = "huggable" + +//foxes are basically the best + +/obj/item/toy/plushie/red_fox + name = "red fox plushie" + icon_state = "redfox" + +/obj/item/toy/plushie/black_fox + name = "black fox plushie" + icon_state = "blackfox" + +/obj/item/toy/plushie/marble_fox + name = "marble fox plushie" + icon_state = "marblefox" + +/obj/item/toy/plushie/blue_fox + name = "blue fox plushie" + icon_state = "bluefox" + +/obj/item/toy/plushie/orange_fox + name = "orange fox plushie" + icon_state = "orangefox" + +/obj/item/toy/plushie/coffee_fox + name = "coffee fox plushie" + icon_state = "coffeefox" + +/obj/item/toy/plushie/pink_fox + name = "pink fox plushie" + icon_state = "pinkfox" + +/obj/item/toy/plushie/purple_fox + name = "purple fox plushie" + icon_state = "purplefox" + +/obj/item/toy/plushie/crimson_fox + name = "crimson fox plushie" + icon_state = "crimsonfox" + +/obj/item/toy/plushie/deer + name = "deer plushie" + icon_state = "deer" + +/obj/item/toy/plushie/black_cat + name = "black cat plushie" + icon_state = "blackcat" + +/obj/item/toy/plushie/grey_cat + name = "grey cat plushie" + icon_state = "greycat" + +/obj/item/toy/plushie/white_cat + name = "white cat plushie" + icon_state = "whitecat" + +/obj/item/toy/plushie/orange_cat + name = "orange cat plushie" + icon_state = "orangecat" + +/obj/item/toy/plushie/siamese_cat + name = "siamese cat plushie" + icon_state = "siamesecat" + +/obj/item/toy/plushie/tabby_cat + name = "tabby cat plushie" + icon_state = "tabbycat" + +/obj/item/toy/plushie/tuxedo_cat + name = "tuxedo cat plushie" + icon_state = "tuxedocat" + /* * Foam Armblade */ @@ -1413,4 +1585,245 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/russian_revolver/proc/spin_cylinder() - bullet_position = rand(1,6) \ No newline at end of file + bullet_position = rand(1,6) + +/* + * Rubber Chainsaw + */ +/obj/item/weapon/twohanded/toy/chainsaw + name = "Toy Chainsaw" + desc = "A toy chainsaw with a rubber edge. Ages 8 and up" + icon_state = "chainsaw0" + force = 0 + throwforce = 0 + throw_speed = 4 + throw_range = 20 + wieldsound = 'sound/weapons/chainsawstart.ogg' + attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") + +/obj/item/weapon/twohanded/toy/chainsaw/update_icon() + if(wielded) + icon_state = "chainsaw[wielded]" + else + icon_state = "chainsaw0" + +/obj/item/weapon/twohanded/toy/chainsaw/attack(mob/target as mob, mob/living/user as mob) + if(wielded) + playsound(loc, 'sound/weapons/chainsaw.ogg', 100, 1, -1) + else + playsound(loc, "swing_hit", 50, 1, -1) + ..() + +/* + * Action Figures + */ + + +/obj/random/figure + name = "Random Action Figure" + desc = "This is a random toy action figure" + icon = 'icons/obj/toy.dmi' + icon_state = "nuketoy" + +/obj/random/figure/item_to_spawn() + return pick(subtypesof(/obj/item/toy/figure)) + + +/obj/item/toy/figure + name = "Non-Specific Action Figure action figure" + desc = "A \"Space Life\" brand... wait, what the hell is this thing?" + icon = 'icons/obj/toy.dmi' + icon_state = "nuketoy" + var/cooldown = 0 + var/toysay = "What the fuck did you do?" + +/obj/item/toy/figure/New() + ..() + desc = "A \"Space Life\" brand [name]" + +/obj/item/toy/figure/attack_self(mob/user as mob) + if(cooldown < world.time) + cooldown = (world.time + 30) //3 second cooldown + user << "The [src] says \"[toysay]\"." + playsound(user, 'sound/machines/click.ogg', 20, 1) + +/obj/item/toy/figure/cmo + name = "Chief Medical Officer action figure" + icon_state = "cmo" + toysay = "Suit sensors!" + +/obj/item/toy/figure/assistant + name = "Assistant action figure" + icon_state = "assistant" + toysay = "Grey tide station wide!" + +/obj/item/toy/figure/atmos + name = "Atmospheric Technician action figure" + icon_state = "atmos" + toysay = "Glory to Atmosia!" + +/obj/item/toy/figure/bartender + name = "Bartender action figure" + icon_state = "bartender" + toysay = "Wheres my monkey?" + +/obj/item/toy/figure/borg + name = "Cyborg action figure" + icon_state = "borg" + toysay = "I. LIVE. AGAIN." + +/obj/item/toy/figure/botanist + name = "Botanist action figure" + icon_state = "botanist" + toysay = "Dude, I see colors..." + +/obj/item/toy/figure/captain + name = "Captain action figure" + icon_state = "captain" + toysay = "Crew, the Nuke Disk is safely up my ass." + +/obj/item/toy/figure/cargotech + name = "Cargo Technician action figure" + icon_state = "cargotech" + toysay = "For Cargonia!" + +/obj/item/toy/figure/ce + name = "Chief Engineer action figure" + icon_state = "ce" + toysay = "Wire the solars!" + +/obj/item/toy/figure/chaplain + name = "Chaplain action figure" + icon_state = "chaplain" + toysay = "Gods make me a killing machine please!" + +/obj/item/toy/figure/chef + name = "Chef action figure" + icon_state = "chef" + toysay = "I swear it's not human meat." + +/obj/item/toy/figure/chemist + name = "Chemist action figure" + icon_state = "chemist" + toysay = "Get your pills!" + +/obj/item/toy/figure/clown + name = "Clown action figure" + icon_state = "clown" + toysay = "Honk!" + +/obj/item/toy/figure/ian + name = "Ian action figure" + icon_state = "ian" + toysay = "Arf!" + +/obj/item/toy/figure/detective + name = "Detective action figure" + icon_state = "detective" + toysay = "This airlock has grey jumpsuit and insulated glove fibers on it." + +/obj/item/toy/figure/dsquad + name = "Death Squad Officer action figure" + icon_state = "dsquad" + toysay = "Eliminate all threats!" + +/obj/item/toy/figure/engineer + name = "Engineer action figure" + icon_state = "engineer" + toysay = "Oh god, the singularity is loose!" + +/obj/item/toy/figure/geneticist + name = "Geneticist action figure" + icon_state = "geneticist" + toysay = "I'm not qualified for this job." + +/obj/item/toy/figure/hop + name = "Head of Persomnel action figure" + icon_state = "hop" + toysay = "Giving out all access!" + +/obj/item/toy/figure/hos + name = "Head of Security action figure" + icon_state = "hos" + toysay = "I'm here to win, anything else is secondary." + +/obj/item/toy/figure/qm + name = "Quartermaster action figure" + icon_state = "qm" + toysay = "Hail Cargonia!" + +/obj/item/toy/figure/janitor + name = "Janitor action figure" + icon_state = "janitor" + toysay = "Look at the signs, you idiot." + +/obj/item/toy/figure/lawyer + name = "Lawyer action figure" + icon_state = "lawyer" + toysay = "My client is a dirty traitor!" + +/obj/item/toy/figure/librarian + name = "Librarian action figure" + icon_state = "librarian" + toysay = "One day while..." + +/obj/item/toy/figure/md + name = "Medical Doctor action figure" + icon_state = "md" + toysay = "The patient is already dead!" + +/obj/item/toy/figure/mime + name = "Mime action figure" + desc = "A \"Space Life\" brand Mime action figure." + icon_state = "mime" + toysay = "..." + +/obj/item/toy/figure/miner + name = "Shaft Miner action figure" + icon_state = "miner" + toysay = "Oh god it's eating my intestines!" + +/obj/item/toy/figure/ninja + name = "Ninja action figure" + icon_state = "ninja" + toysay = "Oh god! Stop shooting, I'm friendly!" + +/obj/item/toy/figure/wizard + name = "Wizard action figure" + icon_state = "wizard" + toysay = "Ei Nath!" + +/obj/item/toy/figure/rd + name = "Research Director action figure" + icon_state = "rd" + toysay = "Blowing all of the borgs!" + +/obj/item/toy/figure/roboticist + name = "Roboticist action figure" + icon_state = "roboticist" + toysay = "He asked to be borged!" + +/obj/item/toy/figure/scientist + name = "Scientist action figure" + icon_state = "scientist" + toysay = "Someone else must have made those bombs!" + +/obj/item/toy/figure/syndie + name = "Nuclear Operative action figure" + icon_state = "syndie" + toysay = "Get that fucking disk!" + +/obj/item/toy/figure/secofficer + name = "Security Officer action figure" + icon_state = "secofficer" + toysay = "I am the law!" + +/obj/item/toy/figure/virologist + name = "Virologist action figure" + icon_state = "virologist" + toysay = "The cure is potassium!" + +/obj/item/toy/figure/warden + name = "Warden action figure" + icon_state = "warden" + toysay = "Execute him for breaking in!" \ No newline at end of file diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index f4bff0bb7a6..81564890492 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -20,7 +20,7 @@ RCD w_class = 3.0 materials = list(MAT_METAL=100000) origin_tech = "engineering=4;materials=2" - var/datum/effect/effect/system/spark_spread/spark_system + var/datum/effect/system/spark_spread/spark_system var/max_matter = 100 var/matter = 0 var/working = 0 @@ -29,7 +29,7 @@ RCD New() desc = "A RCD. It currently holds [matter]/[max_matter] matter-units." - src.spark_system = new /datum/effect/effect/system/spark_spread + src.spark_system = new /datum/effect/system/spark_spread spark_system.set_up(5, 0, src) spark_system.attach(src) rcd_list += src diff --git a/code/game/objects/items/weapons/alien_specific.dm b/code/game/objects/items/weapons/alien_specific.dm index d0796bdf4c1..f5cb6170fe3 100644 --- a/code/game/objects/items/weapons/alien_specific.dm +++ b/code/game/objects/items/weapons/alien_specific.dm @@ -41,7 +41,7 @@ user << "\The [src] is full." return reagents.remove_reagent(25,"water") - var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() + var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() smoke.set_up(5, 0, user.loc) smoke.start() playsound(user.loc, 'sound/effects/bamf.ogg', 50, 2) diff --git a/code/game/objects/items/weapons/cash.dm b/code/game/objects/items/weapons/cash.dm index be8cc69f39f..8cdc276ef6a 100644 --- a/code/game/objects/items/weapons/cash.dm +++ b/code/game/objects/items/weapons/cash.dm @@ -1,7 +1,10 @@ var/global/list/moneytypes=list( /obj/item/weapon/spacecash/c1000 = 1000, - /obj/item/weapon/spacecash/c500 = 500, // Might get rid of this. + /obj/item/weapon/spacecash/c500 = 500, + /obj/item/weapon/spacecash/c200 = 200, /obj/item/weapon/spacecash/c100 = 100, + /obj/item/weapon/spacecash/c50 = 50, + /obj/item/weapon/spacecash/c20 = 20, /obj/item/weapon/spacecash/c10 = 10, /obj/item/weapon/spacecash = 1, ) @@ -42,19 +45,36 @@ var/global/list/moneytypes=list( /obj/item/weapon/spacecash/update_icon() icon_state = "cash[worth]" // Up to 100 items per stack. - overlays = 0 - var/stacksize=round(amount/25) pixel_x=rand(-7,7) pixel_y=rand(-14,14) - if(stacksize) - // 0 = single - // 1 = 1/4 stack - // 2 = 1/2 stack - // 3 = 3/4 stack - // 4 = full stack - var/image/stack = image(icon,icon_state="cashstack[stacksize]") - stack.color=stack_color - overlays += stack + +/obj/item/weapon/spacecash/proc/collect_from(var/obj/item/weapon/spacecash/cash) + if(cash.worth == src.worth) + var/taking = min(100-src.amount,cash.amount) + cash.amount -= taking + src.amount += taking + if(cash.amount <= 0) + qdel(cash) + return taking + return 0 + +/obj/item/weapon/spacecash/afterattack(atom/A as mob|obj, mob/user as mob) + if(istype(A, /turf) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack)) + var/turf/T = get_turf(A) + var/collected = 0 + for(var/obj/item/weapon/spacecash/cash in T) + if(cash.worth == src.worth) + collected += collect_from(cash) + if(collected) + update_icon() + user << "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash." + else if(istype(A,/obj/item/weapon/spacecash)) + var/obj/item/weapon/spacecash/cash = A + var/collected = src.collect_from(cash) + if(collected) + update_icon() + user << "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash." + /obj/item/weapon/spacecash/proc/get_total() return worth * amount @@ -62,37 +82,30 @@ var/global/list/moneytypes=list( /obj/item/weapon/spacecash/c10 icon_state = "cash10" worth = 10 - stack_color = "#663200" /obj/item/weapon/spacecash/c20 icon_state = "cash10" worth = 20 - stack_color = "#663200" /obj/item/weapon/spacecash/c50 icon_state = "cash10" worth = 50 - stack_color = "#663200" /obj/item/weapon/spacecash/c100 icon_state = "cash100" worth = 100 - stack_color = "#663200" /obj/item/weapon/spacecash/c200 icon_state = "cash200" worth = 200 - stack_color = "#663200" /obj/item/weapon/spacecash/c500 icon_state = "cash500" worth = 500 - stack_color = "#663200" /obj/item/weapon/spacecash/c1000 icon_state = "cash1000" worth = 1000 - stack_color = "#333333" /proc/dispense_cash(var/amount, var/loc) for(var/cashtype in moneytypes) diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 7612a3093dc..29442b10525 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -96,7 +96,7 @@ LIGHTERS ARE IN LIGHTERS.DM src.lit = 1 damtype = "fire" if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire - var/datum/effect/effect/system/reagents_explosion/e = new() + var/datum/effect/system/reagents_explosion/e = new() e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0) e.start() if(ismob(loc)) @@ -105,7 +105,7 @@ LIGHTERS ARE IN LIGHTERS.DM qdel(src) return if(reagents.get_reagent_amount("fuel")) // the fuel explodes, too, but much less violently - var/datum/effect/effect/system/reagents_explosion/e = new() + var/datum/effect/system/reagents_explosion/e = new() e.set_up(round(reagents.get_reagent_amount("fuel") / 5, 1), get_turf(src), 0, 0) e.start() if(ismob(loc)) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 0a91cc28708..eae015b09e7 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -85,6 +85,7 @@ M.dna.SetSEValue(block,src.GetValue()) domutcheck(M, null, block!=null) uses-- + M.update_mutations() spawn(0)//this prevents the collapse of space-time continuum if (user) @@ -93,6 +94,9 @@ return uses /obj/item/weapon/dnainjector/attack(mob/M as mob, mob/user as mob) + if(!M.dna) //You know what would be nice? If the mob you're injecting has DNA, and so doesn't cause runtimes. + return 0 + if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure. var/mob/living/carbon/human/H = M if(H.species.flags & NO_DNA_RAD) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 2d70a119b0d..dd182d394aa 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -62,7 +62,9 @@ ..() /obj/item/weapon/c4/attack_self(mob/user as mob) - var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num + var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num|null + if(newtime == null) + return if(newtime < 10) newtime = 10 if(newtime > 60000) diff --git a/code/game/objects/items/weapons/fireworks.dm b/code/game/objects/items/weapons/fireworks.dm index dbd765b0fdd..132dd4306f3 100644 --- a/code/game/objects/items/weapons/fireworks.dm +++ b/code/game/objects/items/weapons/fireworks.dm @@ -3,7 +3,7 @@ obj/item/weapon/firework icon = 'icons/obj/fireworks.dmi' icon_state = "rocket_0" var/litzor = 0 - var/datum/effects/system/sparkel_spread/S + var/datum/effect/system/sparkle_spread/S obj/item/weapon/firework/attackby(obj/item/weapon/W,mob/user, params) if(litzor) return @@ -25,7 +25,7 @@ obj/item/weapon/sparkler icon = 'icons/obj/fireworks.dmi' icon_state = "sparkler_0" var/litzor = 0 - var/datum/effect/effect/system/spark_spread/S + var/datum/effect/system/spark_spread/S obj/item/weapon/sparkler/attackby(obj/item/weapon/W,mob/user, params) if(litzor) return diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 348b4311677..26dd1849a8a 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -279,7 +279,7 @@ end_temp += G.reagents.chem_temp reagents.chem_temp = end_temp if(reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() + var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() steam.set_up(10, 0, get_turf(src)) steam.attach(src) steam.start() @@ -359,7 +359,7 @@ G.reagents.trans_to(src, G.reagents.total_volume) if(reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() + var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() steam.set_up(10, 0, get_turf(src)) steam.attach(src) steam.start() diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index d8ef1d9591b..b5838839cba 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -6,11 +6,11 @@ det_time = 20 item_state = "flashbang" slot_flags = SLOT_BELT - var/datum/effect/effect/system/bad_smoke_spread/smoke + var/datum/effect/system/bad_smoke_spread/smoke New() ..() - src.smoke = new /datum/effect/effect/system/bad_smoke_spread + src.smoke = new /datum/effect/system/bad_smoke_spread src.smoke.attach(src) Destroy() diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm deleted file mode 100644 index f1b04b9ed98..00000000000 --- a/code/game/objects/items/weapons/hydroponics.dm +++ /dev/null @@ -1,240 +0,0 @@ -/* Hydroponic stuff - * Contains: - * Sunflowers - * Nettle - * Deathnettle - * Corbcob - */ - - - -/* - * SeedBag - */ -//uncomment when this is updated to match storage update -/* -/obj/item/weapon/seedbag - icon = 'icons/obj/hydroponics.dmi' - icon_state = "seedbag" - name = "Seed Bag" - desc = "A small satchel made for organizing seeds." - var/mode = 1; //0 = pick one at a time, 1 = pick all on tile - var/capacity = 500; //the number of seeds it can carry. - slot_flags = SLOT_BELT - w_class = 1 - var/list/item_quants = list() - -/obj/item/weapon/seedbag/attack_self(mob/user as mob) - user.machine = src - interact(user) - -/obj/item/weapon/seedbag/verb/toggle_mode() - set name = "Switch Bagging Method" - set category = "Object" - - mode = !mode - switch (mode) - if(1) - usr << "The bag now picks up all seeds in a tile at once." - if(0) - usr << "The bag now picks up one seed pouch at a time." - -/obj/item/seeds/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - ..() - if (istype(O, /obj/item/weapon/seedbag)) - var/obj/item/weapon/seedbag/S = O - if (S.mode == 1) - for (var/obj/item/seeds/G in locate(src.x,src.y,src.z)) - if (S.contents.len < S.capacity) - S.contents += G; - if(S.item_quants[G.name]) - S.item_quants[G.name]++ - else - S.item_quants[G.name] = 1 - else - user << "\blue The seed bag is full." - S.updateUsrDialog() - return - user << "\blue You pick up all the seeds." - else - if (S.contents.len < S.capacity) - S.contents += src; - if(S.item_quants[name]) - S.item_quants[name]++ - else - S.item_quants[name] = 1 - else - user << "\blue The seed bag is full." - S.updateUsrDialog() - return - -/obj/item/weapon/seedbag/interact(mob/user as mob) - - var/dat = "Select an item:
" - - if (contents.len == 0) - dat += "No seeds loaded!" - else - for (var/O in item_quants) - if(item_quants[O] > 0) - var/N = item_quants[O] - dat += "[capitalize(O)]:" - dat += " [N] " - dat += "Vend" - dat += "
" - - dat += "
Unload All" - dat += "
" - user << browse("Seedbag Supplies[dat]", "window=seedbag") - onclose(user, "seedbag") - return - -/obj/item/weapon/seedbag/Topic(href, href_list) - if(..()) - return - - usr.machine = src - if ( href_list["vend"] ) - var/N = href_list["vend"] - - if(item_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. - return - - item_quants[N] -= 1 - for(var/obj/O in contents) - if(O.name == N) - O.loc = get_turf(src) - usr.put_in_hands(O) - break - - else if ( href_list["unload"] ) - item_quants.Cut() - for(var/obj/O in contents ) - O.loc = get_turf(src) - - src.updateUsrDialog() - return - -/obj/item/weapon/seedbag/updateUsrDialog() - var/list/nearby = range(1, src) - for(var/mob/M in nearby) - if ((M.client && M.machine == src)) - src.attack_self(M) -*/ -/* - * Sunflower - */ - -/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob) - M << " [user] smacks you with a sunflower!FLOWER POWER" - user << " Your sunflower's FLOWER POWER strikes [M]" - -/* - * Sun/Novaflower - */ -/obj/item/weapon/grown/novaflower/attack(mob/M as mob, mob/user as mob) - M << " [user] smacks you with a novaflower!FLOWER POWER" - user << " Your novaflower's FLOWER POWER strikes [M]" - -/obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M as mob, mob/user as mob) - if(!..()) return - if(istype(M, /mob/living)) - M << "\red You are heated by the warmth of the of the [name]!" - M.bodytemperature += potency/2 * TEMPERATURE_DAMAGE_COEFFICIENT - -/obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob) - if(!user.gloves) - user << "\red The [name] burns your bare hand!" - user.adjustFireLoss(rand(1,5)) -/* -/* - * Nettle - */ -/obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob) - if(!user.gloves) - user << "\red The nettle burns your bare hand!" - if(istype(user, /mob/living/carbon/human)) - var/organ = ((user.hand ? "l_":"r_") + "arm") - var/obj/item/organ/external/affecting = user.get_organ(organ) - if(affecting.take_damage(0,force)) - user.UpdateDamageIcon() - else - user.take_organ_damage(0,force) - -/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user as mob, proximity) - if(!proximity) return - if(force > 0) - force -= rand(1,(force/3)+1) // When you whack someone with it, leaves fall off - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - else - usr << "All the leaves have fallen off the nettle from violent whacking." - qdel(src) - -/obj/item/weapon/grown/nettle/changePotency(newValue) //-QualityVan - potency = newValue - force = round((5+potency/5), 1) - -/* - * Deathnettle - */ - -/obj/item/weapon/grown/deathnettle/pickup(mob/living/carbon/human/user as mob) - if(!user.gloves) - if(istype(user, /mob/living/carbon/human)) - var/organ = ((user.hand ? "l_":"r_") + "arm") - var/obj/item/organ/external/affecting = user.get_organ(organ) - if(affecting.take_damage(0,force)) - user.UpdateDamageIcon() - else - user.take_organ_damage(0,force) - if(prob(50)) - user.Paralyse(5) - user << "\red You are stunned by the Deathnettle when you try picking it up!" - -/obj/item/weapon/grown/deathnettle/attack(mob/living/carbon/M as mob, mob/user as mob) - if(!..()) return - if(istype(M, /mob/living)) - M << "\red You are stunned by the powerful acid of the Deathnettle!" - - M.attack_log += text("\[[time_stamp()]\] Had the [src.name] used on them by [key_name(user)]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] on [key_name(M)]") - msg_admin_attack("[key_name_admin(user)] used the [src.name] on [key_name_admin(M)]") - - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - - M.eye_blurry += force/7 - if(prob(20)) - M.Paralyse(force/6) - M.Weaken(force/15) - M.drop_item() - -/obj/item/weapon/grown/deathnettle/afterattack(atom/A as mob|obj, mob/user as mob, proximity) - if(!proximity) return - if (force > 0) - force -= rand(1,(force/3)+1) // When you whack someone with it, leaves fall off - - else - usr << "All the leaves have fallen off the deathnettle from violent whacking." - qdel(src) - -/obj/item/weapon/grown/deathnettle/changePotency(newValue) //-QualityVan - potency = newValue - force = round((5+potency/2.5), 1) - - -/* - * Corncob - */ -/obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - ..() - if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/kitchenknife/ritual)) - user << "You use [W] to fashion a pipe out of the corn cob!" - new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc) - qdel(src) - return -*/ \ No newline at end of file diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 59347a12251..c442b998991 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -13,7 +13,7 @@ user.visible_message(pick("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.", \ "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.")) return (BRUTELOSS|FIRELOSS) - + /obj/item/weapon/melee/energy/attack_self(mob/living/carbon/user) if(user.disabilities & CLUMSY && prob(50)) user << "You accidentally cut yourself with [src], like a doofus!" @@ -84,7 +84,7 @@ edge = 1 var/hacked = 0 var/blade_color - + /obj/item/weapon/melee/energy/sword/New() if(item_color == null) item_color = pick("red", "blue", "green", "purple") @@ -106,7 +106,7 @@ return ..() return - + /obj/item/weapon/melee/energy/sword/cyborg/saw //Used by medical Syndicate cyborgs name = "energy saw" desc = "For heavy duty cutting. It has a carbon-fiber blade in addition to a toggleable hard-light edge to dramatically increase sharpness." @@ -129,7 +129,7 @@ /obj/item/weapon/melee/energy/sword/cyborg/saw/IsShield() return 0 - + /obj/item/weapon/melee/energy/sword/saber /obj/item/weapon/melee/energy/sword/saber/blue @@ -185,7 +185,7 @@ desc = "Arrrr matey." icon_state = "cutlass0" icon_state_on = "cutlass1" - + /obj/item/weapon/melee/energy/sword/pirate/New() return @@ -202,11 +202,11 @@ w_class = 4//So you can't hide it in your pocket or some such. flags = NOSHIELD attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - var/datum/effect/effect/system/spark_spread/spark_system + var/datum/effect/system/spark_spread/spark_system //Most of the other special functions are handled in their own files. aka special snowflake code so kewl /obj/item/weapon/melee/energy/blade/New() - spark_system = new /datum/effect/effect/system/spark_spread() + spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) @@ -214,4 +214,4 @@ qdel(src) /obj/item/weapon/melee/energy/blade/attack_self(mob/user) - return \ No newline at end of file + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 0ba86215713..ba66e57f19e 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -54,7 +54,7 @@ if(!((user == loc || (in_range(src, user) && istype(src.loc, /turf))))) return - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() smoke.set_up(5, 0, user.loc) smoke.attach(user) smoke.start() diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index df8c9fc329c..70513198e39 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -53,6 +53,8 @@ /obj/item/weapon/shard/Crossed(AM as mob|obj) if(isliving(AM)) var/mob/living/M = AM + if (M.incorporeal_move || M.flying)//you are incorporal or flying..no shard stepping! + return M << "\red You step on \the [src]!" playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 4ebf6b257e8..02f3289dad8 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -15,6 +15,36 @@ desc = "A Nanotrasen brand bar of soap. Smells of plasma." icon_state = "soapnt" +/obj/item/weapon/soap/homemade + desc = "A homemade bar of soap. Smells of... well...." + icon_state = "soapgibs" + cleanspeed = 45 // a little faster to reward chemists for going to the effort + +/obj/item/weapon/soap/ducttape + desc = "A homemade bar of soap. It seems to be gibs and tape..Will this clean anything?" + icon_state = "soapgibs" + +/obj/item/weapon/soap/ducttape/afterattack(atom/target, mob/user as mob, proximity) + if(!proximity) return + + if(user.client && (target in user.client.screen)) + user << "You need to take that [target.name] off before 'cleaning' it." + else + user.visible_message("[user] begins to smear [src] on \the [target.name].") + if(do_after(user, src.cleanspeed, target = target)) + user << "You 'clean' \the [target.name]." + if(istype(target, /turf/simulated)) + new /obj/effect/decal/cleanable/blood/gibs/cleangibs(target) + else if (istype(target,/mob/living/carbon)) + for(var/obj/item/carried_item in target.contents) + if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant. + carried_item.add_blood(target)//Oh yes, there will be blood... + var/mob/living/carbon/human/H = target + H.bloody_hands(target,0) + H.bloody_body(target) + + return + /obj/item/weapon/soap/deluxe desc = "A deluxe Waffle Co. brand bar of soap. Smells of comdoms." icon_state = "soapdeluxe" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index bd4dd452887..6af8207c163 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -163,25 +163,46 @@ max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class max_w_class = 3 w_class = 1 - can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown", "/obj/item/stack/tile/grass") + can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown", "/obj/item/stack/tile/grass","/obj/item/stack/medical/ointment/aloe","/obj/item/stack/medical/bruise_pack/comfrey") + -/* /obj/item/weapon/storage/bag/plants/portaseeder - name = "Portable Seed Extractor" + name = "portable seed extractor" desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant." icon_state = "portaseeder" - origin_tech = "materials=2;biotech=2" - verb/dissolve_contents() - set name = "Activate Seed Extraction" - set category = "Object" - set desc = "Activate to convert your plants into plantable seeds." - for(var/obj/item/O in contents) - seedify(O, 1) - for(var/mob/M in range(1)) - if (M.s_active == src) - src.close(M) -*/ +/obj/item/weapon/storage/bag/plants/portaseeder/verb/dissolve_contents() + set name = "Activate Seed Extraction" + set category = "Object" + set desc = "Activate to convert your plants into plantable seeds." + if(usr.stat || !usr.canmove || usr.restrained()) + return + for(var/obj/item/O in contents) + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) || istype(O, /obj/item/weapon/grown)) + + var/datum/seed/new_seed_type + if(istype(O, /obj/item/weapon/grown)) + var/obj/item/weapon/grown/F = O + new_seed_type = plant_controller.seeds[F.plantname] + else + var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O + new_seed_type = plant_controller.seeds[F.plantname] + + if(new_seed_type) + var/obj/item/seeds/seeds = new(O.loc, O) + seeds.seed_type = new_seed_type.name + seeds.update_seed() + qdel(O) + + if(istype(O, /obj/item/stack/tile/grass)) + var/obj/item/stack/tile/grass/S = O + S.use(1) + new /obj/item/seeds/grassseed(O.loc, O) + + for(var/mob/M in range(1)) + if (M.s_active == src) + src.close(M) + // ----------------------------- // Sheet Snatcher @@ -450,3 +471,32 @@ user.visible_message("\blue [user] drops all the items on their tray.") return ..() + + +/* + * Chemistry bag + */ + +/obj/item/weapon/storage/bag/chemistry + name = "chemistry bag" + icon = 'icons/obj/chemical.dmi' + icon_state = "bag" + desc = "A bag for storing pills, patches, and bottles." + storage_slots = 50 + max_combined_w_class = 200 + w_class = 1 + can_hold = list("/obj/item/weapon/reagent_containers/pill","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle") + +/* + * Biowaste bag (mostly for xenobiologists) + */ + +/obj/item/weapon/storage/bag/bio + name = "bio bag" + icon = 'icons/obj/chemical.dmi' + icon_state = "biobag" + desc = "A bag for the safe transportation and disposal of biowaste and other biological materials." + storage_slots = 25 + max_combined_w_class = 200 + w_class = 1 + can_hold = list("/obj/item/slime_extract","/obj/item/weapon/reagent_containers/food/snacks/monkeycube","/obj/item/weapon/reagent_containers/syringe","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle","/obj/item/weapon/reagent_containers/blood","/obj/item/weapon/reagent_containers/hypospray/autoinjector") \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 011d337cea0..c4da0fe3a19 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -154,6 +154,7 @@ icon_state = "duffel-med" desc = "A kit for surgery in the field." max_w_class = 4 + max_combined_w_class = 21 storage_slots = 10 can_hold = list("/obj/item/roller","/obj/item/weapon/bonesetter","/obj/item/weapon/bonegel", "/obj/item/weapon/scalpel", "/obj/item/weapon/hemostat", "/obj/item/weapon/cautery", "/obj/item/weapon/retractor", "/obj/item/weapon/FixOVein", "/obj/item/weapon/surgicaldrill", "/obj/item/weapon/circular_saw") diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 1b3f96e3058..42641e5cb00 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -73,7 +73,7 @@ overlays += image('icons/obj/storage.dmi', icon_locking) locked = 0 if(istype(weapon, /obj/item/weapon/melee/energy/blade)) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index 0d26649dbaa..6498aaa227a 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -89,7 +89,8 @@ */ /obj/item/weapon/table_parts/wood/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/wrench)) - new /obj/item/stack/sheet/wood( user.loc ) + new /obj/item/stack/sheet/wood(get_turf(src)) + new /obj/item/stack/sheet/wood(get_turf(src)) qdel(src) /obj/item/weapon/table_parts/wood/attack_self(mob/user as mob) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 08618fe8a08..edbe4be2cd1 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -7,7 +7,7 @@ w_class = 4.0 item_state = "jetpack" distribute_pressure = ONE_ATMOSPHERE*O2STANDARD - var/datum/effect/effect/system/ion_trail_follow/ion_trail + var/datum/effect/system/ion_trail_follow/ion_trail var/on = 0.0 var/stabilization_on = 0 var/volume_rate = 500 //Needed for borg jetpack transfer @@ -15,7 +15,7 @@ /obj/item/weapon/tank/jetpack/New() ..() - src.ion_trail = new /datum/effect/effect/system/ion_trail_follow() + src.ion_trail = new /datum/effect/system/ion_trail_follow() src.ion_trail.set_up(src) return @@ -124,7 +124,7 @@ /obj/item/weapon/tank/jetpack/carbondioxide/New() ..() - src.ion_trail = new /datum/effect/effect/system/ion_trail_follow() + src.ion_trail = new /datum/effect/system/ion_trail_follow() src.ion_trail.set_up(src) air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) @@ -164,4 +164,4 @@ var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.toxins if(allgases >= 0.005) . = 1 - qdel(G) + qdel(G) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index db59ffc3492..cee2996904f 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -118,13 +118,16 @@ data["valveOpen"] = using_internal ? 1 : 0 data["maskConnected"] = 0 - if(istype(loc,/mob/living/carbon)) - var/mob/living/carbon/location = loc - if(location.internal == src) - if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) + + if(iscarbon(loc)) + var/mob/living/carbon/C = loc + if(C.internal == src) + data["maskConnected"] = 1 + else + if(C.wear_mask && (C.wear_mask.flags & AIRTIGHT)) data["maskConnected"] = 1 - else if(ishuman(location)) - var/mob/living/carbon/human/H = location + else if(ishuman(C)) + var/mob/living/carbon/human/H = C if(H.head && (H.head.flags & AIRTIGHT)) data["maskConnected"] = 1 diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 7ba38405929..2b6d39250c7 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -338,7 +338,7 @@ delete() amount = amt if(amount) - var/datum/effect/effect/system/freezing_smoke_spread/F = new /datum/effect/effect/system/freezing_smoke_spread + var/datum/effect/system/freezing_smoke_spread/F = new /datum/effect/system/freezing_smoke_spread F.set_up(amount, 0, src.loc) F.start() if(blast) @@ -367,16 +367,16 @@ L.ExtinguishMob() return -/datum/effect/effect/system/freezing_smoke_spread +/datum/effect/system/freezing_smoke_spread -/datum/effect/effect/system/freezing_smoke_spread/set_up(n = 6, c = 0, loca) +/datum/effect/system/freezing_smoke_spread/set_up(n = 6, c = 0, loca) number = n if(istype(loca, /turf/)) location = loca else location = get_turf(loca) -/datum/effect/effect/system/freezing_smoke_spread/start() +/datum/effect/system/freezing_smoke_spread/start() var/i = 0 for(i=0, i= 3) user.show_message("\The [src] is recharging!") diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 49c1b25f2a1..d8256e6e983 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -471,7 +471,7 @@ origin_tech = "combat=5;powerstorage=5" /obj/item/weapon/twohanded/mjollnir/proc/shock(mob/living/target as mob) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread() s.set_up(5, 1, target.loc) s.start() target.take_organ_damage(0,30) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index a596db41b82..1c8498c6cee 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -208,7 +208,11 @@ E.teleporting = 0 return E.teleporting = 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + if(user in contents) + user << "Error: User located in container--aborting for safety." + playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) + return + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() do_teleport(src, E.pad, 0) @@ -226,7 +230,11 @@ E.teleporting = 0 return E.teleporting = 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + if(user in contents) + user << "Error: User located in container--aborting for safety." + playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) + return + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() do_teleport(src, L) diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm index 97062911dd8..5100e2170f0 100644 --- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm @@ -8,6 +8,7 @@ /obj/structure/closet/l3closet/New() ..() sleep(2) + new /obj/item/weapon/storage/bag/bio( src ) new /obj/item/clothing/suit/bio_suit/general( src ) new /obj/item/clothing/head/bio_hood/general( src ) @@ -34,6 +35,7 @@ ..() sleep(2) contents = list() + new /obj/item/weapon/storage/bag/bio( src ) new /obj/item/clothing/suit/bio_suit/virology( src ) new /obj/item/clothing/head/bio_hood/virology( src ) new /obj/item/clothing/mask/breath(src) @@ -75,5 +77,6 @@ ..() sleep(2) contents = list() + new /obj/item/weapon/storage/bag/bio( src ) new /obj/item/clothing/suit/bio_suit/scientist( src ) new /obj/item/clothing/head/bio_hood/scientist( src ) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index 8ac793d8de3..fa15c6926e2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -17,7 +17,7 @@ new /obj/item/clothing/suit/apron(src) if(2) new /obj/item/clothing/suit/apron/overalls(src) - new /obj/item/weapon/storage/bag/plants(src) + new /obj/item/weapon/storage/bag/plants/portaseeder(src) new /obj/item/clothing/under/rank/hydroponics(src) new /obj/item/device/analyzer/plant_analyzer(src) new /obj/item/device/radio/headset/headset_service(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 08130cac90a..b5680be43bc 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -373,6 +373,10 @@ new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/suit/storage/labcoat/chemist(src) new /obj/item/clothing/suit/storage/labcoat/chemist(src) + new /obj/item/weapon/storage/backpack/satchel_chem(src) + new /obj/item/weapon/storage/backpack/satchel_chem(src) + new /obj/item/weapon/storage/bag/chemistry(src) + new /obj/item/weapon/storage/bag/chemistry(src) return diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 0b425698ec0..fad18f5e176 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -40,7 +40,7 @@ if(isliving(usr)) var/mob/living/L = usr if(L.electrocute_act(17, src)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() return 2 @@ -109,7 +109,7 @@ E.teleporting = 0 return E.teleporting = 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() do_teleport(src, E.pad, 0) @@ -127,7 +127,7 @@ E.teleporting = 0 return E.teleporting = 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() do_teleport(src, L) @@ -206,7 +206,7 @@ if(isliving(user)) var/mob/living/L = user if(L.electrocute_act(17, src)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() return @@ -561,11 +561,19 @@ New() ..() - new /obj/item/weapon/reagent_containers/spray/plantbgone(src) - new /obj/item/weapon/reagent_containers/spray/plantbgone(src) - new /obj/item/weapon/minihoe(src) -// new /obj/item/weapon/weedspray(src) -// new /obj/item/weapon/weedspray(src) -// new /obj/item/weapon/pestspray(src) -// new /obj/item/weapon/pestspray(src) -// new /obj/item/weapon/pestspray(src) + new /obj/item/weapon/reagent_containers/glass/bucket(src) + new /obj/item/weapon/reagent_containers/glass/bucket(src) + new /obj/item/weapon/screwdriver(src) + new /obj/item/weapon/screwdriver(src) + new /obj/item/weapon/wrench(src) + new /obj/item/weapon/wrench(src) + new /obj/item/weapon/wirecutters(src) + new /obj/item/weapon/wirecutters(src) + new /obj/item/weapon/shovel/spade(src) + new /obj/item/weapon/shovel/spade(src) + new /obj/item/weapon/storage/box/botanydisk(src) + new /obj/item/weapon/storage/box/botanydisk(src) + new /obj/item/weapon/storage/box/beakers(src) + new /obj/item/weapon/storage/box/beakers(src) + new /obj/item/weapon/hand_labeler(src) + new /obj/item/weapon/hand_labeler(src) diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm index 19c3c2614ed..e0c07307373 100644 --- a/code/game/objects/structures/crates_lockers/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/crittercrate.dm @@ -57,6 +57,10 @@ name = "goat crate" content_mob = /mob/living/simple_animal/hostile/retaliate/goat +/obj/structure/closet/critter/turkey + name = "turkey crate" + content_mob = /mob/living/simple_animal/turkey + /obj/structure/closet/critter/chick name = "chicken crate" content_mob = /mob/living/simple_animal/chick diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index 03d0df1c669..0486ad2358a 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -72,7 +72,7 @@ A.updateicon() flick("echair_shock", src) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(12, 1, src) s.start() visible_message("The electric chair went off!", "You hear a deep sharp shock!") diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 21208b26ca6..d24a92d87b6 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -120,7 +120,7 @@ else user << "You can't reach, close it first!" - if(istype(W, /obj/item/weapon/gun/energy/plasmacutter) || istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill) || istype(W, /obj/item/weapon/melee/energy/blade)) + if(istype(W, /obj/item/weapon/gun/energy/plasmacutter) || istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill) || istype(W, /obj/item/weapon/pickaxe/drill/jackhammer) || istype(W, /obj/item/weapon/melee/energy/blade)) dismantle(user) /obj/structure/falsewall/proc/dismantle(mob/user) @@ -221,7 +221,7 @@ icon_state = "" mineral = "plasma" walltype = "plasma" - + /obj/structure/falsewall/plasma/attackby(obj/item/weapon/W, mob/user, params) if(is_hot(W) > 300) message_admins("Plasma falsewall ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 4922ca9c788..1dc18de23ba 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -229,4 +229,30 @@ /obj/structure/flora/rock/pile/New() ..() - icon_state = "rockpile[rand(1,5)]" \ No newline at end of file + icon_state = "rockpile[rand(1,5)]" + +/obj/structure/flora/corn_stalk + name = "corn stalk" + icon = 'icons/obj/flora/plants.dmi' + icon_state = "cornstalk1" + anchored = 0 + layer = 5 + +/obj/structure/flora/corn_stalk/alt_1 + icon_state = "cornstalk2" + +/obj/structure/flora/corn_stalk/alt_2 + icon_state = "cornstalk3" + +/obj/structure/flora/straw_bail + name = "straw bail" + icon = 'icons/obj/flora/plants.dmi' + icon_state = "strawbail1" + density = 1 + climbable = 1 // you can climb all over them. + +/obj/structure/flora/straw_bail/alt_1 + icon_state = "strawbail2" + +/obj/structure/flora/straw_bail/alt_2 + icon_state = "strawbail3" \ No newline at end of file diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 19c2dd13ec8..f227df88ed6 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -37,6 +37,12 @@ new /obj/item/stack/sheet/metal(get_turf(src)) qdel(src) + else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) + playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 100, 1) + user << "You Disintegrate the girder!" + new /obj/item/stack/sheet/metal(get_turf(src)) + qdel(src) + else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) user << "\blue Now unsecuring support struts" diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index e6a28d33a1c..23072239bcd 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -239,7 +239,7 @@ var/obj/structure/cable/C = T.get_cable_node() if(C) if(electrocute_mob(user, C, src)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() return 1 diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 2f0d1567624..53abfd17216 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -83,7 +83,9 @@ /obj/structure/stool/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - new /obj/item/stack/sheet/wood(src.loc) + new /obj/item/stack/sheet/wood(get_turf(src)) + new /obj/item/stack/sheet/wood(get_turf(src)) + new /obj/item/stack/sheet/wood(get_turf(src)) qdel(src) else ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 493fca35423..3cbad10c5c9 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -428,7 +428,7 @@ return if(istype(W, /obj/item/weapon/melee/energy/blade)) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) @@ -599,7 +599,7 @@ if(isrobot(user)) return if(istype(I, /obj/item/weapon/melee/energy/blade)) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) @@ -659,7 +659,7 @@ if(isrobot(user)) return if(istype(W, /obj/item/weapon/melee/energy/blade)) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) @@ -766,7 +766,7 @@ if(isrobot(user)) return if(istype(I, /obj/item/weapon/melee/energy/blade)) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 9b2e9b7064d..c24482a0da4 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -578,16 +578,14 @@ var/list/wood_icons = list("wood","wood-broken") user << "You need more welding fuel to complete this task." if(istype(C,/obj/item/pipe)) - var/obj/item/pipe/V = C - if(V.pipe_type != -1) // ANY PIPE - var/obj/item/pipe/P = C - + var/obj/item/pipe/P = C + if(P.pipe_type != -1) // ANY PIPE user.visible_message( \ "[user] starts sliding [P] along \the [src].", \ "You slide [P] along \the [src].", \ "You hear the scrape of metal against something.") user.drop_item() - if (P.pipe_type in list (1,3,12)) // bent pipe rotation fix see construction.dm + if (P.is_bent_pipe()) // bent pipe rotation fix see construction.dm P.dir = 5 if (user.dir == 1) P.dir = 6 @@ -595,8 +593,6 @@ var/list/wood_icons = list("wood","wood-broken") P.dir = 9 if (user.dir == 4) P.dir = 10 - if (user.dir == 5) - P.dir = 8 else P.dir = user.dir P.x = src.x diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 1de9e588ef1..46cad11d9c5 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -385,6 +385,15 @@ dismantle_wall() visible_message("[user] drills through \the [src]!","You hear the grinding of metal.") + else if (istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) + + user << "You begin to disintegrates the wall." + + if(do_after(user, mineral == "diamond" ? 60 : 30, target = src)) + user << "Your jackhammer disintegrate the reinforced plating." + dismantle_wall() + visible_message("[user] disintegrates \the [src]!","You hear the grinding of metal.") + else if(istype(W, /obj/item/weapon/melee/energy/blade)) var/obj/item/weapon/melee/energy/blade/EB = W diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index 1c2605238e0..54b0bad4c45 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -119,7 +119,7 @@ /* /turf/simulated/wall/mineral/proc/shock() if (electrocute_mob(user, C, src)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() return 1 diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 1bba122d39e..4c7f1baf020 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -202,7 +202,14 @@ user << "You begin to drill though the wall." if(do_after(user, 200, target = src)) - user << "Your drill tears though the last of the reinforced plating." + user << "Your drill tears through the last of the reinforced plating." + dismantle_wall() + + if(istype(W,/obj/item/weapon/pickaxe/drill/jackhammer)) + user << "You begin to disintegrate the wall." + + if(do_after(user, 100, target = src)) + user << "Your sonic jackhammer disintegrates the reinforced plating." dismantle_wall() //REPAIRING diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index effd1bd64b9..af322b3f60f 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -28,7 +28,7 @@ var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature var/datum/global_iterator/pr_give_air //moves air from tank to cabin - var/datum/effect/effect/system/ion_trail_follow/space_trail/ion_trail + var/datum/effect/system/ion_trail_follow/space_trail/ion_trail var/hatch_open = 0 @@ -61,7 +61,7 @@ battery = new battery_type(src) add_cabin() add_airtank() - src.ion_trail = new /datum/effect/effect/system/ion_trail_follow/space_trail() + src.ion_trail = new /datum/effect/system/ion_trail_follow/space_trail() src.ion_trail.set_up(src) src.ion_trail.start() src.use_internal_tank = 1 diff --git a/code/game/vehicles/vehicle.dm b/code/game/vehicles/vehicle.dm index 04413a62f44..f4c18cdfc80 100644 --- a/code/game/vehicles/vehicle.dm +++ b/code/game/vehicles/vehicle.dm @@ -24,7 +24,7 @@ var/maint_access = 1 //var/dna //dna-locking the mech var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference - var/datum/effect/effect/system/spark_spread/spark_system = new + var/datum/effect/system/spark_spread/spark_system = new var/lights = 0 var/lights_power = 6 diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index b7f2f2d91bb..902257ae2db 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -18,10 +18,11 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," var/list/type = list("Question","Player Complaint") var/selected_type = input("Pick a category.", "Admin Help", null, null) as null|anything in type if(selected_type) - msg = input("Please enter your message.", "Admin Help", null, null) as text + msg = input("Please enter your message.", "Admin Help", null, null) as text|null - //clean the input msg - if(!msg) return + //clean the input msg + if(!msg) + return if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 4e05b8c6b32..40d8bc80671 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -536,37 +536,65 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_create_centcom_report() set category = "Event" - set name = "Create Command Report" - + set name = "Create Communications Report" + var/list/MsgType = list("Centcom Report","Enemy Communications") if(!check_rights(R_SERVER|R_EVENT)) return + var/type = input(usr, "Pick a type of report to send", "Report Type", "") as anything in MsgType var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null var/customname = input(usr, "Pick a title for the report.", "Title") as text|null if(!input) return - if(!customname) - customname = "Nanotrasen Update" - for (var/obj/machinery/computer/communications/C in machines) - if(! (C.stat & (BROKEN|NOPOWER) ) ) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) - P.name = "'[command_name()] Update.'" - P.info = input - P.update_icon() - C.messagetitle.Add("[command_name()] Update") - C.messagetext.Add(P.info) - switch(alert("Should this be announced to the general population?",,"Yes","No")) - if("Yes") - command_announcement.Announce(input, customname); - if("No") - world << "\red New Nanotrasen Update available at all communication consoles." + if(type == "Enemy Communications") + if(!customname) + customname = type - world << sound('sound/AI/commandreport.ogg') - log_admin("[key_name(src)] has created a command report: [input]") - message_admins("[key_name_admin(src)] has created a command report", 1) + var/from = input(usr, "What kind of report? Example: Syndicate Communique", "From") as text|null + if(!from) + from = "Syndicate Communique" + switch(alert("Should this be announced to the general population?",,"Yes","No")) + if("Yes") + communications_announcement.Announce(input, customname, , , , from); + if("No") + world << "\red [from] available at all communications consoles." + + for (var/obj/machinery/computer/communications/C in machines) + if(! (C.stat & (BROKEN|NOPOWER) ) ) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) + P.name = "[from]" + P.info = input + P.update_icon() + C.messagetitle.Add("[from]") + C.messagetext.Add(P.info) + + + if(type == "Centcom Report") + if(!customname) + customname = "Nanotrasen Update" + + switch(alert("Should this be announced to the general population?",,"Yes","No")) + if("Yes") + command_announcement.Announce(input, customname); + if("No") + world << "\red New Nanotrasen Update available at all communication consoles." + + for (var/obj/machinery/computer/communications/C in machines) + if(! (C.stat & (BROKEN|NOPOWER) ) ) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) + P.name = "'[command_name()] Update.'" + P.info = input + P.update_icon() + C.messagetitle.Add("[command_name()] Update") + C.messagetext.Add(P.info) + + //world << sound('sound/AI/commandreport.ogg') + log_admin("[key_name(src)] has created a communications report: [input]") + message_admins("[key_name_admin(src)] has created a communications report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view()) set category = "Admin" set name = "Delete" @@ -729,13 +757,13 @@ Traitors and the like can also be revived with the previous role mostly intact. return if(!check_rights(R_ADMIN)) - src << "Only administrators may use this command." return var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") if(confirm != "Yes") return shuttle_master.emergency.request() + feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.") @@ -744,7 +772,9 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/admin_cancel_shuttle() set category = "Admin" set name = "Cancel Shuttle" - if(!check_rights(R_ADMIN)) return + + if(!check_rights(R_ADMIN)) + return if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") return if(shuttle_master.emergency.mode >= SHUTTLE_DOCKED) @@ -760,6 +790,9 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "Toggle Deny Shuttle" + if (!ticker) + return + if(!check_rights(R_ADMIN)) return diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 29c13f4a6bc..1333892abfe 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -4,7 +4,7 @@ icon_state = "igniter" materials = list(MAT_METAL=500, MAT_GLASS=50) origin_tech = "magnets=1" - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread /obj/item/device/assembly/igniter/New() ..() diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index ce914b6c407..3bb7a97908b 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -177,7 +177,7 @@ call(src,triggerproc)(M) /obj/effect/meatgrinder/proc/triggerrad1(mob) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread for(var/mob/O in viewers(world.view, src.loc)) s.set_up(3, 1, src) s.start() diff --git a/code/modules/awaymissions/trigger.dm b/code/modules/awaymissions/trigger.dm index c31b37fbd8b..38b086f5869 100644 --- a/code/modules/awaymissions/trigger.dm +++ b/code/modules/awaymissions/trigger.dm @@ -22,20 +22,20 @@ M.Move(dest) if(entersparks) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(4, 1, src) s.start() if(exitsparks) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(4, 1, dest) s.start() if(entersmoke) - var/datum/effect/effect/system/harmless_smoke_spread/s = new /datum/effect/effect/system/harmless_smoke_spread + var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread s.set_up(4, 1, src, 0) s.start() if(exitsmoke) - var/datum/effect/effect/system/harmless_smoke_spread/s = new /datum/effect/effect/system/harmless_smoke_spread + var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread s.set_up(4, 1, dest, 0) s.start() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b1c8e53ff1f..324b5e7b427 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1040,7 +1040,7 @@ datum/preferences if("input") switch(href_list["preference"]) if("name") - var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null + var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) var/new_name = reject_bad_name(raw_name) if(new_name) @@ -1108,6 +1108,19 @@ datum/preferences //this shouldn't happen f_style = facial_hair_styles_list["Shaved"] + // Don't wear another species' underwear! + var/datum/sprite_accessory/S = underwear_list[underwear] + if(!(species in S.species_allowed)) + underwear = random_underwear(gender, species) + + S = undershirt_list[undershirt] + if(!(species in S.species_allowed)) + undershirt = random_undershirt(gender, species) + + S = socks_list[socks] + if(!(species in S.species_allowed)) + socks = random_socks(gender, species) + //reset hair colour and skin colour r_hair = 0//hex2num(copytext(new_hair, 2, 4)) g_hair = 0//hex2num(copytext(new_hair, 4, 6)) @@ -1156,7 +1169,7 @@ datum/preferences var/input = "Choose your character's hair colour:" if(species == "Machine") input = "Choose your character's frame colour:" - var/new_hair = input(user, input, "Character Preference") as color|null + var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null if(new_hair) r_hair = hex2num(copytext(new_hair, 2, 4)) g_hair = hex2num(copytext(new_hair, 4, 6)) @@ -1190,10 +1203,10 @@ datum/preferences var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories if(new_body_accessory) - body_accessory = new_body_accessory + body_accessory = (new_body_accessory == "None") ? null : new_body_accessory if("facial") - var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference") as color|null + var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null if(new_facial) r_facial = hex2num(copytext(new_facial, 2, 4)) g_facial = hex2num(copytext(new_facial, 4, 6)) @@ -1255,7 +1268,7 @@ datum/preferences socks = new_socks if("eyes") - var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null + var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null if(new_eyes) r_eyes = hex2num(copytext(new_eyes, 2, 4)) g_eyes = hex2num(copytext(new_eyes, 4, 6)) @@ -1270,7 +1283,7 @@ datum/preferences if("skin") if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) - var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference") as color|null + var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null if(new_skin) r_skin = hex2num(copytext(new_skin, 2, 4)) g_skin = hex2num(copytext(new_skin, 4, 6)) @@ -1278,7 +1291,7 @@ datum/preferences if("ooccolor") - var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference") as color|null + var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null if(new_ooccolor) ooccolor = new_ooccolor @@ -1423,7 +1436,7 @@ datum/preferences UI_style = "Midnight" if("UIcolor") - var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!") as color|null + var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null if(!UI_style_color_new) return UI_style_color = UI_style_color_new diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 3fab0c1ae1d..3c315119555 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -79,7 +79,7 @@ // Wiring! How exciting. var/datum/wires/rig/wires - var/datum/effect/effect/system/spark_spread/spark_system + var/datum/effect/system/spark_spread/spark_system /obj/item/weapon/rig/examine() usr << "This is \icon[src][src.name]." diff --git a/code/modules/computer3/computers/HolodeckControl.dm b/code/modules/computer3/computers/HolodeckControl.dm index 0e04ed50d59..cb492c6991b 100644 --- a/code/modules/computer3/computers/HolodeckControl.dm +++ b/code/modules/computer3/computers/HolodeckControl.dm @@ -132,7 +132,7 @@ for(var/turf/T in linkedholodeck) if(prob(30)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, T) s.start() T.ex_act(3) @@ -180,7 +180,7 @@ if(L.name=="Atmospheric Test Start") spawn(20) var/turf/T = get_turf(L) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, T) s.start() if(T) @@ -229,7 +229,7 @@ if(L.name=="Atmospheric Test Start") spawn(20) var/turf/T = get_turf(L) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, T) s.start() if(T) diff --git a/code/modules/computer3/computers/message.dm b/code/modules/computer3/computers/message.dm index 10870c9973e..27e47684d9c 100644 --- a/code/modules/computer3/computers/message.dm +++ b/code/modules/computer3/computers/message.dm @@ -15,7 +15,7 @@ //Server linked to. var/obj/machinery/message_server/linkedServer = null //Sparks effect - For emag - //var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread + //var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread //Messages - Saves me time if I want to change something. var/noserver = "ALERT: No server detected." diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 33f79cd8fe2..fa0a59010d4 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -177,4 +177,19 @@ /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5,) tools = list(/obj/item/weapon/screwdriver) - time = 200 \ No newline at end of file + time = 200 + +/datum/table_recipe/spooky_camera + name = "Camera Obscura" + result = /obj/item/device/camera/spooky + time = 15 + reqs = list(/obj/item/device/camera = 1, + /datum/reagent/holywater = 10) + parts = list(/obj/item/device/camera = 1) + +/datum/table_recipe/notreallysoap + name = "Homemade Soap" + result = /obj/item/weapon/soap/ducttape + time = 100 + reqs = list(/obj/item/stack/tape_roll = 1, + /datum/reagent/liquidgibs = 10) \ No newline at end of file diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index efef8616f7f..30a1cb82af0 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -133,8 +133,10 @@ if("change_id") var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code")) if(attempt_code == access_code) - eftpos_name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") + " EFTPOS scanner" - print_reference() + var name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null + if(name) + eftpos_name = name + " EFTPOS scanner" + print_reference() else usr << "\icon[src]Incorrect code entered." if("link_account") @@ -147,7 +149,9 @@ else usr << "\icon[src]Unable to connect to accounts database." if("trans_purpose") - transaction_purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") + var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") as text|null + if(purpose) + transaction_purpose = purpose if("trans_value") var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount") as num if(try_num < 0) diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm index 4a95bae0fe1..2d7316cc0ef 100644 --- a/code/modules/events/rogue_drones.dm +++ b/code/modules/events/rogue_drones.dm @@ -38,7 +38,7 @@ /datum/event/rogue_drone/end() var/num_recovered = 0 for(var/mob/living/simple_animal/hostile/retaliate/malf_drone/D in drones_list) - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread() sparks.set_up(3, 0, D.loc) sparks.start() D.z = 2 diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 7f5930073cc..fae640a73cb 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -28,7 +28,7 @@ R.my_atom = vent R.add_reagent(pick(gunk), 50) - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/system/chem_smoke_spread/smoke = new smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1) playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start(3) diff --git a/code/modules/examine/descriptions/atmospherics.dm b/code/modules/examine/descriptions/atmospherics.dm index c83ec81e89a..2b113a303d8 100644 --- a/code/modules/examine/descriptions/atmospherics.dm +++ b/code/modules/examine/descriptions/atmospherics.dm @@ -81,17 +81,17 @@ description_info = "This is a cosmetic attachment, as pipes currently do not spill their contents into the air." //T-shaped valves -/obj/machinery/atmospherics/tvalve +/obj/machinery/atmospherics/trinary/tvalve description_info = "Click this to toggle the mode. The direction with the green light is where the gas will flow." //Normal valves -/obj/machinery/atmospherics/valve - description_info = "Click this to turn the valve. If red, the pipes on each end are seperated. Otherwise, they are connected." +/obj/machinery/atmospherics/binary/valve + description_info = "Click this to turn the valve. If red, the pipes on each end are separated. Otherwise, they are connected." //TEG ports /obj/machinery/atmospherics/binary/circulator description_info = "This generates electricity, depending on the difference in temperature between each side of the machine. The meter in \ - the center of the machine gives an indicator of how much elecrtricity is being generated." + the center of the machine gives an indicator of how much electricity is being generated." //Passive gates /obj/machinery/atmospherics/binary/passive_gate @@ -106,20 +106,20 @@ description_info = "This pumps the contents of the attached pipe out into the atmosphere, if needed. It can be controlled from an Air Alarm." //Freezers -/obj/machinery/atmospherics/unary/freezer +/obj/machinery/atmospherics/unary/cold_sink/freezer description_info = "Cools down the gas of the pipe it is connected to. It uses massive amounts of electricity while on. \ It can be upgraded by replacing the capacitors, manipulators, and matter bins. It can be deconstructed by screwing the maintenance panel open with a \ screwdriver, and then using a crowbar." //Heaters -/obj/machinery/atmospherics/unary/heater +/obj/machinery/atmospherics/unary/heat_reservoir/heater description_info = "Heats up the gas of the pipe it is connected to. It uses massive amounts of electricity while on. \ It can be upgraded by replacing the capacitors, manipulators, and matter bins. It can be deconstructed by screwing the maintenance panel open with a \ screwdriver, and then using a crowbar." //Gas injectors /obj/machinery/atmospherics/unary/outlet_injector - description_info = "Outputs the pipe's gas into the atmosphere, similar to an airvent. It can be controlled by a nearby atmospherics computer. \ + description_info = "Outputs the pipe's gas into the atmosphere, similar to an air vent. It can be controlled by a nearby atmospherics computer. \ A green light on it means it is on." //Scrubbers @@ -145,13 +145,13 @@ description_antag = "Canisters can be damaged, spilling their contents into the air, or you can just leave the release valve open." //Portable pumps -/obj/machinery/portable_atmospherics/powered/pump +/obj/machinery/portable_atmospherics/pump description_info = "Invaluable for filling air in a room rapidly after a breach repair. The internal gas container can be filled by \ connecting it to a connector port. The pump can pump the air in (sucking) or out (blowing), at a specific target pressure. The powercell inside can be \ replaced by using a screwdriver, and then adding a new cell. A tank of gas can also be attached to the air pump." //Portable scrubbers -/obj/machinery/portable_atmospherics/powered/scrubber +/obj/machinery/portable_atmospherics/scrubber description_info = "Filters the air, placing harmful gases into the internal gas container. The container can be emptied by \ connecting it to a connector port. The pump can pump the air in (sucking) or out (blowing), at a specific target pressure. The powercell inside can be \ replaced by using a screwdriver, and then adding a new cell. A tank of gas can also be attached to the scrubber. " @@ -163,4 +163,4 @@ //Pipe dispensers /obj/machinery/pipedispenser description_info = "This can be moved by using a wrench. You will need to wrench it again when you want to use it. You can put \ - excess (atmospheric) pipes into the dispenser, as well. The dispenser requires electricity to function." \ No newline at end of file + excess (atmospheric) pipes into the dispenser, as well. The dispenser requires electricity to function." diff --git a/code/modules/examine/descriptions/engineering.dm b/code/modules/examine/descriptions/engineering.dm index c8842c21bc7..cd22eed3db5 100644 --- a/code/modules/examine/descriptions/engineering.dm +++ b/code/modules/examine/descriptions/engineering.dm @@ -10,7 +10,7 @@ Touching the supermatter will result in *instant death*, with no corpse left behind! You can drag the supermatter, but anything else will kill you. \ It is advised to obtain a genetic backup before trying to drag it." - description_antag = "Exposing the supermatter to oxygen or vaccum will cause it to start rapidly heating up. Sabotaging the supermatter and making it explode will \ + description_antag = "Exposing the supermatter to oxygen or vacuum will cause it to start rapidly heating up. Sabotaging the supermatter and making it explode will \ cause a period of lag as the explosion is processed by the server, as well as irradiating the entire station and causing hallucinations to happen. \ Wearing radiation equipment will protect you from most of the delamination effects sans explosion." diff --git a/code/modules/examine/descriptions/mobs.dm b/code/modules/examine/descriptions/mobs.dm index 8197e6f3d1d..f8e205e855c 100644 --- a/code/modules/examine/descriptions/mobs.dm +++ b/code/modules/examine/descriptions/mobs.dm @@ -1,8 +1,8 @@ /mob/living/silicon/robot/drone description_info = "Drones are player-controlled synthetics which are lawed to maintain the station and not \ interact with anyone else, except for other drones. They hold a wide array of tools to build, repair, maintain, and clean. \ - They fuction similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, \ + They function similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, \ such as fire, radiation, vacuum, and more. Ghosts can join the round as a maintenance drone by using the appropriate verb in the 'ghost' tab. \ An inactive drone can be rebooted by swiping an ID card on it with engineering or robotics access." - description_antag = "An Electromagnetic Sequencer can be used to subvert the drone to your cause." \ No newline at end of file + description_antag = "An Electromagnetic Sequencer can be used to subvert the drone to your cause." diff --git a/code/modules/examine/descriptions/structures.dm b/code/modules/examine/descriptions/structures.dm index 858653b0943..d8e9b337606 100644 --- a/code/modules/examine/descriptions/structures.dm +++ b/code/modules/examine/descriptions/structures.dm @@ -1,7 +1,7 @@ /obj/structure/girder description_info = "Use metal sheets on this to build a normal wall. Adding plasteel instead will make a reinforced wall.
\ A false wall can be made by using a crowbar on this girder, and then adding metal or plasteel.
\ - You can dismantle the grider with a wrench." + You can dismantle the girder with a wrench." /obj/structure/girder/reinforced description_info = "Add another sheet of plasteel to finish." @@ -14,8 +14,8 @@ description_info = "Add a metal floor tile to build a floor on top of the lattice.
\ Lattices can be made by applying metal rods to a space tile." -/obj/structure/bed +/obj/structure/stool/bed description_info = "Click and drag yourself (or anyone) to this to buckle in. Click on this with an empty hand to undo the buckles.
\
\ Anyone with restraints, such as handcuffs, will not be able to unbuckle themselves. They must use the Resist button, or verb, to break free of \ - the buckles, instead." \ No newline at end of file + the buckles, instead." diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm index 97791885821..785beed0042 100644 --- a/code/modules/examine/descriptions/weapons.dm +++ b/code/modules/examine/descriptions/weapons.dm @@ -21,7 +21,7 @@ description_antag = "This is a stealthy weapon which fires poisoned bolts at your target. When it hits someone, they will suffer a stun effect, in \ addition to toxins. The energy crossbow recharges itself slowly, and can be concealed in your pocket or bag." -/obj/item/weapon/gun/energy +/obj/item/weapon/gun/energy/gun description_info = "This is an energy weapon. To fire the weapon, have your gun mode set to 'fire', \ then click where you want to fire. Most energy weapons can fire through windows harmlessly. To switch between stun and lethal, click the weapon \ in your hand. To recharge this weapon, use a weapon recharger." @@ -51,7 +51,7 @@ /obj/item/weapon/gun/projectile description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \ - then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropiate ammo. The description \ + then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \ will tell you what caliber you need." /obj/item/weapon/gun/projectile/shotgun/pump @@ -79,4 +79,4 @@ it can be concealed in your pocket or bag." /obj/item/weapon/melee/cultblade - description_antag = "This sword is a powerful weapon, capable of severing limbs easily, if they are targeted. Nonbelivers are unable to use this weapon." + description_antag = "This sword is a powerful weapon, capable of severing limbs easily, if they are targeted. Nonbelievers are unable to use this weapon." diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index b1c01eb9c76..74b639c513b 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -515,7 +515,7 @@ if(water_level && prob(45)) //If there is water, there is a chance the cat will slip, Syndicat will spark like E-N when this happens M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!") if(istype(M, /mob/living/simple_animal/pet/cat/Syndi)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() else //No water or didn't slip, get that fish! diff --git a/code/modules/food/cooker.dm b/code/modules/food/cooker.dm index e50cdac3dec..76f67e47fb8 100644 --- a/code/modules/food/cooker.dm +++ b/code/modules/food/cooker.dm @@ -62,7 +62,7 @@ var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/burnt = new(get_turf(src)) setRegents(props, burnt) user << "You smell burning coming from the [src]!" - var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() // burning things makes smoke! + var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() // burning things makes smoke! smoke.set_up(5, 0, src) smoke.start() if (prob(firechance)) diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 73cd5eff306..98b8e782546 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -648,6 +648,10 @@ datum/recipe/microwave/slimesandwich ) result = /obj/item/weapon/ruinedvirusdish +/datum/recipe/microwave/mashedtaters + fruit = list("potato" = 1) + reagents = list("gravy" = 5) + result = /obj/item/weapon/reagent_containers/food/snacks/mashed_potatoes ////////////////////////////////////////// // bs12 food port stuff diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm index 2efdf4242cd..914362ef45e 100644 --- a/code/modules/food/recipes_oven.dm +++ b/code/modules/food/recipes_oven.dm @@ -393,3 +393,13 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/flatbread +/datum/recipe/oven/turkey // Magic + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/stuffing, + /obj/item/weapon/reagent_containers/food/snacks/stuffing + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 033221ce5f2..4dae0d4dd6a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -113,7 +113,7 @@ descriptors |= "hallucinogenic" if(reagents.has_reagent("styptic_powder")) descriptors |= "medicinal" - if(reagents.has_reagent("gold")) + if(reagents.has_reagent("gold") || reagents.has_reagent("silver")) descriptors |= "shiny" if(reagents.has_reagent("lube")) descriptors |= "slippery" @@ -300,6 +300,9 @@ // TODO: refactor all food paths to be less horrible and difficult to work with in this respect. ~Z if(!istype(M) || (can_operate(M) && do_surgery(M,user,src))) return 0 + if(!def_zone) + def_zone = check_zone(user.zone_sel.selecting) + user.lastattacked = M M.lastattacker = user user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" @@ -311,7 +314,7 @@ var/hit = H.attacked_by(src, user, def_zone) if(hit && hitsound) playsound(loc, hitsound, 50, 1, -1) - return hit + //return hit else if(attack_verb.len) user.visible_message("[M] has been [pick(attack_verb)] with [src] by [user]!") @@ -331,15 +334,23 @@ M.take_organ_damage(0, force) M.updatehealth() - if(seed && seed.get_trait(TRAIT_STINGS)) + if(seed && seed.get_trait(TRAIT_CARNIVOROUS)) + seed.do_thorns(M, src, def_zone) + + if(ishuman(M) && seed && seed.get_trait(TRAIT_STINGS)) if(!reagents || reagents.total_volume <= 0) return - reagents.remove_any(rand(1,3)) - seed.thrown_at(src,M) + seed.do_sting(M, src, def_zone) + reagents.remove_any(rand(1,3)) //use up some of the reagents at random sleep(-1) if(!src) return - if(prob(35)) + if(reagents && reagents.total_volume <= 0) //used-up fruit will be destroyed + if(user) + user << "\The [src] has dried out and crumbles to dust." + //user.drop_from_inventory(src) + qdel(src) + else if(prob(35)) //fruit that still has reagents has a chance of breaking each time it stings on hit if(user) user << "\The [src] has fallen to bits." //user.drop_from_inventory(src) @@ -366,44 +377,91 @@ if(src) qdel(src) return - if(seed.kitchen_tag == "grass") - user.show_message("You make a grass tile out of \the [src]!", 1) - for(var/i=0,i<2,i++) - var/obj/item/stack/tile/grass/G = new (user.loc) - G.color = seed.get_trait(TRAIT_PRODUCT_COLOUR) - for (var/obj/item/stack/tile/grass/NG in user.loc) - if(G==NG) - continue - if(NG.amount>=NG.max_amount) - continue - NG.attackby(G, user) - user << "You add the newly-formed grass to the stack. It now contains [G.amount] tiles." - qdel(src) - return - - if(seed.get_trait(TRAIT_SPREAD) > 0) + if(user.a_intent == I_DISARM && seed.get_trait(TRAIT_SPREAD) > 0) //Using disarm so we can tell if you want to plant or convert non-final plants user << "You plant the [src.name]." new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed) new /obj/effect/plant(get_turf(user), src.seed) qdel(src) return - /* - if(seed.kitchen_tag) + + if(!seed.final_form) //This isn't even my final form! (sorry, it had to be done) switch(seed.kitchen_tag) - if("shand") - var/obj/item/stack/medical/bruise_pack/tajaran/poultice = new /obj/item/stack/medical/bruise_pack/tajaran(user.loc) + if("comfrey") + var/obj/item/stack/medical/bruise_pack/comfrey/poultice = new /obj/item/stack/medical/bruise_pack/comfrey(user.loc) poultice.heal_brute = potency user << "You mash the leaves into a poultice." qdel(src) return - if("mtear") - var/obj/item/stack/medical/ointment/tajaran/poultice = new /obj/item/stack/medical/ointment/tajaran(user.loc) + if("aloe") + var/obj/item/stack/medical/ointment/aloe/poultice = new /obj/item/stack/medical/ointment/aloe(user.loc) poultice.heal_burn = potency user << "You mash the petals into a poultice." qdel(src) return - */ + if("grass") + user.show_message("You make a grass tile out of \the [src]!", 1) + for(var/i=0,i<2,i++) + var/obj/item/stack/tile/grass/G = new (user.loc) + G.color = seed.get_trait(TRAIT_PRODUCT_COLOUR) + for (var/obj/item/stack/tile/grass/NG in user.loc) + if(G==NG) + continue + if(NG.amount>=NG.max_amount) + continue + NG.attackby(G, user) + user << "You add the newly-formed grass to the stack. It now contains [G.amount] tiles." + qdel(src) + return + if("sunflower") + var/obj/item/weapon/grown/sunflower/SF = new /obj/item/weapon/grown/sunflower(user.loc) + user.unEquip(src) + user.put_in_hands(SF) + qdel(src) + return + if("novaflower") + var/obj/item/weapon/grown/novaflower/NF = new /obj/item/weapon/grown/novaflower(user.loc) + if(prob(10)) + user.say("PRAISE THE SUN!") + else + user << "PRAISE THE SUN!" + user.unEquip(src) + user.put_in_hands(NF) + qdel(src) + return + if("cashpod") + user << "You crack open the cash pod..." + var/value = round(seed.get_trait(TRAIT_POTENCY)) + user.unEquip(src) + switch(value) + if(0) + user << "It's empty! What a waste..." + if(1 to 10) + user << "It has a space dollar inside. Woo." + new /obj/item/weapon/spacecash(get_turf(user)) + if(11 to 20) + user << "It has 10 space dollars inside!" + new /obj/item/weapon/spacecash/c10(get_turf(user)) + if(21 to 30) + user << "It has 20 space dollars inside! Cool!" + new /obj/item/weapon/spacecash/c20(get_turf(user)) + if(31 to 40) + user << "It has 50 space dollars inside! Nice!" + new /obj/item/weapon/spacecash/c50(get_turf(user)) + if(41 to 50) + user << "It has 100 space dollars inside! Sweet!" + new /obj/item/weapon/spacecash/c100(get_turf(user)) + if(51 to 60) + user << "It has 200 space dollars inside! Awesome!" + new /obj/item/weapon/spacecash/c200(get_turf(user)) + if(61 to 80) + user << "It has 500 space dollars inside! CHA-CHING!" + new /obj/item/weapon/spacecash/c500(get_turf(user)) + else + user << "It has 1000 space dollars inside! JACKPOT!" + new /obj/item/weapon/spacecash/c1000(get_turf(user)) + qdel(src) + return /obj/item/weapon/reagent_containers/food/snacks/grown/pickup(mob/user) ..() diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index a5497298947..b6a3b05d966 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -84,3 +84,47 @@ throwforce = 0 throw_speed = 4 throw_range = 20 + + +// Sunflower + +/obj/item/weapon/grown/sunflower + name = "sunflower" + desc = "A large, fresh-grown sunflower. How cheery!" + icon = 'icons/obj/harvest.dmi' + icon_state = "sunflower" + item_state = "sunflower" + w_class = 2.0 + throwforce = 0 + throw_speed = 4 + throw_range = 20 + +/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob) + M << " [user] smacks you with a [name]!FLOWER POWER" + user << " Your [name]'s FLOWER POWER strikes [M]" + + +// Novaflower + +/obj/item/weapon/grown/novaflower + name = "novaflower" + desc = "A large, fresh-grown novaflower. It seems to radiate heat." + icon = 'icons/obj/harvest.dmi' + icon_state = "novaflower" + item_state = "sunflower" + w_class = 2.0 + throwforce = 0 + throw_speed = 4 + throw_range = 20 + +/obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M as mob, mob/user as mob) + M << "[user] smacks you with a [name]!FLOWER POWER" + user << " Your [name]'s FLOWER POWER strikes [M]" + if(istype(M, /mob/living)) + M << "You are heated by the warmth of the of the [name]!" + M.bodytemperature += potency/2 * TEMPERATURE_DAMAGE_COEFFICIENT + +/obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob) + if(!user.gloves) + user << "The [name] burns your bare hand!" + user.adjustFireLoss(rand(1,5)) diff --git a/code/modules/hydroponics/grown_predefined.dm b/code/modules/hydroponics/grown_predefined.dm index 682ce791e91..523974abac3 100644 --- a/code/modules/hydroponics/grown_predefined.dm +++ b/code/modules/hydroponics/grown_predefined.dm @@ -37,4 +37,10 @@ plantname = "amanita" /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus - plantname = "ambrosiadeus" \ No newline at end of file + plantname = "ambrosiadeus" + +/obj/item/weapon/reagent_containers/food/snacks/grown/aloe + plantname = "aloe" + +/obj/item/weapon/reagent_containers/food/snacks/grown/comfrey + plantname = "comfrey" \ No newline at end of file diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 7586f415c0b..d206c8f8e3a 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -21,7 +21,8 @@ var/kitchen_tag // Used by the reagent grinder. var/trash_type // Garbage item produced when eaten. var/splat_type = /obj/effect/decal/cleanable/fruit_smudge // Graffiti decal. - var/has_mob_product + var/preset_product + var/final_form = 1 var/modular_icon = 0 // Dictates if the product uses a modular sprite. 0 = preset, 1 = modular var/preset_icon = "undef" // Name of the iconstate in icon/obj/harvest.dmi to use for preset sprite // Make sure to set this to the correct icon if not using a modular sprite @@ -93,7 +94,7 @@ var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/3)) R.add_reagent(rid,injecting) - var/datum/effect/effect/system/chem_smoke_spread/S = new() + var/datum/effect/system/chem_smoke_spread/S = new() S.attach(T) S.set_up(R, round(get_trait(TRAIT_POTENCY)/4), 0, T) S.start() @@ -140,19 +141,47 @@ target.updatehealth() // Adds reagents to a target. -/datum/seed/proc/do_sting(var/mob/living/carbon/human/target, var/obj/item/fruit) +/datum/seed/proc/do_sting(var/mob/living/carbon/human/target, var/obj/item/fruit, var/target_limb) if(!get_trait(TRAIT_STINGS)) return + if(!target_limb) //if we weren't given a target_limb, pick a random one to try stinging + target_limb = pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin") if(chems && chems.len) - var/body_coverage = HEAD|HEADCOVERSMOUTH|HEADCOVERSEYES|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + if(!target.can_inject(target, 0, target_limb)) //if a syringe can't get through, neither can the sting + return + + var/protection_needed + switch(target_limb) + if("head") + protection_needed = HEAD | HEADCOVERSMOUTH | HEADCOVERSEYES + if("chest") + protection_needed = UPPER_TORSO + if("groin") + protection_needed = LOWER_TORSO + if("l_arm","r_arm") + protection_needed = ARMS + if("l_hand","r_hand") + protection_needed = HANDS + if("l_leg","r_leg") + protection_needed = LEGS + if("l_foot","r_foot") + protection_needed = FEET for(var/obj/item/clothing/clothes in target) + if(target.l_hand == clothes|| target.r_hand == clothes) continue - body_coverage &= ~(clothes.body_parts_covered) + protection_needed &= ~(clothes.body_parts_covered) + if((clothes.slot_flags & SLOT_HEAD) || (clothes.slot_flags & SLOT_MASK)) + if(clothes.flags & HEADCOVERSEYES) + protection_needed &= ~(HEADCOVERSEYES) + if(clothes.flags & HEADCOVERSMOUTH) + protection_needed &= ~(HEADCOVERSMOUTH) + if(!protection_needed) //already got the needed protection, save some time and skip the rest of the loop + break - if(!body_coverage) + if(!protection_needed) //properly protected, good job! return target << "You are stung by \the [fruit]!" @@ -357,7 +386,7 @@ if(turfs.len) // Moves the mob, causes sparks. - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, get_turf(target)) s.start() var/turf/picked = get_turf(pick(turfs)) // Just in case... @@ -417,56 +446,37 @@ chems = list() if(prob(80)) - chems["nutriment"] = list(rand(1,10),rand(10,20)) + var/nutrient_type = rand(1,7) + switch(nutrient_type) + if(1) + chems["plantmatter"] = list(rand(1,10),rand(10,20)) + if(2) + chems["nutriment"] = list(rand(1,10),rand(10,20)) + if(3) + chems["protein"] = list(rand(1,10),rand(10,20)) + if(4) + chems["plantmatter"] = list(rand(1,5),rand(10,20)) + chems["nutriment"] = list(rand(1,5),rand(10,20)) + if(5) + chems["plantmatter"] = list(rand(1,5),rand(10,20)) + chems["protein"] = list(rand(1,5),rand(10,20)) + if(6) + chems["protein"] = list(rand(1,5),rand(10,20)) + chems["nutriment"] = list(rand(1,5),rand(10,20)) + if(7) + chems["plantmatter"] = list(rand(1,3),rand(10,20)) + chems["nutriment"] = list(rand(1,4),rand(10,20)) + chems["protein"] = list(rand(1,3),rand(10,20)) var/additional_chems = rand(0,5) if(additional_chems) - var/list/possible_chems = list( - "woodpulp", - "styptic_powder", - "methamphetamine", - "cryoxadone", - "blood", - "water", - "potassium", - "plasticide", - "mutationtoxin", - "amutationtoxin", - "epinephrine", - "space_drugs", - "salglu_solution", - "mercury", - "sugar", - "radium", - "mutadone", - "mannitol", - "thermite", - "sal_acid", - "atropine", - "omnizine", - "salbutamol", - "plasma", - "synaptizine", - "haloperidol", - "potass_iodide", - "mitocholide", - "toxin", - "rezadone", - "antihol", - "slimejelly", - "cyanide", - "lsd", - "morphine", - "ether" - ) - for(var/x=1;x<=additional_chems;x++) - if(!possible_chems.len) - break - var/new_chem = pick(possible_chems) - possible_chems -= new_chem - chems[new_chem] = list(rand(1,10),rand(10,20)) + var/new_chem = get_random_chemical(1) + if(chems.Find(new_chem)) + chems[new_chem] = list(rand(2,20),rand(5,15)) //DOUBLE UP + else + chems[new_chem] = list(rand(1,10),rand(10,20)) if(prob(90)) set_trait(TRAIT_REQUIRES_NUTRIENTS,1) @@ -641,8 +651,8 @@ consume_gasses |= new_gasses gene.values["[TRAIT_CONSUME_GASSES]"] = null if(GENE_METABOLISM) - has_mob_product = gene.values["mob_product"] - gene.values["mob_product"] = null + preset_product = gene.values["alt_product"] + gene.values["alt_product"] = null for(var/trait in gene.values) set_trait(trait,gene.values["[trait]"]) @@ -671,7 +681,7 @@ if(GENE_HARDINESS) traits_to_copy = list(TRAIT_TOXINS_TOLERANCE,TRAIT_PEST_TOLERANCE,TRAIT_WEED_TOLERANCE,TRAIT_ENDURANCE) if(GENE_METABOLISM) - P.values["mob_product"] = has_mob_product + P.values["alt_product"] = preset_product traits_to_copy = list(TRAIT_REQUIRES_NUTRIENTS,TRAIT_REQUIRES_WATER,TRAIT_ALTER_TEMP) if(GENE_VIGOUR) traits_to_copy = list(TRAIT_PRODUCTION,TRAIT_MATURATION,TRAIT_YIELD,TRAIT_SPREAD) @@ -731,14 +741,13 @@ currently_querying = list() for(var/i = 0;i0) ? round(spread_chance*0.6) : round(spread_chance*0.3)) + spread_chance = seed.get_trait(TRAIT_POTENCY) + if(growth_type == 0) //These don't spread far at all (glowshroom, glowberries, brown mold) + spread_distance = round(spread_chance*0.1) + else if(growth_type == 2 || growth_type == 3) //Vines and biomass can go further than worms and mold + spread_distance = round(spread_chance*0.6) + else //Worms and mold go a moderate distance + spread_distance = round(spread_chance*0.3) update_icon() spawn(1) // Plants will sometimes be spawned in the turf adjacent to the one they need to end up in, for the sake of correct dir/etc being set. diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 53abedd3c78..0f991a56bfc 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -17,14 +17,16 @@ // Todo, cause damage. user_unbuckle_mob(user, user) -/obj/effect/plant/proc/trodden_on(var/mob/living/victim) +/obj/effect/plant/Crossed(var/mob/living/victim) if(!is_mature()) return - var/mob/living/carbon/human/H = victim - if(istype(H) && H.shoes) - return - seed.do_thorns(victim,src) - seed.do_sting(victim,src,pick("r_foot","l_foot","r_leg","l_leg")) + var/target_limb = pick("r_foot","l_foot","r_leg","l_leg") + if(ishuman(victim)) + var/mob/living/carbon/human/H = victim + if(H.shoes && prob(50)) //shoes will reduce chances of being stuck/stung by plants, but not always avoid it + return + seed.do_thorns(victim,src,target_limb) + seed.do_sting(victim,src,target_limb) /obj/effect/plant/proc/entangle(var/mob/living/victim) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 5bc193892a0..f255c558c20 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -68,6 +68,8 @@ "ammonia" = 1, "diethylamine" = 2, "nutriment" = 1, + "protein" = 1.75, + "plantmatter" = 1.25, "adminordrazine" = 1, "eznutrient" = 1, "robustharvest" = 1, @@ -117,6 +119,8 @@ "ammonia" = list( 0.5, 0, 0 ), "diethylamine" = list( 1, 0, 0 ), "nutriment" = list( 0.25, 0.15, 0 ), + "protein" = list( 0.25, 0.15, 0 ), + "plantmatter" = list( 0.25, 0.15, 0 ), "radium" = list( -1.5, 0, 0.2), "adminordrazine" = list( 1, 1, 1 ), "robustharvest" = list( 0, 0.2, 0 ), diff --git a/code/modules/jungle/jungle.dmi b/code/modules/jungle/jungle.dmi index f27897881ce..76cfafb9ea6 100644 Binary files a/code/modules/jungle/jungle.dmi and b/code/modules/jungle/jungle.dmi differ diff --git a/code/modules/jungle/jungle_animals.dm b/code/modules/jungle/jungle_animals.dm index 018b5a8e8f7..a63fed946ea 100644 --- a/code/modules/jungle/jungle_animals.dm +++ b/code/modules/jungle/jungle_animals.dm @@ -51,10 +51,11 @@ /mob/living/simple_animal/hostile/panther name = "panther" desc = "A long sleek, black cat with sharp teeth and claws." - icon = 'code/modules/jungle/jungle.dmi' + icon = 'icons/mob/alienqueen.dmi' icon_state = "panther" icon_living = "panther" icon_dead = "panther_dead" + icon_resting = "panther_rest" icon_gib = "panther_dead" speak_chance = 0 turns_per_move = 3 @@ -66,6 +67,7 @@ stop_automated_movement_when_pulled = 0 maxHealth = 50 health = 50 + pixel_x = -16 harm_intent_damage = 8 melee_damage_lower = 15 diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 29e0e9f1102..f86c3e2d6c2 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -20,7 +20,7 @@ var/sheet_per_ore = 1 var/point_upgrade = 1 var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("bananium" = 30), ("diamond" = 40), ("plasma" = 40)) - var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", ("Engineering" = list("metal", "glass", "plasma")), ("Chief Engineer's Desk" = list("metal", "glass", "plasma")), ("Atmospherics" = list("metal", "glass", "plasma"))) + var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma")) /obj/machinery/mineral/ore_redemption/New() ..() @@ -67,7 +67,7 @@ stack_list[processed_sheet] = s // Not including tg's ignoring of metal, glass being stocked because if cargo's not telling science when ores are there, they probably won't // help with restocking metal/glass either - var/msg = "[capitalize(s.name)] sheets have been stocked in the ore reclaimer." + var/msg = "\[[worldtime2text()]\]: [capitalize(s.name)] sheets have been stocked in the ore reclaimer." for(var/obj/machinery/requests_console/D in allConsoles) if(D.department in src.supply_consoles) if(supply_consoles[D.department] == null || (s.name in supply_consoles[D.department])) @@ -242,7 +242,7 @@ return /obj/machinery/mineral/ore_redemption/ex_act(severity, target) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() if(severity == 1) @@ -410,7 +410,7 @@ qdel(voucher) /obj/machinery/mineral/equipment_vendor/ex_act(severity, target) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() if(prob(50 / severity) && severity < 3) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9b790a5b81c..df4e1164ff2 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -111,7 +111,7 @@ Works together with spawning an observer, noted above. if(!loc) return if(!client) return 0 - + regular_hud_updates() if(client.images.len) for(var/image/hud in client.images) if(copytext(hud.icon_state,1,4) == "hud") @@ -119,7 +119,7 @@ Works together with spawning an observer, noted above. if(antagHUD) var/list/target_list = list() for(var/mob/living/target in oview(src, 14)) - if(target.mind && (target.mind.special_role || issilicon(target))) + if(target.mind && (target.mind.special_role || issilicon(target) || target.mind.nation)) target_list += target if(target_list.len) assess_targets(target_list, src) @@ -146,8 +146,10 @@ Works together with spawning an observer, noted above. var/client/C = U.client for(var/mob/living/carbon/human/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] + C.images += target.hud_list[NATIONS_HUD] for(var/mob/living/silicon/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] + C.images += target.hud_list[NATIONS_HUD] return 1 diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 2cf4a2397f9..dae0172e57f 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -157,7 +157,7 @@ stuttering = power Stun(power) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 21cd55e47ba..6b698640d5c 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -32,7 +32,7 @@ hgibs(loc, viruses, dna) else new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() @@ -180,4 +180,4 @@ /mob/living/carbon/human/proc/Drain() ChangeToHusk() mutations |= NOCLONE - return + return diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 16a9ca22837..d8d56cf7f5e 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -335,7 +335,7 @@ m_type = 2 if ("deathgasp") - message = "[src] [species.death_message]" + message = "[src] [species.death_message]" m_type = 1 if ("giggle") @@ -725,7 +725,7 @@ if(locate(/obj/item/weapon/storage/bible) in get_turf(src)) viewers(src) << "[src] farts on the Bible!" viewers(src) << "A mysterious force smites [src]!" - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() src.gib() @@ -818,4 +818,4 @@ set desc = "Sets an extended description of your character's features." set category = "IC" - flavor_text = TextPreview(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text) + flavor_text = TextPreview(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e087b353cad..5880349b588 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -4,20 +4,21 @@ voice_name = "unknown" icon = 'icons/mob/human.dmi' icon_state = "body_m_s" + + //why are these here and not in human_defines.dm var/list/hud_list[10] var/datum/species/species //Contains icon generation and language information, set during New(). var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. -/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna=0) - +/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0) if(!dna) dna = new /datum/dna(null) // Species name is handled by set_species() if(!species) if(new_species) - set_species(new_species,1) + set_species(new_species, 1) else set_species() @@ -37,6 +38,7 @@ hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD_OOC] = image('icons/mob/hud.dmi', src, "hudhealthy") + hud_list[NATIONS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") ..() @@ -44,7 +46,7 @@ make_blood() var/mob/M = src - faction |= "\ref[M]" + faction |= "\ref[M]" //what // Set up DNA. if(!delay_ready_dna && dna) @@ -146,30 +148,37 @@ /mob/living/carbon/human/stok/New(var/new_loc) ..(new_loc, "Stok") -/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) - if ((!( yes ) || now_pushing || buckled)) - return +/mob/living/carbon/human/Bump(atom/movable/AM, yes) + if(!(yes) || now_pushing || buckled) + return 0 now_pushing = 1 - if (ismob(AM)) + if(ismob(AM)) var/mob/tmob = AM - if( istype(tmob, /mob/living/carbon) && prob(10) ) - src.spread_disease_to(AM, "Contact") -//BubbleWrap - Should stop you pushing a restrained person out of the way - - if(istype(tmob, /mob/living/carbon/human)) + if(iscarbon(tmob) && prob(10)) + spread_disease_to(tmob, "Contact") + //BubbleWrap - Should stop you pushing a restrained person out of the way + //i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap' + if(ishuman(tmob)) for(var/mob/M in range(tmob, 1)) - if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) - if ( !(world.time % 5) ) - src << "\red [tmob] is restrained, you cannot push past" + + if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS)) + if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human + src << "[tmob] is restrained, you cannot push past." now_pushing = 0 - return - if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) ) - if ( !(world.time % 5) ) - src << "\red [tmob] is restraining [M], you cannot push past" + return 0 + + //I have to fucking document this somewhere- the above if(tmob.pinned.len || etc) check above had + //locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) at the end of it + //FIRST OF ALL, THAT IS NOT HOW YOU FUCKING USE LOCATE() + //SECOND OF ALL, OH GOD, WHY WOULD YOU EVER WANT GRABBED MOBS TO BE UNABLE TO BE PUSHED PAST GOD + + if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS) + if(!(world.time % 5)) + src << "[tmob] is restraining [M], you cannot push past." now_pushing = 0 - return + return 0 //Leaping mobs just land on the tile, no pushing, no anything. if(status_flags & LEAPING) @@ -178,35 +187,35 @@ now_pushing = 0 return - if(istype(tmob,/mob/living/silicon/robot/drone)) //I have no idea why the hell this isn't already happening. How do mice do it? - loc = tmob.loc - now_pushing = 0 - return - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()) && tmob.canmove && canmove && !tmob.buckled && !tmob.buckled_mob) // mutual brohugs all around! - var/turf/oldloc = loc - loc = tmob.loc - tmob.loc = oldloc - now_pushing = 0 - for(var/mob/living/carbon/slime/slime in view(1,tmob)) - if(slime.Victim == tmob) - slime.UpdateFeed() - return + //it might be 'bubblewrapping' given that this rhymes with 'hugboxing' + if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained())) + if((canmove && tmob.canmove) && (!tmob.buckled && !tmob.buckled_mob)) + var/turf/oldloc = loc + loc = tmob.loc + tmob.loc = oldloc + now_pushing = 0 + for(var/mob/living/carbon/slime/slime in view(1,tmob)) + if(slime.Victim == tmob) + slime.UpdateFeed() + return - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) + if(ishuman(tmob) && (FAT in tmob.mutations)) if(prob(40) && !(FAT in src.mutations)) - src << "\red You fail to push [tmob]'s fat ass out of the way." + src << "You fail to push [tmob]'s fat ass out of the way." now_pushing = 0 return + if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot)) if(prob(99)) now_pushing = 0 return + if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot)) if(prob(99)) now_pushing = 0 return + if(!(tmob.status_flags & CANPUSH)) now_pushing = 0 return @@ -216,21 +225,19 @@ now_pushing = 0 spawn(0) ..() - if (!istype(AM, /atom/movable)) + if(!istype(AM, /atom/movable)) return - if (!now_pushing) + if(!now_pushing) now_pushing = 1 - if (!AM.anchored) + if(!AM.anchored) var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM,t)) + if(istype(AM, /obj/structure/window/full)) + for(var/obj/structure/window/win in get_step(AM, t)) now_pushing = 0 return step(AM, t) now_pushing = 0 - return - return /mob/living/carbon/human/Stat() ..() @@ -238,6 +245,9 @@ stat(null, "Intent: [a_intent]") stat(null, "Move Mode: [m_intent]") + + stat(null, "Station Time: [worldtime2text()]") + if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") @@ -246,11 +256,11 @@ if(timeleft > 0) stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") - if (client.statpanel == "Status") + if(client.statpanel == "Status") if(locate(/obj/item/device/assembly/health) in src) stat(null, "Health: [health]") - if (internal) - if (!internal.air_contents) + if(internal) + if(!internal.air_contents) qdel(internal) else stat("Internal Atmosphere Info", internal.name) @@ -268,7 +278,12 @@ if(mind.changeling) stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]") stat("Absorbed DNA", mind.changeling.absorbedcount) - stat(null, "Station Time: [worldtime2text()]") + + if(mind.nation) + stat("Nation Name", "[mind.nation.current_name ? "[mind.nation.current_name]" : "[mind.nation.default_name]"]") + stat("Nation Leader", "[mind.nation.current_leader ? "[mind.nation.current_leader]" : "None"]") + stat("Nation Heir", "[mind.nation.heir ? "[mind.nation.heir]" : "None"]") + if(istype(loc, /obj/spacepod)) // Spacdpods! var/obj/spacepod/S = loc @@ -279,12 +294,13 @@ var/shielded = 0 var/b_loss = null var/f_loss = null - switch (severity) - if (1.0) + + switch(severity) + if(1) b_loss += 500 - if (!prob(getarmor(null, "bomb"))) + if(!prob(getarmor(null, "bomb"))) gib() - return + return 0 else var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(target, 200, 4) @@ -301,13 +317,8 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - - //return -// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) - //user.throw_at(target, 200, 4) - - if (2.0) - if (!shielded) + if(2) + if(!shielded) //literally nothing could change shielded before this so wth b_loss += 60 f_loss += 60 @@ -316,7 +327,7 @@ var/obj/item/organ/external/processing_dismember var/list/valid_limbs = organs.Copy() - if (prob(getarmor(null, "bomb"))) + if(prob(getarmor(null, "bomb"))) b_loss = b_loss/1.5 f_loss = f_loss/1.5 @@ -332,15 +343,15 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) + if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) ear_damage += 30 ear_deaf += 120 - if (prob(70) && !shielded) + if(prob(70) && !shielded) Paralyse(10) - if(3.0) + if(3) b_loss += 30 - if (prob(getarmor(null, "bomb"))) + if(prob(getarmor(null, "bomb"))) b_loss = b_loss/2 else @@ -357,10 +368,10 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) + if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) ear_damage += 15 ear_deaf += 60 - if (prob(50) && !shielded) + if(prob(50) && !shielded) Paralyse(10) var/update = 0 @@ -368,19 +379,19 @@ for(var/obj/item/organ/external/temp in organs) switch(temp.limb_name) if("head") - update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message) if("chest") - update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message) if("groin") - update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message) if("l_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("l_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_foot") update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message) if("l_foot") @@ -394,12 +405,12 @@ ..() /mob/living/carbon/human/blob_act() - if(stat == DEAD) return + if(stat == DEAD) + return show_message("The blob attacks you!") var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee")) - return /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob) if(M.melee_damage_upper == 0) @@ -505,7 +516,7 @@ stuttering = power Stun(power) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() diff --git a/code/modules/mob/living/carbon/human/human_attackalien.dm b/code/modules/mob/living/carbon/human/human_attackalien.dm index f948cdb2b3b..015c73455ba 100644 --- a/code/modules/mob/living/carbon/human/human_attackalien.dm +++ b/code/modules/mob/living/carbon/human/human_attackalien.dm @@ -1,51 +1,50 @@ /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if(check_shields(0, M.name)) - visible_message("\red [M] attempted to touch [src]!") + visible_message("[M] attempted to touch [src]!") return 0 switch(M.a_intent) - if (I_HELP) - visible_message(text("\blue [M] caresses [src] with its scythe like arm.")) - if (I_GRAB) + if(I_HELP) + visible_message("[M] caresses [src] with its scythe like arm.") + + if(I_GRAB) grabbedby(M) if(I_HARM) M.do_attack_animation(src) - if (w_uniform) + if(w_uniform) w_uniform.add_fingerprint(M) + var/damage = rand(15, 30) if(!damage) playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1) - visible_message("\red [M] has lunged at [src]!") + visible_message("[M] has lunged at [src]!") return 0 + var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) var/armor_block = run_armor_check(affecting, "melee") playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - visible_message("\red [M] has slashed at [src]!") + visible_message("[M] has slashed at [src]!") apply_damage(damage, BRUTE, affecting, armor_block) - if (damage >= 25) - visible_message("\red [M] has wounded [src]!") + if(damage >= 25) + visible_message("[M] has wounded [src]!") apply_effect(4, WEAKEN, armor_block) updatehealth() if(I_DISARM) M.do_attack_animation(src) - var/randn = rand(1, 100) - if (randn <= 80) + if(prob(80)) var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) apply_effect(5, WEAKEN, run_armor_check(affecting, "melee")) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has tackled down []!", M, src), 1) + visible_message("[M] has tackled down [src]!") else - if (randn <= 99) + if(prob(99)) //this looks fucking stupid but it was previously 'var/randn = rand(1, 100); if(randn <= 99)' playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) drop_item() - visible_message(text("\red [] disarmed []!", M, src)) + visible_message("[M] disarmed [src]!") else playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1) - visible_message(text("\red [] has tried to disarm []!", M, src)) - return \ No newline at end of file + visible_message("[M] has tried to disarm [src]!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index faaba025181..28943a4c22b 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -4,26 +4,30 @@ health = 100 stat = CONSCIOUS return - var/total_burn = 0 - var/total_brute = 0 + + var/total_burn = 0 + var/total_brute = 0 + for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit - total_brute += O.brute_dam + total_brute += O.brute_dam //calculates health based on organ brute and burn total_burn += O.burn_dam + health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute + //TODO: fix husking - if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist - ChangeToHusk() + if(((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 is the magic human max health number + ChangeToHusk() //BECAUSE NO ONE THOUGHT TO USE LIVING/VAR/MAXHEALTH I GUESS if(species.can_revive_by_healing) var/obj/item/organ/brain/B = internal_organs_by_name["brain"] if(B) - if((health >= (config.health_threshold_dead/100*75)) && stat == DEAD) + if((health >= (config.health_threshold_dead / 100 * 75)) && stat == DEAD) update_revive() - if (stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix + if(stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix update_revive() - return /mob/living/carbon/human/adjustBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 //godmode if(species && species.has_organ["brain"]) var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] @@ -36,7 +40,8 @@ brainloss = 0 /mob/living/carbon/human/setBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 //godmode if(species && species.has_organ["brain"]) var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] @@ -49,7 +54,8 @@ brainloss = 0 /mob/living/carbon/human/getBrainLoss() - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 //godmode if(species && species.has_organ["brain"]) var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] @@ -143,34 +149,39 @@ return var/heal_prob = max(0, 80 - getCloneLoss()) - var/mut_prob = min(80, getCloneLoss()+10) - if (amount > 0) - if (prob(mut_prob)) - var/list/obj/item/organ/external/candidates = list() - for (var/obj/item/organ/external/O in organs) - if(O.status & ORGAN_ROBOT) continue + var/mut_prob = min(80, getCloneLoss() + 10) + if(amount > 0) //cloneloss is being added + if(prob(mut_prob)) + var/list/obj/item/organ/external/candidates = list() //TYPECASTED LISTS ARE NOT A FUCKING THING WHAT THE FUCK + for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_ROBOT) + continue if(!(O.status & ORGAN_MUTATED)) candidates |= O - if (candidates.len) + + if(candidates.len) var/obj/item/organ/external/O = pick(candidates) O.mutate() - src << "Something is not right with your [O.name]..." + src << "Something is not right with your [O.name]..." O.add_autopsy_data("Mutation", amount) return - else - if (prob(heal_prob)) - for (var/obj/item/organ/external/O in organs) - if (O.status & ORGAN_MUTATED) + + else //cloneloss is being subtracted + if(prob(heal_prob)) + for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." + src << "Your [O.name] is shaped normally again." return - if (getCloneLoss() < 1) - for (var/obj/item/organ/external/O in organs) - if (O.status & ORGAN_MUTATED) + + if(getCloneLoss() < 1) //no cloneloss, fixes organs + for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." - hud_updateflag |= 1 << HEALTH_HUD + src << "Your [O.name] is shaped normally again." + + hud_updateflag |= 1 << HEALTH_HUD //what even is this shit // Defined here solely to take species flags into account without having to recast at mob/living level. /mob/living/carbon/human/getOxyLoss() @@ -186,7 +197,7 @@ /mob/living/carbon/human/setOxyLoss(var/amount) if(species.flags & NO_BREATHE) - oxyloss = 0 + oxyloss = 0 //this literally overrides three procs, excessive much? else ..() @@ -203,7 +214,7 @@ /mob/living/carbon/human/setToxLoss(var/amount) if(species.flags & NO_POISON) - toxloss = 0 + toxloss = 0 //this *also* overrides three procs, definately excessive else ..() @@ -230,7 +241,8 @@ //It automatically updates health status /mob/living/carbon/human/heal_organ_damage(var/brute, var/burn) var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) - if(!parts.len) return + if(!parts.len) + return var/obj/item/organ/external/picked = pick(parts) if(picked.heal_damage(brute,burn)) UpdateDamageIcon() @@ -242,7 +254,8 @@ //It automatically updates health status /mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0) var/list/obj/item/organ/external/parts = get_damageable_organs() - if(!parts.len) return + if(!parts.len) + return var/obj/item/organ/external/picked = pick(parts) if(picked.take_damage(brute,burn,sharp,edge)) UpdateDamageIcon() @@ -256,7 +269,7 @@ var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) var/update = 0 - while(parts.len && (brute>0 || burn>0) ) + while(parts.len && ( brute > 0 || burn > 0) ) var/obj/item/organ/external/picked = pick(parts) var/brute_was = picked.brute_dam @@ -268,15 +281,19 @@ burn -= (burn_was-picked.burn_dam) parts -= picked + updatehealth() hud_updateflag |= 1 << HEALTH_HUD speech_problem_flag = 1 - if(update) UpdateDamageIcon() + if(update) + UpdateDamageIcon() // damage MANY external organs, in random order /mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) - if(status_flags & GODMODE) return //godmode + if(status_flags & GODMODE) + return //godmode var/list/obj/item/organ/external/parts = get_damageable_organs() + var/update = 0 while(parts.len && (brute>0 || burn>0) ) var/obj/item/organ/external/picked = pick(parts) @@ -289,9 +306,11 @@ burn -= (picked.burn_dam - burn_was) parts -= picked + updatehealth() hud_updateflag |= 1 << HEALTH_HUD - if(update) UpdateDamageIcon() + if(update) + UpdateDamageIcon() //////////////////////////////////////////// @@ -302,7 +321,7 @@ This function restores the subjects blood to max. /mob/living/carbon/human/proc/restore_blood() if(!(species.flags & NO_BLOOD)) var/blood_volume = vessel.get_reagent_amount("blood") - vessel.add_reagent("blood",560.0-blood_volume) + vessel.add_reagent("blood", 560.0 - blood_volume) /* This function restores all organs. @@ -314,47 +333,43 @@ This function restores all organs. /mob/living/carbon/human/proc/HealDamage(zone, brute, burn) var/obj/item/organ/external/E = get_organ(zone) if(istype(E, /obj/item/organ/external)) - if (E.heal_damage(brute, burn)) + if(E.heal_damage(brute, burn)) UpdateDamageIcon() hud_updateflag |= 1 << HEALTH_HUD else return 0 - return /mob/living/carbon/human/proc/get_organ(var/zone) - if(!zone) zone = "chest" - if (zone in list( "eyes", "mouth" )) + if(!zone) + zone = "chest" + if(zone in list("eyes", "mouth")) zone = "head" + return organs_by_name[zone] /mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null) - - //visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]") - //Handle other types of damage if((damagetype != BRUTE) && (damagetype != BURN)) - if(damagetype == HALLOSS) - if ((damage > 25 && prob(20)) || (damage > 50 && prob(60))) - emote("scream") - - ..(damage, damagetype, def_zone, blocked) return 1 //Handle BRUTE and BURN damage handle_suit_punctures(damagetype, damage) - blocked = (100-blocked)/100 - if(blocked <= 0) return 0 + blocked = (100 - blocked) / 100 + if(blocked <= 0) + return 0 var/obj/item/organ/external/organ = null if(isorgan(def_zone)) organ = def_zone else - if(!def_zone) def_zone = ran_zone(def_zone) + if(!def_zone) + def_zone = ran_zone(def_zone) organ = get_organ(check_zone(def_zone)) - if(!organ) return 0 + if(!organ) + return 0 damage = damage * blocked @@ -362,28 +377,33 @@ This function restores all organs. if(BRUTE) damageoverlaytemp = 20 if(species && species.brute_mod) - damage = damage*species.brute_mod + damage = damage * species.brute_mod + if(organ.take_damage(damage, 0, sharp, edge, used_weapon)) UpdateDamageIcon() - if(LAssailant && ishuman(LAssailant)) + + if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers var/mob/living/carbon/human/H = LAssailant if(H.mind && H.mind in (ticker.mode.superheroes || ticker.mode.supervillains || ticker.mode.greyshirts)) var/list/attack_bubble_recipients = list() var/mob/living/user for(var/mob/O in viewers(user, src)) - if (O.client && !( O.blinded )) + if (O.client && !(O.blinded)) attack_bubble_recipients.Add(O.client) spawn(0) var/image/dmgIcon = image('icons/effects/hit_blips.dmi', src, "dmg[rand(1,2)]",MOB_LAYER+1) dmgIcon.pixel_x = (!lying) ? rand(-3,3) : rand(-11,12) dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1) - //world << "x: [dmgIcon.pixel_x] AND y: [dmgIcon.pixel_y]" flick_overlay(dmgIcon, attack_bubble_recipients, 9) + receive_damage() + if(BURN) damageoverlaytemp = 20 + if(species && species.burn_mod) - damage = damage*species.burn_mod + damage = damage * species.burn_mod + if(organ.take_damage(0, damage, sharp, edge, used_weapon)) UpdateDamageIcon() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 56d197e3b88..1ea23ebf53a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -477,4 +477,4 @@ emp_act /mob/living/carbon/human/water_act(volume, temperature, source) ..() if(temperature >= 330) bodytemperature = bodytemperature + (temperature - bodytemperature) - if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) \ No newline at end of file + if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index c791222d312..39bdd785530 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -14,6 +14,10 @@ var/health_deficiency = (100 - health + staminaloss) + if(reagents) + for(var/datum/reagent/R in reagents.reagent_list) + if(R.shock_reduction) + health_deficiency -= R.shock_reduction if(health_deficiency >= 40) tally += (health_deficiency / 25) @@ -43,6 +47,8 @@ if(RUN in mutations) tally = -1 + if(HULK in mutations) + tally += 1 if(status_flags & IGNORESLOWDOWN) // make sure this is always at the end so we don't have ignore slowdown getting ignored itself tally = -1 @@ -51,7 +57,7 @@ if(status_flags & GOTTAGOREALLYFAST) tally -= 2 - return (tally+config.human_delay) + return (tally + config.human_delay) /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) @@ -89,4 +95,4 @@ if(!has_gravity(loc)) return var/obj/item/clothing/shoes/S = shoes - S.step_action(src) + S.step_action(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 63ffbf93de8..c891c9e2cd2 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -132,7 +132,7 @@ custom_emote(1, "drops what they were holding, their [E.name] malfunctioning!") - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) spark_system.start() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 03cde195fe4..fe373bf3280 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -90,7 +90,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(life_tick == 1) regenerate_icons() // Make sure the inventory updates - /mob/living/carbon/human/calculate_affecting_pressure(var/pressure) ..() var/pressure_difference = abs( pressure - ONE_ATMOSPHERE ) @@ -136,6 +135,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc var/y_offset = pixel_y + rand(-1,1) animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1) animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y), time = 1) + if (disabilities & NERVOUS) speech_problem_flag = 1 if (prob(10)) @@ -143,12 +143,38 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if (getBrainLoss() >= 60 && stat != 2) speech_problem_flag = 1 - if (prob(3)) + if(prob(3)) + var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH", + "without oxigen blob don't evoluate?", + "CAPTAINS A COMDOM", + "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", + "can u give me [pick("telikesis","halk","eppilapse")]?", + "THe saiyans screwed", + "Bi is THE BEST OF BOTH WORLDS>", + "I WANNA PET TEH monkeyS", + "stop grifing me!!!!", + "SOTP IT#") + + var/list/s2 = list("FUS RO DAH", + "fucking 4rries!", + "stat me", + ">my face", + "roll it easy!", + "waaaaaagh!!!", + "red wonz go fasta", + "FOR TEH EMPRAH", + "lol2cat", + "dem dwarfs man, dem dwarfs", + "SPESS MAHREENS", + "hwee did eet fhor khayosss", + "lifelike texture ;_;", + "luv can bloooom", + "PACKETS!!!") switch(pick(1,2,3)) if(1) - say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#")) + say(pick(s1)) if(2) - say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!")) + say(pick(s2)) if(3) emote("drool") @@ -336,27 +362,37 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc /mob/living/carbon/human/get_breath_from_internal(volume_needed) //making this call the parent would be far too complicated - var/null_internals = 0 + if(internal) - if(istype(back, /obj/item/weapon/rig)) - var/obj/item/weapon/rig/rig = back - if(rig.offline && (rig.air_supply && internal == rig.air_supply)) - null_internals = 1 + var/null_internals = 0 //internals are invalid, therefore turn them off + var/skip_contents_check = 0 //rigsuit snowflake, oxygen tanks aren't stored inside the mob, so the 'contents.Find' check has to be skipped. - if(!(wear_mask && (wear_mask.flags & AIRTIGHT))) //not wearing mask - if(!(head && (head.flags & AIRTIGHT))) //not wearing helmet - null_internals = 1 + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) //if NOT (wear_mask AND wear_mask.flags CONTAIN AIRTIGHT) + if(!(head && head.flags & AIRTIGHT)) //if NOT (head AND head.flags CONTAIN AIRTIGHT) + null_internals = 1 //not wearing a mask or suitable helmet - if(null_internals) - internal = null + if(istype(back, /obj/item/weapon/rig)) //wearing a rigsuit + var/obj/item/weapon/rig/rig = back //needs to be typecasted because this doesn't use get_rig() for some reason + if(rig.offline && (rig.air_supply && internal == rig.air_supply)) //if rig IS offline AND (rig HAS air_supply AND internal IS air_supply) + null_internals = 1 //offline suits do not breath - if(internal) - if(internals) - internals.icon_state = "internal1" - return internal.remove_air_volume(volume_needed) - else - if(internals) - internals.icon_state = "internal0" + else if(rig.air_supply && internal == rig.air_supply) //if rig HAS air_supply AND internal IS rig air_supply + skip_contents_check = 1 //skip contents.Find() check, the oxygen is valid even being outside of the mob + + if(!contents.Find(internal) && (!skip_contents_check)) //if internal NOT IN contents AND skip_contents_check IS false + null_internals = 1 //not a rigsuit and your oxygen is gone + + if(null_internals) //something wants internals gone + internal = null //so do it + + + if(internal) //check for hud updates every time this is called + if(internals) + internals.icon_state = "internal1" + return internal.remove_air_volume(volume_needed) //returns the valid air + else + if(internals) + internals.icon_state = "internal0" return null @@ -785,112 +821,67 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return //TODO: DEFERRED /mob/living/carbon/human/handle_regular_status_updates() - if(status_flags & GODMODE) return 0 + . = ..() + //SSD check, if a logged player is awake put them back to sleep! if(player_logged && sleeping < 2) sleeping = 2 - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - blinded = 1 - silent = 0 - else //ALIVE. LIGHTS ARE ON - + if(.) //alive if(REGEN in mutations) if(nutrition) if(prob(10)) - var/randumb = rand(1,5) + var/randumb = rand(1, 5) nutrition -= randumb - heal_overall_damage(randumb,randumb) + heal_overall_damage(randumb, randumb) if(nutrition < 0) nutrition = 0 - // Sobering multiplier. - // Sober block grants quadruple the alcohol metabolism. -// var/sober_str=!(SOBER in mutations)?1:4 - - updatehealth() //TODO if(!in_stasis) - handle_organs() //Optimized. + handle_organs() handle_blood() - if(health <= config.health_threshold_dead || brain_op_stage == 4.0) - death() - blinded = 1 - silent = 0 - return 1 - - // the analgesic effect wears off slowly + //the analgesic effect wears off slowly analgesic = max(0, analgesic - 1) - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) - Paralyse(3) - - /* Done by handle_breath() - if( health <= 20 && prob(1) ) - spawn(0) - emote("gasp") - if(!reagents.has_reagent("epinephrine")) - adjustOxyLoss(1)*/ - if(hallucination && !(species.flags & NO_DNA_RAD)) - spawn handle_hallucinations() + spawn() + handle_hallucinations() - if(hallucination<=2) + if(hallucination <= 2) hallucination = 0 halloss = 0 else hallucination -= 2 - - if(halloss > 100) - src << "You're in too much pain to keep going..." - for(var/mob/O in oviewers(src, null)) - O.show_message("[src] slumps to the ground, too weak to continue fighting.", 1) - Paralyse(10) - setHalLoss(99) - if(paralysis) blinded = 1 stat = UNCONSCIOUS - if(halloss > 0) - adjustHalLoss(-3) + else if(sleeping) speech_problem_flag = 1 - handle_dreams() - adjustStaminaLoss(-10) - adjustHalLoss(-3) - if (mind) + + if(mind) //Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of ether or similar. if(player_logged) - sleeping = max(sleeping-1, 2) - else - sleeping = max(sleeping-1, 0) + sleeping = max(sleeping - 1, 2) + blinded = 1 stat = UNCONSCIOUS - if( prob(2) && health && !hal_crit ) - spawn(0) - emote("snore") + if(mind) if(mind.vampire) if(istype(loc, /obj/structure/closet/coffin)) adjustBruteLoss(-1) adjustFireLoss(-1) adjustToxLoss(-1) + else if(status_flags & FAKEDEATH) blinded = 1 stat = UNCONSCIOUS - else if(resting) - if(halloss > 0) - adjustHalLoss(-3) - //CONSCIOUS - else - stat = CONSCIOUS - if(halloss > 0) - adjustHalLoss(-1) if(embedded_flag && !(mob_master.current_cycle % 10)) var/list/E @@ -898,7 +889,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(!E.len) embedded_flag = 0 - //Vision + + //Vision //god knows why this is here var/obj/item/organ/vision if(species.vision_organ) vision = internal_organs_by_name[species.vision_organ] @@ -907,17 +899,21 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc eye_blind = 0 blinded = 0 eye_blurry = 0 + else if(!vision || vision.is_broken()) // Vision organs cut out or broken? Permablind. eye_blind = 1 blinded = 1 eye_blurry = 1 + else //blindness if(sdisabilities & BLIND) // Disabled-blind, doesn't get better on its own blinded = 1 + else if(eye_blind) // Blindness, heals slowly over time eye_blind = max(eye_blind-1,0) blinded = 1 + else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster eye_blurry = max(eye_blurry-3, 0) blinded = 1 @@ -925,59 +921,26 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc //blurry sight if(vision.is_bruised()) // Vision organs impaired? Permablurry. eye_blurry = 1 + if(eye_blurry) // Blurry eyes heal slowly eye_blurry = max(eye_blurry-1, 0) + //Ears if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own ear_deaf = max(ear_deaf, 1) + else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) + ear_deaf = max(ear_deaf - 1, 0) + else if(istype(l_ear, /obj/item/clothing/ears/earmuffs) || istype(r_ear, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster - ear_damage = max(ear_damage-0.15, 0) + ear_damage = max(ear_damage - 0.15, 0) ear_deaf = max(ear_deaf, 1) + else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - ear_damage = max(ear_damage-0.05, 0) + ear_damage = max(ear_damage - 0.05, 0) - //Dizziness - if(dizziness) - var/client/C = client - var/pixel_x_diff = 0 - var/pixel_y_diff = 0 - var/temp - var/saved_dizz = dizziness - dizziness = max(dizziness-1, 0) - if(C) - var/oldsrc = src - var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength - src = null - spawn(0) - if(C) - temp = amplitude * sin(0.008 * saved_dizz * world.time) - pixel_x_diff += temp - C.pixel_x += temp - temp = amplitude * cos(0.008 * saved_dizz * world.time) - pixel_y_diff += temp - C.pixel_y += temp - sleep(3) - if(C) - temp = amplitude * sin(0.008 * saved_dizz * world.time) - pixel_x_diff += temp - C.pixel_x += temp - temp = amplitude * cos(0.008 * saved_dizz * world.time) - pixel_y_diff += temp - C.pixel_y += temp - sleep(3) - if(C) - C.pixel_x -= pixel_x_diff - C.pixel_y -= pixel_y_diff - src = oldsrc - //Jitteryness - if(jitteriness) - do_jitter_animation(jitteriness) - - //Flying if(flying) spawn() animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING) @@ -989,9 +952,11 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(gloves && germ_level > gloves.germ_level && prob(10)) gloves.germ_level += 1 - CheckStamina() - return 1 + else //dead + blinded = 1 + silent = 0 + /mob/living/carbon/human/handle_vision() client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) @@ -1446,6 +1411,30 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc holder.icon_state = "hudshadowlingthrall" hud_list[SPECIALROLE_HUD] = holder + + if(hud_updateflag & 1 << NATIONS_HUD) + var/image/holder = hud_list[NATIONS_HUD] + holder.icon_state = "hudblank" + + if(mind && mind.nation) + switch(mind.nation.default_name) + if("Atmosia") + holder.icon_state = "hudatmosia" + if("Brigston") + holder.icon_state = "hudbrigston" + if("Cargonia") + holder.icon_state = "hudcargonia" + if("People's Republic of Commandzakstan") + holder.icon_state = "hudcommand" + if("Servicion") + holder.icon_state = "hudservice" + if("Medistan") + holder.icon_state = "hudmedistan" + if("Scientopia") + holder.icon_state = "hudscientopia" + + hud_list[NATIONS_HUD] = holder + hud_updateflag = 0 /mob/living/carbon/human/handle_silent() @@ -1480,6 +1469,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return + // Need this in species. //#undef HUMAN_MAX_OXYLOSS //#undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index 3e888c026f8..3727bd8de0a 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -1,7 +1,7 @@ /datum/species/shadow name = "Shadow" name_plural = "Shadows" - + icobase = 'icons/mob/human_races/r_shadow.dmi' deform = 'icons/mob/human_races/r_shadow.dmi' @@ -12,7 +12,6 @@ blood_color = "#CCCCCC" flesh_color = "#AAAAAA" - has_organ = list( "brain" = /obj/item/organ/brain ) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index c65756fce62..6462d413e7b 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -78,7 +78,6 @@ //Used in icon caching. var/race_key = 0 var/icon/icon_template - var/is_small var/show_ssd = 1 var/virus_immune @@ -507,7 +506,7 @@ if(2) H.healths.icon_state = "health7" if(5) H.healths.icon_state = "health0" else - switch(H.health - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss) + switch(100 - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss) if(100 to INFINITY) H.healths.icon_state = "health0" if(80 to 100) H.healths.icon_state = "health1" if(60 to 80) H.healths.icon_state = "health2" diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 26ef94d472a..9f9c0642988 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -53,7 +53,6 @@ heat_level_3_breathe = 1100 //Default 1000 flesh_color = "#34AF10" - reagent_tag = PROCESS_ORG base_color = "#066000" @@ -98,7 +97,6 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI - reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" base_color = "#333333" @@ -134,7 +132,6 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI - reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#BE8264" @@ -163,7 +160,6 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = DIET_HERB - flesh_color = "#8CD7A3" blood_color = "#1D2CBF" reagent_tag = PROCESS_ORG @@ -179,7 +175,6 @@ language = "Vox-pidgin" speech_sounds = list('sound/voice/shriek1.ogg') speech_chance = 20 - unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ @@ -309,7 +304,6 @@ clothing_flags = HAS_SOCKS bodyflags = FEET_CLAWS dietflags = DIET_HERB - blood_color = "#FB9800" reagent_tag = PROCESS_ORG @@ -328,7 +322,6 @@ bodyflags = HAS_SKIN_COLOR bloodflags = BLOOD_SLIME dietflags = DIET_CARN - reagent_tag = PROCESS_ORG //ventcrawler = 1 //ventcrawling commented out @@ -355,7 +348,6 @@ flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_HERB - reagent_tag = PROCESS_ORG blood_color = "#A200FF" @@ -368,6 +360,7 @@ C.dna.SetSEState(REMOTETALKBLOCK,0,1) C.mutations -= REMOTE_TALK genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) + C.mutations.Add(GREY) C.update_mutations() ..() @@ -408,7 +401,6 @@ dietflags = 0 //Diona regenerate nutrition in light, no diet necessary body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - blood_color = "#004400" flesh_color = "#907E4A" @@ -499,7 +491,7 @@ passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD | NO_POISON clothing_flags = HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = 0 //IPCs can't eat, so no diet diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ee7dcedec56..33af21120de 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -296,8 +296,8 @@ if(sleeping) handle_dreams() adjustStaminaLoss(-10) - sleeping = max(sleeping-1, 0) - if( prob(10) && health && !hal_crit ) + sleeping = max(sleeping - 1, 0) + if(prob(10) && health && !hal_crit) spawn(0) emote("snore") diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index d6c1e083176..4abae727c73 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -602,6 +602,8 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 Uses = 3 enhanced = 1 qdel(O) + if(istype(O,/obj/item/weapon/storage/bag)) + ..() /obj/item/slime_extract/New() ..() @@ -720,43 +722,11 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame." icon = 'icons/obj/chemical.dmi' icon_state = "bottle19" + w_class = 1 + origin_tech = "biotech=4" attack(mob/living/carbon/slime/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - user << " The potion only works on baby slimes!" - return ..() - if(M.is_adult) //Can't tame adults - user << " Only baby slimes can be tamed!" - return..() - if(M.stat) - user << " The slime is dead!" - return..() - if(M.mind) - user << " The slime resists!" - return ..() - var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) - pet.icon_state = "[M.colour] baby slime" - pet.icon_living = "[M.colour] baby slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - user <<"You feed the slime the potion, removing it's powers and calming it." - qdel(M) - var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) - - if (!newname) - newname = "pet slime" - pet.name = newname - pet.real_name = newname - qdel(src) - -/obj/item/weapon/slimepotion2 - name = "advanced docility potion" - desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame. This one is meant for adult slimes" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle19" - - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime/))//If target is not a slime. user << " The potion only works on slimes!" return ..() if(M.stat) @@ -765,20 +735,107 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 if(M.mind) user << " The slime resists!" return ..() - var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) - pet.icon_state = "[M.colour] adult slime" - pet.icon_living = "[M.colour] adult slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - user <<"You feed the slime the potion, removing it's powers and calming it." - qdel(M) - var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) + if(M.is_adult) + var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) + pet.icon_state = "[M.colour] adult slime" + pet.icon_living = "[M.colour] adult slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + qdel(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) - if (!newname) - newname = "pet slime" - pet.name = newname - pet.real_name = newname + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + qdel(src) + else + var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) + pet.icon_state = "[M.colour] baby slime" + pet.icon_living = "[M.colour] baby slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + qdel(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) + + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + qdel(src) + user <<"You feed the slime the potion, removing it's powers and calming it." + +/obj/item/weapon/sentience_potion + name = "sentience potion" + desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle19" + origin_tech = "biotech=5" + var/list/not_interested = list() + var/being_used = 0 + w_class = 1 + + +/obj/item/weapon/sentience_potion/afterattack(mob/living/M, mob/user) + if(being_used || !ismob(M)) + return + if(!isslime(M) && !isanimal(M) || M.ckey) //only works on animals that aren't player controlled + user << "[M] is already too intelligent for this to work!" + return ..() + if(M.stat) + user << "[M] is dead!" + return..() + + user << "You offer the sentience potion to [M]..." + being_used = 1 + + var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET) + + shuffle(candidates) + + var/time_passed = world.time + var/list/consenting_candidates = list() + + for(var/candidate in candidates) + + if(candidate in not_interested) + continue + + spawn(0) + switch(alert(candidate, "Would you like to play as [M.name]? Please choose quickly!","Confirmation","Yes","No")) + if("Yes") + if((world.time-time_passed)>=50 || !src) + return + consenting_candidates += candidate + if("No") + if(!src) + return + not_interested += candidate + + sleep(50) + + if(!src) + return + + listclearnulls(consenting_candidates) //some candidates might have left during sleep(50) + + if(consenting_candidates.len) + var/client/C = null + C = pick(consenting_candidates) + M.key = C.key + M.universal_speak = 1 + M.faction |= "sentient" + M << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!" + M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." + user << "[M] accepts the potion and suddenly becomes attentive and aware. It worked!" + if(isanimal(M)) + var/mob/living/simple_animal/S = M + S.master_commander = user qdel(src) + else + user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later." + being_used = 0 + ..() /obj/item/weapon/slimesteroid @@ -786,6 +843,9 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 desc = "A potent chemical mix that will cause a slime to generate more extract." icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" + w_class = 1 + origin_tech = "biotech=4" + attack(mob/living/carbon/slime/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. @@ -810,6 +870,60 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 desc = "A potent chemical mix that will give a slime extract three uses." icon = 'icons/obj/chemical.dmi' icon_state = "bottle17" + w_class = 1 + origin_tech = "biotech=4" + + +/obj/item/weapon/slimespeed + name = "slime speed potion" + desc = "A potent chemical mix that will remove the slowdown from any item." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle3" + w_class = 1 + origin_tech = "biotech=4" + +/obj/item/weapon/slimespeed/afterattack(obj/item/C, mob/user) + ..() + if(!istype(C)) + user << "The potion can only be used on items!" + return + if(C.slowdown <= 0) + user << "The [C] can't be made any faster!" + return..() + user <<"You slather the red gunk over the [C], making it faster." + C.color = "#FF0000" + C.slowdown = 0 + qdel(src) + +/obj/item/weapon/slimefireproof + name = "slime chill potion" + desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + var/uses = 3 + w_class = 1 + origin_tech = "biotech=4" + + +/obj/item/weapon/slimefireproof/afterattack(obj/item/clothing/C, mob/user) + ..() + if(!uses) + qdel(src) + return + if(!istype(C)) + user << "The potion can only be used on clothing!" + return + if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) + user << "The [C] is already fireproof!" + return..() + user <<"You slather the blue gunk over the [C], fireproofing it." + C.name = "fireproofed [C.name]" + C.color = "#000080" + C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + C.heat_protection = C.body_parts_covered + uses -- + if(!uses) + qdel(src) /obj/effect/goleRUNe diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 60cd33d689d..0b1ee60a3ea 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -56,7 +56,8 @@ if(client) regular_hud_updates() //THIS DOESN'T FUCKING UPDATE SHIT handle_regular_hud_updates() //IT JUST REMOVES FUCKING HUD IMAGES - + if(get_nations_mode()) + process_nations() /mob/living/proc/handle_breathing() return @@ -301,4 +302,11 @@ if(!hud_used.hide_actions_toggle.moved) hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1) - client.screen += hud_used.hide_actions_toggle \ No newline at end of file + client.screen += hud_used.hide_actions_toggle + + +/mob/living/proc/process_nations() + if(client) + var/client/C = client + for(var/mob/living/carbon/human/H in view(src, world.view)) + C.images += H.hud_list[NATIONS_HUD] \ No newline at end of file diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 5e5847c0ab8..72035ee078b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -85,9 +85,13 @@ proc/get_radio_key_from_channel(var/channel) verb = "stammers" speech_problem_flag = 1 - if(COMIC in mutations) + if(GREY in mutations) + message = "[message]" + + else if(COMIC in mutations) message = "[message]" + returns[1] = message returns[2] = verb returns[3] = speech_problem_flag @@ -251,7 +255,11 @@ proc/get_radio_key_from_channel(var/channel) if(M.client) speech_bubble_recipients.Add(M.client) spawn(0) - flick_overlay(image('icons/mob/talk.dmi', src, "h[speech_bubble_test]",MOB_LAYER+1), speech_bubble_recipients, 30) + if(loc && !isturf(loc)) + var/atom/A = loc //Non-turf, let it handle the speech bubble + A.speech_bubble("hR[speech_bubble_test]", A.loc, speech_bubble_recipients) + else //Turf, leave speech bubbles to the mob + speech_bubble("h[speech_bubble_test]", src, speech_bubble_recipients) for(var/obj/O in listening_obj) spawn(0) @@ -426,3 +434,6 @@ proc/get_radio_key_from_channel(var/channel) log_whisper("[src.name]/[src.key] : [message]") return 1 + +/mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list()) + flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index d9dececdae8..7254d619f62 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -183,6 +183,7 @@ var/list/ai_verbs_default = list( hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[NATIONS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") ai_list += src ..() diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 7523a30c162..8d1125982aa 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -55,7 +55,6 @@ aiRestorePowerRoutine = 0 blind.layer = 0 - return else @@ -154,6 +153,9 @@ if (MED_HUD) process_med_hud(src, 1, eyeobj) + if(get_nations_mode()) + process_nations_ai() + /mob/living/silicon/ai/updatehealth() if(status_flags & GODMODE) health = 100 @@ -171,4 +173,10 @@ /mob/living/silicon/ai/rejuvenate() ..() - add_ai_verbs(src) \ No newline at end of file + add_ai_verbs(src) + +/mob/living/silicon/ai/proc/process_nations_ai() + if(client) + var/client/C = client + for(var/mob/living/carbon/human/H in view(eyeobj, 14)) + C.images += H.hud_list[NATIONS_HUD] \ No newline at end of file diff --git a/code/modules/mob/living/silicon/mommi/mommi.dm b/code/modules/mob/living/silicon/mommi/mommi.dm index 9fe7884ff29..b904b7d72f6 100644 --- a/code/modules/mob/living/silicon/mommi/mommi.dm +++ b/code/modules/mob/living/silicon/mommi/mommi.dm @@ -30,7 +30,7 @@ They can only use one tool at a time, they can't choose modules, and they have 1 return 1 /mob/living/silicon/robot/mommi/New(loc) - spark_system = new /datum/effect/effect/system/spark_spread() + spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 38c7df68aa3..6a981464bd5 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -16,6 +16,7 @@ for (var/mob/M in viewers(T)) M.show_message("\red The data cable rapidly retracts back into its spool.", 3, "\red You hear a click and the sound of wire spooling rapidly.", 2) qdel(src.cable) + cable = null /mob/living/silicon/pai/updatehealth() if(status_flags & GODMODE) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index d00e209d2fb..2fd2ddcab61 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -6,7 +6,7 @@ robot_talk_understand = 0 emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person) small = 1 - pass_flags = 1 + pass_flags = PASSTABLE density = 0 holder_type = /obj/item/weapon/holder/pai var/network = "SS13" @@ -512,6 +512,10 @@ src << "You are far too small to pull anything!" return +/mob/living/silicon/pai/update_canmove() + . = ..() + density = 0 //this is reset every canmove update otherwise + /mob/living/silicon/pai/examine(mob/user) ..(user) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 4b657bb3181..ef36f5b94c9 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -92,8 +92,8 @@ var/global/list/default_pai_software = list() ui.set_auto_update(1) /mob/living/silicon/pai/Topic(href, href_list) - . = ..() - if(.) return + if(..()) + return 1 if(href_list["software"]) var/soft = href_list["software"] diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index bd7b023b5b6..8bd45097fef 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -11,7 +11,7 @@ pass_flags = PASSTABLE braintype = "Robot" lawupdate = 0 - density = 1 + density = 0 req_access = list(access_engine, access_robotics) local_transmit = 1 @@ -335,4 +335,8 @@ src.verbs |= silicon_subsystems /mob/living/silicon/robot/drone/remove_robot_verbs() - src.verbs -= silicon_subsystems \ No newline at end of file + src.verbs -= silicon_subsystems + +/mob/living/silicon/robot/drone/update_canmove() + . = ..() + density = 0 //this is reset every canmove update otherwise \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 9c1d8b79f92..b5587a50e5d 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -13,11 +13,11 @@ if(!O) return 0 - O.mouse_opacity = 2 + O.mouse_opacity = 2 if(istype(O,/obj/item/borg/sight)) var/obj/item/borg/sight/S = O sight_mode &= ~S.sight_mode - + if(client) client.screen -= O contents -= O @@ -45,6 +45,13 @@ if(activated(O)) src << "Already activated" return + if (is_component_functioning("power cell") && cell) + if(istype(O, /obj/item/borg)) + var/obj/item/borg/B = O + if(B.powerneeded) + if((cell.charge * 100 / cell.maxcharge) < B.powerneeded) + src << "Not enough power to activate [B.name]!" + return if(!module_state_1) O.mouse_opacity = initial(O.mouse_opacity) module_state_1 = O @@ -71,6 +78,7 @@ sight_mode |= module_state_3:sight_mode else src << "You need to disable a module first!" + src.update_icons() /mob/living/silicon/robot/proc/uneq_active() uneq_module(module_active) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 6512d1b8353..533bc1f7a2b 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -13,40 +13,42 @@ process_locks() process_queued_alarms() - /mob/living/silicon/robot/proc/clamp_values() SetStunned(min(stunned, 30)) SetParalysis(min(paralysis, 30)) SetWeakened(min(weakened, 20)) sleeping = 0 ear_deaf = 0 - adjustBruteLoss(0) - adjustToxLoss(0) - adjustOxyLoss(0) - adjustFireLoss(0) -/mob/living/silicon/robot/proc/use_power() + +/mob/living/silicon/robot/proc/use_power() if (is_component_functioning("power cell") && cell) - if(src.cell.charge <= 0) + if(module) + for(var/obj/item/borg/B in module.modules) + if(B.powerneeded) + if((cell.charge * 100 / cell.maxcharge) < B.powerneeded) + src << "Deactivating [B.name] due to lack of power!" + unEquip(B) + if(cell.charge <= 0) uneq_all() update_headlamp(1) - src.stat = UNCONSCIOUS + stat = UNCONSCIOUS has_power = 0 for(var/V in components) var/datum/robot_component/C = components[V] if(C.name == "actuator") // Let drained robots move, disable the rest continue C.consume_power() - else if (src.cell.charge <= 100) + else if(cell.charge <= 100) uneq_all() - src.cell.use(1) + cell.use(1) else - if(src.module_state_1) - src.cell.use(4) - if(src.module_state_2) - src.cell.use(4) - if(src.module_state_3) - src.cell.use(4) + if(module_state_1) + cell.use(4) + if(module_state_2) + cell.use(4) + if(module_state_3) + cell.use(4) for(var/V in components) var/datum/robot_component/C = components[V] @@ -57,131 +59,116 @@ if(!is_component_functioning("actuator")) Paralyse(3) - src.eye_blind = 0 - src.stat = 0 + eye_blind = 0 + stat = 0 has_power = 1 else uneq_all() - src.stat = UNCONSCIOUS + stat = UNCONSCIOUS update_headlamp(1) Paralyse(3) -/mob/living/silicon/robot/handle_regular_status_updates() - - if(src.camera && !scrambledcodes) - if(src.stat == 2 || wires.IsCameraCut()) - src.camera.status = 0 - else - src.camera.status = 1 - +/mob/living/silicon/robot/updatehealth() + if(status_flags & GODMODE) + health = maxHealth + stat = CONSCIOUS + return health = maxHealth - (getOxyLoss() + getFireLoss() + getBruteLoss()) - if(getOxyLoss() > 50) Paralyse(3) +/mob/living/silicon/robot/handle_regular_status_updates() - if(src.sleeping) + . = ..() + + if(camera && !scrambledcodes) + if(stat == DEAD || wires.IsCameraCut()) + camera.status = 0 + else + camera.status = 1 + + if(getOxyLoss() > 50) Paralyse(3) - src.sleeping-- - if(src.resting) + if(sleeping) + Paralyse(3) + sleeping-- + + if(resting) Weaken(5) - if(health <= config.health_threshold_dead && src.stat != 2) //die only once - death() + if(.) //alive + if(health <= config.health_threshold_dead) + death() + return - if (src.stat != 2) //Alive. - if(!istype(src,/mob/living/silicon/robot/drone)) + if(!istype(src, /mob/living/silicon/robot/drone)) if(health < 50) //Gradual break down of modules as more damage is sustained if(uneq_module(module_state_3)) src << "SYSTEM ERROR: Module 3 OFFLINE." + if(health < 0) if(uneq_module(module_state_2)) src << "SYSTEM ERROR: Module 2 OFFLINE." + if(health < -50) if(uneq_module(module_state_1)) src << "CRITICAL ERROR: All modules OFFLINE." - if (src.paralysis || src.stunned || src.weakened) //Stunned etc. - src.stat = 1 - if (src.stunned > 0) - AdjustStunned(-1) - if (src.weakened > 0) - AdjustWeakened(-1) - if (src.paralysis > 0) - AdjustParalysis(-1) - src.eye_blind = max(eye_blind, 1) - else - src.eye_blind = 0 + if(paralysis || stunned || weakened) + stat = UNCONSCIOUS - else //Not stunned. - src.stat = 0 + if(!paralysis > 0) + eye_blind = 0 - else //Dead. - src.eye_blind = 1 + else + stat = CONSCIOUS - if (src.stuttering) src.stuttering-- - - if (src.eye_blind) - src.eye_blind-- - - src.density = !( src.lying ) - - if (src.disabilities & BLIND) - src.eye_blind = max(1, eye_blind) - - if (src.eye_blurry > 0) - src.eye_blurry-- - src.eye_blurry = max(0, src.eye_blurry) - - if (src.druggy > 0) - src.druggy-- - src.druggy = max(0, src.druggy) + else //dead + eye_blind = 1 //update the state of modules and components here - if (src.stat != 0) + if(stat != CONSCIOUS) uneq_all() - if(!is_component_functioning("radio") || src.stat == 1) + if(!is_component_functioning("radio") || stat == UNCONSCIOUS) radio.on = 0 else radio.on = 1 - if(is_component_functioning("camera") && src.stat == 0) - src.blinded = 0 + if(is_component_functioning("camera") && stat == CONSCIOUS) + blinded = 0 else - src.blinded = 1 + blinded = 1 if(!is_component_functioning("actuator")) - src.Paralyse(3) - + Paralyse(3) return 1 /mob/living/silicon/robot/update_sight() - - if (src.stat == 2 || src.sight_mode & BORGXRAY) - src.sight |= SEE_TURFS - src.sight |= SEE_MOBS - src.sight |= SEE_OBJS - src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(stat == DEAD || sight_mode & BORGXRAY) + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO else - src.see_in_dark = 8 - if (src.sight_mode & BORGMESON && src.sight_mode & BORGTHERM) - src.sight |= SEE_TURFS - src.sight |= SEE_MOBS - src.see_invisible = SEE_INVISIBLE_MINIMUM - else if (src.sight_mode & BORGMESON) - src.sight |= SEE_TURFS - src.see_invisible = SEE_INVISIBLE_MINIMUM - src.see_in_dark = 1 - else if (src.sight_mode & BORGTHERM) - src.sight |= SEE_MOBS - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (src.stat != 2) - src.sight &= ~SEE_MOBS - src.sight &= ~SEE_TURFS - src.sight &= ~SEE_OBJS - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO + see_in_dark = 8 + if(sight_mode & BORGMESON && sight_mode & BORGTHERM) + sight |= SEE_TURFS + sight |= SEE_MOBS + see_invisible = SEE_INVISIBLE_MINIMUM + else if(sight_mode & BORGMESON) + sight |= SEE_TURFS + see_invisible = SEE_INVISIBLE_MINIMUM + see_in_dark = 1 + else if(sight_mode & BORGTHERM) + sight |= SEE_MOBS + see_invisible = SEE_INVISIBLE_LEVEL_TWO + else if(stat != DEAD) + sight &= ~SEE_MOBS + sight &= ~SEE_TURFS + sight &= ~SEE_OBJS + see_invisible = SEE_INVISIBLE_LEVEL_TWO if(see_override) see_invisible = see_override @@ -195,11 +182,11 @@ if(stat != DEAD) if(health >= maxHealth) healths.icon_state = "health0" - else if(health > maxHealth*0.5) + else if(health > maxHealth * 0.5) healths.icon_state = "health2" else if(health > 0) healths.icon_state = "health3" - else if(health > -maxHealth*0.5) + else if(health > -maxHealth * 0.5) healths.icon_state = "health4" else if(health > -maxHealth) healths.icon_state = "health5" @@ -264,6 +251,7 @@ mind.special_role = "traitor" ticker.mode.traitors += src.mind + ..() return 1 @@ -323,4 +311,4 @@ if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them IgniteMob() -//Robots on fire \ No newline at end of file +//Robots on fire diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 579bcec93d4..06bd83ed96f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -59,8 +59,8 @@ var/list/robot_verbs_default = list( var/modtype = "Default" var/lower_mod = 0 var/jetpack = 0 - var/datum/effect/effect/system/ion_trail_follow/ion_trail = null - var/datum/effect/effect/system/spark_spread/spark_system//So they can initialize sparks whenever/N + var/datum/effect/system/ion_trail_follow/ion_trail = null + var/datum/effect/system/spark_spread/spark_system//So they can initialize sparks whenever/N var/jeton = 0 var/has_power = 1 var/weapon_lock = 0 @@ -87,7 +87,7 @@ var/list/robot_verbs_default = list( var/obj/item/borg/sight/hud/med/healthhud = null /mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0) - spark_system = new /datum/effect/effect/system/spark_spread() + spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) @@ -149,6 +149,7 @@ var/list/robot_verbs_default = list( hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[NATIONS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") scanner.Grant(src) /mob/living/silicon/robot/proc/init(var/alien=0) @@ -219,9 +220,13 @@ var/list/robot_verbs_default = list( if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis) src << "\red Crisis mode active. Combat module available." modules+="Combat" + if(get_nations_mode()) + modules = list("Peacekeeper") if(mmi != null && mmi.alien) modules = "Hunter" - modtype = input("Please, select a module!", "Robot", null, null) in modules + modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules + if(!modtype) + return designation = modtype var/module_sprites[0] //Used to store the associations between sprite names and sprite index. @@ -296,6 +301,11 @@ var/list/robot_verbs_default = list( module.channels = list("Security" = 1) module_sprites["Combat Android"] = "droidcombat" + if("Peacekeeper") + module= new /obj/item/weapon/robot_module/peacekeeper(src) + module.channels = list() + module_sprites["Peacekeeper Android"] = "droidpeace" + if("Hunter") updatename(module) module = new /obj/item/weapon/robot_module/alien/hunter(src) @@ -1000,16 +1010,17 @@ var/list/robot_verbs_default = list( else overlays += "ov-openpanel -c" - if(module_active && istype(module_active,/obj/item/borg/combat/shield)) - overlays += "[icon_state]-shield" - - if(modtype == "Combat") + var/combat = list("Combat","Peacekeeper") + if(modtype in combat) if (base_icon == "") base_icon = icon_state if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) icon_state = "[base_icon]-roll" else icon_state = base_icon + for(var/obj/item/borg/combat/shield/S in module.modules) + if(activated(S)) + overlays += "[base_icon]-shield" if(jetpackoverlay) overlays += "minerjetpack-[icon_state]" @@ -1408,3 +1419,40 @@ var/list/robot_verbs_default = list( connected_ai.connected_robots |= src notify_ai(1) sync() + + +/mob/living/silicon/robot/combat/New() + ..() + module = new /obj/item/weapon/robot_module/combat(src) + module.channels = list("Security" = 1) + base_icon = "droidcombat" + icon_state = "droidcombat" + modtype = "Combat" + //languages + module.add_languages(src) + //subsystems + module.add_subsystems(src) + + updatename() + + status_flags &= ~CANPUSH + + radio.config(module.channels) + notify_ai(2) + +/mob/living/silicon/robot/peacekeeper/New() + ..() + module = new /obj/item/weapon/robot_module/peacekeeper(src) + base_icon = "droidpeace" + icon_state = "droidpeace" + modtype = "Peacekeeper" + //languages + module.add_languages(src) + //subsystems + module.add_subsystems(src) + + updatename() + + status_flags &= ~CANPUSH + + notify_ai(2) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index f01b7abbd7c..6628841fa40 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -67,8 +67,14 @@ return //Combat shielding absorbs a percentage of damage directly into the cell. - if(module_active && istype(module_active,/obj/item/borg/combat/shield)) - var/obj/item/borg/combat/shield/shield = module_active + var/obj/item/borg/combat/shield/shield + if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield)) + shield = module_state_1 + else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield)) + shield = module_state_2 + else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield)) + shield = module_state_3 + if(shield) //Shields absorb a certain percentage of damage based on their power setting. var/absorb_brute = brute*shield.shield_level var/absorb_burn = burn*shield.shield_level @@ -112,8 +118,14 @@ var/list/datum/robot_component/parts = get_damageable_components() //Combat shielding absorbs a percentage of damage directly into the cell. - if(module_active && istype(module_active,/obj/item/borg/combat/shield)) - var/obj/item/borg/combat/shield/shield = module_active + var/obj/item/borg/combat/shield/shield + if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield)) + shield = module_state_1 + else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield)) + shield = module_state_2 + else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield)) + shield = module_state_3 + if(shield) //Shields absorb a certain percentage of damage based on their power setting. var/absorb_brute = brute*shield.shield_level var/absorb_burn = burn*shield.shield_level diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index dbfcf15caa8..fb46c2547de 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -72,11 +72,15 @@ //Personal shielding for the combat module. +/obj/item/borg + var/powerneeded // Percentage of power remaining required to run item + /obj/item/borg/combat/shield name = "personal shielding" desc = "A powerful experimental module that turns aside or absorbs incoming attacks at the cost of charge." icon = 'icons/obj/decals.dmi' icon_state = "shock" + powerneeded = 25 var/shield_level = 0.5 //Percentage of damage absorbed by the shield. /obj/item/borg/combat/shield/verb/set_shield_level() @@ -92,4 +96,5 @@ name = "mobility module" desc = "By retracting limbs and tucking in its head, a combat android can roll at high speeds." icon = 'icons/obj/decals.dmi' - icon_state = "shock" \ No newline at end of file + icon_state = "shock" + powerneeded = 25 \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index aa37549606b..9191ebbfa13 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -412,12 +412,28 @@ /obj/item/weapon/robot_module/combat/New() src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src) src.modules += new /obj/item/borg/sight/thermal(src) - src.modules += new /obj/item/weapon/gun/energy/laser/cyborg(src) - src.modules += new /obj/item/weapon/gun/energy/plasmacutter(src) + src.modules += new /obj/item/weapon/gun/energy/gun/cyborg(src) + src.modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src) src.modules += new /obj/item/borg/combat/shield(src) src.modules += new /obj/item/borg/combat/mobility(src) - src.modules += new /obj/item/weapon/wrench(src) //Is a combat android really going to be stopped by a chair? + src.modules += new /obj/item/weapon/wrench(src) + src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src) + + fix_modules() + +/obj/item/weapon/robot_module/peacekeeper + name = "peacekeeper robot module" + +/obj/item/weapon/robot_module/peacekeeper/New() + src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src) + src.modules += new /obj/item/weapon/gun/energy/gun/cyborg(src) + src.modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src) + src.modules += new /obj/item/borg/combat/shield(src) + src.modules += new /obj/item/borg/combat/mobility(src) + src.modules += new /obj/item/weapon/wrench(src) src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src) fix_modules() diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm index eba943b5b66..e04147a7c77 100644 --- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -70,6 +70,8 @@ ventcrawler = 2 ranged = 1 ranged_cooldown_cap = 2 + universal_speak = 0 + universal_understand = 0 projectilesound = 'sound/weapons/taser2.ogg' AIStatus = AI_OFF var/resources = 0 //Resource points, generated by consuming metal/glass @@ -313,21 +315,25 @@ D.pixel_x = target.pixel_x D.pixel_y = target.pixel_y if(do_mob(src, target, 100)) - src << "Dismantling complete." - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc) - M.amount = 5 - if(target.component_parts && target.component_parts.len) - for(var/obj/item/I in target.component_parts) - I.forceMove(M.loc) - var/obj/effect/swarmer/disintegration/N = new /obj/effect/swarmer/disintegration(get_turf(target)) - N.pixel_x = target.pixel_x - N.pixel_y = target.pixel_y - target.dropContents() - if(istype(target, /obj/machinery/computer)) - var/obj/machinery/computer/C = target - if(C.circuit) - new C.circuit(get_turf(M)) - qdel(target) + if(!src.Adjacent(target)) + src << "Error:Dismantleing aborted." + else + src << "Dismantling complete." + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc) + M.amount = 5 + if(target.component_parts && target.component_parts.len) + for(var/obj/item/I in target.component_parts) + I.forceMove(M.loc) + var/obj/effect/swarmer/disintegration/N = new /obj/effect/swarmer/disintegration(get_turf(target)) + N.pixel_x = target.pixel_x + N.pixel_y = target.pixel_y + target.dropContents() + if(istype(target, /obj/machinery/computer)) + var/obj/machinery/computer/C = target + if(C.circuit) + new C.circuit(get_turf(M)) + qdel(target) + /obj/effect/swarmer //Default swarmer effect object visual feedback diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 210c4a11db3..c6bdb7b96a1 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -669,7 +669,7 @@ //spark for no reason if(prob(5)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() @@ -677,7 +677,7 @@ ..() visible_message("[src] blows apart!") new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() respawnable_list += src diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 070e61ef284..1aa802bfb1a 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -298,6 +298,27 @@ var/global/chicken_count = 0 attacktext = "kicks" health = 50 +/mob/living/simple_animal/turkey + name = "turkey" + desc = "Benjamin Franklin would be proud." + icon_state = "turkey" + icon_living = "turkey" + icon_dead = "turkey_dead" + icon_resting = "turkey_rest" + speak = list("gobble?","gobble","GOBBLE") + speak_emote = list("gobble") + emote_see = list("struts around") + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 6 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat //enough to make one turkey + meat_amount = 4 + response_help = "pets the" + response_disarm = "gently pushes aside the" + response_harm = "kicks the" + attacktext = "pecks" + health = 50 + /mob/living/simple_animal/goose name = "goose" desc = "A pretty goose. Would make a nice comforter." diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 38d79141803..f34ae89ef22 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -5,6 +5,7 @@ icon_state = "fox" icon_living = "fox" icon_dead = "fox_dead" + icon_resting = "fox_rest" speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Geckers","Awoo","Tchoff") speak_emote = list("geckers", "barks") emote_hear = list("howls","barks") diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm new file mode 100644 index 00000000000..8837919167a --- /dev/null +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -0,0 +1,895 @@ +/mob/living/simple_animal/hostile/guardian + name = "Guardian Spirit" + real_name = "Guardian Spirit" + desc = "A mysterious being that stands by it's charge, ever vigilant." + speak_emote = list("intones") + response_help = "passes through" + response_disarm = "flails at" + response_harm = "punches" + icon = 'icons/mob/mob.dmi' + icon_state = "stand" + icon_living = "stand" + speed = 0 + a_intent = I_HARM + stop_automated_movement = 1 + floating = 1 + attack_sound = 'sound/weapons/punch1.ogg' + minbodytemp = 0 + maxbodytemp = 10000000 + min_oxy = 0 + max_oxy = INFINITY + min_tox = 0 + max_tox = INFINITY + min_co2 = 0 + max_co2 = INFINITY + min_n2 = 0 + max_n2 = INFINITY + attacktext = "punches" + maxHealth = 100000 //The spirit itself is invincible + health = 100000 + environment_smash = 0 + melee_damage_lower = 15 + melee_damage_upper = 15 + AIStatus = AI_OFF + var/animated_manifest = FALSE + var/cooldown = 0 + var/damage_transfer = 1 //how much damage from each attack we transfer to the owner + var/mob/living/summoner + var/range = 10 //how far from the user the spirit can be + var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" + var/magic_fluff_string = " You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!" + var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!" + var/bio_fluff_string = "Your scarabs fail to mutate. This shouldn't happen! Submit a bug report!" + var/admin_fluff_string = "URK URF!"//the wheels on the bus... + +/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies + ..() + if(summoner) + if(summoner.stat == DEAD) + // src << "Your summoner has died!" + // visible_message("The [src] dies along with its user!") + // summoner.visible_message("[summoner]'s body is completely consumed by the strain of sustaining [src]!") + // for(var/obj/item/W in summoner) + // if(!summoner.unEquip(W)) + // qdel(W) + //summoner.dust() + //ghostize() + //qdel(src) + //else + src << "Your summoner has died!" + visible_message("The [src] dies along with its user!") + ghostize() + qdel(src) + if(summoner) + if (get_dist(get_turf(summoner),get_turf(src)) <= range) + return + else + src << "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]" + visible_message("The [src] jumps back to its user.") + Recall() + +/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range + ..() + if(summoner) + if (get_dist(get_turf(summoner),get_turf(src)) <= range) + return + else + src << "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]" + visible_message("The [src] jumps back to its user.") + Recall() + + +/mob/living/simple_animal/hostile/guardian/adjustBruteLoss(amount) //The spirit is invincible, but passes on damage to the summoner + var/damage = amount * damage_transfer + if (summoner) + if(loc == summoner) + return + summoner.adjustBruteLoss(damage) + if(damage) + summoner << "Your [name] is under attack! You take damage!" + summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!") + if(summoner.stat == UNCONSCIOUS) + summoner << "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!" + summoner.adjustCloneLoss(damage/2) + +/mob/living/simple_animal/hostile/guardian/ex_act(severity, target) + switch (severity) + if (1) + gib() + return + if (2) + adjustBruteLoss(60) + + if(3) + adjustBruteLoss(30) + +/mob/living/simple_animal/hostile/guardian/gib() + if(summoner) + summoner << "Your [src] was blown up!" + summoner.gib() + ghostize() + qdel(src) + +/mob/living/simple_animal/hostile/guardian/start_pulling(var/atom/movable/AM) + return //no pulling things fo you! + +//Manifest, Recall, Communicate + +/mob/living/simple_animal/hostile/guardian/proc/Manifest() + if(cooldown > world.time) + return + if(loc == summoner) + loc = get_turf(summoner) + src.client.eye = loc + cooldown = world.time + 30 + if(animated_manifest) + var/end_icon = icon_state + icon_state = "parasite_forming" + spawn(6) + icon_state = end_icon + +/mob/living/simple_animal/hostile/guardian/proc/Recall() + if(cooldown > world.time) + return + loc = summoner + buckled = null + cooldown = world.time + 30 + +/mob/living/simple_animal/hostile/guardian/proc/Communicate() + var/input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "") + if(!input) return + + for(var/mob/M in mob_list) + if(M == summoner || (M in dead_mob_list)) + M << "[src]: [input]" + src << "[src]: [input]" + log_say("[src.real_name]/[src.key] : [input]") + +/mob/living/simple_animal/hostile/guardian/proc/ToggleMode() + src << "You dont have another mode!" + + +/mob/living/proc/guardian_comm() + set name = "Communicate" + set category = "Guardian" + set desc = "Communicate telepathically with your guardian." + var/input = stripped_input(src, "Please enter a message to tell your guardian.", "Message", "") + if(!input) return + + for(var/mob/M in mob_list) + if(istype (M, /mob/living/simple_animal/hostile/guardian)) + var/mob/living/simple_animal/hostile/guardian/G = M + if(G.summoner == src) + G << "[src]: [input]" + else if (M in dead_mob_list) + M << "[src]: [input]" + src << "[src]: [input]" + log_say("[src.real_name]/[src.key] : [text]") + +/mob/living/proc/guardian_recall() + set name = "Recall Guardian" + set category = "Guardian" + set desc = "Forcibly recall your guardian." + for(var/mob/living/simple_animal/hostile/guardian/G in mob_list) + if(G.summoner == src) + G.Recall() + +/mob/living/proc/guardian_reset() + set name = "Reset Guardian Player (One Use)" + set category = "Guardian" + set desc = "Re-rolls which ghost will control your Guardian. One use." + for(var/mob/living/simple_animal/hostile/guardian/G in mob_list) + if(G.summoner == src) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [G.real_name]?", "pAI", null, FALSE, 100) + var/mob/dead/observer/new_stand = null + if(candidates.len) + new_stand = pick(candidates) + G << "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance." + src << "Your guardian has been successfully reset." + message_admins("[key_name_admin(new_stand)] has taken control of ([key_name_admin(G)])") + G.ghostize() + G.key = new_stand.key + src.verbs -= /mob/living/proc/guardian_reset + else + src << "There were no ghosts willing to take control. Looks like you're stuck with your Guardian for now." + + +/mob/living/simple_animal/hostile/guardian/proc/ToggleLight() + if(!luminosity) + set_light(3) + else + set_light(0) + + +//////////////////////////TYPES OF GUARDIANS + + +//Fire. Low damage, low resistance, sets mobs on fire when bumping + +/mob/living/simple_animal/hostile/guardian/fire + a_intent = I_HELP + melee_damage_lower = 10 + melee_damage_upper = 10 + attack_sound = 'sound/items/Welder.ogg' + attacktext = "sears" + damage_transfer = 0.8 + range = 10 + playstyle_string = "As a Chaos type, you have only light damage resistance, but will ignite any enemy you bump into. In addition, your melee attacks will randomly teleport enemies." + environment_smash = 1 + magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!" + tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to sow havoc at random." + +/mob/living/simple_animal/hostile/guardian/fire/Life() //Dies if the summoner dies + ..() + if(summoner) + summoner.ExtinguishMob() + summoner.adjust_fire_stacks(-20) + +/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() + ..() + if(prob(45)) + if(istype(target, /atom/movable)) + var/atom/movable/M = target + if(!M.anchored && M != summoner) + do_teleport(M, M, 10) + +/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj) + ..() + collision_ignite(AM) + +/mob/living/simple_animal/hostile/guardian/fire/Bumped(AM as mob|obj) + ..() + collision_ignite(AM) + +/mob/living/simple_animal/hostile/guardian/fire/Bump(AM as mob|obj) + ..() + collision_ignite(AM) + +/mob/living/simple_animal/hostile/guardian/fire/proc/collision_ignite(AM as mob|obj) + if(istype(AM, /mob/living/)) + var/mob/living/M = AM + if(AM != summoner && M.fire_stacks < 7) + M.fire_stacks = 7 + M.IgniteMob() + +/mob/living/simple_animal/hostile/guardian/fire/Bump(AM as mob|obj) + ..() + collision_ignite(AM) +//Standard + +/mob/living/simple_animal/hostile/guardian/punch + melee_damage_lower = 20 + melee_damage_upper = 20 + damage_transfer = 0.5 + playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls." + environment_smash = 2 + magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated." + tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm stirs to life, ready to tear apart your enemies." + var/battlecry = "AT" + + +/mob/living/simple_animal/hostile/guardian/punch/sealpunch + melee_damage_lower = 0 + melee_damage_upper = 0 + melee_damage_type = STAMINA + damage_transfer = 0.2 + playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls." + environment_smash = 2 + battlecry = "URK" + +/mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry() + set name = "Set Battlecry" + set category = "Guardian" + set desc = "Choose what you shout as you punch" + var/input = stripped_input(src,"What do you want your battlecry to be? Max length of 5 characters.", ,"", 6) + if(input) + battlecry = input + + + +/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget() + ..() + if(iscarbon(target) && target != summoner) + if(length(battlecry) > 11)//no more then 11 letters in a battle cry. + src.visible_message("[src] punches [target]!") + else + src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]") + playsound(loc, src.attack_sound, 50, 1, 1) + playsound(loc, src.attack_sound, 50, 1, 1) + playsound(loc, src.attack_sound, 50, 1, 1) + playsound(loc, src.attack_sound, 50, 1, 1) + +//Healer + +/mob/living/simple_animal/hostile/guardian/healer + a_intent = I_HARM + friendly = "heals" + speed = 0 + melee_damage_lower = 15 + melee_damage_upper = 15 + playstyle_string = "As a Support type, you may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent mob will warp them to your bluespace beacon after a short delay." + magic_fluff_string = "..And draw the CMO, a potent force of life...and death." + tech_fluff_string = "Boot sequence complete. Medical modules active. Bluespace modules activated. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of mending wounds and travelling via bluespace." + var/turf/simulated/floor/beacon + var/beacon_cooldown = 0 + var/toggle = FALSE + +/mob/living/simple_animal/hostile/guardian/healer/sealhealer + a_intent = I_HARM + friendly = "heals" + speed = 0 + melee_damage_lower = 0 + melee_damage_upper = 0 + melee_damage_type = STAMINA + + +/mob/living/simple_animal/hostile/guardian/healer/New() + ..() + +/mob/living/simple_animal/hostile/guardian/healer/Life() + ..() + regular_hud_updates() + process_med_hud(src, 1) + +/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() + ..() + if(toggle == TRUE) + if(src.loc == summoner) + src << "You must be manifested to heal!" + return + if(iscarbon(target)) + var/mob/living/carbon/C = target + C.adjustBruteLoss(-5) + C.adjustFireLoss(-5) + C.adjustOxyLoss(-5) + C.adjustToxLoss(-5) + +/mob/living/simple_animal/hostile/guardian/healer/ToggleMode() + if(src.loc == summoner) + if(toggle) + a_intent = I_HARM + speed = 0 + damage_transfer = 0.7 + melee_damage_lower = 15 + melee_damage_upper = 15 + src << "You switch to combat mode." + toggle = FALSE + else + a_intent = I_HELP + speed = 1 + damage_transfer = 1 + melee_damage_lower = 0 + melee_damage_upper = 0 + src << "You switch to healing mode." + toggle = TRUE + else + src << "You have to be recalled to toggle modes!" + + +/mob/living/simple_animal/hostile/guardian/healer/verb/Beacon() + set name = "Place Bluespsace Beacon" + set category = "Guardian" + set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work in unfavorable atmospheric conditions." + if(beacon_cooldownBeacon placed! You may now warp targets to it, including your user, via Alt+Click. " + if(beacon) + beacon.ChangeTurf(/turf/simulated/floor/plating) + beacon = F + beacon_cooldown = world.time+3000 + + else + src << "Your power is on cooldown. You must wait five minutes between placing beacons." + +/mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) + if(!istype(A)) + return + if(src.loc == summoner) + src << "You must be manifested to warp a target!" + return + if(!beacon) + src << "You need a beacon placed to warp things!" + return + if(!Adjacent(A)) + src << "You must be adjacent to your target!" + return + if((A.anchored)) + src << "Your target can not be anchored!" + return + src << "You begin to warp [A]" + if(do_mob(src, A, 50)) + if(!A.anchored) + if(src.beacon) //Check that the beacon still exists and is in a safe place. No instant kills. + if(beacon.air) + var/datum/gas_mixture/Z = beacon.air + if(Z.oxygen >= 16 && !Z.toxins && Z.carbon_dioxide < 10 && !Z.trace_gases.len) + if((Z.temperature > 270) && (Z.temperature < 360)) + var/pressure = Z.return_pressure() + if((pressure > 20) && (pressure < 550)) + do_teleport(A, beacon, 0) + else + src << "The beacon isn't in a safe location!" + else + src << "The beacon isn't in a safe location!" + else + src << "You need a beacon to warp things!" + else + src << "You need to hold still!" + + +///////////////////Ranged + +/obj/item/projectile/guardian + name = "crystal spray" + icon_state = "guardian" + damage = 5 + damage_type = BRUTE + armour_penetration = 100 + +/mob/living/simple_animal/hostile/guardian/ranged + a_intent = I_HELP + friendly = "quietly assesses" + melee_damage_lower = 10 + melee_damage_upper = 10 + damage_transfer = 0.9 + projectiletype = /obj/item/projectile/guardian + ranged_cooldown_cap = 0 + projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' + ranged = 1 + range = 13 + playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit." + magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." + tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spraying shards of crystal." + var/list/snares = list() + var/toggle = FALSE + +/mob/living/simple_animal/hostile/guardian/ranged/ToggleMode() + if(src.loc == summoner) + if(toggle) + ranged = 1 + melee_damage_lower = 10 + melee_damage_upper = 10 + alpha = 255 + range = 13 + incorporeal_move = 0 + src << "You switch to combat mode." + toggle = FALSE + else + ranged = 0 + melee_damage_lower = 0 + melee_damage_upper = 0 + alpha = 60 + range = 255 + incorporeal_move = 1 + src << "You switch to scout mode." + toggle = TRUE + else + src << "You have to be recalled to toggle modes!" + +/mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() + set name = "Set Surveillance Trap" + set category = "Guardian" + set desc = "Set an invisible trap that will alert you when living creatures walk over it. Max of 5" + if(src.snares.len <6) + var/turf/snare_loc = get_turf(src.loc) + var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc) + S.spawner = src + S.name = "[get_area(snare_loc)] trap ([rand(1, 1000)])" + src.snares |= S + src << "Surveillance trap deployed!" + else + src << "You have too many traps deployed. Delete some first." + +/mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare() + set name = "Remove Surveillance Trap" + set category = "Guardian" + set desc = "Disarm unwanted surveillance traps." + var/picked_snare = input(src, "Pick which trap to disarm", "Disarm Trap") as null|anything in src.snares + if(picked_snare) + src.snares -= picked_snare + qdel(picked_snare) + src << "Snare disarmed." + +/obj/item/effect/snare + name = "snare" + desc = "You shouldn't be seeing this!" + var/mob/living/spawner + invisibility = 1 + + +/obj/item/effect/snare/Crossed(AM as mob|obj) + if(istype(AM, /mob/living/)) + var/turf/snare_loc = get_turf(src.loc) + if(spawner) + spawner << "[AM] has crossed your surveillance trap at [get_area(snare_loc)]." + if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) + var/mob/living/simple_animal/hostile/guardian/G = spawner + if(G.summoner) + G.summoner << "[AM] has crossed your surveillance trap at [get_area(snare_loc)]." + +////Bomb + +/mob/living/simple_animal/hostile/guardian/bomb + melee_damage_lower = 15 + melee_damage_upper = 15 + damage_transfer = 0.6 + range = 13 + playstyle_string = "As an explosive type, you have only moderate close combat abilities, but are capable of converting any adjacent item into a disguised bomb via alt click." + magic_fluff_string = "..And draw the Scientist, master of explosive death." + tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of stealthily booby trapping items." + var/bomb_cooldown = 0 + +/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A) + if(!istype(A)) + return + if(src.loc == summoner) + src << "You must be manifested to create bombs!" + return + if(istype(A, /obj/)) + if(bomb_cooldown <= world.time && !stat) + var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A)) + src << "Success! Bomb armed!" + bomb_cooldown = world.time + 200 + B.spawner = src + B.disguise (A) + else + src << "Your powers are on cooldown! You must wait 20 seconds between bombs." + +/obj/item/weapon/guardian_bomb + name = "bomb" + desc = "You shouldn't be seeing this!" + var/obj/stored_obj + var/mob/living/spawner + + +/obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A) + A.loc = src + stored_obj = A + anchored = A.anchored + density = A.density + appearance = A.appearance + spawn(600) + stored_obj.loc = get_turf(src.loc) + spawner << "Failure! Your trap didn't catch anyone this time." + qdel(src) + +/obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) + user << "The [src] was boobytrapped!" + spawner << "Success! Your trap caught [user]" + stored_obj.loc = get_turf(src.loc) + playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1) + user.ex_act(2) + qdel(src) + +/obj/item/weapon/guardian_bomb/attackby(mob/living/user) + detonate(user) + return + +/obj/item/weapon/guardian_bomb/pickup(mob/living/user) + detonate(user) + return + +/obj/item/weapon/guardian_bomb/examine(mob/user) + stored_obj.examine(user) + if(get_dist(user,src)<=2) + user << "Looks odd!" + + +////////Creation + +/obj/item/weapon/guardiancreator + name = "deck of tarot cards" + desc = "An enchanted deck of tarot cards, rumored to be a source of unimaginable power. " + icon = 'icons/obj/toy.dmi' + icon_state = "deck_syndicate_full" + var/used = FALSE + var/theme = "magic" + var/mob_name = "Guardian Spirit" + var/use_message = "You shuffle the deck..." + var/used_message = "All the cards seem to be blank now." + var/failure_message = "..And draw a card! It's...blank? Maybe you should try again later." + var/ling_failure = "The deck refuses to respond to a souless creature such as you." + var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive") + var/random = TRUE + var/adminseal = FALSE + +/obj/item/weapon/guardiancreator/attack_self(mob/living/user) + for(var/mob/living/simple_animal/hostile/guardian/G in living_mob_list) + if (G.summoner == user) + user << "You already have a [mob_name]!" + return + if(user.mind && user.mind.changeling) + user << "[ling_failure]" + return + if(used == TRUE) + user << "[used_message]" + return + used = TRUE + user << "[use_message]" + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the [mob_name] of [user.real_name]?",BE_PAI, null, FALSE, 100) + var/mob/dead/observer/theghost = null + + if(candidates.len) + theghost = pick(candidates) + spawn_guardian(user, theghost.key) + else + user << "[failure_message]" + used = FALSE + + +/obj/item/weapon/guardiancreator/proc/spawn_guardian(var/mob/living/user, var/key) + var/gaurdiantype = "Standard" + if(random) + gaurdiantype = pick(possible_guardians) + if(adminseal) + gaurdiantype = pick("StandardSeal","SupportSeal") + else + gaurdiantype = input(user, "Pick the type of [mob_name]", "[mob_name] Creation") as null|anything in possible_guardians + var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch + var/picked_color = pick("#FFFFFF","#000000","#808080","#A52A2A","#FF0000","#8B0000","#DC143C","#FFA500","#FFFF00","#008000","#00FF00","#006400","#00FFFF","#0000FF","#000080","#008080","#800080","#4B0082") + switch(gaurdiantype) + + if("Chaos") + pickedtype = /mob/living/simple_animal/hostile/guardian/fire + + if("Standard") + pickedtype = /mob/living/simple_animal/hostile/guardian/punch + + if("StandardSeal") + pickedtype = /mob/living/simple_animal/hostile/guardian/punch/sealpunch + + if("Ranged") + pickedtype = /mob/living/simple_animal/hostile/guardian/ranged + + if("Support") + pickedtype = /mob/living/simple_animal/hostile/guardian/healer + + if("SupportSeal") + pickedtype = /mob/living/simple_animal/hostile/guardian/healer/sealhealer + + if("Explosive") + pickedtype = /mob/living/simple_animal/hostile/guardian/bomb + + var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user) + G.summoner = user + G.key = key + G << "You are a [mob_name] bound to serve [user.real_name]." + G << "You are capable of manifesting or recalling to your master with verbs in the Guardian tab. You will also find a verb to communicate with them privately there." + G << "While personally invincible, you will die if [user.real_name] does, and any damage dealt to you will have a portion passed on to them as you feed upon them to sustain yourself." + G << "[G.playstyle_string]" + user.verbs += /mob/living/proc/guardian_comm + if(!adminseal) + user.verbs += /mob/living/proc/guardian_recall + user.verbs += /mob/living/proc/guardian_reset + switch (theme) + if("magic") + G.name = "[mob_name]" + G.color = picked_color + G.real_name = "[mob_name]" + user << "[G.magic_fluff_string]." + if("tech") + var/colour = pick("orange", "neon", "pink", "red", "blue", "green") + G.name = "[mob_name] [capitalize(colour)]" + G.real_name = "[mob_name] [capitalize(colour)]" + G.icon_living = "parasite[colour]" + G.icon_state = "parasite[colour]" + G.animated_manifest = TRUE + user << "[G.tech_fluff_string]." + G.speak_emote = list("states") + if("bio") + user << "[G.bio_fluff_string]." + G.name = "[mob_name]" + G.color = picked_color + G.real_name = "[mob_name]" + G.icon_living = "headcrab" + G.icon_state = "headcrab" + G.attacktext = "swarms" + G.speak_emote = list("chitters") + if("seal") + user << "[G.admin_fluff_string]." + G.name = "[mob_name]" + G.color = picked_color + G.real_name = "[mob_name]" + G.icon = 'icons/mob/animal.dmi' + G.icon_living = "seal" + G.icon_state = "seal" + G.attacktext = "slaps" + G.speak_emote = list("barks") + +/obj/item/weapon/guardiancreator/choose + random = FALSE + +/obj/item/weapon/guardiancreator/tech + name = "holoparasite injector" + desc = "It contains alien nanoswarm of unknown origin. Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, it requires an organic host as a home base and source of fuel." + icon = 'icons/obj/syringe.dmi' + icon_state = "combat_hypo" + theme = "tech" + mob_name = "Holoparasite" + use_message = "You start to power on the injector..." + used_message = "The injector has already been used." + failure_message = "...ERROR. BOOT SEQUENCE ABORTED. AI FAILED TO INTIALIZE. PLEASE CONTACT SUPPORT OR TRY AGAIN LATER." + ling_failure = "The holoparasites recoil in horror. They want nothing to do with a creature like you." + +/obj/item/weapon/guardiancreator/tech/choose + random = FALSE + +/obj/item/weapon/guardiancreator/biological + name = "scarab egg cluster" + desc = "A parasitic species that will nest in the closest living creature upon birth. While not great for your health, they'll defend their new 'hive' to the death." + icon = 'icons/obj/fish_items.dmi' + icon_state = "eggs" + theme = "bio" + mob_name = "Scarab Swarm" + use_message = "The eggs begin to twitch..." + used_message = "The cluster already hatched." + failure_message = "...but soon settles again. Guess they weren't ready to hatch after all." + +/obj/item/weapon/guardiancreator/biological/choose + random = FALSE + + +/obj/item/weapon/guardiancreator/adminbus + name = "Avatar deck" + desc = "A mystical deck..oddly all the cards have a form of Bus on them." + icon = 'icons/obj/toy.dmi' + icon_state = "deck_syndicate_full" + theme = "seal" + mob_name = "Avatar" + use_message = "URK!" + used_message = "arf?" + failure_message = "..." + adminseal = TRUE + + +/obj/item/weapon/guardiancreator/adminbus/attack_self(mob/living/user) + + var/list/targets = list() + var/target = null + targets += getmobs() //Fill list, prompt user with list + target = input("Select a Player to guard!", "Player list", null, null) as null|anything in targets + + if(!target) return + var/mob/living/carbon/human/H = target + if(H.mind ) + spawn_guardian(H,user.key) + else + user << "Target has no mind. Aborting." + + +/obj/item/weapon/paper/guardian + name = "Holoparasite Guide" + icon_state = "paper" + info = {"A list of Holoparasite Types
+ +
+ Chaos: Ignites mobs on touch. teleports them at random on attack. Automatically extinguishes the user if they catch fire.
+
+ Standard:Devestating close combat attacks and high damage resist. No special powers.
+
+ Ranged: Has two modes. Ranged: Extremely weak, highly spammable projectile attack. Scout: Can not attack, but can move through walls. Can lay surveillance snares in either mode.
+
+ Support:Has two modes. Combat: Medium power attacks and damage resist. Healer: Attacks heal damage, but low damage resist and slow movemen. Can deploy a bluespace beacon and warp targets to it (including you) in either mode.
+
+ Explosive: High damage resist and medium power attack. Can turn any object into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered.
+"} + +/obj/item/weapon/paper/guardian/update_icon() + return + + +/obj/item/weapon/storage/box/syndie_kit/guardian + name = "holoparasite injector kit" + +/obj/item/weapon/storage/box/syndie_kit/guardian/New() + ..() + new /obj/item/weapon/guardiancreator/tech/choose(src) + new /obj/item/weapon/paper/guardian(src) + return + + + + + + + +///HUD + +/datum/hud/proc/guardian_hud(ui_style = 'icons/mob/screen1_midnight.dmi') + adding = list() + + var/obj/screen/using + + using = new /obj/screen/guardian/Manifest() + using.screen_loc = ui_rhand + adding += using + + using = new /obj/screen/guardian/Recall() + using.screen_loc = ui_lhand + adding += using + + using = new /obj/screen/guardian/ToggleMode() + using.screen_loc = ui_storage1 + adding += using + + using = new /obj/screen/guardian/ToggleLight() + using.screen_loc = ui_inventory + adding += using + + using = new /obj/screen/guardian/Communicate() + using.screen_loc = ui_back + adding += using + + mymob.client.screen = list() + mymob.client.screen += mymob.client.void + mymob.client.screen += adding + + + + +//HUD BUTTONS + +/obj/screen/guardian + icon = 'icons/mob/guardian.dmi' + +/obj/screen/guardian/Manifest + icon_state = "manifest" + name = "Manifest" + desc = "Spring forth into battle!" + +/obj/screen/guardian/Manifest/Click() + if(isguardian(usr)) + var/mob/living/simple_animal/hostile/guardian/G = usr + G.Manifest() + + +/obj/screen/guardian/Recall + icon_state = "recall" + name = "Recall" + desc = "Return to your user." + +/obj/screen/guardian/Recall/Click() + if(isguardian(usr)) + var/mob/living/simple_animal/hostile/guardian/G = usr + G.Recall() + +/obj/screen/guardian/ToggleMode + icon_state = "toggle" + name = "Toggle Mode" + desc = "Switch between ability modes." + +/obj/screen/guardian/ToggleMode/Click() + if(isguardian(usr)) + var/mob/living/simple_animal/hostile/guardian/G = usr + G.ToggleMode() + +/obj/screen/guardian/Communicate + icon_state = "communicate" + name = "Communicate" + desc = "Communicate telepathically with your user." + +/obj/screen/guardian/Communicate/Click() + if(isguardian(usr)) + var/mob/living/simple_animal/hostile/guardian/G = usr + G.Communicate() + +/obj/screen/guardian/ToggleLight + icon_state = "light" + name = "Toggle Light" + desc = "Glow like star dust." + +/obj/screen/guardian/ToggleLight/Click() + if(isguardian(usr)) + var/mob/living/simple_animal/hostile/guardian/G = usr + G.ToggleLight() diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 0159237df07..2bd6a611b24 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -256,6 +256,8 @@ E = locate() in get_turf(src) if(!E) var/obj/effect/spider/eggcluster/C = new /obj/effect/spider/eggcluster(src.loc) + C.faction = faction + C.master_commander = master_commander if(ckey) C.player_spiders = 1 fed-- diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 8e797c68796..68aeeb72616 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -52,7 +52,7 @@ ..() visible_message("[src] blows apart!") new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() ghostize() @@ -81,7 +81,7 @@ New() ..() - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() smoke.set_up(5, 0, src.loc) smoke.start() visible_message("\red The [src] warps in!") @@ -94,11 +94,14 @@ bot_amt-- switch(bot_type) if("norm") - new /mob/living/simple_animal/hostile/hivebot(get_turf(src)) + var/mob/living/simple_animal/hostile/hivebot/H = new /mob/living/simple_animal/hostile/hivebot(get_turf(src)) + H.faction = faction if("range") - new /mob/living/simple_animal/hostile/hivebot/range(get_turf(src)) + var/mob/living/simple_animal/hostile/hivebot/range/R = new /mob/living/simple_animal/hostile/hivebot/range(get_turf(src)) + R.faction = faction if("rapid") - new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src)) + var/mob/living/simple_animal/hostile/hivebot/rapid/F = new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src)) + F.faction = faction spawn(100) qdel(src) return diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 3ebf60586ff..e91719c5915 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -22,7 +22,7 @@ speed = 8 projectiletype = /obj/item/projectile/beam/drone projectilesound = 'sound/weapons/laser3.ogg' - var/datum/effect/effect/system/ion_trail_follow/ion_trail + var/datum/effect/system/ion_trail_follow/ion_trail //the drone randomly switches between these states because it's malfunctioning var/hostile_drone = 0 @@ -85,14 +85,14 @@ //repair a bit of damage if(prob(1)) src.visible_message("\red \icon[src] [src] shudders and shakes as some of it's damaged systems come back online.") - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() health += rand(25,100) //spark for no reason if(prob(5)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() @@ -134,7 +134,7 @@ src.visible_message("\red \icon[src] [src] begins to spark and shake violenty!") else src.visible_message("\red \icon[src] [src] sparks and shakes like it's about to explode!") - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() @@ -164,7 +164,7 @@ /mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() //Seriously, what the actual hell. //some random debris left behind if(has_loot) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() var/obj/O diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index b9f0f53a2fb..a466d62306b 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -77,12 +77,16 @@ return ..() /mob/living/simple_animal/hostile/statue/Life() - ..() - if(!client && target) // If we have a target and we're AI controlled + if(..()) + if(!ckey) + spawn() //for saftey + checkTargets() + . = 1 + +/mob/living/simple_animal/hostile/statue/proc/checkTargets() + if(target) var/mob/watching = can_be_seen() - // If they're not our target if(watching && watching != target) - // This one is closer. if(get_dist(watching, src) > get_dist(target, src)) LoseTarget() GiveTarget(watching) @@ -112,82 +116,71 @@ /mob/living/simple_animal/hostile/statue/proc/can_be_seen(var/turf/destination) // Check for darkness var/turf/T = get_turf(loc) + var/light_amount var/DLlight_amount - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - if(L) - light_amount = L.lum_r + L.lum_g + L.lum_b + + if(T.dynamic_lighting) + light_amount = T.get_lumcount() else - light_amount = 5 - var/atom/movable/lighting_overlay/DL = locate(/atom/movable/lighting_overlay) in destination - if(DL) - DLlight_amount = DL.lum_r + DL.lum_g + DL.lum_b + light_amount = 5 + + if(destination && destination.dynamic_lighting) + DLlight_amount = destination.get_lumcount() else - DLlight_amount = 5 + DLlight_amount = 5 + if(T && destination) - // Don't check it twice if our destination is the tile we are on or we can't even get to our destination + //Don't check it twice if our destination is the tile we are on or we can't even get to our destination if(T == destination) destination = null else if(light_amount < 0.1 && DLlight_amount < 0.1) // No one can see us in the darkness, right? return null - // We aren't in darkness, loop for viewers. + //We aren't in darkness, loop for viewers. var/list/check_list = list(src) if(destination) check_list += destination - // This loop will, at most, loop twice. + //This loop will, at most, loop twice. for(var/atom/check in check_list) for(var/mob/living/M in viewers(world.view + 1, check) - src) if(M.client && CanAttack(M)) - if(M.blinded || (sdisabilities & BLIND)) + if(M.blinded || (M.sdisabilities & BLIND)) return null + + //calculates if any mobs are actually facing the statue var/xdif = M.x - src.x var/ydif = M.y - src.y - if(abs(xdif) < abs(ydif)) - //mob is either above or below src - if(ydif < 0 && M.dir == NORTH) - //mob is below src and looking up + + if(abs(xdif) < abs(ydif)) //mob is either above or below src + if(ydif < 0 && M.dir == NORTH) //mob is below src and looking up return M - else if(ydif > 0 && M.dir == SOUTH) - //mob is above src and looking down + if(ydif > 0 && M.dir == SOUTH) //mob is above src and looking down return M - else if(abs(xdif) > abs(ydif)) - //mob is either left or right of src - if(xdif < 0 && M.dir == EAST) - //mob is to the left of src and looking right + + else if(abs(xdif) > abs(ydif)) //mob is either left or right of src + if(xdif < 0 && M.dir == EAST) //mob is to the left of src and looking right return M - else if(xdif > 0 && M.dir == WEST) - //mob is to the right of src and looking left + if(xdif > 0 && M.dir == WEST) //mob is to the right of src and looking left return M - else if (xdif == 0 && ydif == 0) - //mob is on the same tile as src + + else if(xdif == 0 && ydif == 0) //mob is on the same tile as src return M - return null - - -// Cannot talk - +//Cannot talk /mob/living/simple_animal/hostile/statue/say() return 0 -// Turn to dust when gibbed +/mob/living/simple_animal/hostile/statue/death(gibbed) + if(!gibbed) //The looping ends here. + dust() + return + return ..() -/mob/living/simple_animal/hostile/statue/gib(var/animation = 0) - dust(animation) - - -/mob/living/simple_animal/hostile/statue/death() - living_mob_list -= src - dead_mob_list += src - if(key) - respawnable_list += src - gib() - -// Stop attacking clientless mobs +//Stop attacking clientless mobs /mob/living/simple_animal/hostile/statue/CanAttack(var/atom/the_target) if(mind && mind.key && !ckey) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index fdaebc34f8a..44d29f118b7 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -343,7 +343,7 @@ //Search for item to steal parrot_interest = search_for_item() if(parrot_interest) - custom_emote(1,"looks in [parrot_interest]'s direction and takes flight") + custom_emote(1,"looks in [parrot_interest]'s direction and takes flight.") parrot_state = PARROT_SWOOP | PARROT_STEAL icon_state = "parrot_fly" return @@ -731,4 +731,4 @@ /mob/living/simple_animal/parrot/proc/parrot_hear(var/message="") if(!message || stat) return - speech_buffer.Add(message) \ No newline at end of file + speech_buffer.Add(message) diff --git a/code/modules/mob/living/simple_animal/revenant/revenant.dm b/code/modules/mob/living/simple_animal/revenant/revenant.dm index a62839665d7..70edbc27dd3 100644 --- a/code/modules/mob/living/simple_animal/revenant/revenant.dm +++ b/code/modules/mob/living/simple_animal/revenant/revenant.dm @@ -2,17 +2,22 @@ //"Ghosts" that are invisible and move like ghosts, cannot take damage while invsible //Don't hear deadchat and are NOT normal ghosts //Admin-spawn or random event +#define INVISIBILITY_REVENANT 50 /mob/living/simple_animal/revenant name = "revenant" desc = "A malevolent spirit." icon = 'icons/mob/mob.dmi' icon_state = "revenant_idle" + var/icon_idle = "revenant_idle" + var/icon_reveal = "revenant_revealed" + var/icon_stun = "revenant_stun" + var/icon_drain = "revenant_draining" incorporeal_move = 3 - invisibility = INVISIBILITY_OBSERVER - health = 25 - maxHealth = 25 - see_invisible = SEE_INVISIBLE_OBSERVER + invisibility = INVISIBILITY_REVENANT + health = INFINITY //Revenants don't use health, they use essence instead + maxHealth = INFINITY + see_invisible = INVISIBILITY_REVENANT universal_understand = 1 response_help = "passes through" response_disarm = "swings at" @@ -23,34 +28,43 @@ harm_intent_damage = 0 friendly = "touches" status_flags = 0 + see_in_dark = 8 wander = 0 density = 0 flying = 1 anchored = 1 - var/essence = 25 //The resource of revenants. Max health is equal to three times this amount - var/essence_regen_cap = 25 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount. + var/essence = 75 //The resource of revenants. Max health is equal to three times this amount + var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount. var/essence_regenerating = 1 //If the revenant regenerates essence or not; 1 for yes, 0 for no - var/essence_regen_amount = 2 //How much essence regenerates - var/essence_min = 1 //The minimum amount of essence a revenant can have; by default, it never drops below one + var/essence_regen_amount = 5 //How much essence regenerates var/essence_accumulated = 0 //How much essence the revenant has stolen var/revealed = 0 //If the revenant can take damage from normal sources. + var/unreveal_time = 0 //How long the revenant is revealed for, is about 2 seconds times this var. + var/unstun_time = 0 //How long the revenant is stunned for, is about 2 seconds times this var. var/inhibited = 0 //If the revenant's abilities are blocked by a chaplain's power. var/essence_drained = 0 //How much essence the revenant has drained. var/draining = 0 //If the revenant is draining someone. var/list/drained_mobs = list() //Cannot harvest the same mob twice + var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. + var/image/ghostimage = null //Visible to ghost with darkness off /mob/living/simple_animal/revenant/Life() ..() - if(essence < essence_min) - essence = essence_min + if(revealed && essence <= 0) + death() if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate - essence += essence_regen_amount - if(essence > essence_regen_cap) - essence = essence_regen_cap - maxHealth = essence * 3 - if(!revealed) - health = maxHealth //Heals to full when not revealed + essence = min(essence_regen_cap, essence+essence_regen_amount) + if(unreveal_time && world.time >= unreveal_time) + unreveal_time = 0 + revealed = 0 + invisibility = INVISIBILITY_REVENANT + src << "You are once more concealed." + if(unstun_time && world.time >= unstun_time) + unstun_time = 0 + notransform = 0 + src << "You can move again!" + update_spooky_icon() /mob/living/simple_animal/revenant/ex_act(severity) return 1 //Immune to the effects of explosions. @@ -58,6 +72,19 @@ /mob/living/simple_animal/revenant/blob_act() return 1 //blah blah blobs aren't in tune with the spirit world, or something. +/mob/living/simple_animal/revenant/singularity_act() + return //don't walk into the singularity expecting to find corpses, okay? + +/mob/living/simple_animal/revenant/narsie_act() + return //most humans will now be either bones or harvesters, but we're still un-alive. + +/mob/living/simple_animal/revenant/adjustBruteLoss(amount) + if(!revealed) + return + essence = max(0, essence-amount) + if(essence == 0) + src << "You feel your essence fraying!" + /mob/living/simple_animal/revenant/ClickOn(var/atom/A, var/params) //Copypaste from ghost code - revenants can't interact with the world directly. if(client.buildmode) build_click(src, client.buildmode, params, A) @@ -87,62 +114,78 @@ if(!castcheck(0)) return if(draining) - src << "You are already siphoning the essence of a soul!" + src << "You are already siphoning the essence of a soul!" return if(target in drained_mobs) - src << "[target]'s soul is dead and empty." + src << "[target]'s soul is dead and empty." return if(!target.stat) - src << "This being's soul is too strong to harvest." + src << "This being's soul is too strong to harvest." if(prob(10)) target << "You feel as if you are being watched." return draining = 1 - essence_drained = 2 - src << "You search for the soul of [target]." + essence_drained = rand(15, 20) + src << "You search for the soul of [target]." if(do_after(src, 10, 3, 0, target = target)) //did they get deleted in that second? if(target.ckey) - src << "Their soul burns with intelligence." - essence_drained += 2 + src << "Their soul burns with intelligence." + essence_drained += rand(20, 30) if(target.stat != DEAD) - src << "Their soul blazes with life!" - essence_drained += 2 + src << "Their soul blazes with life!" + essence_drained += rand(40, 50) else - src << "Their soul is weak and faltering." + src << "Their soul is weak and faltering." if(do_after(src, 20, 6, 0, target = target)) //did they get deleted NOW? switch(essence_drained) - if(1 to 2) - src << "[target] will not yield much essence. Still, every bit counts." - if(3 to 4) - src << "[target] will yield an average amount of essence." - if(5 to INFINITY) - src << "Such a feast! [target] will yield much essence to you." - if(do_after(src, 30, 9, 0, target = target)) //how about now + if(1 to 30) + src << "[target] will not yield much essence. Still, every bit counts." + if(30 to 70) + src << "[target] will yield an average amount of essence." + if(70 to 90) + src << "Such a feast! [target] will yield much essence to you." + if(90 to INFINITY) + src << "Ah, the perfect soul. [target] will yield massive amounts of essence to you." + if(do_after(src, 20, 6, 0, target = target)) //how about now if(!target.stat) - src << "They are now powerful enough to fight off your draining." + src << "They are now powerful enough to fight off your draining." target << "You feel something tugging across your body before subsiding." draining = 0 return //hey, wait a minute... - src << "You begin siphoning essence from [target]'s soul." + src << "You begin siphoning essence from [target]'s soul." if(target.stat != DEAD) target << "You feel a horribly unpleasant draining sensation as your grip on life weakens..." icon_state = "revenant_draining" - reveal(65) - stun(65) + reveal(27) + stun(27) target.visible_message("[target] suddenly rises slightly into the air, their skin turning an ashy gray.") - target.Beam(src,icon_state="drain_life",icon='icons/effects/effects.dmi',time=60) - if(target) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. - change_essence_amount(essence_drained * 5, 0, target) - src << "[target]'s soul has been considerably weakened and will yield no more essence for the time being." - target.visible_message("[target] gently slumps back onto the ground.") + target.Beam(src,icon_state="drain_life",icon='icons/effects/effects.dmi',time=26) + if(do_after(src, 30, 9, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. + change_essence_amount(essence_drained, 0, target) + if(essence_drained > 90) + essence_regen_cap += 25 + perfectsouls += 1 + src << "The perfection of [target]'s soul has increased your maximum essence level. Your new maximum essence is [essence_regen_cap]." + src << "[target]'s soul has been considerably weakened and will yield no more essence for the time being." + target.visible_message("[target] slumps onto the ground.", \ + "Violets lights, dancing in your vision, getting clo--") drained_mobs.Add(target) target.death(0) - icon_state = "revenant_idle" + else + src << "[target ? "[target] has":"They have"] been drawn out of your grasp. The link has been broken." + draining = 0 + essence_drained = 0 + if(target) //Wait, target is WHERE NOW? + target.visible_message("[target] slumps onto the ground.", \ + "Violets lights, dancing in your vision, receding--") + return else - src << "You are not close enough to siphon [target]'s soul. The link has been broken." + src << "You are not close enough to siphon [target ? "[target]'s":"their"] soul. The link has been broken." draining = 0 + essence_drained = 0 return draining = 0 + essence_drained = 0 return /mob/living/simple_animal/revenant/say(message) @@ -151,11 +194,17 @@ /mob/living/simple_animal/revenant/Stat() ..() if(statpanel("Status")) - stat(null, "Current essence: [essence]E") + stat(null, "Current essence: [essence]/[essence_regen_cap]E") stat(null, "Stolen essence: [essence_accumulated]E") + stat(null, "Stolen perfect souls: [perfectsouls]") /mob/living/simple_animal/revenant/New() ..() + + ghostimage = image(src.icon,src,src.icon_state) + ghost_darkness_images |= ghostimage + updateallghostimages() + spawn(5) if(src.mind) src.mind.wipe_memory() @@ -164,8 +213,8 @@ src << "You are a revenant." src << "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant." src << "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds." - src << "You are invincible and invisible to everyone but other ghosts. Some abilities may change this." - src << "To function, you are to drain the life essence from humans. This essence is a resource and will power all of your abilities." + src << "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable." + src << "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities." src << "You do not remember anything of your past lives, nor will you remember anything about this one after your death." src << "Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more." var/datum/objective/revenant/objective = new @@ -186,17 +235,21 @@ /mob/living/simple_animal/revenant/proc/giveSpells() if(src.mind) - src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_harvest - src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_transmit - src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_light - src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_defile - src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_malf + src.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) + src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) + src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) + src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null)) return 1 return 0 /mob/living/simple_animal/revenant/death() ..() - src << "NO! No... it's too late, you can feel yourself fading..." + if(!revealed) //Revenants cannot die if they aren't revealed + return + ghost_darkness_images -= ghostimage + updateallghostimages() + + src << "NO! No... it's too late, you can feel your essence breaking apart..." notransform = 1 revealed = 1 invisibility = 0 @@ -206,8 +259,9 @@ for(var/i = alpha, i > 0, i -= 10) sleep(0.1) alpha = i - visible_message("[src]'s body breaks apart into blue dust.") - new /obj/item/weapon/ectoplasm/revenant(get_turf(src)) + visible_message("[src]'s body breaks apart into a fine pile of blue dust.") + var/obj/item/weapon/ectoplasm/revenant/R = new (get_turf(src)) + R.client_to_revive = src.client //If the essence reforms, the old revenant is put back in the body ghostize() qdel(src) return @@ -216,8 +270,8 @@ /mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/weapon/nullrod)) visible_message("[src] violently flinches!", \ - "As the null rod passes through you, you feel your essence draining away!") - essence -= 25 //hella effective + "As the null rod passes through you, you feel your essence draining away!") + adjustBruteLoss(25) //hella effective inhibited = 1 spawn(30) inhibited = 0 @@ -229,13 +283,13 @@ return var/turf/T = get_turf(src) if(istype(T, /turf/simulated/wall)) - src << "You cannot use abilities from inside of a wall." + src << "You cannot use abilities from inside of a wall." return 0 if(src.inhibited) - src << "Your powers have been suppressed by nulling energy!" + src << "Your powers have been suppressed by nulling energy!" return 0 if(!src.change_essence_amount(essence_cost, 1)) - src << "You lack the essence to use that ability." + src << "You lack the essence to use that ability." return 0 return 1 @@ -244,16 +298,14 @@ return if(essence + essence_amt <= 0) return - essence += essence_amt - essence = max(0, essence) + essence = max(0, essence+essence_amt) if(essence_amt > 0) - essence_accumulated += essence_amt - essence_accumulated = max(0, essence_accumulated) + essence_accumulated = max(0, essence_accumulated+essence_amt) if(!silent) if(essence_amt > 0) - src << "Gained [essence_amt]E from [source]." + src << "Gained [essence_amt]E from [source]." else - src << "Lost [essence_amt]E from [source]." + src << "Lost [essence_amt]E from [source]." return 1 /mob/living/simple_animal/revenant/proc/reveal(time) @@ -263,11 +315,13 @@ return revealed = 1 invisibility = 0 - src << "You have been revealed." - spawn(time) - revealed = 0 - invisibility = INVISIBILITY_OBSERVER - src << "You are once more concealed." + if(!unreveal_time) + src << "You have been revealed!" + unreveal_time = world.time + time + else + src << "You have been revealed!" + unreveal_time = unreveal_time + time + update_spooky_icon() /mob/living/simple_animal/revenant/proc/stun(time) if(!src) @@ -275,16 +329,31 @@ if(time <= 0) return notransform = 1 - src << "You cannot move!" - spawn(time) - notransform = 0 - src << "You can move again!" + if(!unstun_time) + src << "You cannot move!" + unstun_time = world.time + time + else + src << "You cannot move!" + unstun_time = unstun_time + time + update_spooky_icon() + +/mob/living/simple_animal/revenant/proc/update_spooky_icon() + if(revealed) + if(notransform) + if(draining) + icon_state = icon_drain + else + icon_state = icon_stun + else + icon_state = icon_reveal + else + icon_state = icon_idle /datum/objective/revenant var/targetAmount = 100 /datum/objective/revenant/New() - targetAmount = rand(100,200) + targetAmount = rand(200,500) explanation_text = "Absorb [targetAmount] points of essence from humans." ..() @@ -321,27 +390,23 @@ icon = 'icons/effects/effects.dmi' icon_state = "revenantEctoplasm" w_class = 2 - var/reforming = 0 - var/reformed = 0 + var/reforming = 1 + var/inert = 0 + var/client/client_to_revive /obj/item/weapon/ectoplasm/revenant/New() ..() - reforming = 1 + reforming = 0 spawn(600) //1 minutes if(src && reforming) return reform() - if(src && !reforming) + else + inert = 1 visible_message("[src] settles down and seems lifeless.") return -/obj/item/weapon/ectoplasm/revenant/attack_hand(mob/user) - if(reformed) - user << "[src] keeps slipping out of your hands, you can't get a hold on it!" - return - ..() - /obj/item/weapon/ectoplasm/revenant/attack_self(mob/user) - if(!reforming) + if(!reforming || inert) return ..() user.visible_message("[user] scatters [src] in all directions.", \ "You scatter [src] across the area. The particles slowly fade away.") @@ -350,39 +415,58 @@ /obj/item/weapon/ectoplasm/revenant/throw_impact(atom/hit_atom) ..() + if(inert) + return visible_message("[src] breaks into particles upon impact, which fade away to nothingness.") qdel(src) /obj/item/weapon/ectoplasm/revenant/examine(mob/user) ..(user) - if(reforming) - user << "It is shifting and distorted. It would be wise to destroy this." - else if(!reforming) - user << "It seems inert." + if(inert) + user << "It seems inert." + else if(reforming) + user << "It is shifting and distorted. It would be wise to destroy this." /obj/item/weapon/ectoplasm/revenant/proc/reform() - if(!reforming || !src) + if(inert || !src) return - message_admins("Revenant ectoplasm was left undestroyed for 1 minute and has reformed into a new revenant.") + var/key_of_revenant + message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.") loc = get_turf(src) //In case it's in a backpack or someone's hand - visible_message("[src] suddenly rises into the air before fading away.") var/mob/living/simple_animal/revenant/R = new(get_turf(src)) - qdel(src) - var/list/candidates = get_candidates(BE_REVENANT) - if(!candidates.len) - message_admins("No candidates were found for the new revenant. Oh well!") - return 0 - var/client/C = pick(candidates) - var/key_of_revenant = C.key + if(client_to_revive) + for(var/mob/M in dead_mob_list) + if(M.client == client_to_revive) //Only recreates the mob if the mob the client is in is dead + R.client = client_to_revive + key_of_revenant = client_to_revive.key + if(!key_of_revenant) - message_admins("No ckey was found for the new revenant. Oh well!") - return 0 + message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") + var/list/candidates = get_candidates(BE_REVENANT) + if(!candidates.len) + qdel(R) + message_admins("No candidates were found for the new revenant. Oh well!") + inert = 1 + visible_message("[src] settles down and seems lifeless.") + return 0 + var/client/C = pick(candidates) + key_of_revenant = C.key + if(!key_of_revenant) + qdel(R) + message_admins("No ckey was found for the new revenant. Oh well!") + inert = 1 + visible_message("[src] settles down and seems lifeless.") + return 0 var/datum/mind/player_mind = new /datum/mind(key_of_revenant) player_mind.active = 1 player_mind.transfer_to(R) player_mind.assigned_role = "revenant" player_mind.special_role = "Revenant" ticker.mode.traitors |= player_mind - message_admins("[key_of_revenant] has been made into a revenant by reforming ectoplasm.") - log_game("[key_of_revenant] was spawned as a revenant by reforming ectoplasm.") + message_admins("[key_of_revenant] has been [client_to_revive ? "re":""]made into a revenant by reforming ectoplasm.") + log_game("[key_of_revenant] was [client_to_revive ? "re":""]made as a revenant by reforming ectoplasm.") + visible_message("[src] suddenly rises into the air before fading away.") + qdel(src) + if(src) //Should never happen, but just in case + inert = 1 return 1 diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm index 016b8171113..02f231d7f73 100644 --- a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm +++ b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm @@ -1,18 +1,4 @@ -//Harvest Essence: The bread and butter of the revenant. The basic way of harvesting additional essence. -/obj/effect/proc_holder/spell/targeted/revenant_harvest - name = "Harvest" - desc = "Siphons the lingering spectral essence from a human, empowering yourself." - panel = "Revenant Abilities" - charge_max = 0 //Short cooldown - clothes_req = 0 - range = 1 - -/obj/effect/proc_holder/spell/targeted/revenant_harvest/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) - for(var/mob/living/carbon/human/target in targets) - spawn(0) - user.Harvest(target) - -//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob for 5E. +//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob /obj/effect/proc_holder/spell/targeted/revenant_transmit name = "Transmit" desc = "Telepathically transmits a message to the target." @@ -21,155 +7,185 @@ clothes_req = 0 range = 7 include_user = 0 + action_icon_state = "r_transmit" + action_background_icon_state = "bg_revenant" -/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) +/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr) for(var/mob/living/M in targets) spawn(0) var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") if(!msg) charge_counter = charge_max return - log_say("Revenant Transmit: [key_name(usr)]->[key_name(M)]: [msg]") - usr << "You transmit to [M]: [msg]" - M << "A strange voice resonates in your head... [msg]" - for(var/mob/dead/observer/G in player_list) - G.show_message("Revenant message from [usr] ([ghost_follow_link(usr, ghost=G)]) to [M] ([ghost_follow_link(M, ghost=G)]): [msg]") + log_say("RevenantTransmit: [key_name(user)]->[key_name(M)] : [msg]") + usr << "You transmit to [M]: [msg]" + M << "An alien voice resonates from all around... [msg]" +/obj/effect/proc_holder/spell/aoe_turf/revenant + clothes_req = 0 + action_background_icon_state = "bg_revenant" + panel = "Revenant Abilities (Locked)" + name = "Report this to a coder" + var/reveal = 80 //How long it reveals the revenant in deciseconds + var/stun = 20 //How long it stuns the revenant in deciseconds + var/locked = 1 //If it's locked and needs to be unlocked before use + var/unlock_amount = 100 //How much essence it costs to unlock + var/cast_amount = 50 //How much essence it costs to use + +/obj/effect/proc_holder/spell/aoe_turf/revenant/New() + ..() + if(locked) + name = "[initial(name)] ([unlock_amount]E)" + else + name = "[initial(name)] ([cast_amount]E)" + +/obj/effect/proc_holder/spell/aoe_turf/revenant/can_cast(mob/living/simple_animal/revenant/user = usr) + if(user.inhibited) + return 0 + if(charge_counter < charge_max) + return 0 + if(locked) + if(user.essence <= unlock_amount) + return 0 + if(user.essence <= cast_amount) + return 0 + return 1 + +/obj/effect/proc_holder/spell/aoe_turf/revenant/proc/attempt_cast(mob/living/simple_animal/revenant/user = usr) + if(locked) + if(!user.castcheck(-unlock_amount)) + charge_counter = charge_max + return 0 + name = "[initial(name)] ([cast_amount]E)" + user << "You have unlocked [initial(name)]!" + panel = "Revenant Abilities" + locked = 0 + charge_counter = charge_max + return 0 + if(!user.castcheck(-cast_amount)) + charge_counter = charge_max + return 0 + name = "[initial(name)] ([cast_amount]E)" + user.reveal(reveal) + user.stun(stun) + user.update_action_buttons() + return 1 + //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. -/obj/effect/proc_holder/spell/aoe_turf/revenant_light - name = "Overload Light (30E)" +/obj/effect/proc_holder/spell/aoe_turf/revenant/overload + name = "Overload Lights" desc = "Directs a large amount of essence into nearby electrical lights, causing lights to shock those nearby." - panel = "Revenant Abilities (Locked)" charge_max = 200 - clothes_req = 0 - range = 1 - var/reveal = 80 - var/stun = 20 - var/locked = 1 + range = 5 + stun = 30 + cast_amount = 45 + var/shock_range = 2 + var/shock_damage = 18 + action_icon_state = "overload_lights" -/obj/effect/proc_holder/spell/aoe_turf/revenant_light/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) - if(locked) - if(!user.castcheck(-30)) - charge_counter = charge_max - return - user << "You have unlocked Overload Lights!" - name = "Overload Lights (20E)" - panel = "Revenant Abilities" - locked = 0 - range = 6 - charge_counter = charge_max - return - if(!user.castcheck(-20)) - charge_counter = charge_max - return - for(var/turf/T in targets) - spawn(0) - for(var/obj/machinery/light/L in T.contents) - spawn(0) - if(!L.on) - return - L.visible_message("\The [L] suddenly flares brightly and begins to spark!") - sleep(10) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(4, 1, L) - s.start() - sleep(10) - for(var/mob/living/M in orange(4, L)) - if(M == user) +/obj/effect/proc_holder/spell/aoe_turf/revenant/overload/cast(list/targets, mob/living/simple_animal/revenant/user = usr) + if(attempt_cast(user)) + for(var/turf/T in targets) + spawn(0) + for(var/obj/machinery/light/L in T.contents) + spawn(0) + if(!L.on) return - M.Beam(L,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) - M.electrocute_act(25, "[L.name]") - var/datum/effect/effect/system/spark_spread/z = new /datum/effect/effect/system/spark_spread - z.set_up(4, 1, M) - z.start() - playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1) - user.reveal(reveal) - user.stun(stun) + L.visible_message("\The [L] suddenly flares brightly and begins to spark!") + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread/ + s.set_up(4, 0, L) + s.start() + new/obj/effect/overlay/temp/revenant(L.loc) + sleep(20) + if(!L.on) //wait, wait, don't shock me + return + flick("[L.base_state]2", L) + for(var/mob/living/carbon/human/M in view(shock_range, L)) + if(M == user) + return + M.Beam(L,icon_state="purple_lightning",icon='icons/effects/effects.dmi',time=5) + M.electrocute_act(shock_damage, "[L.name]") + var/datum/effect/system/spark_spread/z = new /datum/effect/system/spark_spread/ + z.set_up(4, 0, M) + z.start() + playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1) //Defile: Corrupts nearby stuff, unblesses floor tiles. -/obj/effect/proc_holder/spell/aoe_turf/revenant_defile - name = "Defile (35E)" - desc = "Twists and corrupts the nearby area. Also dispels holy auras on floors, but not salt lines." - panel = "Revenant Abilities (Locked)" - charge_max = 200 - clothes_req = 0 - range = 1 - var/reveal = 100 - var/stun = 20 - var/locked = 1 - -/obj/effect/proc_holder/spell/aoe_turf/revenant_defile/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) - if(locked) - if(!user.castcheck(-35)) - charge_counter = charge_max - return - user << "You have unlocked Defile!" - name = "Defile (20E)" - panel = "Revenant Abilities" - locked = 0 - range = 3 - charge_counter = charge_max - return - if(!user.castcheck(-20)) - charge_counter = charge_max - return - for(var/turf/T in targets) - spawn(0) - if(T.flags & NOJAUNT) - T.flags -= NOJAUNT - if(!istype(T, /turf/simulated/wall/cult) && istype(T, /turf/simulated/wall) && prob(40)) - T.ChangeTurf(/turf/simulated/wall/cult) - if(!istype(T, /turf/simulated/floor/engine/cult) && istype(T, /turf/simulated/floor) && prob(40)) - T.ChangeTurf(/turf/simulated/floor/engine/cult) - for(var/mob/living/carbon/human/human in T.contents) - human << "You suddenly feel tired." - human.adjustStaminaLoss(35) - for(var/obj/structure/window/window in T.contents) - window.hit(rand(50,125)) - for(var/obj/machinery/light/light in T.contents) - light.flicker() //spooky - user.reveal(reveal) - user.stun(stun) - -//Malfunction: Makes bad stuff happen to robots and machines. -/obj/effect/proc_holder/spell/aoe_turf/revenant_malf - name = "Malfunction (50E)" - desc = "Corrupts and damages nearby machines and mechanical objects." - panel = "Revenant Abilities (Locked)" +/obj/effect/proc_holder/spell/aoe_turf/revenant/defile + name = "Defile" + desc = "Twists and corrupts the nearby area as well as dispelling holy auras on floors." charge_max = 150 - clothes_req = 0 - range = 1 - var/reveal = 60 - var/stun = 30 - var/locked = 1 + range = 3 + unlock_amount = 75 + cast_amount = 40 + action_icon_state = "defile" + var/stamdamage= 25 + var/toxdamage = 5 + var/confusion = 50 -/obj/effect/proc_holder/spell/aoe_turf/revenant_malf/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - if(locked) - if(!user.castcheck(-50)) - charge_counter = charge_max - return - user << "You have unlocked Malfunction!" - name = "Malfunction (15E)" - panel = "Revenant Abilities" - locked = 0 - range = 4 - charge_counter = charge_max - return - if(!user.castcheck(-15)) - charge_counter = charge_max - return - for(var/turf/T in targets) - spawn(0) - for(var/obj/machinery/bot/bot in T.contents) - if(!bot.emagged) - bot.locked = 0 - bot.open = 1 - bot.Emag(null) - for(var/obj/machinery/mach in T.contents) - if(prob(10)) - mach.emag_act(null) - - empulse(user.loc, 3, 5) - user.reveal(reveal) - user.stun(stun) +/obj/effect/proc_holder/spell/aoe_turf/revenant/defile/cast(list/targets, mob/living/simple_animal/revenant/user = usr) + if(attempt_cast(user)) + for(var/turf/T in targets) + spawn(0) + if(T.flags & NOJAUNT) + T.flags -= NOJAUNT + new/obj/effect/overlay/temp/revenant(T) + for(var/mob/living/carbon/human/human in T.contents) + human << "You suddenly feel [pick("sick and tired", "tired and confused", "nauseated", "dizzy")]." + human.adjustStaminaLoss(stamdamage) + human.adjustToxLoss(toxdamage) + human.confused += confusion + new/obj/effect/overlay/temp/revenant(human.loc) + if(!istype(T, /turf/simulated/shuttle) && !istype(T, /turf/simulated/wall/rust) && !istype(T, /turf/simulated/wall/r_wall) && istype(T, /turf/simulated/wall) && prob(15)) + new/obj/effect/overlay/temp/revenant(T) + T.ChangeTurf(/turf/simulated/wall/rust) + if(!istype(T, /turf/simulated/wall/r_wall/rust) && istype(T, /turf/simulated/wall/r_wall) && prob(15)) + new/obj/effect/overlay/temp/revenant(T) + T.ChangeTurf(/turf/simulated/wall/r_wall/rust) + for(var/obj/structure/window/window in T.contents) + window.hit(rand(50,90)) + if(window && window.is_fulltile()) + new/obj/effect/overlay/temp/revenant/cracks(window.loc) + for(var/obj/machinery/light/light in T.contents) + light.flicker(30) //spooky + +//Malfunction: Makes bad stuff happen to robots and machines. +/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction + name = "Malfunction" + desc = "Corrupts and damages nearby machines and mechanical objects." + charge_max = 200 + range = 4 + unlock_amount = 150 + action_icon_state = "malfunction" + +//A note to future coders: do not replace this with an EMP because it will wreck malf AIs and gang dominators and everyone will hate you. +/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction/cast(list/targets, mob/living/simple_animal/revenant/user = usr) + if(attempt_cast(user)) + for(var/turf/T in targets) + spawn(0) + for(var/obj/machinery/bot/bot in T.contents) + if(!bot.emagged) + new/obj/effect/overlay/temp/revenant(bot.loc) + bot.locked = 0 + bot.open = 1 + bot.Emag(null) + for(var/mob/living/carbon/human/human in T.contents) + human << "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")]." + new/obj/effect/overlay/temp/revenant(human.loc) + human.emp_act(1) + for(var/obj/thing in T.contents) + if(istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes) || istype(thing, /obj/machinery/bot)) //Doesn't work on dominators, SMES and APCs, to prevent kekkery + continue + if(prob(20)) + if(prob(50)) + new/obj/effect/overlay/temp/revenant(thing.loc) + thing.emag_act(null) + else + if(!istype(thing, /obj/machinery/clonepod)) //I hate everything but mostly the fact there's no better way to do this without just not affecting it at all + thing.emp_act(1) + for(var/mob/living/silicon/robot/S in T.contents) //Only works on cyborgs, not AI + playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) + new/obj/effect/overlay/temp/revenant(S.loc) + S.spark_system.start() + S.emp_act(1) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index e93f8a22dae..9394c27fb4d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -72,6 +72,8 @@ var/scan_ready = 1 var/simplespecies //Sorry, no spider+corgi buttbabies. + var/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions). + /mob/living/simple_animal/New() ..() diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm index 3929e9f8f75..e48c7f81d3d 100644 --- a/code/modules/mob/living/simple_animal/vox.dm +++ b/code/modules/mob/living/simple_animal/vox.dm @@ -22,15 +22,14 @@ var/amp = null var/quills = 3 -/mob/living/simple_animal/vox/armalis/death() - - living_mob_list -= src - dead_mob_list += src - stat = DEAD - visible_message("\red [src] shudders violently and explodes!","\red You feel your body rupture!") - explosion(get_turf(loc), -1, -1, 3, 5) - src.gib() - return +/mob/living/simple_animal/vox/armalis/death(gibbed) + if(!gibbed) + stat = DEAD + visible_message("[src] shudders violently and explodes!","\red You feel your body rupture!") + explosion(get_turf(loc), -1, -1, 3, 5) + gib() + return + return ..() /mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(O.force) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 795027e55b6..2e34a1a5b45 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -142,7 +142,12 @@ proc/isembryo(A) return 1 return 0 -proc/isobserver(A) +/proc/isguardian(A) + if(istype(A, /mob/living/simple_animal/hostile/guardian)) + return 1 + return 0 + +/proc/isobserver(A) if(istype(A, /mob/dead/observer)) return 1 return 0 diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 6f9e9ad1440..c6f9c2814c7 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -5,9 +5,9 @@ datum/preferences gender = gender_override else gender = pick(MALE, FEMALE) - underwear = random_underwear(gender) - undershirt = random_undershirt(gender) - socks = random_socks(gender) + underwear = random_underwear(gender, species) + undershirt = random_undershirt(gender, species) + socks = random_socks(gender, species) if(species == "Human") s_tone = random_skin_tone() h_style = random_hair_style(gender, species) @@ -223,7 +223,18 @@ datum/preferences //Tail if(current_species && (current_species.bodyflags & HAS_TAIL)) - var/icon/temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[current_species.tail]_s") + var/tail_icon + var/tail_icon_state + + if(body_accessory) + var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory] + tail_icon = accessory.icon + tail_icon_state = accessory.icon_state + else + tail_icon = "icons/effects/species.dmi" + tail_icon_state = "[current_species.tail]_s" + + var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state) preview_icon.Blend(temp, ICON_OVERLAY) // Skin color @@ -257,19 +268,19 @@ datum/preferences if(underwear && current_species.clothing_flags & HAS_UNDERWEAR) var/datum/sprite_accessory/underwear/U = underwear_list[underwear] if(U) - underwear_s = new/icon(U.icon, "[U.icon_state]_s", ICON_OVERLAY) + underwear_s = new/icon(U.icon, "uw_[U.icon_state]_s", ICON_OVERLAY) var/icon/undershirt_s = null if(undershirt && current_species.clothing_flags & HAS_UNDERSHIRT) var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] if(U2) - undershirt_s = new/icon(U2.icon, "[U2.icon_state]_s", ICON_OVERLAY) + undershirt_s = new/icon(U2.icon, "us_[U2.icon_state]_s", ICON_OVERLAY) var/icon/socks_s = null if(socks && current_species.clothing_flags & HAS_SOCKS) var/datum/sprite_accessory/socks/U3 = socks_list[socks] if(U3) - socks_s = new/icon(U3.icon, "[U3.icon_state]_s", ICON_OVERLAY) + socks_s = new/icon(U3.icon, "sk_[U3.icon_state]_s", ICON_OVERLAY) var/icon/clothes_s = null var/uniform_dmi='icons/mob/uniform.dmi' diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 0fd9804bd46..50183e4e506 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -28,11 +28,11 @@ L[D.name] = D switch(D.gender) - if(MALE) male += D.name - if(FEMALE) female += D.name + if(MALE) male[D.name] = D + if(FEMALE) female[D.name] = D else - male += D.name - female += D.name + male[D.name] = D + female[D.name] = D return L /datum/sprite_accessory @@ -115,16 +115,17 @@ icon_state = "hair_halfbang_alt" ponytail1 - name = "Ponytail 1" - icon_state = "hair_ponytail" + name = "Ponytail male" + icon_state = "hair_ponytailm" + gender = MALE ponytail2 - name = "Ponytail 2" - icon_state = "hair_pa" + name = "Ponytail female" + icon_state = "hair_ponytailf" gender = FEMALE ponytail3 - name = "Ponytail 3" + name = "Ponytail alt" icon_state = "hair_ponytail3" sideponytail @@ -132,6 +133,17 @@ icon_state = "hair_stail" gender = FEMALE + highponytail + name = "High Ponytail" + icon_state = "hair_highponytail" + gender = FEMALE + + + wisp + name = "Wisp" + icon_state = "hair_wisp" + gender = FEMALE + parted name = "Parted" icon_state = "hair_parted" @@ -316,6 +328,7 @@ name = "Balding Hair" icon_state = "hair_e" gender = MALE // turnoff! + ////////////////////////////// //////START VG HAIRSTYLES///// ////////////////////////////// @@ -1006,7 +1019,7 @@ /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington") + species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skellington") nude name = "Nude" @@ -1079,7 +1092,7 @@ /datum/sprite_accessory/undershirt icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington") + species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skellington") /datum/sprite_accessory/undershirt/nude name = "Nude" @@ -1318,6 +1331,7 @@ /////////////////////// /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/nude name = "Nude" @@ -1330,111 +1344,95 @@ name = "Normal White" icon_state = "white_norm" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/black_norm name = "Normal Black" icon_state = "black_norm" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/white_short name = "Short White" icon_state = "white_short" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/black_short name = "Short Black" icon_state = "black_short" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/white_knee name = "Knee-high White" icon_state = "white_knee" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/black_knee name = "Knee-high Black" icon_state = "black_knee" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/thin_knee name = "Knee-high Thin" icon_state = "thin_knee" gender = FEMALE - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/striped_knee name = "Knee-high Striped" icon_state = "striped_knee" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/rainbow_knee name = "Knee-high Rainbow" icon_state = "rainbow_knee" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/white_thigh name = "Thigh-high White" icon_state = "white_thigh" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/black_thigh name = "Thigh-high Black" icon_state = "black_thigh" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/thin_thigh name = "Thigh-high Thin" icon_state = "thin_thigh" gender = FEMALE - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/striped_thigh name = "Thigh-high Striped" icon_state = "striped_thigh" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/rainbow_thigh name = "Thigh-high Rainbow" icon_state = "rainbow_thigh" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/pantyhose name = "Pantyhose" icon_state = "pantyhose" gender = FEMALE - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/black_fishnet name = "Black Fishnet" icon_state = "black_fishnet" gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") /datum/sprite_accessory/socks/vox_white name = "Vox White" diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm index 52da17c2c82..e43585243ae 100644 --- a/code/modules/nano/modules/atmos_control.dm +++ b/code/modules/nano/modules/atmos_control.dm @@ -3,7 +3,7 @@ var/obj/access = new() var/emagged = 0 var/ui_ref - var/list/monitored_alarms = list() + var/list/monitored_alarms = null /datum/nano_module/atmos_control/New(atmos_computer, req_access, req_one_access, monitored_alarm_ids) ..() @@ -23,7 +23,7 @@ if(href_list["alarm"]) if(ui_ref) - var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms.len ? monitored_alarms : machines) + var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms ? monitored_alarms : machines) if(alarm) var/datum/topic_state/TS = generate_state(alarm) alarm.ui_interact(usr, master_ui = ui_ref, state = TS) diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 309136dcba0..58c2036848a 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -7,7 +7,7 @@ throwforce = 20 armour_penetration = 15 var/cooldown = 0 // Because spam aint cool, yo. - var/datum/effect/effect/system/spark_spread/spark_system + var/datum/effect/system/spark_spread/spark_system /obj/item/weapon/katana/energy/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) @@ -69,7 +69,7 @@ /obj/item/weapon/katana/energy/New() ..() - spark_system = new /datum/effect/effect/system/spark_spread() + spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 99a3506237e..ca625443893 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -858,7 +858,7 @@ Note that amputating the affected organ does in fact remove the infection from t "Your [src.name] explodes!",\ "You hear an explosion!") explosion(get_turf(owner),-1,-1,2,3) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, victim) spark_system.attach(owner) spark_system.start() diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index 9fcad11f440..3e651613164 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -5,14 +5,14 @@ max_damage = 50 //made same as arm, since it is not vital min_broken_damage = 30 encased = null - + /obj/item/organ/external/head/ipc/New() robotize("Morpheus Cyberkinetics") ..() /obj/item/organ/external/chest/ipc encased = null - + /obj/item/organ/external/chest/ipc/New() robotize("Morpheus Cyberkinetics") ..() @@ -91,6 +91,7 @@ organ_tag = "brain" parent_organ = "chest" vital = 1 + max_damage = 200 var/obj/item/device/mmi/stored_mmi /obj/item/organ/mmi_holder/proc/update_from_mmi() diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 8d8242cba70..173723bf4cb 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -35,8 +35,12 @@ user << "You put the [W] into \the [src]." update_icon() else if(istype(W, /obj/item/weapon/pen)) - var/n_name = sanitize(copytext(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text, 1, MAX_NAME_LEN)) - if((loc == usr && usr.stat == 0)) + var/n_name = input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text|null + if(!n_name) + return + n_name = sanitize(copytext(n_name, 1, MAX_NAME_LEN)) + + if((loc == usr || Adjacent(usr)) && usr.stat == 0) name = "folder[(n_name ? text("- '[n_name]'") : null)]" return diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 78aa9174d5f..39c5442c7e7 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -13,6 +13,7 @@ var/copies = 1 //how many copies to print! var/toner = 30 //how much toner is left! woooooo~ var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier! + var/mob/living/ass = null /obj/machinery/photocopier/attack_ai(mob/user as mob) return attack_hand(user) @@ -21,7 +22,7 @@ user.set_machine(src) var/dat = "Photocopier

" - if(copyitem) + if(copyitem || (ass && (ass.loc == src.loc))) dat += "Remove Item
" if(toner) dat += "Copy
" @@ -57,6 +58,9 @@ else if (istype(copyitem, /obj/item/weapon/paper_bundle)) var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem) sleep(15*B.amount) + else if (ass && ass.loc == src.loc) + copyass() + sleep(15) else usr << "\The [copyitem] can't be copied by \the [src]." break @@ -70,6 +74,9 @@ usr << "You take \the [copyitem] out of \the [src]." copyitem = null updateUsrDialog() + else if(check_ass()) + ass << "You feel a slight pressure on your ass." + updateUsrDialog() else if(href_list["min"]) if(copies > 1) copies-- @@ -127,6 +134,17 @@ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + else if(istype(O, /obj/item/weapon/grab)) //For ass-copying. + var/obj/item/weapon/grab/G = O + if(ismob(G.affecting) && G.affecting != ass) + var/mob/GM = G.affecting + visible_message("[usr] drags [GM.name] onto the photocopier!") + GM.loc = get_turf(src) + ass = GM + if(copyitem) + copyitem.loc = src.loc + copyitem = null + updateUsrDialog() return /obj/machinery/photocopier/ex_act(severity) @@ -203,6 +221,64 @@ visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") return p + +/obj/machinery/photocopier/proc/copyass() + var/icon/temp_img + if(check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. + if(ishuman(ass)) //Suit checks are in check_ass + var/mob/living/carbon/human/H = ass + switch(H.get_species()) + if("Human") + temp_img = icon('icons/obj/butts.dmi', "human") + if("Tajaran") + temp_img = icon('icons/obj/butts.dmi', "tajaran") + if("Unathi") + temp_img = icon('icons/obj/butts.dmi', "unathi") + if("Skrell") + temp_img = icon('icons/obj/butts.dmi', "skrell") + if("Vox") + temp_img = icon('icons/obj/butts.dmi', "vox") + if("Kidan") + temp_img = icon('icons/obj/butts.dmi', "kidan") + if("Grey") + temp_img = icon('icons/obj/butts.dmi', "grey") + if("Diona") + temp_img = icon('icons/obj/butts.dmi', "diona") + if("Slime People") + temp_img = icon('icons/obj/butts.dmi', "slime") + if("Vulpkanin") + temp_img = icon('icons/obj/butts.dmi', "vulp") + if("Machine") + temp_img = icon('icons/obj/butts.dmi', "machine") + if("Plasmaman") + temp_img = icon('icons/obj/butts.dmi', "plasma") + else + temp_img = icon('icons/obj/butts.dmi', "human") + else if(istype(ass,/mob/living/silicon/robot/drone)) + temp_img = icon('icons/obj/butts.dmi', "drone") + else if(istype(ass,/mob/living/simple_animal/diona)) + temp_img = icon('icons/obj/butts.dmi', "nymph") + else if(isalien(ass) || istype(ass,/mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. + temp_img = icon('icons/obj/butts.dmi', "xeno") + else return + else + return + var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc) + p.desc = "You see [ass]'s ass on the photo." + p.pixel_x = rand(-10, 10) + p.pixel_y = rand(-10, 10) + p.img = temp_img + var/icon/small_img = icon(temp_img) //Icon() is needed or else temp_img will be rescaled too >.> + var/icon/ic = icon('icons/obj/items.dmi',"photo") + small_img.Scale(8, 8) + ic.Blend(small_img,ICON_OVERLAY, 10, 13) + p.icon = ic + toner -= 5 + if(toner < 0) + toner = 0 + visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") + return p + //If need_toner is 0, the copies will still be lightened when low on toner, however it will not be prevented from printing. TODO: Implement print queues for fax machines and get rid of need_toner /obj/machinery/photocopier/proc/bundlecopy(var/obj/item/weapon/paper_bundle/bundle, var/need_toner=1) var/obj/item/weapon/paper_bundle/p = new /obj/item/weapon/paper_bundle (src) @@ -227,6 +303,36 @@ p.pixel_x = rand(-9, 9) return p + +/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) + check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off. + if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass) + return + src.add_fingerprint(user) + if(target == user && !user.incapacitated()) + visible_message("[usr] jumps onto the photocopier!") + else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + if(target.anchored) return + if(!ishuman(user)) return + visible_message("[usr] drags [target.name] onto the photocopier!") + target.loc = get_turf(src) + ass = target + if(copyitem) + copyitem.loc = src.loc + visible_message("[copyitem] is shoved out of the way by [ass]!") + copyitem = null + updateUsrDialog() + +/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name. + if(!ass) + return 0 + if(ass.loc != src.loc) + ass = null + updateUsrDialog() + return 0 + else + return 1 + /obj/item/device/toner name = "toner cartridge" icon_state = "tonercartridge" diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 0ac35dd1455..1c3ea26b911 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -150,6 +150,24 @@ var/icon_on = "camera" var/icon_off = "camera_off" var/size = 3 + var/see_ghosts = 0 //for the spoop of it + + +/obj/item/device/camera/spooky/CheckParts() + var/obj/item/device/camera/C = locate(/obj/item/device/camera) in contents + if(C) + pictures_max = C.pictures_max + pictures_left = C.pictures_left + visible_message("[C] has been imbued with godlike power!") + qdel(C) + + +var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","shadow","ghostian2") + +/obj/item/device/camera/spooky + name = "camera obscura" + desc = "A polaroid camera, some say it can see ghosts!" + see_ghosts = 1 /obj/item/device/camera/verb/change_size() set name = "Set Photo Focus" @@ -184,7 +202,7 @@ ..() -/obj/item/device/camera/proc/get_icon(list/turfs, turf/center) +/obj/item/device/camera/proc/get_icon(list/turfs, turf/center,mob/user) //Bigger icon base to capture those icons that were shifted to the next tile //i.e. pretty much all wall-mounted machinery @@ -199,8 +217,20 @@ atoms.Add(the_turf); // As well as anything that isn't invisible. for(var/atom/A in the_turf) - if(A.invisibility) continue - atoms.Add(A) + if(A.invisibility ) + if(see_ghosts && istype(A,/mob/dead/observer)) + var/mob/dead/observer/O = A + if(O.following) + continue + if(user.mind && !(user.mind.assigned_role == "Chaplain")) + atoms.Add(image('icons/mob/mob.dmi', O.loc, pick(SpookyGhosts), 4, SOUTH)) + else + atoms.Add(image('icons/mob/mob.dmi', O.loc, "ghost", 4, SOUTH)) + else//its not a ghost + continue + else//not invisable, not a spookyghost add it. + atoms.Add(A) + // Sort the atoms into their layers var/list/sorted = sort_atoms_by_layer(atoms) @@ -235,21 +265,35 @@ /obj/item/device/camera/proc/get_mobs(turf/the_turf as turf) var/mob_detail - for(var/mob/living/carbon/A in the_turf) - if(A.invisibility) continue - var/holding = null - if(A.l_hand || A.r_hand) - if(A.l_hand) holding = "They are holding \a [A.l_hand]" - if(A.r_hand) - if(holding) - holding += " and \a [A.r_hand]" + for(var/mob/M in the_turf) + if(M.invisibility) + if(see_ghosts && istype(M,/mob/dead/observer)) + var/mob/dead/observer/O = M + if(O.following) + continue + if(!mob_detail) + mob_detail = "You can see a g-g-g-g-ghooooost! " else - holding = "They are holding \a [A.r_hand]" + mob_detail += "You can also see a g-g-g-g-ghooooost!" + else + continue - if(!mob_detail) - mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " - else - mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." + var/holding = null + + if(istype(M, /mob/living/carbon)) + var/mob/living/carbon/A = M + if(A.l_hand || A.r_hand) + if(A.l_hand) holding = "They are holding \a [A.l_hand]" + if(A.r_hand) + if(holding) + holding += " and \a [A.r_hand]" + else + holding = "They are holding \a [A.r_hand]" + + if(!mob_detail) + mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " + else + mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." return mob_detail /obj/item/device/camera/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) @@ -263,6 +307,9 @@ user << "[pictures_left] photos left." icon_state = icon_off on = 0 + if(user.mind && !(user.mind.assigned_role == "Chaplain")) + if(prob(24)) + handle_haunt(user) spawn(64) icon_state = icon_on on = 1 @@ -298,7 +345,7 @@ printpicture(user, P) /obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag) - var/icon/photoimage = get_icon(turfs, target) + var/icon/photoimage = get_icon(turfs, target,user) var/icon/small_img = icon(photoimage) var/icon/tiny_img = icon(photoimage) @@ -483,3 +530,15 @@ talk_into(M, msg) for(var/mob/living/carbon/human/H in watcherslist) H.show_message(text("\blue (Newscaster) [] says, '[]'",M,msg), 1) + + + +///hauntings, like hallucinations but more spooky + +/obj/item/device/camera/proc/handle_haunt(mob/user as mob) + var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\ + 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ + 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ + 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ + 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') + user << pick(creepyasssounds) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 67f5771588a..897cfa1f9f1 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -515,7 +515,7 @@ var/turf/T = get_turf(src) var/obj/structure/cable/N = T.get_cable_node() if (prob(50) && electrocute_mob(usr, N, N)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() return @@ -534,7 +534,7 @@ if(do_after(user, 50, target = src)) if(terminal && opened && has_electronics!=2) if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() return @@ -654,7 +654,7 @@ var/mob/living/carbon/human/H = user if(!isnull(H.internal_organs_by_name["cell"]) && H.a_intent == I_GRAB) if(emagged || stat & BROKEN) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() H << "The APC power currents surge erratically, damaging your chassis!" @@ -1084,11 +1084,11 @@ cell.corrupt() src.malfhack = 1 update_icon() - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() smoke.set_up(3, 0, src.loc) smoke.attach(src) smoke.start() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() for(var/mob/M in viewers(src)) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index a40eb0d9059..622a00fb325 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -182,7 +182,7 @@ By design, d1 is the smallest direction and d2 is the highest if(!prob(prb)) return 0 if (electrocute_mob(user, powernet, src, siemens_coeff)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() return 1 diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 4e509cbe51a..c11292d4fd7 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -102,7 +102,7 @@ // update icon overlays and power usage only if displayed level has changed if(lastgen > powercap && prob(10)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() lastgen *= 0.5 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index c75f53905f4..f7ca916dfff 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -371,7 +371,7 @@ user << "You stick \the [W] into the light socket!" if(has_power() && (W.flags & CONDUCT)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() //if(!user.mutations & RESIST_COLD) @@ -521,7 +521,7 @@ if(status == LIGHT_OK || status == LIGHT_BURNED) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) if(on) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() status = LIGHT_BROKEN diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d7b8d2bcdd1..1eea4bc9d0b 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -196,7 +196,7 @@ A.dir = src.dir playsound(get_turf(src), 'sound/weapons/emitter.ogg', 25, 1) if(prob(35)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index ae989ab3c45..33a5c69fdc8 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -13,7 +13,7 @@ icon_state = "smes" density = 1 anchored = 1 - + var/capacity = 5e6 // maximum charge var/charge = 0 // actual charge @@ -52,7 +52,7 @@ component_parts += new /obj/item/weapon/stock_parts/capacitor(null) component_parts += new /obj/item/stack/cable_coil(null, 5) RefreshParts() - + spawn(5) if(!powernet) connect_to_network() @@ -84,8 +84,8 @@ component_parts += new /obj/item/weapon/stock_parts/cell/hyper(null) component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) component_parts += new /obj/item/stack/cable_coil(null, 5) - RefreshParts() - + RefreshParts() + /obj/machinery/power/smes/RefreshParts() var/IO = 0 var/C = 0 @@ -184,7 +184,7 @@ if(do_after(user, 50, target = src)) if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) //animate the electrocution if uncautious and unlucky - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() return @@ -200,7 +200,7 @@ //crowbarring it ! default_deconstruction_crowbar(I) - + /obj/machinery/power/smes/disconnect_terminal() if(terminal) terminal.master = null @@ -224,7 +224,7 @@ /obj/machinery/power/smes/proc/chargedisplay() return round(5.5*charge/(capacity ? capacity : 5e6)) -#define SMESRATE 0.05 +#define SMESRATE 0.05 /obj/machinery/power/smes/process() @@ -325,15 +325,15 @@ var/turf/T = get_turf(user) var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one if (prob(50) && electrocute_mob(user, N, N)) //animate the electrocution if uncautious and unlucky - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() return - + user.visible_message(\ "[user.name] adds the cables and connects the power terminal.",\ "You add the cables and connect the power terminal.") - + terminal = new /obj/machinery/power/terminal(tempLoc) terminal.dir = tempDir terminal.master = src @@ -375,7 +375,7 @@ data["outputLevel"] = output_level data["outputMax"] = output_level_max data["outputLoad"] = round(output_used) - + if(outputting) data["outputting"] = 2 // smes is outputting else if(!outputting && output_attempt) @@ -407,7 +407,7 @@ else if( href_list["online"] ) outputting(!output_attempt) update_icon() - + else if( href_list["input"] ) switch( href_list["input"] ) if("min") @@ -438,7 +438,7 @@ for(var/mob/M in viewers(src)) M.show_message("\red The [src.name] is making strange noises!", 3, "\red You hear sizzling electronics.", 2) sleep(10*pick(4,5,6,7,10,14)) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() smoke.set_up(3, 0, src.loc) smoke.attach(src) smoke.start() @@ -446,7 +446,7 @@ qdel(src) return if(prob(15)) //Power drain - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() if(prob(50)) @@ -454,7 +454,7 @@ else emp_act(2) if(prob(5)) //smoke only - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() smoke.set_up(3, 0, src.loc) smoke.attach(src) smoke.start() @@ -481,7 +481,7 @@ ..() /obj/machinery/power/smes/engineering - charge = 2e6 // Engineering starts with some charge for singulo + charge = 2e6 // Engineering starts with some charge for singulo /obj/machinery/power/smes/magical name = "magical power storage unit" diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index e4906df5620..7841b1e94b8 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -35,6 +35,24 @@ else user.update_inv_r_hand() +/obj/item/weapon/gun/energy/gun/cyborg + desc = "An energy-based laser gun that draws power from the cyborg's internal energy cell directly. So this is what freedom looks like?" + +/obj/item/weapon/gun/energy/gun/cyborg/process() + return 1 + +/obj/item/weapon/gun/energy/gun/cyborg/process_chambered() + if(in_chamber) + return 1 + if(isrobot(src.loc)) + var/mob/living/silicon/robot/R = src.loc + if(R && R.cell && R.cell.charge >= 83) + R.cell.use(83) + in_chamber = new projectile_type(src) + return 1 + return 0 + + /obj/item/weapon/gun/energy/gun/mounted name = "mounted energy gun" self_recharge = 1 diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index f5d5e6a6883..eb4bf5c37d1 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -122,7 +122,7 @@ /obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user as mob) do_teleport(user, user, 10) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() smoke.set_up(10, 0, user.loc) smoke.start() charges-- diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 2a2d32bc3eb..a379e6cb61c 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -21,7 +21,7 @@ /obj/item/projectile/energy/electrode/on_hit(var/atom/target, var/blocked = 0) if(!proj_hit) if(!ismob(target) || blocked >= 2) //Fully blocked by mob or collided with dense object - burst into sparks! - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread sparks.set_up(1, 1, src) sparks.start() proj_hit = 1 @@ -35,7 +35,7 @@ /obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet if(!proj_hit) - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread sparks.set_up(1, 1, src) sparks.start() proj_hit = 1 diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 63a3f2a3a79..5b740a0699b 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -90,7 +90,7 @@ if(!stuff.anchored && stuff.loc) teleammount++ do_teleport(stuff, stuff, 10) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() smoke.set_up(max(round(10 - teleammount),1), 0, stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity smoke.start() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index b2563d846ea..38fa2f06fdb 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -203,7 +203,7 @@ icon_state = "snappop" Bump(atom/A as mob|obj|turf|area) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() new /obj/effect/decal/cleanable/ash(src.loc) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index f98c01072f6..47e1546de1a 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -22,6 +22,8 @@ var/const/INGEST = 2 for(var/path in paths) var/datum/reagent/D = new path() chemical_reagents_list[D.id] = D + if(!D.can_grow_in_plants) + plant_blocked_chems.Add(D.id) if(!chemical_reactions_list) //Chemical Reactions - Initialises all /datum/chemical_reaction into a list // It is filtered into multiple lists within a list. diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 55ba20e3880..7f090a72be6 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -569,12 +569,19 @@ else if (href_list["createpill"] || href_list["createpill_multiple"]) if(!condi) var/count = 1 - if (href_list["createpill_multiple"]) count = isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num) + if (href_list["createpill_multiple"]) + count = input("Select the number of pills to make.", 10, pillamount) as num|null + if(count == null) + return + count = isgoodnumber(count) if (count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines? if (count <= 0) return var/amount_per_pill = reagents.total_volume/count if (amount_per_pill > 50) amount_per_pill = 50 - var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)")) + var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)") as text|null + if(!name) + return + name = reject_bad_text(name) while (count--) var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc) if(!name) name = reagents.get_master_reagent_name() @@ -588,7 +595,10 @@ P.forceMove(loaded_pill_bottle) src.updateUsrDialog() else - var/name = reject_bad_text(input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name())) + var/name = input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name()) as text|null + if(!name) + return + name = reject_bad_text(name) var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(src.loc) if(!name) name = reagents.get_master_reagent_name() P.originalname = name @@ -598,13 +608,20 @@ else if (href_list["createpatch"] || href_list["createpatch_multiple"]) if(!condi) var/count = 1 - if (href_list["createpatch_multiple"]) count = isgoodnumber(input("Select the number of patches to make.", 10, patchamount) as num) + if (href_list["createpatch_multiple"]) + count = input("Select the number of patches to make.", 10, patchamount) as num|null + if(count == null) + return + count = isgoodnumber(count) if(!count || count <= 0) return if (count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? var/amount_per_patch = reagents.total_volume/count if (amount_per_patch > 40) amount_per_patch = 40 - var/name = reject_bad_text(input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch] units)")) + var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch] units)") as text|null + if(!name) + return + name = reject_bad_text(name) while (count--) var/obj/item/weapon/reagent_containers/pill/patch/P = new/obj/item/weapon/reagent_containers/pill/patch(src.loc) if(!name) name = reagents.get_master_reagent_name() @@ -614,7 +631,10 @@ reagents.trans_to(P,amount_per_patch) else if (href_list["createbottle"]) if(!condi) - var/name = reject_bad_text(input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name())) + var/name = input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()) as text|null + if(!name) + return + name = reject_bad_text(name) var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) if(!name) name = reagents.get_master_reagent_name() P.name = "[name] bottle" diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index f700ec2aa16..9bee5b09324 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -521,7 +521,7 @@ M.drop_item() ..() if(prob(50)) - M.adjustToxLoss(10) + M.adjustFireLoss(10) M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) return @@ -551,7 +551,7 @@ /datum/reagent/lube/ultra/addiction_act_stage4(var/mob/living/carbon/human/M as mob) M.Jitter(20) M.Dizzy(20) - M.adjustToxLoss(5) + M.adjustBrainLoss(2) if(prob(50)) M.emote(pick("twitch","buzz","moan")) ..() @@ -605,7 +605,7 @@ /datum/reagent/surge/addiction_act_stage1(var/mob/living/M as mob) M.adjustBrainLoss(rand(1,5)*REM) - M.adjustToxLoss(rand(1,5)*REM) + M.hallucination += rand(1,5) ..() return /datum/reagent/surge/addiction_act_stage2(var/mob/living/M as mob) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 9905345926b..4745a026fbf 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -96,7 +96,7 @@ datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vo datum/reagent/synthflesh/reaction_turf(var/turf/T, var/volume) //let's make a mess! src = null if(volume >= 5) - new /obj/effect/decal/cleanable/blood/gibs(T) + new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) return @@ -278,7 +278,7 @@ datum/reagent/sal_acid description = "This is a is a standard salicylate pain reliever and fever reducer." reagent_state = LIQUID color = "#B3B3B3" - shock_reduction = 40 + shock_reduction = 25 overdose_threshold = 25 datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob) @@ -444,7 +444,7 @@ datum/reagent/morphine color = "#C8A5DC" overdose_threshold = 30 addiction_threshold = 25 - shock_reduction = 60 + shock_reduction = 50 datum/reagent/morphine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -987,7 +987,7 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob) // Synth-Meds // ////////////////////////////// -//Degreaser: Anti-toxin / Lube Remover +//Degreaser: Mild Purgative / Lube Remover /datum/reagent/degreaser name = "Degreaser" id = "degreaser" @@ -1016,7 +1016,11 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob) /datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - M.adjustToxLoss(-1.5*REM) + if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.confused -= 5 for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) if(R.id == "ultralube" || R.id == "lube") diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index faf530f6b3e..a3dc47f26a4 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -47,6 +47,8 @@ datum/reagents/proc/metabolize(var/mob/M) R.overdosed = 1 M << "You feel like you took too much [R.name]!" R.overdose_start(M) + if(R.volume < R.overdose_threshold && R.overdosed) + R.overdosed = 0 if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) var/datum/reagent/new_reagent = new R.type() addiction_list.Add(new_reagent) diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm index 7e1e9899993..fa33c4fbf8e 100644 --- a/code/modules/reagents/newchem/other.dm +++ b/code/modules/reagents/newchem/other.dm @@ -305,6 +305,53 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob) return +/datum/chemical_reaction/soapification + name = "Soapification" + id = "soapification" + result = null + required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles + min_temp = 374 + result_amount = 1 + + +/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/weapon/soap/homemade(location) + return + +/datum/chemical_reaction/candlefication + name = "Candlefication" + id = "candlefication" + result = null + required_reagents = list("liquidgibs" = 5, "oxygen" = 5) // + min_temp = 374 + result_amount = 1 + +/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/candle(location) + return + + +/datum/chemical_reaction/meatification + name = "Meatification" + id = "meatification" + result = null + required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10) + result_amount = 1 + +/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct(location) + return + +/datum/chemical_reaction/lye + name = "lye" + id = "lye" + result = "lye" + required_reagents = list("sodium" = 1, "hydrogen" = 1, "oxygen" = 1) + result_amount = 3 + ///Alchemical Reagents datum/reagent/eyenewt diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm index a85060132ae..cb915f9a4c2 100644 --- a/code/modules/reagents/newchem/pyro.dm +++ b/code/modules/reagents/newchem/pyro.dm @@ -190,7 +190,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit /datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, location) s.start() sleep(rand(20,30)) @@ -200,7 +200,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit /* /datum/reagent/blackpowder/on_ex_act() var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, location) s.start() sleep(rand(10,15)) @@ -244,7 +244,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit /datum/chemical_reaction/flash_powder_flash/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, location) s.start() for(var/mob/living/carbon/C in viewers(5, location)) @@ -260,7 +260,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit if(holder.has_reagent("stabilizing_agent")) return var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, location) s.start() for(var/mob/living/carbon/C in viewers(5, location)) @@ -302,7 +302,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit if(holder.has_reagent(f_reagent)) holder.remove_reagent(f_reagent, holder.get_reagent_amount(f_reagent)) var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + var/datum/effect/system/chem_smoke_spread/S = new /datum/effect/system/chem_smoke_spread S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) spawn(0) @@ -428,7 +428,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit if(holder.has_reagent("stabilizing_agent")) return var/turf/simulated/T = get_turf(holder.my_atom) - for(var/turf/simulated/turf in range(created_volume/10,T)) + for(var/turf/simulated/turf in range(min(created_volume/10,4),T)) new /obj/effect/hotspot(turf) return diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm index ac37f82fe31..698f27350bb 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm @@ -42,8 +42,8 @@ name = "Soy Sauce" id = "soysauce" result = "soysauce" - required_reagents = list("soymilk" = 2, "flour" = 1, "sodiumchloride" = 1, "water" = 3) - result_amount = 7 + required_reagents = list("soymilk" = 1,"sodiumchloride" = 1, "water" = 8) + result_amount = 10 cheesewheel name = "Cheesewheel" diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm index 4ec4c1bb9e4..dc4dbbfbd90 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm @@ -10,7 +10,7 @@ mix_message = "The mixture explodes!" on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/effect/effect/system/reagents_explosion/e = new() + var/datum/effect/system/reagents_explosion/e = new() e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0) e.start() holder.clear_reagents() @@ -60,7 +60,7 @@ required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) result_amount = 2 on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/effect/effect/system/reagents_explosion/e = new() + var/datum/effect/system/reagents_explosion/e = new() e.set_up(round (created_volume/2, 1), holder.my_atom, 0, 0) e.start() diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm index 809a8dfd34d..e44a166a87a 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm @@ -87,5 +87,5 @@ name = "Sterilizine" id = "sterilizine" result = "sterilizine" - required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) + required_reagents = list("antihol" = 2, "chlorine" = 1) result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm index f884ef6cb63..99f6e60a5e6 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm @@ -33,7 +33,7 @@ //for(var/datum/reagent/R in holder.reagent_list) // world << "[R.name] = [R.volume]" - var/datum/effect/effect/system/foam_spread/s = new() + var/datum/effect/system/foam_spread/s = new() s.set_up(created_volume, location, holder, 0) s.start() holder.clear_reagents() @@ -54,7 +54,7 @@ for(var/mob/M in viewers(5, location)) M << "\red The solution spews out a metalic foam!" - var/datum/effect/effect/system/foam_spread/s = new() + var/datum/effect/system/foam_spread/s = new() s.set_up(created_volume, location, holder, 1) s.start() return @@ -74,7 +74,7 @@ for(var/mob/M in viewers(5, location)) M << "\red The solution spews out a metalic foam!" - var/datum/effect/effect/system/foam_spread/s = new() + var/datum/effect/system/foam_spread/s = new() s.set_up(created_volume, location, holder, 2) s.start() return diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index 9d38b1ad599..b44ffa066c4 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -202,6 +202,7 @@ result_amount = 10 required_container = /obj/item/slime_extract/blue required_other = 1 + //Dark Blue slimefreeze name = "Slime Freeze" @@ -221,6 +222,21 @@ M.bodytemperature -= 140 M << "\blue You feel a chill!" + + slimefireproof + name = "Slime Fireproof" + id = "m_fireproof" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/darkblue + required_other = 1 + + on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/weapon/slimefireproof/P = new /obj/item/weapon/slimefireproof + P.loc = get_turf(holder.my_atom) + //Orange slimecasp name = "Slime Capsaicin Oil" @@ -353,6 +369,21 @@ for(var/mob/O in viewers(get_turf(holder.my_atom), null)) O.show_message(text("\red The [slime] is driven into a frenzy!."), 1) + + slimespeed + name = "Slime Speed" + id = "m_speed" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/red + required_other = 1 + + on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/weapon/slimespeed/P = new /obj/item/weapon/slimespeed + P.loc = get_turf(holder.my_atom) + //Pink slimeppotion name = "Slime Potion" @@ -402,7 +433,7 @@ required_reagents = list("plasma" = 5) required_other = 1 on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/slimepotion2/P = new /obj/item/weapon/slimepotion2 + var/obj/item/weapon/sentience_potion/P = new /obj/item/weapon/sentience_potion P.loc = get_turf(holder.my_atom) //Adamantine slimegolem diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm index 0dcf2e98c30..c84b0f327e9 100644 --- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm +++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm @@ -12,6 +12,7 @@ var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) var/shock_reduction = 0 var/penetrates_skin = 0 //Whether or not a reagent penetrates the skin + var/can_grow_in_plants = 1 //Determines if the reagent can be grown in plants, 0 means it cannot be grown //Processing flags, defines the type of mobs the reagent will affect //By default, all reagents will ONLY affect organics, not synthetics. Re-define in the reagent's definition if the reagent is meant to affect synths var/process_flags = ORGANIC diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index d33f4ab80e9..0dd38567ccc 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -6,6 +6,7 @@ reagent_state = LIQUID nutriment_factor = 0 //So alcohol can fill you up! If they want to. color = "#404030" // rgb: 64, 64, 48 + can_grow_in_plants = 0 //Alcoholic drinks won't be grown in plants (would "water down" random seed chems too much) var/datum/martial_art/drunk_brawling/F = new var/dizzy_adj = 3 var/slurr_adj = 3 diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 5377ec3f56c..1db18dd1d41 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -326,6 +326,30 @@ qdel(R) T.Bless() + +/datum/reagent/liquidgibs + name = "Liquid gibs" + id = "liquidgibs" + color = "#FF9966" + description = "You don't even want to think about what's in here." + reagent_state = LIQUID + +/datum/reagent/liquidgibs/reaction_turf(var/turf/T, var/volume) //yes i took it from synthflesh... + src = null + if(volume >= 5) + new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) + playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) + return + + + +/datum/reagent/lye + name = "Lye" + id = "lye" + description = "Also known as sodium hydroxide." + reagent_state = LIQUID + color = "#FFFFD6" // very very light yellow + /* /datum/reagent/vaccine //data must contain virus type diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index e0113f2f078..101b7a772f9 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -799,6 +799,7 @@ New() ..() reagents.add_reagent("protein", 6) + reagents.add_reagent("porktonium", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/donkpocket @@ -3114,6 +3115,41 @@ reagents.add_reagent("toxin", 3) bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey + name = "Turkey" + desc = "A traditional turkey served with stuffing." + icon_state = "turkey" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/turkeyslice + slices_num = 6 + New() + ..() + reagents.add_reagent("protein", 24) + reagents.add_reagent("nutriment", 18) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/turkeyslice + name = "turkey serving" + desc = "A serving of some tender and delicious turkey." + icon_state = "turkeyslice" + trash = /obj/item/trash/plate + filling_color = "#B97A57" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/mashed_potatoes //mashed taters + name = "mashed potatoes" + desc = "Some sot creamy, and irresistible mashed potatoes." + icon_state = "mashedtaters" + trash = /obj/item/trash/plate + filling_color = "#D6D9C1" + bitesize = 2 + + New() + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("gravy", 5) + reagents.add_reagent("mashedpotatoes", 10) + bitesize = 2 + ////////////////////////////////ICE CREAM/////////////////////////////////// /obj/item/weapon/reagent_containers/food/snacks/icecream name = "ice cream" diff --git a/code/modules/reagents/reagent_containers/food/snacks/grown.dm b/code/modules/reagents/reagent_containers/food/snacks/grown.dm index 9c25497409c..bab6877e3ff 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/grown.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/grown.dm @@ -689,7 +689,7 @@ var/outer_teleport_radius = potency/10 //Plant potency determines radius of teleport. var/inner_teleport_radius = potency/15 var/list/turfs = new/list() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread if(inner_teleport_radius < 1) //Wasn't potent enough, it just splats. new/obj/effect/decal/cleanable/blood/oil(src.loc) src.visible_message("The [src.name] has been squashed.","You hear a smack.") diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index e22613e12d1..8c1e8544014 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -33,6 +33,9 @@ var/subjectname = "" var/subjectjob = null +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct + name = "meat product" + desc = "A slab of station reclaimed and chemically processed meat product." /obj/item/weapon/reagent_containers/food/snacks/meat/monkey //same as plain meat diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 1245bfe4e01..3e64245d2c5 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -161,7 +161,8 @@ user << "\blue You set the label to \"[tmp_label]\"." src.label_text = tmp_label src.update_name_label() - + if(istype(I,/obj/item/weapon/storage/bag)) + ..() proc/update_name_label() if(src.label_text == "") diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 2a0d82d3a03..a9bbdb68de6 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -46,7 +46,8 @@ attackby(obj/item/I as obj, mob/user as mob, params) - + if(istype(I,/obj/item/weapon/storage/bag)) + ..() return afterattack(obj/target, mob/user, proximity) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index fccc9008310..a09f058629c 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -386,6 +386,14 @@ build_path = /obj/item/weapon/reagent_containers/glass/beaker/large category = list("initial", "Medical") +/datum/design/healthanalyzer + name = "Health Analyzer" + id = "healthanalyzer" + build_type = AUTOLATHE + materials = list(MAT_METAL = 500, MAT_GLASS = 50) + build_path = /obj/item/device/healthanalyzer + category = list("initial", "Medical") + /datum/design/retractor name = "Retractor" id = "retractor" @@ -410,6 +418,14 @@ build_path = /obj/item/weapon/surgicaldrill category = list("initial", "Medical") +/datum/design/bonesetter + name = "Bone Setter" + id = "bonesetter" + build_type = AUTOLATHE + materials = list(MAT_METAL = 4000) + build_path = /obj/item/weapon/bonesetter + category = list("initial", "Medical") + /datum/design/syringe name = "Syringe" id = "syringe" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 2f46ef2532f..d0ed135176f 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -45,16 +45,6 @@ build_path = /obj/item/device/robotanalyzer category = list("Medical") -/datum/design/healthanalyzer - name = "Health Analyzer" - desc = "A hand-held body scanner able to distinguish vital signs of the subject." - id = "healthanalyzer" - req_tech = list("biotech" = 2, "magnets" = 2) - build_type = PROTOLATHE - materials = list(MAT_METAL = 20, MAT_GLASS = 20) - build_path = /obj/item/device/healthanalyzer - category = list("Medical") - /datum/design/healthanalyzer_upgrade name = "Health Analyzer Upgrade" desc = "An upgrade unit for expanding the functionality of a health analyzer." @@ -174,7 +164,7 @@ id = "scalpel_laser1" req_tech = list("biotech" = 2, "materials" = 2, "magnets" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 12500, MAT_GLASS = 7500) + materials = list(MAT_METAL = 2000, MAT_GLASS = 1500) build_path = /obj/item/weapon/scalpel/laser1 category = list("Medical") @@ -184,7 +174,7 @@ id = "scalpel_laser2" req_tech = list("biotech" = 3, "materials" = 4, "magnets" = 4) build_type = PROTOLATHE - materials = list(MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 2500) + materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000) build_path = /obj/item/weapon/scalpel/laser2 category = list("Medical") @@ -194,7 +184,7 @@ id = "scalpel_laser3" req_tech = list("biotech" = 4, "materials" = 6, "magnets" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 2000, MAT_GOLD = 1500) + materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000) build_path = /obj/item/weapon/scalpel/laser3 category = list("Medical") @@ -204,7 +194,7 @@ id = "scalpel_manager" req_tech = list("biotech" = 4, "materials" = 7, "magnets" = 5, "programming" = 4) build_type = PROTOLATHE - materials = list (MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 1500, MAT_GOLD = 1500, MAT_DIAMOND = 750) + materials = list (MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000, MAT_DIAMOND = 1000) build_path = /obj/item/weapon/scalpel/manager category = list("Medical") diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 0901f45f284..1f874d35c01 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -229,7 +229,7 @@ loaded_item = null /obj/machinery/r_n_d/experimentor/proc/throwSmoke(turf/where) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/system/harmless_smoke_spread/smoke = new smoke.set_up(1,0, where, 0) smoke.start() @@ -321,7 +321,7 @@ R.my_atom = src R.add_reagent(chosenchem , 15) investigate_log("Experimentor has released [chosenchem] smoke.", "experimentor") - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/system/chem_smoke_spread/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() @@ -333,7 +333,7 @@ var/datum/reagents/R = new/datum/reagents(15) R.my_atom = src R.add_reagent(chosenchem , 15) - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/system/chem_smoke_spread/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() @@ -421,7 +421,7 @@ R.my_atom = src R.add_reagent("frostoil" , 15) investigate_log("Experimentor has released frostoil gas.", "experimentor") - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/system/chem_smoke_spread/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() @@ -443,7 +443,7 @@ ejectItem(TRUE) if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!") - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/system/harmless_smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() ejectItem() @@ -623,10 +623,12 @@ var/realProc var/cooldownMax = 60 var/cooldown + var/floof /obj/item/weapon/relic/New() icon_state = pick("shock_kit","armor-igniter-analyzer","infra-igniter0","infra-igniter1","radio-multitool","prox-radio1","radio-radio","timer-multitool0","radio-igniter-tank") realName = "[pick("broken","twisted","spun","improved","silly","regular","badly made")] [pick("device","object","toy","illegal tech","weapon")]" + floof = pick(/mob/living/simple_animal/pet/corgi, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/fox, /mob/living/simple_animal/mouse, /mob/living/simple_animal/pet/pug, /mob/living/simple_animal/lizard, /mob/living/simple_animal/diona, /mob/living/simple_animal/butterfly, /mob/living/carbon/human/monkey) /obj/item/weapon/relic/proc/reveal() @@ -635,7 +637,7 @@ revealed = TRUE name = realName cooldownMax = rand(60,300) - realProc = pick("teleport","explode","rapidDupe","petSpray","flash","clean","corgicannon") + realProc = pick("teleport","explode","rapidDupe","petSpray","flash","clean","floofcannon") /obj/item/weapon/relic/attack_self(mob/user) if(revealed) @@ -653,16 +655,16 @@ //////////////// RELIC PROCS ///////////////////////////// /obj/item/weapon/relic/proc/throwSmoke(turf/where) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/system/harmless_smoke_spread/smoke = new smoke.set_up(1,0, where, 0) smoke.start() -/obj/item/weapon/relic/proc/corgicannon(mob/user) +/obj/item/weapon/relic/proc/floofcannon(mob/user) playsound(src.loc, "sparks", rand(25,50), 1) - var/mob/living/simple_animal/pet/corgi/C = new/mob/living/simple_animal/pet/corgi(get_turf(user)) + var/mob/living/C = new floof(get_turf(user)) C.throw_at(pick(oview(10,user)),10,rand(3,8)) throwSmoke(get_turf(C)) - warn_admins(user, "Corgi Cannon", 0) + warn_admins(user, "Floof Cannon", 0) /obj/item/weapon/relic/proc/clean(mob/user) playsound(src.loc, "sparks", rand(25,50), 1) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm index ae7a19005f3..a0e2e44830e 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm @@ -10,12 +10,12 @@ if (user.buckled) user.buckled.unbuckle_mob() - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(user)) sparks.start() // user.forceMove(pick(trange(50, get_turf(holder)))) - sparks = new /datum/effect/effect/system/spark_spread() + sparks = new /datum/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(user)) sparks.start() @@ -29,12 +29,12 @@ if(M.buckled) M.buckled.unbuckle_mob() - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(M)) sparks.start() // M.forceMove(pick(trange(50, T))) - sparks = new /datum/effect/effect/system/spark_spread() + sparks = new /datum/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(M)) sparks.start() @@ -48,11 +48,11 @@ if(M.buckled) M.buckled.unbuckle_mob() - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(M)) sparks.start() // M.forceMove(pick(trange(50, T))) - sparks = new /datum/effect/effect/system/spark_spread() + sparks = new /datum/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(M)) sparks.start() diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm index 79da41e5f2a..f6d844fb889 100644 --- a/code/modules/research/xenoarchaeology/machinery/coolant.dm +++ b/code/modules/research/xenoarchaeology/machinery/coolant.dm @@ -37,7 +37,7 @@ datum/chemical_reaction/coolant explode() /obj/structure/reagent_dispensers/coolanttank/proc/explode() - var/datum/effect/effect/system/harmless_smoke_spread/S = new /datum/effect/effect/system/harmless_smoke_spread + var/datum/effect/system/harmless_smoke_spread/S = new /datum/effect/system/harmless_smoke_spread //S.attach(src) S.set_up(5, 0, src.loc) diff --git a/code/modules/research/xenoarchaeology/master_controller.dm b/code/modules/research/xenoarchaeology/master_controller.dm index a4421aa3e61..f64f8c32362 100644 --- a/code/modules/research/xenoarchaeology/master_controller.dm +++ b/code/modules/research/xenoarchaeology/master_controller.dm @@ -22,8 +22,8 @@ var/list/spawn_types_plant = list("/obj/item/seeds/walkingmushroommycelium",\ "/obj/item/seeds/killertomatoseed",\ - "/obj/item/seeds/shandseed", - "/obj/item/seeds/mtearseed", + "/obj/item/seeds/comfreyseed", + "/obj/item/seeds/aloeseed", "/obj/item/seeds/thaadra",\ "/obj/item/seeds/telriis",\ "/obj/item/seeds/jurlmah",\ diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index 89b30243c3f..a63802e458c 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -47,7 +47,7 @@ src.locked = !src.locked user << "Controls are now [src.locked ? "locked." : "unlocked."]" updateDialog() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 6755c2b8a47..51be7d4519b 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -55,7 +55,7 @@ src.locked = !src.locked user << "Controls are now [src.locked ? "locked." : "unlocked."]" updateDialog() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 7b497dc731b..1fe42e91ede 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -157,7 +157,7 @@ /obj/item/weapon/rcs/emag_act(user as mob) if(!emagged) emagged = 1 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() user << " You emag the RCS. Activate it to toggle between modes." diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 291475f3dda..33e86061f5d 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -148,7 +148,7 @@ /obj/machinery/computer/telescience/proc/sparks() if(telepad) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, get_turf(telepad)) s.start() else @@ -206,7 +206,7 @@ // use a lot of power use_power(power * 10) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, get_turf(telepad)) s.start() @@ -217,7 +217,7 @@ temp_msg += "Data printed below." var/sparks = get_turf(target) - var/datum/effect/effect/system/spark_spread/y = new /datum/effect/effect/system/spark_spread + var/datum/effect/system/spark_spread/y = new /datum/effect/system/spark_spread y.set_up(5, 1, sparks) y.start() diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 7b1c38e4bef..6a9fcd3ffad 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -953,3 +953,41 @@ var/list/compatible_mobs = list(/mob/living/carbon/human) stage = 1 activate(var/mob/living/carbon/mob,var/multiplier) mob << " You feel optimistic!" + +/datum/disease2/effect/anxiety + name = "Severe Anxiety" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + if(prob(20)) + mob << "You feel anxious." + if(prob(15)) + mob << "You feel butterflies in your stomach." + if(prob(11)) + mob.visible_message("[mob] stumbles around in a panic.", \ + "You have a panic attack!") + mob.confused += (rand(6,8)) + mob.jitteriness += (rand(6,8)) + if(prob(10)) + mob.visible_message("[mob] coughs up butterflies!", \ + "You cough up butterflies!") + new /mob/living/simple_animal/butterfly(mob.loc) + new /mob/living/simple_animal/butterfly(mob.loc) + +/datum/disease2/effect/lycan + name = "Lycancoughy" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + if(prob(20)) + mob << "You feel itchy." + if(prob(15)) + mob << "You have the sudden urge for bacon.." + if(prob(11)) + mob.say(pick("WOOF!", "BARK!", "Bark.", "Woof?", "AUUUUUUUUUUUUU!!")) + if(prob(10)) + mob.visible_message("[mob] coughs up a dog!!", \ + "You cough up a DOG!!!") + //yes i KNOW foxes technically are not normal dogs...hush.... + var/randompup = pick(/mob/living/simple_animal/pet/corgi/puppy,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/pet/fox) + + new randompup(mob.loc) + mob.adjustBruteLoss(rand(1,5))//you just coughed up a CANINIE, you are taking brute loss... \ No newline at end of file diff --git a/code/stylesheet.dm b/code/stylesheet.dm index c0e951046fa..caa1f6950af 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -91,6 +91,7 @@ h1.alert, h2.alert {color: #000000;} .rough {color: #7092BE; font-family: "Trebuchet MS", cursive, sans-serif;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .sans {font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} +.grey {font-family: "Wingdings", cursive, sans-serif;} .cultspeech {color: #7F0000; font-style: italic;} .say_quote {font-family: Georgia, Verdana, sans-serif;} @@ -102,6 +103,13 @@ h1.alert, h2.alert {color: #000000;} .greentext {color: #00FF00; font-size: 3;} .redtext {color: #FF0000; font-size: 3;} +.revennotice {color: #1d2953;} +.revenboldnotice {color: #1d2953; font-weight: bold;} +.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;} +.revenminor {color: #823abb} +.revenwarning {color: #760fbb; font-style: italic;} +.revendanger {color: #760fbb; font-weight: bold; font-size: 3;} + .memo {color: #638500; text-align: center;} .memoedit {text-align: center; font-size: 2;} diff --git a/icons/ass/assalien.png b/icons/ass/assalien.png deleted file mode 100644 index d7586f3b5ff..00000000000 Binary files a/icons/ass/assalien.png and /dev/null differ diff --git a/icons/ass/assfemale.png b/icons/ass/assfemale.png deleted file mode 100644 index 4c941a9281d..00000000000 Binary files a/icons/ass/assfemale.png and /dev/null differ diff --git a/icons/ass/assmale.png b/icons/ass/assmale.png deleted file mode 100644 index c6091cf1915..00000000000 Binary files a/icons/ass/assmale.png and /dev/null differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 9648275ce43..0557b16cdf3 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index ca86e3b6814..8b1add2756b 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/alienqueen.dmi b/icons/mob/alienqueen.dmi index 6bb38bd1cba..b01af7e71b4 100644 Binary files a/icons/mob/alienqueen.dmi and b/icons/mob/alienqueen.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 69822c8706f..3829370cf4f 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/guardian.dmi b/icons/mob/guardian.dmi new file mode 100644 index 00000000000..9db3fbedc68 Binary files /dev/null and b/icons/mob/guardian.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 5112dc2543f..ba76739718d 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index fc720126d47..6edb0d7c573 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index b7ebe8a9c6e..e01e99ba040 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index b7e86115e39..36642747502 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index fb7f5c29bfb..169beacef43 100644 Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 9d5d09f00ac..6bad482e8e4 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/screen1_White.dmi b/icons/mob/screen1_White.dmi index b474f443445..2b6e99bbb33 100644 Binary files a/icons/mob/screen1_White.dmi and b/icons/mob/screen1_White.dmi differ diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi index db9ee7eefdf..4b74a2891e3 100644 Binary files a/icons/mob/talk.dmi and b/icons/mob/talk.dmi differ diff --git a/icons/obj/butts.dmi b/icons/obj/butts.dmi new file mode 100644 index 00000000000..cddd1ca6659 Binary files /dev/null and b/icons/obj/butts.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index b00fca709c5..afe27ae192d 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/flora/plants.dmi b/icons/obj/flora/plants.dmi index fbc2d62dcad..da28d67ea2b 100644 Binary files a/icons/obj/flora/plants.dmi and b/icons/obj/flora/plants.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 4e618e97167..b0a652de4f5 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/harvest.dmi b/icons/obj/harvest.dmi index 6ee1938368d..fb06ace12ef 100644 Binary files a/icons/obj/harvest.dmi and b/icons/obj/harvest.dmi differ diff --git a/icons/obj/hydroponics_products.dmi b/icons/obj/hydroponics_products.dmi index a43f486daaf..028bb4b9113 100644 Binary files a/icons/obj/hydroponics_products.dmi and b/icons/obj/hydroponics_products.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index ebf42b90da2..9130736fbc2 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 3beee849e02..779903709c9 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/money.dmi b/icons/obj/money.dmi index 7b8a5e09495..5a053c07e05 100644 Binary files a/icons/obj/money.dmi and b/icons/obj/money.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 3c70e86f81f..0e067d1e6f2 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index b74424a5485..8c930f53059 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 94f8281967e..39b795fdc04 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/nano/css/layout_default.css b/nano/css/layout_default.css index 109beb2c72e..2493aca3bb0 100644 --- a/nano/css/layout_default.css +++ b/nano/css/layout_default.css @@ -87,7 +87,7 @@ body { #uiMapContent { position: absolute; - bottom: 0px; + bottom: -13.5px; left: 0px; width: 256px; height: 256px; diff --git a/nano/templates/atmos_control_map_content.tmpl b/nano/templates/atmos_control_map_content.tmpl index ab5319460d1..e1a513ba9f2 100644 --- a/nano/templates/atmos_control_map_content.tmpl +++ b/nano/templates/atmos_control_map_content.tmpl @@ -1,6 +1,6 @@ {{for data.alarms}} {{if value.z == 1}} -
+
diff --git a/nano/templates/cloning_console.tmpl b/nano/templates/cloning_console.tmpl index 7f82878aaa1..a1c35f903ae 100644 --- a/nano/templates/cloning_console.tmpl +++ b/nano/templates/cloning_console.tmpl @@ -65,17 +65,21 @@ Used In File(s): \code\game\machinery\computer\cloning.dm {{if data.numberofpods}}

Pods

{{for data.pods}} -
- {{:value.name}} + {{:value.name}}
+
Biomass
{{:value.biomass}}
+
+ +
Select
{{:helper.link('Select', 'check', {'selectpod' : value.pod}, value.pod == data.selected_pod ? 'selected' : '')}}
+ {{/for}} {{/if}} {{/if}} @@ -108,7 +112,7 @@ Used In File(s): \code\game\machinery\computer\cloning.dm
UI: {{:data.unidentity}}
- SE: {{:data.strucenzymes}} + SE:
{{:data.strucenzymes}}
{{if data.disk}}
diff --git a/nano/templates/cryo.tmpl b/nano/templates/cryo.tmpl index ab375a5df59..6f7085f5e26 100644 --- a/nano/templates/cryo.tmpl +++ b/nano/templates/cryo.tmpl @@ -1,106 +1,107 @@ - -

Cryo Cell Status

+ +

Cryo Cell Status

-
- {{if !data.hasOccupant}} -
Cell Unoccupied
- {{else}} -
- {{:data.occupant.name}} =>  - {{if data.occupant.stat == 0}} - Conscious - {{else data.occupant.stat == 1}} - Unconscious - {{else}} - DEAD - {{/if}} -
- - {{if data.occupant.stat < 2}} -
-
Health:
- {{if data.occupant.health >= 0}} - {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}} - {{else}} - {{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'average alignRight')}} - {{/if}} -
{{:helper.round(data.occupant.health)}}
-
- -
-
=> Brute Damage:
- {{:helper.displayBar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad')}} -
{{:helper.round(data.occupant.bruteLoss)}}
-
- -
-
=> Resp. Damage:
- {{:helper.displayBar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad')}} -
{{:helper.round(data.occupant.oxyLoss)}}
-
- -
-
=> Toxin Damage:
- {{:helper.displayBar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad')}} -
{{:helper.round(data.occupant.toxLoss)}}
-
- -
-
=> Burn Severity:
- {{:helper.displayBar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad')}} -
{{:helper.round(data.occupant.fireLoss)}}
-
- {{/if}} - {{/if}} -
-
-
Cell Temperature:
- {{:data.cellTemperature}} K -
-
-
- -

Cryo Cell Operation

-
-
- Cryo Cell Status: -
-
- {{:helper.link('On', 'power', {'switchOn' : 1}, data.isOperating ? 'selected' : null)}}{{:helper.link('Off', 'close', {'switchOff' : 1}, data.isOperating ? null : 'selected')}} -
-
- {{:helper.link('Eject Occupant', 'arrowreturnthick-1-s', {'ejectOccupant' : 1}, data.hasOccupant ? null : 'disabled')}} -
-
-
 
-
-
- Beaker: -
-
- {{if data.isBeakerLoaded}} - {{:data.beakerLabel ? data.beakerLabel : 'No label'}}
- {{if data.beakerVolume}} - {{:data.beakerVolume}} units remaining
- {{else}} - Beaker is empty - {{/if}} +
+ {{if !data.hasOccupant}} +
Cell Unoccupied
{{else}} - No beaker loaded +
+ {{:data.occupant.name}} =>  + {{if data.occupant.stat == 0}} + Conscious + {{else data.occupant.stat == 1}} + Unconscious + {{else}} + DEAD + {{/if}} +
+ + {{if data.occupant.stat < 2}} +
+
Health:
+ {{if data.occupant.health >= 0}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}} + {{else}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'average alignRight')}} + {{/if}} +
{{:helper.round(data.occupant.health)}}
+
+ +
+
=> Brute Damage:
+ {{:helper.displayBar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad')}} +
{{:helper.round(data.occupant.bruteLoss)}}
+
+ +
+
=> Resp. Damage:
+ {{:helper.displayBar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad')}} +
{{:helper.round(data.occupant.oxyLoss)}}
+
+ +
+
=> Toxin Damage:
+ {{:helper.displayBar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad')}} +
{{:helper.round(data.occupant.toxLoss)}}
+
+ +
+
=> Burn Severity:
+ {{:helper.displayBar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad')}} +
{{:helper.round(data.occupant.fireLoss)}}
+
+ {{/if}} {{/if}} +
+
+
+
Cell Temperature:
+ {{:data.cellTemperature}} K +
+
-
- {{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} + +

Cryo Cell Operation

+
+
+ Cryo Cell Status: +
+
+ {{:helper.link('On', 'power', {'switchOn' : 1}, data.isOperating ? 'selected' : null)}}{{:helper.link('Off', 'close', {'switchOff' : 1}, data.isOperating ? null : 'selected')}} +
+
+ {{:helper.link('Eject Occupant', 'arrowreturnthick-1-s', {'ejectOccupant' : 1}, data.hasOccupant ? null : 'disabled')}} +
-
-
-
- Auto-eject: +
 
+
+
+ Beaker: +
+
+ {{if data.isBeakerLoaded}} + {{:data.beakerLabel ? data.beakerLabel : 'No label'}}
+ {{if data.beakerVolume}} + {{:data.beakerVolume}} units remaining
+ {{else}} + Beaker is empty + {{/if}} + {{else}} + No beaker loaded + {{/if}} +
+
+ {{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} +
-
- {{:helper.link('On', 'power', {'autoejectOn' : 1}, data.autoeject ? 'selected' : null)}}{{:helper.link('Off', 'close', {'autoejectOff' : 1}, data.autoeject ? null : 'selected')}} -
-
\ No newline at end of file +
+
+ Auto-eject: +
+
+ {{:helper.link('On', 'power', {'autoejectOn' : 1}, data.autoeject ? 'selected' : null)}}{{:helper.link('Off', 'close', {'autoejectOff' : 1}, data.autoeject ? null : 'selected')}} +
+
\ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 20004e61579..4c6476cf187 100644 --- a/paradise.dme +++ b/paradise.dme @@ -350,6 +350,9 @@ #include "code\game\gamemodes\mutiny\directives\tau_ceti_needs_women_directive.dm" #include "code\game\gamemodes\mutiny\directives\terminations_directive.dm" #include "code\game\gamemodes\mutiny\directives\vox_heist.dm" +#include "code\game\gamemodes\nations\nations.dm" +#include "code\game\gamemodes\nations\nationsdatums.dm" +#include "code\game\gamemodes\nations\nationsprocs.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\nuclear\nuclearbomb.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm" @@ -709,7 +712,6 @@ #include "code\game\objects\items\weapons\gift_wrappaper.dm" #include "code\game\objects\items\weapons\handcuffs.dm" #include "code\game\objects\items\weapons\holosign.dm" -#include "code\game\objects\items\weapons\hydroponics.dm" #include "code\game\objects\items\weapons\kitchen.dm" #include "code\game\objects\items\weapons\legcuffs.dm" #include "code\game\objects\items\weapons\lighters.dm" @@ -1468,6 +1470,7 @@ #include "code\modules\mob\living\simple_animal\friendly\slime.dm" #include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" #include "code\modules\mob\living\simple_animal\friendly\tomato.dm" +#include "code\modules\mob\living\simple_animal\guardian\guardian.dm" #include "code\modules\mob\living\simple_animal\hostile\alien.dm" #include "code\modules\mob\living\simple_animal\hostile\bat.dm" #include "code\modules\mob\living\simple_animal\hostile\bear.dm" diff --git a/sound/AI/intercept2.ogg b/sound/AI/intercept2.ogg new file mode 100644 index 00000000000..ab106a7295a Binary files /dev/null and b/sound/AI/intercept2.ogg differ