diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index e6332b7c97c..2356611a73c 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -2210,7 +2210,7 @@ "aQz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/prison) "aQA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/security/prison) "aQB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/table,/turf/simulated/floor/plating,/area/security/prison) -"aQC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/security/prison) +"aQC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table,/obj/item/deck/cards,/turf/simulated/floor/plasteel,/area/security/prison) "aQD" = (/obj/structure/chair/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/prison) "aQE" = (/turf/simulated/floor/plasteel,/area/security/prison) "aQF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/prison) @@ -2264,7 +2264,7 @@ "aRB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/chair/stool,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/obj/item/reagent_containers/food/snacks/cheesiehonkers,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) -"aRE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) +"aRE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/chair/stool,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/arrow,/obj/effect/decal/warning_stripes/yellow/partial,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/primary/fore) @@ -6472,7 +6472,7 @@ "cux" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/locker) "cuy" = (/obj/structure/table,/obj/item/storage/fancy/crayons,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuz" = (/obj/structure/table,/obj/item/folder,/obj/item/pen,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) -"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) +"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/table,/obj/item/deck/cards,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/chair/stool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/locker) @@ -6652,7 +6652,7 @@ "cxV" = (/obj/item/twohanded/required/kirbyplants,/obj/structure/extinguisher_cabinet{pixel_x = -26},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) "cxW" = (/obj/structure/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cxX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/wood,/obj/item/storage/pill_bottle/dice,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) -"cxY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/wood,/obj/item/toy/cards/deck,/obj/item/toy/cards/deck/black{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) +"cxY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/wood,/obj/item/deck/cards,/obj/item/deck/cards{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cxZ" = (/obj/structure/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cya" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) "cyb" = (/obj/item/twohanded/required/kirbyplants,/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) @@ -7601,7 +7601,7 @@ "cQi" = (/obj/structure/bed,/obj/machinery/status_display{pixel_y = -32},/obj/machinery/light,/obj/item/bedsheet/yellow,/turf/simulated/floor/carpet,/area/crew_quarters/sleep) "cQj" = (/obj/machinery/light,/obj/machinery/computer/cryopod{pixel_y = -32},/obj/machinery/camera{c_tag = "Cryodorms Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/sleep) "cQk" = (/obj/structure/table,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness) -"cQl" = (/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) +"cQl" = (/obj/structure/table,/obj/item/deck/cards,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cQm" = (/obj/structure/table,/obj/item/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cQn" = (/obj/structure/table,/obj/item/paper_bin,/obj/item/pen,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cQo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/chair{dir = 4},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/fitness) @@ -9846,7 +9846,7 @@ "dHr" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/library/abandoned) "dHs" = (/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/library/abandoned) "dHt" = (/obj/structure/bookcase,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/library/abandoned) -"dHu" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/obj/item/toy/cards/deck/black{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/library/abandoned) +"dHu" = (/obj/structure/table/wood,/obj/item/deck/cards,/obj/item/deck/cards{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/library/abandoned) "dHv" = (/obj/structure/table/wood,/obj/item/clipboard,/obj/item/folder/red,/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/library/abandoned) "dHw" = (/obj/structure/chair/office/dark{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plating,/area/library/abandoned) "dHx" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/maintenance/fpmaint2) diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 870a6f075a8..89c6b61013b 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -692,7 +692,7 @@ "np" = (/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nq" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/landmark/damageturf,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nr" = (/obj/structure/chair{dir = 8},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"ns" = (/obj/structure/table,/obj/item/toy/cards/deck,/obj/effect/landmark/damageturf,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"ns" = (/obj/structure/table,/obj/item/deck/cards,/obj/effect/landmark/damageturf,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nt" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nu" = (/obj/structure/grille/broken,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nv" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 10991daca1b..b447a1705d1 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -1404,7 +1404,7 @@ "aAZ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/lobby) "aBa" = (/obj/structure/chair{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby) "aBb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby) -"aBc" = (/obj/structure/table/wood,/obj/item/toy/cards/deck/black,/turf/simulated/floor/wood,/area/maintenance/abandonedbar) +"aBc" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/wood,/area/maintenance/abandonedbar) "aBd" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) "aBe" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) "aBf" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/maintenance/abandonedbar) @@ -2070,7 +2070,7 @@ "aNP" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aNQ" = (/obj/machinery/light,/obj/item/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/table/wood,/obj/item/reagent_containers/spray/waterflower,/turf/simulated/floor/wood,/area/mimeoffice) "aNR" = (/obj/structure/table/wood,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"aNS" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) +"aNS" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aNT" = (/obj/structure/disposalpipe/segment,/obj/structure/chair/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aNU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Arcade"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/carpet/arcade,/area/crew_quarters/fitness{name = "\improper Arcade"}) "aNV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness) @@ -3033,7 +3033,7 @@ "bgq" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgr" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"bgt" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) +"bgt" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) "bgu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgv" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/secondary/entry) "bgw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port) @@ -3704,7 +3704,7 @@ "btl" = (/obj/structure/table/wood,/turf/simulated/floor/wood,/area/library) "btm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/hallway/secondary/exit) "btn" = (/obj/structure/disposalpipe/segment,/obj/structure/table/wood,/obj/item/dice,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bto" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bto" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/wood,/area/crew_quarters/bar) "btp" = (/turf/simulated/floor/plasteel{icon_state = "rampbottom"; tag = "icon-stage_stairs"},/area/hallway/secondary/exit) "btq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "btr" = (/obj/structure/table/wood,/obj/item/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/obj/item/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar) diff --git a/_maps/map_files/shuttles/emergency_bar.dmm b/_maps/map_files/shuttles/emergency_bar.dmm index 8dede5a9ed1..abefc573a7e 100644 --- a/_maps/map_files/shuttles/emergency_bar.dmm +++ b/_maps/map_files/shuttles/emergency_bar.dmm @@ -51,7 +51,7 @@ "aY" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) "aZ" = (/obj/structure/table,/obj/machinery/chem_dispenser/soda,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) "ba" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape) -"bb" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) +"bb" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) "bc" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) "bd" = (/obj/structure/table,/obj/item/storage/box/drinkingglasses,/obj/item/reagent_containers/food/drinks/shaker,/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) "be" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) diff --git a/_maps/map_files/templates/spacehotel/s_06.dmm b/_maps/map_files/templates/spacehotel/s_06.dmm index 9ee738768dc..69fb8a932b8 100644 --- a/_maps/map_files/templates/spacehotel/s_06.dmm +++ b/_maps/map_files/templates/spacehotel/s_06.dmm @@ -4,7 +4,7 @@ "d" = (/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/structure/rack,/obj/item/twohanded/dualsaber/toy,/obj/item/twohanded/toy/chainsaw,/obj/item/toy/foamblade,/turf/unsimulated/floor/carpet,/area/template_noop) "f" = (/obj/structure/rack,/obj/item/toy/griffin{pixel_y = 8},/obj/item/toy/snappop,/obj/item/toy/redbutton,/turf/unsimulated/floor/carpet,/area/template_noop) -"g" = (/obj/structure/rack,/obj/item/toy/cards/deck,/obj/item/toy/figure/secofficer,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/rack,/obj/item/deck/cards,/obj/item/toy/figure/secofficer,/turf/unsimulated/floor/carpet,/area/template_noop) "h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "i" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop) "j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 16cb8baa044..32a9d7cf46d 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -17,7 +17,7 @@ //Hide/Show Action Buttons ... Button /obj/screen/movable/action_button/hide_toggle name = "Hide Buttons" - icon = 'icons/mob/actions.dmi' + icon = 'icons/mob/actions/actions.dmi' icon_state = "bg_default" var/hidden = 0 diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 44c5e53b31a..0ededa09c22 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -370,12 +370,48 @@ so as to remain in compliance with the most up-to-date laws." AI.eyeobj.setLoc(T) //MECHS - /obj/screen/alert/low_mech_integrity name = "Mech Damaged" desc = "Mech integrity is low." icon_state = "low_mech_integrity" +/obj/screen/alert/mech_port_available + name = "Connect to Port" + desc = "Click here to connect to an air port and refill your oxygen!" + icon_state = "mech_port" + var/obj/machinery/atmospherics/unary/portables_connector/target = null + +/obj/screen/alert/mech_port_available/Destroy() + target = null + return ..() + +/obj/screen/alert/mech_port_available/Click() + if(!usr || !usr.client) + return + if(!istype(usr.loc, /obj/mecha) || !target) + return + var/obj/mecha/M = usr.loc + if(M.connect(target)) + to_chat(usr, "[M] connects to the port.") + else + to_chat(usr, "[M] failed to connect to the port.") + +/obj/screen/alert/mech_port_disconnect + name = "Disconnect from Port" + desc = "Click here to disconnect from your air port." + icon_state = "mech_port_x" + +/obj/screen/alert/mech_port_disconnect/Click() + if(!usr || !usr.client) + return + if(!istype(usr.loc, /obj/mecha)) + return + var/obj/mecha/M = usr.loc + if(M.disconnect()) + to_chat(usr, "[M] disconnects from the port.") + else + to_chat(usr, "[M] is not connected to a port at the moment.") + //GUARDIANS /obj/screen/alert/cancharge name = "Charge Ready" diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 284e095333c..cea30327af1 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -18,10 +18,12 @@ GLOBAL_LIST_EMPTY(radial_menus) /obj/screen/radial/slice/MouseEntered(location, control, params) . = ..() icon_state = "radial_slice_focus" + openToolTip(usr, src, params, title = name) /obj/screen/radial/slice/MouseExited(location, control, params) . = ..() icon_state = "radial_slice" + closeToolTip(usr) /obj/screen/radial/slice/Click(location, control, params) if(usr.client == parent.current_user) diff --git a/code/datums/action.dm b/code/datums/action.dm index e0634527104..a9c895f3482 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,10 +11,10 @@ var/check_flags = 0 var/processing = 0 var/obj/screen/movable/action_button/button = null - var/button_icon = 'icons/mob/actions.dmi' + var/button_icon = 'icons/mob/actions/actions.dmi' var/background_icon_state = "bg_default" - var/icon_icon = 'icons/mob/actions.dmi' + var/icon_icon = 'icons/mob/actions/actions.dmi' var/button_icon_state = "default" var/mob/owner diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index ea94aa6407b..d8b893caaf9 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -10,4 +10,11 @@ MA.icon = icon MA.icon_state = icon_state MA.layer = layer - return MA \ No newline at end of file + return MA + +/mutable_appearance/clean +/mutable_appearance/clean/New() + . = ..() + alpha = 255 + opacity = 1 + transform = null \ No newline at end of file diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 653cc0020bc..dee057c5568 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -97,7 +97,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2 var/datum/action/spell_action/action = null - var/action_icon = 'icons/mob/actions.dmi' + var/action_icon = 'icons/mob/actions/actions.dmi' var/action_icon_state = "spell_default" var/action_background_icon_state = "bg_spell" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 728ff93e281..fb22f8cfa25 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1401,6 +1401,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/secure/briefcase/syndie cost = 1 +/datum/uplink_item/badass/plasticbag + name = "Plastic Bag" + desc = "A simple, plastic bag. Keep out of reach of small children, do not apply to head." + reference = "PBAG" + item = /obj/item/storage/bag/plasticbag + cost = 1 + excludefrom = list(/datum/game_mode/nuclear) + /datum/uplink_item/badass/balloon name = "For showing that you are The Boss" desc = "A useless red balloon with the syndicate logo on it, which can blow the deepest of covers." diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index fda550217ad..d70508e620b 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -530,6 +530,48 @@ qdel(G) +/obj/item/bombcore/toxins + name = "toxins payload" + desc = "A payload casing designed to secure a gas based bomb. Must be loaded with a tank transfer valve and installed into a plasteel bomb frame in order to be detonated." + origin_tech = "materials=1;engineering=1" + icon_state = "chemcore" + var/obj/item/transfer_valve/ttv = null + +/obj/item/bombcore/toxins/attackby(obj/item/I, mob/user) + if(iscrowbar(I) && ttv) + playsound(loc, I.usesound, 50, 1) + ttv.forceMove(get_turf(src)) + ttv = null + else if(istype(I, /obj/item/transfer_valve)) + if(!ttv && !check_attached(I)) + if(!user.drop_item()) + return + to_chat(user, "You load [src] with [I].") + ttv = I + I.forceMove(src) + else if (ttv) + to_chat(user, "Another tank transfer valve is already loaded.") + else + to_chat(user, "Remove the attached assembly component first.") + else + return ..() + +/obj/item/bombcore/toxins/proc/check_attached(obj/item/transfer_valve/ttv) + if (ttv.attached_device) + return TRUE + else + return FALSE + +/obj/item/bombcore/toxins/ex_act(severity) //No chain reactions, the explosion only occurs when gas mixes + return + +/obj/item/bombcore/toxins/burn() + return + +/obj/item/bombcore/toxins/detonate() + if(ttv) + ttv.toggle_valve() + ///Syndicate Detonator (aka the big red button)/// /obj/item/syndicatedetonator diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 6f3a8b51354..a1264b753e6 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -12,10 +12,15 @@ max_temperature = 30000 infra_luminosity = 8 force = 40 - var/defence = 0 - var/defence_deflect = 35 wreckage = /obj/effect/decal/mecha_wreckage/durand +/obj/mecha/combat/durand/GrantActions(mob/living/user, human_occupant = 0) + ..() + defense_action.Grant(user, src) + +/obj/mecha/combat/durand/RemoveActions(mob/living/user, human_occupant = 0) + ..() + defense_action.Remove(user) /obj/mecha/combat/durand/loaded/New() ..() @@ -24,54 +29,6 @@ ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack ME.attach(src) - -/obj/mecha/combat/durand/relaymove(mob/user,direction) - if(defence) - if(world.time - last_message > 20) - occupant_message("Unable to move while in defence mode") - last_message = world.time - return 0 - . = ..() - - -/obj/mecha/combat/durand/verb/defence_mode() - set category = "Exosuit Interface" - set name = "Toggle defence mode" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - defence = !defence - if(defence) - deflect_chance = defence_deflect - occupant_message("You enable [src] defence mode.") - else - deflect_chance = initial(deflect_chance) - occupant_message("You disable [src] defence mode.") - log_message("Toggled defence mode.") - - -/obj/mecha/combat/durand/get_stats_part() - var/output = ..() - output += "Defence mode: [defence?"on":"off"]" - return output - -/obj/mecha/combat/durand/get_commands() - var/output = {"
-
Special
- -
- "} - output += ..() - return output - -/obj/mecha/combat/durand/Topic(href, href_list) - ..() - if(href_list["toggle_defence_mode"]) - defence_mode() - /obj/mecha/combat/durand/old desc = "A retired, third-generation combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms." name = "Durand" diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 05e02901ce2..c930df4b97b 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -11,13 +11,21 @@ armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0) max_temperature = 25000 infra_luminosity = 6 - var/overload = 0 - var/overload_coeff = 2 + leg_overload_coeff = 2 wreckage = /obj/effect/decal/mecha_wreckage/gygax internal_damage_threshold = 35 max_equip = 3 maxsize = 2 step_energy_drain = 3 + normal_step_energy_drain = 3 + +/obj/mecha/combat/gygax/GrantActions(mob/living/user, human_occupant = 0) + ..() + overload_action.Grant(user, src) + +/obj/mecha/combat/gygax/RemoveActions(mob/living/user, human_occupant = 0) + ..() + overload_action.Remove(user) /obj/mecha/combat/gygax/loaded/New() ..() @@ -35,7 +43,7 @@ deflect_chance = 15 damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8) max_temperature = 35000 - overload_coeff = 1 + leg_overload_coeff = 100 operation_req_access = list(access_syndicate) wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark max_equip = 4 @@ -55,57 +63,4 @@ /obj/mecha/combat/gygax/dark/add_cell() cell = new /obj/item/stock_parts/cell/bluespace(src) cell.charge = 30000 - cell.maxcharge = 30000 - - -/obj/mecha/combat/gygax/verb/overload() - set category = "Exosuit Interface" - set name = "Toggle leg actuators overload" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(overload) - overload = 0 - step_in = initial(step_in) - step_energy_drain = initial(step_energy_drain) - occupant_message("You disable leg actuators overload.") - else - overload = 1 - step_in = min(1, round(step_in/2)) - step_energy_drain = step_energy_drain*overload_coeff - occupant_message("You enable leg actuators overload.") - log_message("Toggled leg actuators overload.") - -/obj/mecha/combat/gygax/domove(direction) - if(!..()) - return - if(overload) - health-- - if(health < initial(health) - initial(health) / 3) - overload = 0 - step_in = initial(step_in) - step_energy_drain = initial(step_energy_drain) - occupant_message("Leg actuators damage threshold exceded. Disabling overload.") - - -/obj/mecha/combat/gygax/get_stats_part() - var/output = ..() - output += "Leg actuators overload: [overload?"on":"off"]" - return output - -/obj/mecha/combat/gygax/get_commands() - var/output = {"
-
Special
- -
- "} - output += ..() - return output - -/obj/mecha/combat/gygax/Topic(href, href_list) - ..() - if(href_list["toggle_leg_overload"]) - overload() \ No newline at end of file + cell.maxcharge = 30000 \ No newline at end of file diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index b05f97acbcd..8e16b6128dd 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -11,12 +11,6 @@ max_temperature = 60000 burn_state = LAVA_PROOF infra_luminosity = 3 - var/zoom = 0 - var/thrusters = 0 - var/smoke = 5 - var/smoke_ready = 1 - var/smoke_cooldown = 100 - var/datum/effect_system/smoke_spread/smoke_system = new operation_req_access = list(access_cent_specops) wreckage = /obj/effect/decal/mecha_wreckage/marauder add_req_access = 0 @@ -24,6 +18,17 @@ force = 45 max_equip = 5 +/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0) + . = ..() + thrusters_action.Grant(user, src) + smoke_action.Grant(user, src) + zoom_action.Grant(user, src) + +/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0) + . = ..() + thrusters_action.Remove(user) + smoke_action.Remove(user) + zoom_action.Remove(user) /obj/mecha/combat/marauder/loaded/New() ..() @@ -37,8 +42,6 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME.attach(src) - smoke_system.set_up(3, 0, src) - smoke_system.attach(src) /obj/mecha/combat/marauder/seraph desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." @@ -98,100 +101,4 @@ ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) - ME.attach(src) - smoke_system.set_up(3, 0, src) - smoke_system.attach(src) - - -/obj/mecha/combat/marauder/relaymove(mob/user,direction) - if(zoom) - if(world.time - last_message > 20) - occupant_message("Unable to move while in zoom mode.") - last_message = world.time - return 0 - return ..() - -/obj/mecha/combat/marauder/Process_Spacemove(var/movement_dir = 0) - if(..()) - return 1 - if(thrusters && movement_dir && use_power(step_energy_drain)) - return 1 - return 0 - -/obj/mecha/combat/marauder/verb/toggle_thrusters() - set category = "Exosuit Interface" - set name = "Toggle thrusters" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(occupant) - if(get_charge() > 0) - thrusters = !thrusters - log_message("Toggled thrusters.") - occupant_message("Thrusters [thrusters?"en":"dis"]abled.") - - -/obj/mecha/combat/marauder/verb/smoke() - set category = "Exosuit Interface" - set name = "Smoke" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(smoke_ready && smoke>0) - smoke_system.start() - smoke-- - smoke_ready = 0 - spawn(smoke_cooldown) - smoke_ready = 1 - -/obj/mecha/combat/marauder/verb/zoom() - set category = "Exosuit Interface" - set name = "Zoom" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(occupant.client) - zoom = !zoom - log_message("Toggled zoom mode.") - occupant_message("Zoom mode [zoom?"en":"dis"]abled.") - if(zoom) - occupant.client.AddViewMod("mecha", 12) - to_chat(occupant, sound('sound/mecha/imag_enh.ogg',volume=50)) - else - occupant.client.RemoveViewMod("mecha") - - - -/obj/mecha/combat/marauder/get_stats_part() - var/output = ..() - output += {"Smoke: [smoke] -
- Thrusters: [thrusters?"on":"off"] - "} - return output - - -/obj/mecha/combat/marauder/get_commands() - var/output = {"
-
Special
- -
- "} - output += ..() - return output - -/obj/mecha/combat/marauder/Topic(href, href_list) - ..() - if(href_list["toggle_thrusters"]) - toggle_thrusters() - if(href_list["smoke"]) - smoke() - if(href_list["toggle_zoom"]) - zoom() \ No newline at end of file + ME.attach(src) \ No newline at end of file diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 5dbffb62f29..d1092212761 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -6,6 +6,7 @@ step_in = 2 dir_in = 2 //Facing south. step_energy_drain = 3 + normal_step_energy_drain = 3 health = 200 deflect_chance = 30 damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7) @@ -17,10 +18,18 @@ //operation_req_access = list() internal_damage_threshold = 25 force = 15 - var/phasing = 0 - var/phasing_energy_drain = 200 + phase_state = "phazon-phase" max_equip = 3 +/obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0) + ..() + phasing_action.Grant(user, src) + switch_damtype_action.Grant(user, src) + +/obj/mecha/combat/phazon/RemoveActions(mob/living/user, human_occupant = 0) + ..() + phasing_action.Remove(user) + switch_damtype_action.Remove(user) /obj/mecha/combat/phazon/New() ..() @@ -29,62 +38,13 @@ ME = new /obj/item/mecha_parts/mecha_equipment/gravcatapult ME.attach(src) -/obj/mecha/combat/phazon/mechstep(direction) - . = ..() - if(!. && phasing && get_charge() >= phasing_energy_drain) - if(can_move) - can_move = 0 - flick("phazon-phase", src) - forceMove(get_step(src, direction)) - use_power(phasing_energy_drain) - playsound(src,stepsound,40,1) - sleep(step_in * 3) - can_move = 1 - return 1 - -/obj/mecha/combat/phazon/click_action(atom/target,mob/user) - if(phasing) - occupant_message("Unable to interact with objects while phasing") - return - return ..() - -/obj/mecha/combat/phazon/verb/switch_damtype() - set category = "Exosuit Interface" - set name = "Reconfigure arm microtool arrays" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - var/new_damtype = alert(occupant, "Arm Tool Selection", null, "Fists", "Torch", "Toxic Injector") - switch(new_damtype) - if("Fists") - damtype = "brute" - occupant_message("Your exosuit's hands form into fists.") - if("Torch") - damtype = "fire" - occupant_message("A torch tip extends from your exosuit's hand, glowing red.") - if("Toxic Injector") - damtype = "tox" - occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") - playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) - /obj/mecha/combat/phazon/get_commands() var/output = {"
Special
"} output += ..() - return output - -/obj/mecha/combat/phazon/Topic(href, href_list) - ..() - if(href_list["switch_damtype"]) - switch_damtype() - if(href_list["phasing"]) - phasing = !phasing - send_byjax(occupant,"exosuit.browser","phasing_command","[phasing?"Dis":"En"]able phasing") - occupant_message("En":"#f00\">Dis"]abled phasing.") \ No newline at end of file + return output \ No newline at end of file diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm index 9e51be0357d..ba4566a1e91 100644 --- a/code/game/mecha/combat/reticence.dm +++ b/code/game/mecha/combat/reticence.dm @@ -15,7 +15,8 @@ add_req_access = 0 internal_damage_threshold = 60 max_equip = 3 - step_energy_drain = 3 + step_energy_drain = 3 + normal_step_energy_drain = 3 stepsound = null turnsound = null diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 63e70626a8d..b1a110813e8 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -15,7 +15,8 @@ return if(isobj(target)) var/obj/target_obj = target - if(target_obj.unacidable) + if(target_obj.unacidable && !istype(target_obj, /obj/mecha)) + occupant_message("[target] is too durable to drill through.") return target.visible_message("[chassis] starts to drill [target].", "[chassis] starts to drill [target]...", diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 3cf0e3513e7..2205a9f6a72 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -7,6 +7,9 @@ #define MELEE 1 #define RANGED 2 +#define MECHAMOVE_RAND 1 +#define MECHAMOVE_TURN 2 +#define MECHAMOVE_STEP 4 /obj/mecha name = "Mecha" @@ -21,11 +24,13 @@ force = 5 armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items) - var/can_move = 1 + var/can_move = 0 // time of next allowed movement var/mob/living/carbon/occupant = null var/step_in = 10 //make a step in step_in/10 sec. var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. + var/normal_step_energy_drain = 10 var/step_energy_drain = 10 + var/overload_step_energy_drain_min = 100 var/health = 300 //health is health var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. //the values in this list show how much damage will pass through, not how much will be absorbed. @@ -69,32 +74,42 @@ var/turf/crashing = null var/occupant_sight_flags = 0 - var/stepsound = 'sound/mecha/mechstep.ogg' var/turnsound = 'sound/mecha/mechturn.ogg' var/melee_cooldown = 10 var/melee_can_hit = 1 + // Action vars + var/defence_mode = FALSE + var/defence_mode_deflect_chance = 35 + var/leg_overload_mode = FALSE + var/leg_overload_coeff = 100 + var/thrusters_active = FALSE + var/smoke = 5 + var/smoke_ready = 1 + var/smoke_cooldown = 100 + var/zoom_mode = FALSE + var/phasing = FALSE + var/phasing_energy_drain = 200 + var/phase_state = "" //icon_state when phasing + hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) -/obj/mecha/New() - ..() +/obj/mecha/Initialize() + . = ..() events = new icon_state += "-open" add_radio() add_cabin() - - if(!add_airtank()) //we check this here in case mecha does not have an internal tank available by default - WIP - removeVerb(/obj/mecha/verb/connect_to_port) - removeVerb(/obj/mecha/verb/toggle_internal_tank) - + add_airtank() spark_system.set_up(2, 0, src) spark_system.attach(src) + smoke_system.set_up(3, src) + smoke_system.attach(src) add_cell() processing_objects.Add(src) - removeVerb(/obj/mecha/verb/disconnect_from_port) GLOB.poi_list |= src log_message("[src] created.") GLOB.mechas_list += src //global mech list @@ -109,13 +124,6 @@ //////////////////////// ////// Helpers ///////// //////////////////////// - -/obj/mecha/proc/removeVerb(verb_path) - verbs -= verb_path - -/obj/mecha/proc/addVerb(verb_path) - verbs += verb_path - /obj/mecha/proc/add_airtank() internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) return internal_tank @@ -144,7 +152,6 @@ radio.icon_state = icon_state radio.subspace_transmission = 1 - /obj/mecha/examine(mob/user) ..(user) var/integrity = health/initial(health)*100 @@ -164,18 +171,18 @@ for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) to_chat(user, "[bicon(ME)] [ME]") - - /obj/mecha/hear_talk(mob/M, text) if(M == occupant && radio.broadcasting) radio.talk_into(M, text) - /obj/mecha/proc/click_action(atom/target, mob/user, params) if(!occupant || occupant != user ) return if(user.incapacitated()) return + if(phasing) + occupant_message("Unable to interact with objects while phasing.") + return if(state) occupant_message("Maintenance protocols in effect.") return @@ -251,6 +258,8 @@ . = ..() if(.) return 1 + if(thrusters_active && movement_dir && use_power(step_energy_drain)) + return 1 var/atom/movable/backup = get_spacemove_backup() if(backup) @@ -278,30 +287,58 @@ return domove(direction) /obj/mecha/proc/domove(direction) - if(!can_move) + if(can_move >= world.time) return 0 if(!Process_Spacemove(direction)) return 0 if(!has_charge(step_energy_drain)) return 0 + if(defence_mode) + if(world.time - last_message > 20) + occupant_message("Unable to move while in defence mode.") + last_message = world.time + return 0 + if(zoom_mode) + if(world.time - last_message > 20) + occupant_message("Unable to move while in zoom mode.") + last_message = world.time + return 0 var/move_result = 0 + var/move_type = 0 if(internal_damage & MECHA_INT_CONTROL_LOST) move_result = mechsteprand() + move_type = MECHAMOVE_RAND else if(dir != direction) move_result = mechturn(direction) + move_type = MECHAMOVE_TURN else move_result = mechstep(direction) + move_type = MECHAMOVE_STEP - can_move = 0 - spawn(step_in) - can_move = 1 - - if(move_result) - use_power(step_energy_drain) - return 1 - return 0 + if(move_result && move_type) + aftermove(move_type) + can_move = world.time + step_in + return TRUE + return FALSE +/obj/mecha/proc/aftermove(move_type) + use_power(step_energy_drain) + if(move_type & (MECHAMOVE_RAND | MECHAMOVE_STEP) && occupant) + var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector) in loc + if(possible_port) + var/obj/screen/alert/mech_port_available/A = occupant.throw_alert("mechaport", /obj/screen/alert/mech_port_available, override = TRUE) + if(A) + A.target = possible_port + else + occupant.clear_alert("mechaport") + if(leg_overload_mode) + take_damage(1) + if(health < initial(health) - initial(health) / 3) + leg_overload_mode = FALSE + step_in = initial(step_in) + step_energy_drain = initial(step_energy_drain) + occupant_message("Leg actuators damage threshold exceded. Disabling overload.") /obj/mecha/proc/mechturn(direction) dir = direction @@ -310,18 +347,23 @@ return 1 /obj/mecha/proc/mechstep(direction) - var/result = step(src,direction) - if(result && stepsound) - playsound(src,stepsound,40,1) - return result + . = step(src, direction) + if(!.) + if(phasing && get_charge() >= phasing_energy_drain) + if(can_move < world.time) + . = FALSE // We lie to mech code and say we didn't get to move, because we want to handle power usage + cooldown ourself + flick("phazon-phase", src) + forceMove(get_step(src, direction)) + use_power(phasing_energy_drain) + playsound(src, stepsound, 40, 1) + can_move = world.time + (step_in * 3) + else if(stepsound) + playsound(src, stepsound, 40, 1) /obj/mecha/proc/mechsteprand() - var/result = step_rand(src) - if(result && stepsound) - playsound(src,stepsound,40,1) - return result - - + . = step_rand(src) + if(. && stepsound) + playsound(src, stepsound, 40, 1) /obj/mecha/Bump(var/atom/obstacle, bump_allowed) if(throwing) //high velocity mechas in your face! @@ -627,6 +669,7 @@ qdel(cabin_air) cabin_air = null QDEL_NULL(spark_system) + QDEL_NULL(smoke_system) GLOB.mechas_list -= src //global mech list return ..() @@ -790,7 +833,7 @@ to_chat(user, "The welder must be on for this task!") else to_chat(user, "The [name] is at full integrity!") - return 1 + return TRUE else if(istype(W, /obj/item/mecha_parts/mecha_tracking)) if(!user.unEquip(W)) @@ -959,6 +1002,10 @@ to_chat(AI, "[AI.can_dominate_mechs ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!" \ : "You have been uploaded to a mech's onboard computer."]") to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") + if(interaction == AI_TRANS_FROM_CARD) + GrantActions(AI, FALSE) + else + GrantActions(AI, !AI.can_dominate_mechs) ///////////////////////////////////// //////// Atmospheric stuff //////// @@ -995,7 +1042,7 @@ /obj/mecha/proc/connect(obj/machinery/atmospherics/unary/portables_connector/new_port) //Make sure not already connected to something else - if(connected_port || !new_port || new_port.connected_device) + if(connected_port || !istype(new_port) || new_port.connected_device) return 0 //Make sure are close enough for a valid connection @@ -1007,6 +1054,10 @@ connected_port.connected_device = src connected_port.parent.reconcile_air() + if(occupant) + occupant.clear_alert("mechaport") + occupant.throw_alert("mechaport_d", /obj/screen/alert/mech_port_disconnect) + log_message("Connected to gas port.") return 1 @@ -1017,80 +1068,26 @@ connected_port.connected_device = null connected_port = null log_message("Disconnected from gas port.") + if(occupant) + occupant.clear_alert("mechaport_d") return 1 /obj/mecha/portableConnectorReturnAir() return internal_tank.return_air() - -///////////////////////// -//////// Verbs //////// -///////////////////////// - - -/obj/mecha/verb/connect_to_port() - set name = "Connect to port" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(!occupant) return - if(usr!=occupant) - return - var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc - if(possible_port) - if(connect(possible_port)) - occupant_message("[name] connects to the port.") - verbs += /obj/mecha/verb/disconnect_from_port - verbs -= /obj/mecha/verb/connect_to_port - return - else - occupant_message("[name] failed to connect to the port.") - return - else - occupant_message("Nothing happens") - - -/obj/mecha/verb/disconnect_from_port() - set name = "Disconnect from port" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(!occupant) return - if(usr!=occupant) - return - if(disconnect()) - occupant_message("[name] disconnects from the port.") - verbs -= /obj/mecha/verb/disconnect_from_port - verbs += /obj/mecha/verb/connect_to_port - else - occupant_message("[name] is not connected to the port at the moment.") - -/obj/mecha/verb/toggle_lights() - set name = "Toggle Lights" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr!=occupant) return +/obj/mecha/proc/toggle_lights() lights = !lights - if(lights) set_light(light_range + lights_power) - else set_light(light_range - lights_power) - occupant_message("Toggled lights [lights?"on":"off"].") - log_message("Toggled lights [lights?"on":"off"].") - return + if(lights) + set_light(light_range + lights_power) + else + set_light(light_range - lights_power) + occupant_message("Toggled lights [lights ? "on" : "off"].") + log_message("Toggled lights [lights ? "on" : "off"].") - -/obj/mecha/verb/toggle_internal_tank() - set name = "Toggle internal airtank usage." - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr!=occupant) - return +/obj/mecha/proc/toggle_internal_tank() use_internal_tank = !use_internal_tank - occupant_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].") - log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].") - return - + occupant_message("Now taking air from [use_internal_tank ? "internal airtank" : "environment"].") + log_message("Now taking air from [use_internal_tank ? "internal airtank" : "environment"].") /obj/mecha/MouseDrop_T(mob/M, mob/user) if(user.incapacitated()) @@ -1148,7 +1145,7 @@ H.forceMove(src) H.reset_perspective(src) add_fingerprint(H) - //GrantActions(H, human_occupant=1) + GrantActions(H, human_occupant = 1) forceMove(loc) log_append_to_last("[H] moved in as pilot.") icon_state = reset_icon() @@ -1205,7 +1202,6 @@ to_chat(brainmob, "Your imprint to [R.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.") mmi_as_oc.loc = src mmi_as_oc.mecha = src - verbs -= /obj/mecha/verb/eject Entered(mmi_as_oc) Move(loc) icon_state = reset_icon() @@ -1213,6 +1209,7 @@ log_message("[mmi_as_oc] moved in as pilot.") if(!hasInternalDamage()) to_chat(occupant, sound('sound/mecha/nominal.ogg',volume=50)) + GrantActions(brainmob) return 1 else return 0 @@ -1229,27 +1226,6 @@ /obj/mecha/proc/pilot_mmi_hud(var/mob/living/carbon/brain/pilot) return -/obj/mecha/verb/view_stats() - set name = "View Stats" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr!=occupant) - return - occupant << browse(get_stats_html(), "window=exosuit") - return - -/obj/mecha/verb/eject() - set name = "Eject" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - go_out() - add_fingerprint(usr) - - /obj/mecha/Exited(atom/movable/M, atom/newloc) if(occupant && occupant == M) // The occupant exited the mech without calling go_out() go_out(1, newloc) @@ -1260,17 +1236,19 @@ var/atom/movable/mob_container occupant.clear_alert("charge") occupant.clear_alert("mech damage") + occupant.clear_alert("mechaport") + occupant.clear_alert("mechaport_d") if(ishuman(occupant)) mob_container = occupant - //RemoveActions(occupant, human_occupant=1) + RemoveActions(occupant, human_occupant = 1) else if(isbrain(occupant)) var/mob/living/carbon/brain/brain = occupant - //RemoveActions(brain) + RemoveActions(brain) mob_container = brain.container else if(isAI(occupant)) var/mob/living/silicon/ai/AI = occupant if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf. - //RemoveActions(occupant) + RemoveActions(occupant) occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. occupant = null return @@ -1282,7 +1260,7 @@ to_chat(AI, "Returning to core...") AI.controlled_mech = null AI.remote_control = null - //RemoveActions(occupant, 1) + RemoveActions(occupant, 1) mob_container = AI newloc = get_turf(AI.linked_core) qdel(AI.linked_core) @@ -1311,6 +1289,7 @@ if(L && L.client) L.client.RemoveViewMod("mecha") + zoom_mode = FALSE ///////////////////////// ////// Access stuff ///// @@ -1320,14 +1299,14 @@ if(!ishuman(H)) return 0 for(var/ID in list(H.get_active_hand(), H.wear_id, H.belt)) - if(check_access(ID,operation_req_access)) + if(check_access(ID, operation_req_access)) return 1 return 0 /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(check_access(ID,internals_req_access)) + if(check_access(ID, internals_req_access)) return 1 return 0 @@ -1494,3 +1473,35 @@ else if(damtype == TOX) visual_effect_icon = ATTACK_EFFECT_MECHTOXIN ..() + +/obj/mecha/CtrlClick(mob/living/L) + if(occupant != L || !istype(L)) + return ..() + + var/list/choices = list("Cancel / No Change" = mutable_appearance(icon = 'icons/mob/screen_gen.dmi', icon_state = "x")) + var/list/choices_to_refs = list() + + for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) + if(!MT.selectable || selected == MT) + continue + var/mutable_appearance/clean/MA = new(MT) + choices[MT.name] = MA + choices_to_refs[MT.name] = MT + + var/choice = show_radial_menu(L, src, choices, radius = 48, custom_check = CALLBACK(src, .proc/check_menu, L)) + if(!check_menu(L) || choice == "Cancel / No Change") + return + + var/obj/item/mecha_parts/mecha_equipment/new_sel = LAZYACCESS(choices_to_refs, choice) + if(istype(new_sel)) + selected = new_sel + occupant_message("You switch to [selected].") + visible_message("[src] raises [selected]") + send_byjax(occupant, "exosuit.browser", "eq_list", get_equipment_list()) + +/obj/mecha/proc/check_menu(mob/living/L) + if(L != occupant || !istype(L)) + return FALSE + if(L.incapacitated()) + return FALSE + return TRUE \ No newline at end of file diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm new file mode 100644 index 00000000000..db807634102 --- /dev/null +++ b/code/game/mecha/mecha_actions.dm @@ -0,0 +1,229 @@ +/obj/mecha + //Action datums + var/datum/action/innate/mecha/mech_eject/eject_action = new + var/datum/action/innate/mecha/mech_toggle_internals/internals_action = new + var/datum/action/innate/mecha/mech_toggle_lights/lights_action = new + var/datum/action/innate/mecha/mech_view_stats/stats_action = new + var/datum/action/innate/mecha/mech_defence_mode/defense_action = new + var/datum/action/innate/mecha/mech_overload_mode/overload_action = new + var/datum/action/innate/mecha/mech_toggle_thrusters/thrusters_action = new + var/datum/effect_system/smoke_spread/smoke_system = new //not an action, but trigged by one + var/datum/action/innate/mecha/mech_smoke/smoke_action = new + var/datum/action/innate/mecha/mech_zoom/zoom_action = new + var/datum/action/innate/mecha/mech_toggle_phasing/phasing_action = new + var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new + +/obj/mecha/proc/GrantActions(mob/living/user, human_occupant = 0) + if(human_occupant) + eject_action.Grant(user, src) + internals_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + +/obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0) + if(human_occupant) + eject_action.Remove(user) + internals_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + +/datum/action/innate/mecha + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS + icon_icon = 'icons/mob/actions/actions_mecha.dmi' + var/obj/mecha/chassis + +/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M) + if(M) + chassis = M + . = ..() + +/datum/action/innate/mecha/Destroy() + chassis = null + return ..() + +/datum/action/innate/mecha/mech_eject + name = "Eject From Mech" + button_icon_state = "mech_eject" + +/datum/action/innate/mecha/mech_eject/Activate() + if(!owner) + return + if(!chassis || chassis.occupant != owner) + return + chassis.go_out() + +/datum/action/innate/mecha/mech_toggle_internals + name = "Toggle Internal Airtank Usage" + button_icon_state = "mech_internals_off" + +/datum/action/innate/mecha/mech_toggle_internals/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.use_internal_tank = !chassis.use_internal_tank + button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" + chassis.occupant_message("Now taking air from [chassis.use_internal_tank ? "internal airtank" : "environment"].") + chassis.log_message("Now taking air from [chassis.use_internal_tank ? "internal airtank" : "environment"].") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_lights + name = "Toggle Lights" + button_icon_state = "mech_lights_off" + +/datum/action/innate/mecha/mech_toggle_lights/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.lights = !chassis.lights + if(chassis.lights) + chassis.set_light(chassis.lights_power) + button_icon_state = "mech_lights_on" + else + chassis.set_light(-chassis.lights_power) + button_icon_state = "mech_lights_off" + chassis.occupant_message("Toggled lights [chassis.lights ? "on" : "off"].") + chassis.log_message("Toggled lights [chassis.lights ? "on" : "off"].") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_view_stats + name = "View Stats" + button_icon_state = "mech_view_stats" + +/datum/action/innate/mecha/mech_view_stats/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.occupant << browse(chassis.get_stats_html(), "window=exosuit") + +/datum/action/innate/mecha/mech_defence_mode + name = "Toggle Defence Mode" + button_icon_state = "mech_defense_mode_off" + +/datum/action/innate/mecha/mech_defence_mode/Activate(forced_state = null) + if(!owner || !chassis || chassis.occupant != owner) + return + if(!isnull(forced_state)) + chassis.defence_mode = forced_state + else + chassis.defence_mode = !chassis.defence_mode + button_icon_state = "mech_defense_mode_[chassis.defence_mode ? "on" : "off"]" + if(chassis.defence_mode) + chassis.deflect_chance = chassis.defence_mode_deflect_chance + chassis.occupant_message("You enable [chassis] defence mode.") + else + chassis.deflect_chance = initial(chassis.deflect_chance) + chassis.occupant_message("You disable [chassis] defence mode.") + chassis.log_message("Toggled defence mode.") + UpdateButtonIcon() + + +/datum/action/innate/mecha/mech_overload_mode + name = "Toggle leg actuators overload" + button_icon_state = "mech_overload_off" + +/datum/action/innate/mecha/mech_overload_mode/Activate(forced_state = null) + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.health < initial(chassis.health) - initial(chassis.health) / 3) + chassis.occupant_message("The leg actuators are too damaged to overload!") + return // Can't activate them if the mech is too damaged + if(!isnull(forced_state)) + chassis.leg_overload_mode = forced_state + else + chassis.leg_overload_mode = !chassis.leg_overload_mode + button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]" + chassis.log_message("Toggled leg actuators overload.") + if(chassis.leg_overload_mode) + chassis.leg_overload_mode = 1 + // chassis.bumpsmash = 1 + chassis.step_in = min(1, round(chassis.step_in / 2)) + chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min, chassis.step_energy_drain * chassis.leg_overload_coeff) + chassis.occupant_message("You enable leg actuators overload.") + else + chassis.leg_overload_mode = 0 + // chassis.bumpsmash = 0 + chassis.step_in = initial(chassis.step_in) + chassis.step_energy_drain = chassis.normal_step_energy_drain + chassis.occupant_message("You disable leg actuators overload.") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_thrusters + name = "Toggle Thrusters" + button_icon_state = "mech_thrusters_off" + +/datum/action/innate/mecha/mech_toggle_thrusters/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.get_charge() > 0) + chassis.thrusters_active = !chassis.thrusters_active + button_icon_state = "mech_thrusters_[chassis.thrusters_active ? "on" : "off"]" + chassis.log_message("Toggled thrusters.") + chassis.occupant_message("Thrusters [chassis.thrusters_active ? "en" : "dis"]abled.") + +/datum/action/innate/mecha/mech_smoke + name = "Smoke" + button_icon_state = "mech_smoke" + +/datum/action/innate/mecha/mech_smoke/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.smoke_ready && chassis.smoke > 0) + chassis.smoke_system.start() + chassis.smoke-- + chassis.smoke_ready = 0 + spawn(chassis.smoke_cooldown) + chassis.smoke_ready = 1 + else + chassis.occupant_message("You are either out of smoke, or the smoke isn't ready yet.") + +/datum/action/innate/mecha/mech_zoom + name = "Zoom" + button_icon_state = "mech_zoom_off" + +/datum/action/innate/mecha/mech_zoom/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(owner.client) + chassis.zoom_mode = !chassis.zoom_mode + button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]" + chassis.log_message("Toggled zoom mode.") + chassis.occupant_message("Zoom mode [chassis.zoom_mode ? "en" : "dis"]abled.") + if(chassis.zoom_mode) + owner.client.AddViewMod("mecha", 12) + SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) + else + owner.client.RemoveViewMod("mecha") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_phasing + name = "Toggle Phasing" + button_icon_state = "mech_phasing_off" + +/datum/action/innate/mecha/mech_toggle_phasing/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.phasing = !chassis.phasing + button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" + chassis.occupant_message("En":"#f00\">Dis"]abled phasing.") + UpdateButtonIcon() + + +/datum/action/innate/mecha/mech_switch_damtype + name = "Reconfigure arm microtool arrays" + button_icon_state = "mech_damtype_brute" + +/datum/action/innate/mecha/mech_switch_damtype/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + var/new_damtype + switch(chassis.damtype) + if("tox") + new_damtype = "brute" + chassis.occupant_message("Your exosuit's hands form into fists.") + if("brute") + new_damtype = "fire" + chassis.occupant_message("A torch tip extends from your exosuit's hand, glowing red.") + if("fire") + new_damtype = "tox" + chassis.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") + chassis.damtype = new_damtype + button_icon_state = "mech_damtype_[new_damtype]" + playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) + UpdateButtonIcon() \ No newline at end of file diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 2ce732f83ed..41d4c3aa540 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -73,81 +73,80 @@ var/cell_charge = get_charge() var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None" var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" + var/tank_temperature_c = internal_tank ? internal_tank.return_temperature() - T0C : "Unknown" var/cabin_pressure = round(return_pressure(),0.01) - var/output = {"[report_internal_damage()] - [integrity<30?"DAMAGE LEVEL CRITICAL
":null] - Integrity: [integrity]%
- Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
- Air source: [use_internal_tank?"Internal Airtank":"Environment"]
- Airtank pressure: [tank_pressure]kPa
- Airtank temperature: [tank_temperature]°K|[tank_temperature - T0C]°C
- Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
- Cabin temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
- Lights: [lights?"on":"off"]
- [dna?"DNA-locked:
[dna] \[Reset\]
":null] - "} - return output + . = "[report_internal_damage()]" + . += "[integrity<30?"DAMAGE LEVEL CRITICAL
":null]" + . += "Integrity: [integrity]%
" + . += "Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
" + . += "Air source: [use_internal_tank?"Internal Airtank":"Environment"]
" + . += "Airtank pressure: [tank_pressure]kPa
" + . += "Airtank temperature: [tank_temperature]°K|[tank_temperature_c]°C
" + . += "Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
" + . += "Cabin temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
" + . += "Lights: [lights?"on":"off"]
" + . += "[dna ? "DNA-locked:
[dna] \[Reset\]
" : ""]" + . += "[defense_action.owner ? "Defence Mode: [defence_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[overload_action.owner ? "Leg Actuators Overload: [leg_overload_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[thrusters_action.owner ? "Thrusters: [thrusters_active ? "Enabled" : "Disabled"]
" : ""]" + . += "[smoke_action.owner ? "Smoke: [smoke]
" : ""]" + . += "[zoom_action.owner ? "Zoom: [zoom_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
" : ""]" /obj/mecha/proc/get_commands() - var/output = {"
-
Electronics
- -
-
-
Airtank
- -
- -
[get_equipment_menu()]
-
- [(/obj/mecha/verb/eject in verbs)?"Eject
":null] - "} - return output + . = "
" + . += "
Electronics
" + . += "" + . += "
" + . += "
" + . += "
Airtank
" + . += "" + . += "
" + . += "
" + . += "
Permissions & Logging
" + . += "" + . += "
" + . += "
[get_equipment_menu()]
" + . += "
" + . += "Eject
" /obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu - var/output + . = "" if(equipment.len) - output += {"
-
Equipment
-
" /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html if(!equipment.len) return - var/output = "Equipment:
" + . = "Equipment:
" for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) - output += "
[MT.get_equip_info()]
" - output += "
" - return output + . += "
[MT.get_equip_info()]
" + . += "
" /obj/mecha/proc/get_log_html() @@ -248,11 +247,11 @@ selected = equip occupant_message("You switch to [equip]") visible_message("[src] raises [equip]") - send_byjax(occupant,"exosuit.browser","eq_list",get_equipment_list()) + send_byjax(occupant, "exosuit.browser", "eq_list", get_equipment_list()) return if(href_list["eject"]) if(usr != occupant) return - eject() + go_out() return if(href_list["toggle_lights"]) if(usr != occupant) return @@ -280,14 +279,6 @@ radio.set_frequency(new_frequency) send_byjax(occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]") return - if(href_list["port_disconnect"]) - if(usr != occupant) return - disconnect_from_port() - return - if(href_list["port_connect"]) - if(usr != occupant) return - connect_to_port() - return if(href_list["view_log"]) if(usr != occupant) return occupant << browse(get_log_html(), "window=exosuit_log") diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index d0fcb0f99be..da746290e8a 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -10,6 +10,7 @@ internal_damage_threshold = 35 deflect_chance = 15 step_energy_drain = 6 + normal_step_energy_drain = 6 var/builtin_hud_user = 0 /obj/mecha/medical/odysseus/moved_inside(var/mob/living/carbon/human/H) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 407c9cd63dc..ab38ee3a0d0 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -83,6 +83,7 @@ damage_absorption = list("brute"=0.6,"fire"=0.4,"bullet"=0.6,"laser"=0.6,"energy"=1,"bomb"=0.3) wreckage = /obj/effect/decal/mecha_wreckage/ripley/deathripley step_energy_drain = 0 + normal_step_energy_drain = 0 /obj/mecha/working/ripley/deathripley/New() ..() diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index b3e35ecfcaa..4d901261bbd 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -127,6 +127,8 @@ /obj/item/seeds/ambrosia = 20, /obj/item/clothing/under/color/black = 30, /obj/item/stack/tape_roll = 10, + /obj/item/storage/bag/plasticbag = 20, + /obj/item/caution = 10, ////////////////CONTRABAND STUFF////////////////// /obj/item/grenade/clown_grenade = 3, /obj/item/seeds/ambrosia/cruciatus = 3, diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 376acfe20ac..3ab43d0793a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -174,7 +174,8 @@ var/global/list/datum/stack_recipe/wood_recipes = list( new /datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50), new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10), - new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15) + new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15), + new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50) ) /obj/item/stack/sheet/wood diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 4d0de3bd09e..26309f885fa 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -168,7 +168,7 @@ max_combined_w_class = 100 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class max_w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_TINY - can_hold = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/food/snacks/ash_flora) + can_hold = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/food/snacks/grown/ash_flora) burn_state = FLAMMABLE /obj/item/storage/bag/plants/portaseeder diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index 8dc852e9221..76a7a693838 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -104,7 +104,6 @@ var/global/list/frozen_mob_list = list() M.can_move = 0 M.overlays += adminomaly if(M.occupant) - M.removeVerb(/obj/mecha/verb/eject) to_chat(M.occupant, "You have been frozen by [key]") message_admins("[key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]") @@ -115,7 +114,6 @@ var/global/list/frozen_mob_list = list() M.can_move = 1 M.overlays -= adminomaly if(M.occupant) - M.addVerb(/obj/mecha/verb/eject) to_chat(M.occupant, "You have been unfrozen by [key]") message_admins("[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] unfroze [key_name(M.occupant)] in a [M.name]") diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index ef1512858d4..7d8e90068c6 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -79,7 +79,7 @@ var/global/datum/prizes/global_prizes = new /datum/prize_item/cards name = "Deck of Cards" desc = "Anyone fancy a game of 52-card Pickup?" - typepath = /obj/item/toy/cards/deck + typepath = /obj/item/deck/cards cost = 25 /datum/prize_item/crayons diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm index 570679ce67f..50105813fd6 100644 --- a/code/modules/client/preference/loadout/loadout_general.dm +++ b/code/modules/client/preference/loadout/loadout_general.dm @@ -36,8 +36,16 @@ path = /obj/item/storage/box/matches /datum/gear/cards - display_name = "a deck of cards" - path = /obj/item/toy/cards/deck + display_name = "a deck of standard cards" + path = /obj/item/deck/cards + +/datum/gear/doublecards + display_name = "a double deck of standard cards" + path = /obj/item/deck/doublecards + +/datum/gear/tarot + display_name = "a deck of tarot cards" + path = /obj/item/deck/tarot /datum/gear/headphones display_name = "a pair of headphones" diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 012c79bab06..47966bb5278 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -339,6 +339,16 @@ time = 50 category = CAT_WEAPON +/datum/crafting_recipe/toxins_payload + name = "Toxins Payload Casing" + result = /obj/item/bombcore/toxins + reqs = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/assembly/signaler = 1, + /obj/item/stack/sheet/metal = 2 + ) + category = CAT_WEAPON + /datum/crafting_recipe/bonfire name = "Bonfire" time = 60 diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 235b0b609f1..c481df1ca42 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -62,7 +62,7 @@ if(!proximity) return - if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. + if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, " [src] is empty.") return FALSE diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm new file mode 100644 index 00000000000..9f4dbb7315d --- /dev/null +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -0,0 +1,79 @@ +/obj/structure/fermenting_barrel + name = "wooden barrel" + desc = "A large wooden barrel. You can ferment fruits and such inside it, or just use it to hold liquid." + icon = 'icons/obj/objects.dmi' + icon_state = "barrel" + density = TRUE + anchored = FALSE + container_type = DRAINABLE | AMOUNT_VISIBLE + pressure_resistance = 2 * ONE_ATMOSPHERE + max_integrity = 300 + var/open = FALSE + var/speed_multiplier = 1 //How fast it distills. Defaults to 100% (1.0). Lower is better. + +/obj/structure/fermenting_barrel/Initialize() + create_reagents(300) //Bluespace beakers, but without the portability or efficiency in circuits. + . = ..() + +/obj/structure/fermenting_barrel/examine(mob/user) + . = ..() + to_chat(user, "It is currently [open ? "open, letting you pour liquids in." : "closed, letting you draw liquids from the tap."] ") + +/obj/structure/fermenting_barrel/proc/makeWine(obj/item/reagent_containers/food/snacks/grown/G) + if(G.reagents) + G.reagents.trans_to(src, G.reagents.total_volume) + var/amount = G.seed.potency / 4 + if(G.distill_reagent) + reagents.add_reagent(G.distill_reagent, amount) + else + var/data = list() + data["names"] = list("[initial(G.name)]" = 1) + data["color"] = G.filling_color + data["alcohol_perc"] = G.wine_power + if(G.wine_flavor) + data["tastes"] = list(G.wine_flavor = 1) + // else // Stub - Will implement when we port over tg's better taste system - I'd rather get the barrel in first. + // data["tastes"] = list(G.tastes[1] = 1) + reagents.add_reagent("fruit_wine", amount, data) + qdel(G) + playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) + +/obj/structure/fermenting_barrel/attackby(obj/item/I, mob/user, params) + var/obj/item/reagent_containers/food/snacks/grown/G = I + if(istype(G)) + if(!G.can_distill) + to_chat(user, "You can't distill this into anything...") + return FALSE + else if(!user.drop_item()) + to_chat(user, "[G] is stuck to your hand!") + return FALSE + G.forceMove(src) + to_chat(user, "You place [G] into [src] to start the fermentation process.") + addtimer(CALLBACK(src, .proc/makeWine, G), rand(80, 120) * speed_multiplier) + else if(I.is_refillable()) + return FALSE // To refill via afterattack proc + else + return ..() + +/obj/structure/fermenting_barrel/attack_hand(mob/user) + open = !open + if(open) + container_type = REFILLABLE | AMOUNT_VISIBLE + to_chat(user, "You open [src], letting you fill it.") + else + container_type = DRAINABLE | AMOUNT_VISIBLE + to_chat(user, "You close [src], letting you draw from its tap.") + update_icon() + +/obj/structure/fermenting_barrel/update_icon() + if(open) + icon_state = "barrel_open" + else + icon_state = "barrel" + +/datum/crafting_recipe/fermenting_barrel + name = "Wooden Barrel" + result = /obj/structure/fermenting_barrel + reqs = list(/obj/item/stack/sheet/wood = 30) + time = 50 + category = CAT_PRIMAL diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 772e9f5d856..2e0feaecea7 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -8,12 +8,13 @@ icon = 'icons/obj/hydroponics/harvest.dmi' var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item. var/plantname = "" - var/bitesize_mod = 0 + var/bitesize_mod = 0 // If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod) var/splat_type = /obj/effect/decal/cleanable/plant_smudge - // If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod) - dried_type = -1 - // Saves us from having to define each stupid grown's dried_type as itself. - // If you don't want a plant to be driable (watermelons) set this to null in the time definition. + var/can_distill = TRUE //If FALSE, this object cannot be distilled into an alcohol. + var/distill_reagent //If NULL and this object can be distilled, it uses a generic fruit_wine reagent and adjusts its variables. + var/wine_flavor //If NULL, this is automatically set to the fruit's flavor. Determines the flavor of the wine if distill_reagent is NULL. + var/wine_power = 0.1 //Determines the boozepwr of the wine if distill_reagent is NULL. Uses 0.1 - 1.2 not tg's boozepower (divide by 100) else you'll end up with 1000% proof alcohol! + dried_type = -1 // Saves us from having to define each stupid grown's dried_type as itself. If you don't want a plant to be driable (watermelons) set this to null in the time definition. burn_state = FLAMMABLE origin_tech = "biotech=1" diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index d6942d6a7f6..a2085eafaee 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -30,6 +30,7 @@ name = "ambrosia vulgaris branch" desc = "This is a plant containing various healing chemicals." origin_tech = "biotech=2" + wine_power = 0.2 // Ambrosia Deus /obj/item/seeds/ambrosia/deus @@ -50,6 +51,7 @@ icon_state = "ambrosiadeus" filling_color = "#008B8B" origin_tech = "biotech=4;materials=3" + wine_power = 0.5 //Ambrosia Gaia /obj/item/seeds/ambrosia/gaia @@ -74,6 +76,8 @@ origin_tech = "biotech=6;materials=5" light_range = 3 seed = /obj/item/seeds/ambrosia/gaia + wine_power = 0.7 + wine_flavor = "the earthmother's blessing" // Ambrosia Cruciatus /obj/item/seeds/ambrosia/cruciatus @@ -83,4 +87,5 @@ reagents_add = list("thc" = 0.15, "kelotane" = 0.15, "bicaridine" = 0.1, "bath_salts" = 0.20, "plantmatter" = 0.05) /obj/item/reagent_containers/food/snacks/grown/ambrosia/cruciatus - seed = /obj/item/seeds/ambrosia/cruciatus \ No newline at end of file + seed = /obj/item/seeds/ambrosia/cruciatus + wine_power = 0.7 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 64c7c0381a9..67948c4beb9 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -23,6 +23,7 @@ icon_state = "apple" filling_color = "#FF4500" bitesize = 100 // Always eat the apple in one bite + distill_reagent = "hcider" // Posioned Apple /obj/item/seeds/apple/poisoned @@ -55,3 +56,5 @@ icon_state = "goldapple" filling_color = "#FFD700" origin_tech = "biotech=4;materials=5" + distill_reagent = null + wine_power = 0.5 diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 6874038a7bf..4515b3ad75f 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -23,6 +23,7 @@ trash = /obj/item/grown/bananapeel filling_color = "#FFFF00" bitesize = 5 + distill_reagent = "bananahonk" /obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user) user.visible_message("[user] is aiming the [name] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide.") @@ -74,6 +75,7 @@ icon_state = "mimana" trash = /obj/item/grown/bananapeel/mimanapeel filling_color = "#FFFFEE" + distill_reagent = "silencer" /obj/item/grown/bananapeel/mimanapeel seed = /obj/item/seeds/banana/mime @@ -102,6 +104,8 @@ trash = /obj/item/grown/bananapeel/bluespace filling_color = "#0000FF" origin_tech = "biotech=3;bluespace=5" + wine_power = 0.6 + wine_flavor = "slippery hypercubes" /obj/item/grown/bananapeel/bluespace seed = /obj/item/seeds/banana/bluespace diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index 24ddf1dbbba..3649e84b869 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -25,6 +25,7 @@ icon_state = "soybeans" filling_color = "#F0E68C" bitesize_mod = 2 + wine_power = 0.2 // Koibean /obj/item/seeds/soya/koi @@ -45,4 +46,5 @@ desc = "Something about these seems fishy." icon_state = "koibeans" filling_color = "#F0E68C" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + wine_power = 0.4 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 155566ebd10..8e740719fbf 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -25,6 +25,7 @@ gender = PLURAL filling_color = "#FF00FF" bitesize_mod = 2 + distill_reagent = "gin" // Poison Berries /obj/item/seeds/berry/poison @@ -44,6 +45,8 @@ desc = "Taste so good, you could die!" icon_state = "poisonberrypile" filling_color = "#C71585" + distill_reagent = null + wine_power = 0.35 // Death Berries /obj/item/seeds/berry/death @@ -65,6 +68,8 @@ desc = "Taste so good, you could die!" icon_state = "deathberrypile" filling_color = "#708090" + distill_reagent = null + wine_power = 0.5 // Glow Berries /obj/item/seeds/berry/glow @@ -89,6 +94,9 @@ filling_color = "#7CFC00" origin_tech = "plasmatech=6" light_color = "#006622" + distill_reagent = null + wine_power = 0.6 + wine_flavor = "warmth" // Cherries /obj/item/seeds/cherry @@ -118,6 +126,7 @@ gender = PLURAL filling_color = "#FF0000" bitesize_mod = 2 + wine_power = 0.3 // Blue Cherries /obj/item/seeds/cherry/blue @@ -138,6 +147,7 @@ icon_state = "bluecherry" filling_color = "#6495ED" bitesize_mod = 2 + wine_power = 0.5 // Grapes /obj/item/seeds/grape @@ -168,6 +178,7 @@ dried_type = /obj/item/reagent_containers/food/snacks/no_raisin filling_color = "#FF1493" bitesize_mod = 2 + distill_reagent = "wine" // Green Grapes /obj/item/seeds/grape/green @@ -186,3 +197,4 @@ name = "bunch of green grapes" icon_state = "greengrapes" filling_color = "#7FFF00" + distill_reagent = "cognac" diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index e82e72e83b0..ed05d7a6954 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -93,6 +93,7 @@ icon_state = "cannabis" filling_color = "#00FF00" bitesize_mod = 2 + wine_power = 0.2 /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow @@ -100,18 +101,21 @@ name = "rainbow cannabis leaf" desc = "Is it supposed to be glowing like that...?" icon_state = "megacannabis" + wine_power = 0.6 /obj/item/reagent_containers/food/snacks/grown/cannabis/death seed = /obj/item/seeds/cannabis/death name = "death cannabis leaf" desc = "Looks a bit dark. Oh well." icon_state = "blackcannabis" + wine_power = 0.4 /obj/item/reagent_containers/food/snacks/grown/cannabis/white seed = /obj/item/seeds/cannabis/white name = "white cannabis leaf" desc = "It feels smooth and nice to the touch." icon_state = "whitecannabis" + wine_power = 0.1 /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate seed = /obj/item/seeds/cannabis/ultimate @@ -119,3 +123,4 @@ desc = "You feel dizzy looking at it. What the fuck?" icon_state = "ocannabis" volume = 420 + wine_power = 0.9 diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 91b6cd0a14c..e864687a551 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -21,6 +21,7 @@ icon_state = "wheat" filling_color = "#F0E68C" bitesize_mod = 2 + distill_reagent = "beer" // Oat /obj/item/seeds/wheat/oat @@ -40,6 +41,7 @@ icon_state = "oat" filling_color = "#556B2F" bitesize_mod = 2 + distill_reagent = "ale" // Rice /obj/item/seeds/wheat/rice @@ -60,6 +62,7 @@ icon_state = "rice" filling_color = "#FAFAD2" bitesize_mod = 2 + distill_reagent = "sake" //Meatwheat - grows into synthetic meat /obj/item/seeds/wheat/meat @@ -80,6 +83,7 @@ filling_color = rgb(150, 0, 0) bitesize_mod = 2 seed = /obj/item/seeds/wheat/meat + can_distill = FALSE /obj/item/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user) user.visible_message("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.") diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index f8bf515ce6b..5f4621eff16 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -25,6 +25,7 @@ icon_state = "chilipepper" filling_color = "#FF0000" bitesize_mod = 2 + wine_power = 0.2 // Ice Chili /obj/item/seeds/chili/ice @@ -49,6 +50,7 @@ filling_color = "#0000CD" bitesize_mod = 2 origin_tech = "biotech=4" + wine_power = 0.3 // Ghost Chili /obj/item/seeds/chili/ghost @@ -74,3 +76,4 @@ filling_color = "#F8F8FF" bitesize_mod = 4 origin_tech = "biotech=4;magnets=5" + wine_power = 0.5 diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 86bc8082661..b6e4a36d164 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -5,6 +5,7 @@ desc = "It's so sour, your face will twist." icon_state = "lime" bitesize_mod = 2 + wine_power = 0.3 // Lime /obj/item/seeds/lime @@ -29,6 +30,7 @@ desc = "It's so sour, your face will twist." icon_state = "lime" filling_color = "#00FF00" + distill_reagent = "triple_sec" // Orange /obj/item/seeds/orange @@ -104,6 +106,8 @@ desc = "Made for burning houses down." icon_state = "firelemon" bitesize_mod = 2 + wine_power = 0.7 + wine_flavor = "fire" /obj/item/reagent_containers/food/snacks/grown/firelemon/attack_self(mob/living/user) var/area/A = get_area(user) diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 0ca061af745..745aa006498 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -25,6 +25,7 @@ icon_state = "cocoapod" filling_color = "#FFD700" bitesize_mod = 2 + distill_reagent = "creme_de_cacao" // Vanilla Pod /obj/item/seeds/cocoapod/vanillapod @@ -43,4 +44,5 @@ name = "vanilla pod" desc = "Fattening... Mmmmm... vanilla." icon_state = "vanillapod" - filling_color = "#FFD700" \ No newline at end of file + filling_color = "#FFD700" + distill_reagent = "vanilla" //Takes longer, but you can get even more vanilla from it. \ No newline at end of file diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 693818c9537..dca121d1acb 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -24,6 +24,8 @@ filling_color = "#FFFF00" trash = /obj/item/grown/corncob bitesize_mod = 2 + distill_reagent = "whiskey" + wine_power = 0.4 /obj/item/grown/corncob name = "corn cob" diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm index d9a243eab6f..b9244bfd3ec 100644 --- a/code/modules/hydroponics/grown/eggplant.dm +++ b/code/modules/hydroponics/grown/eggplant.dm @@ -22,6 +22,7 @@ icon_state = "eggplant" filling_color = "#800080" bitesize_mod = 2 + wine_power = 0.2 // Egg-Plant /obj/item/seeds/eggplant/eggy @@ -41,4 +42,5 @@ icon_state = "eggyplant" trash = /obj/item/reagent_containers/food/snacks/egg filling_color = "#F8F8FF" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + distill_reagent = "eggnog" \ No newline at end of file diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index b8d88ebf0c9..adbb5f3152c 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -25,6 +25,7 @@ slot_flags = SLOT_HEAD filling_color = "#FF6347" bitesize_mod = 3 + distill_reagent = "vermouth" // Lily /obj/item/seeds/poppy/lily @@ -88,6 +89,7 @@ slot_flags = SLOT_HEAD filling_color = "#E6E6FA" bitesize_mod = 3 + distill_reagent = "vermouth" // Sunflower @@ -145,6 +147,7 @@ slot_flags = SLOT_HEAD filling_color = "#E6E6FA" bitesize_mod = 2 + distill_reagent = "absinthe" // Novaflower /obj/item/seeds/sunflower/novaflower diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 5113a8454f3..c45899a310b 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -27,6 +27,7 @@ bitesize_mod = 2 var/stacktype = /obj/item/stack/tile/grass var/tile_coefficient = 0.02 // 1/50 + wine_power = 0.15 /obj/item/reagent_containers/food/snacks/grown/grass/attack_self(mob/user) to_chat(user, "You prepare the astroturf.") @@ -65,3 +66,4 @@ desc = "The textile industry's dark secret." icon_state = "carpetclump" stacktype = /obj/item/stack/tile/carpet + can_distill = FALSE diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index ba67bf426fa..eea80e17e60 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -95,3 +95,4 @@ icon_state = "kudzupod" filling_color = "#6B8E23" bitesize_mod = 2 + wine_power = 0.2 diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index be548339d39..ed7608e21b9 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -25,6 +25,7 @@ w_class = WEIGHT_CLASS_NORMAL filling_color = "#008000" bitesize_mod = 3 + wine_power = 0.4 // Holymelon /obj/item/seeds/watermelon/holy @@ -45,3 +46,5 @@ icon_state = "holymelon" filling_color = "#FFD700" dried_type = null + wine_power = 0.7 //Water to wine, baby. + wine_flavor = "divinity" diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index df58b55c333..605f5082522 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -53,6 +53,7 @@ icon_state = "cabbage" filling_color = "#90EE90" bitesize_mod = 2 + wine_power = 0.2 // Sugarcane @@ -78,6 +79,7 @@ icon_state = "sugarcane" filling_color = "#FFD700" bitesize_mod = 2 + distill_reagent = "rum" // Gatfruit @@ -108,6 +110,7 @@ origin_tech = "combat=6" trash = /obj/item/gun/projectile/revolver bitesize_mod = 2 + wine_power = 0.9 //It burns going down, too. //Cherry Bombs /obj/item/seeds/cherry/bomb @@ -129,6 +132,7 @@ seed = /obj/item/seeds/cherry/bomb bitesize_mod = 2 volume = 125 //Gives enough room for the black powder at max potency + wine_power = 0.8 /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user) var/area/A = get_area(user) diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 95ea83cd424..14c4b2a252a 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -1,6 +1,7 @@ /obj/item/reagent_containers/food/snacks/grown/mushroom name = "mushroom" bitesize_mod = 2 + wine_power = 0.4 // Reishi @@ -84,6 +85,7 @@ desc = "Amanita Virosa: Deadly poisonous basidiomycete fungus filled with alpha amanitin." icon_state = "angel" filling_color = "#C0C0C0" + wine_power = 0.6 // Liberty Cap @@ -109,6 +111,8 @@ desc = "Psilocybe Semilanceata: Liberate yourself!" icon_state = "libertycap" filling_color = "#DAA520" + wine_power = 0.8 + wine_flavor = "freedom" // Plump Helmet @@ -135,6 +139,7 @@ desc = "Plumus Hellmus: Plump, soft and s-so inviting~" icon_state = "plumphelmet" filling_color = "#9370DB" + distill_reagent = "manlydorf" // Walking Mushroom @@ -161,6 +166,7 @@ icon_state = "walkingmushroom" filling_color = "#9370DB" origin_tech = "biotech=4;programming=5" + can_distill = FALSE /obj/item/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user) if(istype(user.loc, /turf/space)) @@ -232,6 +238,7 @@ var/effect_path = /obj/structure/glowshroom origin_tech = "biotech=4;plasmatech=6" light_color = "#006622" + wine_power = 0.5 /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user) if(istype(user.loc, /turf/space)) @@ -280,6 +287,8 @@ effect_path = /obj/structure/glowshroom/glowcap origin_tech = "biotech=4;powerstorage=6;plasmatech=4" light_color = "#8E0300" + wine_power = 0.6 + wine_flavor = "warmth" // Fungus/Mold /obj/item/seeds/fungus @@ -326,3 +335,5 @@ icon_state = "shadowshroom" effect_path = /obj/structure/glowshroom/shadowshroom origin_tech = "biotech=4;plasmatech=4;magnets=4" + wine_power = 0.6 + wine_flavor = "strange coldness" diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 93176799802..e39548d9e7c 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -25,6 +25,8 @@ bitesize_mod = 2 slice_path = /obj/item/reagent_containers/food/snacks/onion_slice slices_num = 2 + wine_power = 0.2 + wine_flavor = "pungentness" /obj/item/seeds/onion/red name = "pack of red onion seeds" @@ -43,6 +45,8 @@ icon_state = "onion_red" filling_color = "#C29ACF" slice_path = /obj/item/reagent_containers/food/snacks/onion_slice/red + wine_power = 0.6 + wine_flavor = "powerful pungentness" /obj/item/reagent_containers/food/snacks/onion_slice name = "onion slices" diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm index 2e0825151c6..589f9456bc2 100644 --- a/code/modules/hydroponics/grown/pineapple.dm +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -24,4 +24,5 @@ icon_state = "pineapple" filling_color = "#e5b437" w_class = WEIGHT_CLASS_NORMAL - bitesize_mod = 3 \ No newline at end of file + bitesize_mod = 3 + wine_power = 0.4 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 2692ee8adf8..655cb6d69bd 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -25,6 +25,7 @@ icon_state = "potato" filling_color = "#E9967A" bitesize = 100 + distill_reagent = "vodka" /obj/item/reagent_containers/food/snacks/grown/potato/wedges @@ -33,6 +34,7 @@ icon_state = "potato_wedges" filling_color = "#E9967A" bitesize = 100 + distill_reagent = "sbiten" /obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 9668379442d..f05a6847dc2 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -23,6 +23,7 @@ icon_state = "pumpkin" filling_color = "#FFA500" bitesize_mod = 2 + wine_power = 0.2 /obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) if(is_sharp(W)) @@ -52,3 +53,4 @@ icon_state = "blumpkin" filling_color = "#87CEFA" bitesize_mod = 2 + wine_power = 0.5 diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm index 734adae15be..f743989cb4a 100644 --- a/code/modules/hydroponics/grown/random.dm +++ b/code/modules/hydroponics/grown/random.dm @@ -26,4 +26,10 @@ name = "strange plant" desc = "What could this even be?" icon_state = "crunchy" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + +/obj/item/reagent_containers/food/snacks/grown/random/Initialize() + . = ..() + wine_power = rand(0.1,1.5) + if(prob(1)) + wine_power = 2.0 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 7f26176c675..35bb5ee195c 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -21,6 +21,7 @@ icon_state = "carrot" filling_color = "#FFA500" bitesize_mod = 2 + wine_power = 0.3 /obj/item/reagent_containers/food/snacks/grown/carrot/wedges name = "carrot wedges" @@ -59,6 +60,7 @@ desc = "Closely related to carrots." icon_state = "parsnip" bitesize_mod = 2 + wine_power = 0.35 // White-Beet @@ -84,6 +86,7 @@ icon_state = "whitebeet" filling_color = "#F4A460" bitesize_mod = 2 + wine_power = 0.4 // Red Beet /obj/item/seeds/redbeet @@ -107,3 +110,4 @@ desc = "You can't beat red beet." icon_state = "redbeet" bitesize_mod = 2 + wine_power = 0.6 diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index bd3b182c132..1139c03cad5 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -22,6 +22,7 @@ desc = "These aromatic tips of the tea plant can be dried to make tea." icon_state = "tea_aspera_leaves" filling_color = "#008000" + can_distill = FALSE // Tea Astra /obj/item/seeds/tea/astra @@ -67,6 +68,7 @@ icon_state = "coffee_arabica" filling_color = "#DC143C" bitesize_mod = 2 + distill_reagent = "kahlua" // Coffee Robusta /obj/item/seeds/coffee/robusta diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index de235280b02..95333bba31a 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -21,6 +21,7 @@ desc = "Dry them out to make some smokes." icon_state = "tobacco_leaves" filling_color = "#008000" + distill_reagent = "creme_de_menthe" //Menthol, I guess. // Space Tobacco /obj/item/seeds/tobacco/space @@ -38,4 +39,6 @@ seed = /obj/item/seeds/tobacco/space name = "space tobacco leaves" desc = "Dry them out to make some space-smokes." - icon_state = "stobacco_leaves" \ No newline at end of file + icon_state = "stobacco_leaves" + distill_reagent = null + wine_power = 0.5 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 3adf57c4021..58bf18057ad 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -22,6 +22,7 @@ splat_type = /obj/effect/decal/cleanable/tomato_smudge filling_color = "#FF6347" bitesize_mod = 2 + distill_reagent = "enzyme" // Blood Tomato /obj/item/seeds/tomato/blood @@ -43,6 +44,7 @@ splat_type = /obj/effect/gibspawner/generic filling_color = "#FF0000" origin_tech = "biotech=5" + distill_reagent = "bloodymary" // Blue Tomato @@ -89,6 +91,8 @@ desc = "So lubricated, you might slip through space-time." icon_state = "bluespacetomato" origin_tech = "biotech=4;bluespace=5" + distill_reagent = null + wine_power = 0.8 // Killer Tomato @@ -117,6 +121,7 @@ var/awakening = 0 filling_color = "#FF0000" origin_tech = "biotech=4;combat=5" + distill_reagent = "demonsblood" /obj/item/reagent_containers/food/snacks/grown/tomato/killer/attack(mob/M, mob/user, def_zone) if(awakening) diff --git a/code/modules/logic/dual_input.dm b/code/modules/logic/dual_input.dm index 03bfa4f1688..b8f915ff46d 100644 --- a/code/modules/logic/dual_input.dm +++ b/code/modules/logic/dual_input.dm @@ -45,9 +45,9 @@ /obj/machinery/logic_gate/nand/handle_logic() if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER)) - output_state = LOGIC_OFF //This can only output continuous signals - else //At least one input was ON/FLICKER, so output is off - output_state = LOGIC_OFF + output_state = LOGIC_OFF //Both inputs are ON/FLICKER, so output is off + else + output_state = LOGIC_ON //This can only output continuous signals return // NOR Gate @@ -58,9 +58,9 @@ output_state = LOGIC_ON /obj/machinery/logic_gate/nor/handle_logic() - if(input1_state == LOGIC_OFF ||input2_state == LOGIC_OFF) + if(input1_state == LOGIC_OFF && input2_state == LOGIC_OFF) //Both inputs are OFF, so output is ON output_state = LOGIC_ON //This can only output continuous signals - else //Both inputs are ON, so output is OFF + else output_state = LOGIC_OFF return @@ -71,14 +71,15 @@ icon_state = "logic_xor" /obj/machinery/logic_gate/xor/handle_logic() - if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) || input2_state == LOGIC_OFF) //Only input1 is ON/FLICKER, so output matches input1 + if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_OFF)) //Only input1 is ON/FLICKER, so output matches input1 output_state = input1_state - else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) || input1_state == LOGIC_OFF) //Only input2 is ON/FLICKER, so output matches input2 + else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) && (input1_state == LOGIC_OFF)) //Only input2 is ON/FLICKER, so output matches input2 output_state = input2_state else //Both inputs are ON or OFF, so output is OFF output_state = LOGIC_OFF return + // XNOR Gate /obj/machinery/logic_gate/xnor name = "XNOR Gate" diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 364a918c0ff..0e0d248d8b7 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -7,7 +7,7 @@ var/harvested_name = "shortened mushrooms" var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large." var/needs_sharp_harvest = TRUE - var/harvest = /obj/item/reagent_containers/food/snacks/ash_flora/shavings + var/harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings var/harvest_amount_low = 1 var/harvest_amount_high = 3 var/harvest_time = 60 @@ -79,7 +79,7 @@ desc = "A number of mushrooms, each of which surrounds a greenish sporangium with a number of leaf-like structures." harvested_name = "leafless mushrooms" harvested_desc = "A bunch of formerly-leafed mushrooms, with their sporangiums exposed. Scandalous?" - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf needs_sharp_harvest = FALSE harvest_amount_high = 4 harvest_time = 20 @@ -95,7 +95,7 @@ desc = "Several mushrooms, the larger of which have a ring of conks at the midpoint of their stems." harvested_name = "small mushrooms" harvested_desc = "Several small mushrooms near the stumps of what likely were larger mushrooms." - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap harvest_amount_high = 4 harvest_time = 50 harvest_message_low = "You slice the cap off of a mushroom." @@ -111,7 +111,7 @@ luminosity = 1 harvested_name = "tiny mushrooms" harvested_desc = "A few tiny mushrooms around larger stumps. You can already see them growing back." - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem harvest_amount_high = 4 harvest_time = 40 harvest_message_low = "You pick and slice the cap off of a mushroom, leaving the stem." @@ -126,7 +126,7 @@ desc = "Several prickly cacti, brimming with ripe fruit and covered in a thin layer of ash." harvested_name = "cacti" harvested_desc = "A bunch of prickly cacti. You can see fruits slowly growing beneath the covering of ash." - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit needs_sharp_harvest = FALSE harvest_amount_high = 2 harvest_time = 10 @@ -149,45 +149,51 @@ H.visible_message("[H] steps on a cactus!", \ "You step on a cactus!") -/obj/item/reagent_containers/food/snacks/ash_flora +/obj/item/reagent_containers/food/snacks/grown/ash_flora name = "mushroom shavings" desc = "Some shavings from a tall mushroom. With enough, might serve as a bowl." icon = 'icons/obj/lavaland/ash_flora.dmi' icon_state = "mushroom_shavings" list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2) w_class = WEIGHT_CLASS_TINY + wine_power = 0.2 -/obj/item/reagent_containers/food/snacks/ash_flora/New() +/obj/item/reagent_containers/food/snacks/grown/ash_flora/New() ..() pixel_x = rand(-4, 4) pixel_y = rand(-4, 4) -/obj/item/reagent_containers/food/snacks/ash_flora/shavings //for actual crafting +/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings //for actual crafting -/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf name = "mushroom leaf" desc = "A leaf, from a mushroom." list_reagents = list("nutriment" = 3, "vitfro" = 2, "nicotine" = 2) icon_state = "mushroom_leaf" + wine_power = 0.4 -/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap name = "mushroom cap" desc = "The cap of a large mushroom." list_reagents = list("lsd" = 2, "entpoly" = 4, "psilocybin" = 2) icon_state = "mushroom_cap" + wine_power = 0.7 -/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem + +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem name = "mushroom stem" desc = "A long mushroom stem. It's slightly glowing." list_reagents = list("tinlux" = 2, "vitamin" = 1, "space_drugs" = 1) icon_state = "mushroom_stem" luminosity = 1 + wine_power = 0.6 -/obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit +/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit name = "cactus fruit" list_reagents = list("vitamin" = 2, "nutriment" = 2, "vitfro" = 4) desc = "A cactus fruit covered in a thick, reddish skin. And some ash." icon_state = "cactus_fruit" + wine_power = 0.5 /obj/item/mushroom_bowl name = "mushroom bowl" @@ -200,6 +206,6 @@ /datum/crafting_recipe/mushroom_bowl name = "Mushroom Bowl" result = /obj/item/reagent_containers/food/drinks/mushroom_bowl - reqs = list(/obj/item/reagent_containers/food/snacks/ash_flora/shavings = 5) + reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5) time = 30 category = CAT_PRIMAL diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 30e093633f5..7609131a36b 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -274,7 +274,9 @@ if(M.maxHealth != initial(M.maxHealth)) to_chat(user, "[M] already has a reinforced chassis!") return + var/previous = M.maxHealth M.maxHealth = 170 + M.health += M.maxHealth - previous to_chat(user, "You reinforce [M]'s chassis.") qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 82e4af1862f..efeec62ae96 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -101,7 +101,7 @@ Difficulty: Medium animate(src, pixel_z = 0, time = 12) /obj/effect/temp_visual/target - icon = 'icons/mob/actions.dmi' + icon = 'icons/mob/actions/actions.dmi' icon_state = "sniper_zoom" layer = MOB_LAYER - 0.1 luminosity = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm index f2bed558b8c..b0756cddd7f 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm @@ -65,7 +65,7 @@ /datum/action/innate/terrorspider/queen/queensense name = "Hive Sense" - icon_icon = 'icons/mob/actions.dmi' + icon_icon = 'icons/mob/actions/actions.dmi' button_icon_state = "mindswap" /datum/action/innate/terrorspider/queen/queensense/Activate() diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index c74e5973bf7..9a74b155e52 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -1236,3 +1236,107 @@ drink_icon = "synthignonglass" drink_name = "Glass of Synthignon" drink_desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." + +/datum/reagent/consumable/ethanol/fruit_wine + name = "Fruit Wine" + id = "fruit_wine" + description = "A wine made from grown plants." + color = "#FFFFFF" + alcohol_perc = 0.35 + taste_message = "bad coding" + can_synth = FALSE + var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. + var/list/tastes = list("bad coding" = 1) //List of tastes. See above. + +/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) + names = data["names"] + tastes = data["tastes"] + alcohol_perc = data["alcohol_perc"] + color = data["color"] + generate_data_info(data) + +/datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount) + var/diff = (amount/volume) + if(diff < 1) + color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal. + else + color = BlendRGB(color, data["color"], (1/diff)/2) //Adjust so it's always blending properly. + var/oldvolume = volume-amount + + var/list/cachednames = data["names"] + for(var/name in names | cachednames) + names[name] = ((names[name] * oldvolume) + (cachednames[name] * amount)) / volume + + var/list/cachedtastes = data["tastes"] + for(var/taste in tastes | cachedtastes) + tastes[taste] = ((tastes[taste] * oldvolume) + (cachedtastes[taste] * amount)) / volume + + alcohol_perc *= oldvolume + var/newzepwr = data["alcohol_perc"] * amount + alcohol_perc += newzepwr + alcohol_perc /= volume //Blending alcohol percentage to volume. + generate_data_info(data) + +/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data) + var/minimum_percent = 0.15 //Percentages measured between 0 and 1. + var/list/primary_tastes = list() + var/list/secondary_tastes = list() + drink_name = "glass of [name]" + drink_desc = description + for(var/taste in tastes) + switch(tastes[taste]) + if(minimum_percent*2 to INFINITY) + primary_tastes += taste + if(minimum_percent to minimum_percent*2) + secondary_tastes += taste + + var/minimum_name_percent = 0.35 + name = "" + var/list/names_in_order = sortTim(names, /proc/cmp_numeric_dsc, TRUE) + var/named = FALSE + for(var/fruit_name in names) + if(names[fruit_name] >= minimum_name_percent) + name += "[fruit_name] " + named = TRUE + if(named) + name += "wine" + else + name = "mixed [names_in_order[1]] wine" + + var/alcohol_description + switch(alcohol_perc) + if(1.2 to INFINITY) + alcohol_description = "suicidally strong" + if(0.9 to 1.2) + alcohol_description = "rather strong" + if(0.7 to 0.9) + alcohol_description = "strong" + if(0.4 to 0.7) + alcohol_description = "rich" + if(0.2 to 0.4) + alcohol_description = "mild" + if(0 to 0.2) + alcohol_description = "sweet" + else + alcohol_description = "watery" //How the hell did you get negative boozepwr? + + var/list/fruits = list() + if(names_in_order.len <= 3) + fruits = names_in_order + else + for(var/i in 1 to 3) + fruits += names_in_order[i] + fruits += "other plants" + var/fruit_list = english_list(fruits) + description = "A [alcohol_description] wine brewed from [fruit_list]." + + var/flavor = "" + if(!primary_tastes.len) + primary_tastes = list("[alcohol_description] alcohol") + flavor += english_list(primary_tastes) + if(secondary_tastes.len) + flavor += ", with a hint of " + flavor += english_list(secondary_tastes) + taste_message = flavor + if(holder.my_atom) + holder.my_atom.on_reagent_change() diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 69030fafa74..e82dbda249d 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -95,7 +95,6 @@ spawn(5) reagents.clear_reagents() return else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - if(target.reagents && !target.reagents.total_volume) to_chat(user, "[target] is empty and can't be refilled!") return @@ -107,7 +106,7 @@ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) to_chat(user, "You fill [src] with [trans] unit\s of the contents of [target].") - else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. + else if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, "[src] is empty.") return diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 4bbc25a8037..e5ca5fb0d28 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -1,6 +1,7 @@ #define DIRECTION_FORWARDS 1 #define DIRECTION_OFF 0 #define DIRECTION_REVERSED -1 +#define IS_OPERATING (can_conveyor_run() && operating) GLOBAL_LIST_INIT(conveyor_belts, list()) //Saves us having to look through the entire machines list for our things GLOBAL_LIST_INIT(conveyor_switches, list()) @@ -22,7 +23,6 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) var/operable = TRUE // Can this belt actually go? var/list/affecting // the list of all items that will be moved this ptick var/reversed = FALSE // set to TRUE to have the conveyor belt be reversed - speed_process = TRUE //gotta go fast var/id //ID of the connected lever // create a conveyor @@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) /obj/machinery/conveyor/update_icon() ..() - if(operating && can_conveyor_run()) + if(IS_OPERATING) icon_state = "conveyor_started_[clockwise ? "cw" : "ccw"]" if(reversed) icon_state += "_r" @@ -161,20 +161,30 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) update_icon() /obj/machinery/conveyor/process() - if(!operating) - return - if(!can_conveyor_run()) + if(!IS_OPERATING) return use_power(100) affecting = loc.contents - src // moved items will be all in loc - if(!affecting) - return - sleep(1) - for(var/atom/movable/A in affecting) - if(!A.anchored) - if(A.loc == loc) // prevents the object from being affected if it's not currently here. - step(A,forwards) + var/still_stuff_to_move = FALSE + for(var/atom/movable/AM in affecting) + if(AM.anchored) + continue + still_stuff_to_move = TRUE + addtimer(CALLBACK(src, .proc/move_thing, AM), 1) CHECK_TICK + if(!still_stuff_to_move && speed_process) + makeNormalProcess() + else if(still_stuff_to_move && !speed_process) + makeSpeedProcess() + +/obj/machinery/conveyor/Crossed(atom/movable/AM) + if(!speed_process) + makeSpeedProcess() + ..() + +/obj/machinery/conveyor/proc/move_thing(atom/movable/AM) + if(!AM.anchored && AM.loc == loc) + step(AM, forwards) /obj/machinery/conveyor/proc/can_conveyor_run() if(stat & BROKEN) @@ -475,3 +485,4 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) #undef DIRECTION_FORWARDS #undef DIRECTION_OFF #undef DIRECTION_REVERSED +#undef IS_OPERATING diff --git a/html/changelog.html b/html/changelog.html index d6b2805b8c9..ea7c6c1725e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,56 @@ -->
+

08 November 2018

+

Citinited updated:

+
    +
  • Conveyors use less power now
  • +
+

Eschess updated:

+
    +
  • fixes the NOR, NAND and XOR logical gates
  • +
+

Farie82 updated:

+
    +
  • Mining bots now function as expected when giving them a health upgrade. No more repairing without healing
  • +
+

Fel updated:

+
    +
  • You can now craft wooden barrels with 30 pieces of wood! They can hold up to 300u of reagents.
  • +
  • Putting hydroponics-grown plants into the barrel lets you ferment them for alcohol! Some give bar drinks, while others simply give plain fruit wine.
  • +
  • Reagent containers like bottle & glass should be more consistent now.
  • +
+

Spartan updated:

+
    +
  • Plastic bags and wet floor signs can now spawn in maint.
  • +
  • Plastic bags are now supplied to your syndicate uplink. Apply directly to head.
  • +
+

Wario4356 updated:

+
    +
  • Mecha can now drill other mecha
  • +
+

Warior4356 updated:

+
    +
  • Mecha drills now tell you when they can't drill
  • +
+

datlo updated:

+
    +
  • Added the Toxins Payload Casing to crafting recipes, a new method of activating tank transfer valve bombs.
  • +
+

tigercat2000 updated:

+
    +
  • Mecha now use action buttons instead of ugly verbs.
  • +
  • Mecha weapons can now be selected through a radial menu brought up by Ctrl Clicking on the Mecha while you are piloting it.
  • +
  • Tooltips now appear on radial menu buttons when you hover over them. Seriously, why wasn't this a thing in the first place?
  • +
  • Action button icons are now located in their own file.
  • +
+

variableundefined updated:

+
    +
  • Baycard, including tarot cards to loadout
  • +
  • Baycard to prize machine
  • +
  • All non-syndicate card deck on map has been replaced with bay card.
  • +
+

07 November 2018

Spartan updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b656e8bc899..fdb39fc9235 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7905,3 +7905,39 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: objective lists are now sorted for admins. uc_guy: - bugfix: IPCs and slimes now have an effect on the floor when bleeding. +2018-11-08: + Citinited: + - tweak: Conveyors use less power now + Eschess: + - bugfix: fixes the NOR, NAND and XOR logical gates + Farie82: + - bugfix: Mining bots now function as expected when giving them a health upgrade. + No more repairing without healing + Fel: + - rscadd: You can now craft wooden barrels with 30 pieces of wood! They can hold + up to 300u of reagents. + - rscadd: Putting hydroponics-grown plants into the barrel lets you ferment them + for alcohol! Some give bar drinks, while others simply give plain fruit wine. + - tweak: Reagent containers like bottle & glass should be more consistent now. + Spartan: + - tweak: Plastic bags and wet floor signs can now spawn in maint. + - rscadd: Plastic bags are now supplied to your syndicate uplink. Apply directly + to head. + Wario4356: + - bugfix: Mecha can now drill other mecha + Warior4356: + - bugfix: Mecha drills now tell you when they can't drill + datlo: + - bugfix: Added the Toxins Payload Casing to crafting recipes, a new method of activating + tank transfer valve bombs. + tigercat2000: + - rscadd: Mecha now use action buttons instead of ugly verbs. + - rscadd: Mecha weapons can now be selected through a radial menu brought up by + Ctrl Clicking on the Mecha while you are piloting it. + - rscadd: Tooltips now appear on radial menu buttons when you hover over them. Seriously, + why wasn't this a thing in the first place? + - tweak: Action button icons are now located in their own file. + variableundefined: + - rscadd: Baycard, including tarot cards to loadout + - rscadd: Baycard to prize machine + - tweak: All non-syndicate card deck on map has been replaced with bay card. diff --git a/icons/mob/actions.dmi b/icons/mob/actions/actions.dmi similarity index 100% rename from icons/mob/actions.dmi rename to icons/mob/actions/actions.dmi diff --git a/icons/mob/actions/actions_mecha.dmi b/icons/mob/actions/actions_mecha.dmi new file mode 100644 index 00000000000..81c706b22c8 Binary files /dev/null and b/icons/mob/actions/actions_mecha.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 6ef2a7bead3..60488151158 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 1206aa48dfc..f9c13a5c332 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/paradise.dme b/paradise.dme index 98074328e5f..9c2e5e7a110 100644 --- a/paradise.dme +++ b/paradise.dme @@ -696,6 +696,7 @@ #include "code\game\mecha\mech_bay.dm" #include "code\game\mecha\mech_fabricator.dm" #include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" #include "code\game\mecha\mecha_construction_paths.dm" #include "code\game\mecha\mecha_control_console.dm" #include "code\game\mecha\mecha_parts.dm" @@ -1474,6 +1475,7 @@ #include "code\modules\holiday\christmas.dm" #include "code\modules\holiday\holiday.dm" #include "code\modules\hydroponics\biogenerator.dm" +#include "code\modules\hydroponics\fermenting_barrel.dm" #include "code\modules\hydroponics\gene_modder.dm" #include "code\modules\hydroponics\grown.dm" #include "code\modules\hydroponics\growninedible.dm"