diff --git a/_maps/map_files/tgstation.2.1.3.dmm b/_maps/map_files/tgstation.2.1.3.dmm index f6cb304b217..de268ca2db9 100644 --- a/_maps/map_files/tgstation.2.1.3.dmm +++ b/_maps/map_files/tgstation.2.1.3.dmm @@ -2927,7 +2927,7 @@ "beo" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bep" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "beq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) -"ber" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 140; on = 1; pressure_checks = 0},/turf/simulated/floor/wood,/area/security/vacantoffice) +"ber" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/wood,/area/security/vacantoffice) "bes" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor{icon_state = "bot"},/area/atmos) "bet" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/atmos) "beu" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/atmos) @@ -3277,7 +3277,7 @@ "bla" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "blb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"},/area/medical/sleeper) "blc" = (/obj/machinery/power/apc{dir = 8; name = "Medbay Security APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/medical) -"bld" = (/obj/structure/closet/l3closet/general,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bld" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/closet/wardrobe/white/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "ble" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint/medical) "blf" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "blg" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/assembly/chargebay) @@ -3312,7 +3312,7 @@ "blJ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/storage) "blK" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage) "blL" = (/obj/structure/closet/emcloset,/obj/machinery/alarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/quartermaster/storage) -"blM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 5},/turf/simulated/floor/plating/airless,/area/space) +"blM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor/plating,/area/atmos) "blN" = (/obj/structure/closet/secure_closet/security,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/checkpoint2) "blO" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint2) "blP" = (/obj/machinery/computer/security,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint2) @@ -3643,7 +3643,7 @@ "bsc" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bsd" = (/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bse" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "bot"},/area/toxins/storage) -"bsf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plating/airless,/area/space) +"bsf" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/space,/area/space) "bsg" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/primary/aft) "bsh" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "bsi" = (/obj/structure/table,/obj/item/weapon/storage/box/disks{pixel_x = 2; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) @@ -3847,7 +3847,7 @@ "bvY" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/medical/sleeper) "bvZ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/turf/simulated/floor,/area/medical/sleeper) "bwa" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor,/area/medical/sleeper) -"bwb" = (/obj/structure/table,/turf/simulated/floor,/area/medical/sleeper) +"bwb" = (/obj/structure/table,/obj/machinery/light,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bwc" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Medbay Cryogenics"; dir = 2; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/turf/simulated/floor,/area/medical/sleeper) "bwd" = (/obj/machinery/camera{c_tag = "Genetics Cloning"; dir = 4; network = list("SS13")},/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/box/rxglasses{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bwe" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -4049,7 +4049,7 @@ "bzS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bzT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bzU" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bzV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor,/area/hallway/primary/central) +"bzV" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor,/area/medical/sleeper) "bzW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bzX" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=HOP"; location = "CHE"},/turf/simulated/floor,/area/hallway/primary/central) "bzY" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor,/area/hallway/primary/central) @@ -4484,7 +4484,7 @@ "bIl" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -30},/obj/machinery/light,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bIm" = (/obj/structure/table/woodentable,/obj/item/weapon/pinpointer,/obj/item/weapon/disk/nuclear,/obj/item/weapon/storage/secure/safe{pixel_x = 35; pixel_y = 5},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bIn" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/captain,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bIo" = (/obj/structure/table,/obj/machinery/light,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bIo" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/britcup{desc = "Kingston's personal cup."},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bIp" = (/obj/structure/table/woodentable,/obj/item/weapon/hand_tele,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bIq" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bIr" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload) @@ -4691,7 +4691,7 @@ "bMk" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "bot"},/area/atmos) "bMl" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "bot"},/area/atmos) "bMm" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "bot"},/area/atmos) -"bMn" = (/obj/structure/table/reinforced,/obj/machinery/camera{c_tag = "Medbay Foyer"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/food/drinks/britcup{desc = "Kingston's personal cup."},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bMn" = (/obj/structure/table/reinforced,/obj/machinery/camera{c_tag = "Medbay Foyer"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/cell_charger,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bMo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/atmos) "bMp" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) "bMq" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) @@ -4872,9 +4872,9 @@ "bPJ" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 15},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) "bPK" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 6},/turf/simulated/floor,/area/atmos) "bPL" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/simulated/floor/plating,/area/atmos) -"bPM" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor,/area/atmos) +"bPM" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix to Incinerator"; on = 0},/turf/simulated/floor,/area/atmos) "bPN" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Air to Mix"; on = 0},/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor,/area/atmos) -"bPO" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix Outlet Pump"; on = 0},/turf/simulated/floor{dir = 5; icon_state = "green"},/area/atmos) +"bPO" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/manifold/yellow/visible,/turf/simulated/floor{dir = 5; icon_state = "green"},/area/atmos) "bPP" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) "bPQ" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/space,/area/space) "bPR" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos) @@ -4983,7 +4983,7 @@ "bRQ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor,/area/quartermaster/office) "bRR" = (/obj/machinery/computer/supplycomp,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/quartermaster/office) "bRS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor,/area/quartermaster/office) -"bRT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 140; on = 1; pressure_checks = 0},/turf/simulated/floor,/area/hallway/primary/central) +"bRT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor,/area/hallway/primary/central) "bRU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/medical/chemistry) "bRV" = (/obj/structure/closet/wardrobe/chemistry_white,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bRW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) @@ -5003,7 +5003,7 @@ "bSk" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 5; initialize_directions = 12},/turf/simulated/floor,/area/atmos) "bSl" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Unfiltered to Mix"; on = 1},/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4; initialize_directions = 12},/turf/simulated/floor,/area/atmos) "bSm" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor{icon_state = "green"; dir = 6},/area/atmos) -"bSn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bSn" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix Outlet Pump"; on = 0},/turf/simulated/floor,/area/atmos) "bSo" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/space,/area/space) "bSp" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "waste_in"; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "bSq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5091,8 +5091,8 @@ "bTU" = (/obj/structure/table,/obj/item/device/assembly/igniter{pixel_x = -5; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 5; pixel_y = -4},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = 6},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = -1},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/turf/simulated/floor/engine,/area/toxins/misc_lab) "bTV" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/toxins/misc_lab) "bTW" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/toxins/misc_lab) -"bTX" = (/obj/machinery/atmospherics/pipe/vent{dir = 2},/turf/simulated/floor/plating/airless,/area/space) -"bTY" = (/turf/simulated/wall,/area/maintenance/incinerator) +"bTX" = (/obj/machinery/atmospherics/valve{name = "Mix to Space"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bTY" = (/obj/machinery/power/turbine{luminosity = 2},/obj/structure/cable/yellow,/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "bTZ" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft) "bUa" = (/obj/effect/landmark/start{name = "Cargo Technician"},/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor,/area/quartermaster/office) "bUb" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access_txt = "50"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/quartermaster/office) @@ -5134,19 +5134,19 @@ "bUL" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/turf/simulated/floor/engine,/area/toxins/misc_lab) "bUM" = (/turf/simulated/floor/plating,/area/toxins/misc_lab) "bUN" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bUO" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet{dir = 8},/turf/simulated/floor/plating/airless,/area/space) +"bUO" = (/obj/structure/stool,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "bUP" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) -"bUQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bUR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bUS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Gas Pump"; on = 1},/turf/simulated/floor/plating/airless,/area/space) -"bUT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bUU" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/incinerator) -"bUV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bUW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/deathsposal{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bUX" = (/obj/machinery/atmospherics/pipe/tank/toxins{volume = 3200},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bUY" = (/obj/machinery/atmospherics/pipe/tank/oxygen{volume = 3200},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bUZ" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bVa" = (/obj/machinery/power/apc{dir = 8; name = "Incinerator APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bUQ" = (/turf/simulated/wall/r_wall,/area/maintenance/incinerator) +"bUR" = (/obj/structure/sign/fire{pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/incinerator) +"bUS" = (/obj/machinery/door/poddoor{id = "turbinevent"; name = "Turbine Vent"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"bUT" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bUU" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/obj/machinery/meter,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bUV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bUW" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bUX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bUY" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Incinerator to Output"; on = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bUZ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint) +"bVa" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Waste Out"; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bVb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/aft) "bVc" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/floor,/area/quartermaster/miningdock) "bVd" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5202,11 +5202,11 @@ "bWb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/toxins/misc_lab) "bWc" = (/obj/machinery/camera{c_tag = "Testing Firing Range"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/turf/simulated/floor/plating,/area/toxins/misc_lab) "bWd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) -"bWe" = (/turf/simulated/wall/r_wall,/area/maintenance/incinerator) -"bWf" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bWg" = (/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "incinerator_airlock_exterior"; id_tag = "incinerator_access_control"; interior_door_tag = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = -26; pixel_y = 6; req_access_txt = "12"},/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -24; pixel_y = -6},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bWh" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bWi" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bWe" = (/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bWf" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bWg" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/incinerator) +"bWh" = (/turf/simulated/wall,/area/maintenance/incinerator) +"bWi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bWj" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) "bWk" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) "bWl" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) @@ -5252,15 +5252,15 @@ "bWZ" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) "bXa" = (/obj/structure/stool{pixel_y = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall,/area/maintenance/asmaint) -"bXc" = (/obj/machinery/door/poddoor{id = "disvent"; name = "Incinerator Vent"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"bXd" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"bXc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/asmaint) +"bXd" = (/obj/machinery/power/apc{dir = 8; name = "Incinerator APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/incinerator) "bXe" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor{icon_state = "arrival"; dir = 10},/area/atmos) -"bXf" = (/obj/machinery/atmospherics/binary/pump{dir = 8; on = 1},/obj/machinery/access_button{command = "cycle_exterior"; layer = 3.1; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = -22; pixel_y = -10},/obj/structure/sign/fire{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bXg" = (/obj/machinery/atmospherics/pipe/manifold/yellow/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bXh" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bXf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bXg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bXh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/valve{dir = 4; name = "Incinerator to Space"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "bXi" = (/obj/machinery/atmospherics/pipe/simple/green/visible,/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "red"; dir = 10},/area/atmos) "bXj" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor,/area/atmos) -"bXk" = (/obj/machinery/atmospherics/portables_connector/visible{dir = 8},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bXk" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/obj/machinery/meter,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "bXl" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft) "bXm" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) "bXn" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5311,13 +5311,13 @@ "bYg" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 8; icon_state = "rightsecure"; name = "Armory Desk"; req_access_txt = "3"},/obj/machinery/door/window/eastleft{name = "Reception Desk"; req_access_txt = "1"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/ai_monitored/security/armory) "bYh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) "bYi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bYj" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; on = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"bYk" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Mixing Room Exterior Airlock"; req_access_txt = "12"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"bYl" = (/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bYm" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Mixing Room Interior Airlock"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bYn" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bYo" = (/obj/effect/landmark{name = "blobstart"},/mob/living/simple_animal/mouse,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bYp" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bYj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bYk" = (/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "incinerator_airlock_exterior"; id_tag = "incinerator_access_control"; interior_door_tag = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"},/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -6; pixel_y = -24},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bYl" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the turbine vent."; dir = 1; name = "turbine vent monitor"; network = list("Turbine"); pixel_x = 0; pixel_y = -29},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bYm" = (/obj/machinery/door_control{id = "auxincineratorvent"; name = "Auxiliary Vent Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "12"},/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bYn" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/obj/machinery/light/small,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -31},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bYo" = (/obj/machinery/computer/turbine_computer{id = "incineratorturbine"},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bYp" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "bYq" = (/obj/machinery/telecomms/server/presets/common,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bYr" = (/obj/machinery/telecomms/processor/preset_four,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bYs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5366,15 +5366,15 @@ "bZj" = (/obj/machinery/door/airlock/glass_research{name = "Firing Range"; req_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/toxins/misc_lab) "bZk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/toxins/misc_lab) "bZl" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/weapon/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bZm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"bZn" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/manifold/yellow/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bZo" = (/obj/machinery/atmospherics/binary/pump{dir = 4; on = 1},/obj/structure/sign/fire{pixel_y = -32},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = 24; pixel_y = 8},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bZp" = (/obj/machinery/door_control{id = "disvent"; name = "Incinerator Vent Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "12"},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bZm" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 2},/turf/simulated/wall/r_wall,/area/maintenance/incinerator) +"bZn" = (/obj/structure/lattice,/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Incinerator Output Pump"; on = 1},/turf/space,/area/space) +"bZo" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Incinerator Interior Airlock"; req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/maintenance/incinerator) +"bZp" = (/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/wall/r_wall,/area/maintenance/incinerator) "bZq" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/space,/area/space) -"bZr" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bZr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/floor/plating,/area/maintenance/incinerator) "bZs" = (/obj/machinery/atmospherics/valve/open{tag = "icon-mvalve_map (EAST)"; icon_state = "mvalve_map"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/medical/virology) "bZt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bZu" = (/obj/machinery/atmospherics/portables_connector/visible{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bZu" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/space,/area/space) "bZv" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) "bZw" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) "bZx" = (/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5397,7 +5397,7 @@ "bZO" = (/obj/structure/target_stake,/turf/simulated/floor/plating,/area/toxins/misc_lab) "bZP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/toxins/misc_lab) "bZQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bZR" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bZR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bZS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bZT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/disposal) "bZU" = (/obj/structure/closet/firecloset,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/atmos) @@ -5498,7 +5498,7 @@ "cbL" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8},/turf/simulated/floor,/area/atmos) "cbM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbN" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) -"cbO" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cbO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/maintenance/incinerator) "cbP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) "cbQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor,/area/toxins/misc_lab) "cbR" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod4/station) @@ -5599,7 +5599,7 @@ "cdI" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "cdJ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "cdK" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cdL" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cdL" = (/obj/machinery/atmospherics/binary/pump{dir = 1; on = 1},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = -8; pixel_y = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/maintenance/incinerator) "cdM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/toxins/misc_lab) "cdN" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/misc_lab) "cdO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engine/break_room) @@ -5699,9 +5699,9 @@ "cfE" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "cfF" = (/obj/machinery/atmospherics/trinary/filter{dir = 2; filter_type = 2; on = 1},/turf/simulated/floor,/area/atmos) "cfG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/green/visible,/turf/simulated/floor/plating,/area/atmos) -"cfH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cfI" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cfJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cfH" = (/obj/machinery/atmospherics/binary/pump{dir = 2; on = 1},/obj/machinery/access_button{command = "cycle_exterior"; layer = 3.1; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = 8; pixel_y = -24},/obj/machinery/light/small{dir = 8},/obj/structure/sign/fire{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/engine,/area/maintenance/incinerator) +"cfI" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Incinerator Exterior Airlock"; req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/maintenance/incinerator) +"cfJ" = (/obj/machinery/door/poddoor{id = "auxincineratorvent"; name = "Auxiliary Incinerator Vent"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "cfK" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/maintenance/asmaint) "cfL" = (/obj/structure/shuttle/engine/heater{color = "#FFFF00"; dir = 4; icon_state = "heater"},/obj/structure/window/reinforced{color = "#FFFF00"; dir = 8},/turf/simulated/floor/plating/airless{color = "#FFFF00"},/area/space) "cfM" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5785,7 +5785,7 @@ "chm" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chn" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "air_in"; name = "Mixed Air Supply Control"; output_tag = "air_out"; pressure_setting = 2000; sensors = list("air_sensor" = "Tank")},/turf/simulated/floor{icon_state = "arrival"},/area/atmos) "cho" = (/obj/machinery/camera{c_tag = "Atmospherics South East"; dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Air Outlet Pump"; on = 1},/turf/simulated/floor{icon_state = "arrival"; dir = 6},/area/atmos) -"chp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"chp" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; luminosity = 2; on = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "chq" = (/obj/machinery/atmospherics/portables_connector/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "chr" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/port) "chs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/port) @@ -5954,7 +5954,7 @@ "ckz" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos) "ckA" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/turf/simulated/wall/r_wall,/area/atmos) "ckB" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/turf/simulated/wall/r_wall,/area/atmos) -"ckC" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Waste Out"; on = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"ckC" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ckD" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) "ckE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ckF" = (/obj/structure/closet/crate,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/turf/simulated/floor/mineral/bananium/airless,/area/space) @@ -7070,7 +7070,7 @@ "cFX" = (/obj/structure/sign/map/left{pixel_y = -32},/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_left"; name = "skeletal minibar"},/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) "cFY" = (/obj/structure/sign/map/right{pixel_y = -32},/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_right"; name = "skeletal minibar"},/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) "cFZ" = (/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) -"cGa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/atmos) +"cGa" = (/obj/structure/stool,/obj/effect/decal/cleanable/cobweb{tag = "icon-cobweb2"; icon_state = "cobweb2"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cGb" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) "cGc" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) "cGd" = (/turf/unsimulated/wall,/area/wizard_station) @@ -7343,7 +7343,7 @@ "cLk" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating/airless,/area/tcommsat/chamber) "cLl" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) "cLm" = (/turf/simulated/floor/airless,/area/tcommsat/chamber) -"cLn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 140; on = 1; pressure_checks = 0},/obj/structure/table,/obj/item/weapon/paper,/turf/simulated/floor/airless,/area/tcommsat/chamber) +"cLn" = (/obj/structure/table,/obj/item/weapon/paper,/turf/simulated/floor/airless,/area/tcommsat/chamber) "cLo" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless,/area/tcommsat/chamber) "cLp" = (/obj/structure/computerframe,/turf/simulated/floor/airless,/area/tcommsat/chamber) "cLq" = (/obj/structure/table,/turf/simulated/floor/airless,/area/tcommsat/chamber) @@ -8919,7 +8919,7 @@ "dpA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/atmos) "dpB" = (/obj/machinery/atmospherics/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/medical/virology) "dpC" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/medical/virology) -"dpD" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dpD" = (/obj/structure/sign/fire{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/asmaint) "dpE" = (/obj/machinery/camera{c_tag = "Atmospherics South West"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/atmos) "dpF" = (/obj/structure/table,/obj/item/clothing/glasses/meson,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/engine/break_room) "dpG" = (/obj/machinery/bot/secbot/pingsky,/turf/simulated/floor/carpet,/area/turret_protected/aisat_interior) @@ -9198,6 +9198,66 @@ "duT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "duU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "duV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating/airless,/area/space) +"duW" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"duX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"duY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"duZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"dva" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"dvb" = (/obj/machinery/power/compressor{comp_id = "incineratorturbine"; dir = 1; luminosity = 2},/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"dvc" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/wall,/area/maintenance/incinerator) +"dvd" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/wall,/area/maintenance/incinerator) +"dve" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dvf" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "atmospherics mix pump"},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dvh" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvi" = (/obj/machinery/power/smes{capacity = 9e+006; charge = 10000},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/decal/cleanable/cobweb{tag = "icon-cobweb2"; icon_state = "cobweb2"},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"dvj" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/trunk,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"dvk" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvl" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvm" = (/obj/effect/landmark{name = "blobstart"},/mob/living/simple_animal/mouse,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvn" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/incinerator) +"dvo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvp" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/atmospherics/portables_connector/visible{dir = 4; name = "input gas connector port"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvq" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"dvr" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "input port pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvs" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/alarm{desc = "This particular atmos control unit appears to have no access restrictions."; dir = 8; icon_state = "alarm0"; locked = 0; name = "all-access air alarm"; pixel_x = 24; req_access = "0"; req_one_access = "0"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvt" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvu" = (/obj/machinery/atmospherics/portables_connector/visible{name = "output gas connector port"},/obj/machinery/portable_atmospherics/canister,/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvv" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) +"dvy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 5},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) +"dvB" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating/airless,/area/space) +"dvC" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/deathsposal{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvE" = (/obj/machinery/atmospherics/portables_connector/visible,/turf/simulated/floor/plating,/area/maintenance/aft) +"dvF" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/portables_connector/visible,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/maintenance/aft) +"dvG" = (/obj/machinery/atmospherics/pipe/vent,/turf/simulated/floor/plating/airless,/area/space) +"dvH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/aft) +"dvI" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/aft) +"dvJ" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/aft) +"dvK" = (/obj/machinery/atmospherics/pipe/manifold4w/general,/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/aft) +"dvL" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 9},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvM" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvN" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/floor/plating,/area/maintenance/aft) +"dvP" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvQ" = (/obj/machinery/atmospherics/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/maintenance/aft) +"dvR" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix to Port"; on = 0},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvS" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_access_txt = "12"},/obj/structure/barricade/wooden{name = "wooden barricade (CLOSED)"},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvT" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/aft) +"dvU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/aft) +"dvV" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix to Space"; on = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/aft) +"dvW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 5},/turf/simulated/floor/plating,/area/maintenance/aft) +"dvX" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvY" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "plasma tank pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dvZ" = (/obj/machinery/atmospherics/pipe/tank/toxins{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dwa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix to Space"; on = 1},/turf/simulated/floor/plating/airless,/area/space) +"dwb" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Mix to Incinerator"; on = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dwc" = (/obj/machinery/atmospherics/pipe/manifold4w/general{level = 2},/obj/machinery/meter,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dwd" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/asmaint) (1,1,1) = {" ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -9313,7 +9373,7 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGdaCFaCFaGeaCFaEbaCFaEbaGfaEbaCFaEbaCFaEcaEdazdaxZbdiaAfaAfaVFbnobnpaVCaAfayeayeayeayeaVDazrazraVSayebnAaVRaBGaBGaBGaGtaBGaBGaBGaGuaAlahlazzazzaEyaVNaEyazzazzahlaxbaGyaxgaVLaVMaVIaVJaVKaxgapsaVHawhaVGaTDaDmaDmaDmaBUaGKawhaGLaGMawhaCaawhaGNaGOaGPabIamrabIabIabIabIabIbnqaGSayFaGTazSayFaGUayFaGVayFaGWayFaWvaWwaUNaAKaWxaWyaWJaWLaWlaWlaWmaWlaWlaWnaWlaWoaWpaBaaBaaBaaBaaWqaWsaWraWuaWtalvaIRaIRaIRaIRapBaDOaHvaHwaHxaHyaHzaHAaDOaHBaWkaDRaHDaVVaVUaVZaFTaHHaFXawaaWjaDVaDVaDVahjahjahjahjahjahjahjahjahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbdsiahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaCLaHJaDZaEaaCFaEbaCFaEbaCFaEbaCFaEbaCFaEcaEdazdaHKaCwaBAaBtaBtaBwauZawNavbavdavcavaayeaukazrazraqCayeaBsaBzaBGaHXaHYaHZaIaaIbaIcaIdaAlahlahjahlaIfauYaIfahlahjahlaxbaGyaxgaDeaIiaIjaIkaIlaxgapsapqawhaImaInaDmaDmaDmaIoaIpawhahlahlaIqaIraIsaItaIuaIvaIwaIxaIqahlahlaTkaIzaAoaIBayFaICazSazSazSaCeazSazSazSayFaAKauXauVaAKaAKayfauUaIIaIIauTaMZaILaIIaIMaIIaINauRaINauQaINaIQaIRaIRauPaIRaIRaIRaIRaCkaKwaIRapBaDOaHwaIVaIWaIXaIYaIZaDOauLauAauiaumaupausaueaufaugauhaucaudaJhaJiaJjahlahlahlahlahlahlahjahlahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaJkaJlaBjaCEaCFaCFaCFaJmaCFaCFaJnaCFaCFaCLaJoawLaxZawNaJpaJqaJqaJqaJqaJqaJqaJqaJrawNayeapraubaprayeayeaBqaJvaJwaAkaAkaAkaAkaJuaJxaJyaAlaJzaJBaJBaJCatWaJEaJBaJBaJFaxbaBraxgatZaxgaJIaJJaJKaxgazGavWawhawhawhaJLaJMaJLawhawhawhaJOaJPaJQaJRaIuaIuaIuaIuaIuaJSaJTaJPaJUaTkaJVaAoaJWayFayFayFayFayFayFayFayFayFayFaFjatQatBatAatCaPuatjaKeaIIatuaMZaKjatVaKjaINaKkatUaINatSaINaKnaKoaKpatRasXasXasXasVasTaMaaIRapBaDOasSaIVaKAaIXaIYaKBaDOaKCasRathatiatfatgatdateaVlatcasZatbaKIaKJaKKahlahjahlahlahlahlahjahlahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaJkaBjaBkaBjaBjaKLaBmaBjaBjaBkaJlaKMaqfaKNawNavJaKOaKOaKPaKOaKQarkaKRaKSawNaGgaMzaKYaKYaKXaKYaEpaKZaKYaKYaKYaKYaKYaKYaKYaLaaLbawCawDaLeaLeawBaLgaLeaLeaLeaLhaEnaLjawBaLeaLeaLeaLkaLlaLmaIuaLnaLoaIvaIwaIwaIwaItaIuaIuaLpaIuaLqaLraLsaLtaLuaLvaLwaLxaIuaIuaLybzVaEqaEWaLAaLCaLDaLEaLFaIuaLGaIuaAKaLHawraJYatQawpawoawnawmaqFdrhaIIawqaLLawjaLMaLNaINawlatUaLQaqAaINaIRaLSbgAawiaPSaLWawyawxawzaDCaIRapBaDOawAawtawsawwaMcaMfaDOaMgaMhaDRaHGaHGaHGaHGaDRaMiaMjasZatbaDVaDVaDVaMlaMlaMlaMmaMnaMoahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaJkaBjaBkaBjaBjaKLaBmaBjaBjaBkaJlaKMaqfaKNawNavJaKOaKOaKPaKOaKQarkaKRaKSawNaGgaMzaKYaKYaKXaKYaEpaKZaKYaKYaKYaKYaKYaKYaKYaLaaLbawCawDaLeaLeawBaLgaLeaLeaLeaLhaEnaLjawBaLeaLeaLeaLkaLlaLmaIuaLnaLoaIvaIwaIwaIwaItaIuaIuaLpaIuaLqaLraLsaLtaLuaLvaLwaLxaIuaIuaLybRTaEqaEWaLAaLCaLDaLEaLFaIuaLGaIuaAKaLHawraJYatQawpawoawnawmaqFdrhaIIawqaLLawjaLMaLNaINawlatUaLQaqAaINaIRaLSbgAawiaPSaLWawyawxawzaDCaIRapBaDOawAawtawsawwaMcaMfaDOaMgaMhaDRaHGaHGaHGaHGaDRaMiaMjasZatbaDVaDVaDVaMlaMlaMlaMmaMnaMoahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJaxYaMpaAbaAbaAbaAbaMqaxYavJaAdaqfaAeaMrazdaMsaMtaMuaMuaMvarkaMwaKSawgaMyaMzaweaMBaMCaMDaMEaMFaKYaKYaKYaKYaKYaKYaKYaLaaKYaMzaKYaKYaKYaDgaDfaCxaCxaCxaCxaDlaCxaEhaCxaCxaDkaMLaLlaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaLpaIuaMMaMNaMOaMPaMQaMRaMSaMTaIuaIuaLyaIuaIuaIuaIuaIuaIuaIuaIuaIuaMUaIuaAKaJYaJYaJYavGavfaveavkavgavoaQSaIIavtaMZavQaIIaIIaINaNbatUaNcaqAaNdaINaIRaIRaIRaIRaIRaIRavZaNgaNfaIRapBaDOaNhaHwavYavXaHwaNjaDOaDRaDRaDRaDRaDRaDRaNkaDRaFXaFXawaatbaNlaNmaDVaNnaNoafJaNqaNraNsahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjazbaqfazdatwazdaNtaNuaNvaNwazdatwaNxaNyaqfaxZawNazdaNzaNAaMuaMuaMvarkaNBaKSawNaMyaMzaKYaNDaNEaNEaNEaNFaNGaNHaNEaNIaNEaNEaNEaNJaNEaqSaNEaNEaNEaqQaqPatKasaasaaqRaqOaqMaqKaNUaKYanLaMLaLlaIuaNVaIuaNWaNWaNWaNWaNWaNWaNWaNWaNXaNWaNWaNWaNWaNWaNWaNWaNWaNWaNWaNWaNYaNWaNWaNWaNWaNWaNWaNWaNWaIuaIuaIuaAKaNZaNZaNZaNZaNZaqIaqGaPuaqFaqdaIIaqEaOeaqyaIIaOfaINaqtaqpaqqaqAaOjaINaIRaOkaqzaOmaOnaOmaqnaOoaOpaIRapBaDOaOqaOqapHapFaOtaOtaOuaDOaOvaOwaOxaDVaOyaOzaOAaFXaFXaqjaqmaDVaOCaDVaODaqhaOFaOFaOGaOHaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkawLaxYawLaxZawNawNayaawLaxYawLaOJaOKaOLawNawLaOMaOMaKPaOMaKQarkaONaKSawNaOOaOOaOOaOQaOOaORaORaORaORaORaOSaOTaORaOUaORaORaORaOYaOWaOXaOWaqJapRaPaaKYaKYaPbapPaPdanjaKZaKYanLaPeaPeaIuaIuaIvaPfaJPaJPaPgaPgaPgaPgaPhaPiaPjaPkaPlaPmaPnaPmaPoaPmaPpaPkaPqaPiaPraPgaPgaPgaPgaJPaJPaPsaItaIuaIuaIIaoXaMXaKcaKcaKcaKcaKcaPuaQUaKcaIIapKaPzapNaINaINaINapLapMaINaINaINaINaIRaOmapOaPEaPEaPEapEaPFaOmaIRapBaDOaPHaHwapHapFaHwaHwaPIaDOaPJaPKaPLaDVaFXaPMaPNaPOaPOapIapJaPQaPRaDVafsaSEaOFaOEaOFaPWaPXaPXaPWaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -9332,7 +9392,7 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjazbaqfazcatwazdazeazfbfvbfwazdatwaziazjaqfazbarkbcRbfxbfybfybfybfzcdBcdxcdycaocaocczccCaXhaYvbfDaYybfEaXhbHpbHpaRCaRCceNceAcfzcfrcfzcfzcenaYHceqbHlaZWaZWcetbHmbHiaYNcdRbaZbaZcdSbfWbfXbeGaIubfYaYQbfZaYRbgbdtQbgcbGMaynbgfaYQahjbxycltcltcltboXbHgbHhahjaYWbgjbHcbHdbgmbaxbgnbaxbHfaYWaXVaIubgpbeVbgqbgrbgsbgtbgubeVbgvcGZbgwcfEbgybgybgybgzboLbjpbgCbfbbgDbgEbMfbgEbgEbgFbHsbfcbfgbHtbfgbfgbfgccNbgMbgMbgNbgMbgObgObflbgPbgQbgRbfldombgTdombflcmCbpOcmCbfqdolbgVdolbfqbgWbgXbfqbHrbLEaMmaMnbhaahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjawLbdYaAaaAbaAbaAbaAbaAcbdZawLahjahjahjahlbcRbhbbcRbhcbfybhdbZKbZTbiQbZGbZHbZIbZJcaAcaAcaAcaAcaAcaAcaKcaJcazcaocajcaiaYHaYHaYHaYHaYHaYHcbiaYHaYHaYHcbCbhobGPbGQcaYbaZbaZbQRbhtbeFbeGaIubhuaYQbhvaYRaYRaYRaYRbGMaynbhxaYQahjbxycltboTboUboWcltbxmahjaYWaLTbbubGNbhDbaxbeRbaxbaxaYWaXVaIuaIubeVbhKbAIbGXbhNbhObhPbgybhSbgybhRbgybgybhQbhTbhVbhUbhWbfbbhXbgEccybgEbhXbhYbgEbfcbhZcGObiabibbfgbGVbgMbidbiebifbigbigbflbihbiibijbikbilbimbinbflbGWblsbltbfqbiqbirbiqbisbitbitbfqbBBbLEahlahjahlahjahlahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlbcRbivbiwbixbiybiybizbiAbbZbhgaOOcjkcjlcjccjccjccjacjacjacjacjacjacjacjjcbCbiHbiIbMvbiKbiLbiMbRmbiOaYHbiPciKciLciNciNciWbaZbaZbQRbaZaYNbeGaIuaXDblZbMDbMCbMBbMAaYRbMEaynaYQaYQahjbxycltboUcltboUcltbxmahjaYWaYWbMybhBbjnbaxbjobMxbMwaYWaXVaIubmucjwcjBcjGcjNbjubjvbjwbgybMKbMLcjmbjAbjAbMIbMHbMJbhUbjFbfbbhXbgEccyblfbhXbMGbjGbfcbjHbjIbjJbjKbfgccNbgMbOvbOabOabNObNYbjQbNNbjSbjSbjSbNZbNxbNwbflbNpblsbNGbfqbNBbNgbNcbMWbkdbkebfqbBBbLEbgZbgZbgZbgZahjahjahjahjahjahjahjahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlbcRbkfbcRbkgbkhbkhbkibcRbkjbkkaOObklbkmbklbklbklbkmbklaOOaOOaYHaYHaYHcilcbCbiNbiNcikbiNbiNbiNbRmbiNbkpbkqcimcitcixbRhbRhbRhbRhciwciucivciBciyciEbLCbLnbLmbLpbLoaYRbGMaynaYQahjahjbxycltboWcmWboTbLXbxmahjahjaYWaYYbMdaYWaYWaYWaYWbMcaYWbkTaIuaIubeVbkUbAIbAJbhNbhObkWbgybqLbLfbkYbkZblabMnbfbblcbMhblebfbbhXbgEciJciHbhXbMebgEbfcbfgbfgbfgbfgbfgccNbgMdqNblhblibljblkblldsVblnblobloblpbxEbmTbflbMpblsbMqbfqblublvblwbKOblydtabfqbBBbPqceYblBblCblBahlahlahlahlahlahlahjahjahjahjahjahjahjdsiahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlbcRbkfbcRbkgbkhbkhbkibcRbkjbkkaOObklbkmbklbklbklbkmbklaOOaOOaYHaYHaYHcilcbCbiNbiNcikbiNbiNbiNbRmbiNbkpbkqcimcitcixbRhbRhbRhbRhciwciucivciBciyciEbLCbLnbLmbLpbLoaYRbGMaynaYQahjahjbxycltboWcmWboTbLXbxmahjahjaYWaYYbMdaYWaYWaYWaYWbMcaYWbkTaIuaIubeVbkUbAIbAJbhNbhObkWbgybqLbLfbkYbIoblabMnbfbblcbMhblebfbbhXbgEciJciHbhXbMebgEbfcbfgbfgbfgbfgbfgccNbgMdqNblhblibljblkblldsVblnblobloblpbxEbmTbflbMpblsbMqbfqblublvblwbKOblydtabfqbBBbPqceYblBblCblBahlahlahlahlahlahlahjahjahjahjahjahjahjdsiahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahjahjahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlbcRblDblEblFbkhblGblHbcRahlahjdsiblIblIblIblIblIblIblIahlahlblJblKblLcihcigchJchJcijchJchJchJchVchJchWchXcibcidblQblRblSblTbKKaYNblVaYNbKFblXbqFblZbmabmdbmdbmdbmdbmcbKHbmbahjahlbKJbKIbzTcltcltbJXbxmahlahjbmsbKgbKibJYbKdbKDbmsbBVbmsbmtaIuaIubeVbLgbAIbAJbmybmzbeVbmAbqLbLfbkZbmBbgybLcbfbbYFbLebLabfbbmGbLbbKXbKWbKZbKYbKUbKTbKRbKVbKRbKRbKRbKSbgMbmQbiedqCdqobmRbmScjJbmUbmVbmVbmWbKQbmYbflbpPbpObKPbfqbnbbncbndbKObitbnebfqbBBbKNbKLchEchEchEchEchEchEbKMahlahlahjahlahlahjahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlbcRbnfbngbnhbnibcRbcRbcRahlahldsiblIblIblIblIblIblIblIahlahlbnjbnkbiNchAchzchBchzchzchzchzchzchCchzchHchIchDchFbnrbnsbntbnubaZbJBbnwbnxbeGbnzchyblZblZbmbbnBbJvbnDbJwbumbmbahlahlbxybJxbvJbmhbyDbJybxmahlahlbmsbJzbJAbnNbmsbnObmsbBVbmsbmtaIuaIubeVbnQbAIbAJbnRbnSbeVbnTbJJbnUcHhbnXbgybJPbfbbJObJNbJMbfbbfcbodbfcbJLbJKboeboeboeboeboeboeboeboeccNbgMblgblhblibofbogbohboibojbojbojbmWbxEdsUbrebJIbrfbJHbrhbonboobonbJGbitboqbfqbJEbJCbJCbJCbJCbJCbJCbJCbJDbLEbgZbgZbgZahlahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlbRJahlahlahjblIblIblIblIblIblIblIboubovbowboxbiNbiNbiNbRrboyboyboybiNbiNbiNbiNbkpbozbQRbUgbTQbUabUbbUcbTIbTPbaZboGbBNboIboJboKbNoaNpboNbBMboPbBLbBKbmbahjahlbxybBDcoCcoCcoCbCcbxmahlahjbmsbCabCbbpdbmsbpebmsbBVbmsbpfaIubRTbRUbRVbRWbTybTHbpibeVbpjbqLbhRcGAbplbpmbnTbnTbpobAKbAWbprbpsbptbgybAZbBgbpwbpxbpybBibBhbBjbslboeccNbgMbpGbpFbBkbBtbBvbflbpJbojbojbpKbpLbxEbpMbsAbBwbxSbBybrhbpQbLzbitbBzbpUbpVbfqbpWbpXbpXbpXbpXbpXbpXbpXbBBbLEbpYbfGbgZbgZahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -9340,7 +9400,7 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldsiahlahlahjblIblIblIblIblIblIblIbrubrvbrubrwbiNbiNbiNbRrboyboyboybiNbiNbrxbryaYHbrzbaZbaZbRsbRDbRIbRLbaZbaZbaZbqlbmtbrBaIuaQQbqpbrCbrDbRqbRobRnbyHbmbahjahjbyNbyLbzxbbqbzubzvbzLahjahjbxnbyXbzobyQbyRbzqbztbzpbqCbrRaIuaIubrSbrTbxLbxMbxPbxTbrYbrZbxVbxQbxRbxRbxRbxRbxRbyxbywbytbymbyvbyubyEbyCbyFbqObsibyAbyBbsjbskbslboeccNbgMbjYbsnbxzbspbspbflbsqbsrbssbrebstbxEbnabrebmZbxDbxCbxBbxAbxKbokbxGbsDbsEbFPbsGbxFbsIbsJbsJbsJbsKbsLbyGbLEbsNblAbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjblIblIblIblIblIblIblIbsObovbsPbsQbiNbiNbiNbRmbiNbiNbiNbiNbiNbrxbsRaYHbsSbQUbRhbQSbQTbsTbQRbaZbaZcGzbnxbnZbrBaIuaQQbqpbmbbsWbQQbsYbsXbxxbmbahlahlahjbxyckNbhyckNbxmahjahlahlbxnbtcbxibtebkKbtgbtgbxkbtibtjaIuaIubtkbtlbgybwBbwXbtnbtobtnbxfbxcbpqbwYbpqbpqbpqbttbwvbgybhRbwubtvbtvbwybwxbtybtzbwwbtAbtBbqTbslboebwnbgMbtCbtCbtCbtCbtCbflbrebrebrebrebBAbQPbtEbreboMbwlbscdtndtndtndtnbwmbtLbtMbtNbtObtPbtQbtRbtRbtSbtTbpXbNhbLEbsNblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahjahjahjblIblIblIblIblIblIblIbrubrvbrubnkbtVbiNbiNbXLbiNbtVbiNbiNbiNbrxbGDaYHbGCbXMbTIbXNbYSbeFbRSbRhbuebufboGbnZbrBaXDbugbuhbmbbuibZibukbulbumbmbahlahlahjbGFbGIcoCbGGbGHahjahlahlbxnbGJbGLbutbuubuvbuwbEYbqCbuyaIuaIubnTbnTbFnbFqbLhbFbbsUbFcbFdbFlbuGbuCbuDbuCbuDbuCbuDbuCbFAbFBbtvbuHbFsbFubFtbFxbFwbuKbuLbuMbuNboebFIbFObpNbFMbFNblsblsbFDblsblsbFGbFEbFFbGubGkdtnbGhbGxbtmbvabvbbFUbvdbvdbvdbvdbvdbvfbvgbvhbvibvhbvjbvhbpXbNhbLEbsNaBRbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlblIblIblIblIblIblIblIbvlbvmbvlbvnbvobvnbvnbvnbvnbvnbvpbvqbiNbrxbvraYHbvsbaZbvtbWLbWMbvwbEDbvybvzbvwbvwbEZbrBaJSbvBbqpbmbbvDbWObvFbsZbFabmbahlahlahjbdsbEObbqbEWbEXahjahlahlbxnbvKbvLbvMbvNbuvbuwbEYbqCbvOaIuaIubvPbvQbDSbqMbDRbvTbuCbvUbDTboZbvXbvYbvZbwabwbbwabwcbuCbhRbqLbtvbwdbDMbDLbDKbDQbDPbDObDNbDNbEnbEzbEAbEBbwobwpbwqbwrbwsbwrbwrbwtbwrbwrbEmbEabDXbDXbEbbEkbepbwzbwAbDUbwCbDWbwEbwFbvdbwGbwHbwIbwJbwKbwHbwLbpXbNhbLEbwMbrsbWubgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlblIblIblIblIblIblIblIbvlbvmbvlbvnbvobvnbvnbvnbvnbvnbvpbvqbiNbrxbvraYHbvsbaZbvtbWLbWMbvwbEDbvybvzbvwbvwbEZbrBaJSbvBbqpbmbbvDbWObvFbsZbFabmbahlahlahjbdsbEObbqbEWbEXahjahlahlbxnbvKbvLbvMbvNbuvbuwbEYbqCbvOaIuaIubvPbvQbDSbqMbDRbvTbuCbvUbDTboZbvXbvYbvZbwabzVbwabwcbuCbhRbqLbtvbwdbDMbDLbDKbDQbDPbDObDNbDNbEnbEzbEAbEBbwobwpbwqbwrbwsbwrbwrbwtbwrbwrbEmbEabDXbDXbEbbEkbepbwzbwAbDUbwCbDWbwEbwFbvdbwGbwHbwIbwJbwKbwHbwLbpXbNhbLEbwMbrsbWubgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlblIblIblIblIblIblIblIbwObwPbovbwQaYHbwRbovbwQbwSbwSbwSbwSbwTbwUbwVbwSbwSbwWbwWbWmbWtbvwbDJbwZbxabxbbvwbnZbrBaIvaTkaTkbmbbmbbVNbmbbmbbDDbmbaJOaJPaJUbDEbDHbhybDFbDGaJOaJPaJUbqCbqCbqCbqCbqCbqCbqCbqCbqCbvOaIubxhbuCbuCbuCbxjbuCbuCbuCbxlbDTbDrbFybxpbxqbxrbxsbUkbxubxvbhRbqLbtvbxwbDzbDCbDAbDtbDsbsjbsjbsjbDhbzbbDgbDfbxHbxHbxHbxHbxIbxHbxHbxHbxJbxJbDebDqbxNbxObDpbDobepbwzbLAbDnbxUbDmbxWbxXbxYbpXbpXbxZbyabybbpXbycbpXbNhbLEbsNblAbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlblIblIblIblIblIblIblIahlahjahlahlahjahlahlahjahlbwSbydbyebyfbygbyhbyibyjbykbylbVcbVMbUubUvbyqbyrbysbvwbnZbrBaIuaIuaIubCXaLFbUhbbAbyzbCZbCYaWEaWEaWEbDabCTbyIbCUbyJaIuaIuaIuaIuaLFaIuaLpaIuaIuaIubCXaIubvOaIubyMbuCbCNbCObyPbCLbCKbuCbySblrbCHbCIbxpbxqbxqbyUbyVbyWbxvbhRbCFbtvbsjbyYbyZbzabzbbzcbzdbzebzfboeboebwnbCDbxHbzhbzibzjbzkbzlbzmbxHbAVbCubCybCtbzrbzsbribCgbCfbCrbChbCdbzwbCebzybzzbxYbzAbzAbzAbzAbzAbzAbzAbpXbNhbLEbsNblAbgZahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahjahlblIblIblIblIblIblIblIahlahjahlahlahjahlahlahjahlbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbMtbMgbMFbMubLqbyrbzPbvwbnZbzRaIuaIuaIuaIuaIuaIubbAaIubrBaIuaIuaIuaIuaIubnYbeKbnVaIuaIuaIuaIuaIuaIuaIuaLpbLjaIuaIuaIuaIubvObzXbzYbsUbMMboObAcboOboRbuCboYbDTboZbAjbuCbAkbAlbAmbAnbAobuCbhRbqLbtvbtvbtvbtvbtvboeboeboeboeboeboebXKccNbotbxHbAsbAtbAubAvbAwbAxbxHbAyboHbAAbobbocbzsbribopborbolbombosbosbosbALbAMbxYbzAbANbzAbAObzAbzAbzAbpXbNhbLEbsNblAbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -9349,43 +9409,43 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlbDjahlahlahlahjahlahlbwWbDkbDlbHjbGObGEbGlbIdbHvbHnbHkbIhbIvahlahlahjahlbCwcjKbDvbDwbDxbDybmnbmobmpbmqbmHbmFbmIbCAbmKbmJbmLbFhbmvbFhbFhbIIbmCbmxbmEbCDbCDbCDbCDbuCbmMbxobyTbxobnybuCbDVbDTbnvbmXbmPbmObmPbmPbnFbDYbDZbnEbnCbnCbnCbnJbnHbqMbEcbEdbEebEfbEgbBFbXKccNbDcbEhbEhbEhbEibEhbEhbEhbDcbEjbEjbElbEjbEjbDdbnLbnKbepaKtbEobEpbEqbErbEsbEtbEubEvbEwbExbEyaQebnMciIciIciObnPbEobEobgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbEEbEFbEGbEFbEHahlahjahlbwWbwWbEIbylbQcbQbbQtbQebPGbPGbPPbPJbPzbppahjbEPbEQbERbESbETbDBbEUbDBbEVbDBbDBbDBbCwbQLbQMbtxbCAbtwbtubFebFfbFgbFhbFibqxbCAbFjbFkbtDbFmbuJbFobFpbuObxobFrbxoblrbuxbuEbuzbuFbuCbFvbuIbxobxobusbFzbnTbnTbnTbnTbnTbudbuobLhbupburbFCbCVbucbBFbXKccNbDcbEhbEhbEhbEhbEhbEhbEhbDcbFHbubbFJbFKbFLbDdbtUbtZbuabtXbtYbHqbtKbFQbFQbFQbFQbFRbTubFTbEybgZbLFbtIbQxbQxbtJbFVbFWahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbFXbFYbFXahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbGabGbbGabFZbGcbGdbGebwWbGfbylbGgbQCbQvbGibwWbCvbGjbCvbCvboEbqNahlbGmbGnbGobGpbDBbDBbGqbDBdnRbGsbGtbDBbCwbQLbuQbuRbCAbuPbGybGzbGAbGBbFhbuUbqxbXKbuScdQbuTcdQbwebGKbuCbwgbmPbwfbmPbvVbsUbvSbmObvWbuCbGRbxobxobxobGSbGTbnTbGUbwjbwkbwibggbwhbqMbGYbCVbCVbGZbHabHbccPbvcbDcbEhbEhbEhbEhbEhbEhbEhbDcbHebuZbuYbvubvxbvAbvHbvIbscbvRbHobFQbvebFQbFQbFQbFQbFQbFQbFQbEybuXbuWbuVbHwbHxbHybHzbHAahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbHBbFXbHCbFXbHBahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahjahlbEGbHDbHEbHDbEGbHFbHGbHHbwWbHIbylbHJbylbylbGibwWbHKbHLbELbCvboEboFahjbGmbHNbHObHPbHQbHRbHQbHQbHSbHTbHQbHQbHUbqubeLbHXbCAbCBbCAbCAbCAbCAbHYbPxbPmbHZbIabIbbIcbrObIcbIfbuCbrMbrLbIibrNbrGbuCbrKbrJbrpbuCbIobrEbIqbrgbIsbItbnTbgdbrbbrcbqWbqYbrabIxbIybIzbCVbCVbIAbBFbXKccNbDcbDcbICbEhbEhbIDbICbDcbDcbIEbIFbIGbsebIHbDdbsdbhibscbsabsbbrVbrVbrWbrXbrUbrVbrPbrQbqGbqDbqIbqHbqVbPybIWbIXbIYbIZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbJabJbbJcbJdbJebJbbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahjahlbEGbHDbHEbHDbEGbHFbHGbHHbwWbHIbylbHJbylbylbGibwWbHKbHLbELbCvboEboFahjbGmbHNbHObHPbHQbHRbHQbHQbHSbHTbHQbHQbHUbqubeLbHXbCAbCBbCAbCAbCAbCAbHYbPxbPmbHZbIabIbbIcbrObIcbIfbuCbrMbrLbIibrNbrGbuCbrKbrJbrpbuCbwbbrEbIqbrgbIsbItbnTbgdbrbbrcbqWbqYbrabIxbIybIzbCVbCVbIAbBFbXKccNbDcbDcbICbEhbEhbIDbICbDcbDcbIEbIFbIGbsebIHbDdbsdbhibscbsabsbbrVbrVbrWbrXbrUbrVbrPbrQbqGbqDbqIbqHbqVbPybIWbIXbIYbIZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbJabJbbJcbJdbJebJbbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbHDbHDbHDbJfbJgbylbylbJhbHIbylbylbylbylbGibwWbfFbELbccbCvboEbtFahlbGmbJmbJnbJobDBbDBbJpbDBbJqbJrbJsbJtbCwbshbsgbsobsmbsxbsvbsvbsvbsvbsvbsybsvbsBbszbsFbsCbsVcePchtbsUbsUbsUbsUbsUbsUbsUbsUbsUbsUbsUbsUbsUbsUbsUbsUbtbbnTbnTbnTbnTbnTbtabuAbhSbBFbBFbBFbBFbBFbBFbXKccNbDcbJQbJRbJSbJTbJUbJVbJQbJWbIEbIFbIGbtpbtqbtrbtsbthbtmaKvbEobKabKabKbcGybtdbKebFQbFQbKfbEybsHbKhbsMbEobKjbKkbKlbEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbKobKpbKpbKpbKqbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbEGbHEbHEbHEbEGbKrbKsbKtbKubKvbylbylbKwbEKbKxbwWbCvbCvbCvbCvboEbppahjbKybEQbKzbKAbKBbDBbKCbDBbDBbDBbDBbDBbCwbQLbhhbgYbgLbgKbgKbgKbgKbgKbgKbgJbgIbgHbfLbgGbgBbfRbfQbfSbmNbfTbmNbmNbmNbmNbmNbmNbmNbmNbmNbmNbmNbmNbmNbfVbgabnTbgdbLdbMzbgebggbgibgkbglbgobgobgxbfMbfLbfKbfJbDcbLrbLsbLtbLubLvbLwbLxbJWbJWbJWbJWbJWbJWbLybfNbfObfPbLBbEobEybEybEybEybEybEybLDbFQbFQbEybgZbLFbLEbEobLGbLHbLIbLJdsidsiahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjbLKbLLbLKbKpbLMbKpbLNbLObFXahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbLPbLQbLRbFZbLSbGdbGebwWbwWbLTbLUbLVbwWbwWbwWahlahlahlbLWbqhbqNahlahlahjahlbCwbLYbLZbMabDBbMbbiEbiJbiSbKGbiDbiCbfIbMibMjbMkbMlbMmbesbMjbMjbMjbMjbMjbMobiBbMjbMjbxtbMjbFSbMjbMjbMjbMjbMjbCDbCDbCDbCDbCDbCDbCDbCDbNIbXIbnTbhHbhFbhGbhMbicbhIbqgbipbhpbhpbiobhpbhpbhsbhqbDcbhwbMNbhCbMNbhEbMNbMObMPbMQbMRbMSbMTbMUbgUbribhibepbMXahjbMYbMZbNabNbbhmbNbbNdbNebNfbEyckEbNhbiubEobEobEobEobEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbNjbKpbKpbKpbNkbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbNlbEFbNmbEFbNnahlahjahlahjdsiahjahlahjdsiahjahlahlahlahjbHMboEboFahjahjahjahjbCwbCwbCwbCwbCwbCwbCwbCwbCwbCwbeybexbewbevbMjbMkbMlbMmbesbNrbNrbNtbNubNvbeubetbNybNzbNAbdWbNCbNDbNEbNFbOGcGaahjahlahlahlahlahlahjbCDbNIbSubNJbNJbNJbNJbNJbNKbNLboDbNJbNJbNJbNJbNJbNJbSubencGubNQbNRbNSbNRbNTbNUbNVbNWbNWbNWbNWbNWbNWbNXbeqbeobepbObahjbMYbOcbOcbOdbOebOfbOgbOhbOibEycoxbNhbPqbgZbOkayRbgZahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahjahjbJabHBbOmbOnbOobOpbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlahjdsiahjahlahjdsiahjahlahlahlahlbHMboEboFahlahlahlahjbOqbOrbOrbOsbOtbOubOubOwbOwbOqbQLbfHbfIbOzbMjbOAbOBbOBbfibODbNrbOEbOFbfrbfCbfsbeMbeHbmgbeBbOGbOLbOGbOMbONbOOahjbOPbOPbOPbOPbOPahjbCDbNIbpaboQbezbOSbOTbNJbpnbpgbphbNJbOXbOYbOZbOYbOXbSubeTbDcbMNbMNbMNbeZbMNbMNbfhbeUbPcbPcbPgbPcbPcbgSbePbeNbeObPkahjbMYbOcbPlbNbbeSbNbbPnbPobPpbEyblAbNhbPqbgZblAblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbJbbFXbPrbFXbPsahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjbCvbCvbPtbPubPvbCvbCvahlahlahlahlbHMboEboFahlahlahlahjbOqbPwbOsbOsbOsbOsbOubCsbzObBqbDIbiCbjWbPBbPCbjVbjUbjTbkabkcbkbbjUbjUbjUbkabjZbjEbjDbjMbPHbPKbTqbPMbPNbPObTnbPQbPRbPSbPTbPUbOPahjbjRbNIbSubPWbOXbOXbOXbNJbjNbeAbjPbNJbOYbQdbOYbzNbzMbyObjLbDcbQfbQgbQhbQibQjbQkbQlbQmbQnbQobQpbQqbQrbJWbSSbjBbjCbQubQubEybEybEybEybEybEybEobEobEobEyblAbNhbjyblAblAbQzbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbFXbFYbFXahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlbCvbQAbELbQBbELaClbCvahlahlahlahlbHMbqhboFahlahjbQDbQEbOqbQFbQGbQHbOsbOsbQIbQJbOubQKbQLbfHcerbQNbQObkubkwbkvbkBbkAbkCbkvbkxbkvbkzbkybPIbQVbQWbQXbQYbQZbRabRbbRcbTsahjbRebRfbPUbRgbOPahjcbMbNIbSubRibRjbOXbRkbNJbRlbEJbktbNJbOXbvEbRpbOXbOXbSubNIbDcbJWbJWbJWbJWbLybRtbRubRvbLybJWbJWbJWbJWbJWbRwcfbbUIbRzbRAbRBbRCcbGbRCbREbQubRFbRybRGbRHcjSbNhbPqbgZbgZbgZbgZbRJahjahjahjdsidsidsidsidsidsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjbCvazvbELbELbELaBdbCvahlahlahlahlbHMboEbtFahlahjbTabRNbRObRPbtWbtHbtHbtHbtHbtHbujbvkbvvbfHcerbNqbjdbjcbjbbOGbjebRZbQVbSbbScbSdbSebSfbSfbSgbShbPKbSibSjbSkbSlbSmbMrbSobPRbSpbPUbPUbOPahjbiXbNIbSubdobOXbSsbNKbNJbNJbrFbNJbNJbSvbrAbStbSvbSzbSubNIbDcbSDbSEbSEbSFbSGbMNbSHbSIbSJbSKbEhbEhbEhbJWbSLbiYbiZbSMbSNbRBbSObSPbMsbSRbSSbRybSTbRybRHaDGbiUbiVbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbCvazvbELbELbSYaBgbCvahlahjahlahlbJlboEbppbCvbCvbCvbTbbOqbTcbOsbOsbOsbTdbTebTfbTgbOqbQLbfHcerbNqbQObjtbjxbOGbOGbTjbNrbTkbTlbTmbSQbOGbOGbTobTpbRdbTrbPLbTtbOJbTtbTvahjbOPbOPbOPbOPbOPahjbCDbNIbSubTwbyybyybyKbynbypbwNbjibjgbOXbvEbOXbOXbOXbSubNIbDcbEhbEhbEhbTJbTKbMNbTLbMNbTMbTNbEhbEhbEhbJWbTObjmbjqbYbbjsbTRbTSbTTbTRbTUbQubTVbRybTWbRHbgZcgFbjfbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbTXahlahjahjbTYbTYbTYbTYbTYbTYbTYbTYbCvbCvbTZbCvbCvbCvbPtbPubPvducduddujduidukdrBdudduhbvkbvkbvkbvkbvkbvkbvkbvkbvkdugduedufcerbUdbMjbNscaGbUebUfbUebNrbOGbOGbOGbSQbUibONbONbUjchfbUlbTqbUmbUpbUobTnbPQbPRbUqbUrbUrbOPahjbCDbNIcaVbPZbPZbPZcbhbUsbOXdulbOXbOXbOXbvEbOXbOXbOXbSubNIbDcbEhbEhbEhbUAbUBbSIbUCbMNbUDbUEbSEbSEbUFbJWbUGbUHbUIcbzcbjbRBbMsbUKbTRbULbQubUMbUMbUMbRHcaUbZPbjfbgZahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbUObUPblMbsfbUSbsfbSnbURbUQbUWbUXbUYbUZbTYbVabVbbVbbVbbVbbVbbVbbVbbVbdsHdtidtJdrldrldrldrldtHdtpdtpdtpdtxdtpdtmbPGbPGdtkbppbQLbfHcerbVobVpbZNbZMbONbONbZLbVsbONbONbVtcgqbVvbOGbVwbVxbVybVzbOGcgrbUnbVCbTsahjbRebVDbVEbVFbOPahjcaSbZRbZQbZQbZQbZSbSubVKbTwdtRdtOdtVdtSdtYdtXduadubbSubNIbDcbJWbJWbJWbJWbVRbVSbTLbVTbVRbJWbJWbJWbJWbJWbVUbVVbVWcaCcaBbVZbVZbVZbVZcaFbSSbUMbUMbWcbRHbZObZPbjfbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbWebWebWebWebWebWfbUTbWhbWibWibWhbTYbELbWjbWkbWkbWkbWkbWkbWkbWlbppdcdbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWocbNdumbppbQLbfHcerbVobWscceccfbWvbSfcbVbWxbSfbSfbWybWzbWAbWBbWCbWDciobWFbOGcgrbWGbWHbMrbSobPRbWJbUrbUrbOPahjcbMbXKbCDbCDbCDbjLbSubWNbOXbOXbWPduwbUtbWTcbUbWTbUtbSubNIbDcbSDbSEbSEbWUbSGbMNbSHbSIbWVbWWbEhbEhbEhbJWbWXbWYbWZbRxbjmbYbccuccwccvccibQubUMbUMbUMbRHbZObZPbjfblAblAbgZahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbXcbXdbUUbXfbUUbWgbUVbXhbXgbXgbXkbTYbXlbXmahlahlahjahlahlahjahlbppdcdbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWodumbppdunbfHcerbXybXzcbDcbDbXCbMjbMjbMjbMjbMjbXDchjbNrbNrbNrbXFbOGbVybOGcgrbUnbXGbTsahjbOPbOPbOPbOPbOPahjbXHbXKbCDcbobXKbjLbpadusdurduvdutduqdupbXPcbUbXPbXQbSubNIbDcbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYacbQcbPcbFbSSbCxbYfchUbRHbUMbZPbUwbgZblAbgZbgZbgZdsidsiahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjbXcbYjbYkbYlbYmbWhbYnbWhbYobWhbWhbYpbELbXmahlahlahjahlahlahjahlbppdcdbWnbXnbYqbYrbYsbYtbYubXnbYvbYwbYxbYybYzbWodumbppbQLbfHcerbYAbYBbMjcdvbYDbMjcdwcuLbYGbMjbYHbSQbZUbNrbYJbWFbOGbWDbYKbYLbUpbYMbTnbPQbPRbYNbYObYPbOPahjbCDbXKbCDbYQbXKbjLbSubYRduzbYTbYUduAduzcdHcdAcdHbzNbyObNIbDcbEhbEhbEhbYZbZabSIbUCbMNbUDbZbbSEbSEbUFbDcbRHbZcbZdbZebRHbRHbZfbZgcdMcdNbZjbVYbVZbZkbUMbUMbZPbjfbgZbrqbgZbZlbgZahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjbXcbZmbUUbZobUUbZpbZnbZrbXhbXhbZubTYbZvbZwahlahlahlahlahlahlahlbppdcdbWnbZxbZybZzbYsbZAbZxbZxbYvbZBbZCbYyccAbWodumbppbQLbfHbGwcbAcbAccWccBccQcdbcdlccXduxbMjbOGbSQdjybZVbYJbZWbOGbWDbYKcgrbUnbZXbTsahjbReclkbZZcaabOPahjbCDbXKbCDcabcacbjLbSubNJcadcaebNJduybNJbNJbNJbNJbNJbSubNIbDcbJWbJWbJWbJWbVRcafbTLcagbVRbJWbJWbJWbJWbDcbTRcahbTRbTRbTRbRHbZfbZgcdtcducakcalbRxbCzbRHbUMbZPbjfbgZblAblAblAcanahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjbWebWebWebWebWebTYbTYbYpbTYbTYbTYbTYahjahlahlaPYahlahlahlahlahlduNdcdbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWodumduMduJduKcexcbAcaDcaEcaEceJcaHcaIceKduLbMjcaLcjIbZUbNrbYJcaNbOGcaObYKcgrcaPcaQbMrbSobPRcaRbYObYObOPahjcaSbXKbCDcaTbXKbjLceQbPZbPZceObNJduObZsdpCbNKcaZccmbXIbNIbDcbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRbTRbTRbTRbRHcbfcbgceMceLbQubQubRxbQubRHbQubZPbjfbgZcbkcblcbmcbnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHaaHdpXdpXaaHdpXdpXdpXaaRdpXdpXdpXaaHdpXahjahjbCvbELbELbELbELbELbELbELbELbJjcbpahjahlahlahjdsiaFFahlahlahldotdcdbWncbscbtcascbubXnbXncbvcbwcbvcbxbYycbybWoduCduBduDduEbHXcbAdpFcaEcdOcdzcbEduGcdPduFduHbPHcirbNrbNrbNrcbJbOGcbKcbLcgrbUnbOGbTsahjbOPbOPbOPbOPbOPahjcbMbXKbCDcchcbObZRbZQbZQceocepbNKduIcuYdpBbNKceabhpcdTcbWbDcbEhbEhbEhcbXbTKbMNbTLbMNbTMcbYbEhbEhbEhbDccbZbTRccabTRbTRccbcccccdcemcebbQubRxbRxccgbRHaDGbPdbWdbgZccjcckblAcclahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahlahjahjahlahjahjahlahlahjahjahjahldpXahlahlbCvbRKbELbCvbCvbCvbTZbCvbCvbCvbCvahlahlahldsiaDIauKdsidsiahjdotdcdbWnccpbZxbXnbXnbXnbZxcatccqccrbYyccscctbWobCvbCvbTzbTAbTBcbAcbAccxcaEdoZdoKdoMdoNdoQbMjbOGbVAccDccEccFbQWccGbVuccIbYLbUpccJbTnbPQbPRccKccLccLbOPahjbXHbXKbCDbCDbCDbXKbCDbCDccMbDbbCDbCDcuBbCDbCDbDbbSWbSXbThbDcbEhbEhbEhccRccSbSIccTbMNbUDccUbSEbSEbUFbDcbTRbTRccVbTRbTRbRHcbfcbgbTibTxbQuccYccZcdabRHbfGbPdbjfbgZbgZbgZblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdccddcdeahlcdccddcdeahlcdccddcdeahjdpXahlahlbCvcdfcdgbCvcdhbELbELbOlaClcdkbCvahlahlahlatIdsidsiahjahlahldbVdcdbWnbZxcdncdobXncdpbZxbZxbYvcdqbYybYycdrbWocdsbSVbSCbSUbSBdoidnZdcNdctdcNdctdcvdctdcubMjcdCcdDcdEbSfbSfbShbUicdFbUmbSibUncdGbTsahjbReclhcdIcdJbOPahjbCDbXKbXKcdKbXKbXKcdLbCDccMbSabRYbSqbZtbSwbRYbSAccMbLEcdVbDcbDcbDcbDcbDcbDccdWcdXcdYbDcbDcbDcbDcbDcbDcbRHbRHbRHbRHbRHbRHcdZcdZbSxbSybRHbRHbRHbRHbRHbgZcgFbjfbgZbNibOjblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdcceecdeahlcdcceecdeahlcdcceecdeahjahjahlahlbCvbPtbPvbCvbCvcefcegaClbELbSYbCvahlahlahlahlahjahlahlahlahlbppdcdbWnbXncehceibXncejcekbXnbYvcelbYxbYybYybVebVfbfIcercHqbVgceucevcewbVhceycezdpYcaEdqsbMjceBbOGbVAbUibONceCbWEceEceFbNFceGceHbMrbSobPRceIccLccLbOPahjbCDbXKbXKbXKbXKbXKbUzbCDbVdbUxbUNbJFcgAbJFbUJbUxbUybLEbTEbgZahlahlahlahjahlahlceVahlahjahlahlahlahlbgZceWayRceYceZceZbRHcfacfabSxbiZcfccfdblAblAblAaDGcgFbUwbgZcffblAblAbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcceecdeahlcdcceecdeahjcdcceecdeahjahjahlahlahlahlahjahjbCvbCvbCvbCvbTZbCvbCvahlahlahlahlahjahlahlahjahlbppdcdbWnbXncfgcfhcficfjcfkbXncflcfmcfncfocfpbWocfqdpVdpPdpQdpNdpOdpTdpUdpRdpSdpsdpzdpadprdpAdpEbQZcfFbVBbOGbOGbOGbOMbVvbVBbUnbXGbTsahjbOPbOPbOPbOPbOPahjbCDcabcfHcfIcfJcacbCDbCDbCDcfKbTGcdUbXIcfMbTFbCDbCDbLEbTEbgZahlahlahlahjahlahlceVahlahjahlahlahlahlbgZblAchmbrscOnciqbRHcfScfSbTDbiZbRHbQubgZcfUcfVaDGcgFbTCbECbECbECcfYcfZcgacfZcgbdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahlahjahlahlahlahlahlahlbCvaOlbCvbELbELbCvahjahlahjahlahlahjahlahlahjahlbppdcdbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWobWobCvbWpbCvcggcghcghcghcgicgjcgkcghbWrdqEdqRbMjchebXEbSkbXjcgscgtcgsbXjcgubXjcgvbUicgwahjahjahjahjahjahjahjahlahjcbMbXKcbMahjahlbCDcgxbCDcgzcgzdpdcgzcgzbCDbYQbzgbTEbgZcgCcgDcgEbgZcgCcgDcuncgEbgZcgCcgDcgDcgEbgZbgZcgFcgGbgZbgZbRHbRHbRHbWabWbbRHaDGbgZcbmblAbpYcgFbWdbgZbgZcgLbgZbgZbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahjahjahjahjcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbppdcdbCvcgQbVPbVObVObVObVObVObVObVObVObVObVXbVXbVObVQcefcggcnjcgWcgXcgYcgZchacghdoBcmIdqxbMjchebXichgchhchibWIchkchlbOGbXechnchobOIahjahjahlahlahlahlahjahlahjchpcfIchpahjahlbCDchqdpkbVichtdpDcdUcdUbXKbXKbzgbJEbVHbVHbVHbVHbVHbVHbVHbVIbVqbVqbVqbVqbVqbVqbVrbVqduQbVqbVqbVGciFbVlbVkbVjbVnbgZbgZbVmciFbVJciFbVLbjfbgZchLblAblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjchMahjahjahjchMahjahlahjchMahjahlahjchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZdsrdsydrBdrAbiTcicciccicciccicciccicciccicciccicciccicciccggcghciecifdsbbZDbZEbZFckUckbdspciccincfGcipceDcipcfGcipceDcipccHcipccHcisahjahjahlahlahlahlahjahlahjahlahlahlahjahlbCDchqduRcdUduSbYWbYVceTbFobXabXbbWQbWQbWQbWQbWQbWQbWQbWRbWSbWQbWQbWQbWQbWQbWQbYIbYEbYhchEbYCbYibYcbYcbYcbYdbXAbXxbXObXBbYYbYcbYcbYXbZhbgZbOjblAcbabgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjciRciSciSciTciUciUciUciUciUciUciUciUciUciUciUciVciXciYciXciZdrvcjbcbHchZcjdcjeaClbCvcjgcjhcjhcjhcjhcjhcjhcjhcjibCvbCvdrqdrldrjdrgciccjncjncjociccjpcpFcpEcpCcpOcpNcjvcmvcjxcjycghcjzcjAdracjCcjDcjEcjHdrbdrdcicahjcbIahjcaMahjcbIahjcaMahjbZqahjbZqahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbXKcjLcjMduTcjObXJbFobSZbWqbCDbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcpGblAbgZbWKbWwbgZbgZcgCcgEbgZbgZcjTbPdbPbbgZcjUcjVbpWbgZbgZbgZbgZbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjcjWahjahlahjcjWahjahlahjcjWahjahlahlchNchOcjXcjYcjZckacgNbELbELbELbELbCvahlahlahjahlahlahjahlahlahjahlbCvckdbCvcmacmhcicckfckgckhckickjbhAckUckUckUbOHbOKbORckrbhAcghbvCckuclScjCckwcghaJbclRclMcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbCDbCDbXKckCcjMccPcnCbCDbCDbCDahlahlahjahlahjahjahlahlahlahlahlahlahlahlahlbgZcnyckEbgZbPbbPdbgZahlahlahlahlbgZblAbPdbPackGckGckHckIckGahlahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahjahjahjckKcgNcgNcgNcgNbJibJjbELbELbCvahjahjcjtcjtcjtcjtcjtcjtcjtahjbCvbCvbCvcmBcmxcicckPckhckhckickQckxckxcmwcmjcmqcmicmiciickUcghckWcmQcmJckZclacghclbcmIcmDcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbRJahlbCDcfKduUcnZcacbCDbCDahlbRJahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlbgZcnUbgZbgZbPibPdbgZbgZcgCcgEbgZbgZblAbPjbPfckGclqclrclsckGahlahlahjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcdcckJcdeahjcdcckJcdeahlcdcckJcdeahlahlahlahlahlahlahlahlbCvbCvbCvbXlbELbCvahlahlcjtclFclzclEclzclucjtahlbCvbSYbELcnzcmxcicclAclAclBcicclCclDcmmcnpckbcmFbPAcksckockocghclKcnmcncclNclOclPclQcmScmRcicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjduVahlahlahjahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahlcmccmdcmebgZbJkaDGbgZbPEbPFciCciFciCciCciCciCciGcfRbPDckGcnBcnAcmkckGahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahlahlahlahlahlahlahlcgccgdcgcbELbELbCvahlahlcjtcmscmocmncmrcmpcjtahlbCvcegbELcnzcmxcicclAclAclBciccmucmvcmtcnFcnHckVcmAcmvcmzcmAcmvdtocnOcnMcmFcmGcmHcmEckbcnIcicbOPclTcmKclTbOPclVcmLclVbOPclZcmMclZbOPahlahlahlahlahlahlaaeahlahlahlahlahlahlahlbRJahlahlahjcmNahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahjcbnblAcmObgZcphblAbgZbPVbKLbKLbQabKLchEchEchEbPXbPYchKckGcnQcnPcmTckGahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahjcdcckJcdeahjahjahjahjahjahjahjahjbCvbCvbCvbCvbELbCvahjahjcjtcmPcoZcoUcoPcmPcjtahjbCvciccnbclecoccicclAclBclBciccndcnecmycodckbclHclGclJclGclGcnkcnlcnScnRcnocnncnncnncobcoacicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahjdsicbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZahlahjahlahjahlcnscntcnucnvcnwahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaRahjcdccnxcdeahlcdccnxcdeahlcdccnxcdeahjdpXahjahlahlahlahlahlahlahlahlbLWbELcaqahlahlcjtcmZcnfcpkcnqcngcjtcjtcjtciccnEclecoeciccicciccicciccnGckUcofcnpckbckUckUckUbQybQwccOckbckbcnpckUcopckUckUcohcogcicahjahlahlahlahjahjahlahlahjahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaaeahlahlahlahlahlahlahlbRJahlahlahlahlahlahjahlahlahlahlahldsicbnblAaBRbgZbLkblAblAblAblAblAblAblAbgZahlahjahlahjahlahjcnVcnWcnVahjahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahlahjahlahlahlahjahjahjahlahlahjahjahldpXahjahjahlahlahlahlahlahlahlbRMbELbRMahlahlcjtcoicppcpocpmcojcokcomcolcokcoFcoHcoIcoJcoKcoOcoQcoRcoSckxcoTcoVcoWcoXcoYclyconclyconcoocoscoqckxckxcotckxcoEcoDciccicciccicciccmvcmvcmvcmvcicahlahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlcoucmdcmebgZcnUbgZbgZbLlcowckEcoxbgZbgZahlahjahlahlahlahjcoycnucoyahjahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXaaHaaHaaRdpXdpXdpXdpXaaHdpXdpXaaHcozahlahjahjahlahlahlahlahlahjbRMbELbRMahjahjcjtcpecpicpfcpicpjcprcpqcptcprcpwcmicpucpvcpPcpzcpxcpzcqNcuocqCcqMcuGcBIcupcuwcEUcEVcEUcELcFDcFzcmicqMcGwcmicGvcFRcmidbyckUbRXcicdsWdsXcpacpbcpbcpcahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcmbahlbgZbgZcgCcgEbgZbgZahjahjahlahlahlahlahjahlcpdahlahlahlahlahlahlahlahjahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlcdmbELcdmahlahlcjtcjscjrcnhcnacmYcmUcmXcmVcmUcaWcamcaXckeckbcplcqDcpncmFbYecambGvbGvbGvbHWbSrcjqcpsckSckkcbTcbScbSccOckUcopcmFckOcktckqckxckvboSckhckhcpAcpBcbRcpDahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlbqzahlahlahjahlahjahlahlahjahjahjahlahlahlahjahlcpdahlahjahlahlahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlbCvbCvbTZbCvbCvahlcjtcknckmcklcjtcjtcjtcjtcjtciccpHckUcjucnicjFcpIcpJcpKcmFcpLcpMcoAcnNcorciccpQcnLcpScopcpTciccnKcnJcnJcpMcpLcmFcpWckRckbckUbOxcicbxeckhcpZcpbcpbcqaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbcqbcqbcqcahjahjahjahjcpdahjahjahjahjahjaaRcqbcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlbCvckdbELcqdbCvahjcjtcjtcjtcjtcjtahjahlahlahjciccqeckUckpcoNcoNckycmvcmvcqgciccqhcoBcoBcoBciccqjcqkcqlcqmcpyciccoBcoBcoBcqhciccqgcmvckTckbckUcicciccmvcmvcmvcmvcicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlahjahlahjahlahlahlcqoahlahjahjahlahlahlahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbNlbEFbNmbEFbNnahlahjahlahjdsiahjahlahjdsiahjahlahlahlahjbHMboEboFahjahjahjahjbCwbCwbCwbCwbCwbCwbCwbCwbCwbCwbeybexbewbevbMjbMkbMlbMmbesbNrbNrbNtbNubNvbeubetbNybNzbNAbdWbNCbNDbNEbNFbPKblMbPQbPQbPQbPQbPQbPQbsfbCDbNIbSubNJbNJbNJbNJbNJbNKbNLboDbNJbNJbNJbNJbNJbNJbSubencGubNQbNRbNSbNRbNTbNUbNVbNWbNWbNWbNWbNWbNWbNXbeqbeobepbObahjbMYbOcbOcbOdbOebOfbOgbOhbOibEycoxbNhbPqbgZbOkayRbgZahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahjahjbJabHBbOmbOnbOobOpbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlahjdsiahjahlahjdsiahjahlahlahlahlbHMboEboFahlahlahlahjbOqbOrbOrbOsbOtbOubOubOwbOwbOqbQLbfHbfIbOzbMjbOAbOBbOBbfibODbNrbOEbOFbfrbfCbfsbeMbeHbmgbeBbOGbOLbOGbOMbPMbOOahjbOPbOPbOPbOPbOPcaMbCDbNIbpaboQbezbOSbOTbNJbpnbpgbphbNJbOXbOYbOZbOYbOXbSubeTbDcbMNbMNbMNbeZbMNbMNbfhbeUbPcbPcbPgbPcbPcbgSbePbeNbeObPkahjbMYbOcbPlbNbbeSbNbbPnbPobPpbEyblAbNhbPqbgZblAblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbJbbFXbPrbFXbPsahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjbCvbCvbPtbPubPvbCvbCvahlahlahlahlbHMboEboFahlahlahlahjbOqbPwbOsbOsbOsbOsbOubCsbzObBqbDIbiCbjWbPBbPCbjVbjUbjTbkabkcbkbbjUbjUbjUbkabjZbjEbjDbjMbPHbPKbTqbSnbPNbPObTnbPQbPRbPSbPTbPUbOPcaMbjRbNIbSubPWbOXbOXbOXbNJbjNbeAbjPbNJbOYbQdbOYbzNbzMbyObjLbDcbQfbQgbQhbQibQjbQkbQlbQmbQnbQobQpbQqbQrbJWbSSbjBbjCbQubQubEybEybEybEybEybEybEobEobEobEyblAbNhbjyblAblAbQzbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbFXbFYbFXahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlbCvbQAbELbQBbELaClbCvahlahlahlahlbHMbqhboFahlahjbQDbQEbOqbQFbQGbQHbOsbOsbQIbQJbOubQKbQLbfHcerbQNbQObkubkwbkvbkBbkAbkCbkvbkxbkvbkzbkybPIbQVbQWbQXbQYbQZbRabRbbRcbTsahjbRebRfbPUbRgbOPcaMcbMbNIbSubRibRjbOXbRkbNJbRlbEJbktbNJbOXbvEbRpbOXbOXbSubNIbDcbJWbJWbJWbJWbLybRtbRubRvbLybJWbJWbJWbJWbJWbRwcfbbUIbRzbRAbRBbRCcbGbRCbREbQubRFbRybRGbRHcjSbNhbPqbgZbgZbgZbgZbRJahjahjahjdsidsidsidsidsidsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjbCvazvbELbELbELaBdbCvahlahlahlahlbHMboEbtFahlahjbTabRNbRObRPbtWbtHbtHbtHbtHbtHbujbvkbvvbfHcerbNqbjdbjcbjbbOGbjebRZbQVbSbbScbSdbSebSfbSfbSgbShbPKbSibSjbSkbSlbSmbMrbSobPRbSpbPUbPUbOPcaMbiXbNIbSubdobOXbSsbNKbNJbNJbrFbNJbNJbSvbrAbStbSvbSzbSubNIbDcbSDbSEbSEbSFbSGbMNbSHbSIbSJbSKbEhbEhbEhbJWbSLbiYbiZbSMbSNbRBbSObSPbMsbSRbSSbRybSTbRybRHaDGbiUbiVbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbCvazvbELbELbSYaBgbCvahlahjahlahlbJlboEbppbCvbCvbCvbTbbOqbTcbOsbOsbOsbTdbTebTfbTgbOqbQLbfHcerbNqbQObjtbjxbOGbOGbTjbNrbTkbTlbTmbSQbOGbOGbTobTpbRdbTrbPLbTtbOJbTtbTvahjbOPbOPbOPbOPbOPcaMbCDbNIbSubTwbyybyybyKbynbypbwNbjibjgbOXbvEbOXbOXbOXbSubNIbDcbEhbEhbEhbTJbTKbMNbTLbMNbTMbTNbEhbEhbEhbJWbTObjmbjqbYbbjsbTRbTSbTTbTRbTUbQubTVbRybTWbRHbgZcgFbjfbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjdvGahjahjahjbCvbCvbCvbCvbCvbCvbCvbCvbCvbCvbTZbCvbCvbCvbPtbPubPvducduddujduidukdrBdudduhbvkbvkbvkbvkbvkbvkbvkbvkbvkdugduedufcerbUdbMjbNscaGbUebUfbUebNrbOGbOGbOGbSQbUibONbONbUjchfbUlbTqbUmbUpbUobTnbPQbPRbUqbUrbUrbOPcaMbCDbNIcaVbPZbPZbPZcbhbUsbOXdulbOXbOXbOXbvEbOXbOXbOXbSubNIbDcbEhbEhbEhbUAbUBbSIbUCbMNbUDbUEbSEbSEbUFbJWbUGbUHbUIcbzcbjbRBbMsbUKbTRbULbQubUMbUMbUMbRHcaUbZPbjfbgZahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldvBbUPdvAdvxdvxdwadvwdvzdvydvDdvEdvEdvFbCvbELbELbELbELbELbELbELdvCbVbdsHdtidtJdrldrldrldrldtHdtpdtpdtpdtxdtpdtmbPGbPGdtkbppbQLbfHcerbVobVpbZNbZMbONbONbZLbVsbONbONbVtcgqbVvbOGbVwbVxbVybVzbOGcgrbUnbVCbTsahjbRebVDbVEbVFbOPcaMcaSdwdbZQbZQbZQbZSbSubVKbTwdtRdtOdtVdtSdtYdtXduadubbSubNIbDcbJWbJWbJWbJWbVRbVSbTLbVTbVRbJWbJWbJWbJWbJWbVUbVVbVWcaCcaBbVZbVZbVZbVZcaFbSSbUMbUMbWcbRHbZObZPbjfbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjbCvbELdvOdvIdvMdvKdvLbCvdvNbWjbWkbWkbWkbWkbWkbWkbWlbppdcdbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWocbNdumbppbQLbfHcerbVobWscceccfbWvbSfcbVbWxbSfbSfbWybWzbWAbWBbWCbWDciobWFbOGcgrbWGbWHbMrbSobPRbWJbUrbUrbOPcaMcbMbWibCDbCDbCDbjLbSubWNbOXbOXbWPduwbUtbWTcbUbWTbUtbSubNIbDcbSDbSEbSEbWUbSGbMNbSHbSIbWVbWWbEhbEhbEhbJWbWXbWYbWZbRxbjmbYbccuccwccvccibQubUMbUMbUMbRHbZObZPbjfblAblAbgZahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjbCvbXldvHdvIdvIdvJcqrbCvbELbXmahlahlahjahlahlahjahlbppdcdbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWodumbppdunbfHcerbXybXzcbDcbDbXCbMjbMjbMjbMjbMjbXDchjbNrbNrbNrbXFbOGbVybOGcgrbUnbXGbTsahjbOPbOPbOPbOPbOPcaMbXHbWibCDcbobXKbjLbpadusdurduvdutduqdupbXPcbUbXPbXQbSubNIbDcbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYacbQcbPcbFbSSbCxbYfchUbRHbUMbZPbUwbgZblAbgZbgZbgZdsidsiahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjbCvdvNdvWdvUdvVdvTbELdvSbELbXmahlahlahjahlahlahjahlbppdcdbWnbXnbYqbYrbYsbYtbYubXnbYvbYwbYxbYybYzbWodumbppbQLbfHcerbYAbYBbMjcdvbYDbMjcdwcuLbYGbMjbYHbSQbZUbNrbYJbWFbOGbWDbYKbYLbUpbYMbTnbPQbPRbYNbYObYPbOPcaMbCDbWibCDbYQbXKbjLbSubYRduzbYTbYUduAduzcdHcdAcdHbzNbyObNIbDcbEhbEhbEhbYZbZabSIbUCbMNbUDbZbbSEbSEbUFbDcbRHbZcbZdbZebRHbRHbZfbZgcdMcdNbZjbVYbVZbZkbUMbUMbZPbjfbgZbrqbgZbZlbgZahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjbCvdvQdvPdvPdvRdvLbJjbCvbZvbZwahlahlahlahlahlahlahlbppdcdbWnbZxbZybZzbYsbZAbZxbZxbYvbZBbZCbYyccAbWodumbppbQLbfHbGwcbAcbAccWccBccQcdbcdlccXduxbMjbOGbSQdjybZVbYJbZWbOGbWDbYKcgrbUnbZXbTsahjbReclkbZZcaabOPcaMbCDbWibCDcabcacbjLbSubNJcadcaebNJduybNJbNJbNJbNJbNJbSubNIbDcbJWbJWbJWbJWbVRcafbTLcagbVRbJWbJWbJWbJWbDcbTRcahbTRbTRbTRbRHbZfbZgcdtcducakcalbRxbCzbRHbUMbZPbjfbgZblAblAblAcanahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjahjbRJbRJbRJbCvbCvbCvdvSbCvbCvbCvbCvahjahlahlaPYahlahlahlahlahlduNdcdbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWodumduMduJduKcexcbAcaDcaEcaEceJcaHcaIceKduLbMjcaLcjIbZUbNrbYJcaNbOGcaObYKcgrcaPcaQbMrbSobPRcaRbYObYObOPcaMcaSbWibCDcaTbXKbjLceQbPZbPZceObNJduObZsdpCbNKcaZccmbXIbNIbDcbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRbTRbTRbTRbRHcbfcbgceMceLbQubQubRxbQubRHbQubZPbjfbgZcbkcblcbmcbnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHaaHdpXdpXaaHdpXdpXdpXaaRdpXdpXdpXaaHdpXahjahjbCvbELbELbELbELbELbELbELbELbJjcbpahjahlahlahjdsiaFFahlahlahldotdcdbWncbscbtcascbubXnbXncbvcbwcbvcbxbYycbybWoduCduBduDduEbHXcbAdpFcaEcdOcdzcbEduGcdPduFduHbPHcirbNrbNrbNrcbJbOGcbKcbLcgrbUnbOGbTsahjbOPbOPbOPbOPbOPcaMcbMbWibCDcchbXKdwdbZQbZQceocepbNKduIcuYdpBbNKceabhpcdTcbWbDcbEhbEhbEhcbXbTKbMNbTLbMNbTMcbYbEhbEhbEhbDccbZbTRccabTRbTRccbcccccdcemcebbQubRxbRxccgbRHaDGbPdbWdbgZccjcckblAcclahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahlahjahjahlahjahjahlahlahjahjahjahldpXahlahlbCvbRKbELbCvbCvbCvbTZbCvbCvbCvbCvahlahlahldsiaDIauKdsidsiahjdotdcdbWnccpbZxbXnbXnbXnbZxcatccqccrbYyccscctbWobCvbCvbTzbTAbTBcbAcbAccxcaEdoZdoKdoMdoNdoQbMjbOGbVAccDccEccFbQWccGbVuccIbYLbUpccJbTnbPQbPRccKccLccLbOPcaMbXHbWibCDbCDbCDbWibCDbCDccMbDbbCDbCDcuBbCDbCDbDbbSWbSXbThbDcbEhbEhbEhccRccSbSIccTbMNbUDccUbSEbSEbUFbDcbTRbTRccVbTRbTRbRHcbfcbgbTibTxbQuccYccZcdabRHbfGbPdbjfbgZbgZbgZblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdccddcdeahlcdccddcdeahlcdccddcdeahjdpXahlahlbCvcdfcdgbCvcdhbELbELbOlaClcdkbCvahlahlahlatIdsidsiahjahlahldbVdcdbWnbZxcdncdobXncdpbZxbZxbYvcdqbYybYycdrbWocdsbSVbSCbSUbSBdoidnZdcNdctdcNdctdcvdctdcubMjcdCcdDcdEbSfbSfbShbUicdFbUmbSibUncdGbTsahjbReclhcdIcdJbOPcaMbCDbWibXKcdKckCbWicGabCDccMbSabRYbSqbZtbSwbRYbSAccMbLEcdVbDcbDcbDcbDcbDcbDccdWcdXcdYbDcbDcbDcbDcbDcbDcbRHbRHbRHbRHbRHbRHcdZcdZbSxbSybRHbRHbRHbRHbRHbgZcgFbjfbgZbNibOjblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdcceecdeahlcdcceecdeahlcdcceecdeahjahjahlahlbCvbPtbPvbCvbCvcefcegaClbELbSYbCvahlahlahlahlahjahlahlahlahlbppdcdbWnbXncehceibXncejcekbXnbYvcelbYxbYybYybVebVfbfIcercHqbVgceucevcewbVhceycezdpYcaEdqsbMjceBbOGbVAbUibONceCbWEceEceFbNFceGceHbMrbSobPRceIccLccLbOPcaMbCDdvgdvecdQdvebZRduWbCDbVdbUxbUNbJFcgAbJFbUJbUxbUybLEbTEbgZahlahlahlahjahlahlceVahlahjahlahlahlahlbgZceWayRceYceZceZbRHcfacfabSxbiZcfccfdblAblAblAaDGcgFbUwbgZcffblAblAbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcceecdeahlcdcceecdeahjcdcceecdeahjahjahlahlahlahlahjahjbCvbCvbCvbCvbTZbCvbCvahlahlahlahlahjahlahlahjahlbppdcdbWnbXncfgcfhcficfjcfkbXncflcfmcfncfocfpbWocfqdpVdpPdpQdpNdpOdpTdpUdpRdpSdpsdpzdpadprdpAdpEbQZcfFbVBbOGbOGbOGbOMbVvbVBbUnbXGbTsahjbOPbOPbOPbOPbOPcaMbCDcchbXddpDbXcbXKbUzbCDbCDcfKbTGcdUbXIcfMbTFbCDbCDbLEbTEbgZahlahlahlahjahlahlceVahlahjahlahlahlahlbgZblAchmbrscOnciqbRHcfScfSbTDbiZbRHbQubgZcfUcfVaDGcgFbTCbECbECbECcfYcfZcgacfZcgbdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahlahjahlahlahlahlahlahlbCvaOlbCvbELbELbCvahjahlahjahlahlahjahlahlahjahlbppdcdbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWobWobCvbWpbCvcggcghcghcghcgicgjcgkcghbWrdqEdqRbMjchebXEbSkbXjcgscgtcgsbXjcgubXjcgvbUicgwahjahjahjahjahjahjcaMbWhbWhbWhbWhdvqbWhbWhbWhcgxbCDcgzcgzdpdcgzcgzbCDbYQbzgbTEbgZcgCcgDcgEbgZcgCcgDcuncgEbgZcgCcgDcgDcgEbgZbgZcgFcgGbgZbgZbRHbRHbRHbWabWbbRHaDGbgZcbmblAbpYcgFbWdbgZbgZcgLbgZbgZbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahjahjahjahjcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbppdcdbCvcgQbVPbVObVObVObVObVObVObVObVObVObVXbVXbVObVQcefcggcnjcgWcgXcgYcgZchacghdoBcmIdqxbMjchebXichgchhchibWIchkchlbOGbXechnchobOIahjahjahlahlahlahldvddvcdvfdvkdvhdvndvjdvibWhchqdpkbViduYduXcdUcdUbXKbXKbzgbJEbVHbVHbVHbVHbVHbVHbVHbVIbVqbVqbVqbVqbVqbVqbVrbVqduQbVqbVqbVGciFbVlbVkbVjbVnbgZbgZbVmciFbVJciFbVLbjfbgZchLblAblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjchMahjahjahjchMahjahlahjchMahjahlahjchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZdsrdsydrBdrAbiTcicciccicciccicciccicciccicciccicciccicciccggcghciecifdsbbZDbZEbZFckUckbdspciccincfGcipceDcipcfGcipceDcipccHcipccHcisahjahjahlahlahlahlbWhdvZdvYdwcdwbdvXdvtdvsbWhchqduRcdUduSbYWbYVceTbFobXabXbbWQbWQbWQbWQbWQbWQbWQbWRbWSbWQbWQbWQbWQbWQbWQbYIbYEbYhchEbYCbYibYcbYcbYcbYdbXAbXxbXObXBbYYbYcbYcbYXbZhbgZbOjblAcbabgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjciRciSciSciTciUciUciUciUciUciUciUciUciUciUciUciVciXciYciXciZdrvcjbcbHchZcjdcjeaClbCvcjgcjhcjhcjhcjhcjhcjhcjhcjibCvbCvdrqdrldrjdrgciccjncjncjociccjpcpFcpEcpCcpOcpNcjvcmvcjxcjycghcjzcjAdracjCcjDcjEcjHdrbdrdcicahjcbIahjcaMahjcbIahjcaMahjbZqahjbZqahlahlahlahlahlahlahlbWhdvpdvrdvvdvmdvldvodvubWhbXKcjLcjMduTcjObXJbFobSZbWqbCDbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcpGblAbgZbWKbWwbgZbgZcgCcgEbgZbgZcjTbPdbPbbgZcjUcjVbpWbgZbgZbgZbgZbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjcjWahjahlahjcjWahjahlahjcjWahjahlahlchNchOcjXcjYcjZckacgNbELbELbELbELbCvahlahlahjahlahlahjahlahlahjahlbCvckdbCvcmacmhcicckfckgckhckickjbhAckUckUckUbOHbOKbORckrbhAcghbvCckuclScjCckwcghaJbclRclMcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPahlahlahlahlahlahlbWhbUWbUTbTXbUTbWfbUXbUYbWgbUZbUZccPbVabWeccPcnCbCDbCDbCDahlahlahjahlahjahjahlahlahlahlahlahlahlahlahlbgZcnyckEbgZbPbbPdbgZahlahlahlahlbgZblAbPdbPackGckGckHckIckGahlahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahjahjahjckKcgNcgNcgNcgNbJibJjbELbELbCvahjahjcjtcjtcjtcjtcjtcjtcjtahjbCvbCvbCvcmBcmxcicckPckhckhckickQckxckxcmwcmjcmqcmicmiciickUcghckWcmQcmJckZclacghclbcmIcmDcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPahlahlahlahlahlahlbUVbUObUTbUUbXfbXgbXhbXkbWhahjbCDcfKduUcnZcacbCDbCDahlbRJahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlbgZcnUbgZbgZbPibPdbgZbgZcgCcgEbgZbgZblAbPjbPfckGclqclrclsckGahlahlahjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcdcckJcdeahjcdcckJcdeahlcdcckJcdeahlahlahlahlahlahlahlahlbCvbCvbCvbXlbELbCvahlahlcjtclFclzclEclzclucjtahlbCvbSYbELcnzcmxcicclAclAclBcicclCclDcmmcnpckbcmFbPAcksckockocghclKcnmcncclNclOclPclQcmScmRcicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPahlahlahlahlahlahlbWhbYpbYnbYobYlbYmbYjbYkbWhahjahlahjduVahlahlahjahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahlcmccmdcmebgZbJkaDGbgZbPEbPFciCciFciCciCciCciCciGcfRbPDckGcnBcnAcmkckGahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahlahlahlahlahlahlahlcgccgdcgcbELbELbCvahlahlcjtcmscmocmncmrcmpcjtahlbCvcegbELcnzcmxcicclAclAclBciccmucmvcmtcnFcnHckVcmAcmvcmzcmAcmvdtocnOcnMcmFcmGcmHcmEckbcnIcicbOPclTcmKclTbOPclVcmLclVbOPclZcmMclZbOPahlahlahlahlahlahlbWhbWhbWhbZrbUQbZmbZobZpbUQahjahlahjcmNahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahjcbnblAcmObgZcphblAbgZbPVbKLbKLbQabKLchEchEchEbPXbPYchKckGcnQcnPcmTckGahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahjcdcckJcdeahjahjahjahjahjahjahjahjbCvbCvbCvbCvbELbCvahjahjcjtcmPcoZcoUcoPcmPcjtahjbCvciccnbclecoccicclAclBclBciccndcnecmycodckbclHclGclJclGclGcnkcnlcnScnRcnocnncnncnncobcoacicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPahlahlahlahlahlahlahlahlahlbZnbUQcfHcbOcdLbUQahjahlahlahlahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahjdsicbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZahlahjahlahjahlcnscntcnucnvcnwahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaRahjcdccnxcdeahlcdccnxcdeahlcdccnxcdeahjdpXahjahlahlahlahlahlahlahlahlbLWbELcaqahlahlcjtcmZcnfcpkcnqcngcjtcjtcjtciccnEclecoeciccicciccicciccnGckUcofcnpckbckUckUckUbQybQwccOckbckbcnpckUcopckUckUcohcogcicahjahlahlahlahjahjahlahlahjahlahlahlahjahlahlahlahlahlahlahlahlahlbZubUQbZmcfIbZpbUQahjahlahlahlahlahlahlahlahlbRJahlahlahlahlahlahjahlahlahlahlahldsicbnblAaBRbgZbLkblAblAblAblAblAblAblAbgZahlahjahlahjahlahjcnVcnWcnVahjahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahlahjahlahlahlahjahjahjahlahlahjahjahldpXahjahjahlahlahlahlahlahlahlbRMbELbRMahlahlcjtcoicppcpocpmcojcokcomcolcokcoFcoHcoIcoJcoKcoOcoQcoRcoSckxcoTcoVcoWcoXcoYclyconclyconcoocoscoqckxckxcotckxcoEcoDciccicciccicciccmvcmvcmvcmvcicahlahjahjahjahlahlahlahlahlahlahlahlahlbZubUQdvachpduZcfJahjahlahlahlahlaaeahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlcoucmdcmebgZcnUbgZbgZbLlcowckEcoxbgZbgZahlahjahlahlahlahjcoycnucoyahjahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXaaHaaHaaRdpXdpXdpXdpXaaHdpXdpXaaHcozahlahjahjahlahlahlahlahlahjbRMbELbRMahjahjcjtcpecpicpfcpicpjcprcpqcptcprcpwcmicpucpvcpPcpzcpxcpzcqNcuocqCcqMcuGcBIcupcuwcEUcEVcEUcELcFDcFzcmicqMcGwcmicGvcFRcmidbyckUbRXcicdsWdsXcpacpbcpbcpcahlahlahlahlahlahlahlahlahlahlahlahlbZubUQbUQdvbbUQbUQahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcmbahlbgZbgZcgCcgEbgZbgZahjahjahlahlahlahlahjahlcpdahlahlahlahlahlahlahlahjahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlcdmbELcdmahlahlcjtcjscjrcnhcnacmYcmUcmXcmVcmUcaWcamcaXckeckbcplcqDcpncmFbYecambGvbGvbGvbHWbSrcjqcpsckSckkcbTcbScbSccOckUcopcmFckOcktckqckxckvboSckhckhcpAcpBcbRcpDahlahlahlahlahlahlahlahlahlahlahlahlbZudsibUQbTYbUQcrVahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlbqzahlahlahjahlahjahlahlahjahjahjahlahlahlahjahlcpdahlahjahlahlahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlbCvbCvbTZbCvbCvahlcjtcknckmcklcjtcjtcjtcjtcjtciccpHckUcjucnicjFcpIcpJcpKcmFcpLcpMcoAcnNcorciccpQcnLcpScopcpTciccnKcnJcnJcpMcpLcmFcpWckRckbckUbOxcicbxeckhcpZcpbcpbcqaahlahlahlahlahlahlahlaaeahlahlahlahlcmNdsibURbUSbURdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbcqbcqbcqcahjahjahjahjcpdahjahjahjahjahjaaRcqbcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlbCvckdbELcqdbCvahjcjtcjtcjtcjtcjtahjahlahlahjciccqeckUckpcoNcoNckycmvcmvcqgciccqhcoBcoBcoBciccqjcqkcqlcqmcpyciccoBcoBcoBcqhciccqgcmvckTckbckUcicciccmvcmvcmvcmvcicahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlahjahlahjahlahlahlcqoahlahjahjahlahlahlahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlbLWbDicqqcqrbCvahjahlahlahjahlahlahjahlahlahjciccqscqtcmFcqucqvcqwcmvcqxcqyciccqzcoLcoMcoLcqDcqEcqFcqGcqHcpycqIcoLcoLcoLcqJciccqKcqLcleckbckYclbckXckUbZYcqIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlcqOcqOcqOcqOcqOahjcqPahjcqOcqOcqOcqOcqOahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbRMcqQcqRbfFbCvbCvcqTcqUcqUcqUcqUcqUcqUcqVcmvciccqWcqXcqYcqZcqWciccicciccqgcicciccmzcracrbcrccrdcpMcrecpMcrfcrgcrbcracrhcicciccqgciccleclpclwclvclmckUciAcizahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrjcrkcrkcrkcrkcrlcqPcrmcrncrncrncrncroahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcrpcrqcrqcrrbCvahjahlahlahjahlahlahjahlahlahjdsidsidsiahjahlahjdsiciccrscrtcruahlahlahlcrvcrwcracracracracracrwcrxahlahlahlcrycrzcrAclLclIclyclyclxcpXciDcjQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrBcrBcrBcrBcrBahlcqPahlcrBcrBcrBcrBcrBahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 5a048c562bb..41f2276b61f 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -19,6 +19,7 @@ Pipelines + Other Objects -> Pipe network var/can_unwrench = 0 var/initialize_directions = 0 var/pipe_color + var/obj/item/pipe/stored var/global/list/iconsetids = list() var/global/list/pipeimages = list() @@ -27,6 +28,12 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/process() //build_network() */ + +/obj/machinery/atmospherics/New() + ..() + if(can_unwrench) + stored = new(src, make_from=src) + /obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) // Check to see if should be added to network. Add self if so and adjust variables appropriately. // Note don't forget to have neighbors look as well! @@ -90,17 +97,22 @@ Pipelines + Other Objects -> Pipe network "[user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear ratchet.") - var/obj/item/pipe/newpipe = new(loc, make_from=src) - transfer_fingerprints_to(newpipe) - if(istype(src, /obj/machinery/atmospherics/pipe)) - for(var/obj/machinery/meter/meter in T) - if(meter.target == src) - new /obj/item/pipe_meter(T) - qdel(meter) - qdel(src) + Deconstruct() else return ..() +/obj/machinery/atmospherics/Deconstruct() + if(can_unwrench) + var/turf/T = loc + stored.loc = T + transfer_fingerprints_to(stored) + if(istype(src, /obj/machinery/atmospherics/pipe)) + for(var/obj/machinery/meter/meter in T) + if(meter.target == src) + new /obj/item/pipe_meter(T) + qdel(meter) + qdel(src) + /obj/machinery/atmospherics/proc/nullifyPipenetwork() return @@ -125,3 +137,6 @@ Pipelines + Other Objects -> Pipe network return img +/obj/machinery/atmospherics/singularity_pull(S, current_size) + if(current_size >= STAGE_FIVE) + Deconstruct() \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index da4756b3d74..a4cac57ca48 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -2,7 +2,6 @@ var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke var/datum/pipeline/parent var/volume = 0 - force = 20 layer = 2.4 //under wires with their 2.44 use_power = 0 can_unwrench = 1 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 512768419be..2991fe66569 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -44,3 +44,10 @@ #define BE_CLOSE 1 //in the case of a silicon, to select if they need to be next to the atom #define NO_DEXTERY 1 //if other mobs (monkeys, aliens, etc) can use this //used by canUseTopic() + +//singularity defines +#define STAGE_ONE 1 +#define STAGE_TWO 3 +#define STAGE_THREE 5 +#define STAGE_FOUR 7 +#define STAGE_FIVE 9 \ No newline at end of file diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 03265398796..c253e1e02e6 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -70,4 +70,14 @@ /proc/log_pda(text) if (config.log_pda) - diary << "\[[time_stamp()]]PDA: [text]" \ No newline at end of file + diary << "\[[time_stamp()]]PDA: [text]" + +/proc/log_chat(text) + if (config.log_pda) //reusing this for now, can change if needed + diary << "\[[time_stamp()]]CHAT: [text]" + +/proc/log_comment(text) + if (config.log_pda) + //reusing the PDA option because I really don't think news comments are worth a config option + diary << "\[[time_stamp()]]COMMENT: [text]" + diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 433bfc66de3..067bfcac67f 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -454,3 +454,59 @@ for(var/t in test_times) return "SW" else return + + + + +//Turns a Body_parts_covered bitfield into a list of organ/limb names. +//(I challenge you to find a use for this) +/proc/body_parts_covered2organ_names(var/bpc) + var/list/covered_parts = list() + + if(!bpc) + return 0 + + if(bpc & FULL_BODY) + covered_parts |= list("l_arm","r_arm","head","chest","l_leg","r_leg") + + else + if(bpc & HEAD) + covered_parts |= list("head") + if(bpc & CHEST) + covered_parts |= list("chest") + if(bpc & GROIN) + covered_parts |= list("chest") + + if(bpc & ARMS) + covered_parts |= list("l_arm","r_arm") + else + if(bpc & ARM_LEFT) + covered_parts |= list("l_arm") + if(bpc & ARM_RIGHT) + covered_parts |= list("r_arm") + + if(bpc & HANDS) + covered_parts |= list("l_arm","r_arm") + else + if(bpc & HAND_LEFT) + covered_parts |= list("l_arm") + if(bpc & HAND_RIGHT) + covered_parts |= list("r_arm") + + if(bpc & LEGS) + covered_parts |= list("l_leg","r_leg") + else + if(bpc & LEG_LEFT) + covered_parts |= list("l_leg") + if(bpc & LEG_RIGHT) + covered_parts |= list("r_leg") + + if(bpc & FEET) + covered_parts |= list("l_leg","r_leg") + else + if(bpc & FOOT_LEFT) + covered_parts |= list("l_leg") + if(bpc & FOOT_RIGHT) + covered_parts |= list("r_leg") + + return covered_parts \ No newline at end of file diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index a799dd0ee1c..e50f6555116 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -8,6 +8,7 @@ var/global/list/shuttle_caller_list = list() //list of all communication cons var/global/list/machines = list() var/global/list/processing_objects = list() var/global/list/active_diseases = list() +var/global/list/aibots = list() var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index b2d288b25e1..f8d0610d410 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -1,3 +1,137 @@ +/obj/screen/ai + icon = 'icons/mob/screen_ai.dmi' + +/obj/screen/ai/aicore + name = "AI core" + icon_state = "ai_core" + +/obj/screen/ai/aicore/Click() + var/mob/living/silicon/ai/AI = usr + AI.view_core() + +/obj/screen/ai/camera_list + name = "Show Camera List" + icon_state = "camera" + +/obj/screen/ai/camera_list/Click() + var/mob/living/silicon/ai/AI = usr + var/camera = input(AI, "Choose which camera you want to view", "Cameras") as null|anything in AI.get_camera_list() + AI.ai_camera_list(camera) + +/obj/screen/ai/camera_track + name = "Track With Camera" + icon_state = "track" + +/obj/screen/ai/camera_track/Click() + var/mob/living/silicon/ai/AI = usr + var/target_name = input(AI, "Choose who you want to track", "Tracking") as null|anything in AI.trackable_mobs() + AI.ai_camera_track(target_name) + +/obj/screen/ai/camera_light + name = "Toggle Camera Light" + icon_state = "camera_light" + +/obj/screen/ai/camera_light/Click() + var/mob/living/silicon/ai/AI = usr + AI.toggle_camera_light() + +/obj/screen/ai/crew_monitor + name = "Crew Monitoring Console" + icon_state = "crew_monitor" + +/obj/screen/ai/crew_monitor/Click() + var/mob/living/silicon/ai/AI = usr + crewmonitor(AI,AI) + +/obj/screen/ai/crew_manifest + name = "Crew Manifest" + icon_state = "manifest" + +/obj/screen/ai/crew_manifest/Click() + var/mob/living/silicon/ai/AI = usr + AI.ai_roster() + +/obj/screen/ai/alerts + name = "Show Alerts" + icon_state = "alerts" + +/obj/screen/ai/alerts/Click() + var/mob/living/silicon/ai/AI = usr + AI.ai_alerts() + +/obj/screen/ai/announcement + name = "Make Announcement" + icon_state = "announcement" + +/obj/screen/ai/announcement/Click() + var/mob/living/silicon/ai/AI = usr + AI.announcement() + +/obj/screen/ai/call_shuttle + name = "Call Emergency Shuttle" + icon_state = "call_shuttle" + +/obj/screen/ai/call_shuttle/Click() + var/mob/living/silicon/ai/AI = usr + AI.ai_call_shuttle() + +/obj/screen/ai/state_laws + name = "State Laws" + icon_state = "state_laws" + +/obj/screen/ai/state_laws/Click() + var/mob/living/silicon/ai/AI = usr + AI.checklaws() + +/obj/screen/ai/pda_msg_send + name = "PDA - Send Message" + icon_state = "pda_send" + +/obj/screen/ai/pda_msg_send/Click() + var/mob/living/silicon/ai/AI = usr + AI.cmd_send_pdamesg(usr) + +/obj/screen/ai/pda_msg_show + name = "PDA - Show Message Log" + icon_state = "pda_receive" + +/obj/screen/ai/pda_msg_show/Click() + var/mob/living/silicon/ai/AI = usr + AI.cmd_show_message_log(usr) + +/obj/screen/ai/image_take + name = "Take Image" + icon_state = "take_picture" + +/obj/screen/ai/image_take/Click() + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.aicamera.toggle_camera_mode() + else if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.aicamera.toggle_camera_mode() + +/obj/screen/ai/image_view + name = "View Images" + icon_state = "view_images" + +/obj/screen/ai/image_view/Click() + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.aicamera.viewpictures() + else if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.aicamera.viewpictures() + +/obj/screen/ai/sensors + name = "Sensor Augmentation" + icon_state = "ai_sensor" + +/obj/screen/ai/sensors/Click() + var/mob/living/silicon/S = usr + S.sensor_mode() + + /datum/hud/proc/ai_hud() adding = list() other = list() @@ -5,139 +139,79 @@ var/obj/screen/using //AI core - using = new /obj/screen() - using.name = "AI Core" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "ai_core" + using = new /obj/screen/ai/aicore() using.screen_loc = ui_ai_core - using.layer = 20 adding += using //Camera list - using = new /obj/screen() - using.name = "Show Camera List" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "camera" + using = new /obj/screen/ai/camera_list() using.screen_loc = ui_ai_camera_list - using.layer = 20 adding += using //Track - using = new /obj/screen() - using.name = "Track With Camera" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "track" + using = new /obj/screen/ai/camera_track() using.screen_loc = ui_ai_track_with_camera - using.layer = 20 adding += using //Camera light - using = new /obj/screen() - using.name = "Toggle Camera Light" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "camera_light" + using = new /obj/screen/ai/camera_light() using.screen_loc = ui_ai_camera_light - using.layer = 20 adding += using -//Crew Monitorting - using = new /obj/screen() - using.name = "Crew Monitorting" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "crew_monitor" +//Crew Monitoring + using = new /obj/screen/ai/crew_monitor() using.screen_loc = ui_ai_crew_monitor - using.layer = 20 adding += using //Crew Manifest - using = new /obj/screen() - using.name = "Show Crew Manifest" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "manifest" + using = new /obj/screen/ai/crew_manifest() using.screen_loc = ui_ai_crew_manifest - using.layer = 20 adding += using //Alerts - using = new /obj/screen() - using.name = "Show Alerts" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "alerts" + using = new /obj/screen/ai/alerts() using.screen_loc = ui_ai_alerts - using.layer = 20 adding += using //Announcement - using = new /obj/screen() - using.name = "Announcement" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "announcement" + using = new /obj/screen/ai/announcement() using.screen_loc = ui_ai_announcement - using.layer = 20 adding += using //Shuttle - using = new /obj/screen() - using.name = "Call Emergency Shuttle" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "call_shuttle" + using = new /obj/screen/ai/call_shuttle() using.screen_loc = ui_ai_shuttle - using.layer = 20 adding += using //Laws - using = new /obj/screen() - using.name = "State Laws" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "state_laws" + using = new /obj/screen/ai/state_laws() using.screen_loc = ui_ai_state_laws - using.layer = 20 adding += using //PDA message - using = new /obj/screen() - using.name = "PDA - Send Message" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "pda_send" + using = new /obj/screen/ai/pda_msg_send() using.screen_loc = ui_ai_pda_send - using.layer = 20 adding += using //PDA log - using = new /obj/screen() - using.name = "PDA - Show Message Log" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "pda_receive" + using = new /obj/screen/ai/pda_msg_show() using.screen_loc = ui_ai_pda_log - using.layer = 20 adding += using //Take image - using = new /obj/screen() - using.name = "Take Image" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "take_picture" + using = new /obj/screen/ai/image_take() using.screen_loc = ui_ai_take_picture - using.layer = 20 adding += using //View images - using = new /obj/screen() - using.name = "View Images" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "view_images" + using = new /obj/screen/ai/image_view() using.screen_loc = ui_ai_view_images - using.layer = 20 adding += using //Medical/Security sensors - using = new /obj/screen() - using.name = "Sensor Augmentation" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "ai_sensor" + using = new /obj/screen/ai/sensors() using.screen_loc = ui_ai_sensor - using.layer = 20 adding += using mymob.client.screen += adding + other diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index ff3c1405301..7b183381253 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -1,3 +1,24 @@ +/obj/screen/alien + icon = 'icons/mob/screen_alien.dmi' + +/obj/screen/alien/leap + name = "toggle leap" + icon_state = "leap_off" + +/obj/screen/alien/leap/Click() + if(istype(usr, /mob/living/carbon/alien/humanoid)) + var/mob/living/carbon/alien/humanoid/hunter/AH = usr + AH.toggle_leap() + +/obj/screen/alien/nightvision + name = "toggle night-vision" + icon_state = "nightvision1" + +/obj/screen/alien/nightvision/Click() + var/mob/living/carbon/alien/humanoid/A = usr + A.nightvisiontoggle() + + /datum/hud/proc/alien_hud() adding = list() other = list() @@ -50,59 +71,42 @@ using.layer = 19 adding += using - using = new /obj/screen() - using.name = "act_intent" + using = new /obj/screen/act_intent() using.icon = 'icons/mob/screen_alien.dmi' using.icon_state = mymob.a_intent using.screen_loc = ui_acti - using.layer = 20 adding += using action_intent = using if(istype(mymob, /mob/living/carbon/alien/humanoid/hunter)) - mymob.leap_icon = new /obj/screen() - mymob.leap_icon.name = "leap" - mymob.leap_icon.icon = 'icons/mob/screen_alien.dmi' - mymob.leap_icon.icon_state = "leap_off" + mymob.leap_icon = new /obj/screen/alien/leap() mymob.leap_icon.screen_loc = ui_alien_storage_r - mymob.leap_icon.layer = 20 adding += mymob.leap_icon - using = new /obj/screen() - using.name = "mov_intent" + using = new /obj/screen/mov_intent() using.icon = 'icons/mob/screen_alien.dmi' using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") using.screen_loc = ui_movi - using.layer = 20 adding += using move_intent = using - using = new /obj/screen() - using.name = "drop" + using = new /obj/screen/drop() using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "act_drop" using.screen_loc = ui_drop_throw - using.layer = 19 adding += using - using = new /obj/screen() - using.name = "resist" + using = new /obj/screen/resist() using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "act_resist" using.screen_loc = ui_pull_resist - using.layer = 19 adding += using - mymob.throw_icon = new /obj/screen() + mymob.throw_icon = new /obj/screen/throw_catch() mymob.throw_icon.icon = 'icons/mob/screen_alien.dmi' - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw/catch" mymob.throw_icon.screen_loc = ui_drop_throw - mymob.pullin = new /obj/screen() + mymob.pullin = new /obj/screen/pull() mymob.pullin.icon = 'icons/mob/screen_alien.dmi' mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" mymob.pullin.screen_loc = ui_pull_resist //begin indicators @@ -131,10 +135,7 @@ mymob.healths.name = "health" mymob.healths.screen_loc = ui_alien_health - nightvisionicon = new /obj/screen() - nightvisionicon.icon ='icons/mob/screen_alien.dmi' - nightvisionicon.icon_state = "nightvision1" - nightvisionicon.name = "nightvision" + nightvisionicon = new /obj/screen/alien/nightvision() nightvisionicon.screen_loc = ui_alien_nightvision alien_plasma_display = new /obj/screen() diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 2775f546c6f..716947a1245 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -4,21 +4,17 @@ var/obj/screen/using - using = new /obj/screen() - using.name = "act_intent" + using = new /obj/screen/act_intent() using.icon = 'icons/mob/screen_alien.dmi' using.icon_state = mymob.a_intent using.screen_loc = ui_acti - using.layer = 20 adding += using action_intent = using - using = new /obj/screen() - using.name = "mov_intent" + using = new /obj/screen/mov_intent() using.icon = 'icons/mob/screen_alien.dmi' using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") using.screen_loc = ui_movi - using.layer = 20 adding += using move_intent = using @@ -48,16 +44,12 @@ mymob.healths.name = "health" mymob.healths.screen_loc = ui_alien_health - nightvisionicon = new /obj/screen() - nightvisionicon.icon ='icons/mob/screen_alien.dmi' - nightvisionicon.icon_state = "nightvision1" - nightvisionicon.name = "nightvision" + nightvisionicon = new /obj/screen/alien/nightvision() nightvisionicon.screen_loc = ui_alien_nightvision - mymob.pullin = new /obj/screen() + mymob.pullin = new /obj/screen/pull() mymob.pullin.icon = 'icons/mob/screen_alien.dmi' mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" mymob.pullin.screen_loc = ui_pull_resist mymob.blind = new /obj/screen() diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm index 26b803f830d..086dc39c95a 100644 --- a/code/_onclick/hud/drones.dm +++ b/code/_onclick/hud/drones.dm @@ -4,18 +4,14 @@ var/obj/screen/using var/obj/screen/inventory/inv_box - using = new /obj/screen() - using.name = "drop" + using = new /obj/screen/drop() using.icon = ui_style - using.icon_state = "act_drop" using.screen_loc = ui_drone_drop - using.layer = 19 adding += using - mymob.pullin = new /obj/screen() + mymob.pullin = new /obj/screen/pull() mymob.pullin.icon = ui_style mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" mymob.pullin.screen_loc = ui_drone_pull adding += mymob.pullin diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 87b3aaa984a..5b4b2c7fc09 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,3 +1,45 @@ +/obj/screen/human + icon = 'icons/mob/screen_midnight.dmi' + +/obj/screen/human/toggle + name = "toggle" + icon_state = "toggle" + +/obj/screen/human/toggle/Click() + if(usr.hud_used.inventory_shown) + usr.hud_used.inventory_shown = 0 + usr.client.screen -= usr.hud_used.other + else + usr.hud_used.inventory_shown = 1 + usr.client.screen += usr.hud_used.other + + usr.hud_used.hidden_inventory_update() + +/obj/screen/human/equip + name = "equip" + icon_state = "act_equip" + +/obj/screen/human/equip/Click() + if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech + return 1 + var/mob/living/carbon/human/H = usr + H.quick_equip() + +/obj/screen/ling + invisibility = 101 + +/obj/screen/ling/sting + name = "current sting" + +/obj/screen/ling/sting/Click() + var/mob/living/carbon/U = usr + U.unset_sting() + +/obj/screen/ling/chems + name = "chemical storage" + icon_state = "power_display" + + /datum/hud/proc/human_hud(ui_style = 'icons/mob/screen_midnight.dmi') adding = list() other = list() @@ -6,29 +48,22 @@ var/obj/screen/using var/obj/screen/inventory/inv_box - using = new /obj/screen() - using.name = "act_intent" + using = new /obj/screen/act_intent() using.icon_state = mymob.a_intent using.screen_loc = ui_acti - using.layer = 20 adding += using action_intent = using - using = new /obj/screen() - using.name = "mov_intent" + using = new /obj/screen/mov_intent() using.icon = ui_style using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") using.screen_loc = ui_movi - using.layer = 20 adding += using move_intent = using - using = new /obj/screen() - using.name = "drop" + using = new /obj/screen/drop() using.icon = ui_style - using.icon_state = "act_drop" using.screen_loc = ui_drop_throw - using.layer = 19 hotkeybuttons += using inv_box = new /obj/screen/inventory() @@ -143,28 +178,19 @@ inv_box.layer = 19 adding += inv_box - using = new /obj/screen() - using.name = "resist" + using = new /obj/screen/resist() using.icon = ui_style - using.icon_state = "act_resist" using.screen_loc = ui_pull_resist - using.layer = 19 hotkeybuttons += using - using = new /obj/screen() - using.name = "toggle" + using = new /obj/screen/human/toggle() using.icon = ui_style - using.icon_state = "toggle" using.screen_loc = ui_inventory - using.layer = 20 adding += using - using = new /obj/screen() - using.name = "equip" + using = new /obj/screen/human/equip() using.icon = ui_style - using.icon_state = "act_equip" using.screen_loc = ui_equip - using.layer = 20 adding += using inv_box = new /obj/screen/inventory() @@ -221,10 +247,8 @@ inv_box.layer = 19 adding += inv_box - mymob.throw_icon = new /obj/screen() + mymob.throw_icon = new /obj/screen/throw_catch() mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw/catch" mymob.throw_icon.screen_loc = ui_drop_throw hotkeybuttons += mymob.throw_icon @@ -243,9 +267,7 @@ mymob.toxin.name = "toxin" mymob.toxin.screen_loc = ui_toxin - mymob.internals = new /obj/screen() - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" + mymob.internals = new /obj/screen/internals() mymob.internals.screen_loc = ui_internal mymob.fire = new /obj/screen() @@ -268,25 +290,17 @@ mymob.nutrition_icon.name = "nutrition" mymob.nutrition_icon.screen_loc = ui_nutrition - mymob.pullin = new /obj/screen() + mymob.pullin = new /obj/screen/pull() mymob.pullin.icon = ui_style mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" mymob.pullin.screen_loc = ui_pull_resist hotkeybuttons += mymob.pullin - lingchemdisplay = new /obj/screen() - lingchemdisplay.name = "chemical storage" - lingchemdisplay.icon_state = "power_display" + lingchemdisplay = new /obj/screen/ling/chems() lingchemdisplay.screen_loc = ui_lingchemdisplay - lingchemdisplay.layer = 20 - lingchemdisplay.invisibility = 101 - lingstingdisplay = new /obj/screen() - lingstingdisplay.name = "current sting" + lingstingdisplay = new /obj/screen/ling/sting() lingstingdisplay.screen_loc = ui_lingstingdisplay - lingstingdisplay.layer = 20 - lingstingdisplay.invisibility = 101 mymob.blind = new /obj/screen() mymob.blind.icon = 'icons/mob/screen_full.dmi' diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index fecbfb5c513..8b2227e1009 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -5,30 +5,23 @@ var/obj/screen/using var/obj/screen/inventory/inv_box - using = new /obj/screen() - using.name = "act_intent" + using = new /obj/screen/act_intent() using.icon = ui_style using.icon_state = mymob.a_intent using.screen_loc = ui_acti - using.layer = 20 adding += using action_intent = using - using = new /obj/screen() - using.name = "mov_intent" + using = new /obj/screen/mov_intent() using.icon = ui_style using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") using.screen_loc = ui_movi - using.layer = 20 adding += using move_intent = using - using = new /obj/screen() - using.name = "drop" + using = new /obj/screen/drop() using.icon = ui_style - using.icon_state = "act_drop" using.screen_loc = ui_drop_throw - using.layer = 19 adding += using inv_box = new /obj/screen/inventory() @@ -89,10 +82,8 @@ inv_box.layer = 19 adding += inv_box - mymob.throw_icon = new /obj/screen() + mymob.throw_icon = new /obj/screen/throw_catch() mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw/catch" mymob.throw_icon.screen_loc = ui_drop_throw mymob.oxygen = new /obj/screen() @@ -110,9 +101,7 @@ mymob.toxin.name = "toxin" mymob.toxin.screen_loc = ui_toxin - mymob.internals = new /obj/screen() - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" + mymob.internals = new /obj/screen/internals() mymob.internals.screen_loc = ui_internal mymob.fire = new /obj/screen() @@ -130,24 +119,16 @@ mymob.healths.name = "health" mymob.healths.screen_loc = ui_health - mymob.pullin = new /obj/screen() + mymob.pullin = new /obj/screen/pull() mymob.pullin.icon = ui_style mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" mymob.pullin.screen_loc = ui_pull_resist - lingchemdisplay = new /obj/screen() - lingchemdisplay.name = "chemical storage" - lingchemdisplay.icon_state = "power_display" + lingchemdisplay = new /obj/screen/ling/chems() lingchemdisplay.screen_loc = ui_lingchemdisplay - lingchemdisplay.layer = 20 - lingchemdisplay.invisibility = 101 - lingstingdisplay = new /obj/screen() - lingstingdisplay.name = "current sting" + lingstingdisplay = new /obj/screen/ling/sting() lingstingdisplay.screen_loc = ui_lingstingdisplay - lingstingdisplay.layer = 20 - lingstingdisplay.invisibility = 101 mymob.blind = new /obj/screen() mymob.blind.icon = 'icons/mob/screen_full.dmi' @@ -169,12 +150,9 @@ mymob.client.screen = null - using = new /obj/screen() - using.name = "resist" + using = new /obj/screen/resist() using.icon = ui_style - using.icon_state = "act_resist" using.screen_loc = ui_pull_resist - using.layer = 19 adding += using mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index f81d908e36a..7e3efee803b 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,3 +1,59 @@ +/obj/screen/robot + icon = 'icons/mob/screen_cyborg.dmi' + +/obj/screen/robot/module + name = "cyborg module" + icon_state = "nomod" + +/obj/screen/robot/module/Click() + var/mob/living/silicon/robot/R = usr + if(R.module) + R.hud_used.toggle_show_robot_modules() + return 1 + R.pick_module() + +/obj/screen/robot/module1 + name = "module1" + icon_state = "inv1" + +/obj/screen/robot/module1/Click() + var/mob/living/silicon/robot/R = usr + R.toggle_module(1) + +/obj/screen/robot/module2 + name = "module2" + icon_state = "inv2" + +/obj/screen/robot/module2/Click() + var/mob/living/silicon/robot/R = usr + R.toggle_module(2) + +/obj/screen/robot/module3 + name = "module3" + icon_state = "inv3" + +/obj/screen/robot/module3/Click() + var/mob/living/silicon/robot/R = usr + R.toggle_module(3) + + +/obj/screen/robot/radio + name = "radio" + icon_state = "radio" + +/obj/screen/robot/radio/Click() + var/mob/living/silicon/robot/R = usr + R.radio_menu() + +/obj/screen/robot/store + name = "store" + icon_state = "store" + +/obj/screen/robot/store/Click() + var/mob/living/silicon/robot/R = usr + R.uneq_active() + + /datum/hud/proc/robot_hud() adding = list() other = list() @@ -6,88 +62,60 @@ //Radio - using = new /obj/screen() - using.name = "radio" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "radio" + using = new /obj/screen/robot/radio() using.screen_loc = ui_borg_radio - using.layer = 20 adding += using //Module select - using = new /obj/screen() - using.name = "module1" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "inv1" + var/mob/living/silicon/robot/mymobR = mymob + + using = new /obj/screen/robot/module1() using.screen_loc = ui_inv1 - using.layer = 20 adding += using - mymob:inv1 = using + mymobR.inv1 = using - using = new /obj/screen() - using.name = "module2" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "inv2" + using = new /obj/screen/robot/module2() using.screen_loc = ui_inv2 - using.layer = 20 adding += using - mymob:inv2 = using + mymobR.inv2 = using - using = new /obj/screen() - using.name = "module3" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "inv3" + using = new /obj/screen/robot/module3() using.screen_loc = ui_inv3 - using.layer = 20 adding += using - mymob:inv3 = using + mymobR.inv3 = using //End of module select //Photography stuff - using = new /obj/screen() - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "take_picture" - using.name = "Take Image" + using = new /obj/screen/ai/image_take() using.screen_loc = ui_borg_camera - using.layer = 20 adding += using - using = new /obj/screen() - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "view_images" - using.name = "View Images" + using = new /obj/screen/ai/image_view() using.screen_loc = ui_borg_album - using.layer = 20 adding += using //Sec/Med HUDs - using = new /obj/screen() - using.name = "Sensor Augmentation" - using.icon = 'icons/mob/screen_ai.dmi' - using.icon_state = "ai_sensor" + using = new /obj/screen/ai/sensors() using.screen_loc = ui_borg_sensor - using.layer = 20 adding += using //Intent - using = new /obj/screen() - using.name = "act_intent" + using = new /obj/screen/act_intent() using.icon = 'icons/mob/screen_cyborg.dmi' using.icon_state = mymob.a_intent using.screen_loc = ui_borg_intents - using.layer = 20 adding += using action_intent = using //Cell - mymob:cells = new /obj/screen() - mymob:cells.icon = 'icons/mob/screen_cyborg.dmi' - mymob:cells.icon_state = "charge-empty" - mymob:cells.name = "cell" - mymob:cells.screen_loc = ui_toxin + mymobR.cells = new /obj/screen() + mymobR.cells.icon = 'icons/mob/screen_cyborg.dmi' + mymobR.cells.icon_state = "charge-empty" + mymobR.cells.name = "cell" + mymobR.cells.screen_loc = ui_toxin //Health mymob.healths = new /obj/screen() @@ -97,17 +125,11 @@ mymob.healths.screen_loc = ui_borg_health //Installed Module - mymob.hands = new /obj/screen() - mymob.hands.icon = 'icons/mob/screen_cyborg.dmi' - mymob.hands.icon_state = "nomod" - mymob.hands.name = "module" + mymob.hands = new /obj/screen/robot/module() mymob.hands.screen_loc = ui_borg_module //Store - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = 'icons/mob/screen_cyborg.dmi' - mymob.throw_icon.icon_state = "store" - mymob.throw_icon.name = "store" + mymob.throw_icon = new /obj/screen/robot/store() mymob.throw_icon.screen_loc = ui_borg_store //Temp @@ -155,7 +177,7 @@ mymob.client.screen = null - mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymobR.cells, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += adding + other return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index b64cf1cdb41..82d894dba43 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -68,6 +68,15 @@ return +/obj/screen/drop + name = "drop" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_drop" + layer = 19 + +/obj/screen/drop/Click() + usr.drop_item_v() + /obj/screen/grab name = "grab" @@ -82,6 +91,112 @@ /obj/screen/grab/attackby() return +/obj/screen/act_intent + name = "intent" + icon_state = "help" + +/obj/screen/act_intent/Click(location, control, params) + if(ishuman(usr) && (usr.client.prefs.toggles & INTENT_STYLE)) + + var/_x = text2num(params2list(params)["icon-x"]) + var/_y = text2num(params2list(params)["icon-y"]) + + if(_x<=16 && _y<=16) + usr.a_intent_change("harm") + + else if(_x<=16 && _y>=17) + usr.a_intent_change("help") + + else if(_x>=17 && _y<=16) + usr.a_intent_change("grab") + + else if(_x>=17 && _y>=17) + usr.a_intent_change("disarm") + + else + usr.a_intent_change("right") + +/obj/screen/internals + name = "toggle internals" + icon_state = "internal0" + +/obj/screen/internals/Click() + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(!C.stat && !C.stunned && !C.paralysis && !C.restrained()) + if(C.internal) + C.internal = null + C << "No longer running on internals." + icon_state = "internal0" + else + if(!istype(C.wear_mask, /obj/item/clothing/mask)) + C << "You are not wearing a mask." + return 1 + else + if(istype(C.l_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.l_hand] on your left hand." + C.internal = C.l_hand + else if(istype(C.r_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.r_hand] on your right hand." + C.internal = C.r_hand + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(istype(H.s_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." + H.internal = H.s_store + else if(istype(H.belt, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.belt] on your belt." + H.internal = H.belt + else if(istype(H.l_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.l_store] in your left pocket." + H.internal = H.l_store + else if(istype(H.r_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.r_store] in your right pocket." + H.internal = H.r_store + + //Seperate so CO2 jetpacks are a little less cumbersome. + if(!C.internal && istype(C.back, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.back] on your back." + C.internal = C.back + + if(C.internal) + icon_state = "internal1" + else + C << "You don't have an oxygen tank." + +/obj/screen/mov_intent + name = "run/walk toggle" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "running" + +/obj/screen/mov_intent/Click() + switch(usr.m_intent) + if("run") + usr.m_intent = "walk" + icon_state = "walking" + if("walk") + usr.m_intent = "run" + icon_state = "running" + usr.update_icons() + +/obj/screen/pull + name = "stop pulling" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "pull" + +/obj/screen/pull/Click() + usr.stop_pulling() + +/obj/screen/resist + name = "resist" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_resist" + layer = 19 + +/obj/screen/resist/Click() + if(isliving(usr)) + var/mob/living/L = usr + L.resist() /obj/screen/storage name = "storage" @@ -99,6 +214,16 @@ master.attackby(I, usr) return 1 +/obj/screen/throw_catch + name = "throw/catch" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_throw_off" + +/obj/screen/throw_catch/Click() + if(iscarbon(usr) && !usr.stat && isturf(usr.loc) && !usr.restrained()) + var/mob/living/carbon/C = usr + C.toggle_throw_mode() + /obj/screen/zone_sel name = "damage zone" icon_state = "zone_sel" @@ -166,243 +291,11 @@ /obj/screen/Click(location, control, params) if(!usr) return 1 - switch(name) - if("toggle") - if(usr.hud_used.inventory_shown) - usr.hud_used.inventory_shown = 0 - usr.client.screen -= usr.hud_used.other - else - usr.hud_used.inventory_shown = 1 - usr.client.screen += usr.hud_used.other + if(name == "Reset Machine") //I don't know what this is, CTRL+F has the only entry right here in this file, so I'm going to leave it in case it is something important + usr.unset_machine() + else + return 0 - usr.hud_used.hidden_inventory_update() - - if("equip") - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech - return 1 - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.quick_equip() - - if("current sting") - var/mob/living/carbon/U = usr - U.unset_sting() - - if("resist") - if(isliving(usr)) - var/mob/living/L = usr - L.resist() - - if("mov_intent") - switch(usr.m_intent) - if("run") - usr.m_intent = "walk" - usr.hud_used.move_intent.icon_state = "walking" - if("walk") - usr.m_intent = "run" - usr.hud_used.move_intent.icon_state = "running" - if(istype(usr,/mob/living/carbon/alien/humanoid)) - usr.update_icons() - if("Reset Machine") - usr.unset_machine() - if("internal") - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!C.stat && !C.stunned && !C.paralysis && !C.restrained()) - if(C.internal) - C.internal = null - C << "No longer running on internals." - if(C.internals) - C.internals.icon_state = "internal0" - else - if(!istype(C.wear_mask, /obj/item/clothing/mask)) - C << "You are not wearing a mask." - return 1 - else - if(istype(C.l_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.l_hand] on your left hand." - C.internal = C.l_hand - else if(istype(C.r_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.r_hand] on your right hand." - C.internal = C.r_hand - else if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(istype(H.s_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." - H.internal = H.s_store - else if(istype(H.belt, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.belt] on your belt." - H.internal = H.belt - else if(istype(H.l_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.l_store] in your left pocket." - H.internal = H.l_store - else if(istype(H.r_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.r_store] in your right pocket." - H.internal = H.r_store - - //Seperate so CO2 jetpacks are a little less cumbersome. - if(!C.internal && istype(C.back, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.back] on your back." - C.internal = C.back - - if(C.internal) - if(C.internals) - C.internals.icon_state = "internal1" - else - C << "You don't have an oxygen tank." - - if("act_intent") - if(ishuman(usr) && (usr.client.prefs.toggles & INTENT_STYLE)) - - var/_x = text2num(params2list(params)["icon-x"]) - var/_y = text2num(params2list(params)["icon-y"]) - - if(_x<=16 && _y<=16) - usr.a_intent_change("harm") - - else if(_x<=16 && _y>=17) - usr.a_intent_change("help") - - else if(_x>=17 && _y<=16) - usr.a_intent_change("grab") - - else if(_x>=17 && _y>=17) - usr.a_intent_change("disarm") - - else - usr.a_intent_change("right") - - if("pull") - usr.stop_pulling() - if("throw/catch") - if(!usr.stat && isturf(usr.loc) && !usr.restrained()) - usr:toggle_throw_mode() - if("drop") - usr.drop_item_v() - - if("module") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - if(R.module) - R.hud_used.toggle_show_robot_modules() - return 1 - R.pick_module() - - if("radio") - if(issilicon(usr)) - usr:radio_menu() - if("panel") - if(issilicon(usr)) - usr:installed_modules() - - if("store") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.uneq_active() - - if("module1") - if(istype(usr, /mob/living/silicon/robot)) - usr:toggle_module(1) - - if("module2") - if(istype(usr, /mob/living/silicon/robot)) - usr:toggle_module(2) - - if("module3") - if(istype(usr, /mob/living/silicon/robot)) - usr:toggle_module(3) - - if("AI Core") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.view_core() - - if("Show Camera List") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - var/camera = input(AI, "Choose which camera you want to view", "Cameras") as null|anything in AI.get_camera_list() - AI.ai_camera_list(camera) - - if("Track With Camera") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - var/target_name = input(AI, "Choose who you want to track", "Tracking") as null|anything in AI.trackable_mobs() - AI.ai_camera_track(target_name) - - if("Toggle Camera Light") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.toggle_camera_light() - - if("Crew Monitorting") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - crewmonitor(AI,AI) - - if("Show Crew Manifest") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.ai_roster() - - if("Show Alerts") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.ai_alerts() - - if("Announcement") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.announcement() - - if("Call Emergency Shuttle") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.ai_call_shuttle() - - if("State Laws") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.checklaws() - - if("PDA - Send Message") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.cmd_send_pdamesg(usr) - - if("PDA - Show Message Log") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.cmd_show_message_log(usr) - - if("Take Image") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.aicamera.toggle_camera_mode() - else if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.aicamera.toggle_camera_mode() - - if("View Images") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.aicamera.viewpictures() - else if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.aicamera.viewpictures() - if("nightvision") - if(isalien(usr)) - var/mob/living/carbon/alien/humanoid/A = usr - A.nightvisiontoggle() - if("Sensor Augmentation") - if(issilicon(usr)) - var/mob/living/silicon/S = usr - S.sensor_mode() - if("leap") - if(istype(usr, /mob/living/carbon/alien/humanoid)) - var/mob/living/carbon/alien/humanoid/hunter/AH = usr - AH.toggle_leap() - else - return 0 return 1 /obj/screen/inventory/Click() diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index acf02a77bc8..b9f35a0ffb6 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -26,6 +26,7 @@ var/global/pipe_processing_killed = 0 var/mobs_cost = 0 var/diseases_cost = 0 var/machines_cost = 0 + var/aibots_cost = 0 var/objects_cost = 0 var/networks_cost = 0 var/powernets_cost = 0 @@ -166,6 +167,13 @@ var/global/pipe_processing_killed = 0 sleep(breather_ticks) + //BOTS + timer = world.timeofday + process_bots() + aibots_cost = (world.timeofday - timer) / 10 + + sleep(breather_ticks) + //OBJECTS timer = world.timeofday process_objects() @@ -212,7 +220,7 @@ var/global/pipe_processing_killed = 0 gc_cost = (world.timeofday - timer) / 10 //TIMING - total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost + gc_cost + total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + aibots_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost + gc_cost var/end_time = world.timeofday if(end_time < start_time) @@ -258,6 +266,15 @@ var/global/pipe_processing_killed = 0 continue machines -= Machine +/datum/controller/game_controller/proc/process_bots() + for(var/obj/machinery/bot/Bot in aibots) + if(!Bot.gc_destroyed) + last_thing_processed = Bot.type + spawn(0) + Bot.bot_process() + continue + aibots -= Bot + /datum/controller/game_controller/proc/process_objects() for(var/obj/Object in processing_objects) if(!Object.gc_destroyed) diff --git a/code/controllers/supply_shuttle.dm b/code/controllers/supply_shuttle.dm index defa56ba515..e27cccf4921 100644 --- a/code/controllers/supply_shuttle.dm +++ b/code/controllers/supply_shuttle.dm @@ -32,7 +32,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle layer = 4 explosion_resistance = 5 -/obj/structure/plasticflaps/CanPass(atom/A, turf/T) +/obj/structure/plasticflaps/CanPass(atom/movable/A, turf/T) if(istype(A) && A.checkpass(PASSGLASS)) return prob(60) @@ -141,6 +141,8 @@ var/global/datum/controller/supply_shuttle/supply_shuttle var/eta //shuttle loan var/datum/round_event/shuttle_loan/shuttle_loan + //for logging + var/sold_atoms = "" /datum/controller/supply_shuttle/New() ordernum = rand(1,9000) @@ -235,17 +237,20 @@ var/global/datum/controller/supply_shuttle/supply_shuttle centcom_message = "" for(var/atom/movable/MA in shuttle) + sold_atoms += " [MA.name]" if(MA.anchored) continue // Must be in a crate (or a critter crate)! if(istype(MA,/obj/structure/closet/crate) || istype(MA,/obj/structure/closet/critter)) + sold_atoms += ":" crate_count++ var/find_slip = 1 for(var/atom in MA) // Sell manifests var/atom/A = atom + sold_atoms += " [A.name]" if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) var/obj/item/weapon/paper/manifest/slip = A // TODO: Check for a signature, too. @@ -310,6 +315,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle centcom_message += "+[S.rarity]: New species discovered: \"[capitalize(S.species)]\". Excellent work.
" points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later qdel(MA) + sold_atoms += "." if(plasma_count) centcom_message += "+[round(plasma_count/plasma_per_point)]: Received [plasma_count] unit(s) of exotic material.
" @@ -613,7 +619,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle supply_shuttle.moving = -1 supply_shuttle.sell() supply_shuttle.send() - + investigate_log("[usr.key] has sent the supply shuttle away. Remaining points: [supply_shuttle.points]. Shuttle contents:[supply_shuttle.sold_atoms].", "cargo") else if(href_list["loan"] && supply_shuttle.shuttle_loan) if(!supply_shuttle.shuttle_loan.dispatched) @@ -727,6 +733,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle supply_shuttle.points -= P.cost supply_shuttle.shoppinglist += O temp = "Thanks for your order." + investigate_log("[usr.key] has authorized an order for [P.name]. Remaining points: [supply_shuttle.points].", "cargo") else temp = "Not enough supply points." break diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index d3088c624a6..13fb01776d7 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -914,6 +914,19 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containertype = /obj/structure/largecrate/mule containername = "\improper MULEbot Crate" +/datum/supply_packs/misc/conveyor + name = "Conveyor Assembly Crate" + contains = list(/obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_switch_construct, + /obj/item/weapon/paper/conveyor) + cost = 15 + containername = "conveyor assembly crate" + /datum/supply_packs/misc/watertank name = "Water tank crate" contains = list(/obj/structure/reagent_dispensers/watertank) @@ -1005,7 +1018,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/reagent_containers/glass/bucket, /obj/item/weapon/reagent_containers/glass/bucket, /obj/item/weapon/mop, - /obj/item/weapon/holosign_creator, + /obj/item/weapon/caution, + /obj/item/weapon/caution, + /obj/item/weapon/caution, /obj/item/weapon/storage/bag/trash, /obj/item/weapon/reagent_containers/spray/cleaner, /obj/item/weapon/reagent_containers/glass/rag, @@ -1039,6 +1054,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 10 containername = "replacement lights" +/datum/supply_packs/misc/noslipfloor + name = "High-traction floor tiles" + contains = list(/obj/item/stack/tile/noslip) + amount = 20 + cost = 20 + containername = "high-traction floor tiles" + ///////////// Costumes @@ -1105,7 +1127,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/misc/randomised/contraband num_contained = 5 contains = list(/obj/item/weapon/contraband/poster, - /obj/item/weapon/storage/fancy/cigarettes/dromedaryco) + /obj/item/weapon/storage/fancy/cigarettes/dromedaryco, + /obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims) name = "Contraband crate" cost = 30 containername = "crate" //let's keep it subtle, eh? diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a877b468e96..63350c96e14 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -381,6 +381,12 @@ var/list/uplink_items = list() cost = 9 gamemodes = list(/datum/game_mode/nuclear) +/datum/uplink_item/badass/syndiecigs + name = "Syndicate Smokes" + desc = "Strong flavor, dense smoke, infused with Doctor's Delight." + item = /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate + cost = 4 + /datum/uplink_item/device_tools/space_suit name = "Syndicate Space Suit" desc = "The red and black syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings." @@ -399,7 +405,14 @@ var/list/uplink_items = list() name = "Binary Translator Key" desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary. " item = /obj/item/device/encryptionkey/binary - cost = 6 + cost = 5 + surplus = 75 + +/datum/uplink_item/device_tools/encryptionkey + name = "Syndicate Encryption Key" + desc = "A key, that when inserted into a radio headset, allows you to listen to all station department channels as well as talk on an encrypted Syndicate channel." + item = /obj/item/device/encryptionkey/syndicate + cost = 5 surplus = 75 /datum/uplink_item/device_tools/ai_detector diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 02a96c56f2e..2f1b1f6e074 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -7,7 +7,6 @@ var/fingerprintslast = null var/list/blood_DNA var/last_bumped = 0 - var/pass_flags = 0 var/throwpass = 0 ///Chemistry. @@ -366,9 +365,6 @@ var/list/blood_splatter_icons = list() else return 0 -/atom/proc/checkpass(passflag) - return pass_flags&passflag - /atom/proc/isinspace() if(istype(get_turf(src), /turf/space)) return 1 @@ -382,5 +378,9 @@ var/list/blood_splatter_icons = list() return /atom/proc/singularity_act() return + /atom/proc/singularity_pull() return + +/atom/proc/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) + return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 660a2f2be2f..0c5b5edfb19 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -10,6 +10,7 @@ var/mob/pulledby = null var/languages = 0 //For say() and Hear() var/inertia_dir = 0 + var/pass_flags = 0 glide_size = 8 /atom/movable/Move(atom/newloc, direct = 0) @@ -136,6 +137,8 @@ . = step(src, direction) dir = old_dir +/atom/movable/proc/checkpass(passflag) + return pass_flags&passflag /atom/movable/proc/hit_check() // todo: this is partly obsolete due to passflags already, add throwing stuff to mob CanPass and finish it if(src.throwing) diff --git a/code/game/dna.dm b/code/game/dna.dm index e6650118e31..f3e79618e99 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -340,6 +340,7 @@ var/locked = 0 var/open = 0 anchored = 1 + interact_offline = 1 use_power = 1 idle_power_usage = 50 active_power_usage = 300 @@ -371,6 +372,29 @@ for(var/obj/item/weapon/stock_parts/micro_laser/P in component_parts) damage_coeff = P.rating +/obj/machinery/dna_scannernew/update_icon() + + //no power or maintenance + if(stat & (NOPOWER|BROKEN)) + icon_state = initial(icon_state)+ (open ? "_open" : "") + "_unpowered" + return + + if((stat & MAINT) || panel_open) + icon_state = initial(icon_state)+ (open ? "_open" : "") + "_maintenance" + return + + //running and someone in there + if(occupant) + icon_state = initial(icon_state)+ "_occupied" + return + + //running + icon_state = initial(icon_state)+ (open ? "_open" : "") + +/obj/machinery/dna_scannernew/power_change() + ..() + update_icon() + /obj/machinery/dna_scannernew/proc/toggle_open(mob/user=usr) if(!user) return @@ -414,7 +438,7 @@ C.loc = src C.stop_pulling() break - icon_state = initial(icon_state) + (occupant ? "_occupied" : "") + update_icon() // search for ghosts, if the corpse is empty and the scanner is connected to a cloner if(occupant) @@ -451,7 +475,7 @@ occupant.client.eye = occupant occupant.client.perspective = MOB_PERSPECTIVE occupant = null - icon_state = "[initial(icon_state)]_open" + update_icon() return 1 /obj/machinery/dna_scannernew/relaymove(mob/user as mob) @@ -462,7 +486,8 @@ /obj/machinery/dna_scannernew/attackby(obj/item/weapon/grab/G, mob/user) - if(!occupant && default_deconstruction_screwdriver(user, "[initial(icon_state)]_open", "[initial(icon_state)]", G)) + if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, G))//sent icon_state is irrelevant... + update_icon()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed return if(exchange_parts(user, G)) @@ -486,6 +511,8 @@ qdel(G) /obj/machinery/dna_scannernew/attack_hand(mob/user) + if(..()) + return toggle_open(user) add_fingerprint(user) @@ -578,7 +605,7 @@ var/occupant_status = "
Subject Status:
" var/scanner_status var/temp_html - if(connected) + if(connected && connected.is_operational()) if(connected.occupant) //set occupant_status message viable_occupant = connected.occupant if(check_dna_integrity(viable_occupant) && (!(NOCLONE in viable_occupant.mutations) || (connected.scan_level == 3))) //occupent is viable for dna modification diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 0b07f069680..16d32663163 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -77,7 +77,7 @@ point_at(location) if(mode == 2) point_at(target) - usr << "You activate the pinpointer.,/span>" + usr << "You activate the pinpointer." else active = 0 icon_state = "pinoff" @@ -89,6 +89,9 @@ set name = "Toggle Pinpointer Mode" set src in view(1) + if(usr.stat || usr.restrained() || !usr.canmove) + return + active = 0 icon_state = "pinoff" target=null diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index b0e35a07051..0390064db5c 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -33,6 +33,12 @@ datum/objective_item/steal/jetpack targetitem = /obj/item/weapon/tank/jetpack difficulty = 3 +datum/objective_item/steal/defib + name = "a defibrillator" + targetitem = /obj/item/weapon/defibrillator + difficulty = 4 + excludefromjob = list("Chief Medical Officer", "Medical Doctor") + datum/objective_item/steal/magboots name = "the chief engineer's advanced magnetic boots" targetitem = /obj/item/clothing/shoes/magboots/advance diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index f59ff9c6f1e..5bc8aeaa702 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -80,6 +80,9 @@ set category = "Object" set src in oview(1) + if(usr.stat || usr.restrained() || !usr.canmove) + return + if(storedpda) storedpda.loc = get_turf(src.loc) storedpda = null diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index c3f36fd31d5..f046c5a538f 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -11,8 +11,9 @@ icon_state = "sleeper-open" density = 0 anchored = 1 - var/efficiency + interact_offline = 1 state_open = 1 + var/efficiency var/initial_bin_rating = 1 var/min_health = 25 var/list/injection_chems = list() //list of injectable chems except inaprovaline, coz inaprovaline is always avalible @@ -133,11 +134,17 @@ open_machine() /obj/machinery/sleeper/attack_hand(mob/user) - if(stat & (BROKEN|NOPOWER)) + if(..()) + return + + //powerless interaction + if(!is_operational()) + user.unset_machine()//essential to prevent infinite loops of opening/closing the machine if(state_open) close_machine() else open_machine() + else sleeperUI(user) @@ -234,6 +241,8 @@ ..(target) /obj/machinery/sleeper/proc/inject_chem(mob/user, chem) + if(!is_operational()) + return if(occupant && occupant.reagents) if(chem in injection_chems + "inaprovaline") if(occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 401410e2040..9345d395957 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -247,13 +247,13 @@ var/global/list/autolathe_recipes_hidden = list( \ if(istype(template, /obj/item/stack)) src.m_amount -= template.m_amt*multiplier src.g_amount -= template.g_amt*multiplier - var/obj/new_item = new template.type(T) + var/obj/item/new_item = new template.type(T) var/obj/item/stack/S = new_item S.amount = multiplier else src.m_amount -= template.m_amt/coeff src.g_amount -= template.g_amt/coeff - var/obj/new_item = new template.type(T) + var/obj/item/new_item = new template.type(T) new_item.m_amt /= coeff new_item.g_amt /= coeff if(src.m_amount < 0) @@ -287,7 +287,7 @@ var/global/list/autolathe_recipes_hidden = list( \ objs += src.L if(src.hacked) objs += src.LL - for(var/obj/t in objs) + for(var/obj/item/t in objs) if(disabled || m_amount[t]", "The ", "") else diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 5251edb79fe..693363a8577 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -84,7 +84,6 @@ "Waiting for clear path","Calculating navigation path","Pinging beacon network","Unable to reach destination") //This holds text for what the bot is mode doing, reported on the AI's bot control interface. - /obj/machinery/bot/proc/turn_on() if(stat) return 0 on = 1 @@ -98,11 +97,13 @@ /obj/machinery/bot/New() ..() + aibots += src //Global bot list botcard = new /obj/item/weapon/card/id(src) set_custom_texts() Radio = new /obj/item/device/radio(src) Radio.listening = 0 //Makes bot radios transmit only so no one hears things while adjacent to one. + /obj/machinery/bot/proc/add_to_beacons(bot_filter) //Master filter control for bots. Must be placed in the bot's local New() to support map spawned bots. if(radio_controller) radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS) @@ -110,6 +111,7 @@ radio_controller.add_object(src, control_freq, filter = bot_filter) /obj/machinery/bot/proc/explode() + aibots -= src qdel(src) /obj/machinery/bot/proc/healthcheck() @@ -212,7 +214,7 @@ else return 0 -/obj/machinery/bot/process() //Master process which handles code common across most bots. +/obj/machinery/bot/proc/bot_process() //Master process which handles code common across most bots. set background = BACKGROUND_ENABLED @@ -236,34 +238,36 @@ user << "Maintenance panel is now [open ? "opened" : "closed"]." else user << "Maintenance panel is locked." - else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") - if(health < maxhealth) - if(open) - var/obj/item/weapon/weldingtool/WT = W - if(!WT.isOn()) - user << "The welder must be on for this task." - health = min(maxhealth, health+10) - user.visible_message("[user] repairs [src]!","You repair [src]!") - else - user << "Unable to repair with the maintenance panel closed." - else - user << "[src] does not need a repair." else if (istype(W, /obj/item/weapon/card/emag) && emagged < 2) Emag(user) else user.changeNext_move(CLICK_CD_MELEE) - if(W.force) //if force is non-zero - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - switch(W.damtype) - if("fire") - health -= W.force * fire_dam_coeff - s.start() - if("brute") - health -= W.force * brute_dam_coeff - s.start() - ..() - healthcheck() + if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") + if(health >= maxhealth) + user << "[src] does not need a repair." + return + if(!open) + user << "Unable to repair with the maintenance panel closed." + return + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0, user)) + health = min(maxhealth, health+10) + user.visible_message("[user] repairs [src]!","You repair [src]!") + else + 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 + s.set_up(5, 1, src) + switch(W.damtype) + if("fire") + health -= W.force * fire_dam_coeff + s.start() + if("brute") + health -= W.force * brute_dam_coeff + s.start() + ..() + healthcheck() /obj/machinery/bot/bullet_act(var/obj/item/projectile/Proj) diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index 8a3b033d149..0508cfedb88 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -141,7 +141,7 @@ text("[on ? "On" : "Off"]")) if(istype(D, T)) return D -/obj/machinery/bot/cleanbot/process() +/obj/machinery/bot/cleanbot/bot_process() if (!..()) return diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index fd42c38f7b1..489075161f6 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -206,7 +206,7 @@ Auto Patrol[]"}, icon_state = "[lasercolor]ed209[on]" set_weapon() -/obj/machinery/bot/ed209/process() +/obj/machinery/bot/ed209/bot_process() if (!..()) return @@ -351,14 +351,14 @@ Auto Patrol[]"}, last_found = world.time frustration = 0 spawn(0) - process() //ensure bot quickly responds + bot_process() //ensure bot quickly responds /obj/machinery/bot/ed209/proc/back_to_hunt() anchored = 0 frustration = 0 mode = BOT_HUNT spawn(0) - process() //ensure bot quickly responds + bot_process() //ensure bot quickly responds // look for a criminal in view of the bot @@ -387,7 +387,7 @@ Auto Patrol[]"}, visible_message("[src] points at [C.name]!") mode = BOT_HUNT spawn(0) - process() // ensure bot quickly responds to a perp + bot_process() // ensure bot quickly responds to a perp break else continue diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index 889bd774238..ae644a52f42 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -117,6 +117,7 @@ dat += "Make pieces of metal into tiles when empty: [maketiles ? "Yes" : "No"]
" dat += "Transmit notice when empty: [nag_on_empty ? "Yes" : "No"]
" dat += "Repair damaged tiles and platings: [fixfloors ? "Yes" : "No"]
" + dat += "Traction Magnets: [anchored ? "Engaged" : "Disengaged"]
" dat += "Patrol Station: [auto_patrol ? "Yes" : "No"]
" var/bmode if (targetdirection) @@ -181,6 +182,8 @@ autotile = !autotile if("emptynag") nag_on_empty = !nag_on_empty + if("anchor") + anchored = !anchored if("bridgemode") var/setdir = input("Select construction direction:") as null|anything in list("north","east","south","west","disable") @@ -197,7 +200,7 @@ targetdirection = null updateUsrDialog() -/obj/machinery/bot/floorbot/process() +/obj/machinery/bot/floorbot/bot_process() if (!..()) return @@ -230,30 +233,23 @@ else //Find a space tile farther way! target = scan(/turf/space, oldtarget) - anchored = 1 process_type = BRIDGE_MODE - return if(!target) process_type = HULL_BREACH //Ensures the floorbot does not try to "fix" space areas or shuttle docking zones. target = scan(/turf/space, oldtarget) - anchored = 1 //Prevent the floorbot being blown off-course while trying to reach a hull breach. - return 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) - return + target = scan(/turf/simulated/floor, oldtarget) if(!target && fixfloors) //Repairs damaged floors and tiles. process_type = FIX_TILE target = scan(/turf/simulated/floor, oldtarget) - return if(!target && emagged == 2) //We are emagged! Time to rip up the floors! process_type = TILE_EMAG target = scan(/turf/simulated/floor, oldtarget) - return if(!target) @@ -336,9 +332,11 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target) if(HULL_BREACH) //The most common job, patching breaches in the station's hull. if(is_hull_breach(scan_target)) //Ensure that the targeted space turf is actually part of the station, and not random space. result = scan_target + anchored = 1 //Prevent the floorbot being blown off-course while trying to reach a hull breach. if(BRIDGE_MODE) //Only space turfs in our chosen direction are considered. if(get_dir(src, scan_target) == targetdirection) result = scan_target + anchored = 1 if(REPLACE_TILE) F = scan_target if(istype(F, /turf/simulated/floor/plating)) //The floor must not already have a tile. diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 7fe74099a1a..ff55f572225 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -273,7 +273,7 @@ else return -/obj/machinery/bot/medbot/process() +/obj/machinery/bot/medbot/bot_process() if (!..()) return diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index e796be551c6..0c151a22ab0 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -78,9 +78,6 @@ var/global/mulebot_count = 0 name = "\improper Mulebot ([suffix])" - verbs -= /atom/movable/verb/pull - - // attack by item // emag : lock/unlock, @@ -496,7 +493,7 @@ var/global/mulebot_count = 0 pathset = 1 //Indicates the AI's custom path is initialized. start() -/obj/machinery/bot/mulebot/process() +/obj/machinery/bot/mulebot/bot_process() if(!has_power()) on = 0 return diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index 25c76ba6872..25b6073a389 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -189,7 +189,7 @@ Auto Patrol: []"}, declare_arrests = 0 icon_state = "secbot[on]" -/obj/machinery/bot/secbot/process() +/obj/machinery/bot/secbot/bot_process() if (!..()) return @@ -314,14 +314,14 @@ Auto Patrol: []"}, last_found = world.time frustration = 0 spawn(0) - process() //ensure bot quickly responds + bot_process() //ensure bot quickly responds /obj/machinery/bot/secbot/proc/back_to_hunt() anchored = 0 frustration = 0 mode = BOT_HUNT spawn(0) - process() //ensure bot quickly responds + bot_process() //ensure bot quickly responds // look for a criminal in view of the bot /obj/machinery/bot/secbot/proc/look_for_perp() @@ -346,7 +346,7 @@ Auto Patrol: []"}, visible_message("[src] points at [C.name]!") mode = BOT_HUNT spawn(0) - process() // ensure bot quickly responds to a perp + bot_process() // ensure bot quickly responds to a perp break else continue diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index f9c26d959bd..34564627552 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -112,7 +112,7 @@ /obj/machinery/clonepod/attack_paw(mob/user as mob) return attack_hand(user) /obj/machinery/clonepod/attack_hand(mob/user as mob) - if ((isnull(src.occupant)) || (stat & NOPOWER)) + if (isnull(src.occupant) || !is_operational()) return if ((!isnull(src.occupant)) && (src.occupant.stat != 2)) var/completion = (100 * ((src.occupant.health + 100) / (src.heal_level + 100))) @@ -205,7 +205,7 @@ //Grow clones to maturity then kick them out. FREELOADERS /obj/machinery/clonepod/process() - if(stat & NOPOWER) //Autoeject if power is lost + if(!is_operational()) //Autoeject if power is lost if (src.occupant) src.locked = 0 src.go_out() @@ -302,7 +302,7 @@ if(!usr) return - if (usr.stat != 0) + if(usr.stat || !usr.canmove || usr.restrained()) return src.go_out() add_fingerprint(usr) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 6b5ad607a94..e7d1b3e7c67 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -23,8 +23,11 @@ /obj/item/toy/prize/mauler = 1, /obj/item/toy/prize/odysseus = 1, /obj/item/toy/prize/phazon = 1, + /obj/item/toy/prize/reticence = 1, /obj/item/toy/cards/deck = 2, - /obj/item/toy/nuke = 2 + /obj/item/toy/nuke = 2, + /obj/item/toy/minimeteor = 2, + /obj/item/toy/carpplushie = 2 ) /obj/machinery/computer/arcade/New() diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 6fbba86fd4d..5d49b12a1e5 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -54,12 +54,12 @@ // Try to find a scanner in that direction scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) - // If found, then we break, and return the scanner - if (!isnull(scannerf)) - break + // If found and operational, return the scanner + if (!isnull(scannerf) && scannerf.is_operational()) + return scannerf // If no scanner was found, it will return null - return scannerf + return null /obj/machinery/computer/cloning/proc/findcloner() var/obj/machinery/clonepod/podf = null @@ -68,10 +68,10 @@ podf = locate(/obj/machinery/clonepod, get_step(src, dir)) - if (!isnull(podf)) - break + if (!isnull(podf) && podf.is_operational()) + return podf - return podf + return null /obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES @@ -233,25 +233,25 @@ if("stopautoprocess") autoprocess = 0 - else if ((href_list["scan"]) && (!isnull(src.scanner))) + else if ((href_list["scan"]) && !isnull(scanner) && scanner.is_operational()) scantemp = "" loading = 1 src.updateUsrDialog() spawn(20) - src.scan_mob(src.scanner.occupant) + src.scan_mob(scanner.occupant) loading = 0 src.updateUsrDialog() //No locking an open scanner. - else if ((href_list["lock"]) && (!isnull(src.scanner))) - if ((!src.scanner.locked) && (src.scanner.occupant)) - src.scanner.locked = 1 + else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational()) + if ((!scanner.locked) && (scanner.occupant)) + scanner.locked = 1 else - src.scanner.locked = 0 + scanner.locked = 0 else if(href_list["view_rec"]) src.active_record = find_record("id", href_list["view_rec"], records) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index ab3182f0219..bface7aae31 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -268,6 +268,7 @@ src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src) else if (href_list["del_all2"]) + investigate_log("[usr.name] ([usr.key]) has deleted all medical records.", "records") data_core.medical.Cut() src.temp = "All records deleted." @@ -415,6 +416,7 @@ src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
", src, src) else if (href_list["del_r2"]) + investigate_log("[usr.name] ([usr.key]) has deleted the medical records for [active1.fields["name"]].", "records") if(active2) data_core.medical -= active2 active2 = null diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 04226b689d2..0790775530f 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -114,8 +114,10 @@ else dat += "
[++i]. View Message Logs
" dat += "
[++i]. View Request Console Logs
" + dat += "
[++i]. View Chatroom Logs
" dat += "
[++i]. Clear Message Logs
" dat += "
[++i]. Clear Request Console Logs
" + dat += "
[++i]. Clear Chatroom Logs
" dat += "
[++i]. Set Custom Key
" dat += "
[++i]. Send Admin Message
" else @@ -236,6 +238,24 @@ [rc.rec_dpt][rc.message][rc.stamp][rc.id_auth][rc.priority]"} dat += "" + //Chatroom Logs + if(5) + + var/index = 0 + //var/sender = "Anon" + //var/channel = "ss13" + //var/message = "Blank" + dat += "
Back - Refresh

" + dat += "" + for(var/datum/data_chat_msg/msg in src.linkedServer.chat_msgs) + index++ + if(index > 3000) + break + // Del - Channel - Sender - Message + // X - #ss13 - bigdik - hi asl + dat += "" + dat += "
XChannelNickMessage
X
[msg.channel][msg.sender][msg.message]
" + message = defaultmsg //user << browse(dat, "window=message;size=700x700") //onclose(user, "message") @@ -321,6 +341,14 @@ if(auth) src.linkedServer.rc_msgs = list() message = "NOTICE: Logs cleared." + //Clears the chatroom logs - KEY REQUIRED + if (href_list["clearc"]) + if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.linkedServer.chat_msgs = list() + message = "NOTICE: Logs cleared." //Change the password - KEY REQUIRED if (href_list["pass"]) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) @@ -464,6 +492,13 @@ else if(auth) src.screen = 4 + //Chatroom Logs - KEY REQUIRED + if(href_list["viewc"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.screen = 5 //usr << href_list["select"] diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index ad296e20065..3372945212b 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -122,7 +122,7 @@ for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order)) var/crimstat = "" for(var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) + if ((E.fields["name"] == R.fields["name"]) && (E.fields["id"] == R.fields["id"])) crimstat = E.fields["criminal"] var/background switch(crimstat) @@ -413,8 +413,10 @@ What a mess.*/ temp += "
No" if ("Purge All Records") + investigate_log("[usr.name] ([usr.key]) has purged all the security records.", "records") for(var/datum/data/record/R in data_core.security) del(R) + data_core.security.Cut() temp = "All Security records deleted." if ("Add Entry") @@ -460,6 +462,7 @@ What a mess.*/ screen = 3 if ("New Record (General)") + //General Record var/datum/data/record/G = new /datum/data/record() G.fields["name"] = "New Record" G.fields["id"] = "[num2hex(rand(1, 1.6777215E7), 6)]" @@ -472,6 +475,7 @@ What a mess.*/ data_core.general += G active1 = G + //Security Record var/datum/data/record/R = new /datum/data/record() R.fields["name"] = active1.fields["name"] R.fields["id"] = active1.fields["id"] @@ -483,7 +487,7 @@ What a mess.*/ data_core.security += R active2 = R - //Medical Record + //Medical Record var/datum/data/record/M = new /datum/data/record() M.fields["id"] = active1.fields["id"] M.fields["name"] = active1.fields["name"] @@ -506,13 +510,17 @@ What a mess.*/ if ("Edit Field") var/a1 = active1 var/a2 = active2 + switch(href_list["field"]) if("name") - if (istype(active1, /datum/data/record)) + if (istype(active1, /datum/data/record) || istype(active2, /datum/data/record)) var/t1 = input("Please input name:", "Secure. records", active1.fields["name"], null) as text if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1) return - active1.fields["name"] = t1 + if(istype(active1, /datum/data/record)) + active1.fields["name"] = t1 + if(istype(active2, /datum/data/record)) + active2.fields["name"] = t1 if("id") if(istype(active2,/datum/data/record) || istype(active1,/datum/data/record)) var/t1 = copytext(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text),1,MAX_MESSAGE_LEN) @@ -607,6 +615,7 @@ What a mess.*/ if ("Change Criminal Status") if (active2) + var/old_field = active2.fields["criminal"] switch(href_list["criminal2"]) if("none") active2.fields["criminal"] = "None" @@ -618,19 +627,27 @@ What a mess.*/ active2.fields["criminal"] = "Parolled" if("released") active2.fields["criminal"] = "Discharged" + investigate_log("[active1.fields["name"]] has been set from [old_field] to [active2.fields["criminal"]] by [usr.name] ([usr.key]).", "records") if ("Delete Record (Security) Execute") + investigate_log("[usr.name] ([usr.key]) has deleted the security records for [active1.fields["name"]].", "records") if (active2) + data_core.security -= active2 del(active2) if ("Delete Record (ALL) Execute") if (active1) + investigate_log("[usr.name] ([usr.key]) has deleted all records for [active1.fields["name"]].", "records") for(var/datum/data/record/R in data_core.medical) if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) + data_core.medical -= R del(R) - else + break + data_core.general -= active1 del(active1) + if (active2) + data_core.security -= active2 del(active2) else temp = "This function does not appear to be working at the moment. Our apologies." diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index e5acc1ea5af..4ea9ea6993d 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -4,6 +4,7 @@ icon_state = "cell-off" density = 1 anchored = 1.0 + interact_offline = 1 layer = 4 var/on = 0 @@ -45,7 +46,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/process() ..() - if(!node) + if(!node || !is_operational()) return if(!on) updateDialog() @@ -97,11 +98,17 @@ user << "Seems empty." /obj/machinery/atmospherics/unary/cryo_cell/attack_hand(mob/user) - if(stat & (NOPOWER|BROKEN)) - if(state_open == 1) + if(..()) + return + + //powerless interaction + if(!is_operational()) + user.unset_machine()//essential to prevent infinite loops of opening/closing the machine + if(state_open) close_machine() else open_machine() + else ui_interact(user) @@ -258,7 +265,7 @@ if(state_open) icon_state = "cell-open" return - if(on) + if(on && is_operational()) if(occupant) icon_state = "cell-occupied" else @@ -266,6 +273,9 @@ else icon_state = "cell-off" +/obj/machinery/atmospherics/unary/cryo_cell/power_change() + ..() + update_icon() /obj/machinery/atmospherics/unary/cryo_cell/proc/process_occupant() if(air_contents.total_moles() < 10) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 0a642258374..62c86d3a5ad 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -245,7 +245,7 @@ name = "bananium airlock" desc = "Honkhonkhonk" icon = 'icons/obj/doors/Doorbananium.dmi' - var/mineral = "clown" + var/mineral = "bananium" doortype = /obj/structure/door_assembly/door_assembly_clown /obj/machinery/door/airlock/sandstone diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 910feb64a41..7e3d588f5f5 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -38,7 +38,7 @@ var/list/doppler_arrays = list() if(!usr || !isturf(usr.loc)) return - if(usr.stat || usr.restrained()) + if(usr.stat || usr.restrained() || !usr.canmove) return src.dir = turn(src.dir, 90) return diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 44be02fadac..3e1b2cc3ca2 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -84,6 +84,8 @@ Class Procs: process() 'game/machinery/machine.dm' Called by the 'master_controller' once per game tick for each machine that is listed in the 'machines' list. + is_operational() + Returns 0 if the machine is unpowered, broken or undergoing maintenance, 1 if not Compiled by Aygar */ @@ -209,6 +211,11 @@ Class Procs: add_fingerprint(usr) return 0 +/obj/machinery/proc/is_operational() + return !(stat & (NOPOWER|BROKEN|MAINT)) + +//////////////////////////////////////////////////////////////////////////////////////////// + /mob/proc/canUseTopic() //TODO: once finished, place these procs on the respective mob files return @@ -302,7 +309,7 @@ Class Procs: var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) M.state = 2 M.icon_state = "box_1" - for(var/obj/I in component_parts) + for(var/obj/item/I in component_parts) if(I.reliability != 100 && crit_fail) I.crit_fail = 1 I.loc = src.loc diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 14d7ba74d1e..0f77735ac02 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -2,6 +2,11 @@ //################### NEWSCASTERS BE HERE! #### //###-Agouri################################### +/datum/feed_comment + var/author = "" + var/body = "" + var/time_stamp = "" + /datum/feed_message var/author ="" var/body ="" @@ -11,6 +16,9 @@ var/is_admin_message = 0 var/icon/img = null var/time_stamp = "" + var/list/datum/feed_comment/comments = list() + var/locked = 0 + var/caption = "" /datum/feed_channel var/channel_name="" @@ -29,6 +37,7 @@ src.backup_body = "" src.backup_author = "" src.img = null + src.locked = 0 /datum/feed_channel/proc/clear() src.channel_name = "" @@ -54,14 +63,16 @@ newChannel.is_admin_channel = adminChannel network_channels += newChannel -/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0) +/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/allow_comments = 1) var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = author newMsg.body = msg newMsg.time_stamp = "[worldtime2text()]" newMsg.is_admin_message = adminMessage + newMsg.locked = !allow_comments if(photo) newMsg.img = photo.img + newMsg.caption = photo.scribble for(var/datum/feed_channel/FC in network_channels) if(FC.channel_name == channel_name) FC.messages += newMsg //Adding message to the network's appropriate feed_channel @@ -151,6 +162,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/c_locked=0; //Will our new channel be locked to public submissions? var/hitstaken = 0 //Death at 3 hits from an item with force>=15 var/datum/feed_channel/viewing_channel = null + var/allow_comments = 1 luminosity = 0 anchored = 1 @@ -293,6 +305,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="Message Author: [src.scanned_user]
" dat+="Message Body: [src.msg]
" dat+="Attach Photo: [(src.photo ? "Photo Attached" : "No Photo")]
" + dat+="Comments [allow_comments ? "Enabled" : "Disabled"]
" dat+="
Submit

Cancel
" if(4) dat+="Feed story successfully submitted to [src.channel_name].

" @@ -362,8 +375,18 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="-[MESSAGE.body]
" if(MESSAGE.img) usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") - dat+="

" + dat+="
" + if(MESSAGE.caption) + dat+="[MESSAGE.caption]
" + dat+="
" dat+="\[Story by [MESSAGE.author] \] - ([MESSAGE.time_stamp])
" + dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]
" + for(var/datum/feed_comment/comment in MESSAGE.comments) + dat+="[comment.body]
[comment.author] [comment.time_stamp]
" + if(MESSAGE.locked) + dat+="Comments locked
" + else + dat+="Comment
" dat+="

Refresh" dat+="
Back" if(10) @@ -400,6 +423,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
" dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
" + dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]: [MESSAGE.locked ? "Unlock" : "Lock"]
" + for(var/datum/feed_comment/comment in MESSAGE.comments) + dat+="[comment.body] X
[comment.author] [comment.time_stamp]
" dat+="
Back" if(13) dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \]
" @@ -550,7 +576,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" ) src.screen=6 else - news_network.SubmitArticle(msg, scanned_user, channel_name, photo) + news_network.SubmitArticle(msg, scanned_user, channel_name, photo, allow_comments) feedback_inc("newscaster_stories",1) src.screen=4 src.updateUsrDialog() @@ -728,6 +754,34 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.screen = 12 src.updateUsrDialog() + else if(href_list["new_comment"]) + var/datum/feed_message/FM = locate(href_list["new_comment"]) + var/cominput = copytext(stripped_input(usr, "Write your message:", "New comment", null),1,141) + if(cominput) + var/datum/feed_comment/FC = new/datum/feed_comment + FC.author = scanned_user + FC.body = cominput + FC.time_stamp = worldtime2text() + FM.comments += FC + log_comment("[usr]/([usr.ckey]) as [scanned_user] commented on message [FM.body] -- [FC.body]") + updateUsrDialog() + + else if(href_list["del_comment"]) + var/datum/feed_comment/FC = locate(href_list["del_comment"]) + var/datum/feed_message/FM = locate(href_list["del_comment_msg"]) + FM.comments -= FC + qdel(FC) + updateUsrDialog() + + else if(href_list["lock_comment"]) + var/datum/feed_message/FM = locate(href_list["lock_comment"]) + FM.locked ^= 1 + updateUsrDialog() + + else if(href_list["set_comment"]) + allow_comments ^= 1 + updateUsrDialog() + else if(href_list["refresh"]) src.updateUsrDialog() diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 7120b1d1550..6f4a0e8cb25 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -155,7 +155,7 @@ Buildable meters set name = "Rotate Pipe" set src in view(1) - if ( usr.stat || usr.restrained() ) + if ( usr.stat || usr.restrained() || !usr.canmove ) return src.dir = turn(src.dir, -90) @@ -169,7 +169,7 @@ Buildable meters set name = "Flip Pipe" set src in view(1) - if ( usr.stat || usr.restrained() ) + if ( usr.stat || usr.restrained() || !usr.canmove ) return if (pipe_type in list(PIPE_GAS_FILTER, PIPE_GAS_MIXER)) diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index f3d1796d3a2..bfb60668ac4 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -65,7 +65,7 @@ // Drop all the component stuff if(component_parts) - for(var/obj/I in component_parts) + for(var/obj/item/I in component_parts) if(I.reliability != 100 && crit_fail) I.crit_fail = 1 I.loc = src.loc diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index a5342f470df..3427f8a655d 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -648,9 +648,16 @@ product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs." vend_delay = 34 icon_state = "cigs" - products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4,/obj/item/weapon/storage/fancy/rollingpapers = 5) + products = list(/obj/item/weapon/storage/fancy/cigarettes = 5, + /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, + /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, + /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, + /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, + /obj/item/weapon/storage/box/matches = 10, + /obj/item/weapon/lighter/random = 4, + /obj/item/weapon/storage/fancy/rollingpapers = 5) contraband = list(/obj/item/weapon/lighter/zippo = 4) - premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2) + premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robustgold = 1) refill_canister = /obj/item/weapon/vending_refill/cigarette diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index fcd17eea035..1a45add5d88 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -28,6 +28,9 @@ set category = "Object" set src in oview(1) + if(usr.stat || usr.restrained() || !usr.canmove) + return + if( state != 4 ) usr << "The washing machine cannot run in this state." return diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 65b49cca717..b1e60d07b28 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -4,7 +4,6 @@ var/melee_can_hit = 1 var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall) internal_damage_threshold = 50 - maint_access = 0 damage_absorption = list("brute"=0.7,"fire"=1,"bullet"=0.7,"laser"=0.85,"energy"=1,"bomb"=0.8) var/am = "d3c2fbcadca903a41161ccc9df9cf948" diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 66a5036a9a7..3a49c11433a 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -38,7 +38,7 @@ set name = "Toggle defence mode" set src = usr.loc set popup_menu = 0 - if(usr!=src.occupant) + if(!can_use(usr)) return defence = !defence if(defence) diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 79ae3333d63..722b576f134 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -56,7 +56,7 @@ set name = "Toggle leg actuators overload" set src = usr.loc set popup_menu = 0 - if(usr!=src.occupant) + if(!can_use(usr)) return if(overload) overload = 0 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 829f3c94ec1..c9edcc339b0 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -32,7 +32,7 @@ var/list/log = new var/last_message = 0 var/add_req_access = 1 - var/maint_access = 1 + var/maint_access = 0 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 @@ -85,7 +85,6 @@ add_cell() add_iterators() removeVerb(/obj/mecha/verb/disconnect_from_port) - removeVerb(/atom/movable/verb/pull) log_message("[src.name] created.") mechas_list += src //global mech list return @@ -201,6 +200,13 @@ return 1 +obj/mecha/proc/can_use(mob/user) + if(user != src.occupant) + return 0 + if(user && ismob(user)) + if(!usr.stat && !usr.restrained() && usr.canmove) + return 1 + return 0 /obj/mecha/examine(mob/user) ..() @@ -523,8 +529,8 @@ src.visible_message("The [A] fastens firmly to [src].") return if(prob(src.deflect_chance) || istype(A, /mob)) - src.occupant_message("The [A] bounces off the armor.") - src.visible_message("The [A] bounces off the [src.name] armor") + src.occupant_message("[A] bounces off the armor.") + src.visible_message("[A] bounces off the [src.name] armor") src.log_append_to_last("Armor saved.") if(istype(A, /mob/living)) var/mob/living/M = A @@ -673,7 +679,7 @@ return if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(add_req_access || maint_access) - if(internals_access_allowed(usr)) + if(internals_access_allowed(user)) var/obj/item/weapon/card/id/id_card if(istype(W, /obj/item/weapon/card/id)) id_card = W @@ -683,9 +689,9 @@ output_maintenance_dialog(id_card, user) return else - user << "Invalid ID: Access denied." + user << "Invalid ID: Access denied." else - user << "Maintenance protocols disabled by operator." + user << "Maintenance protocols disabled by operator." else if(istype(W, /obj/item/weapon/wrench)) if(state==1) state = 2 @@ -741,19 +747,22 @@ return else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") + user.changeNext_move(CLICK_CD_MELEE) var/obj/item/weapon/weldingtool/WT = W - if (WT.remove_fuel(0,user)) - if (hasInternalDamage(MECHA_INT_TANK_BREACH)) - clearInternalDamage(MECHA_INT_TANK_BREACH) - user << "You repair the damaged gas tank." - else - return if(src.healthYou repair some damage to [src.name]." - src.health += min(10, initial(src.health)-src.health) + if (WT.remove_fuel(0,user)) + if (hasInternalDamage(MECHA_INT_TANK_BREACH)) + clearInternalDamage(MECHA_INT_TANK_BREACH) + user << "You repair the damaged gas tank." + else + user.visible_message("[user] repairs some damage to [src.name].") + src.health += min(10, initial(src.health)-src.health) + else + user << "The welder must be on for this task." + return 1 else - user << "The [src.name] is at full integrity" - return + user << "The [src.name] is at full integrity." + return 1 else if(istype(W, /obj/item/mecha_parts/mecha_tracking)) if(!user.unEquip(W)) @@ -869,8 +878,8 @@ set src = usr.loc set popup_menu = 0 - if(usr.stat) return - if(usr != src.occupant) return + if(!can_use(usr)) + return var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc if(possible_port) @@ -892,8 +901,8 @@ set src = usr.loc set popup_menu = 0 - if(usr.stat) return - if(usr != src.occupant) return + if(!can_use(usr)) + return if(disconnect()) src.occupant_message("[name] disconnects from the port.") @@ -908,8 +917,8 @@ set src = usr.loc set popup_menu = 0 - if(usr.stat) return - if(usr != occupant) return + if(!can_use(usr)) + return lights = !lights if(lights) AddLuminosity(lights_power) @@ -925,8 +934,8 @@ set src = usr.loc set popup_menu = 0 - if(usr.stat) return - if(usr != src.occupant) return + if(!can_use(usr)) + return use_internal_tank = !use_internal_tank src.occupant_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].") @@ -1014,7 +1023,7 @@ //Added a message here since people assume their first click failed or something./N // user << "Installing MMI, please stand by." - visible_message("[usr] starts to insert an MMI into [src.name]") + visible_message("[user] starts to insert an MMI into [src.name]") if(enter_after(40,user)) if(!occupant) @@ -1062,7 +1071,8 @@ set category = "Exosuit Interface" set src = usr.loc set popup_menu = 0 - if(usr!=src.occupant) + + if(!can_use(usr)) return //pr_update_stats.start() src.occupant << browse(src.get_stats_html(), "window=exosuit") @@ -1083,7 +1093,8 @@ set src = usr.loc set popup_menu = 0 - if(usr != src.occupant) return + if(!can_use(usr)) + return src.go_out() add_fingerprint(usr) @@ -1153,39 +1164,15 @@ ////// Access stuff ///// ///////////////////////// -/obj/mecha/proc/operation_allowed(mob/living/carbon/human/H) - for(var/ID in list(H.get_active_hand(), H.wear_id, H.belt)) - if(src.check_access(ID,src.operation_req_access)) - return 1 - return 0 +/obj/mecha/proc/operation_allowed(mob/M) + req_access = operation_req_access + req_one_access = list() + return allowed(M) - -/obj/mecha/proc/internals_access_allowed(mob/living/carbon/human/H) - for(var/atom/ID in list(H.get_active_hand(), H.wear_id, H.belt)) - if(src.check_access(ID,src.internals_req_access)) - return 1 - return 0 - - -/obj/mecha/check_access(obj/item/weapon/card/id/I, list/access_list) - if(!istype(access_list)) - return 1 - if(!access_list.len) //no requirements - return 1 - if(istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/pda = I - I = pda.id - if(!istype(I) || !I.access) //not ID or no access - return 0 - if(access_list==src.operation_req_access) - for(var/req in access_list) - if(!(req in I.access)) //doesn't have this access - return 0 - else if(access_list==src.internals_req_access) - for(var/req in access_list) - if(req in I.access) - return 1 - return 1 +/obj/mecha/proc/internals_access_allowed(mob/M) + req_one_access = internals_req_access + req_access = list() + return allowed(M) //////////////////////////////////// @@ -1423,6 +1410,8 @@ var/year_integer = text2num(year) // = 2013??? /obj/mecha/Topic(href, href_list) ..() + if(!usr.canUseTopic(src)) + return if(href_list["update_content"]) if(usr != src.occupant) return send_byjax(src.occupant,"exosuit.browser","content",src.get_stats_part()) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 8e79d87bb6b..949d04d20ad 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -140,4 +140,10 @@ /obj/effect/glowshroom/proc/CheckEndurance() if(endurance <= 0) - qdel(src) \ No newline at end of file + qdel(src) + +/obj/effect/glowshroom/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) + visible_message("[src] melts away!") + var/obj/effect/decal/cleanable/molten_item/I = new (get_turf(src)) + I.desc = "Looks like this was \an [src] some time ago." + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 14391a20387..be405a167fb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -28,13 +28,18 @@ var/permeability_coefficient = 1 // for chemicals/diseases var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit) var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up - var/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + var/list/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) var/list/allowed = null //suit storage stuff. var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. var/reflect_chance = 0 //This var dictates what % of a time an object will reflect an energy based weapon's shot var/strip_delay = 40 var/put_on_delay = 20 + var/m_amt = 0 // metal + var/g_amt = 0 // glass + var/reliability = 100 //Used by SOME devices to determine how reliable they are. + var/origin_tech = null //Used by R&D to determine what research bonuses it grants. + var/list/attack_verb = list() //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" var/list/species_exception = list() // even if a species cannot put items in a certain slot, if the species id is in the item's exception list, it will be able to wear that item /obj/item/device @@ -80,7 +85,7 @@ set category = "Object" set src in oview(1) - if(!istype(src.loc, /turf) || usr.stat || usr.restrained() ) + if(!istype(src.loc, /turf) || usr.stat || usr.restrained() || !usr.canmove) return var/turf/T = src.loc @@ -379,6 +384,26 @@ /obj/item/singularity_pull(S, current_size) spawn(0) //this is needed or multiple items will be thrown sequentially and not simultaneously - if(current_size >= 7) + if(current_size >= STAGE_FOUR) throw_at(S,14,3) - else ..() \ No newline at end of file + else ..() + +/obj/item/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) + . = 1 + for(var/V in armor) + if(armor[V] > 0) + .-- //it survives the acid... + break + if(.) + var/turf/T = get_turf(src) + T.visible_message("[src] melts away!") + var/obj/effect/decal/cleanable/molten_item/I = new (get_turf(src)) + I.pixel_x = rand(1,16) + I.pixel_y = rand(1,16) + I.desc = "Looks like this was \an [src] some time ago." + qdel(src) + else + for(var/armour_value in armor) //but is weakened + armor[armour_value] = max(armor[armour_value]-acidpwr,0) + if(!findtext(desc, "it looks slightly melted...")) //it looks slightly melted... it looks slightly melted... it looks slightly melted... etc. + desc += " it looks slightly melted..." //needs a space at the start, formatting diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 89021490262..ac5181f751f 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -44,6 +44,12 @@ var/global/list/obj/item/device/pda/PDAs = list() var/obj/item/device/paicard/pai = null // A slot for a personal AI device + var/chat_channel = "#ss13" //name of our current NTRC channel + var/nick = "" //our NTRC nick + var/list/ntrclog = list() //NTRC message log + + var/noreturn = 0 //whether the PDA can use the Return button, used for the aiPDA chatroom + /obj/item/device/pda/medical default_cartridge = /obj/item/weapon/cartridge/medical icon_state = "pda-medical" @@ -186,13 +192,15 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/ai icon_state = "NONE" ttone = "data" + mode = 5 + noreturn = 1 detonate = 0 /obj/item/device/pda/ai/attack_self(mob/user as mob) if ((honkamt > 0) && (prob(60)))//For clown virus. honkamt-- playsound(loc, 'sound/items/bikehorn.ogg', 30, 1) - return + ..() /obj/item/device/pda/ai/pai ttone = "assist" @@ -257,7 +265,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if ((!isnull(cartridge)) && (mode == 0)) dat += " | Eject [cartridge]" - if (mode) + if (mode && !noreturn) dat += " | Return" dat += " | Refresh" @@ -283,7 +291,7 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "
    " dat += "
  • Notekeeper
  • " dat += "
  • Messenger
  • " - //dat += "
  • Nanotrasen Relay Chat
  • " + dat += "
  • Nanotrasen Relay Chat
  • " if (cartridge) if (cartridge.access_clown) @@ -433,16 +441,18 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "
    " if (5) - dat += "

    Nanotrasen Relay Chat

    " - - dat += "

    Detected Channels

    :
  • " - for(var/datum/chatroom/C in chatrooms) - dat += "#[html_encode(lowertext(C.name))]" - if(C.password != "") - dat += " " - dat += "
  • " - + if(!nick) //first time join + nick = copytext(sanitize(owner), 1, 9) + var/datum/chatroom/C = chatchannels[chat_channel] + C.parse_msg(src, nick, "/join [chat_channel]") + dat += "

    SS13 Nanotrasen Relay Chat Network

    " + dat += "
    [nick] | " + dat += "[chat_channel] | " + dat += "Write message | " + dat += "Help
    " + if(chat_channel) + dat += ntrclog[chat_channel] else//Else it links to the cart menu proc. Although, it really uses menu hub 4--menu 4 doesn't really exist as it simply redirects to hub. dat += cart @@ -510,7 +520,7 @@ var/global/list/obj/item/device/pda/PDAs = list() mode = 3 if("4")//Redirects to hub mode = 0 - if("chatroom") // chatroom hub + if("5")//Chatroom mode = 5 @@ -615,6 +625,53 @@ var/global/list/obj/item/device/pda/PDAs = list() return +//CHATROOM FUNCTIONS==================================== + + if("Set Nick") + var/t = stripped_input(U, "Please enter nickname", name, null) as text + nick = copytext(sanitize(t), 1, 9) + + if("Set Channel") + var/t = stripped_input(U, "Please enter channel", name, (chat_channel)) as text + + if(t) + ntrclog[chat_channel] = "
    " + ntrclog[chat_channel] + var/datum/chatroom/C = chatchannels[chat_channel] + if(!findtext(t,"#",1,2)) + t = "#" + t + chat_channel = t + C.parse_msg(src, nick, "/join [chat_channel]") + + if("NTRC Message") + var/t = msg_input(U) as text + var/datum/chatroom/C = chatchannels[chat_channel] + if(C) + var/lt = text2list(t, " ") + if(lt[1] == "/join") + if(!findtext(lt[2],"#",1,2)) + lt[2] = "#" + lt[2] + var/ret = C.parse_msg(src,nick,t) + if(findtextEx(ret,"ERR_",1,5)) + ntrclog[chat_channel] = "[ret]
    " + ntrclog[chat_channel] + else + if(ret == 0) + ntrclog[chat_channel] = "Failure
    " + ntrclog[chat_channel] + else + if(lt[1] == "/join") + chat_channel = lt[2] + + if("NTRC Help") + var/helptext = "NTRC reference:

    " + helptext += "General commands
    " + helptext += "/join #channel
    /part
    /log amountoflines
    /who
    /topic
    /register

    " + helptext += "Moderation commands
    " + helptext += "/ban targetnick
    /unban targetnick
    /kick targetnick
    /mute targetnick

    " + helptext += "Management commands
    " + helptext += "/topic topictext
    /op targetnick
    /deop targetnick
    /delchannel" + usr << browse(helptext, "window=ntrchelp;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0") + + + //SYNDICATE FUNCTIONS=================================== if("Toggle Door") @@ -675,8 +732,9 @@ var/global/list/obj/item/device/pda/PDAs = list() else//Cartridge menu linking mode = text2num(href_list["choice"]) - cartridge.mode = mode - cartridge.unlock() + if(cartridge) + cartridge.mode = mode + cartridge.unlock() else//If not in range, can't interact or not using the pda. U.unset_machine() U << browse(null, "window=pda") @@ -708,40 +766,39 @@ var/global/list/obj/item/device/pda/PDAs = list() id.loc = get_turf(src) id = null -/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P) - +/obj/item/device/pda/proc/msg_input(var/mob/living/U = usr) var/t = input(U, "Please enter message", name, null) as text t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) - if (!t || !istype(P)) + if (!t || toff) return if (!in_range(src, U) && loc != U) return - - if (isnull(P)||P.toff || toff) + if(!can_use(U)) return + if(emped) + t = Gibberish(t, 100) + return t + +/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P) + + var/t = msg_input(U) if (last_text && world.time < last_text + 5) return - if(!can_use(U)) + if (isnull(P) || P.toff || !istype(P)) return last_text = world.time - // check if telecomms I/O route 1459 is stable - //var/telecomms_intact = telecomms_process(P.owner, owner, t) var/obj/machinery/message_server/useMS = null if(message_servers) for (var/obj/machinery/message_server/MS in message_servers) //PDAs are now dependant on the Message Server. if(MS.active) useMS = MS - break var/datum/signal/signal = src.telecomms_process() - if(emped) - t = Gibberish(t, 100) - var/useTC = 0 if(signal) if(signal.data["done"]) @@ -763,7 +820,8 @@ var/global/list/obj/item/device/pda/PDAs = list() P.tnote += "← From [owner] ([ownjob]):
    [t]
    " if (!P.silent) - P.loc.audible_message("\icon[P] *[P.ttone]*", null, 3) + playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1) + P.loc.audible_message("\icon[P] *[P.ttone]*", null, 3) //Search for holder of the PDA. var/mob/living/L = null if(P.loc && isliving(P.loc)) @@ -781,7 +839,6 @@ var/global/list/obj/item/device/pda/PDAs = list() else U << "ERROR: Server isn't responding." - /obj/item/device/pda/verb/verb_remove_id() set category = "Object" set name = "Remove id" @@ -1044,6 +1101,18 @@ var/global/list/obj/item/device/pda/PDAs = list() else usr << "You do not have a PDA. You should make an issue report about this." +/mob/living/silicon/ai/verb/cmd_use_chatroom() + set category = "AI Commands" + set name = "PDA - Chatrooms" + if(usr.stat == 2) + usr << "You can't do that because you are dead!" + return + if(!isnull(aiPDA)) + aiPDA.mode = 5 + aiPDA.attack_self(src) + else + usr << "You do not have a PDA. You should make an issue report about this." + /mob/living/silicon/ai/proc/cmd_show_message_log(mob/user as mob) if(user.stat == 2) user << "You can't do that because you are dead!" @@ -1084,10 +1153,21 @@ var/global/list/obj/item/device/pda/PDAs = list() spawn(200 * severity) emped -= 1 +//ntrc handler proc +/obj/item/device/pda/proc/msg_chat(channel as text, sender as text, message as text) + var/msg = "[strip_html_properly(sender)]| [strip_html_properly(message)]
    " + if(!channel) + for(var/C in ntrclog) + ntrclog[C] = msg + ntrclog[C] + else + ntrclog[channel] = msg + ntrclog[channel] + if (!silent) + loc.audible_message("\icon[src] *[ttone]*", null, 3) + /proc/get_viewable_pdas() . = list() // Returns a list of PDAs which can be viewed from another PDA/message monitor. for(var/obj/item/device/pda/P in PDAs) if(!P.owner || P.toff || P.hidden) continue . += P - return . + return . diff --git a/code/game/objects/items/devices/PDA/chatroom.dm b/code/game/objects/items/devices/PDA/chatroom.dm index 007d3892c20..1ba6a4c5813 100644 --- a/code/game/objects/items/devices/PDA/chatroom.dm +++ b/code/game/objects/items/devices/PDA/chatroom.dm @@ -1,16 +1,212 @@ -var/list/chatrooms = list() +var/datum/chatroom/default_ntrc_chatroom = new("") +var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom) + +//procs that can be used directly: +//channel.parse_msg /datum/chatroom - var/name = "Generic Chatroom" - var/list/logged_in = list() + var/name = "#ss13" + var/topic = "Welcome to the best NTRC channel in this sector of the galaxy!" // topic message for the chatroom + var/list/operators = list() // chat operators var/list/logs = list() // chat logs + var/list/muted = list() // muted users var/list/banned = list() // banned users - var/list/whitelist = list() // whitelisted users - var/list/muted = list() - var/topic = "" // topic message for the chatroom - var/password = "" // blank for no password. - var/operator = "" // name of the operator + var/list/auth = list() // authenticated clients + var/list/users = list() // current users + var/datum/events/events = new () + var/list/datum/event/evlist = list() -/datum/chatroom/proc/attempt_connect(var/obj/item/device/pda/device, var/obj/password) - if(!device) - return +//parse_msg() is the exposed interface chat +//clients should interact with parse_msg() and parse_msg() only + +/datum/chatroom/proc/parse_msg(client,nick,message) + var/obj/machinery/message_server/MS = check_server(client) + if(!MS) + return "ERR_TCOM" + + if(!nick || length(nick) > 8) + return "ERR_NICK" + + MS.send_chat_message(nick,name,message) + + if(findtext(message,"/",1,2)) + return handle_command(client,nick,copytext(message,2)) + + else + return send_message(client,nick,message) + +//the following are for internal use only + +/datum/chatroom/proc/check_server(client) + var/atom/C = client + var/turf/CT = get_turf(C) + if(message_servers) + for (var/obj/machinery/message_server/MS in message_servers) + var/turf/T = get_turf(MS) + if(MS.active && (T.z == CT.z)) + return MS + return 0 + +/datum/chatroom/proc/handle_command(client,nick,command) //command parser + var/list/cmd=text2list(command, " ") + + if(!get_auth(client,nick)) + return "ERR_AUTH" + + switch(cmd[1]) //argument-less commmands + if("topic") + if(cmd.len == 1) + return get_topic(client) + else + return set_topic(client,nick,cmd[2]) + if("part") + return channel_part(client,nick) + if("delchannel") + return delete_channel(client,nick) + if("who") + return get_who(client, nick) + if("register") + return register_auth(client,nick) + + if(cmd.len == 1) + return "ERR_ARGS" + + switch(cmd[1]) //commands with 1 arg + if("join") + return channel_join(client,nick,cmd[2]) + if("log") + return get_log(client,nick,cmd[2]) + if("op") + return make_op(client,nick,cmd[2]) + if("deop") + return deop(client,nick,cmd[2]) + if("ban") + return ban(client,nick,cmd[2]) + if("unban") + return unban(client,nick,cmd[2]) + if("kick") + return kick(client,nick,cmd[2]) + if("mute") + return mute_nick(client,nick,cmd[2]) + + return "ERR_WCMD" + +/datum/chatroom/proc/send_message(client,nick,message) //standard message + if(nick in muted) + return "ERR_MUTE" + if(!message) + return "ERR_BLNK" + logs += "[strip_html_properly(nick)]> [strip_html_properly(message)]" + log_chat("[usr]/([usr.ckey]) as [nick] sent to [name]: [message]") + events.fireEvent("msg_chat",name,nick,message) + return 1 + +/datum/chatroom/proc/get_auth(client,nick) //check auth + if((!(nick in auth)) || (auth[nick] == client)) + return 1 + return 0 + +//chat commands go here +/datum/chatroom/proc/register_auth(client,nick) //register + if(!get_auth(client,nick)) + return 0 + auth[nick] = client + return 1 + +/datum/chatroom/proc/delete_channel(client,nick) //delchannel + if(nick in operators) + for(var/event in events.events) + events.clearEvent("msg_chat",event) + qdel(src) + return 1 + return 0 + +/datum/chatroom/proc/channel_join(client,nick,channel) //join + if(!findtext(channel,"#",1,2)) + channel = "#" + channel + if(channel == name) + if((nick in banned) || (nick in users)) + return 0 + users += nick + get_topic(client,nick) + evlist[nick] = events.addEvent("msg_chat",client,"msg_chat") + return 1 + else + if(!(channel in chatchannels)) + var/ret = new_channel(client,nick,channel) + if(!ret) + return 0 + channel_part(client,nick) + var/datum/chatroom/C = chatchannels[channel] + return C.parse_msg(client,nick,"/join [channel]") + +/datum/chatroom/proc/channel_part(client,nick) //part + users -= nick + events.clearEvent("msg_chat",evlist[nick]) + return 1 + +/datum/chatroom/proc/make_op(client,nick,target) //op + if(nick in operators) + operators += target + return 1 + return 0 + +/datum/chatroom/proc/deop(client,nick,target) //deop + if(nick in operators) + operators -= target + return 1 + return 0 + +/datum/chatroom/proc/ban(client,nick,target) //ban + if(nick in operators) + banned += target + return 1 + return 0 + +/datum/chatroom/proc/unban(client,nick,target) //unban + if(nick in operators) + banned -= target + return 1 + return 0 + +/datum/chatroom/proc/kick(client,nick,target) //kick + if(nick in operators) + channel_part(null,nick) + return 1 + return 0 + +/datum/chatroom/proc/set_topic(client,nick,newtopic) //topic + if(nick in operators) + topic = strip_html_properly(newtopic) + return 1 + return 0 + +/datum/chatroom/proc/get_topic(client,nick) //topic + call(client,"msg_chat")(name,"NTbot","TOPIC: [topic]") + return 1 + +/datum/chatroom/proc/get_who(client,nick) //who + for(var/user in users) + call(client,"msg_chat")(name,"NTbot","WHO: [user]") + return 1 + +/datum/chatroom/proc/get_log(client,nick,lines) //log + for(var/i=0;iYou play with [src]." - playsound(user, 'sound/mecha/mechstep.ogg', 20, 1) cooldown = 1 spawn(30) cooldown = 0 + if (!quiet) + playsound(user, 'sound/mecha/mechstep.ogg', 20, 1) + return + ..() /obj/item/toy/prize/attack_hand(mob/user as mob) if(loc == user) if(!cooldown) user << "You play with [src]." - playsound(user, 'sound/mecha/mechturn.ogg', 20, 1) cooldown = 1 spawn(30) cooldown = 0 + if (!quiet) + playsound(user, 'sound/mecha/mechturn.ogg', 20, 1) return ..() /obj/item/toy/prize/ripley name = "toy Ripley" - desc = "Mini-Mecha action figure! Collect them all! 1/11." + desc = "Mini-Mecha action figure! Collect them all! 1/12." /obj/item/toy/prize/fireripley name = "toy firefighting Ripley" - desc = "Mini-Mecha action figure! Collect them all! 2/11." + desc = "Mini-Mecha action figure! Collect them all! 2/12." icon_state = "fireripleytoy" /obj/item/toy/prize/deathripley name = "toy deathsquad Ripley" - desc = "Mini-Mecha action figure! Collect them all! 3/11." + desc = "Mini-Mecha action figure! Collect them all! 3/12." icon_state = "deathripleytoy" /obj/item/toy/prize/gygax name = "toy Gygax" - desc = "Mini-Mecha action figure! Collect them all! 4/11." + desc = "Mini-Mecha action figure! Collect them all! 4/12." icon_state = "gygaxtoy" /obj/item/toy/prize/durand name = "toy Durand" - desc = "Mini-Mecha action figure! Collect them all! 5/11." + desc = "Mini-Mecha action figure! Collect them all! 5/12." icon_state = "durandprize" /obj/item/toy/prize/honk name = "toy H.O.N.K." - desc = "Mini-Mecha action figure! Collect them all! 6/11." + desc = "Mini-Mecha action figure! Collect them all! 6/12." icon_state = "honkprize" /obj/item/toy/prize/marauder name = "toy Marauder" - desc = "Mini-Mecha action figure! Collect them all! 7/11." + desc = "Mini-Mecha action figure! Collect them all! 7/12." icon_state = "marauderprize" /obj/item/toy/prize/seraph name = "toy Seraph" - desc = "Mini-Mecha action figure! Collect them all! 8/11." + desc = "Mini-Mecha action figure! Collect them all! 8/12." icon_state = "seraphprize" /obj/item/toy/prize/mauler name = "toy Mauler" - desc = "Mini-Mecha action figure! Collect them all! 9/11." + desc = "Mini-Mecha action figure! Collect them all! 9/12." icon_state = "maulerprize" /obj/item/toy/prize/odysseus name = "toy Odysseus" - desc = "Mini-Mecha action figure! Collect them all! 10/11." + desc = "Mini-Mecha action figure! Collect them all! 10/12." icon_state = "odysseusprize" /obj/item/toy/prize/phazon name = "toy Phazon" - desc = "Mini-Mecha action figure! Collect them all! 11/11." + desc = "Mini-Mecha action figure! Collect them all! 11/12." icon_state = "phazonprize" +/obj/item/toy/prize/reticence + name = "toy Reticence" + desc = "Mini-Mecha action figure! Collect them all! 12/12." + icon_state = "reticenceprize" + quiet = 1 + /* * AI core prizes */ @@ -631,6 +644,7 @@ desc = "A little toy model AI core with real law announcing action!" icon = 'icons/obj/toy.dmi' icon_state = "AI" + w_class = 2.0 var/cooldown = 0 /obj/item/toy/AI/attack_self(mob/user) @@ -1004,6 +1018,9 @@ obj/item/toy/cards/deck/syndicate card_throw_range = 7 card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") +/* + * Fake nuke + */ /obj/item/toy/nuke name = "\improper Nuclear Fission Explosive toy" @@ -1027,3 +1044,33 @@ obj/item/toy/cards/deck/syndicate else var/timeleft = (cooldown - world.time) user << "Nothing happens, and '[round(timeleft/10)]' appears on a small display." + +/* + * Fake meteor + */ + +/obj/item/toy/minimeteor + name = "\improper Mini-Meteor" + desc = "Relive the excitement of a meteor shower! SweetMeat-eor. Co is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor™" + icon = 'icons/obj/toy.dmi' + icon_state = "minimeteor" + w_class = 2.0 + +/obj/item/toy/minimeteor/throw_impact(atom/hit_atom) + ..() + playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1) + for(var/mob/M in range(10, src)) + if(!M.stat && !istype(M, /mob/living/silicon/ai))\ + shake_camera(M, 3, 1) + qdel(src) + +/* + * Carp plushie + */ + +/obj/item/toy/carpplushie + name = "space carp plushie" + desc = "An adorable stuffed toy that resembles a space carp." + icon = 'icons/obj/toy.dmi' + icon_state = "carpplushie" + w_class = 2.0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 83e8c61a90b..ce4387a2100 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -33,8 +33,11 @@ set category = "Object" set src in usr + if(usr.stat || !usr.canmove || usr.restrained()) + return + if (t) - src.name = text("data disk- '[]'", t) + src.name = "data disk- '[t]'" else src.name = "data disk" src.add_fingerprint(usr) @@ -74,8 +77,8 @@ var/dorm = 0 // determines if this ID has claimed a dorm already /obj/item/weapon/card/id/attack_self(mob/user as mob) - for(var/mob/O in viewers(user, null)) - O.show_message(text("[] shows you: \icon[] []: assignment: []", user, src, src.name, src.assignment), 1) + user.visible_message("[user] shows you: \icon[src] [src.name].", \ + "You show \the [src.name].") src.add_fingerprint(user) return @@ -100,25 +103,10 @@ update_label("John Doe", "Clowny") */ /obj/item/weapon/card/id/proc/update_label(var/newname, var/newjob) if(newname || newjob) - name = text("[][]", - (!newname) ? "identification card" : "[newname]'s ID Card", - (!newjob) ? "" : " ([newjob])" - ) + name = "[(!newname) ? "identification card" : "[newname]'s ID Card"][(!newjob) ? "" : " ([newjob])"]" return - name = text("[][]", - (!registered_name) ? "identification card" : "[registered_name]'s ID Card", - (!assignment) ? "" : " ([assignment])" - ) - -/obj/item/weapon/card/id/verb/read() - set name = "Read ID Card" - set category = "Object" - set src in usr - - usr << text("\icon[] []: The current assignment on the card is [].", src, src.name, src.assignment) - return - + name = "[(!registered_name) ? "identification card" : "[registered_name]'s ID Card"][(!assignment) ? "" : " ([assignment])"]" /obj/item/weapon/card/id/silver desc = "A silver card which shows honour and dedication." diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index ffc7b60fe2f..10be20f0888 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -18,18 +18,21 @@ throwforce = 0 throw_speed = 3 throw_range = 7 + var/cleanspeed = 50 //slower than mop /obj/item/weapon/soap/nanotrasen desc = "A Nanotrasen brand bar of soap. Smells of plasma." icon_state = "soapnt" /obj/item/weapon/soap/deluxe - desc = "A deluxe Waffle Co. brand bar of soap. Smells of condoms." + desc = "A deluxe Waffle Co. brand bar of soap. Smells of high-class luxury." icon_state = "soapdeluxe" + cleanspeed = 40 //same speed as mop because deluxe -- captain gets one of these /obj/item/weapon/soap/syndie - desc = "An untrustworthy bar of soap. Smells of fear." + desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster." icon_state = "soapsyndie" + cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes /obj/item/weapon/soap/Crossed(AM as mob|obj) if (istype(AM, /mob/living/carbon)) @@ -43,18 +46,22 @@ if(user.client && (target in user.client.screen)) user << "You need to take that [target.name] off before cleaning it." else if(istype(target,/obj/effect/decal/cleanable)) - user << "You scrub \the [target.name] out." - qdel(target) + user.visible_message("[user] begins to scrub \the [target.name] out with [src].") + if(do_after(user, src.cleanspeed)) + user << "You scrub \the [target.name] out." + qdel(target) else - user << "You clean \the [target.name]." - var/obj/effect/decal/cleanable/C = locate() in target - qdel(C) - target.clean_blood() + user.visible_message("[user] begins to clean \the [target.name] with [src].") + if(do_after(user, src.cleanspeed)) + user << "You clean \the [target.name]." + var/obj/effect/decal/cleanable/C = locate() in target + qdel(C) + target.clean_blood() return /obj/item/weapon/soap/attack(mob/target as mob, mob/user as mob) if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" ) - user.visible_message("\the [user] washes \the [target]'s mouth out with soap!") + user.visible_message("\the [user] washes \the [target]'s mouth out with [src.name]!") //washes mouth out with soap sounds better than 'the soap' here return ..() diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm new file mode 100644 index 00000000000..35f6a6a3749 --- /dev/null +++ b/code/game/objects/items/weapons/defib.dm @@ -0,0 +1,343 @@ +//backpack item + +/obj/item/weapon/defibrillator + name = "defibrillator" + desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients." + icon = 'icons/obj/weapons.dmi' + icon_state = "defibunit" + item_state = "defibunit" + slot_flags = SLOT_BACK + force = 5 + throwforce = 6 + w_class = 4 + origin_tech = "biotech=4" + action_button_name = "Toggle Paddles" + + var/on = 0 //if the paddles are equipped (1) or on the defib (0) + var/safety = 1 //if you can zap people with the defibs on harm mode + var/powered = 0 //if there's a cell in the defib with enough power for a revive, blocks paddles from reviving otherwise + var/obj/item/weapon/twohanded/shockpaddles/paddles + var/obj/item/weapon/stock_parts/cell/high/bcell = null + +/obj/item/weapon/defibrillator/New() //starts without a cell for rnd + ..() + paddles = make_paddles() + update_icon() + return + +/obj/item/weapon/defibrillator/loaded/New() //starts with hicap + ..() + paddles = make_paddles() + bcell = new(src) + update_icon() + return + +/obj/item/weapon/defibrillator/update_icon() + update_power() + update_overlays() + update_charge() + +/obj/item/weapon/defibrillator/proc/update_power() + if(bcell) + if(bcell.charge < paddles.revivecost) + powered = 0 + else + powered = 1 + else + powered = 0 + +/obj/item/weapon/defibrillator/proc/update_overlays() + overlays.Cut() + if(!on) + overlays += "defibunit-paddles" + if(powered) + overlays += "defibunit-powered" + if(!bcell) + overlays += "defibunit-nocell" + if(!safety) + overlays += "defibunit-emagged" + +/obj/item/weapon/defibrillator/proc/update_charge() + if(powered) //so it doesn't show charge if it's unpowered + if(bcell) + var/ratio = bcell.charge / bcell.maxcharge + ratio = Ceiling(ratio*4) * 25 + overlays += "defibunit-charge[ratio]" + +/obj/item/weapon/defibrillator/CheckParts() + bcell = locate(/obj/item/weapon/stock_parts/cell) in contents + update_icon() + +/obj/item/weapon/defibrillator/ui_action_click() + if(usr.get_item_by_slot(slot_back) == src) + toggle_paddles() + else + usr << "Put the defibrillator on your back first!" + return + +/obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/weapon/stock_parts/cell)) + var/obj/item/weapon/stock_parts/cell/C = W + if(bcell) + user << "[src] already has a cell." + else + if(C.maxcharge < paddles.revivecost) + user << "[src] requires a higher capacity cell." + return + user.drop_item() + W.loc = src + bcell = W + user << "You install a cell in [src]." + + if(istype(W, /obj/item/weapon/card/emag)) + if(safety) + safety = 0 + user << "You silently disable [src]'s safety protocols with the [W]." + else + safety = 1 + user << "You silently enable [src]'s safety protocols with the [W]." + + if(istype(W, /obj/item/weapon/screwdriver)) + if(bcell) + bcell.updateicon() + bcell.loc = get_turf(src.loc) + bcell = null + user << "You remove the cell from the [src]." + + update_icon() + return + +/obj/item/weapon/defibrillator/emp_act(severity) + if(bcell) + deductcharge(1000 / severity) + if(bcell.reliability != 100 && prob(50/severity)) + bcell.reliability -= 10 / severity + if(safety) + safety = 0 + src.visible_message("[src] beeps: Safety protocols disabled!") + playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0) + else + safety = 1 + src.visible_message("[src] beeps: Safety protocols enabled!") + playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0) + update_icon() + ..() + +/obj/item/weapon/defibrillator/verb/toggle_paddles() + set name = "Toggle Paddles" + set category = "Object" + on = !on + + var/mob/living/carbon/human/user = usr + if(on) + //Detach the paddles into the user's hands + var/list/L = list("left hand" = slot_l_hand,"right hand" = slot_r_hand) + if(!user.equip_in_one_of_slots(paddles, L)) + on = 0 + user << "You need a free hand to hold the paddles!" + update_icon() + return + paddles.loc = user + else + //Remove from their hands and back onto the defib unit + remove_paddles(user) + + update_icon() + return + +/obj/item/weapon/defibrillator/proc/make_paddles() + return new /obj/item/weapon/twohanded/shockpaddles(src) + +/obj/item/weapon/defibrillator/equipped(mob/user, slot) + if(slot != slot_back) + remove_paddles(user) + update_icon() + +/obj/item/weapon/defibrillator/proc/remove_paddles(mob/user) + var/mob/living/carbon/human/M = user + if(paddles in get_both_hands(M)) + M.unEquip(paddles) + update_icon() + return + +/obj/item/weapon/defibrillator/Destroy() + if(on) + var/M = get(paddles, /mob) + remove_paddles(M) + ..() + update_icon() + return + +/obj/item/weapon/defibrillator/proc/deductcharge(var/chrgdeductamt) + if(bcell) + if(bcell.charge < (paddles.revivecost+chrgdeductamt)) + powered = 0 + update_icon() + if(bcell.use(chrgdeductamt)) + update_icon() + return 1 + else + update_icon() + return 0 + +/obj/item/weapon/defibrillator/proc/cooldowncheck(var/mob/user) + spawn(50) + if(bcell) + if(bcell.charge >= paddles.revivecost) + user.visible_message("[src] beeps: Unit ready.") + playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0) + else + user.visible_message("[src] beeps: Charge depleted.") + playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0) + paddles.cooldown = 0 + paddles.update_icon() + update_icon() + +//paddles + +/obj/item/weapon/twohanded/shockpaddles + name = "defibrillator paddles" + desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks." + icon = 'icons/obj/weapons.dmi' + icon_state = "defibpaddles" + item_state = "defibpaddles" + force = 0 + throwforce = 6 + w_class = 4 + + var/revivecost = 1000 + var/cooldown = 0 + var/busy = 0 + var/obj/item/weapon/defibrillator/defib + +/obj/item/weapon/twohanded/shockpaddles/New(mainunit) + ..() + if(check_defib_exists(mainunit, src)) + defib = mainunit + loc = defib + busy = 0 + update_icon() + return + +/obj/item/weapon/twohanded/shockpaddles/update_icon() + icon_state = "defibpaddles[wielded]" + item_state = "defibpaddles[wielded]" + if(cooldown) + icon_state = "defibpaddles[wielded]_cooldown" + +/obj/item/weapon/twohanded/shockpaddles/suicide_act(mob/user) + user.visible_message("[user] is putting the live paddles on \his chest! It looks like \he's trying to commit suicide.") + defib.deductcharge(revivecost) + playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1) + return (OXYLOSS) + +/obj/item/weapon/twohanded/shockpaddles/dropped(mob/user as mob) + ..() + user << "The paddles snap back into the main unit." + defib.on = 0 + loc = defib + defib.update_icon() + +/obj/item/weapon/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O) + if (!mainunit || !istype(mainunit, /obj/item/weapon/defibrillator)) //To avoid weird issues from admin spawns + M.unEquip(O) + qdel(0) + return 0 + else + return 1 + +/obj/item/weapon/twohanded/shockpaddles/attack(mob/M as mob, mob/user as mob) + var/tobehealed + var/threshold = -config.health_threshold_dead + var/mob/living/carbon/human/H = M + + if(busy) + return + if(!defib.powered) + user.visible_message("[defib] beeps: Unit is unpowered.") + playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0) + return + if(!wielded) + user << "You need to wield the paddles in both hands before you can use them on someone!" + return + if(cooldown) + user << "[defib] is recharging." + return + if(!ishuman(M)) + user << "The instructions on [defib] don't mention how to revive that..." + return + else + if(user.a_intent == "harm" && !defib.safety) + busy = 1 + H.visible_message("[M.name] has been touched with [src] by [user]!") + H.adjustStaminaLoss(50) + H.adjustFireLoss(10) + H.Stun(3) + H.updatehealth() //forces health update before next life tick + playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1) + add_logs(user, M, "stunned", object="defibrillator") + defib.deductcharge(revivecost) + cooldown = 1 + busy = 0 + update_icon() + defib.cooldowncheck(user) + return + if(user.zone_sel && user.zone_sel.selecting == "chest") + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") + busy = 1 + update_icon() + if(do_after(user, 30)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") + playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 0) + var/isghosted = !H.key && H.mind + var/tplus = world.time - H.timeofdeath + var/tlimit = 1500 //past this much time the subject is unrecoverable + var/tloss = 900 //but brain damage starts setting in after some time + if(do_after(user, 20)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + if(H.stat == 2) + var/health = H.health + var/chance = 90 + for(var/obj/item/carried_item in H.contents) + if(istype(carried_item, /obj/item/clothing/suit/armor)) + chance = 25 + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1) + if(H.health <= -100 && !H.suiciding && prob(chance) && !isghosted && tplus < tlimit && !NOCLONE in H.mutations) + tobehealed = health + threshold + tobehealed -= 5 //They get 5 health in crit to heal the person or inject stabilizers + H.adjustOxyLoss(tobehealed) + user.visible_message("[defib] pings: Resuscitation successful.") + playsound(get_turf(src), 'sound/machines/ping.ogg', 50, 0) + H.stat = 1 + dead_mob_list -= H + living_mob_list |= list(H) + H.emote("gasp") + if(tplus > tloss) + H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) + defib.deductcharge(revivecost) + add_logs(user, M, "revived", object="defibrillator") + else + if(tplus > tlimit) + user.visible_message("[defib] buzzes: Resuscitation failed. Tissue damage beyond point of no return for defibrillation.") + else + user.visible_message("[defib] buzzes: Resuscitation failed.") + if(isghosted) + for(var/mob/dead/observer/ghost in player_list) + if(ghost.mind == H.mind) + if(ghost.can_reenter_corpse) + ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" + ghost << sound('sound/effects/genetics.ogg') + playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 0) + defib.deductcharge(revivecost) + update_icon() + cooldown = 1 + defib.cooldowncheck(user) + else + user.visible_message("[defib] buzzes: Patient is not in a valid state. Operation aborted.") + playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 0) + busy = 0 + update_icon() + else + user << "You need to target your patient's chest with [src]." + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 2078dfc93bf..642f4a144ff 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -332,6 +332,26 @@ beakers += B2 icon_state = "grenade" + +/obj/item/weapon/grenade/chem_grenade/pacid + name = "acid grenade" + desc = "Used for melting armoured opponents." + stage = READY + +/obj/item/weapon/grenade/chem_grenade/pacid/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent("pacid", 100) + B1.reagents.add_reagent("potassium", 25) + B2.reagents.add_reagent("phosphorus", 25) + B2.reagents.add_reagent("sugar", 25) + + beakers += B1 + beakers += B2 + icon_state = "grenade" + #undef EMPTY #undef WIRED #undef READY diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 332ca0e93a7..66f46b0c758 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -113,6 +113,11 @@ else user.take_organ_damage(2*force) return + if(isrobot(target)) + ..() + return + if(!isliving(target)) + return if (user.a_intent == "harm") if(!..()) return if(!isrobot(target)) return diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 44c9b9dc921..d0e2a2ba6dd 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -11,10 +11,11 @@ attack_verb = list("mopped", "bashed", "bludgeoned", "whacked") var/mopping = 0 var/mopcount = 0 - + var/mopcap = 5 + var/mopspeed = 40 /obj/item/weapon/mop/New() - create_reagents(5) + create_reagents(mopcap) obj/item/weapon/mop/proc/clean(turf/simulated/A) @@ -40,9 +41,9 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) A = null if(istype(turf)) - user.visible_message("[user] begins to clean \the [turf].") + user.visible_message("[user] begins to clean \the [turf] with [src].") - if(do_after(user, 40)) + if(do_after(user, mopspeed)) clean(turf) user << "You have finished mopping!" @@ -63,4 +64,12 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) /obj/item/weapon/mop/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J) return - +/obj/item/weapon/mop/advanced + desc = "The most advanced tool in a custodian's arsenal. Just think of all the viscera you will clean up with this!" + name = "advanced mop" + mopcap = 10 + icon_state = "advmop" + force = 6 + throwforce = 8 + throw_range = 4 + mopspeed = 20 \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 6100e836582..7d9c1ec5575 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -34,7 +34,8 @@ w_class = 4 max_w_class = 2 - storage_slots = 21 + max_combined_w_class = 30 + storage_slots = 30 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) @@ -96,13 +97,15 @@ desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant." icon_state = "portaseeder" - 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) - close_all() +/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) + seedify(O, 1) + close_all() // ----------------------------- diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index f404c37e711..0fafce0d3a8 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -139,6 +139,19 @@ new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) +/obj/item/weapon/storage/box/medipens/utility + name = "medipens kit" + desc = "A box with several utility medipens for the economical miner." + icon_state = "syringe" + +/obj/item/weapon/storage/box/syringes/New() + ..() + new /obj/item/weapon/reagent_containers/hypospray/medipen/leporazine( src ) + new /obj/item/weapon/reagent_containers/hypospray/medipen/leporazine( src ) + new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack( src ) + new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack( src ) + new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack( src ) + /obj/item/weapon/storage/box/beakers name = "box of beakers" icon_state = "beaker" diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 1e0414ff121..2535cb46f52 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -139,8 +139,8 @@ //CIG PACK// //////////// /obj/item/weapon/storage/fancy/cigarettes - name = "cigarette packet" - desc = "The most popular brand of Space Cigarettes, sponsors of the Space Olympics." + name = "\improper Space Cigarettes packet" + desc = "The most popular brand of cigarettes, sponsors of the Space Olympics." icon = 'icons/obj/cigarettes.dmi' icon_state = "cigpacket" item_state = "cigpacket" @@ -190,6 +190,66 @@ icon_state = "Dpacket" item_state = "Dpacket" +/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift + name = "\improper Uplift Smooth packet" + desc = "Your favorite brand, now menthol flavored." + icon_state = "upliftpacket" + item_state = "upliftpacket" + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust + name = "\improper Robust packet" + desc = "Smoked by the robust." + icon_state = "robustpacket" + item_state = "robustpacket" + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_robustgold + name = "\improper Robust Gold packet" + desc = "Smoked by the truly robust." + icon_state = "robustgpacket" + item_state = "robustgpacket" + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_robustgold/New() + ..() + for(var/i = 1 to storage_slots) + reagents.add_reagent("gold",0.2) + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp + name = "\improper Carp Classic packet" + desc = "Since 2313." + icon_state = "carppacket" + item_state = "carppacket" + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate + name = "cigarette packet" + desc = "An obscure brand of cigarettes." + icon_state = "syndiepacket" + item_state = "syndiepacket" + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate/New() + ..() + for(var/i = 1 to storage_slots) + reagents.add_reagent("doctorsdelight",15) + + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori + name = "\improper Midori Tabako packet" + desc = "You can't understand the runes, but the packet smells funny." + icon_state = "midoripacket" + item_state = "midoripacket" + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims + name ="\improper Shady Jim's Super Slims" + desc = "Is your weight slowing you down? Having trouble running away from gravitational singularities? Can't stop stuffing your mouth? Smoke Shady Jim's Super Slims and watch all that fat burn away. Guaranteed results!" + icon_state = "shadyjimpacket" + item_state = "shadyjimpacket" + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims/New() + ..() + for(var/i = 1 to storage_slots) + reagents.add_reagent("lipozine",4) + reagents.add_reagent("ammonia",2) + reagents.add_reagent("plantbgone",1) + reagents.add_reagent("toxin",1.5) /obj/item/weapon/storage/fancy/rollingpapers name = "rolling paper pack" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 3cc811137c4..bdf805d2b02 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -362,6 +362,9 @@ set name = "Switch Gathering Method" set category = "Object" + if(usr.stat || !usr.canmove || usr.restrained()) + return + collection_mode = (collection_mode+1)%3 switch (collection_mode) if(2) @@ -376,7 +379,7 @@ set name = "Empty Contents" set category = "Object" - if((!ishuman(usr) && (loc != usr)) || usr.stat || usr.restrained()) + if((!ishuman(usr) && (loc != usr)) || usr.stat || usr.restrained() ||!usr.canmove) return do_quick_empty() diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 0285eae77a8..f261c0aeb09 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -20,6 +20,8 @@ /obj/item/weapon/tank/jetpack/verb/toggle_rockets() set name = "Toggle Jetpack Stabilization" set category = "Object" + if(usr.stat || !usr.canmove || usr.restrained()) + return src.stabilization_on = !( src.stabilization_on ) usr << "You toggle the stabilization [stabilization_on? "on":"off"]." return @@ -28,6 +30,8 @@ /obj/item/weapon/tank/jetpack/verb/toggle() set name = "Toggle Jetpack" set category = "Object" + if(usr.stat || !usr.canmove || usr.restrained()) + return on = !on if(on) icon_state = "[icon_state]-on" diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index b82ff3b8939..8f02afd70fb 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -29,6 +29,8 @@ /obj/item/weapon/watertank/verb/toggle_mister() set name = "Toggle Mister" set category = "Object" + if(usr.stat || !usr.canmove || usr.restrained()) + return on = !on var/mob/living/carbon/human/user = usr diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index df9b873ecbf..c30b4ac122b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -1,15 +1,10 @@ /obj languages = HUMAN //var/datum/module/mod //not used - var/m_amt = 0 // metal - var/g_amt = 0 // glass - var/origin_tech = null //Used by R&D to determine what research bonuses it grants. - var/reliability = 100 //Used by SOME devices to determine how reliable they are. var/crit_fail = 0 var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj. animate_movement = 2 var/throwforce = 0 - var/list/attack_verb = list() //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! var/damtype = "brute" @@ -142,7 +137,10 @@ /obj/singularity_pull(S, current_size) if(anchored) - if(current_size >= 9) + if(current_size >= STAGE_FIVE) anchored = 0 step_towards(src,S) - else step_towards(src,S) \ No newline at end of file + else step_towards(src,S) + +/obj/proc/Deconstruct() + qdel(src) \ No newline at end of file diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 54d65faa2b2..b76161c0d8a 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -1,11 +1,11 @@ -obj/structure +/obj/structure icon = 'icons/obj/structures.dmi' -obj/structure/blob_act() +/obj/structure/blob_act() if(prob(50)) qdel(src) -obj/structure/ex_act(severity) +/obj/structure/ex_act(severity) switch(severity) if(1.0) qdel(src) @@ -17,7 +17,7 @@ obj/structure/ex_act(severity) if(3.0) return -obj/structure/Destroy() +/obj/structure/Destroy() if(opacity) UpdateAffectingLights() ..() \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 2a10446e1ff..6af8f879705 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -74,6 +74,9 @@ new /obj/item/clothing/gloves/black(src) new /obj/item/clothing/head/soft/purple(src) new /obj/item/device/flashlight(src) + new /obj/item/weapon/caution(src) + new /obj/item/weapon/caution(src) + new /obj/item/weapon/caution(src) new /obj/item/weapon/holosign_creator(src) new /obj/item/device/lightreplacer(src) new /obj/item/weapon/storage/bag/trash(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 5bf51ea6e1e..90b2fa14b9a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -68,28 +68,14 @@ new /obj/item/weapon/storage/backpack/medic(src) else new /obj/item/weapon/storage/backpack/satchel_med(src) - new /obj/item/clothing/under/rank/nursesuit (src) - new /obj/item/clothing/head/nursehat (src) - switch(pick("blue", "green", "purple")) - if ("blue") - new /obj/item/clothing/under/rank/medical/blue(src) - if ("green") - new /obj/item/clothing/under/rank/medical/green(src) - if ("purple") - new /obj/item/clothing/under/rank/medical/purple(src) - switch(pick("blue", "green", "purple")) - if ("blue") - new /obj/item/clothing/under/rank/medical/blue(src) - if ("green") - new /obj/item/clothing/under/rank/medical/green(src) - if ("purple") - new /obj/item/clothing/under/rank/medical/purple(src) new /obj/item/clothing/under/rank/medical(src) new /obj/item/clothing/suit/labcoat(src) new /obj/item/clothing/shoes/sneakers/white(src) -// new /obj/item/weapon/cartridge/medical(src) new /obj/item/device/radio/headset/headset_med(src) + new /obj/item/clothing/gloves/latex(src) + new /obj/item/weapon/defibrillator/loaded(src) new /obj/item/weapon/storage/belt/medical(src) + new /obj/item/clothing/glasses/hud/health(src) return @@ -113,12 +99,13 @@ new /obj/item/weapon/storage/backpack/satchel_med(src) new /obj/item/clothing/suit/bio_suit/cmo(src) new /obj/item/clothing/head/bio_hood/cmo(src) - new /obj/item/clothing/under/rank/chief_medical_officer(src) new /obj/item/clothing/suit/labcoat/cmo(src) - new /obj/item/weapon/cartridge/cmo(src) - new /obj/item/clothing/gloves/latex(src) + new /obj/item/clothing/under/rank/chief_medical_officer(src) new /obj/item/clothing/shoes/sneakers/brown (src) + new /obj/item/weapon/cartridge/cmo(src) new /obj/item/device/radio/headset/heads/cmo(src) + new /obj/item/clothing/gloves/latex(src) + new /obj/item/weapon/defibrillator/loaded(src) new /obj/item/weapon/storage/belt/medical(src) new /obj/item/device/flash/handheld(src) new /obj/item/weapon/reagent_containers/hypospray/CMO(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 40a861b0c4b..c477ef67812 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -37,8 +37,10 @@ sleep(2) new /obj/item/clothing/suit/bio_suit/scientist(src) new /obj/item/clothing/head/bio_hood/scientist(src) - new /obj/item/clothing/under/rank/research_director(src) new /obj/item/clothing/suit/labcoat(src) + new /obj/item/clothing/under/rank/research_director(src) + new /obj/item/clothing/under/rank/research_director/alt(src) + new /obj/item/clothing/under/rank/research_director/turtleneck(src) new /obj/item/weapon/cartridge/rd(src) new /obj/item/clothing/shoes/sneakers/white(src) new /obj/item/clothing/gloves/latex(src) @@ -48,5 +50,4 @@ new /obj/item/clothing/suit/armor/reactive(src) new /obj/item/device/flash/handheld(src) new /obj/item/device/laser_pointer(src) - new /obj/item/clothing/under/rank/research_director/alt(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index fc7b6800bd5..ddc0b48b116 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -189,6 +189,22 @@ new /obj/item/clothing/shoes/sneakers/white(src) return +/obj/structure/closet/wardrobe/white/medical + name = "medical doctor's wardrobe" + +/obj/structure/closet/wardrobe/white/medical/New() + new /obj/item/clothing/under/rank/nursesuit (src) + new /obj/item/clothing/head/nursehat (src) + new /obj/item/clothing/suit/labcoat/emt(src) + new /obj/item/clothing/suit/labcoat/emt(src) + new /obj/item/clothing/suit/labcoat/emt(src) + new /obj/item/clothing/under/rank/medical/blue(src) + new /obj/item/clothing/under/rank/medical/green(src) + new /obj/item/clothing/under/rank/medical/purple(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/shoes/sneakers/black(src) + return /obj/structure/closet/wardrobe/pjs name = "pajama wardrobe" diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 155d4cab07f..06cb67f69d9 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -267,7 +267,7 @@ obj/structure/door_assembly/New() anchored = 1 density = 1 state = 1 - mineral = "clown" + mineral = "bananium" /obj/structure/door_assembly/door_assembly_sandstone name = "sandstone airlock assembly" diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index bb0dc4486f6..0d0b1201ce9 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -7,6 +7,7 @@ anchored = 1 icon = 'icons/turf/walls.dmi' var/mineral = "metal" + var/walltype = "metal" var/opening = 0 density = 1 opacity = 1 @@ -31,20 +32,20 @@ /obj/structure/falsewall/relativewall() if(!density) - icon_state = "[mineral]fwall_open" + icon_state = "[walltype]fwall_open" return var/junction = 0 //will be used to determine from which side the wall is connected to other walls for(var/turf/simulated/wall/W in orange(src,1)) if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls - if(src.mineral == W.mineral)//Only 'like' walls connect -Sieve + if(walltype == W.walltype)//Only 'like' walls connect -Sieve junction |= get_dir(src,W) for(var/obj/structure/falsewall/W in orange(src,1)) if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls - if(src.mineral == W.mineral) + if(walltype == W.walltype) junction |= get_dir(src,W) - icon_state = "[mineral][junction]" + icon_state = "[walltype][junction]" return /obj/structure/falsewall/attack_hand(mob/user) @@ -72,24 +73,24 @@ /obj/structure/falsewall/proc/do_the_flick() if(density) - flick("[mineral]fwall_opening", src) + flick("[walltype]fwall_opening", src) else - flick("[mineral]fwall_closing", src) + flick("[walltype]fwall_closing", src) /obj/structure/falsewall/update_icon(relativewall = 1)//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open if(density) - icon_state = "[mineral]0" + icon_state = "[walltype]0" if(relativewall) relativewall() else - icon_state = "[mineral]fwall_open" + icon_state = "[walltype]fwall_open" /obj/structure/falsewall/proc/ChangeToWall(delete = 1) var/turf/T = get_turf(src) - if(!mineral || mineral == "metal") + if(!walltype || walltype == "metal") T.ChangeTurf(/turf/simulated/wall) else - T.ChangeTurf(text2path("/turf/simulated/wall/mineral/[mineral]")) + T.ChangeTurf(text2path("/turf/simulated/wall/mineral/[walltype]")) if(delete) qdel(src) return T @@ -176,11 +177,11 @@ for(var/turf/simulated/wall/W in orange(src,1)) if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls - if(src.mineral == W.mineral)//Only 'like' walls connect -Sieve + if(src.walltype == W.walltype)//Only 'like' walls connect -Sieve junction |= get_dir(src,W) for(var/obj/structure/falsewall/W in orange(src,1)) if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls - if(src.mineral == W.mineral) + if(src.walltype == W.walltype) junction |= get_dir(src,W) icon_state = "rwall[junction]" return @@ -194,6 +195,7 @@ desc = "A wall with uranium plating. This is probably a bad idea." icon_state = "" mineral = "uranium" + walltype = "uranium" var/active = null var/last_event = 0 @@ -226,24 +228,28 @@ desc = "A wall with gold plating. Swag!" icon_state = "" mineral = "gold" + walltype = "gold" /obj/structure/falsewall/silver name = "silver wall" desc = "A wall with silver plating. Shiny." icon_state = "" mineral = "silver" + walltype = "silver" /obj/structure/falsewall/diamond name = "diamond wall" desc = "A wall with diamond plating. You monster." icon_state = "" mineral = "diamond" + walltype = "diamond" /obj/structure/falsewall/plasma name = "plasma wall" desc = "A wall with plasma plating. This is definately a bad idea." icon_state = "" mineral = "plasma" + walltype = "plasma" /obj/structure/falsewall/plasma/attackby(obj/item/weapon/W, mob/user) if(is_hot(W) > 300) @@ -268,17 +274,20 @@ name = "bananium wall" desc = "A wall with bananium plating. Honk!" icon_state = "" - mineral = "clown" + mineral = "bananium" + walltype = "clown" /obj/structure/falsewall/sandstone name = "sandstone wall" desc = "A wall with sandstone plating." icon_state = "" mineral = "sandstone" + walltype = "sandstone" //------------wtf?------------end /obj/structure/falsewall/wood name = "wooden wall" desc = "A wall with wooden plating." icon_state = "" - mineral = "wood" \ No newline at end of file + mineral = "wood" + walltype = "wood" \ No newline at end of file diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 74e6482c59d..984780b298c 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -230,3 +230,16 @@ health -= 1 healthcheck() ..() + +/obj/structure/grille/hitby(AM as mob|obj) + ..() + visible_message("[src] was hit by [AM].") + var/tforce = 0 + if(ismob(AM)) + tforce = 5 + else if(isobj(AM)) + var/obj/item/I = AM + tforce = I.throwforce - 5 + playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) + health = max(0, health - tforce) + healthcheck() diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index ee907422628..22e008029e7 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -77,6 +77,12 @@ user << "[src] can't hold any more signs." else if(mybag) mybag.attackby(I, user) + else if(istype(I, /obj/item/weapon/crowbar)) + user.visible_message("[user] begins to empty the contents of [src].") + if(do_after(user, 30)) + usr << "You empty the contents of [src]'s bucket onto the floor." + reagents.reaction(src.loc) + src.reagents.clear_reagents() /obj/structure/janitorialcart/attack_hand(mob/user) user.set_machine(src) diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index bf542a54c9c..f5a22006542 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -236,7 +236,7 @@ /obj/structure/statue/bananium hardness = 3 - mineralType = "clown" + mineralType = "bananium" desc = "A bananium statue with a small engraving:'HOOOOOOONK'." /obj/structure/statue/bananium/clown diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 2437b38378b..29126839d37 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -12,8 +12,6 @@ "[user.name] pulls [buckled_mob.name] free from the sticky nest!",\ "[user.name] pulls you free from the gelatinous resin.",\ "You hear squelching...") - buckled_mob.pixel_y = 0 - buckled_mob.pixel_x = 0 unbuckle() /obj/structure/stool/bed/nest/unbuckle_myself(mob/user as mob) @@ -23,8 +21,6 @@ "You hear squelching...") spawn(600) if(user && buckled_mob && user.buckled == src) - buckled_mob.pixel_y = 0 - buckled_mob.pixel_x = 0 unbuckle() /obj/structure/stool/bed/nest/buckle_mob(mob/M as mob, mob/user as mob) @@ -49,14 +45,18 @@ M.loc = src.loc M.dir = src.dir M.update_canmove() - M.pixel_y = 1 - M.pixel_x = 2 + M.pixel_y += 1 + M.pixel_x += 2 + M.anchored = anchored src.buckled_mob = M src.add_fingerprint(user) src.overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=6) return /obj/structure/stool/bed/nest/unbuckle() + if(buckled_mob) + buckled_mob.pixel_y -= 1 + buckled_mob.pixel_x -= 2 overlays.Cut() ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 2989edb780f..efb6acf3401 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -129,6 +129,7 @@ "You are buckled in to [src] by [user.name].",\ "You hear metal clanking") M.buckled = src + M.anchored = anchored M.loc = src.loc M.dir = src.dir M.update_canmove() 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 be89e7e6a5c..ad4f2705f56 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -4,8 +4,6 @@ icon_state = "chair" /obj/structure/stool/bed/chair/New() - if(anchored) - src.verbs -= /atom/movable/verb/pull ..() spawn(3) //sorry. i don't think there's a better way to do this. handle_layer() @@ -66,7 +64,7 @@ else if(!usr || !isturf(usr.loc)) return - if(usr.stat || usr.restrained()) + if(usr.stat || usr.restrained() || !usr.canmove) return spin() diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 553f8f8aead..37021e197fc 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -47,6 +47,8 @@ return if (!istype(R) || get_dist(user, src) > 1 || get_dist(src,R) > 1) return + for(var/obj/structure/transit_tube_pod/pod in loc) + return //no fun allowed var/obj/structure/transit_tube_pod/T = new/obj/structure/transit_tube_pod(src) R.transfer_fingerprints_to(T) T.add_fingerprint(user) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index fbb5a473b1d..9db7adb4aeb 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -304,7 +304,8 @@ obj/structure/windoor_assembly/Destroy() set name = "Rotate Windoor Assembly" set category = "Object" set src in oview(1) - + if(usr.stat || !usr.canmove || usr.restrained()) + return if (src.anchored) usr << "It is fastened to the floor; therefore, you can't rotate it!" return 0 @@ -325,6 +326,8 @@ obj/structure/windoor_assembly/Destroy() set name = "Flip Windoor Assembly" set category = "Object" set src in oview(1) + if(usr.stat || !usr.canmove || usr.restrained()) + return if(src.facing == "l") usr << "The windoor will now slide to the right." diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index ea2917bc549..d0e7195490a 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -12,6 +12,8 @@ var/state = 0 var/reinf = 0 var/disassembled = 0 + var/obj/item/stack/rods/storedrods + var/obj/item/weapon/shard/storedshard // var/silicate = 0 // number of units of silicate // var/icon/silicateIcon = null // the silicated icon @@ -21,9 +23,7 @@ health -= Proj.damage ..() if(health <= 0) - new /obj/item/weapon/shard(loc) - new /obj/item/stack/rods(loc) - qdel(src) + spawnfragments() return @@ -33,23 +33,20 @@ qdel(src) return if(2.0) - new /obj/item/weapon/shard(loc) - if(reinf) new /obj/item/stack/rods(loc) - qdel(src) + spawnfragments() return if(3.0) if(prob(50)) - new /obj/item/weapon/shard(loc) - if(reinf) new /obj/item/stack/rods(loc) - qdel(src) + spawnfragments() return /obj/structure/window/blob_act() - new /obj/item/weapon/shard(loc) - if(reinf) new /obj/item/stack/rods(loc) - qdel(src) + spawnfragments() +/obj/structure/window/singularity_pull(S, current_size) + if(current_size >= STAGE_FIVE) + spawnfragments() /obj/structure/window/CanPass(atom/movable/mover, turf/target, height=0) if(istype(mover) && mover.checkpass(PASSGLASS)) @@ -87,9 +84,7 @@ update_nearby_icons() step(src, get_dir(AM, src)) if(health <= 0) - new /obj/item/weapon/shard(loc) - if(reinf) new /obj/item/stack/rods(loc) - qdel(src) + spawnfragments() /obj/structure/window/attack_tk(mob/user as mob) user.visible_message("Something knocks on [src].") @@ -102,12 +97,10 @@ if(HULK in user.mutations) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!")) user.visible_message("[user] smashes through [src]!") - var/obj/item/weapon/shard/S = new (loc) - S.add_fingerprint(user) - if(reinf) - var/obj/item/stack/rods/R = new (loc) - R.add_fingerprint(user) - qdel(src) + storedshard.add_fingerprint(user) + if(storedrods) + storedrods.add_fingerprint(user) + spawnfragments() else user.changeNext_move(CLICK_CD_MELEE) user.visible_message("[user] knocks on [src].") @@ -126,9 +119,7 @@ health -= damage if(health <= 0) user.visible_message("[user] smashes through [src]!") - new /obj/item/weapon/shard(loc) - if(reinf) new /obj/item/stack/rods(loc) - qdel(src) + spawnfragments() else //for nicer text~ user.visible_message("[user] smashes into [src]!") playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) @@ -227,21 +218,25 @@ index++ else spawnfragments() - qdel(src) return /obj/structure/window/proc/spawnfragments() - var/newshard = new /obj/item/weapon/shard(loc) - transfer_fingerprints_to(newshard) - if(reinf) - var/newrods = new /obj/item/stack/rods(loc) - transfer_fingerprints_to(newrods) + var/turf/T = loc + storedshard.loc = T + transfer_fingerprints_to(storedshard) + if(storedrods) + storedrods.loc = T + transfer_fingerprints_to(storedrods) + qdel(src) /obj/structure/window/verb/rotate() set name = "Rotate Window Counter-Clockwise" set category = "Object" set src in oview(1) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if(anchored) usr << "It is fastened to the floor therefore you can't rotate it!" return 0 @@ -259,6 +254,9 @@ set category = "Object" set src in oview(1) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if(anchored) usr << "It is fastened to the floor therefore you can't rotate it!" return 0 @@ -291,7 +289,7 @@ ..() if(re) reinf = re - + storedshard = new/obj/item/weapon/shard(src) ini_dir = dir if(reinf) icon_state = "rwindow" @@ -301,6 +299,7 @@ health = 40 if(opacity) icon_state = "twindow" + storedrods = new/obj/item/stack/rods(src) else icon_state = "window" diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index acdb0fab9c4..1011cef9c50 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -45,4 +45,4 @@ return if(2) //lube - M.slip(0, 10, null, (STEP|SLIDE|GALOSHES_DONT_HELP)) \ No newline at end of file + M.slip(0, 7, null, (STEP|SLIDE|GALOSHES_DONT_HELP)) \ No newline at end of file diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 3aa6dc73165..b2a29e48a70 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -124,7 +124,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," return if(is_plasteel_floor()) icon_state = "floorscorched[pick(1,2)]" - else if(burnt_states) + else if(!burnt_states.len) icon_state = pick(burnt_states) else icon_state = pick(broken_states) @@ -170,17 +170,17 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," return 0 /turf/simulated/floor/singularity_pull(S, current_size) - if(current_size == 5) + if(current_size == STAGE_THREE) if(prob(30)) if(builtin_tile) builtin_tile.loc = src make_plating() - else if(current_size == 7) + else if(current_size == STAGE_FOUR) if(prob(50)) if(builtin_tile) builtin_tile.loc = src make_plating() - else if(current_size >= 9) + else if(current_size >= STAGE_FIVE) if(builtin_tile) if(prob(70)) builtin_tile.loc = src diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index b5ebf04f44e..523beb8b993 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -10,6 +10,7 @@ * Ocean * Iron Sand * Snow + * High-traction */ /turf/simulated/floor/goonplaque @@ -91,3 +92,13 @@ /turf/simulated/floor/plating/snow/ex_act(severity) return + +/turf/simulated/floor/noslip + name = "high-traction floor" + icon_state = "noslip" + floor_tile = /obj/item/stack/tile/noslip + broken_states = list("noslip-damaged1","noslip-damaged2","noslip-damaged3") + burnt_states = list("noslip-scorched1","noslip-scorched2") + +/turf/simulated/floor/noslip/MakeSlippery() + return \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index a265b2b55ab..864e6240189 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -125,7 +125,7 @@ assume_air(adding) /turf/simulated/floor/engine/singularity_pull(S, current_size) - if(current_size >= 9) + if(current_size >= STAGE_FIVE) if(builtin_tile) if(prob(30)) builtin_tile.loc = src diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 87672e572ab..ee1bd6c9e68 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -313,10 +313,10 @@ return /turf/simulated/wall/singularity_pull(S, current_size) - if(current_size >= 9) + if(current_size >= STAGE_FIVE) if(prob(50)) dismantle_wall() return - if(current_size == 7) + if(current_size == STAGE_FOUR) if(prob(30)) dismantle_wall() \ No newline at end of file diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index f3a0848ef4f..a5e00d5b6dc 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -35,7 +35,7 @@ desc = "A wall with bananium plating. Honk!" icon_state = "clown0" walltype = "clown" - mineral = "clown" + mineral = "bananium" /turf/simulated/wall/mineral/sandstone name = "sandstone wall" diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 5566f250aca..e93e30a4731 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -270,6 +270,6 @@ return /turf/simulated/wall/r_wall/singularity_pull(S, current_size) - if(current_size >= 9) + if(current_size >= STAGE_FIVE) if(prob(30)) dismantle_wall() \ No newline at end of file diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 86a8d0bdd4e..954c4ed91e4 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -41,7 +41,7 @@ qdel(L) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) user << "You build a floor." - ChangeTurf(/turf/simulated/floor) + ChangeTurf(/turf/simulated/floor/plating) else user << "You need one floor tile to build a floor." else diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index f00b9e16186..41550e6c219 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -18,7 +18,6 @@ var/temperature = T20C var/blocks_air = 0 - var/icon_old = null var/PathNode/PNode = null //associated PathNode in the A* algorithm diff --git a/code/game/verbs/atom_verbs.dm b/code/game/verbs/atom_verbs.dm deleted file mode 100644 index 2726c11875f..00000000000 --- a/code/game/verbs/atom_verbs.dm +++ /dev/null @@ -1,8 +0,0 @@ -/atom/movable/verb/pull() - set name = "Pull" - set category = "Object" - set src in oview(1) - - if(Adjacent(usr)) - usr.start_pulling(src) - return diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 95ec12426c6..4fbd9fe533c 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -252,6 +252,10 @@ var/global/floorIsLava = 0 usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") dat+="

    " dat+="\[Story by [MESSAGE.author]\]
    " + dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]:
    " + for(var/datum/feed_comment/comment in MESSAGE.comments) + dat+="[comment.body]
    [comment.author] [comment.time_stamp]
    " + dat+="
    " dat+="

    Refresh" dat+="
    Back" if(10) @@ -287,6 +291,9 @@ var/global/floorIsLava = 0 for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) dat+="-[MESSAGE.body]
    \[Story by [MESSAGE.author]\]
    " dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
    " + dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]: [MESSAGE.locked ? "Unlock" : "Lock"]
    " + for(var/datum/feed_comment/comment in MESSAGE.comments) + dat+="[comment.body] X
    [comment.author] [comment.time_stamp]
    " dat+="
    Back" if(13) dat+="[src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.author] \]
    " @@ -300,7 +307,6 @@ var/global/floorIsLava = 0 else for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) dat+="-[MESSAGE.body]
    \[Story by [MESSAGE.author]\]
    " - dat+="
    Back" if(14) dat+="Wanted Issue Handler:" diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 5af2ebb0d14..b9e4b830b69 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -22,12 +22,12 @@ F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
    " //ADMINVERBS -/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity") ) +/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity", "records", "cargo") ) set name = "Investigate" set category = "Admin" if(!holder) return switch(subject) - if("singulo", "ntsl", "wires", "telesci", "gravity") //general one-round-only stuff + if("singulo", "ntsl", "wires", "telesci", "gravity", "records", "cargo") //general one-round-only stuff var/F = investigate_subject2file(subject) if(!F) src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index fa48db048c4..9edbb034971 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -57,7 +57,8 @@ var/list/admin_verbs_admin = list( /client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/ /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/ /client/proc/cmd_admin_create_centcom_report, - /client/proc/check_words /*displays cult-words*/ + /client/proc/check_words, /*displays cult-words*/ + /client/proc/reset_all_tcs /*resets all telecomms scripts*/ ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -186,7 +187,8 @@ var/list/admin_verbs_hideable = list( /client/proc/enable_debug_verbs, /proc/possess, /proc/release, - /client/proc/reload_admins + /client/proc/reload_admins, + /client/proc/reset_all_tcs ) /client/proc/add_admin_verbs() diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 767627aa68a..5c1d89c4642 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2273,3 +2273,15 @@ else if(href_list["ac_set_signature"]) src.admincaster_signature = adminscrub(input(usr, "Provide your desired signature", "Network Identity Handler", "")) src.access_news_network() + + else if(href_list["ac_del_comment"]) + var/datum/feed_comment/FC = locate(href_list["ac_del_comment"]) + var/datum/feed_message/FM = locate(href_list["ac_del_comment_msg"]) + FM.comments -= FC + qdel(FC) + src.access_news_network() + + else if(href_list["ac_lock_comment"]) + var/datum/feed_message/FM = locate(href_list["ac_lock_comment"]) + FM.locked ^= 1 + src.access_news_network() diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 1b2c4bdf428..c9ff2d065b9 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -12,7 +12,7 @@ var/datum/objective/steal/steal_objective = new steal_objective.owner = H.mind - steal_objective.set_target("nuclear authentication disk") + steal_objective.set_target(new /datum/objective_item/steal/nukedisc) H.mind.objectives += steal_objective var/datum/objective/hijack/hijack_objective = new diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 67d8d55ff8a..74655bac1fa 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -766,3 +766,21 @@ Traitors and the like can also be revived with the previous role mostly intact. usr << "Random events disabled" message_admins("Admin [key_name_admin(usr)] has disabled random events.") feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/client/proc/reset_all_tcs() + set category = "Admin" + set name = "Reset Telecomms Scripts" + set desc = "Blanks all telecomms scripts from all telecomms servers" + if(!holder) + usr << "Admin only." + return + for(var/obj/machinery/telecomms/server/S in telecomms_list) + var/datum/TCS_Compiler/C = S.Compiler + S.rawcode = "" + C.Compile("") + for(var/obj/machinery/computer/telecomms/traffic/T in machines) + T.storedcode = "" + log_admin("[key_name(usr)] blanked all telecomms scripts.") + message_admins("[key_name_admin(usr)] blanked all telecomms scripts.") + feedback_add_details("admin_verb","RAT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 4b7d57e45ca..5bcc194d824 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -130,6 +130,9 @@ set category = "Object" set src in usr + if(usr.stat || !usr.canmove || usr.restrained()) + return + dir = turn(dir, 90) return diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index f64d1590071..ae95989af85 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -259,6 +259,7 @@ var/next_external_rsc = 0 'icons/pda_icons/pda_blank.png', 'icons/pda_icons/pda_boom.png', 'icons/pda_icons/pda_bucket.png', + 'icons/pda_icons/pda_chatroom.png', 'icons/pda_icons/pda_medbot.png', 'icons/pda_icons/pda_floorbot.png', 'icons/pda_icons/pda_cleanbot.png', @@ -305,4 +306,4 @@ var/next_external_rsc = 0 'icons/stamp_icons/large_stamp-cap.png', 'icons/stamp_icons/large_stamp-qm.png', 'icons/stamp_icons/large_stamp-law.png' - ) \ No newline at end of file + ) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8605854a4df..ac23b8954fa 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -42,7 +42,8 @@ datum/preferences //character preferences var/real_name //our character's name - var/be_random_name = 0 //whether we are a random name every round + var/be_random_name = 0 //whether we'll have a random name every round + var/be_random_body = 0 //whether we'll have a random body every round var/gender = MALE //gender of character (well duh) var/age = 30 //age of character var/blood_type = "A+" //blood type (not-chooseable) @@ -163,7 +164,8 @@ datum/preferences dat += "" dat += "

    Body

    " - dat += "Random Body
    " + dat += "Random Body " + dat += "Always Random Body: [be_random_body ? "Yes" : "No"]
    " dat += "
    " @@ -270,7 +272,7 @@ datum/preferences dat += "" //user << browse(dat, "window=preferences;size=560x560") - var/datum/browser/popup = new(user, "preferences", "
    Character Setup
    ", 580, 600) + var/datum/browser/popup = new(user, "preferences", "
    Character Setup
    ", 580, 620) popup.set_content(dat) popup.open(0) @@ -744,6 +746,9 @@ datum/preferences if("name") be_random_name = !be_random_name + if("all") + be_random_body = !be_random_body + if("hear_midis") toggles ^= SOUND_MIDI @@ -791,6 +796,9 @@ datum/preferences if(be_random_name) real_name = random_name(gender) + if(be_random_body) + random_character(gender) + if(config.humans_need_surnames) var/firstspace = findtext(real_name, " ") var/name_length = length(real_name) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ffd49d228d0..74562dc81e5 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -169,6 +169,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["OOC_Notes"] >> metadata S["real_name"] >> real_name S["name_is_always_random"] >> be_random_name + S["body_is_always_random"] >> be_random_body S["gender"] >> gender S["age"] >> age S["hair_color"] >> hair_color @@ -205,6 +206,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car mutant_color = "#FFF" if(!real_name) real_name = random_name(gender) be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) + be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body)) gender = sanitize_gender(gender) if(gender == MALE) hair_style = sanitize_inlist(hair_style, hair_styles_male_list) @@ -250,6 +252,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["OOC_Notes"] << metadata S["real_name"] << real_name S["name_is_always_random"] << be_random_name + S["body_is_always_random"] << be_random_body S["gender"] << gender S["age"] << age S["hair_color"] << hair_color diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1308e85cc05..3de1b0b4916 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -3,8 +3,8 @@ var/flash_protect = 0 //Malk: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS var/tint = 0 //Malk: Sets the item's level of visual impairment tint, normally set to the same as flash_protect var/up = 0 // but seperated to allow items to protect but not impair vision, like space helmets - var/visor_flags = null - var/visor_flags_inv = null + var/visor_flags = 0 // flags that are added/removed when an item is adjusted up/down + var/visor_flags_inv = 0 // same as visor_flags, but for flags_inv //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears @@ -102,8 +102,8 @@ BLIND // can't see anything src.icon_state = initial(icon_state) gas_transfer_coefficient = initial(gas_transfer_coefficient) permeability_coefficient = initial(permeability_coefficient) - flags = initial(flags) - flags_inv = initial(flags_inv) + flags |= visor_flags + flags_inv |= visor_flags_inv usr << "You push \the [src] back into place." src.mask_adjusted = 0 else @@ -111,8 +111,8 @@ BLIND // can't see anything usr << "You push \the [src] out of the way." gas_transfer_coefficient = null permeability_coefficient = null - flags = null - flags_inv = null + flags &= ~visor_flags + flags_inv &= ~visor_flags_inv src.mask_adjusted = 1 usr.update_inv_wear_mask() @@ -266,8 +266,10 @@ atom/proc/generate_female_clothing(index,t_color,icon) set category = "Object" set src in usr var/mob/M = usr - if (istype(M, /mob/dead/)) return - if (usr.stat) return + if (istype(M, /mob/dead/)) + return + if (!can_use(usr)) + return if(src.has_sensor >= 2) usr << "The controls are locked." return 0 @@ -292,7 +294,7 @@ atom/proc/generate_female_clothing(index,t_color,icon) set name = "Adjust Jumpsuit Style" set category = "Object" set src in usr - if(usr.stat) + if(!can_use(usr)) return if(!can_adjust) usr << "You cannot wear this suit any differently." @@ -313,8 +315,10 @@ atom/proc/generate_female_clothing(index,t_color,icon) set name = "Remove Accessory" set category = "Object" set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return + if(!istype(usr, /mob/living)) + return + if(!can_use(usr)) + return if(hastie) hastie.transform *= 2 @@ -336,7 +340,7 @@ atom/proc/generate_female_clothing(index,t_color,icon) ..() /obj/item/clothing/proc/weldingvisortoggle() //Malk: proc to toggle welding visors on helmets, masks, goggles, etc. - if(usr.canmove && !usr.stat && !usr.restrained()) + if(can_use(usr)) if(up) up = !up flags |= (visor_flags) @@ -360,3 +364,9 @@ atom/proc/generate_female_clothing(index,t_color,icon) usr.update_inv_glasses(0) if(istype(src, /obj/item/clothing/mask)) usr.update_inv_wear_mask(0) + +/obj/item/clothing/proc/can_use(mob/user) + if(user && ismob(user)) + if(!user.stat && user.canmove && !user.restrained()) + return 1 + return 0 diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index b17e41c0ef1..78f76f8d971 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -5,6 +5,7 @@ item_state = "balaclava" flags = BLOCKHAIR flags_inv = HIDEFACE + visor_flags_inv = HIDEFACE w_class = 2 action_button_name = "Adjust Balaclava" ignore_maskadjust = 0 diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 32c6702102b..739dc16581a 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -5,6 +5,7 @@ item_state = "m_mask" body_parts_covered = 0 flags = MASKCOVERSMOUTH | MASKINTERNALS + visor_flags = MASKCOVERSMOUTH | MASKINTERNALS w_class = 2 gas_transfer_coefficient = 0.10 permeability_coefficient = 0.50 diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 4fa595fdc2c..295298df882 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -87,8 +87,10 @@ set category = "Object" set name = "HALT" set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return + if(!istype(usr, /mob/living)) + return + if(!can_use(usr)) + return var/phrase = 0 //selects which phrase to use var/phrase_text = null diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 4e459567d7a..59acfbd631d 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -24,6 +24,8 @@ w_class = 1 flags = MASKCOVERSMOUTH flags_inv = HIDEFACE + visor_flags = MASKCOVERSMOUTH + visor_flags_inv = HIDEFACE gas_transfer_coefficient = 0.90 permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index efe04465a36..d7d2414ff68 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -14,6 +14,8 @@ set name = "Toggle Magboots" set category = "Object" set src in usr + if(!can_use(usr)) + return attack_self(usr) @@ -49,4 +51,4 @@ desc = "Reverse-engineered magnetic boots that have a heavy magnetic pull. Property of Gorlex Marauders." name = "blood-red magboots" icon_state = "syndiemag0" - magboot_state = "syndiemag" + magboot_state = "syndiemag" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 496fd90507f..bdf0b2ed3ba 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -52,6 +52,7 @@ icon_state = "wizard" strip_delay = 50 put_on_delay = 50 + unacidable = 1 /obj/item/clothing/shoes/sandal/marisa desc = "A pair of magic black shoes." diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 8fe70226fa3..f3fc2721928 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -138,6 +138,7 @@ armor = list(melee = 40, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 100, rad = 50) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT + unacidable = 1 /obj/item/clothing/suit/space/hardsuit/wizard icon_state = "hardsuit-wiz" @@ -151,6 +152,7 @@ allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank/emergency_oxygen) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + unacidable = 1 //Medical hardsuit diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 4fac7f71965..32d90013168 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -120,6 +120,7 @@ slowdown = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) action_button_name = "Toggle Armor" + unacidable = 1 /obj/item/clothing/suit/armor/reactive/IsShield() if(active) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index e3b75febb8b..076dc6cc927 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -14,7 +14,7 @@ set category = "Object" set src in usr - if(!usr.canmove || usr.stat || usr.restrained()) + if(!can_use(usr)) return 0 open = !open @@ -28,6 +28,12 @@ icon_state = "labcoat_cmo" item_state = "labcoat_cmo" +/obj/item/clothing/suit/labcoat/emt + name = "EMT's jacket" + desc = "A dark blue jacket with reflective strips for emergency medical technicians." + icon_state = "labcoat_emt" + item_state = "labcoat_cmo" + /obj/item/clothing/suit/labcoat/mad name = "\improper The Mad's labcoat" desc = "It makes you look capable of konking someone on the noggin and shooting them into space." diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index c2373675872..b0ec44c0d58 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -228,7 +228,7 @@ set category = "Object" set src in usr - if(!usr.canmove || usr.stat || usr.restrained()) + if(!can_use(usr)) return 0 if(src.icon_state == "suitjacket_blue_open") //no god no diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index de249c00557..df88c830561 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -7,6 +7,7 @@ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 20, bio = 20, rad = 20) strip_delay = 50 put_on_delay = 50 + unacidable = 1 /obj/item/clothing/head/wizard/red name = "red wizard hat" @@ -51,6 +52,7 @@ flags_inv = HIDEJUMPSUIT strip_delay = 50 put_on_delay = 50 + unacidable = 1 /obj/item/clothing/suit/wizrobe/red @@ -92,6 +94,7 @@ gas_transfer_coefficient = 1 permeability_coefficient = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + unacidable = 0 /obj/item/clothing/head/wizard/marisa/fake name = "witch hat" @@ -100,6 +103,7 @@ gas_transfer_coefficient = 1 permeability_coefficient = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + unacidable = 0 /obj/item/clothing/suit/wizrobe/marisa/fake name = "witch robe" @@ -109,3 +113,4 @@ gas_transfer_coefficient = 1 permeability_coefficient = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + unacidable = 0 \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index d56b94e60bb..351a97b5ee1 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -3,20 +3,29 @@ */ /obj/item/clothing/under/rank/research_director desc = "It's a suit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." - name = "research director's suit" + name = "research director's vest suit" icon_state = "director" item_state = "g_suit" item_color = "director" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0) can_adjust = 0 /obj/item/clothing/under/rank/research_director/alt desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." - name = "research director's suit" + name = "research director's tan suit" icon_state = "rdwhimsy" item_state = "rdwhimsy" item_color = "rdwhimsy" - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0) + can_adjust = 1 + +/obj/item/clothing/under/rank/research_director/turtleneck + desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style." + name = "research director's turtleneck" + icon_state = "rdturtle" + item_state = "p_suit" + item_color = "rdturtle" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0) can_adjust = 1 /obj/item/clothing/under/rank/scientist diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index 7781afff461..779a9800be2 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -43,7 +43,7 @@ if(ismob(target) && target.reagents && reagents.total_volume) user.visible_message("\The [target] has been smothered with \the [src] by \the [user]!", "You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise") src.reagents.reaction(target, TOUCH) - spawn(5) src.reagents.clear_reagents() + src.reagents.clear_reagents() return else ..() diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food&drinks/food/condiment.dm index 21ec47ce544..7ef596d303a 100644 --- a/code/modules/food&drinks/food/condiment.dm +++ b/code/modules/food&drinks/food/condiment.dm @@ -6,7 +6,7 @@ //Food items that aren't eaten normally and leave an empty container behind. /obj/item/weapon/reagent_containers/food/condiment - name = "Condiment Container" + name = "condiment container" desc = "Just your average condiment container." icon = 'icons/obj/food.dmi' icon_state = "emptycondiment" @@ -14,7 +14,16 @@ possible_transfer_amounts = list(1,5,10) volume = 50 //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites. - var/list/possible_states = list("ketchup" = list("ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "enzyme" = list("enzyme", "Universal Enzyme", "Used in cooking various dishes"), "soysauce" = list("soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("coldsauce", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("saltshaker", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("pepermillsmall", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("oliveoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("emptycondiment", "Sugar", "Tasty spacey sugar!")) + var/list/possible_states = list( + "ketchup" = list("ketchup", "ketchup bottle", "You feel more American already."), + "capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"), + "enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"), + "soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), + "frostoil" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in it's passage"), + "sodiumchloride" = list("saltshaker", "salt shaker", "Salt. From space oceans, presumably"), + "blackpepper" = list("pepermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), + "cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"), + "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!")) /obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/weapon/W as obj, mob/user as mob) return @@ -41,10 +50,10 @@ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) return 1 - else if( istype(M, /mob/living/carbon/human) ) - visible_message("[user] attempts to feed [M] [src].") + else + user.visible_message("[user] attempts to feed [M] from [src].") if(!do_mob(user, M)) return - visible_message("[user] feeds [M] [src].") + user.visible_message("[user] feeds [M] from [src].") add_logs(user, M, "fed", object="[reagentlist(src)]") @@ -98,7 +107,7 @@ desc = temp_list[3] else - name = "misc Condiment Bottle" + name = "condiment bottle" main_reagent = reagents.get_master_reagent_name() if (reagents.reagent_list.len==1) desc = "Looks like it is [lowertext(main_reagent)], but you are not sure." @@ -107,12 +116,12 @@ icon_state = "mixedcondiments" else icon_state = "emptycondiment" - name = "condiment Bottle" + name = "condiment bottle" desc = "An empty condiment bottle." return /obj/item/weapon/reagent_containers/food/condiment/enzyme - name = "Universal Enzyme" + name = "universal enzyme" desc = "Used in cooking various dishes." icon_state = "enzyme" @@ -127,7 +136,7 @@ reagents.add_reagent("sugar", 50) /obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then - name = "Salt Shaker" // a large one. + name = "salt shaker" // a large one. desc = "Salt. From space oceans, presumably." icon_state = "saltshakersmall" possible_transfer_amounts = list(1,20) //for clown turning the lid off @@ -139,7 +148,7 @@ reagents.add_reagent("sodiumchloride", 20) /obj/item/weapon/reagent_containers/food/condiment/peppermill - name = "Pepper Mill" + name = "pepper mill" desc = "Often used to flavor food or make people sneeze." icon_state = "peppermillsmall" possible_transfer_amounts = list(1,20) //for clown turning the lid off diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm index 27f81278994..3cdea87cb8e 100644 --- a/code/modules/food&drinks/food/snacks.dm +++ b/code/modules/food&drinks/food/snacks.dm @@ -218,1020 +218,7 @@ // reagents.add_reagent("nutriment", 2) // this line of code for all the contents. // bitesize = 3 //This is the amount each bite consumes. - -////////////////////////////////////////////SALAD//////////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/snacks/aesirsalad - name = "\improper Aesir salad" - desc = "Probably too incredible for mortal men to fully enjoy." - icon_state = "aesirsalad" - trash = /obj/item/trash/snack_bowl - -/obj/item/weapon/reagent_containers/food/snacks/aesirsalad/New() - ..() - eatverb = pick("crunch","devour","nibble","gnaw","gobble","chomp") - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 8) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/herbsalad - name = "herb salad" - desc = "A tasty salad with apples on top." - icon_state = "herbsalad" - trash = /obj/item/trash/snack_bowl - -/obj/item/weapon/reagent_containers/food/snacks/herbsalad/New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/validsalad - name = "valid salad" - desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it." - icon_state = "validsalad" - trash = /obj/item/trash/snack_bowl - -/obj/item/weapon/reagent_containers/food/snacks/validsalad/New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("doctorsdelight", 5) - bitesize = 3 - -////////////////////////////////////////////DONUTS//////////////////////////////////////////// - - -/obj/item/weapon/reagent_containers/food/snacks/donut - name = "donut" - icon_state = "donut1" - -/obj/item/weapon/reagent_containers/food/snacks/donut/normal - desc = "Goes great with Robust Coffee." - -/obj/item/weapon/reagent_containers/food/snacks/donut/normal/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - src.bitesize = 3 - if(prob(30)) - src.icon_state = "donut2" - src.name = "frosted donut" - reagents.add_reagent("sprinkles", 2) - -/obj/item/weapon/reagent_containers/food/snacks/donut/chaos - name = "chaos donut" - desc = "Like life, it never quite tastes the same." - -/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sprinkles", 1) - bitesize = 10 - switch(rand(1,10)) - if(1) - reagents.add_reagent("nutriment", 3) - if(2) - reagents.add_reagent("capsaicin", 3) - if(3) - reagents.add_reagent("frostoil", 3) - if(4) - reagents.add_reagent("sprinkles", 3) - if(5) - reagents.add_reagent("plasma", 3) - if(6) - reagents.add_reagent("coco", 3) - if(7) - reagents.add_reagent("slimejelly", 3) - if(8) - reagents.add_reagent("banana", 3) - if(9) - reagents.add_reagent("berryjuice", 3) - if(10) - reagents.add_reagent("tricordrazine", 3) - if(prob(30)) - icon_state = "donut2" - name = "frosted chaos donut" - reagents.add_reagent("sprinkles", 2) - - -/obj/item/weapon/reagent_containers/food/snacks/donut/jelly - name = "jelly donut" - desc = "You jelly?" - icon_state = "jdonut1" - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("berryjuice", 5) - if(prob(30)) - icon_state = "jdonut2" - name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) - -/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly - name = "jelly donut" - desc = "You jelly?" - icon_state = "jdonut1" - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("slimejelly", 5) - bitesize = 5 - if(prob(30)) - icon_state = "jdonut2" - name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) - -/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly - name = "jelly donut" - desc = "You jelly?" - icon_state = "jdonut1" - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("cherryjelly", 5) - if(prob(30)) - icon_state = "jdonut2" - name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) - -////////////////////////////////////////////WAFFLES//////////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/snacks/waffles - name = "waffles" - desc = "Mmm, waffles." - icon_state = "waffles" - trash = /obj/item/trash/waffles - -/obj/item/weapon/reagent_containers/food/snacks/waffles/New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/soylentgreen - name = "\improper Soylent Green" - desc = "Not made of people. Honest." //Totally people. - icon_state = "soylent_green" - trash = /obj/item/trash/waffles - -/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/soylenviridians - name = "\improper Soylent Virdians" - desc = "Not made of people. Honest." //Actually honest for once. - icon_state = "soylent_yellow" - trash = /obj/item/trash/waffles - -/obj/item/weapon/reagent_containers/food/snacks/soylenviridians/New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles - name = "roffle waffles" - desc = "Waffles from Roffle. Co." - icon_state = "rofflewaffles" - trash = /obj/item/trash/waffles - -/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles/New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("mushroomhallucinogen", 8) - bitesize = 4 - -////////////////////////////////////////////FISH//////////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/snacks/cubancarp - name = "\improper Cuban carp" - desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!" - icon_state = "cubancarp" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/cubancarp/New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - reagents.add_reagent("capsaicin", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/carpmeat - name = "carp fillet" - desc = "A fillet of spess carp meat." - icon_state = "fishfillet" - -/obj/item/weapon/reagent_containers/food/snacks/carpmeat/New() - ..() - eatverb = pick("bite","chew","choke down","gnaw","swallow","chomp") - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("carpotoxin", 3) - bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/carpmeat/imitation - name = "imitation carp fillet" - desc = "Almost just like the real thing, kinda." - -/obj/item/weapon/reagent_containers/food/snacks/fishfingers - name = "fish fingers" - desc = "A finger of fish." - icon_state = "fishfingers" - -/obj/item/weapon/reagent_containers/food/snacks/fishfingers/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/fishandchips - name = "fish and chips" - desc = "I do say so myself chap." - icon_state = "fishandchips" - -/obj/item/weapon/reagent_containers/food/snacks/fishandchips/New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 - -////////////////////////////////////////////EGGS//////////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/snacks/chocolateegg - name = "chocolate egg" - desc = "Such, sweet, fattening food." - icon_state = "chocolateegg" - -/obj/item/weapon/reagent_containers/food/snacks/chocolateegg/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sugar", 2) - reagents.add_reagent("coco", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/egg - name = "egg" - desc = "An egg!" - icon_state = "egg" - -/obj/item/weapon/reagent_containers/food/snacks/egg/New() - ..() - reagents.add_reagent("nutriment", 1) - -/obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/egg_smudge(src.loc) - reagents.reaction(hit_atom, TOUCH) - del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes. - -/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype( W, /obj/item/toy/crayon )) - var/obj/item/toy/crayon/C = W - var/clr = C.colourName - - if(!(clr in list("blue", "green", "mime", "orange", "purple", "rainbow", "red", "yellow"))) - usr << "[src] refuses to take on this colour!" - return - - usr << "You colour [src] [clr]." - icon_state = "egg-[clr]" - item_color = clr - else - ..() - -/obj/item/weapon/reagent_containers/food/snacks/egg/blue - icon_state = "egg-blue" - item_color = "blue" - -/obj/item/weapon/reagent_containers/food/snacks/egg/green - icon_state = "egg-green" - item_color = "green" - -/obj/item/weapon/reagent_containers/food/snacks/egg/mime - icon_state = "egg-mime" - item_color = "mime" - -/obj/item/weapon/reagent_containers/food/snacks/egg/orange - icon_state = "egg-orange" - item_color = "orange" - -/obj/item/weapon/reagent_containers/food/snacks/egg/purple - icon_state = "egg-purple" - item_color = "purple" - -/obj/item/weapon/reagent_containers/food/snacks/egg/rainbow - icon_state = "egg-rainbow" - item_color = "rainbow" - -/obj/item/weapon/reagent_containers/food/snacks/egg/red - icon_state = "egg-red" - item_color = "red" - -/obj/item/weapon/reagent_containers/food/snacks/egg/yellow - icon_state = "egg-yellow" - item_color = "yellow" - -/obj/item/weapon/reagent_containers/food/snacks/friedegg - name = "fried egg" - desc = "A fried egg, with a touch of salt and pepper." - icon_state = "friedegg" - -/obj/item/weapon/reagent_containers/food/snacks/friedegg/New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/boiledegg - name = "boiled egg" - desc = "A hard boiled egg." - icon_state = "egg" - -/obj/item/weapon/reagent_containers/food/snacks/boiledegg/New() - ..() - reagents.add_reagent("nutriment", 2) - -/obj/item/weapon/reagent_containers/food/snacks/omelette //FUCK THIS - name = "omelette du fromage" - desc = "That's all you can say!" - icon_state = "omelette" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/omelette/New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/omelette/attackby(obj/item/weapon/W, mob/user) - if(istype(W,/obj/item/weapon/kitchen/utensil/fork)) - if(W.icon_state == "forkloaded") - user << "You already have omelette on your fork." - return - W.icon_state = "forkloaded" - user.visible_message( \ - "[user] takes a piece of omelette with their fork!", \ - "You take a piece of omelette with your fork!" \ - ) - reagents.remove_reagent("nutriment", 1) - if(reagents.total_volume <= 0) - qdel(src) - -/obj/item/weapon/reagent_containers/food/snacks/benedict - name = "eggs benedict" - desc = "There is only one egg on this, how rude." - icon_state = "benedict" - -/obj/item/weapon/reagent_containers/food/snacks/benedict/New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 3 - -////////////////////////////////////////////MUFFINS//////////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/snacks/muffin - name = "muffin" - desc = "A delicious and spongy little cake." - icon_state = "muffin" - -/obj/item/weapon/reagent_containers/food/snacks/muffin/New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/muffin/berry - name = "berry muffin" - icon_state = "berrymuffin" - desc = "A delicious and spongy little cake, with berries." - -/obj/item/weapon/reagent_containers/food/snacks/muffin/booberry - name = "booberry muffin" - icon_state = "berrymuffin" - alpha = 125 - desc = "My stomach is a graveyard! No living being can quench my bloodthirst!" - -////////////////////////////////////////////OTHER//////////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/snacks/candy - name = "candy" - desc = "Nougat love it or hate it." - icon_state = "candy" - trash = /obj/item/trash/candy - -/obj/item/weapon/reagent_containers/food/snacks/candy/New() - ..() - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("sugar", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/candy_corn - name = "candy corn" - desc = "It's a handful of candy corn. Can be stored in a detective's hat." - icon_state = "candy_corn" - -/obj/item/weapon/reagent_containers/food/snacks/candy_corn/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sugar", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/chips - name = "chips" - desc = "Commander Riker's What-The-Crisps" - icon_state = "chips" - trash = /obj/item/trash/chips - -/obj/item/weapon/reagent_containers/food/snacks/chips/New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/cookie - name = "cookie" - desc = "COOKIE!!!" - icon_state = "COOKIE!!!" - -/obj/item/weapon/reagent_containers/food/snacks/cookie/New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/chocolatebar - name = "chocolate bar" - desc = "Such, sweet, fattening food." - icon_state = "chocolatebarunwrapped" - wrapped = 0 - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sugar", 2) - reagents.add_reagent("coco", 2) - -/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/attack_self(mob/user) - if(wrapped) - Unwrap(user) - else - ..() - -/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/proc/Unwrap(mob/user) - icon_state = "chocolatebarunwrapped" - desc = "It won't make you all sticky." - user << "You remove the foil." - wrapped = 0 - - -/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/wrapped - desc = "It's wrapped in some foil." - icon_state = "chocolatebar" - wrapped = 1 - -/obj/item/weapon/reagent_containers/food/snacks/tofu - name = "tofu" - desc = "We all love tofu." - icon_state = "tofu" - -/obj/item/weapon/reagent_containers/food/snacks/tofu/New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice - name = "huge mushroom slice" - desc = "A slice from a huge mushroom." - icon_state = "hugemushroomslice" - -/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/tomatomeat - name = "tomato slice" - desc = "A slice from a huge tomato." - icon_state = "tomatomeat" - -/obj/item/weapon/reagent_containers/food/snacks/tomatomeat/New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/bearmeat - name = "bear meat" - desc = "A very manly slab of meat." - icon_state = "bearmeat" - -/obj/item/weapon/reagent_containers/food/snacks/bearmeat/New() - ..() - reagents.add_reagent("nutriment", 12) - reagents.add_reagent("hyperzine", 5) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/xenomeat - name = "meat" - desc = "A slab of meat" - icon_state = "xenomeat" - -/obj/item/weapon/reagent_containers/food/snacks/xenomeat/New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/spidermeat - name = "spider meat" - desc = "A slab of spider meat." - icon_state = "spidermeat" - -/obj/item/weapon/reagent_containers/food/snacks/spidermeat/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("toxin", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/spiderleg - name = "spider leg" - desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?" - icon_state = "spiderleg" - -/obj/item/weapon/reagent_containers/food/snacks/spiderleg/New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("toxin", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cornedbeef - name = "corned beef and cabbage" - desc = "Now you can feel like a real tourist vacationing in Ireland." - icon_state = "cornedbeef" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/cornedbeef/New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/faggot - name = "faggot" - desc = "A great meal all round. Not a cord of wood." - icon_state = "faggot" - -/obj/item/weapon/reagent_containers/food/snacks/faggot/New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sausage - name = "sausage" - desc = "A piece of mixed, long meat." - icon_state = "sausage" - -/obj/item/weapon/reagent_containers/food/snacks/sausage/New() - ..() - eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp") - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/donkpocket - name = "\improper Donk-pocket" - desc = "The food of choice for the seasoned traitor." - icon_state = "donkpocket" - var/warm = 0 - -/obj/item/weapon/reagent_containers/food/snacks/donkpocket/New() - ..() - reagents.add_reagent("nutriment", 4) - - - -/obj/item/weapon/reagent_containers/food/snacks/donkpocket/proc/cooltime() //Not working, derp? - if(warm) - spawn(4200) //ew - warm = 0 - reagents.del_reagent("tricordrazine") - name = initial(name) - return - -/obj/item/weapon/reagent_containers/food/snacks/wingfangchu - name = "wing fang chu" - desc = "A savory dish of alien wing wang in soy." - icon_state = "wingfangchu" - trash = /obj/item/trash/snack_bowl - -/obj/item/weapon/reagent_containers/food/snacks/wingfangchu/New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/human/kebab - name = "-kebab" - icon_state = "kebab" - desc = "A human meat, on a stick." - trash = /obj/item/stack/rods - -/obj/item/weapon/reagent_containers/food/snacks/human/kebab/New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/monkeykebab - name = "meat-kebab" - icon_state = "kebab" - desc = "Delicious meat, on a stick." - trash = /obj/item/stack/rods - -/obj/item/weapon/reagent_containers/food/snacks/monkeykebab/New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/tofukebab - name = "tofu-kebab" - icon_state = "kebab" - desc = "Vegan meat, on a stick." - trash = /obj/item/stack/rods - -/obj/item/weapon/reagent_containers/food/snacks/tofukebab/New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/popcorn - name = "popcorn" - desc = "Now let's find some cinema." - icon_state = "popcorn" - trash = /obj/item/trash/popcorn - var/unpopped = 0 - -/obj/item/weapon/reagent_containers/food/snacks/popcorn/New() - ..() - eatverb = pick("bite","crunch","nibble","gnaw","gobble","chomp") - unpopped = rand(1,10) - reagents.add_reagent("nutriment", 2) - bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 - -/obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume() - if(prob(unpopped)) //lol ...what's the point? << AINT SO POINTLESS NO MORE - usr << "You bite down on an un-popped kernel, and it hurts your teeth!" - unpopped = max(0, unpopped-1) - reagents.add_reagent("sacid",0.1) //only a little tingle. - ..() - - -/obj/item/weapon/reagent_containers/food/snacks/sosjerky - name = "\improper Scaredy's Private Reserve Beef Jerky" - icon_state = "sosjerky" - desc = "Beef jerky made from the finest space cows." - trash = /obj/item/trash/sosjerky - -/obj/item/weapon/reagent_containers/food/snacks/sosjerky/New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/no_raisin - name = "4no raisins" - icon_state = "4no_raisins" - desc = "Best raisins in the universe. Not sure why." - trash = /obj/item/trash/raisins - -/obj/item/weapon/reagent_containers/food/snacks/no_raisin/New() - ..() - reagents.add_reagent("nutriment", 6) - -/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie - name = "space twinkie" - icon_state = "space_twinkie" - desc = "Guaranteed to survive longer than you will." - -/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie/New() - ..() - reagents.add_reagent("sugar", 4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers - name = "cheesie honkers" - desc = "Bite sized cheesie snacks that will honk all over your mouth." - icon_state = "cheesie_honkers" - trash = /obj/item/trash/cheesie - -/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers/New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/syndicake - name = "syndi-cakes" - icon_state = "syndi_cakes" - desc = "An extremely moist snack cake that tastes just as good after being nuked." - trash = /obj/item/trash/syndi_cakes - -/obj/item/weapon/reagent_containers/food/snacks/syndicake/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("doctorsdelight", 5) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato - name = "loaded baked potato" - desc = "Totally baked." - icon_state = "loadedbakedpotato" - -/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato/New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/fries - name = "space fries" - desc = "AKA: French Fries, Freedom Fries, etc." - icon_state = "fries" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/fries/New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/soydope - name = "soy dope" - desc = "Dope from a soy." - icon_state = "soydope" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/soydope/New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cheesyfries - name = "cheesy fries" - desc = "Fries. Covered in cheese. Duh." - icon_state = "cheesyfries" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/cheesyfries/New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/fortunecookie - name = "fortune cookie" - desc = "A true prophecy in each cookie!" - icon_state = "fortune_cookie" - -/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/badrecipe - name = "burned mess" - desc = "Someone should be demoted from chef for this." - icon_state = "badrecipe" - -/obj/item/weapon/reagent_containers/food/snacks/badrecipe/New() - ..() - eatverb = pick("choke down","nibble","gnaw","chomp") - reagents.add_reagent("toxin", 1) - reagents.add_reagent("carbon", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/meatsteak - name = "meat steak" - desc = "A piece of hot spicy meat." - icon_state = "meatsteak" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/meatsteak/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff - name = "spacy liberty duff" - desc = "Jello gelatin, from Alfred Hubbard's cookbook." - icon_state = "spacylibertyduff" - trash = /obj/item/trash/snack_bowl - -/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff/New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("mushroomhallucinogen", 6) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/amanitajelly - name = "amanita jelly" - desc = "Looks curiously toxic." - icon_state = "amanitajelly" - trash = /obj/item/trash/snack_bowl - -/obj/item/weapon/reagent_containers/food/snacks/amanitajelly/New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("amatoxin", 6) - reagents.add_reagent("mushroomhallucinogen", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/poppypretzel - name = "poppy pretzel" - desc = "It's all twisted up!" - icon_state = "poppypretzel" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/poppypretzel/New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 - -/* No more of this -/obj/item/weapon/reagent_containers/food/snacks/telebacon - name = "tele bacon" - desc = "It tastes a little odd but it is still delicious." - icon_state = "bacon" - var/obj/item/device/radio/beacon/bacon/baconbeacon - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/telebacon/New() - ..() - reagents.add_reagent("nutriment", 4) - baconbeacon = new /obj/item/device/radio/beacon/bacon(src) -/obj/item/weapon/reagent_containers/food/snacks/telebacon/On_Consume() - if(!reagents.total_volume) - baconbeacon.loc = usr - baconbeacon.digest_delay() -*/ - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube - name = "monkey cube" - desc = "Just add water!" - icon_state = "monkeycube" - bitesize = 12 - wrapped = 0 - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/New() - ..() - reagents.add_reagent("nutriment",10) - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user,proximity) - if(!proximity) return - if(istype(O,/obj/structure/sink) && !wrapped) - user << "You place [src] under a stream of water..." - user.drop_item() - loc = get_turf(O) - return Expand() - ..() - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user) - if(wrapped) - Unwrap(user) - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand() - visible_message("[src] expands!") - new /mob/living/carbon/monkey(get_turf(src)) - qdel(src) - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user) - icon_state = "monkeycube" - desc = "Just add water!" - user << "You unwrap the cube." - wrapped = 0 - - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped - desc = "Still wrapped in some paper." - icon_state = "monkeycubewrap" - wrapped = 1 - -/obj/item/weapon/reagent_containers/food/snacks/enchiladas - name = "enchiladas" - desc = "Viva La Mexico!" - icon_state = "enchiladas" - -/obj/item/weapon/reagent_containers/food/snacks/enchiladas/New() - ..() - reagents.add_reagent("nutriment",8) - reagents.add_reagent("capsaicin", 6) - bitesize = 4 - -/obj/item/weapon/reagent_containers/food/snacks/stew - name = "stew" - desc = "A nice and warm stew. Healthy and strong." - icon_state = "stew" - trash = /obj/item/trash/snack_bowl - -/obj/item/weapon/reagent_containers/food/snacks/stew/New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("imidazoline", 5) - reagents.add_reagent("water", 5) - bitesize = 10 - -/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat - name = "stewed soy meat" - desc = "Even non-vegetarians will LOVE this!" - icon_state = "stewedsoymeat" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat/New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/carrotfries - name = "carrot fries" - desc = "Tasty fries from fresh Carrots." - icon_state = "carrotfries" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/carrotfries/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("imidazoline", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/candiedapple - name = "candied apple" - desc = "An apple coated in sugary sweetness." - icon_state = "candiedapple" - -/obj/item/weapon/reagent_containers/food/snacks/candiedapple/New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 3 - -/* -/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore - name = "Boiled slime Core" - desc = "A boiled red thing." - icon_state = "boiledslimecore" - -/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore/New() - ..() - reagents.add_reagent("slimejelly", 5) - bitesize = 3 -*/ -/obj/item/weapon/reagent_containers/food/snacks/mint - name = "mint" - desc = "it is only wafer thin." - icon_state = "mint" - -/obj/item/weapon/reagent_containers/food/snacks/mint/New() - ..() - reagents.add_reagent("minttoxin", 1) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit - name = "plump helmet biscuit" - desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour." - icon_state = "phelmbiscuit" - -/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() - ..() - if(prob(10)) - name = "exceptional plump helmet biscuit" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 5) - bitesize = 2 - else - reagents.add_reagent("nutriment", 5) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/chawanmushi - name = "chawanmushi" - desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat." - icon_state = "chawanmushi" - trash = /obj/item/trash/snack_bowl - -/obj/item/weapon/reagent_containers/food/snacks/chawanmushi/New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/appletart - name = "golden apple streusel tart" - desc = "A tasty dessert that won't make it through a metal detector." - icon_state = "gappletart" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/appletart/New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("gold", 5) - bitesize = 3 +//All foods (except slicable, since they have unique procs) are distributed among various categories. Use common sense. /////////////////////////////////////////////////Sliceable//////////////////////////////////////// // All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels @@ -1278,115 +265,4 @@ name = "watermelon slice" desc = "A slice of watery goodness." icon_state = "watermelonslice" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cracker - name = "cracker" - desc = "It's a salted cracker." - icon_state = "cracker" - -/obj/item/weapon/reagent_containers/food/snacks/cracker/New() - ..() - reagents.add_reagent("nutriment", 1) - - -////////////////////////////////FOOD ADDITIONS//////////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/snacks/wrap - name = "egg wrap" - desc = "The precursor to Pigs in a Blanket." - icon_state = "wrap" - -/obj/item/weapon/reagent_containers/food/snacks/wrap/New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/beans - name = "tin of beans" - desc = "Musical fruit in a slightly less musical container." - icon_state = "beans" - -/obj/item/weapon/reagent_containers/food/snacks/beans/New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/hotdog - name = "hotdog" - desc = "Fresh footlong ready to go down on." - icon_state = "hotdog" - -/obj/item/weapon/reagent_containers/food/snacks/hotdog/New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("ketchup", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/meatbun - name = "meat bun" - desc = "Has the potential to not be Dog." - icon_state = "meatbun" - -/obj/item/weapon/reagent_containers/food/snacks/meatbun/New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/sugarcookie - name = "sugar cookie" - desc = "Just like your little sister used to make." - icon_state = "sugarcookie" - -/obj/item/weapon/reagent_containers/food/snacks/sugarcookie/New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sugar", 5) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg - name = "boiled spider leg" - desc = "A giant spider's leg that's still twitching after being cooked. Gross!" - icon_state = "spiderlegcooked" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg/New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("toxin", 2) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/spidereggs - name = "spider eggs" - desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health." - icon_state = "spidereggs" - -/obj/item/weapon/reagent_containers/food/snacks/spidereggs/New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("toxin", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/spidereggsham - name = "green eggs and ham" - desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?" - icon_state = "spidereggsham" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/spidereggsham/New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("toxin", 3) - bitesize = 4 - -/obj/item/weapon/reagent_containers/food/snacks/sashimi - name = "carp sashimi" - desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself." - icon_state = "sashimi" - -/obj/item/weapon/reagent_containers/food/snacks/sashimi/New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("toxin", 5) - bitesize = 3 + bitesize = 2 \ No newline at end of file diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm new file mode 100644 index 00000000000..fccf13f8e11 --- /dev/null +++ b/code/modules/food&drinks/food/snacks_egg.dm @@ -0,0 +1,132 @@ + +////////////////////////////////////////////EGGS//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/chocolateegg + name = "chocolate egg" + desc = "Such, sweet, fattening food." + icon_state = "chocolateegg" + +/obj/item/weapon/reagent_containers/food/snacks/chocolateegg/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sugar", 2) + reagents.add_reagent("coco", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/egg + name = "egg" + desc = "An egg!" + icon_state = "egg" + +/obj/item/weapon/reagent_containers/food/snacks/egg/New() + ..() + reagents.add_reagent("nutriment", 1) + +/obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) + ..() + new/obj/effect/decal/cleanable/egg_smudge(src.loc) + reagents.reaction(hit_atom, TOUCH) + del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes. + +/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype( W, /obj/item/toy/crayon )) + var/obj/item/toy/crayon/C = W + var/clr = C.colourName + + if(!(clr in list("blue", "green", "mime", "orange", "purple", "rainbow", "red", "yellow"))) + usr << "[src] refuses to take on this colour!" + return + + usr << "You colour [src] [clr]." + icon_state = "egg-[clr]" + item_color = clr + else + ..() + +/obj/item/weapon/reagent_containers/food/snacks/egg/blue + icon_state = "egg-blue" + item_color = "blue" + +/obj/item/weapon/reagent_containers/food/snacks/egg/green + icon_state = "egg-green" + item_color = "green" + +/obj/item/weapon/reagent_containers/food/snacks/egg/mime + icon_state = "egg-mime" + item_color = "mime" + +/obj/item/weapon/reagent_containers/food/snacks/egg/orange + icon_state = "egg-orange" + item_color = "orange" + +/obj/item/weapon/reagent_containers/food/snacks/egg/purple + icon_state = "egg-purple" + item_color = "purple" + +/obj/item/weapon/reagent_containers/food/snacks/egg/rainbow + icon_state = "egg-rainbow" + item_color = "rainbow" + +/obj/item/weapon/reagent_containers/food/snacks/egg/red + icon_state = "egg-red" + item_color = "red" + +/obj/item/weapon/reagent_containers/food/snacks/egg/yellow + icon_state = "egg-yellow" + item_color = "yellow" + +/obj/item/weapon/reagent_containers/food/snacks/friedegg + name = "fried egg" + desc = "A fried egg, with a touch of salt and pepper." + icon_state = "friedegg" + +/obj/item/weapon/reagent_containers/food/snacks/friedegg/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("blackpepper", 1) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/boiledegg + name = "boiled egg" + desc = "A hard boiled egg." + icon_state = "egg" + +/obj/item/weapon/reagent_containers/food/snacks/boiledegg/New() + ..() + reagents.add_reagent("nutriment", 2) + +/obj/item/weapon/reagent_containers/food/snacks/omelette //FUCK THIS + name = "omelette du fromage" + desc = "That's all you can say!" + icon_state = "omelette" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/omelette/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/omelette/attackby(obj/item/weapon/W, mob/user) + if(istype(W,/obj/item/weapon/kitchen/utensil/fork)) + if(W.icon_state == "forkloaded") + user << "You already have omelette on your fork." + return + W.icon_state = "forkloaded" + user.visible_message( \ + "[user] takes a piece of omelette with their fork!", \ + "You take a piece of omelette with your fork!" \ + ) + reagents.remove_reagent("nutriment", 1) + if(reagents.total_volume <= 0) + qdel(src) + +/obj/item/weapon/reagent_containers/food/snacks/benedict + name = "eggs benedict" + desc = "There is only one egg on this, how rude." + icon_state = "benedict" + +/obj/item/weapon/reagent_containers/food/snacks/benedict/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 3 diff --git a/code/modules/food&drinks/food/snacks_meat.dm b/code/modules/food&drinks/food/snacks_meat.dm new file mode 100644 index 00000000000..2402a138050 --- /dev/null +++ b/code/modules/food&drinks/food/snacks_meat.dm @@ -0,0 +1,346 @@ +//Not only meat, actually, but also snacks that are almost meat, such as fish meat or tofu + + +////////////////////////////////////////////FISH//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/cubancarp + name = "\improper Cuban carp" + desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!" + icon_state = "cubancarp" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/cubancarp/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("carpotoxin", 3) + reagents.add_reagent("capsaicin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/carpmeat + name = "carp fillet" + desc = "A fillet of spess carp meat." + icon_state = "fishfillet" + +/obj/item/weapon/reagent_containers/food/snacks/carpmeat/New() + ..() + eatverb = pick("bite","chew","choke down","gnaw","swallow","chomp") + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("carpotoxin", 3) + bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/carpmeat/imitation + name = "imitation carp fillet" + desc = "Almost just like the real thing, kinda." + +/obj/item/weapon/reagent_containers/food/snacks/fishfingers + name = "fish fingers" + desc = "A finger of fish." + icon_state = "fishfingers" + +/obj/item/weapon/reagent_containers/food/snacks/fishfingers/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/fishandchips + name = "fish and chips" + desc = "I do say so myself chap." + icon_state = "fishandchips" + +/obj/item/weapon/reagent_containers/food/snacks/fishandchips/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 + +////////////////////////////////////////////MEATS AND ALIKE//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/tofu + name = "tofu" + desc = "We all love tofu." + icon_state = "tofu" + +/obj/item/weapon/reagent_containers/food/snacks/tofu/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 3 + + +/obj/item/weapon/reagent_containers/food/snacks/tomatomeat + name = "tomato slice" + desc = "A slice from a huge tomato." + icon_state = "tomatomeat" + +/obj/item/weapon/reagent_containers/food/snacks/tomatomeat/New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/bearmeat + name = "bear meat" + desc = "A very manly slab of meat." + icon_state = "bearmeat" + +/obj/item/weapon/reagent_containers/food/snacks/bearmeat/New() + ..() + reagents.add_reagent("nutriment", 12) + reagents.add_reagent("hyperzine", 5) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/xenomeat + name = "meat" + desc = "A slab of meat" + icon_state = "xenomeat" + +/obj/item/weapon/reagent_containers/food/snacks/xenomeat/New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/spidermeat + name = "spider meat" + desc = "A slab of spider meat." + icon_state = "spidermeat" + +/obj/item/weapon/reagent_containers/food/snacks/spidermeat/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("toxin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/spiderleg + name = "spider leg" + desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?" + icon_state = "spiderleg" + +/obj/item/weapon/reagent_containers/food/snacks/spiderleg/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("toxin", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cornedbeef + name = "corned beef and cabbage" + desc = "Now you can feel like a real tourist vacationing in Ireland." + icon_state = "cornedbeef" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/cornedbeef/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/faggot + name = "faggot" + desc = "A great meal all round. Not a cord of wood." + icon_state = "faggot" + +/obj/item/weapon/reagent_containers/food/snacks/faggot/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sausage + name = "sausage" + desc = "A piece of mixed, long meat." + icon_state = "sausage" + +/obj/item/weapon/reagent_containers/food/snacks/sausage/New() + ..() + eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp") + reagents.add_reagent("nutriment", 6) + bitesize = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/wingfangchu + name = "wing fang chu" + desc = "A savory dish of alien wing wang in soy." + icon_state = "wingfangchu" + trash = /obj/item/trash/snack_bowl + +/obj/item/weapon/reagent_containers/food/snacks/wingfangchu/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/human/kebab + name = "-kebab" + icon_state = "kebab" + desc = "A human meat, on a stick." + trash = /obj/item/stack/rods + +/obj/item/weapon/reagent_containers/food/snacks/human/kebab/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/monkeykebab + name = "meat-kebab" + icon_state = "kebab" + desc = "Delicious meat, on a stick." + trash = /obj/item/stack/rods + +/obj/item/weapon/reagent_containers/food/snacks/monkeykebab/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/tofukebab + name = "tofu-kebab" + icon_state = "kebab" + desc = "Vegan meat, on a stick." + trash = /obj/item/stack/rods + +/obj/item/weapon/reagent_containers/food/snacks/tofukebab/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/meatsteak + name = "meat steak" + desc = "A piece of hot spicy meat." + icon_state = "meatsteak" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/meatsteak/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("blackpepper", 1) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube + name = "monkey cube" + desc = "Just add water!" + icon_state = "monkeycube" + bitesize = 12 + wrapped = 0 + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/New() + ..() + reagents.add_reagent("nutriment",10) + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user,proximity) + if(!proximity) return + if(istype(O,/obj/structure/sink) && !wrapped) + user << "You place [src] under a stream of water..." + user.drop_item() + loc = get_turf(O) + return Expand() + ..() + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user) + if(wrapped) + Unwrap(user) + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand() + visible_message("[src] expands!") + new /mob/living/carbon/monkey(get_turf(src)) + qdel(src) + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user) + icon_state = "monkeycube" + desc = "Just add water!" + user << "You unwrap the cube." + wrapped = 0 + + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped + desc = "Still wrapped in some paper." + icon_state = "monkeycubewrap" + wrapped = 1 + +/obj/item/weapon/reagent_containers/food/snacks/enchiladas + name = "enchiladas" + desc = "Viva La Mexico!" + icon_state = "enchiladas" + +/obj/item/weapon/reagent_containers/food/snacks/enchiladas/New() + ..() + reagents.add_reagent("nutriment",8) + reagents.add_reagent("capsaicin", 6) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/stew + name = "stew" + desc = "A nice and warm stew. Healthy and strong." + icon_state = "stew" + trash = /obj/item/trash/snack_bowl + +/obj/item/weapon/reagent_containers/food/snacks/stew/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("tomatojuice", 5) + reagents.add_reagent("imidazoline", 5) + reagents.add_reagent("water", 5) + bitesize = 10 + +/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat + name = "stewed soy meat" + desc = "Even non-vegetarians will LOVE this!" + icon_state = "stewedsoymeat" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 8) + bitesize = 2 + + +/* No more of this +/obj/item/weapon/reagent_containers/food/snacks/telebacon + name = "tele bacon" + desc = "It tastes a little odd but it is still delicious." + icon_state = "bacon" + var/obj/item/device/radio/beacon/bacon/baconbeacon + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/telebacon/New() + ..() + reagents.add_reagent("nutriment", 4) + baconbeacon = new /obj/item/device/radio/beacon/bacon(src) +/obj/item/weapon/reagent_containers/food/snacks/telebacon/On_Consume() + if(!reagents.total_volume) + baconbeacon.loc = usr + baconbeacon.digest_delay() +*/ + + +/obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg + name = "boiled spider leg" + desc = "A giant spider's leg that's still twitching after being cooked. Gross!" + icon_state = "spiderlegcooked" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("toxin", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/spidereggsham + name = "green eggs and ham" + desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?" + icon_state = "spidereggsham" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/spidereggsham/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("toxin", 3) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/sashimi + name = "carp sashimi" + desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself." + icon_state = "sashimi" + +/obj/item/weapon/reagent_containers/food/snacks/sashimi/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("toxin", 5) + bitesize = 3 diff --git a/code/modules/food&drinks/food/snacks_other.dm b/code/modules/food&drinks/food/snacks_other.dm new file mode 100644 index 00000000000..4a4380cfeea --- /dev/null +++ b/code/modules/food&drinks/food/snacks_other.dm @@ -0,0 +1,232 @@ + +////////////////////////////////////////////OTHER//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/candy_corn + name = "candy corn" + desc = "It's a handful of candy corn. Can be stored in a detective's hat." + icon_state = "candy_corn" + +/obj/item/weapon/reagent_containers/food/snacks/candy_corn/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sugar", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chocolatebar + name = "chocolate bar" + desc = "Such, sweet, fattening food." + icon_state = "chocolatebarunwrapped" + wrapped = 0 + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sugar", 2) + reagents.add_reagent("coco", 2) + +/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/attack_self(mob/user) + if(wrapped) + Unwrap(user) + else + ..() + +/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/proc/Unwrap(mob/user) + icon_state = "chocolatebarunwrapped" + desc = "It won't make you all sticky." + user << "You remove the foil." + wrapped = 0 + + +/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/wrapped + desc = "It's wrapped in some foil." + icon_state = "chocolatebar" + wrapped = 1 + +/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice + name = "huge mushroom slice" + desc = "A slice from a huge mushroom." + icon_state = "hugemushroomslice" + +/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 3 + + +/obj/item/weapon/reagent_containers/food/snacks/popcorn + name = "popcorn" + desc = "Now let's find some cinema." + icon_state = "popcorn" + trash = /obj/item/trash/popcorn + var/unpopped = 0 + +/obj/item/weapon/reagent_containers/food/snacks/popcorn/New() + ..() + eatverb = pick("bite","crunch","nibble","gnaw","gobble","chomp") + unpopped = rand(1,10) + reagents.add_reagent("nutriment", 2) + bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 + +/obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume() + if(prob(unpopped)) //lol ...what's the point? << AINT SO POINTLESS NO MORE + usr << "You bite down on an un-popped kernel, and it hurts your teeth!" + unpopped = max(0, unpopped-1) + reagents.add_reagent("sacid",0.1) //only a little tingle. + ..() + +/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato + name = "loaded baked potato" + desc = "Totally baked." + icon_state = "loadedbakedpotato" + +/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/fries + name = "space fries" + desc = "AKA: French Fries, Freedom Fries, etc." + icon_state = "fries" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/fries/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/soydope + name = "soy dope" + desc = "Dope from a soy." + icon_state = "soydope" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/soydope/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cheesyfries + name = "cheesy fries" + desc = "Fries. Covered in cheese. Duh." + icon_state = "cheesyfries" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/cheesyfries/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/badrecipe + name = "burned mess" + desc = "Someone should be demoted from chef for this." + icon_state = "badrecipe" + +/obj/item/weapon/reagent_containers/food/snacks/badrecipe/New() + ..() + eatverb = pick("choke down","nibble","gnaw","chomp") + reagents.add_reagent("toxin", 1) + reagents.add_reagent("carbon", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff + name = "spacy liberty duff" + desc = "Jello gelatin, from Alfred Hubbard's cookbook." + icon_state = "spacylibertyduff" + trash = /obj/item/trash/snack_bowl + +/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("mushroomhallucinogen", 6) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/amanitajelly + name = "amanita jelly" + desc = "Looks curiously toxic." + icon_state = "amanitajelly" + trash = /obj/item/trash/snack_bowl + +/obj/item/weapon/reagent_containers/food/snacks/amanitajelly/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("amatoxin", 6) + reagents.add_reagent("mushroomhallucinogen", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/carrotfries + name = "carrot fries" + desc = "Tasty fries from fresh Carrots." + icon_state = "carrotfries" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/carrotfries/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("imidazoline", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/candiedapple + name = "candied apple" + desc = "An apple coated in sugary sweetness." + icon_state = "candiedapple" + +/obj/item/weapon/reagent_containers/food/snacks/candiedapple/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 3 + +/* +/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore + name = "Boiled slime Core" + desc = "A boiled red thing." + icon_state = "boiledslimecore" + +/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore/New() + ..() + reagents.add_reagent("slimejelly", 5) + bitesize = 3 +*/ +/obj/item/weapon/reagent_containers/food/snacks/mint + name = "mint" + desc = "it is only wafer thin." + icon_state = "mint" + +/obj/item/weapon/reagent_containers/food/snacks/mint/New() + ..() + reagents.add_reagent("minttoxin", 1) + bitesize = 1 + +////////////////////////////////FOOD ADDITIONS//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/wrap + name = "egg wrap" + desc = "The precursor to Pigs in a Blanket." + icon_state = "wrap" + +/obj/item/weapon/reagent_containers/food/snacks/wrap/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/beans + name = "tin of beans" + desc = "Musical fruit in a slightly less musical container." + icon_state = "beans" + +/obj/item/weapon/reagent_containers/food/snacks/beans/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spidereggs + name = "spider eggs" + desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health." + icon_state = "spidereggs" + +/obj/item/weapon/reagent_containers/food/snacks/spidereggs/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("toxin", 3) + bitesize = 2 diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food&drinks/food/snacks_pastry.dm new file mode 100644 index 00000000000..1c55584b00b --- /dev/null +++ b/code/modules/food&drinks/food/snacks_pastry.dm @@ -0,0 +1,309 @@ +//Pastry is a food that is made from dough which is made from wheat or rye flour. +//This file contains pastries that don't fit any existing categories. + +////////////////////////////////////////////DONUTS//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/donut + name = "donut" + icon_state = "donut1" + +/obj/item/weapon/reagent_containers/food/snacks/donut/normal + desc = "Goes great with Robust Coffee." + +/obj/item/weapon/reagent_containers/food/snacks/donut/normal/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + src.bitesize = 3 + if(prob(30)) + src.icon_state = "donut2" + src.name = "frosted donut" + reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos + name = "chaos donut" + desc = "Like life, it never quite tastes the same." + +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sprinkles", 1) + bitesize = 10 + switch(rand(1,10)) + if(1) + reagents.add_reagent("nutriment", 3) + if(2) + reagents.add_reagent("capsaicin", 3) + if(3) + reagents.add_reagent("frostoil", 3) + if(4) + reagents.add_reagent("sprinkles", 3) + if(5) + reagents.add_reagent("plasma", 3) + if(6) + reagents.add_reagent("coco", 3) + if(7) + reagents.add_reagent("slimejelly", 3) + if(8) + reagents.add_reagent("banana", 3) + if(9) + reagents.add_reagent("berryjuice", 3) + if(10) + reagents.add_reagent("tricordrazine", 3) + if(prob(30)) + icon_state = "donut2" + name = "frosted chaos donut" + reagents.add_reagent("sprinkles", 2) + + +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly + name = "jelly donut" + desc = "You jelly?" + icon_state = "jdonut1" + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("berryjuice", 5) + if(prob(30)) + icon_state = "jdonut2" + name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly + name = "jelly donut" + desc = "You jelly?" + icon_state = "jdonut1" + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("slimejelly", 5) + bitesize = 5 + if(prob(30)) + icon_state = "jdonut2" + name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly + name = "jelly donut" + desc = "You jelly?" + icon_state = "jdonut1" + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("cherryjelly", 5) + if(prob(30)) + icon_state = "jdonut2" + name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) + + +////////////////////////////////////////////MUFFINS//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/muffin + name = "muffin" + desc = "A delicious and spongy little cake." + icon_state = "muffin" + +/obj/item/weapon/reagent_containers/food/snacks/muffin/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/muffin/berry + name = "berry muffin" + icon_state = "berrymuffin" + desc = "A delicious and spongy little cake, with berries." + +/obj/item/weapon/reagent_containers/food/snacks/muffin/booberry + name = "booberry muffin" + icon_state = "berrymuffin" + alpha = 125 + desc = "My stomach is a graveyard! No living being can quench my bloodthirst!" + +/obj/item/weapon/reagent_containers/food/snacks/chawanmushi + name = "chawanmushi" + desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat." + icon_state = "chawanmushi" + trash = /obj/item/trash/snack_bowl + +/obj/item/weapon/reagent_containers/food/snacks/chawanmushi/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 1 +////////////////////////////////////////////WAFFLES//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/waffles + name = "waffles" + desc = "Mmm, waffles." + icon_state = "waffles" + trash = /obj/item/trash/waffles + +/obj/item/weapon/reagent_containers/food/snacks/waffles/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/soylentgreen + name = "\improper Soylent Green" + desc = "Not made of people. Honest." //Totally people. + icon_state = "soylent_green" + trash = /obj/item/trash/waffles + +/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/soylenviridians + name = "\improper Soylent Virdians" + desc = "Not made of people. Honest." //Actually honest for once. + icon_state = "soylent_yellow" + trash = /obj/item/trash/waffles + +/obj/item/weapon/reagent_containers/food/snacks/soylenviridians/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles + name = "roffle waffles" + desc = "Waffles from Roffle. Co." + icon_state = "rofflewaffles" + trash = /obj/item/trash/waffles + +/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("mushroomhallucinogen", 8) + bitesize = 4 + +////////////////////////////////////////////OTHER//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/cookie + name = "cookie" + desc = "COOKIE!!!" + icon_state = "COOKIE!!!" + +/obj/item/weapon/reagent_containers/food/snacks/cookie/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket + name = "\improper Donk-pocket" + desc = "The food of choice for the seasoned traitor." + icon_state = "donkpocket" + var/warm = 0 + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket/New() + ..() + reagents.add_reagent("nutriment", 4) + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket/proc/cooltime() //Not working, derp? + if(warm) + spawn(4200) //ew + warm = 0 + reagents.del_reagent("tricordrazine") + name = initial(name) + return + +/obj/item/weapon/reagent_containers/food/snacks/fortunecookie + name = "fortune cookie" + desc = "A true prophecy in each cookie!" + icon_state = "fortune_cookie" + +/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/poppypretzel + name = "poppy pretzel" + desc = "It's all twisted up!" + icon_state = "poppypretzel" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/poppypretzel/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit + name = "plump helmet biscuit" + desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour." + icon_state = "phelmbiscuit" + +/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() + ..() + if(prob(10)) + name = "exceptional plump helmet biscuit" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("tricordrazine", 5) + bitesize = 2 + else + reagents.add_reagent("nutriment", 5) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/appletart + name = "golden apple streusel tart" + desc = "A tasty dessert that won't make it through a metal detector." + icon_state = "gappletart" + trash = /obj/item/trash/plate + +/obj/item/weapon/reagent_containers/food/snacks/appletart/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("gold", 5) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/cracker + name = "cracker" + desc = "It's a salted cracker." + icon_state = "cracker" + +/obj/item/weapon/reagent_containers/food/snacks/cracker/New() + ..() + reagents.add_reagent("nutriment", 1) + +/obj/item/weapon/reagent_containers/food/snacks/hotdog + name = "hotdog" + desc = "Fresh footlong ready to go down on." + icon_state = "hotdog" + +/obj/item/weapon/reagent_containers/food/snacks/hotdog/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("ketchup", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/meatbun + name = "meat bun" + desc = "Has the potential to not be Dog." + icon_state = "meatbun" + +/obj/item/weapon/reagent_containers/food/snacks/meatbun/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/sugarcookie + name = "sugar cookie" + desc = "Just like your little sister used to make." + icon_state = "sugarcookie" + +/obj/item/weapon/reagent_containers/food/snacks/sugarcookie/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sugar", 5) + bitesize = 2 \ No newline at end of file diff --git a/code/modules/food&drinks/food/snacks_pies.dm b/code/modules/food&drinks/food/snacks_pie.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_pies.dm rename to code/modules/food&drinks/food/snacks_pie.dm diff --git a/code/modules/food&drinks/food/snacks_salad.dm b/code/modules/food&drinks/food/snacks_salad.dm new file mode 100644 index 00000000000..8b8cb86b799 --- /dev/null +++ b/code/modules/food&drinks/food/snacks_salad.dm @@ -0,0 +1,38 @@ +//this category is very little but I think that it has great potential to grow +////////////////////////////////////////////SALAD//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/aesirsalad + name = "\improper Aesir salad" + desc = "Probably too incredible for mortal men to fully enjoy." + icon_state = "aesirsalad" + trash = /obj/item/trash/snack_bowl + +/obj/item/weapon/reagent_containers/food/snacks/aesirsalad/New() + ..() + eatverb = pick("crunch","devour","nibble","gnaw","gobble","chomp") + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("tricordrazine", 8) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/herbsalad + name = "herb salad" + desc = "A tasty salad with apples on top." + icon_state = "herbsalad" + trash = /obj/item/trash/snack_bowl + +/obj/item/weapon/reagent_containers/food/snacks/herbsalad/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/validsalad + name = "valid salad" + desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it." + icon_state = "validsalad" + trash = /obj/item/trash/snack_bowl + +/obj/item/weapon/reagent_containers/food/snacks/validsalad/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("doctorsdelight", 5) + bitesize = 3 \ No newline at end of file diff --git a/code/modules/food&drinks/food/snacks_vend.dm b/code/modules/food&drinks/food/snacks_vend.dm new file mode 100644 index 00000000000..465c33d925e --- /dev/null +++ b/code/modules/food&drinks/food/snacks_vend.dm @@ -0,0 +1,81 @@ +////////////////////////////////////////////SNACKS FROM VENDING MACHINES//////////////////////////////////////////// +//in other words: junk food +//don't even bother looking for recipes for these + +/obj/item/weapon/reagent_containers/food/snacks/candy + name = "candy" + desc = "Nougat love it or hate it." + icon_state = "candy" + trash = /obj/item/trash/candy + +/obj/item/weapon/reagent_containers/food/snacks/candy/New() + ..() + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("sugar", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sosjerky + name = "\improper Scaredy's Private Reserve Beef Jerky" + icon_state = "sosjerky" + desc = "Beef jerky made from the finest space cows." + trash = /obj/item/trash/sosjerky + +/obj/item/weapon/reagent_containers/food/snacks/sosjerky/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chips + name = "chips" + desc = "Commander Riker's What-The-Crisps" + icon_state = "chips" + trash = /obj/item/trash/chips + +/obj/item/weapon/reagent_containers/food/snacks/chips/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/no_raisin + name = "4no raisins" + icon_state = "4no_raisins" + desc = "Best raisins in the universe. Not sure why." + trash = /obj/item/trash/raisins + +/obj/item/weapon/reagent_containers/food/snacks/no_raisin/New() + ..() + reagents.add_reagent("nutriment", 6) + +/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie + name = "space twinkie" + icon_state = "space_twinkie" + desc = "Guaranteed to survive longer than you will." + +/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie/New() + ..() + reagents.add_reagent("sugar", 4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers + name = "cheesie honkers" + desc = "Bite sized cheesie snacks that will honk all over your mouth." + icon_state = "cheesie_honkers" + trash = /obj/item/trash/cheesie + +/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/syndicake + name = "syndi-cakes" + icon_state = "syndi_cakes" + desc = "An extremely moist snack cake that tastes just as good after being nuked." + trash = /obj/item/trash/syndi_cakes + +/obj/item/weapon/reagent_containers/food/snacks/syndicake/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("doctorsdelight", 5) + bitesize = 3 + diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm index c43c4bec814..654b4c9c7d9 100644 --- a/code/modules/food&drinks/kitchen machinery/gibber.dm +++ b/code/modules/food&drinks/kitchen machinery/gibber.dm @@ -110,7 +110,7 @@ set name = "empty gibber" set src in oview(1) - if (usr.stat != 0) + if(usr.stat || !usr.canmove || usr.restrained()) return src.go_out() add_fingerprint(usr) diff --git a/code/modules/food&drinks/kitchen machinery/juicer.dm b/code/modules/food&drinks/kitchen machinery/juicer.dm index 80ba39354a3..94696028027 100644 --- a/code/modules/food&drinks/kitchen machinery/juicer.dm +++ b/code/modules/food&drinks/kitchen machinery/juicer.dm @@ -126,7 +126,7 @@ set category = "Object" set name = "Detach Beaker from the juicer" set src in oview(1) - if (usr.stat != 0) + if(usr.stat || !usr.canmove || usr.restrained()) return if (!beaker) return diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm index 247b6721383..b44170fd2da 100644 --- a/code/modules/food&drinks/kitchen machinery/microwave.dm +++ b/code/modules/food&drinks/kitchen machinery/microwave.dm @@ -122,11 +122,12 @@ return 1 else if(istype(O, /obj/item/weapon/soap/)) // If they're trying to clean it then let them + var/obj/item/weapon/soap/P = O user.visible_message( \ "[user] starts to clean the microwave.", \ "You start to clean the microwave." \ ) - if (do_after(user,20)) + if (do_after(user, P.cleanspeed)) user.visible_message( \ "[user] has cleaned the microwave.", \ "You have cleaned the microwave." \ diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm index 7ec3d44356e..8ef77de2a02 100644 --- a/code/modules/food&drinks/kitchen machinery/processor.dm +++ b/code/modules/food&drinks/kitchen machinery/processor.dm @@ -157,7 +157,7 @@ set name = "Eject Contents" set src in oview(1) - if (usr.stat != 0) + if(usr.stat || !usr.canmove || usr.restrained()) return src.empty() add_fingerprint(usr) diff --git a/code/modules/food&drinks/recipes/microwave/recipes.dm b/code/modules/food&drinks/recipes/microwave/recipes.dm index 17c76c10d25..4bf797f5bf7 100644 --- a/code/modules/food&drinks/recipes/microwave/recipes.dm +++ b/code/modules/food&drinks/recipes/microwave/recipes.dm @@ -1,334 +1,6 @@ // see code/datums/recipe.dm -////////////////////////////////////////////////EGG RECIPE's//////////////////////////////////////////////// - -/datum/recipe/egg/fried - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg - ) - result = /obj/item/weapon/reagent_containers/food/snacks/friedegg - -/datum/recipe/egg/boiled - reagents = list("water" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg - ) - result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg - -/datum/recipe/egg/omelette - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/omelette - -/datum/recipe/egg/chocolate - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/chocolatebar, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/chocolateegg - -/datum/recipe/egg/benedict - items = list( - /obj/item/weapon/reagent_containers/food/snacks/friedegg, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak, - /obj/item/weapon/reagent_containers/food/snacks/breadslice, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/benedict - -////////////////////////////////////////////////DONUTS//////////////////////////////////////////////// - -/datum/recipe/donut - reagents = list("flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/normal - -/datum/recipe/donut/jelly - reagents = list("berryjuice" = 5, "flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly - -/datum/recipe/donut/jelly/slime - reagents = list("slimejelly" = 5, "flour" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly - -/datum/recipe/donut/jelly/cherry - reagents = list("cherryjelly" = 5, "flour" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly - -/datum/recipe/chaosdonut - reagents = list("frostoil" = 5, "capsaicin" = 5, "flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/chaos - - -////////////////////////////////////////////////WAFFLES//////////////////////////////////////////////// - -/datum/recipe/waffles - reagents = list("flour" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/egg, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/waffles - - -/datum/recipe/waffles/soylenviridians - reagents = list("flour" = 15) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans - ) - result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians - -/datum/recipe/waffles/soylentgreen - reagents = list("flour" = 15) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat/human, - /obj/item/weapon/reagent_containers/food/snacks/meat/human, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen - - -/datum/recipe/waffles/roffle - reagents = list("mushroomhallucinogen" = 5, "flour" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/egg, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles - - -////////////////////////////////////////////////DONKPOCCKETS//////////////////////////////////////////////// - -/datum/recipe/donkpocket - reagents = list("flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/faggot, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL - proc/warm_up(var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked) - being_cooked.warm = 1 - being_cooked.reagents.add_reagent("tricordrazine", 5) - being_cooked.bitesize = 6 - being_cooked.name = "Warm " + being_cooked.name - being_cooked.cooltime() - make_food(var/obj/container as obj) - var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked = ..(container) - warm_up(being_cooked) - return being_cooked - -/datum/recipe/donkpocket/warm - reagents = list() //This is necessary since this is a child object of the above recipe and we don't want donk pockets to need flour - items = list( - /obj/item/weapon/reagent_containers/food/snacks/donkpocket - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL - make_food(var/obj/container as obj) - var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked = locate() in container - if(being_cooked && !being_cooked.warm) - warm_up(being_cooked) - return being_cooked - - -////////////////////////////////////////////////MUFFINS//////////////////////////////////////////////// - -/datum/recipe/muffin - reagents = list("milk" = 5, "flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/muffin - -/datum/recipe/muffin/berry - reagents = list("milk" = 5, "flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/grown/berries - ) - result = /obj/item/weapon/reagent_containers/food/snacks/muffin/berry - -/datum/recipe/muffin/booberry - reagents = list("milk" = 5, "flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/grown/berries, - /obj/item/weapon/ectoplasm - ) - result = /obj/item/weapon/reagent_containers/food/snacks/muffin/booberry - -/datum/recipe/muffin/chawanmushi - reagents = list("water" = 5, "soysauce" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/chawanmushi - - - -////////////////////////////////////////////////KEBABS NO REMOVE//////////////////////////////////////////////// - -/datum/recipe/kebab/human - items = list( - /obj/item/stack/rods, - /obj/item/weapon/reagent_containers/food/snacks/meat/human, - /obj/item/weapon/reagent_containers/food/snacks/meat/human, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/human/kebab - -/datum/recipe/kebab/monkey - items = list( - /obj/item/stack/rods, - /obj/item/weapon/reagent_containers/food/snacks/meat/monkey, - /obj/item/weapon/reagent_containers/food/snacks/meat/monkey, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/monkeykebab - -/datum/recipe/kebab/tofu - items = list( - /obj/item/stack/rods, - /obj/item/weapon/reagent_containers/food/snacks/tofu, - /obj/item/weapon/reagent_containers/food/snacks/tofu, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/tofukebab - -////////////////////////////////////////////////FISH//////////////////////////////////////////////// - -/datum/recipe/carpmeat - reagents = list("carpotoxin" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/tofu - ) - result = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/imitation - -/datum/recipe/cubancarp - reagents = list("flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/chili, - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/cubancarp - -/datum/recipe/fishandchips - items = list( - /obj/item/weapon/reagent_containers/food/snacks/fries, - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/fishandchips - -/datum/recipe/fishfingers - reagents = list("flour" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers - -/datum/recipe/sashimi - reagents = list("soysauce" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/spidereggs, - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sashimi - -////////////////////////////////////////////////PIZZA!!!//////////////////////////////////////////////// - -/datum/recipe/pizza/margherita - reagents = list("flour" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita - -/datum/recipe/pizza/meat - reagents = list("flour" = 10) - 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/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza - -/datum/recipe/pizza/mushroom - reagents = list("flour" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza - -/datum/recipe/pizza/vegetable - reagents = list("flour" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant, - /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, - /obj/item/weapon/reagent_containers/food/snacks/grown/corn, - /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza - - - -////////////////////////////////////////////////SALADS//////////////////////////////////////////////// - -/datum/recipe/salad/herb - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, - /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, - /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, - /obj/item/weapon/reagent_containers/food/snacks/grown/apple, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad - make_food(var/obj/container as obj) - var/obj/item/weapon/reagent_containers/food/snacks/herbsalad/being_cooked = ..(container) - being_cooked.reagents.del_reagent("toxin") - return being_cooked - -/datum/recipe/salad/aesir - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, - /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, - /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, - /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/aesirsalad - -/datum/recipe/salad/valid - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, - /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, - /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, - /obj/item/weapon/reagent_containers/food/snacks/grown/potato, - /obj/item/weapon/reagent_containers/food/snacks/faggot, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/validsalad - make_food(var/obj/container as obj) - var/obj/item/weapon/reagent_containers/food/snacks/validsalad/being_cooked = ..(container) - being_cooked.reagents.del_reagent("toxin") - return being_cooked - ////////////////////////////////////////////////FOOD ADDITTIONS//////////////////////////////////////////////// /datum/recipe/wrap @@ -347,62 +19,8 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/beans -/datum/recipe/hotdog - reagents = list("ketchup" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/breadslice, - /obj/item/weapon/reagent_containers/food/snacks/sausage, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/hotdog - -/datum/recipe/meatbun - reagents = list("soysauce" = 5, "flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/faggot, - /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/meatbun - -/datum/recipe/sugarcookie - reagents = list("flour" = 5, "sugar" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie - -/datum/recipe/boiledspiderleg - reagents = list("water" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/spiderleg, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg - -/datum/recipe/spidereggsham - reagents = list("sodiumchloride" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/spidereggs, - /obj/item/weapon/reagent_containers/food/snacks/spidermeat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/spidereggsham - ////////////////////////////////////////////////MISC RECIPE's//////////////////////////////////////////////// -/datum/recipe/cornedbeef - reagents = list("sodiumchloride" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage, - /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/cornedbeef - -/datum/recipe/wingfangchu - reagents = list("soysauce" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/xenomeat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/wingfangchu - /datum/recipe/loadedbakedpotato items = list( /obj/item/weapon/reagent_containers/food/snacks/grown/potato, @@ -423,28 +41,6 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/popcorn -/datum/recipe/fortunecookie - reagents = list("flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/paper, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie -/datum/recipe/fortunecookie/make_food(var/obj/container as obj) - var/obj/item/weapon/paper/paper = locate() in container - paper.loc = null //prevent deletion - var/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/being_cooked = ..(container) - paper.loc = being_cooked - being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn - return being_cooked - -/datum/recipe/meatsteak - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat - ) - result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak - /datum/recipe/spacylibertyduff reagents = list("water" = 5, "vodka" = 5) items = list( @@ -467,73 +63,9 @@ being_cooked.reagents.del_reagent("amatoxin") return being_cooked -/datum/recipe/enchiladas - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/grown/chili, - /obj/item/weapon/reagent_containers/food/snacks/grown/chili, - /obj/item/weapon/reagent_containers/food/snacks/grown/corn, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas - -/datum/recipe/stew - reagents = list("water" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/grown/potato, - /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, - /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant, - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/stew - -/datum/recipe/stewedsoymeat - items = list( - /obj/item/weapon/reagent_containers/food/snacks/soydope, - /obj/item/weapon/reagent_containers/food/snacks/soydope, - /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, - /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat - -/datum/recipe/poppypretzel - reagents = list("flour" = 5) - items = list( - /obj/item/seeds/poppyseed, - /obj/item/weapon/reagent_containers/food/snacks/egg, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel - /datum/recipe/candiedapple reagents = list("water" = 5, "sugar" = 5) items = list( /obj/item/weapon/reagent_containers/food/snacks/grown/apple ) result = /obj/item/weapon/reagent_containers/food/snacks/candiedapple - -/datum/recipe/sausage - items = list( - /obj/item/weapon/reagent_containers/food/snacks/faggot, - /obj/item/weapon/reagent_containers/food/snacks/meat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sausage - -/datum/recipe/plumphelmetbiscuit - reagents = list("flour" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit - -/datum/recipe/appletart - reagents = list("sugar" = 5, "milk" = 5, "flour" = 15) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/appletart - -/datum/recipe/cracker - reagents = list("flour" = 5, "sodiumchloride" = 1) - result = /obj/item/weapon/reagent_containers/food/snacks/cracker diff --git a/code/modules/food&drinks/recipes/microwave/recipes_burgers.dm b/code/modules/food&drinks/recipes/microwave/recipes_burger.dm similarity index 100% rename from code/modules/food&drinks/recipes/microwave/recipes_burgers.dm rename to code/modules/food&drinks/recipes/microwave/recipes_burger.dm diff --git a/code/modules/food&drinks/recipes/microwave/recipes_cakes.dm b/code/modules/food&drinks/recipes/microwave/recipes_cake.dm similarity index 100% rename from code/modules/food&drinks/recipes/microwave/recipes_cakes.dm rename to code/modules/food&drinks/recipes/microwave/recipes_cake.dm diff --git a/code/modules/food&drinks/recipes/microwave/recipes_egg.dm b/code/modules/food&drinks/recipes/microwave/recipes_egg.dm new file mode 100644 index 00000000000..7797053ffbf --- /dev/null +++ b/code/modules/food&drinks/recipes/microwave/recipes_egg.dm @@ -0,0 +1,40 @@ + +////////////////////////////////////////////////EGG RECIPE's//////////////////////////////////////////////// + +/datum/recipe/egg/fried + reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg + ) + result = /obj/item/weapon/reagent_containers/food/snacks/friedegg + +/datum/recipe/egg/boiled + reagents = list("water" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg + ) + result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg + +/datum/recipe/egg/omelette + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/omelette + +/datum/recipe/egg/chocolate + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/chocolateegg + +/datum/recipe/egg/benedict + items = list( + /obj/item/weapon/reagent_containers/food/snacks/friedegg, + /obj/item/weapon/reagent_containers/food/snacks/meatsteak, + /obj/item/weapon/reagent_containers/food/snacks/breadslice, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/benedict diff --git a/code/modules/food&drinks/recipes/microwave/recipes_meat.dm b/code/modules/food&drinks/recipes/microwave/recipes_meat.dm new file mode 100644 index 00000000000..81506429ae0 --- /dev/null +++ b/code/modules/food&drinks/recipes/microwave/recipes_meat.dm @@ -0,0 +1,145 @@ + +////////////////////////////////////////////////KEBABS NO REMOVE//////////////////////////////////////////////// + +/datum/recipe/kebab/human + items = list( + /obj/item/stack/rods, + /obj/item/weapon/reagent_containers/food/snacks/meat/human, + /obj/item/weapon/reagent_containers/food/snacks/meat/human, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/human/kebab + +/datum/recipe/kebab/monkey + items = list( + /obj/item/stack/rods, + /obj/item/weapon/reagent_containers/food/snacks/meat/monkey, + /obj/item/weapon/reagent_containers/food/snacks/meat/monkey, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/monkeykebab + +/datum/recipe/kebab/tofu + items = list( + /obj/item/stack/rods, + /obj/item/weapon/reagent_containers/food/snacks/tofu, + /obj/item/weapon/reagent_containers/food/snacks/tofu, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/tofukebab + +////////////////////////////////////////////////FISH//////////////////////////////////////////////// + +/datum/recipe/carpmeat + reagents = list("carpotoxin" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/tofu + ) + result = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/imitation + +/datum/recipe/cubancarp + reagents = list("flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/chili, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cubancarp + +/datum/recipe/fishandchips + items = list( + /obj/item/weapon/reagent_containers/food/snacks/fries, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/fishandchips + +/datum/recipe/fishfingers + reagents = list("flour" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers + +/datum/recipe/sashimi + reagents = list("soysauce" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/spidereggs, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sashimi + +////////////////////////////////////////////////MR SPIDER//////////////////////////////////////////////// + +/datum/recipe/boiledspiderleg + reagents = list("water" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/spiderleg, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg + +/datum/recipe/spidereggsham + reagents = list("sodiumchloride" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/spidereggs, + /obj/item/weapon/reagent_containers/food/snacks/spidermeat, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/spidereggsham + +////////////////////////////////////////////////MISC RECIPE's//////////////////////////////////////////////// + +/datum/recipe/cornedbeef + reagents = list("sodiumchloride" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage, + /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cornedbeef + +/datum/recipe/wingfangchu + reagents = list("soysauce" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/xenomeat, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/wingfangchu + +/datum/recipe/meatsteak + reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak + +/datum/recipe/enchiladas + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/grown/chili, + /obj/item/weapon/reagent_containers/food/snacks/grown/chili, + /obj/item/weapon/reagent_containers/food/snacks/grown/corn, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas + +/datum/recipe/stew + reagents = list("water" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/grown/potato, + /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, + /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/stew + +/datum/recipe/stewedsoymeat + items = list( + /obj/item/weapon/reagent_containers/food/snacks/soydope, + /obj/item/weapon/reagent_containers/food/snacks/soydope, + /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat + +/datum/recipe/sausage + items = list( + /obj/item/weapon/reagent_containers/food/snacks/faggot, + /obj/item/weapon/reagent_containers/food/snacks/meat, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sausage diff --git a/code/modules/food&drinks/recipes/microwave/recipes_pastry.dm b/code/modules/food&drinks/recipes/microwave/recipes_pastry.dm new file mode 100644 index 00000000000..f4a37c243bb --- /dev/null +++ b/code/modules/food&drinks/recipes/microwave/recipes_pastry.dm @@ -0,0 +1,200 @@ + +////////////////////////////////////////////////DONUTS//////////////////////////////////////////////// + +/datum/recipe/donut + reagents = list("flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg + ) + result = /obj/item/weapon/reagent_containers/food/snacks/donut/normal + +/datum/recipe/donut/jelly + reagents = list("berryjuice" = 5, "flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg + ) + result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly + +/datum/recipe/donut/jelly/slime + reagents = list("slimejelly" = 5, "flour" = 5) + result = /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly + +/datum/recipe/donut/jelly/cherry + reagents = list("cherryjelly" = 5, "flour" = 5) + result = /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly + +/datum/recipe/chaosdonut + reagents = list("frostoil" = 5, "capsaicin" = 5, "flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg + ) + result = /obj/item/weapon/reagent_containers/food/snacks/donut/chaos + + +////////////////////////////////////////////////WAFFLES//////////////////////////////////////////////// + +/datum/recipe/waffles + reagents = list("flour" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/egg, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/waffles + + +/datum/recipe/waffles/soylenviridians + reagents = list("flour" = 15) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans + ) + result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians + +/datum/recipe/waffles/soylentgreen + reagents = list("flour" = 15) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat/human, + /obj/item/weapon/reagent_containers/food/snacks/meat/human, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen + + +/datum/recipe/waffles/roffle + reagents = list("mushroomhallucinogen" = 5, "flour" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/egg, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles + +////////////////////////////////////////////////DONKPOCCKETS//////////////////////////////////////////////// + +/datum/recipe/donkpocket + reagents = list("flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/faggot, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL + proc/warm_up(var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked) + being_cooked.warm = 1 + being_cooked.reagents.add_reagent("tricordrazine", 5) + being_cooked.bitesize = 6 + being_cooked.name = "Warm " + being_cooked.name + being_cooked.cooltime() + make_food(var/obj/container as obj) + var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked = ..(container) + warm_up(being_cooked) + return being_cooked + +/datum/recipe/donkpocket/warm + reagents = list() //This is necessary since this is a child object of the above recipe and we don't want donk pockets to need flour + items = list( + /obj/item/weapon/reagent_containers/food/snacks/donkpocket + ) + result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL + make_food(var/obj/container as obj) + var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked = locate() in container + if(being_cooked && !being_cooked.warm) + warm_up(being_cooked) + return being_cooked + +////////////////////////////////////////////////MUFFINS//////////////////////////////////////////////// + +/datum/recipe/muffin + reagents = list("milk" = 5, "flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/muffin + +/datum/recipe/muffin/berry + reagents = list("milk" = 5, "flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/grown/berries + ) + result = /obj/item/weapon/reagent_containers/food/snacks/muffin/berry + +/datum/recipe/muffin/booberry + reagents = list("milk" = 5, "flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/grown/berries, + /obj/item/weapon/ectoplasm + ) + result = /obj/item/weapon/reagent_containers/food/snacks/muffin/booberry + +/datum/recipe/muffin/chawanmushi + reagents = list("water" = 5, "soysauce" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/chawanmushi + +////////////////////////////////////////////OTHER//////////////////////////////////////////// + +/datum/recipe/hotdog + reagents = list("ketchup" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/breadslice, + /obj/item/weapon/reagent_containers/food/snacks/sausage, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/hotdog + +/datum/recipe/meatbun + reagents = list("soysauce" = 5, "flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/faggot, + /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/meatbun + +/datum/recipe/sugarcookie + reagents = list("flour" = 5, "sugar" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie + +/datum/recipe/fortunecookie + reagents = list("flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/paper, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie +/datum/recipe/fortunecookie/make_food(var/obj/container as obj) + var/obj/item/weapon/paper/paper = locate() in container + paper.loc = null //prevent deletion + var/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/being_cooked = ..(container) + paper.loc = being_cooked + being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn + return being_cooked + +/datum/recipe/poppypretzel + reagents = list("flour" = 5) + items = list( + /obj/item/seeds/poppyseed, + /obj/item/weapon/reagent_containers/food/snacks/egg, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel + +/datum/recipe/plumphelmetbiscuit + reagents = list("flour" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit + +/datum/recipe/appletart + reagents = list("sugar" = 5, "milk" = 5, "flour" = 15) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/appletart + +/datum/recipe/cracker + reagents = list("flour" = 5, "sodiumchloride" = 1) + result = /obj/item/weapon/reagent_containers/food/snacks/cracker diff --git a/code/modules/food&drinks/recipes/microwave/recipes_pies.dm b/code/modules/food&drinks/recipes/microwave/recipes_pie.dm similarity index 100% rename from code/modules/food&drinks/recipes/microwave/recipes_pies.dm rename to code/modules/food&drinks/recipes/microwave/recipes_pie.dm diff --git a/code/modules/food&drinks/recipes/microwave/recipes_pizza.dm b/code/modules/food&drinks/recipes/microwave/recipes_pizza.dm new file mode 100644 index 00000000000..6aee67ae111 --- /dev/null +++ b/code/modules/food&drinks/recipes/microwave/recipes_pizza.dm @@ -0,0 +1,47 @@ + +////////////////////////////////////////////////PIZZA!!!//////////////////////////////////////////////// + +/datum/recipe/pizza/margherita + reagents = list("flour" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita + +/datum/recipe/pizza/meat + reagents = list("flour" = 10) + 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/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza + +/datum/recipe/pizza/mushroom + reagents = list("flour" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza + +/datum/recipe/pizza/vegetable + reagents = list("flour" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant, + /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, + /obj/item/weapon/reagent_containers/food/snacks/grown/corn, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza + + diff --git a/code/modules/food&drinks/recipes/microwave/recipes_salad.dm b/code/modules/food&drinks/recipes/microwave/recipes_salad.dm new file mode 100644 index 00000000000..2ad41f702e8 --- /dev/null +++ b/code/modules/food&drinks/recipes/microwave/recipes_salad.dm @@ -0,0 +1,37 @@ +////////////////////////////////////////////////SALADS//////////////////////////////////////////////// + +/datum/recipe/salad/herb + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, + /obj/item/weapon/reagent_containers/food/snacks/grown/apple, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad + make_food(var/obj/container as obj) + var/obj/item/weapon/reagent_containers/food/snacks/herbsalad/being_cooked = ..(container) + being_cooked.reagents.del_reagent("toxin") + return being_cooked + +/datum/recipe/salad/aesir + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, + /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/aesirsalad + +/datum/recipe/salad/valid + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, + /obj/item/weapon/reagent_containers/food/snacks/grown/potato, + /obj/item/weapon/reagent_containers/food/snacks/faggot, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/validsalad + make_food(var/obj/container as obj) + var/obj/item/weapon/reagent_containers/food/snacks/validsalad/being_cooked = ..(container) + being_cooked.reagents.del_reagent("toxin") + return being_cooked \ No newline at end of file diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index dce78028dd3..511c5807572 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -127,6 +127,9 @@ if("void") dat += "
    Error: No growns inside.
    Please, put growns into reactor.
    " menustat = "menu" + if("nobeakerspace") + dat += "
    Not enough space left in container. Unable to create product.
    " + menustat = "menu" if(beaker) dat += "
    Biomass: [points] units.

    " dat += "ActivateDetach Container" @@ -203,13 +206,20 @@ updateUsrDialog() return 0 +/obj/machinery/biogenerator/proc/check_container_volume(var/reagent_amount) + if(beaker.reagents.total_volume + reagent_amount > beaker.reagents.maximum_volume) + menustat = "nobeakerspace" + return 1 + /obj/machinery/biogenerator/proc/create_product(var/create) switch(create) if("milk") - if (check_cost(20/efficiency)) return 0 + if(check_container_volume(10)) return 0 + else if (check_cost(20/efficiency)) return 0 else beaker.reagents.add_reagent("milk",10) if("cream") - if (check_cost(30/efficiency)) return 0 + if(check_container_volume(10)) return 0 + else if (check_cost(30/efficiency)) return 0 else beaker.reagents.add_reagent("cream",10) if("meat") if (check_cost(250/efficiency)) return 0 @@ -278,12 +288,11 @@ else if(href_list["create"]) var/amount = (text2num(href_list["amount"])) var/i = amount - var/cost = (text2num(href_list["cost"])) var/C = href_list["create"] if(i <= 0) return while(i >= 1) - create_product(C, cost, i) + create_product(C) i-- updateUsrDialog() diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 7cad50f8d9d..0919fe955ac 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -461,14 +461,20 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f icon_state = "binder" anchored = 1 density = 1 + var/busy = 0 /obj/machinery/bookbinder/attackby(var/obj/O as obj, var/mob/user as mob) if(istype(O, /obj/item/weapon/paper)) + if(busy) + user << "The book binder is busy. Please wait for completion of previous operation." + return user.drop_item() O.loc = src user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].") src.visible_message("[src] begins to hum as it warms up its printing drums.") + busy = 1 sleep(rand(200,400)) + busy = 0 src.visible_message("[src] whirs as it prints and binds a new book.") var/obj/item/weapon/book/b = new(src.loc) b.dat = O:info diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index fbc21838808..9ee25e2f3db 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -232,17 +232,18 @@ var/list/prize_list = list( new /datum/data/mining_equipment("Stimpack MediPen", /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, 50), new /datum/data/mining_equipment("Leporazine MediPen", /obj/item/weapon/reagent_containers/hypospray/medipen/leporazine, 50), + new /datum/data/mining_equipment("MediPen Bundle", /obj/item/weapon/storage/box/medipens/utility, 200), new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100), new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 200), new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 250), - new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 400), + new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 300), new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 400), new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 450), new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone/, 500), + new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 650), + new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 650), new /datum/data/mining_equipment("Sonic Jackhammer", /obj/item/weapon/pickaxe/jackhammer, 800), - new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 1000), - new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 1000), new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000), new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 2000), new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 5000), @@ -470,7 +471,7 @@ icon = 'icons/obj/items.dmi' icon_state = "resonator" item_state = "resonator" - desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vaccuum." + desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum." w_class = 3 force = 10 throwforce = 10 diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 82ec0a9e4fa..c39d03f38ac 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -99,7 +99,7 @@ new/turf/simulated/floor/plating/asteroid/airless/cave(src) if("Gibtonite") M = new/turf/simulated/mineral/gibtonite(src) - if("Clown") + if("Bananium") M = new/turf/simulated/mineral/clown(src) /*if("Adamantine") M = new/turf/simulated/mineral/adamantine(src)*/ @@ -178,7 +178,7 @@ /turf/simulated/mineral/clown name = "bananium deposit" icon_state = "rock_Clown" - mineralName = "Clown" + mineralName = "Bananium" mineralAmt = 3 spreadChance = 0 spread = 0 @@ -416,7 +416,7 @@ new /obj/item/weapon/ore/plasma(src) if (src.mineralName == "Diamond") new /obj/item/weapon/ore/diamond(src) - if (src.mineralName == "Clown") + if (src.mineralName == "Bananium") new /obj/item/weapon/ore/bananium(src) var/turf/simulated/floor/plating/asteroid/airless/N = ChangeTurf(/turf/simulated/floor/plating/asteroid/airless) N.fullUpdateMineralOverlays() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9274b09145d..f7da665c052 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -293,3 +293,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return 1 +//this is a mob verb instead of atom for performance reasons +//see /mob/verb/examinate() in mob.dm for more info +//overriden here and in /mob/living for different point span classes and sanity checks +/mob/dead/observer/pointed(atom/A as mob|obj|turf in view()) + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index bc11bcd2490..aa64f72e5b1 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -229,6 +229,9 @@ var/const/MAX_ACTIVE_TIME = 400 /proc/CanHug(var/mob/M) + if(M.stat == DEAD) + return 0 + if(iscorgi(M) || ismonkey(M)) return 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index beea8cfa2e3..b98ad128879 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -499,6 +499,7 @@ if(R) if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/hud/security/sunglasses)) if(setcriminal != "Cancel") + investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", "records") R.fields["criminal"] = setcriminal spawn() @@ -721,7 +722,7 @@ return(gain) /mob/living/carbon/human/singularity_pull(S, current_size) - if(current_size >= 5) + if(current_size >= STAGE_THREE) var/list/handlist = list(l_hand, r_hand) for(var/obj/item/hand in handlist) if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 80cfc7010cb..a54e388c7f6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -229,3 +229,95 @@ emp_act L.take_damage(0,5) src.Stun(5) ..() + + +/mob/living/carbon/human/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) + var/list/damaged = list() + + if(head) + if(!head.unacidable) + head.acid_act(acidpwr) + update_inv_head() + else + src << "Your [head.name] protects your head from the acid!" + else + if(wear_mask) + if(!wear_mask.unacidable) + wear_mask.acid_act(acidpwr) + update_inv_wear_mask() + else + src << "Your [wear_mask.name] protects your head from the acid!" + else + if(glasses) + if(!glasses.unacidable) + glasses.acid_act(acidpwr) + update_inv_glasses() + else + src << "Your [glasses.name] protects your head from the acid!" + else + . = get_organ("head") + if(.) + damaged += . + + if(wear_suit) + if(!wear_suit.unacidable) + wear_suit.acid_act(acidpwr) + update_inv_wear_suit() + else + src << "Your [wear_suit.name] protects your body from the acid!" + else + if(w_uniform) + if(!w_uniform.unacidable) + w_uniform.acid_act(acidpwr) + update_inv_w_uniform() + else + src << "Your [w_uniform.name] protects your body from the acid!" + else + . = get_organ("chest") + if(.) + damaged += . + + if(gloves) + if(!gloves.unacidable) + gloves.acid_act(acidpwr) + update_inv_gloves() + else + src << "Your [gloves.name] protects your arms from the acid!" + else + . = get_organ("r_arm") + if(.) + damaged += . + . = get_organ("l_arm") + if(.) + damaged += . + + + if(shoes) + if(!shoes.unacidable) + shoes.acid_act(acidpwr) + update_inv_shoes() + else + src << "Your [shoes.name] protects your legs from the acid!" + else + . = get_organ("r_leg") + if(.) + damaged += . + . = get_organ("l_leg") + if(.) + damaged += . + + + for(var/obj/item/organ/limb/affecting in damaged) + affecting.take_damage(4*toxpwr, 2*toxpwr) + + if(affecting.name == "head") + affecting.take_damage(4*toxpwr, 2*toxpwr) + if(prob(2*acidpwr)) //Applies disfigurement + emote("scream") + facial_hair_style = "Shaved" + hair_style = "Bald" + update_hair() + status_flags |= DISFIGURED + + update_damage_overlays() + diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 9a7dea0277d..82628f186a9 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -410,3 +410,16 @@ /mob/living/carbon/monkey/SpeciesCanConsume() return 1 // Monkeys can eat, drink, and be forced to do so + + +/mob/living/carbon/monkey/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) + if(wear_mask) + if(!wear_mask.unacidable) + wear_mask.acid_act(acidpwr) + update_inv_wear_mask() + else + src << "Your mask protects you from the acid." + return + + if(!unacidable) + take_organ_damage(min(6*toxpwr, acid_volume * toxpwr)) diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm index d6b41afbee2..0693aaba88f 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -51,6 +51,8 @@ else src << "Unusable emote '[act]'. Say *help for a list." if ((message && src.stat == 0)) + if(client) + log_emote("[name]/[key] : [message]") if (m_type & 1) visible_message(message) else diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index e805dd595ea..5982e83a054 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -236,6 +236,9 @@ /mob/living/carbon/slime/unEquip(obj/item/W as obj) return +/mob/living/carbon/slime/start_pulling(var/atom/movable/AM) + return + /mob/living/carbon/slime/attack_ui(slot) return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ada80a01043..a566eeea566 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -10,6 +10,27 @@ ..() del(src) +//mob verbs are a lot faster than object verbs +//for more info on why this is not atom/pull, see examinate() in mob.dm +/mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) + set name = "Pull" + set category = "Object" + + if(AM.Adjacent(src)) + src.start_pulling(AM) + return + +//same as above +/mob/living/pointed(atom/A as mob|obj|turf in view()) + if(src.stat || !src.canmove || src.restrained()) + return 0 + if(src.status_flags & FAKEDEATH) + return 0 + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 + /mob/living/verb/succumb(var/whispered as null) set hidden = 1 if (InCritical()) @@ -640,7 +661,7 @@ /mob/living/singularity_pull(S) step_towards(src,S) -mob/living/proc/do_attack_animation() +/mob/living/proc/do_attack_animation() var/pixel_x_diff = 0 var/pixel_y_diff = 0 switch(src.dir) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index e903b7cef30..b063e139c50 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -106,4 +106,9 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I) adjust_fire_stacks(0.5) IgniteMob() -//Mobs on Fire end \ No newline at end of file +//Mobs on Fire end + + +/mob/living/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) + if(!unacidable) + take_organ_damage(min(6*toxpwr, acid_volume * toxpwr)) \ 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 f4f1e8f1761..b70d03a9f31 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -364,7 +364,7 @@ var/list/ai_list = list() return if (href_list["callbot"]) //Command a bot to move to a selected location. - Bot = locate(href_list["callbot"]) in machines + Bot = locate(href_list["callbot"]) in aibots if(!Bot || Bot.remote_disabled || src.control_disabled) return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. waypoint_mode = 1 @@ -372,7 +372,7 @@ var/list/ai_list = list() return if (href_list["interface"]) //Remotely connect to a bot! - Bot = locate(href_list["interface"]) in machines + Bot = locate(href_list["interface"]) in aibots if(!Bot || Bot.remote_disabled || src.control_disabled) return Bot.attack_ai(src) @@ -492,7 +492,7 @@ var/list/ai_list = list() d += "Query network status
    " d += "" - for (Bot in machines) + for (Bot in aibots) if(Bot.z == ai_Zlevel && !Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected! bot_area = get_area(Bot) d += "" diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index c11523d239a..3e8094711de 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -9,6 +9,7 @@ /mob/living/silicon/pai/var/list/available_software = list( "crew manifest" = 5, "digital messenger" = 5, + "chatroom client" = 5, "medical records" = 15, "security records" = 15, //"camera jack" = 10, @@ -66,6 +67,8 @@ left_part = src.softwareCamera() if("signaller") left_part = src.softwareSignal() + if("chatroom") + src.chatroom() //snowflake? maybe, but it's less effort this way //usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc @@ -276,6 +279,8 @@ for(var/s in src.software) if(s == "digital messenger") dat += "Digital Messenger
    " + if(s == "chatroom client") + dat += "Chatroom Client
    " if(s == "crew manifest") dat += "Crew Manifest
    " if(s == "medical records") @@ -631,4 +636,9 @@ dat += "" dat += "

    " dat += "Messages:
    [pda.tnote]" - return dat \ No newline at end of file + return dat + +/mob/living/silicon/pai/proc/chatroom() + + pda.mode = 5 + pda.attack_self() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index d287923bb74..da2ab42e4d7 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -201,6 +201,7 @@ src << "Unusable emote '[act]'. Say *help for a list." if ((message && src.stat == 0)) + log_emote("[name]/[key] : [message]") if (m_type & 1) visible_message(message) else diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e8d7317a179..a721180b723 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -397,29 +397,30 @@ return if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") + user.changeNext_move(CLICK_CD_MELEE) var/obj/item/weapon/weldingtool/WT = W if (src == user) user << "You lack the reach to be able to repair yourself." - return + return 1 if (src.health >= src.maxHealth) user << "[src] is already in good condition." - return - if (WT.remove_fuel(0)) + return 1 + if (WT.remove_fuel(0, user)) adjustBruteLoss(-30) updatehealth() add_fingerprint(user) - for(var/mob/O in viewers(user, null)) - O.show_message(text("[user] has fixed some of the dents on [src]!"), 1) + visible_message("[user] has fixed some of the dents on [src].") + return 0 else - return + user << "The welder must be on for this task." + return 1 else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) var/obj/item/stack/cable_coil/coil = W if (coil.use(1)) adjustFireLoss(-30) updatehealth() - for(var/mob/O in viewers(user, null)) - O.show_message(text("[user] has fixed some of the burnt wires on [src]!"), 1) + visible_message("[user] has fixed some of the burnt wires on [src].") else user << "You need one length of cable to repair [src]." @@ -478,6 +479,23 @@ user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!") deconstruct() + else if(istype(W, /obj/item/weapon/aiModule)) + var/obj/item/weapon/aiModule/MOD = W + if(!opened) + user << "You need access to the robot's insides to do that." + return + if(wiresexposed) + user << "You need to close the wire panel to do that." + return + if(!cell) + user << "You need to install a power cell to do that." + return + if(emagged || (connected_ai && lawupdate)) //Can't be sure which, metagamers + emote("buzz-[user.name]") + return + MOD.install(src, user) //Proc includes a success mesage so we don't need another one + return + else if(istype(W, /obj/item/device/encryptionkey/) && opened) if(radio)//sanityyyyyy radio.attackby(W,user)//GTFO, you have your own procs @@ -521,6 +539,7 @@ sleep(6) if(prob(50)) SetEmagged(1) + SetLockdown(1) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown lawupdate = 0 connected_ai = null user << "You emag [src]'s interface." @@ -548,6 +567,7 @@ src << "Obey these laws:" laws.show_laws(src) src << "ALERT: [user.real_name] is your new master. Obey your new laws and their commands." + SetLockdown(0) updateicon() else user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface." diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index d9c1b5f16bd..43b0a8dc7dd 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -161,6 +161,7 @@ modules += new /obj/item/weapon/storage/bag/trash/cyborg(src) modules += new /obj/item/weapon/mop/cyborg(src) modules += new /obj/item/device/lightreplacer/cyborg(src) + modules += new /obj/item/weapon/holosign_creator(src) emag = new /obj/item/weapon/reagent_containers/spray(src) emag.reagents.add_reagent("lube", 250) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 02d5be17d96..0ea87f92744 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -79,6 +79,8 @@ var/next_mob_id = 0 /mob/visible_message(var/message, var/self_message, var/blind_message) for(var/mob/M in viewers(src)) + if(M.see_invisible < invisibility) + continue //can't view the invisible var/msg = message if(self_message && M==src) msg = self_message @@ -92,10 +94,6 @@ var/next_mob_id = 0 for(var/mob/M in viewers(src)) M.show_message( message, 1, blind_message, 2) - - - - // Show a message to all mobs in earshot of this one // This would be for audible actions by the src mob // message is the message output to anyone who can hear. @@ -296,32 +294,61 @@ var/list/slot_equipment_priority = list( \ A.examine(src) //same as above +//note: ghosts can point, this is intended +//visible_message will handle invisibility properly +//overriden here and in /mob/dead/observer for different point span classes and sanity checks /mob/verb/pointed(atom/A as mob|obj|turf in view()) set name = "Point To" set category = "Object" - if(!src || !isturf(src.loc)) - return - if(src.stat || src.restrained()) - return - if(src.status_flags & FAKEDEATH) - return - if(!(A in view(src.loc))) - return + if(!src || !isturf(src.loc) || !(A in view(src.loc))) + return 0 if(istype(A, /obj/effect/decal/point)) - return + return 0 var/tile = get_turf(A) if (!tile) - return + return 0 var/obj/P = new /obj/effect/decal/point(tile) + P.invisibility = invisibility spawn (20) if(P) - P.loc = null + qdel(P) - usr.visible_message("[src] points to [A]") + return 1 +//this and stop_pulling really ought to be /mob/living procs +/mob/proc/start_pulling(var/atom/movable/AM) + if ( !AM || !src || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! + return + if (!( AM.anchored )) + AM.add_fingerprint(src) + + // If we're pulling something then drop what we're currently pulling and pull this instead. + if(pulling) + // Are we trying to pull something we are already pulling? Then just stop here, no need to continue. + if(AM == pulling) + return + stop_pulling() + + src.pulling = AM + AM.pulledby = src + if(ismob(AM)) + var/mob/M = AM + if(!iscarbon(src)) + M.LAssailant = null + else + M.LAssailant = usr + +/mob/verb/stop_pulling() + + set name = "Stop Pulling" + set category = "IC" + + if(pulling) + pulling.pulledby = null + pulling = null /mob/verb/mode() set name = "Activate Held Object" @@ -592,39 +619,6 @@ var/list/slot_equipment_priority = list( \ if(istype(M, /mob/living/silicon/ai)) return show_inv(usr) - -/mob/verb/stop_pulling() - - set name = "Stop Pulling" - set category = "IC" - - if(pulling) - pulling.pulledby = null - pulling = null - -/mob/proc/start_pulling(var/atom/movable/AM) - if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! - return - if (!( AM.anchored )) - AM.add_fingerprint(src) - - // If we're pulling something then drop what we're currently pulling and pull this instead. - if(pulling) - // Are we trying to pull something we are already pulling? Then just stop here, no need to continue. - if(AM == pulling) - return - stop_pulling() - - src.pulling = AM - AM.pulledby = src - if(ismob(AM)) - var/mob/M = AM - if(!iscarbon(src)) - M.LAssailant = null - else - M.LAssailant = usr - - /mob/proc/can_use_hands() return @@ -663,6 +657,7 @@ var/list/slot_equipment_priority = list( \ stat(null,"Mob-[master_controller.mobs_cost]\t#[mob_list.len]") stat(null,"Dis-[master_controller.diseases_cost]\t#[active_diseases.len]") stat(null,"Mch-[master_controller.machines_cost]\t#[machines.len]") + stat(null,"Bots-[master_controller.aibots_cost]\t#[aibots.len]") stat(null,"Obj-[master_controller.objects_cost]\t#[processing_objects.len]") stat(null,"Net-[master_controller.networks_cost]\tPnet-[master_controller.powernets_cost]") stat(null,"NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]") diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 441362e2711..8e0c5e07525 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -120,6 +120,8 @@ observer.loc = O.loc if(client.prefs.be_random_name) client.prefs.real_name = random_name(gender) + if(client.prefs.be_random_body) + client.prefs.random_character(gender) observer.real_name = client.prefs.real_name observer.name = observer.real_name observer.key = key diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index a0c5049aa11..0c60767621b 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -461,6 +461,18 @@ name = "Mega Eyebrows" icon_state = "hair_megaeyebrows" +/datum/sprite_accessory/hair/highponytail + name = "High Ponytail" + icon_state = "hair_highponytail" + +/datum/sprite_accessory/hair/longponytail + name = "Long Ponytail" + icon_state = "hair_longstraightponytail" + +/datum/sprite_accessory/hair/sidepartlongalt + name = "Long Side Part" + icon_state = "hair_longsidepart" + ///////////////////////////// // Facial Hair Definitions // ///////////////////////////// diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index d11418c2cf3..50a9481ce4f 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -7,7 +7,7 @@ /obj/item/weapon/paper name = "paper" - gender = PLURAL + gender = NEUTER icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper" throwforce = 0 @@ -66,6 +66,8 @@ set category = "Object" set src in usr + if(usr.stat || !usr.canmove || usr.restrained()) + return if((CLUMSY in usr.mutations) && prob(25)) usr << "You cut yourself on the paper! Ahhhh! Ahhhhh!" usr.damageoverlaytemp = 9001 diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 0f95787f418..a0f9aacbf13 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -73,7 +73,7 @@ var/n_name = copytext(sanitize(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text), 1, MAX_NAME_LEN) //loc.loc check is for making possible renaming photos in clipboards - if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0) + if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0 && usr.canmove && !usr.restrained()) name = "photo[(n_name ? text("- '[n_name]'") : null)]" add_fingerprint(usr) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 64c019aa87e..00861a03aec 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -34,6 +34,7 @@ By design, d1 is the smallest direction and d2 is the highest var/d2 = 1 // cable direction 2 (see above) layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 var/cable_color = "red" + var/obj/item/stack/cable_coil/stored /obj/structure/cable/yellow cable_color = "yellow" @@ -81,6 +82,9 @@ By design, d1 is the smallest direction and d2 is the highest if(level==1) hide(T.intact) cable_list += src //add it to the global cable list + if(d1) + stored = new/obj/item/stack/cable_coil(src,2,cable_color) + else stored = new/obj/item/stack/cable_coil(src,1,cable_color) /obj/structure/cable/Destroy() // called when a cable is deleted if(powernet) @@ -88,6 +92,11 @@ By design, d1 is the smallest direction and d2 is the highest cable_list -= src //remove it from global cable list ..() // then go ahead and delete the cable +/obj/structure/cable/Deconstruct() + var/turf/T = loc + stored.loc = T + ..() + /////////////////////////////////// // General procedures /////////////////////////////////// @@ -120,31 +129,18 @@ By design, d1 is the smallest direction and d2 is the highest // - Multitool : get the power currently passing through the cable // /obj/structure/cable/attackby(obj/item/W, mob/user) - var/turf/T = src.loc if(T.intact) return - if(istype(W, /obj/item/weapon/wirecutters)) - if (shock(user, 50)) return - - var/obj/newcable - if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long - newcable = new/obj/item/stack/cable_coil(T, 2, cable_color) - else - newcable = new/obj/item/stack/cable_coil(T, 1, cable_color) - visible_message("[user] cuts the cable.") - - newcable.add_fingerprint(user) + stored.add_fingerprint(user) investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires") - - qdel(src) + Deconstruct() return - else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) @@ -153,13 +149,10 @@ By design, d1 is the smallest direction and d2 is the highest coil.cable_join(src, user) else if(istype(W, /obj/item/device/multitool)) - if(powernet && (powernet.avail > 0)) // is it powered? user << "[powernet.avail]W in power network." - else user << "The cable is not powered." - shock(user, 5, 0.2) else @@ -187,15 +180,17 @@ By design, d1 is the smallest direction and d2 is the highest qdel(src) if(2.0) if (prob(50)) - new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color) - qdel(src) + Deconstruct() if(3.0) if (prob(25)) - new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color) - qdel(src) + Deconstruct() return +/obj/structure/cable/singularity_pull(S, current_size) + if(current_size >= STAGE_FIVE) + Deconstruct() + obj/structure/cable/proc/cableColor(var/colorC) var/color_n = "red" if(colorC) @@ -539,8 +534,9 @@ obj/structure/cable/proc/avail() set category = "Object" var/mob/M = usr - if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) - if(!istype(usr.loc,/turf)) return + if(ishuman(M) && !M.restrained() && !M.stat && M.canmove) + if(!istype(usr.loc,/turf)) + return if(src.amount <= 14) usr << "You need at least 15 lengths to make restraints!" return @@ -676,8 +672,7 @@ obj/structure/cable/proc/avail() if (C.shock(user, 50)) if (prob(50)) //fail - new/obj/item/stack/cable_coil(C.loc, 1, C.cable_color) - qdel(C) + C.Deconstruct() // called when cable_coil is click on an installed obj/cable // or click on a turf that already contains a "node" cable @@ -740,8 +735,7 @@ obj/structure/cable/proc/avail() if (NC.shock(user, 50)) if (prob(50)) //fail - new/obj/item/stack/cable_coil(NC.loc, 1, NC.cable_color) - qdel(NC) + NC.Deconstruct() return @@ -788,8 +782,7 @@ obj/structure/cable/proc/avail() if (C.shock(user, 50)) if (prob(50)) //fail - new/obj/item/stack/cable_coil(C.loc, 2, C.cable_color) - qdel(C) + C.Deconstruct() return C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets. diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index dc5a4cc8a06..b16142c5729 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -123,7 +123,6 @@ display round(lastgen) and plasmatank amount /obj/machinery/power/port_gen/pacman/RefreshParts() var/temp_rating = 0 - var/temp_reliability = 0 var/consumption_coeff = 0 for(var/obj/item/weapon/stock_parts/SP in component_parts) if(istype(SP, /obj/item/weapon/stock_parts/matter_bin)) @@ -132,9 +131,6 @@ display round(lastgen) and plasmatank amount temp_rating += SP.rating else consumption_coeff += SP.rating - for(var/obj/item/weapon/CP in component_parts) - temp_reliability += CP.reliability - reliability = min(round(temp_reliability / 4), 100) power_gen = round(initial(power_gen) * temp_rating * 2) consumption = consumption_coeff diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 30991698e7c..2360dbea18d 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -27,7 +27,9 @@ set category = "Object" set src in oview(1) - if (src.anchored || usr:stat) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if (src.anchored) usr << "It is fastened to the floor!" return 0 src.dir = turn(src.dir, 90) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 41c8d44135f..969f47d94bc 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -93,7 +93,9 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin set category = "Object" set src in oview(1) - if (src.anchored || usr:stat) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if (src.anchored) usr << "It is fastened to the floor!" return 0 src.dir = turn(src.dir, 270) @@ -104,7 +106,9 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin set category = "Object" set src in oview(1) - if (src.anchored || usr:stat) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if (src.anchored) usr << "It is fastened to the floor!" return 0 src.dir = turn(src.dir, 90) @@ -282,7 +286,9 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin set category = "Object" set src in oview(1) - if (src.anchored || usr:stat) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if (src.anchored) usr << "It is fastened to the floor!" return 0 src.dir = turn(src.dir, 270) @@ -293,7 +299,9 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin set category = "Object" set src in oview(1) - if (src.anchored || usr:stat) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if (src.anchored) usr << "It is fastened to the floor!" return 0 src.dir = turn(src.dir, 90) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index bda4903db44..17d92a8e8bd 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -41,7 +41,7 @@ /obj/machinery/singularity/Move(atom/newloc, direct) - if(current_size >= 9 || check_turfs_in(direct)) + if(current_size >= STAGE_FIVE || check_turfs_in(direct)) last_failed_movement = 0//Reset this because we moved return ..() else @@ -60,7 +60,7 @@ /obj/machinery/singularity/ex_act(severity) switch(severity) if(1.0) - if(current_size <= 3) + if(current_size <= STAGE_TWO) investigate_log("has been destroyed by a heavy explosion.","singulo") qdel(src) return @@ -92,7 +92,7 @@ dissipate() check_energy() - if(current_size >= 3) + if(current_size >= STAGE_TWO) move() pulse() if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit @@ -125,8 +125,8 @@ if(force_size) temp_allowed_size = force_size switch(temp_allowed_size) - if(1) - current_size = 1 + if(STAGE_ONE) + current_size = STAGE_ONE icon = 'icons/obj/singularity.dmi' icon_state = "singularity_s1" pixel_x = 0 @@ -136,8 +136,8 @@ dissipate_delay = 10 dissipate_track = 0 dissipate_strength = 1 - if(3)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them - current_size = 3 + if(STAGE_TWO)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them + current_size = STAGE_TWO icon = 'icons/effects/96x96.dmi' icon_state = "singularity_s3" pixel_x = -32 @@ -147,9 +147,9 @@ dissipate_delay = 5 dissipate_track = 0 dissipate_strength = 5 - if(5) + if(STAGE_THREE) if((check_turfs_in(1,2))&&(check_turfs_in(2,2))&&(check_turfs_in(4,2))&&(check_turfs_in(8,2))) - current_size = 5 + current_size = STAGE_THREE icon = 'icons/effects/160x160.dmi' icon_state = "singularity_s5" pixel_x = -64 @@ -159,9 +159,9 @@ dissipate_delay = 4 dissipate_track = 0 dissipate_strength = 20 - if(7) + if(STAGE_FOUR) if((check_turfs_in(1,3))&&(check_turfs_in(2,3))&&(check_turfs_in(4,3))&&(check_turfs_in(8,3))) - current_size = 7 + current_size = STAGE_FOUR icon = 'icons/effects/224x224.dmi' icon_state = "singularity_s7" pixel_x = -96 @@ -171,8 +171,8 @@ dissipate_delay = 10 dissipate_track = 0 dissipate_strength = 10 - if(9)//this one also lacks a check for gens because it eats everything - current_size = 9 + if(STAGE_FIVE)//this one also lacks a check for gens because it eats everything + current_size = STAGE_FIVE icon = 'icons/effects/288x288.dmi' icon_state = "singularity_s9" pixel_x = -128 @@ -196,15 +196,15 @@ return 0 switch(energy)//Some of these numbers might need to be changed up later -Mport if(1 to 199) - allowed_size = 1 + allowed_size = STAGE_ONE if(200 to 499) - allowed_size = 3 + allowed_size = STAGE_TWO if(500 to 999) - allowed_size = 5 + allowed_size = STAGE_THREE if(1000 to 1999) - allowed_size = 7 + allowed_size = STAGE_FOUR if(2000 to INFINITY) - allowed_size = 9 + allowed_size = STAGE_FIVE if(current_size != allowed_size) expand() return 1 @@ -249,15 +249,15 @@ var/steps = 0 if(!step) switch(current_size) - if(1) + if(STAGE_ONE) steps = 1 - if(3) + if(STAGE_TWO) steps = 3//Yes this is right - if(5) + if(STAGE_THREE) steps = 3 - if(7) + if(STAGE_FOUR) steps = 4 - if(9) + if(STAGE_FIVE) steps = 5 else steps = step diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index b61923d6b44..83d9d79b630 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -76,7 +76,7 @@ var/mob/M = usr var/input = stripped_input(M,"What do you want to name the gun?", ,"", MAX_NAME_LEN) - if(src && input && !M.stat && in_range(M,src)) + if(src && input && !M.stat && in_range(M,src) && !M.restrained() && M.canmove) name = input M << "You name the gun [input]. Say hello to your new friend." return 1 @@ -95,7 +95,7 @@ options["The Peacemaker"] = "detective_peacemaker" var/choice = input(M,"What do you want to skin the gun to?","Reskin Gun") in options - if(src && choice && !M.stat && in_range(M,src)) + if(src && choice && !M.stat && in_range(M,src) && !M.restrained() && M.canmove) icon_state = options[choice] M << "Your gun is now skinned as [choice]. Say hello to your new friend." return 1 diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 516700e63ce..224ed9334c4 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -113,7 +113,7 @@ damage = 15 damage_type = BRUTE flag = "bomb" - var/range = 2 + var/range = 3 obj/item/projectile/kinetic/New() var/turf/proj_turf = get_turf(src) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index b799a57ac5d..54ac5ceb84b 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -617,6 +617,7 @@ datum/reagent/ryetalyn/on_mob_life(var/mob/living/M as mob) M.mutations = list() M.disabilities = 0 M.sdisabilities = 0 + M.jitteriness = 0 // Might need to update appearance for hulk etc. if(needs_update && ishuman(M)) @@ -1088,7 +1089,7 @@ datum/reagent/alkysine/on_mob_life(var/mob/living/M as mob) datum/reagent/imidazoline name = "Imidazoline" id = "imidazoline" - description = "Heals eye damage" + description = "Heals eye damage." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 @@ -1102,6 +1103,20 @@ datum/reagent/imidazoline/on_mob_life(var/mob/living/M as mob) ..() return +datum/reagent/inacusiate + name = "Inacusiate" + id = "inacusiate" + description = "Heals ear damage." + reagent_state = LIQUID + color = "#6600FF" // rgb: 100, 165, 255 + +datum/reagent/inacusiate/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.ear_damage = 0 + M.ear_deaf = 0 + ..() + return + datum/reagent/bicaridine name = "Bicaridine" id = "bicaridine" @@ -1633,78 +1648,20 @@ datum/reagent/toxin/acid reagent_state = LIQUID color = "#DB5008" // rgb: 219, 80, 8 toxpwr = 1 - var/meltprob = 10 + var/acidpwr = 10 //the amount of protection removed from the armour -datum/reagent/toxin/acid/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//magic numbers everywhere - if(!istype(M, /mob/living)) +datum/reagent/toxin/acid/reaction_mob(var/mob/living/carbon/C, var/method=TOUCH, var/volume) + if(!istype(C)) return - if(method == TOUCH) - if(ishuman(M)) - var/mob/living/carbon/human/H = M + if(method != TOUCH) + if(!C.unacidable) + C.take_organ_damage(min(6*toxpwr, volume * toxpwr)) + return - if(H.head) - if(prob(meltprob) && !H.head.unacidable) - H << "Your headgear melts away but protects you from the acid!" - qdel(H.head) - H.update_inv_head(0) - H.update_hair(0) - else - H << "Your headgear protects you from the acid." - return - - if(H.wear_mask) - if(prob(meltprob) && !H.wear_mask.unacidable) - H << "Your mask melts away but protects you from the acid!" - qdel(H.wear_mask) - H.update_inv_wear_mask(0) - H.update_hair(0) - else - H << "Your mask protects you from the acid." - return - - if(H.glasses) //Doesn't protect you from the acid but can melt anyways! - if(prob(meltprob) && !H.glasses.unacidable) - H << "Your glasses melts away!" - qdel(H.glasses) - H.update_inv_glasses(0) - - else if(ismonkey(M)) - var/mob/living/carbon/monkey/MK = M - if(MK.wear_mask) - if(!MK.wear_mask.unacidable) - MK << "Your mask melts away but protects you from the acid!" - qdel(MK.wear_mask) - MK.update_inv_wear_mask(0) - else - MK << "Your mask protects you from the acid." - return - - if(!M.unacidable) - if(istype(M, /mob/living/carbon/human) && volume >= 3) - var/mob/living/carbon/human/H = M - var/obj/item/organ/limb/affecting = H.get_organ("head") - if(affecting) - if(affecting.take_damage(4*toxpwr, 2*toxpwr)) - H.update_damage_overlays(0) - if(prob(meltprob)) //Applies disfigurement - H.emote("scream") - H.facial_hair_style = "Shaved" - H.hair_style = "Bald" - H.update_hair(0) - H.status_flags |= DISFIGURED - else - M.take_organ_damage(min(6*toxpwr, volume * toxpwr)) // uses min() and volume to make sure they aren't being sprayed in trace amounts (1 unit != insta rape) -- Doohl - else - if(!M.unacidable) - M.take_organ_damage(min(6*toxpwr, volume * toxpwr)) + C.acid_act(acidpwr, toxpwr, volume) datum/reagent/toxin/acid/reaction_obj(var/obj/O, var/volume) - if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(meltprob * 3)) - if(!O.unacidable) - var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(get_turf(O)) - I.desc = "Looks like this was \an [O] some time ago." - O.visible_message(" \the [O] melts.") - qdel(O) + O.acid_act(acidpwr, toxpwr, volume) datum/reagent/toxin/acid/polyacid name = "Polytrinic acid" @@ -1713,7 +1670,7 @@ datum/reagent/toxin/acid/polyacid reagent_state = LIQUID color = "#8E18A9" // rgb: 142, 24, 169 toxpwr = 2 - meltprob = 30 + acidpwr = 20 datum/reagent/toxin/coffeepowder name = "Coffee Grounds" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 44cc07bc51b..e20f59e6e1f 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -267,6 +267,13 @@ silicate required_reagents = list("carbon" = 1, "hydrogen" = 1, "anti_toxin" = 1) result_amount = 2 +/datum/chemical_reaction/inacusiate + name = "inacusiate" + id = "inacusiate" + result = "inacusiate" + required_reagents = list("water" = 1, "carbon" = 1, "anti_toxin" = 1) + result_amount = 2 + /datum/chemical_reaction/ethylredoxrazine name = "Ethylredoxrazine" id = "ethylredoxrazine" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 30bbcccbf6a..e1661d087e9 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -12,6 +12,8 @@ set name = "Set transfer amount" set category = "Object" set src in range(0) + if(usr.stat || !usr.canmove || usr.restrained()) + return var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts if (N) amount_per_transfer_from_this = N diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 8a194fd4e9d..f478b9e126f 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -51,7 +51,7 @@ R += num2text(A.volume) + ")," add_logs(user, M, "splashed", object="[R]") reagents.reaction(target, TOUCH) - spawn(5) reagents.clear_reagents() + reagents.clear_reagents() return else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. @@ -86,8 +86,7 @@ else if(reagents.total_volume) user << "You splash the solution onto [target]." reagents.reaction(target, TOUCH) - spawn(5) - reagents.clear_reagents() + reagents.clear_reagents() /obj/item/weapon/reagent_containers/glass/beaker diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 60fb6d1f946..96b69d1c9ff 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -96,27 +96,28 @@ usr << "It is spent." -/obj/item/weapon/reagent_containers/hypospray/medipen/leporazine +/obj/item/weapon/reagent_containers/hypospray/medipen/leporazine //basilisks name = "leporazine medipen" - desc = "A rapid and safe way to regulate your body's temperature." + desc = "A rapid way to regulate your body's temperature in the event of a hardsuit malfunction at the cost of some shortness of breath." icon_state = "lepopen" /obj/item/weapon/reagent_containers/hypospray/medipen/leporazine/New() ..() reagents.remove_reagent("inaprovaline", 10) - reagents.add_reagent("leporazine", 10) + reagents.add_reagent("leporazine", 9) + reagents.add_reagent("lexorin", 1) update_icon() return -/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack +/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack //goliath kiting name = "stimpack medipen" - desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in bulky clothing at the cost of some muscle tissue tearing." + desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor at the cost of some shortness of breath." icon_state = "stimpen" /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack/New() ..() reagents.remove_reagent("inaprovaline", 10) - reagents.add_reagent("hyperzine", 8) - reagents.add_reagent("lexorin", 2) + reagents.add_reagent("hyperzine", 9) + reagents.add_reagent("lexorin", 1) update_icon() return \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index ddfb006ba68..64b32a2bc6b 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -82,13 +82,14 @@ set name = "Empty Spray Bottle" set category = "Object" set src in usr - + if(usr.stat || !usr.canmove || usr.restrained()) + return if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes") return if(isturf(usr.loc) && src.loc == usr) usr << "You empty \the [src] onto the floor." reagents.reaction(usr.loc) - spawn(5) src.reagents.clear_reagents() + src.reagents.clear_reagents() //space cleaner /obj/item/weapon/reagent_containers/spray/cleaner diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 46a9dfa4da0..3181f68cd7c 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -43,6 +43,8 @@ set name = "Set transfer amount" set category = "Object" set src in view(1) + if(usr.stat || !usr.canmove || usr.restrained()) + return var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts if (N) amount_per_transfer_from_this = N diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 8f0e3e9ea97..eb347345fb9 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -116,6 +116,14 @@ // attack with item, place item on conveyor /obj/machinery/conveyor/attackby(var/obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/crowbar)) + if(!(stat & BROKEN)) + var/obj/item/conveyor_construct/C = new/obj/item/conveyor_construct(src.loc) + C.id = id + transfer_fingerprints_to(C) + user << "You remove the conveyor belt." + qdel(src) + return if(isrobot(user)) return //Carn: fix for borgs dropping their modules on conveyor belts if(!user.drop_item()) user << "\The [I] is stuck to your hand, you cannot place it on the conveyor!" @@ -179,6 +187,7 @@ var/position = 0 // 0 off, -1 reverse, 1 forward var/last_pos = -1 // last direction setting var/operated = 1 // true if just operated + var/convdir = 0 // 0 is two way switch, 1 and -1 means one way var/id = "" // must match conveyor IDs to control them @@ -187,8 +196,10 @@ -/obj/machinery/conveyor_switch/New() - ..() +/obj/machinery/conveyor_switch/New(newloc, newid) + ..(newloc) + if(!id) + id = newid update() spawn(5) // allow map load @@ -222,13 +233,17 @@ // attack with hand, switch position /obj/machinery/conveyor_switch/attack_hand(mob/user) + add_fingerprint(user) if(position == 0) - if(last_pos < 0) - position = 1 - last_pos = 0 + if(convdir) //is it a oneway switch + position = convdir else - position = -1 - last_pos = 0 + if(last_pos < 0) + position = 1 + last_pos = 0 + else + position = -1 + last_pos = 0 else last_pos = position position = 0 @@ -242,22 +257,80 @@ S.position = position S.update() +/obj/machinery/conveyor_switch/attackby(var/obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/crowbar)) + var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc) + C.id = id + transfer_fingerprints_to(C) + user << "You deattach the conveyor switch." + qdel(src) + /obj/machinery/conveyor_switch/oneway - var/convdir = 1 //Set to 1 or -1 depending on which way you want the convayor to go. (In other words keep at 1 and set the proper dir on the belts.) + convdir = 1 //Set to 1 or -1 depending on which way you want the convayor to go. (In other words keep at 1 and set the proper dir on the belts.) desc = "A conveyor control switch. It appears to only go in one direction." -// attack with hand, switch position -/obj/machinery/conveyor_switch/oneway/attack_hand(mob/user) - if(position == 0) - position = convdir - else - position = 0 +// +// CONVEYOR CONSTRUCTION STARTS HERE +// - operated = 1 - update() +/obj/item/conveyor_construct + icon = 'icons/obj/recycling.dmi' + icon_state = "conveyor0" + name = "conveyor belt assembly" + desc = "A conveyor belt assembly." + w_class = 4 + var/id = "" //inherited by the belt - // find any switches with same id as this one, and set their positions to match us - for(var/obj/machinery/conveyor_switch/S in world) - if(S.id == src.id) - S.position = position - S.update() +/obj/item/conveyor_construct/attackby(obj/item/I, mob/user) + ..() + if(istype(I, /obj/item/conveyor_switch_construct)) + user << "You link the switch to the conveyor belt assembly." + var/obj/item/conveyor_switch_construct/C = I + id = C.id + +/obj/item/conveyor_construct/afterattack(atom/A, mob/user, proximity) + if(!proximity || user.stat || !istype(A, /turf/simulated/floor) || istype(A, /area/shuttle)) + return + var/cdir = get_dir(A, user) + if(!(cdir in cardinal) || A == user.loc) + return + for(var/obj/machinery/conveyor/CB in A) + if(CB.dir == cdir || CB.dir == turn(cdir,180)) + return + cdir |= CB.dir + qdel(CB) + var/obj/machinery/conveyor/C = new/obj/machinery/conveyor(A,cdir) + C.id = id + transfer_fingerprints_to(C) + qdel(src) + +/obj/item/conveyor_switch_construct + name = "conveyor switch assembly" + desc = "A conveyor control switch assembly." + icon = 'icons/obj/recycling.dmi' + icon_state = "switch-off" + w_class = 4 + var/id = "" //inherited by the switch + +/obj/item/conveyor_switch_construct/New() + ..() + id = rand() //this couldn't possibly go wrong + +/obj/item/conveyor_switch_construct/afterattack(atom/A, mob/user, proximity) + if(!proximity || user.stat || !istype(A, /turf/simulated/floor) || istype(A, /area/shuttle)) + return + var/found = 0 + for(var/obj/machinery/conveyor/C in view()) + if(C.id == src.id) + found = 1 + break + if(!found) + user << "\icon[src]The conveyor switch did not detect any linked conveyor belts in range." + return + var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id) + transfer_fingerprints_to(NC) + qdel(src) + +/obj/item/weapon/paper/conveyor + name = "paper- 'Nano-it-up U-build series, #9: Build your very own conveyor belt, in SPACE'" + info = "

    Congratulations!

    You are now the proud owner of the best conveyor set available for space mail order! We at Nano-it-up know you love to prepare your own structures without wasting time, so we have devised a special streamlined assembly procedure that puts all other mail-order products to shame!

    Firstly, you need to link the conveyor switch assembly to each of the conveyor belt assemblies. After doing so, you simply need to install the belt assemblies onto the floor, et voila, belt built. Our special Nano-it-up smart switch will detected any linked assemblies as far as the eye can see! This convenience, you can only have it when you Nano-it-up. Stay nano!

    " diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 3c284861aaf..5e74e4e2aa8 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -10,7 +10,6 @@ anchored = 0 density = 0 pressure_resistance = 5*ONE_ATMOSPHERE - m_amt = 1850 level = 2 var/ptype = 0 // 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk, 6=disposal bin, 7=outlet, 8=inlet @@ -88,7 +87,7 @@ set category = "Object" set src in view(1) - if(usr.stat) + if(usr.stat || !usr.canmove || usr.restrained()) return if(anchored) @@ -102,7 +101,7 @@ set name = "Flip Pipe" set category = "Object" set src in view(1) - if(usr.stat) + if(usr.stat || !usr.canmove || usr.restrained()) return if(anchored) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index ecb18bff6a1..9189ae8861b 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -22,12 +22,12 @@ var/flush_every_ticks = 30 //Every 30 ticks it will look whether it is ready to flush var/flush_count = 0 //this var adds 1 once per tick. When it reaches flush_every_ticks it resets and tries to flush. var/last_sound = 0 - + var/obj/structure/disposalconstruct/stored // create a new disposal // find the attached trunk (if present) and init gas resvr. /obj/machinery/disposal/New() ..() - + stored = new /obj/structure/disposalconstruct(src) trunk_check() air_contents = new/datum/gas_mixture() @@ -48,6 +48,10 @@ eject() ..() +/obj/machinery/disposal/singularity_pull(S, current_size) + if(current_size >= STAGE_FIVE) + Deconstruct() + /obj/machinery/disposal/initialize() // this will get a copy of the air turf and take a SEND PRESSURE amount of air from it var/atom/L = loc @@ -92,13 +96,7 @@ if(do_after(user,20)) if(!src || !W.isOn()) return user << "You've sliced the floorweld off \the [src]." - var/obj/structure/disposalconstruct/C = new (src.loc) - src.transfer_fingerprints_to(C) - C.ptype = 6 // 6 = disposal unit - C.anchored = 1 - C.density = 1 - C.update() - qdel(src) + Deconstruct() return else return @@ -447,12 +445,23 @@ if(prob(75)) I.loc = src visible_message("\the [I] lands in \the [src].") + update() else visible_message("\the [I] bounces off of \the [src]'s rim!") return 0 else return ..(mover, target, height) +/obj/machinery/disposal/Deconstruct() + if(stored) + var/turf/T = loc + stored.loc = T + src.transfer_fingerprints_to(stored) + stored.ptype = 6 // 6 = disposal unit + stored.anchored = 1 + stored.density = 1 + stored.update() + ..() // virtual disposal object // travels through pipes in lieu of actual items // contents will be items flushed by the disposal @@ -602,11 +611,30 @@ var/health = 10 // health points 0-10 layer = 2.3 // slightly lower than wires and other pipes var/base_icon_state // initial icon state on map + var/obj/structure/disposalconstruct/stored // new pipe, set the icon_state as on map /obj/structure/disposalpipe/New() ..() base_icon_state = icon_state + stored = new /obj/structure/disposalconstruct(src) + switch(base_icon_state) + if("pipe-s") + stored.ptype = 0 + if("pipe-c") + stored.ptype = 1 + if("pipe-j1") + stored.ptype = 2 + if("pipe-j2") + stored.ptype = 3 + if("pipe-y") + stored.ptype = 4 + if("pipe-t") + stored.ptype = 5 + if("pipe-j1s") + stored.ptype = 9 + if("pipe-j2s") + stored.ptype = 10 return @@ -813,39 +841,25 @@ // check if anything changed over 2 seconds if(do_after(user,30)) if(!src || !W.isOn()) return - welded() + Deconstruct() user << "You've sliced the disposal pipe." else return // called when pipe is cut with welder -/obj/structure/disposalpipe/proc/welded() +/obj/structure/disposalpipe/Deconstruct() + var/turf/T = loc + stored.loc = T + transfer_fingerprints_to(stored) + stored.dir = dir + stored.density = 0 + stored.anchored = 1 + stored.update() + ..() - var/obj/structure/disposalconstruct/C = new (src.loc) - switch(base_icon_state) - if("pipe-s") - C.ptype = 0 - if("pipe-c") - C.ptype = 1 - if("pipe-j1") - C.ptype = 2 - if("pipe-j2") - C.ptype = 3 - if("pipe-y") - C.ptype = 4 - if("pipe-t") - C.ptype = 5 - if("pipe-j1s") - C.ptype = 9 - if("pipe-j2s") - C.ptype = 10 - src.transfer_fingerprints_to(C) - C.dir = dir - C.density = 0 - C.anchored = 1 - C.update() - - qdel(src) +/obj/structure/disposalpipe/singularity_pull(S, current_size) + if(current_size >= STAGE_FIVE) + Deconstruct() // *** TEST verb //client/verb/dispstop() @@ -1129,7 +1143,7 @@ user << "You start slicing the disposal pipe." if(do_after(user,30)) if(!src || !W.isOn()) return - welded() + Deconstruct() user << "You've sliced the disposal pipe." else return @@ -1179,10 +1193,8 @@ // called when welded // for broken pipe, remove and turn into scrap -/obj/structure/disposalpipe/broken/welded() -// var/obj/item/scrap/S = new(src.loc) -// S.set_components(200,0,0) - qdel(src) +/obj/structure/disposalpipe/broken/Deconstruct() + ..() // the disposal outlet machine diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index e7f378d8e58..7636a70e217 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -330,11 +330,33 @@ datum/design/magboots build_path = /obj/item/clothing/shoes/magboots datum/design/drone_shell - name = "drone shell" + name = "Drone Shell" desc = "A shell of a maintenance drone, an expendable robot built to perform station repairs." id = "drone_shell" req_tech = list("programming" = 2, "biotech" = 4) build_type = MECHFAB materials = list("$metal" = 800, "$glass" = 350) build_path = /obj/item/drone_shell - category = "Misc" \ No newline at end of file + category = "Misc" + +///////////////////////////////////////// +////////////Janitor Designs////////////// +///////////////////////////////////////// + +datum/design/advmop + name = "Advanced Mop" + desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals." + id = "advmop" + req_tech = list("materials" = 4, "engineering" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 2500, "$glass" = 200) + build_path = /obj/item/weapon/mop/advanced + +datum/design/holosign + name = "Holographic Sign Projector" + desc = "A holograpic projector used to project various warning signs." + id = "holosign" + req_tech = list("magnets" = 3, "powerstorage" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 2000, "$glass" = 1000) + build_path = /obj/item/weapon/holosign_creator \ No newline at end of file diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index df2779e3118..c3de077318e 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -86,4 +86,15 @@ datum/design/bluespacebodybag materials = list("$metal" = 3000, "$plasma" = 2000, "$diamond" = 500) reliability = 76 build_path = /obj/item/bodybag/bluespace + category = "Misc" + +datum/design/defib + name = "Defibrillator" + desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients." + id = "defib" + req_tech = list("materials" = 7, "biotech" = 5, "powerstorage" = 5) + build_type = PROTOLATHE + materials = list("$metal" = 5000, "$glass" = 2000, "$silver" = 1000) + reliability = 76 + build_path = /obj/item/weapon/defibrillator category = "Misc" \ No newline at end of file diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 82912068a18..3bbdb2f2db6 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -37,7 +37,7 @@ Note: Must be placed within 3 tiles of the R&D Console return temp_list -/obj/machinery/r_n_d/destructive_analyzer/attackby(var/obj/O as obj, var/mob/user as mob) +/obj/machinery/r_n_d/destructive_analyzer/attackby(var/obj/item/O as obj, var/mob/user as mob) if (shocked) shock(user,50) if (default_deconstruction_screwdriver(user, "d_analyzer_t", "d_analyzer", O)) diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 9bcc805b2c6..7ee1436f18c 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -1,5 +1,18 @@ var/global/list/obj/machinery/message_server/message_servers = list() +/datum/data_chat_msg + var/sender = "Anon" + var/channel = "ss13" + var/message = "Blank" + +/datum/data_chat_msg/New(var/param_sen = "", var/param_chan = "", var/param_msg = "") + if(param_sen) + sender = param_sen + if(param_chan) + channel = param_chan + if(param_msg) + message = param_msg + /datum/data_pda_msg var/recipient = "Unspecified" //name of the person var/sender = "Unspecified" //name of the sender @@ -54,6 +67,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() idle_power_usage = 10 active_power_usage = 100 + var/list/datum/data_chat_msg/chat_msgs = list() var/list/datum/data_pda_msg/pda_msgs = list() var/list/datum/data_rc_msg/rc_msgs = list() var/active = 1 @@ -88,6 +102,9 @@ var/global/list/obj/machinery/message_server/message_servers = list() update_icon() return +/obj/machinery/message_server/proc/send_chat_message(var/sender = "", var/channel = "", var/message = "") + chat_msgs += new/datum/data_chat_msg(sender,channel,message) + /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "") pda_msgs += new/datum/data_pda_msg(recipient,sender,message) @@ -240,10 +257,13 @@ var/obj/machinery/blackbox_recorder/blackbox /obj/machinery/blackbox_recorder/proc/round_end_data_gathering() + var/chat_msg_amt = 0 var/pda_msg_amt = 0 var/rc_msg_amt = 0 for (var/obj/machinery/message_server/MS in world) + if (MS.chat_msgs.len > chat_msg_amt) + chat_msg_amt = MS.chat_msgs.len if (MS.pda_msgs.len > pda_msg_amt) pda_msg_amt = MS.pda_msgs.len if (MS.rc_msgs.len > rc_msg_amt) @@ -262,6 +282,7 @@ var/obj/machinery/blackbox_recorder/blackbox feedback_add_details("radio_usage","SRV-[msg_service.len]") feedback_add_details("radio_usage","CAR-[msg_cargo.len]") feedback_add_details("radio_usage","OTH-[messages.len]") + feedback_add_details("radio_usage","CHA-[chat_msg_amt]") feedback_add_details("radio_usage","PDA-[pda_msg_amt]") feedback_add_details("radio_usage","RC-[rc_msg_amt]") @@ -346,4 +367,4 @@ proc/feedback_add_details(var/variable,var/details) if (!FV) return - FV.add_details(details) \ No newline at end of file + FV.add_details(details) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index f927f96c9c7..90fd97e3496 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -395,14 +395,14 @@ won't update every console in existence) but it's more of a hassle to do. Also, spawn(32*amount/coeff) if(g2g) //And if we only fail the material requirements, we still spend time and power for(var/i = 0, i +
    +

    30 October 2014

    +

    MrPerson updated:

    +
      +
    • Everything now drifts in space, not just mobs.
    • +
    • Mechs are just as maneuverable in space as you are.
    • +
    • Being weightless now slows movement down by a lot rather than speeding it up. Having your hands full will make movement even slower.
    • +
    • Removed spaceslipping (You slipped! x1000)
    • +
    • Jetpacking after being thrown out a mass driver will cancel out your momentum.
    • +
    • Shooting a gun causes you to drift the other direction like spraying a fire extinguisher.
    • +
    +
    +

    27 October 2014

    Jordie0608 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index e5ed90c6360..88131e71430 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2034,3 +2034,13 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Adding bluespace body bag to R&D, it can hold even large mobs and in large amounts. - experiment: girders and displaced girders now have a chance to let projectiles pass through them. +2014-10-30: + MrPerson: + - rscadd: Everything now drifts in space, not just mobs. + - rscadd: Mechs are just as maneuverable in space as you are. + - tweak: Being weightless now slows movement down by a lot rather than speeding + it up. Having your hands full will make movement even slower. + - rscdel: Removed spaceslipping (You slipped! x1000) + - bugfix: Jetpacking after being thrown out a mass driver will cancel out your momentum. + - bugfix: Shooting a gun causes you to drift the other direction like spraying a + fire extinguisher. diff --git a/html/changelogs/MrPerson-PR5619.yml b/html/changelogs/MrPerson-PR5619.yml new file mode 100644 index 00000000000..3ee748c66c9 --- /dev/null +++ b/html/changelogs/MrPerson-PR5619.yml @@ -0,0 +1,5 @@ +author: MrPerson +delete-after: True +changes: + - rscadd: "You can use AI Upload modules directly on unslaved cyborgs to change their laws. The panel has to be open to do this." + - bugfix: "Newly emagged cyborgs get locked down for a little bit until their new laws get shown. Thank you to whoever bitched about it on singulo and filed an issue report." \ No newline at end of file diff --git a/html/changelogs/MrPerson.yml b/html/changelogs/MrPerson.yml index 4f610d483e2..6378584f30e 100644 --- a/html/changelogs/MrPerson.yml +++ b/html/changelogs/MrPerson.yml @@ -1,8 +1,2 @@ author: MrPerson -changes: - - rscadd: "Everything now drifts in space, not just mobs." - - rscadd: "Mechs are just as maneuverable in space as you are." - - tweak: "Being weightless now slows movement down by a lot rather than speeding it up. Having your hands full will make movement even slower." - - rscdel: "Removed spaceslipping (You slipped! x1000)" - - bugfix: "Jetpacking after being thrown out a mass driver will cancel out your momentum." - - bugfix: "Shooting a gun causes you to drift the other direction like spraying a fire extinguisher." \ No newline at end of file +changes: [] diff --git a/html/changelogs/Paprka-PR-5427.yml b/html/changelogs/Paprka-PR-5427.yml new file mode 100644 index 00000000000..5369a9bd69f --- /dev/null +++ b/html/changelogs/Paprka-PR-5427.yml @@ -0,0 +1,7 @@ +author: Paprika +delete-after: True +changes: + - rscadd: "Added an advanced mop for the janitor, available at the protolathe. This hi-tech custodian's friend can mop twice as many floor tiles before needing to return to your bucket!" + - tweak: "Moved holosign projector to the protolathe and gave the janitor back his old signs. We hope you've enjoyed this free trial run of holo projectors, but our budget is tight!" + - rscadd: "Added a holosign projector to the janitor module for cyborgs." + - tweak: "Soap now has a delay. Different soap types clean faster than others, but expect to put it some extra arm work if you want to clean that fresh blood!" \ No newline at end of file diff --git a/html/changelogs/Tkdrg-chatrooms.yml b/html/changelogs/Tkdrg-chatrooms.yml new file mode 100644 index 00000000000..207891b2727 --- /dev/null +++ b/html/changelogs/Tkdrg-chatrooms.yml @@ -0,0 +1,4 @@ +author: Tkdrg +delete-after: true +changes: + - rscadd: "Cutting-edge research in a secret Nanotransen lab has shed light into a revolutionary form of communication technology known as 'chat'. The Personal Data Assistants of Space Station 13 have been deployed with an experimental module implementing this system, dubbed 'Nanotransen Relay Chat'." diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi index 9c23d4383cc..8c8690ea853 100644 Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ diff --git a/icons/mob/alienleap.dmi b/icons/mob/alienleap.dmi index d6e86196148..3adf4ff7597 100644 Binary files a/icons/mob/alienleap.dmi and b/icons/mob/alienleap.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index f5973479213..af2d901cd31 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index b06f7b07a95..9c0449f011e 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 3c890f83a2a..efa4206f2cc 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index 04c7a4e3057..a1a4f7c3242 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index 402f750f901..84eb80a6a4b 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 2572ffae3a7..80e751ae490 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 3ed28b85624..4077cbcbc9c 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/Cryogenic2.dmi b/icons/obj/Cryogenic2.dmi index 80adbbf28aa..1c921a64673 100644 Binary files a/icons/obj/Cryogenic2.dmi and b/icons/obj/Cryogenic2.dmi differ diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index 2ce3ce877fa..53f3240d2b9 100644 Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 97f0bc023cb..b5156c4ffab 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 1dcfa6357a1..08c5b2487e9 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 2556918d24b..107f629efb9 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index c03fa5e244e..9107f227f89 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 4610bfd75b8..f250ff8f04e 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index a39fb249268..2e4be2987d5 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 74cb74a795e..5d6065bace7 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 3aac66228a6..0cbf0334271 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/tgstation.dme b/tgstation.dme index a150657f7ad..cfac14e0c14 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -556,6 +556,7 @@ #include "code\game\objects\items\weapons\cigs_lighters.dm" #include "code\game\objects\items\weapons\clown_items.dm" #include "code\game\objects\items\weapons\cosmetics.dm" +#include "code\game\objects\items\weapons\defib.dm" #include "code\game\objects\items\weapons\dice.dm" #include "code\game\objects\items\weapons\dna_injector.dm" #include "code\game\objects\items\weapons\explosives.dm" @@ -703,7 +704,6 @@ #include "code\game\turfs\unsimulated\beach.dm" #include "code\game\turfs\unsimulated\floor.dm" #include "code\game\turfs\unsimulated\walls.dm" -#include "code\game\verbs\atom_verbs.dm" #include "code\game\verbs\ooc.dm" #include "code\game\verbs\suicide.dm" #include "code\game\verbs\who.dm" @@ -902,11 +902,17 @@ #include "code\modules\food&drinks\food\snacks_bread.dm" #include "code\modules\food&drinks\food\snacks_burgers.dm" #include "code\modules\food&drinks\food\snacks_cake.dm" -#include "code\modules\food&drinks\food\snacks_pies.dm" +#include "code\modules\food&drinks\food\snacks_egg.dm" +#include "code\modules\food&drinks\food\snacks_meat.dm" +#include "code\modules\food&drinks\food\snacks_other.dm" +#include "code\modules\food&drinks\food\snacks_pastry.dm" +#include "code\modules\food&drinks\food\snacks_pie.dm" #include "code\modules\food&drinks\food\snacks_pizza.dm" +#include "code\modules\food&drinks\food\snacks_salad.dm" #include "code\modules\food&drinks\food\snacks_sandwichtoast.dm" #include "code\modules\food&drinks\food\snacks_soup.dm" #include "code\modules\food&drinks\food\snacks_spaghetti.dm" +#include "code\modules\food&drinks\food\snacks_vend.dm" #include "code\modules\food&drinks\food\snacks\food_mixtures.dm" #include "code\modules\food&drinks\food\snacks\meat.dm" #include "code\modules\food&drinks\kitchen machinery\gibber.dm" @@ -919,9 +925,14 @@ #include "code\modules\food&drinks\recipes\drinks_recipes.dm" #include "code\modules\food&drinks\recipes\microwave\recipes.dm" #include "code\modules\food&drinks\recipes\microwave\recipes_bread.dm" -#include "code\modules\food&drinks\recipes\microwave\recipes_burgers.dm" -#include "code\modules\food&drinks\recipes\microwave\recipes_cakes.dm" -#include "code\modules\food&drinks\recipes\microwave\recipes_pies.dm" +#include "code\modules\food&drinks\recipes\microwave\recipes_burger.dm" +#include "code\modules\food&drinks\recipes\microwave\recipes_cake.dm" +#include "code\modules\food&drinks\recipes\microwave\recipes_egg.dm" +#include "code\modules\food&drinks\recipes\microwave\recipes_meat.dm" +#include "code\modules\food&drinks\recipes\microwave\recipes_pastry.dm" +#include "code\modules\food&drinks\recipes\microwave\recipes_pie.dm" +#include "code\modules\food&drinks\recipes\microwave\recipes_pizza.dm" +#include "code\modules\food&drinks\recipes\microwave\recipes_salad.dm" #include "code\modules\food&drinks\recipes\microwave\recipes_sandwichtoast.dm" #include "code\modules\food&drinks\recipes\microwave\recipes_soup.dm" #include "code\modules\food&drinks\recipes\microwave\recipes_spaghetti.dm"

    Name

    Status

    Location

    Control

    [Bot.hacked ? "(!) [Bot.name]" : Bot.name]