@@ -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)
|
||||
|
||||
@@ -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"})
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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, "<span class='notice'>[M] connects to the port.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>[M] failed to connect to the port.</span>")
|
||||
|
||||
/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, "<span class='notice'>[M] disconnects from the port.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>[M] is not connected to a port at the moment.</span>")
|
||||
|
||||
//GUARDIANS
|
||||
/obj/screen/alert/cancharge
|
||||
name = "Charge Ready"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -10,4 +10,11 @@
|
||||
MA.icon = icon
|
||||
MA.icon_state = icon_state
|
||||
MA.layer = layer
|
||||
return MA
|
||||
return MA
|
||||
|
||||
/mutable_appearance/clean
|
||||
/mutable_appearance/clean/New()
|
||||
. = ..()
|
||||
alpha = 255
|
||||
opacity = 1
|
||||
transform = null
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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, "<span class='notice'>You load [src] with [I].</span>")
|
||||
ttv = I
|
||||
I.forceMove(src)
|
||||
else if (ttv)
|
||||
to_chat(user, "<span class='warning'>Another tank transfer valve is already loaded.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Remove the attached assembly component first.</span>")
|
||||
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
|
||||
|
||||
@@ -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("<font color='red'>Unable to move while in defence mode</font>")
|
||||
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("<font color='blue'>You enable [src] defence mode.</font>")
|
||||
else
|
||||
deflect_chance = initial(deflect_chance)
|
||||
occupant_message("<font color='red'>You disable [src] defence mode.</font>")
|
||||
log_message("Toggled defence mode.")
|
||||
|
||||
|
||||
/obj/mecha/combat/durand/get_stats_part()
|
||||
var/output = ..()
|
||||
output += "<b>Defence mode: [defence?"on":"off"]</b>"
|
||||
return output
|
||||
|
||||
/obj/mecha/combat/durand/get_commands()
|
||||
var/output = {"<div class='wr'>
|
||||
<div class='header'>Special</div>
|
||||
<div class='links'>
|
||||
<a href='?src=[UID()];toggle_defence_mode=1'>Toggle defence mode</a>
|
||||
</div>
|
||||
</div>
|
||||
"}
|
||||
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"
|
||||
|
||||
@@ -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("<font color='blue'>You disable leg actuators overload.</font>")
|
||||
else
|
||||
overload = 1
|
||||
step_in = min(1, round(step_in/2))
|
||||
step_energy_drain = step_energy_drain*overload_coeff
|
||||
occupant_message("<font color='red'>You enable leg actuators overload.</font>")
|
||||
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("<font color='red'>Leg actuators damage threshold exceded. Disabling overload.</font>")
|
||||
|
||||
|
||||
/obj/mecha/combat/gygax/get_stats_part()
|
||||
var/output = ..()
|
||||
output += "<b>Leg actuators overload: [overload?"on":"off"]</b>"
|
||||
return output
|
||||
|
||||
/obj/mecha/combat/gygax/get_commands()
|
||||
var/output = {"<div class='wr'>
|
||||
<div class='header'>Special</div>
|
||||
<div class='links'>
|
||||
<a href='?src=[UID()];toggle_leg_overload=1'>Toggle leg actuators overload</a>
|
||||
</div>
|
||||
</div>
|
||||
"}
|
||||
output += ..()
|
||||
return output
|
||||
|
||||
/obj/mecha/combat/gygax/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["toggle_leg_overload"])
|
||||
overload()
|
||||
cell.maxcharge = 30000
|
||||
@@ -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("<font color='[thrusters?"blue":"red"]'>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("<font color='[zoom?"blue":"red"]'>Zoom mode [zoom?"en":"dis"]abled.</font>")
|
||||
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 += {"<b>Smoke:</b> [smoke]
|
||||
<br>
|
||||
<b>Thrusters:</b> [thrusters?"on":"off"]
|
||||
"}
|
||||
return output
|
||||
|
||||
|
||||
/obj/mecha/combat/marauder/get_commands()
|
||||
var/output = {"<div class='wr'>
|
||||
<div class='header'>Special</div>
|
||||
<div class='links'>
|
||||
<a href='?src=[UID()];toggle_thrusters=1'>Toggle thrusters</a><br>
|
||||
<a href='?src=[UID()];toggle_zoom=1'>Toggle zoom mode</a><br>
|
||||
<a href='?src=[UID()];smoke=1'>Smoke</a>
|
||||
</div>
|
||||
</div>
|
||||
"}
|
||||
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()
|
||||
ME.attach(src)
|
||||
@@ -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 = {"<div class='wr'>
|
||||
<div class='header'>Special</div>
|
||||
<div class='links'>
|
||||
<a href='?src=[UID()];phasing=1'><span id="phasing_command">[phasing?"Dis":"En"]able phasing</span></a><br>
|
||||
<a href='?src=[UID()];switch_damtype=1'>Change melee damage type</a><br>
|
||||
</div>
|
||||
</div>
|
||||
"}
|
||||
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("<font color=\"[phasing?"#00f\">En":"#f00\">Dis"]abled phasing.</font>")
|
||||
return output
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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("<span class='danger'>[target] is too durable to drill through.</span>")
|
||||
return
|
||||
target.visible_message("<span class='warning'>[chassis] starts to drill [target].</span>",
|
||||
"<span class='userdanger'>[chassis] starts to drill [target]...</span>",
|
||||
|
||||
@@ -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("<span class='warning'>Unable to interact with objects while phasing.</span>")
|
||||
return
|
||||
if(state)
|
||||
occupant_message("<span class='warning'>Maintenance protocols in effect.</span>")
|
||||
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("<span class='danger'>Unable to move while in defence mode.</span>")
|
||||
last_message = world.time
|
||||
return 0
|
||||
if(zoom_mode)
|
||||
if(world.time - last_message > 20)
|
||||
occupant_message("<span class='danger'>Unable to move while in zoom mode.</span>")
|
||||
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("<font color='red'>Leg actuators damage threshold exceded. Disabling overload.</font>")
|
||||
|
||||
/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, "<span class='warning'>The welder must be on for this task!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The [name] is at full integrity!</span>")
|
||||
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 ? "<span class='announce'>Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!</span>" \
|
||||
: "<span class='notice'>You have been uploaded to a mech's onboard computer."]")
|
||||
to_chat(AI, "<span class='boldnotice'>Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.</span>")
|
||||
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("<span class='notice'>[name] connects to the port.</span>")
|
||||
verbs += /obj/mecha/verb/disconnect_from_port
|
||||
verbs -= /obj/mecha/verb/connect_to_port
|
||||
return
|
||||
else
|
||||
occupant_message("<span class='warning'>[name] failed to connect to the port.</span>")
|
||||
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("<span class='notice'>[name] disconnects from the port.</span>")
|
||||
verbs -= /obj/mecha/verb/disconnect_from_port
|
||||
verbs += /obj/mecha/verb/connect_to_port
|
||||
else
|
||||
occupant_message("<span class='warning'>[name] is not connected to the port at the moment.</span>")
|
||||
|
||||
/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, "<span class='notice'>Your imprint to [R.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.</span>")
|
||||
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, "<span class='notice'>Returning to core...</span>")
|
||||
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("<span class='notice'>You switch to [selected].</span>")
|
||||
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
|
||||
@@ -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("<span class='notice'>You enable [chassis] defence mode.</span>")
|
||||
else
|
||||
chassis.deflect_chance = initial(chassis.deflect_chance)
|
||||
chassis.occupant_message("<span class='danger'>You disable [chassis] defence mode.</span>")
|
||||
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("<span class='danger'>The leg actuators are too damaged to overload!</span>")
|
||||
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("<span class='danger'>You enable leg actuators overload.</span>")
|
||||
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("<span class='notice'>You disable leg actuators overload.</span>")
|
||||
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("<font color='[chassis.thrusters_active ? "blue" : "red"]'>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("<span class='warning'>You are either out of smoke, or the smoke isn't ready yet.</span>")
|
||||
|
||||
/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("<font color='[chassis.zoom_mode ? "blue" : "red"]'>Zoom mode [chassis.zoom_mode ? "en" : "dis"]abled.</font>")
|
||||
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("<font color=\"[chassis.phasing?"#00f\">En":"#f00\">Dis"]abled phasing.</font>")
|
||||
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()
|
||||
@@ -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?"<font color='red'><b>DAMAGE LEVEL CRITICAL</b></font><br>":null]
|
||||
<b>Integrity: </b> [integrity]%<br>
|
||||
<b>Powercell charge: </b>[isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]<br>
|
||||
<b>Air source: </b>[use_internal_tank?"Internal Airtank":"Environment"]<br>
|
||||
<b>Airtank pressure: </b>[tank_pressure]kPa<br>
|
||||
<b>Airtank temperature: </b>[tank_temperature]°K|[tank_temperature - T0C]°C<br>
|
||||
<b>Cabin pressure: </b>[cabin_pressure>WARNING_HIGH_PRESSURE ? "<font color='red'>[cabin_pressure]</font>": cabin_pressure]kPa<br>
|
||||
<b>Cabin temperature: </b> [return_temperature()]°K|[return_temperature() - T0C]°C<br>
|
||||
<b>Lights: </b>[lights?"on":"off"]<br>
|
||||
[dna?"<b>DNA-locked:</b><br> <span style='font-size:10px;letter-spacing:-1px;'>[dna]</span> \[<a href='?src=[UID()];reset_dna=1'>Reset</a>\]<br>":null]
|
||||
"}
|
||||
return output
|
||||
. = "[report_internal_damage()]"
|
||||
. += "[integrity<30?"<font color='red'><b>DAMAGE LEVEL CRITICAL</b></font><br>":null]"
|
||||
. += "<b>Integrity: </b> [integrity]%<br>"
|
||||
. += "<b>Powercell charge: </b>[isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]<br>"
|
||||
. += "<b>Air source: </b>[use_internal_tank?"Internal Airtank":"Environment"]<br>"
|
||||
. += "<b>Airtank pressure: </b>[tank_pressure]kPa<br>"
|
||||
. += "<b>Airtank temperature: </b>[tank_temperature]°K|[tank_temperature_c]°C<br>"
|
||||
. += "<b>Cabin pressure: </b>[cabin_pressure>WARNING_HIGH_PRESSURE ? "<font color='red'>[cabin_pressure]</font>": cabin_pressure]kPa<br>"
|
||||
. += "<b>Cabin temperature: </b> [return_temperature()]°K|[return_temperature() - T0C]°C<br>"
|
||||
. += "<b>Lights: </b>[lights?"on":"off"]<br>"
|
||||
. += "[dna ? "<b>DNA-locked:</b><br> <span style='font-size:10px;letter-spacing:-1px;'>[dna]</span> \[<a href='?src=[UID()];reset_dna=1'>Reset</a>\]<br>" : ""]"
|
||||
. += "[defense_action.owner ? "<b>Defence Mode: </b> [defence_mode ? "Enabled" : "Disabled"]<br>" : ""]"
|
||||
. += "[overload_action.owner ? "<b>Leg Actuators Overload: </b> [leg_overload_mode ? "Enabled" : "Disabled"]<br>" : ""]"
|
||||
. += "[thrusters_action.owner ? "<b>Thrusters: </b> [thrusters_active ? "Enabled" : "Disabled"]<br>" : ""]"
|
||||
. += "[smoke_action.owner ? "<b>Smoke: </b> [smoke]<br>" : ""]"
|
||||
. += "[zoom_action.owner ? "<b>Zoom: </b> [zoom_mode ? "Enabled" : "Disabled"]<br>" : ""]"
|
||||
. += "[phasing_action.owner ? "<b>Phase Modulator: </b> [phasing ? "Enabled" : "Disabled"]<br>" : ""]"
|
||||
|
||||
/obj/mecha/proc/get_commands()
|
||||
var/output = {"<div class='wr'>
|
||||
<div class='header'>Electronics</div>
|
||||
<div class='links'>
|
||||
<a href='?src=[UID()];toggle_lights=1'>Toggle Lights</a><br>
|
||||
<b>Radio settings:</b><br>
|
||||
Microphone: <a href='?src=[UID()];rmictoggle=1'><span id="rmicstate">[radio.broadcasting?"Engaged":"Disengaged"]</span></a><br>
|
||||
Speaker: <a href='?src=[UID()];rspktoggle=1'><span id="rspkstate">[radio.listening?"Engaged":"Disengaged"]</span></a><br>
|
||||
Frequency:
|
||||
<a href='?src=[UID()];rfreq=-10'>-</a>
|
||||
<a href='?src=[UID()];rfreq=-2'>-</a>
|
||||
<span id="rfreq">[format_frequency(radio.frequency)]</span>
|
||||
<a href='?src=[UID()];rfreq=2'>+</a>
|
||||
<a href='?src=[UID()];rfreq=10'>+</a><br>
|
||||
</div>
|
||||
</div>
|
||||
<div class='wr'>
|
||||
<div class='header'>Airtank</div>
|
||||
<div class='links'>
|
||||
<a href='?src=[UID()];toggle_airtank=1'>Toggle Internal Airtank Usage</a><br>
|
||||
[(/obj/mecha/verb/disconnect_from_port in verbs)?"<a href='?src=[UID()];port_disconnect=1'>Disconnect from port</a><br>":null]
|
||||
[(/obj/mecha/verb/connect_to_port in verbs)?"<a href='?src=[UID()];port_connect=1'>Connect to port</a><br>":null]
|
||||
</div>
|
||||
</div>
|
||||
<div class='wr'>
|
||||
<div class='header'>Permissions & Logging</div>
|
||||
<div class='links'>
|
||||
<a href='?src=[UID()];toggle_id_upload=1'><span id='t_id_upload'>[add_req_access?"L":"Unl"]ock ID upload panel</span></a><br>
|
||||
<a href='?src=[UID()];toggle_maint_access=1'><span id='t_maint_access'>[maint_access?"Forbid":"Permit"] maintenance protocols</span></a><br>
|
||||
<a href='?src=[UID()];dna_lock=1'>DNA-lock</a><br>
|
||||
<a href='?src=[UID()];view_log=1'>View internal log</a><br>
|
||||
<a href='?src=[UID()];change_name=1'>Change exosuit name</a><br>
|
||||
</div>
|
||||
</div>
|
||||
<div id='equipment_menu'>[get_equipment_menu()]</div>
|
||||
<hr>
|
||||
[(/obj/mecha/verb/eject in verbs)?"<a href='?src=[UID()];eject=1'>Eject</a><br>":null]
|
||||
"}
|
||||
return output
|
||||
. = "<div class='wr'>"
|
||||
. += "<div class='header'>Electronics</div>"
|
||||
. += "<div class='links'>"
|
||||
. += "<a href='?src=[UID()];toggle_lights=1'>Toggle Lights</a><br>"
|
||||
. += "<b>Radio settings:</b><br>"
|
||||
. += "Microphone: <a href='?src=[UID()];rmictoggle=1'><span id='rmicstate'>[radio.broadcasting?"Engaged":"Disengaged"]</span></a><br>"
|
||||
. += "Speaker: <a href='?src=[UID()];rspktoggle=1'><span id='rspkstate'>[radio.listening?"Engaged":"Disengaged"]</span></a><br>"
|
||||
. += "Frequency:"
|
||||
. += "<a href='?src=[UID()];rfreq=-10'>-</a>"
|
||||
. += "<a href='?src=[UID()];rfreq=-2'>-</a>"
|
||||
. += "<span id='rfreq'>[format_frequency(radio.frequency)]</span>"
|
||||
. += "<a href='?src=[UID()];rfreq=2'>+</a>"
|
||||
. += "<a href='?src=[UID()];rfreq=10'>+</a><br>"
|
||||
. += "</div>"
|
||||
. += "</div>"
|
||||
. += "<div class='wr'>"
|
||||
. += "<div class='header'>Airtank</div>"
|
||||
. += "<div class='links'>"
|
||||
. += "<a href='?src=[UID()];toggle_airtank=1'>Toggle Internal Airtank Usage</a><br>"
|
||||
. += "</div>"
|
||||
. += "</div>"
|
||||
. += "<div class='wr'>"
|
||||
. += "<div class='header'>Permissions & Logging</div>"
|
||||
. += "<div class='links'>"
|
||||
. += "<a href='?src=[UID()];toggle_id_upload=1'><span id='t_id_upload'>[add_req_access?"L":"Unl"]ock ID upload panel</span></a><br>"
|
||||
. += "<a href='?src=[UID()];toggle_maint_access=1'><span id='t_maint_access'>[maint_access?"Forbid":"Permit"] maintenance protocols</span></a><br>"
|
||||
. += "<a href='?src=[UID()];dna_lock=1'>DNA-lock</a><br>"
|
||||
. += "<a href='?src=[UID()];view_log=1'>View internal log</a><br>"
|
||||
. += "<a href='?src=[UID()];change_name=1'>Change exosuit name</a><br>"
|
||||
. += "</div>"
|
||||
. += "</div>"
|
||||
. += "<div id='equipment_menu'>[get_equipment_menu()]</div>"
|
||||
. += "<hr>"
|
||||
. += "<a href='?src=[UID()];eject=1'>Eject</a><br>"
|
||||
|
||||
/obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu
|
||||
var/output
|
||||
. = ""
|
||||
if(equipment.len)
|
||||
output += {"<div class='wr'>
|
||||
<div class='header'>Equipment</div>
|
||||
<div class='links'>"}
|
||||
. += "<div class='wr'>"
|
||||
. += "<div class='header'>Equipment</div>"
|
||||
. += "<div class='links'>"
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/W in equipment)
|
||||
output += "[W.name] <a href='?src=[W.UID()];detach=1'>Detach</a><br>"
|
||||
output += "<b>Available equipment slots:</b> [max_equip-equipment.len]"
|
||||
output += "</div></div>"
|
||||
return output
|
||||
. += "[W.name] <a href='?src=[W.UID()];detach=1'>Detach</a><br>"
|
||||
. += "<b>Available equipment slots:</b> [max_equip-equipment.len]"
|
||||
. += "</div></div>"
|
||||
|
||||
/obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html
|
||||
if(!equipment.len)
|
||||
return
|
||||
var/output = "<b>Equipment:</b><div style=\"margin-left: 15px;\">"
|
||||
. = "<b>Equipment:</b><div style=\"margin-left: 15px;\">"
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment)
|
||||
output += "<div id='\ref[MT]'>[MT.get_equip_info()]</div>"
|
||||
output += "</div>"
|
||||
return output
|
||||
. += "<div id='\ref[MT]'>[MT.get_equip_info()]</div>"
|
||||
. += "</div>"
|
||||
|
||||
|
||||
/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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, "<b><font color= red>You have been frozen by <a href='?priv_msg=[usr.client.UID()]'>[key]</a></b></font>")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]</span>")
|
||||
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, "<b><font color= red>You have been unfrozen by <a href='?priv_msg=[usr.client.UID()]'>[key]</a></b></font>")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]</span>")
|
||||
log_admin("[key_name(usr)] unfroze [key_name(M.occupant)] in a [M.name]")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, "<span class='warning'> [src] is empty.</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -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, "<span class='notice'>It is currently [open ? "open, letting you pour liquids in." : "closed, letting you draw liquids from the tap."] </span>")
|
||||
|
||||
/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, "<span class='warning'>You can't distill this into anything...</span>")
|
||||
return FALSE
|
||||
else if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>[G] is stuck to your hand!</span>")
|
||||
return FALSE
|
||||
G.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You place [G] into [src] to start the fermentation process.</span>")
|
||||
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, "<span class='notice'>You open [src], letting you fill it.</span>")
|
||||
else
|
||||
container_type = DRAINABLE | AMOUNT_VISIBLE
|
||||
to_chat(user, "<span class='notice'>You close [src], letting you draw from its tap.</span>")
|
||||
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
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
seed = /obj/item/seeds/ambrosia/cruciatus
|
||||
wine_power = 0.7
|
||||
@@ -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
|
||||
|
||||
@@ -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("<span class='suicide'>[user] is aiming the [name] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.4
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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("<span class='notice'>[user] crushes [src] into meat.</span>", "<span class='notice'>You crush [src] into something that resembles meat.</span>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
filling_color = "#FFD700"
|
||||
distill_reagent = "vanilla" //Takes longer, but you can get even more vanilla from it.
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "eggnog"
|
||||
@@ -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
|
||||
|
||||
@@ -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, "<span class='notice'>You prepare the astroturf.</span>")
|
||||
@@ -65,3 +66,4 @@
|
||||
desc = "The textile industry's dark secret."
|
||||
icon_state = "carpetclump"
|
||||
stacktype = /obj/item/stack/tile/carpet
|
||||
can_distill = FALSE
|
||||
|
||||
@@ -95,3 +95,4 @@
|
||||
icon_state = "kudzupod"
|
||||
filling_color = "#6B8E23"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.2
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 = "<I>Amanita Virosa</I>: 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 = "<I>Psilocybe Semilanceata</I>: Liberate yourself!"
|
||||
icon_state = "libertycap"
|
||||
filling_color = "#DAA520"
|
||||
wine_power = 0.8
|
||||
wine_flavor = "freedom"
|
||||
|
||||
|
||||
// Plump Helmet
|
||||
@@ -135,6 +139,7 @@
|
||||
desc = "<I>Plumus Hellmus</I>: 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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -24,4 +24,5 @@
|
||||
icon_state = "pineapple"
|
||||
filling_color = "#e5b437"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
bitesize_mod = 3
|
||||
bitesize_mod = 3
|
||||
wine_power = 0.4
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -26,4 +26,10 @@
|
||||
name = "strange plant"
|
||||
desc = "What could this even be?"
|
||||
icon_state = "crunchy"
|
||||
bitesize_mod = 2
|
||||
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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
icon_state = "stobacco_leaves"
|
||||
distill_reagent = null
|
||||
wine_power = 0.5
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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("<span class='danger'>[H] steps on a cactus!</span>", \
|
||||
"<span class='userdanger'>You step on a cactus!</span>")
|
||||
|
||||
/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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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, "<span class='warning'>[target] is empty and can't be refilled!</span>")
|
||||
return
|
||||
@@ -107,7 +106,7 @@
|
||||
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
|
||||
to_chat(user, "<span class='notice'>You fill [src] with [trans] unit\s of the contents of [target].</span>")
|
||||
|
||||
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, "<span class='warning'>[src] is empty.</span>")
|
||||
return
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -56,6 +56,56 @@
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
|
||||
<h2 class="date">08 November 2018</h2>
|
||||
<h3 class="author">Citinited updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Conveyors use less power now</li>
|
||||
</ul>
|
||||
<h3 class="author">Eschess updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">fixes the NOR, NAND and XOR logical gates</li>
|
||||
</ul>
|
||||
<h3 class="author">Farie82 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Mining bots now function as expected when giving them a health upgrade. No more repairing without healing</li>
|
||||
</ul>
|
||||
<h3 class="author">Fel updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">You can now craft wooden barrels with 30 pieces of wood! They can hold up to 300u of reagents.</li>
|
||||
<li class="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.</li>
|
||||
<li class="tweak">Reagent containers like bottle & glass should be more consistent now.</li>
|
||||
</ul>
|
||||
<h3 class="author">Spartan updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Plastic bags and wet floor signs can now spawn in maint.</li>
|
||||
<li class="rscadd">Plastic bags are now supplied to your syndicate uplink. Apply directly to head.</li>
|
||||
</ul>
|
||||
<h3 class="author">Wario4356 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Mecha can now drill other mecha</li>
|
||||
</ul>
|
||||
<h3 class="author">Warior4356 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Mecha drills now tell you when they can't drill</li>
|
||||
</ul>
|
||||
<h3 class="author">datlo updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Added the Toxins Payload Casing to crafting recipes, a new method of activating tank transfer valve bombs.</li>
|
||||
</ul>
|
||||
<h3 class="author">tigercat2000 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Mecha now use action buttons instead of ugly verbs.</li>
|
||||
<li class="rscadd">Mecha weapons can now be selected through a radial menu brought up by Ctrl Clicking on the Mecha while you are piloting it.</li>
|
||||
<li class="rscadd">Tooltips now appear on radial menu buttons when you hover over them. Seriously, why wasn't this a thing in the first place?</li>
|
||||
<li class="tweak">Action button icons are now located in their own file.</li>
|
||||
</ul>
|
||||
<h3 class="author">variableundefined updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Baycard, including tarot cards to loadout</li>
|
||||
<li class="rscadd">Baycard to prize machine</li>
|
||||
<li class="tweak">All non-syndicate card deck on map has been replaced with bay card.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">07 November 2018</h2>
|
||||
<h3 class="author">Spartan updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 112 KiB |
@@ -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"
|
||||
|
||||