From 4770eca75ec7344757229967447383ead60c965d Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 27 Feb 2021 10:19:00 +0100 Subject: [PATCH] [MIRROR] Adds tourist robots that order food and drinks from the bar and cafeteria (#3651) * Adds tourist robots that order food and drinks from the bar and cafeteria (#57010) * Adds Tourism Economy Co-authored-by: Emmanuel S. Co-authored-by: ATH1909 <42606352+ATH1909@ users.noreply.github.com> Co-authored-by: coiax Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com> * Adds tourist robots that order food and drinks from the bar and cafeteria Co-authored-by: Qustinnus Co-authored-by: Emmanuel S. Co-authored-by: ATH1909 <42606352+ATH1909@ users.noreply.github.com> Co-authored-by: coiax Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com> --- .../map_files/Deltastation/DeltaStation2.dmm | 10 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 58 +++++- _maps/map_files/KiloStation/KiloStation.dmm | 13 +- _maps/map_files/MetaStation/MetaStation.dmm | 29 +-- code/__DEFINES/ai.dm | 9 + code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/food.dm | 18 ++ code/__DEFINES/footsteps.dm | 1 + code/__DEFINES/subsystems.dm | 1 + code/controllers/subsystem/restaurant.dm | 24 +++ code/datums/ai/_ai_controller.dm | 4 +- code/datums/ai/generic_actions.dm | 8 + code/datums/ai/movement/_ai_movement.dm | 6 +- .../movement/ai_movement_basic_avoidance.dm | 12 ++ .../robot_customer_behaviors.dm | 111 +++++++++++ .../robot_customer_controller.dm | 60 ++++++ code/datums/components/footstep.dm | 4 + code/datums/elements/food/food_trash.dm | 1 + code/datums/elements/food/venue_price.dm | 23 +++ code/game/alternate_appearance.dm | 3 + .../circuitboards/machine_circuitboards.dm | 6 + code/game/objects/items/food/_food.dm | 4 + code/game/objects/items/food/bread.dm | 7 + code/game/objects/items/food/burgers.dm | 31 ++- code/game/objects/items/food/cake.dm | 11 + code/game/objects/items/food/egg.dm | 1 + code/game/objects/items/food/meat.dm | 10 + code/game/objects/items/food/misc.dm | 5 +- code/game/objects/items/food/pastries.dm | 2 + code/game/objects/items/food/pie.dm | 2 + code/game/objects/items/food/pizza.dm | 2 + code/game/objects/items/food/salad.dm | 1 + code/game/objects/items/food/soup.dm | 11 +- code/game/objects/items/food/spaghetti.dm | 1 + code/game/objects/items/holosign_creator.dm | 9 + code/game/objects/structures/holosign.dm | 9 +- .../recipes/tablecraft/recipes_burger.dm | 2 +- .../food_and_drinks/restaurant/_venue.dm | 188 ++++++++++++++++++ .../restaurant/customers/_customer.dm | 86 ++++++++ .../restaurant/generic_venues.dm | 119 +++++++++++ code/modules/mob/living/carbon/human/human.dm | 4 - .../mob/living/simple_animal/bot/mulebot.dm | 8 +- .../simple_animal/friendly/robot_customer.dm | 81 ++++++++ .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/reagents/chemistry/reagents.dm | 2 + .../chemistry/reagents/alcohol_reagents.dm | 12 ++ .../chemistry/reagents/drink_reagents.dm | 1 + .../chemistry/reagents/food_reagents.dm | 13 +- .../research/designs/autolathe_designs.dm | 21 ++ .../research/designs/machine_designs.dm | 8 + code/modules/research/techweb/all_nodes.dm | 2 +- icons/effects/effects.dmi | Bin 912791 -> 913165 bytes icons/mob/tourists.dmi | Bin 0 -> 4291 bytes icons/obj/machines/restaurant_portal.dmi | Bin 0 -> 3629 bytes sound/effects/tank_treads.ogg | Bin 0 -> 22864 bytes sound/effects/tourist_talk.ogg | Bin 0 -> 17209 bytes strings/names/american_prefix.txt | 23 +++ strings/names/french_prefix.txt | 9 + strings/names/italian_prefix.txt | 8 + tgstation.dme | 9 + 60 files changed, 1050 insertions(+), 57 deletions(-) create mode 100644 code/controllers/subsystem/restaurant.dm create mode 100644 code/datums/ai/movement/ai_movement_basic_avoidance.dm create mode 100644 code/datums/ai/robot_customer/robot_customer_behaviors.dm create mode 100644 code/datums/ai/robot_customer/robot_customer_controller.dm create mode 100644 code/datums/elements/food/venue_price.dm create mode 100644 code/modules/food_and_drinks/restaurant/_venue.dm create mode 100644 code/modules/food_and_drinks/restaurant/customers/_customer.dm create mode 100644 code/modules/food_and_drinks/restaurant/generic_venues.dm create mode 100644 code/modules/mob/living/simple_animal/friendly/robot_customer.dm create mode 100644 icons/mob/tourists.dmi create mode 100644 icons/obj/machines/restaurant_portal.dmi create mode 100644 sound/effects/tank_treads.ogg create mode 100644 sound/effects/tourist_talk.ogg create mode 100644 strings/names/american_prefix.txt create mode 100644 strings/names/french_prefix.txt create mode 100644 strings/names/italian_prefix.txt diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index dd0ed105efd..9fc5bfd10af 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -29135,8 +29135,6 @@ /turf/open/space, /area/space/nearstation) "cqu" = ( -/obj/structure/table/wood, -/obj/item/clothing/mask/cigarette/pipe, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -29147,6 +29145,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/restaurant_portal/restaurant, /turf/open/floor/iron/dark, /area/service/bar/atrium) "cqH" = ( @@ -69065,8 +69064,6 @@ /turf/open/floor/iron, /area/engineering/main) "hzj" = ( -/obj/structure/table/wood, -/obj/item/clothing/head/fedora, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -69077,6 +69074,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/restaurant_portal/bar, /turf/open/floor/iron/dark, /area/service/bar/atrium) "hzE" = ( @@ -73928,6 +73926,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/item/clothing/head/fedora, /turf/open/floor/iron, /area/service/bar/atrium) "jqu" = ( @@ -88938,6 +88937,7 @@ /obj/item/reagent_containers/glass/bowl, /obj/effect/turf_decal/bot, /obj/item/food/dough, +/obj/item/holosign_creator/robot_seat/restaurant, /turf/open/floor/iron, /area/service/kitchen) "oJI" = ( @@ -103602,6 +103602,7 @@ }, /obj/item/clipboard, /obj/item/toy/figure/bartender, +/obj/item/holosign_creator/robot_seat/bar, /turf/open/floor/iron/dark, /area/service/bar) "udl" = ( @@ -113574,6 +113575,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/item/clothing/mask/cigarette/pipe, /turf/open/floor/iron, /area/service/bar/atrium) "xRL" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index ca185029ab0..097455881c4 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -27315,7 +27315,9 @@ /turf/open/floor/iron/white, /area/medical/virology) "cXd" = ( -/obj/structure/chair/stool/bar, +/obj/structure/chair/stool/bar{ + dir = 4 + }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -40570,6 +40572,16 @@ /obj/item/clothing/suit/hooded/wintercoat, /turf/open/floor/iron, /area/commons/storage/mining) +"mCN" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/chair/stool/bar{ + dir = 4 + }, +/turf/open/floor/iron, +/area/service/bar) "mDf" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/engineering{ @@ -42945,6 +42957,12 @@ /obj/machinery/navbeacon/wayfinding, /turf/open/floor/iron, /area/commons/dorms) +"opx" = ( +/obj/machinery/restaurant_portal/restaurant, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/hallway/primary/starboard) "opE" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -43319,6 +43337,14 @@ }, /turf/closed/wall, /area/commons/fitness) +"oHO" = ( +/obj/structure/chair/stool/bar{ + dir = 1 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/hallway/primary/starboard) "oHS" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -48821,6 +48847,7 @@ /obj/structure/closet/secure_closet/bar{ req_access_txt = "25" }, +/obj/item/holosign_creator/robot_seat/bar, /turf/open/floor/wood, /area/service/bar) "sCq" = ( @@ -49339,6 +49366,7 @@ /obj/structure/table, /obj/effect/spawner/lootdrop/donkpockets, /obj/item/reagent_containers/glass/beaker, +/obj/item/holosign_creator/robot_seat/restaurant, /turf/open/floor/iron/cafeteria, /area/service/kitchen) "sWw" = ( @@ -56104,6 +56132,14 @@ }, /turf/open/floor/iron, /area/cargo/miningdock) +"xzy" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/restaurant_portal/bar, +/turf/open/floor/iron, +/area/service/bar) "xzA" = ( /obj/structure/table, /obj/item/folder/white, @@ -92629,7 +92665,7 @@ oHj dSU crr iHa -dLp +xzy jcA hYS jcA @@ -93402,10 +93438,10 @@ gYp dEb jUE cXd -cXd -cXd -cXd -cXd +mCN +mCN +mCN +mCN dLp wUq wXj @@ -94950,7 +94986,7 @@ nUo nUo tIN mjA -bbz +opx aYV iKz aYV @@ -95464,7 +95500,7 @@ omc nUo xiq xoj -bbz +oHO aYV iKz aYV @@ -95721,7 +95757,7 @@ sWv nZu xiq pIM -bbz +oHO aYV iKz aYV @@ -95978,7 +96014,7 @@ rmK nUo myl pIM -bbz +oHO aYV iKz cBm @@ -96235,7 +96271,7 @@ rmK nUo xiq ewZ -bbz +oHO aYV iKz bdc diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index f65ed254639..63822f74d55 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -9553,10 +9553,8 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, /obj/effect/turf_decal/stripes/corner, +/obj/effect/spawner/randomcolavend, /turf/open/floor/iron, /area/hallway/primary/fore) "auj" = ( @@ -57258,6 +57256,7 @@ pixel_y = 5 }, /obj/item/reagent_containers/glass/beaker, +/obj/item/holosign_creator/robot_seat/restaurant, /turf/open/floor/iron/dark, /area/service/kitchen) "eOX" = ( @@ -57348,14 +57347,10 @@ /turf/open/floor/iron/dark, /area/service/chapel/office) "eRD" = ( -/obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/effect/turf_decal/tile/neutral, -/obj/machinery/computer/libraryconsole{ - pixel_y = 5 - }, /obj/effect/decal/cleanable/cobweb, /obj/structure/extinguisher_cabinet{ pixel_x = -26 @@ -57363,6 +57358,7 @@ /obj/item/radio/intercom{ pixel_y = 22 }, +/obj/machinery/restaurant_portal/bar, /turf/open/floor/iron/dark, /area/service/bar) "eRF" = ( @@ -82925,6 +82921,7 @@ /obj/machinery/light{ dir = 4 }, +/obj/item/holosign_creator/robot_seat/bar, /turf/open/floor/iron/dark, /area/service/bar) "tfm" = ( @@ -87327,7 +87324,6 @@ /area/cargo/miningoffice) "vyL" = ( /obj/effect/turf_decal/bot, -/obj/effect/spawner/randomcolavend, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -87335,6 +87331,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/restaurant_portal/restaurant, /turf/open/floor/iron/dark, /area/service/bar/atrium) "vyM" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 4e6817ee34d..d107386632c 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -22819,7 +22819,11 @@ /turf/open/floor/iron/dark, /area/security/office) "ciV" = ( -/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/gambling, /turf/open/floor/wood, /area/service/bar) "ciX" = ( @@ -25755,9 +25759,6 @@ /turf/open/floor/plating, /area/science/mixing) "cAS" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 9 }, @@ -42568,9 +42569,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ dir = 1 }, -/obj/structure/chair/stool{ - pixel_y = 8 - }, /turf/open/floor/wood, /area/service/bar) "hZZ" = ( @@ -50013,10 +50011,10 @@ /turf/open/floor/iron/white, /area/medical/medbay/central) "lgc" = ( -/obj/item/kirbyplants/random, /obj/effect/turf_decal/siding/wood{ dir = 8 }, +/obj/machinery/restaurant_portal/bar, /turf/open/floor/wood, /area/service/bar) "lgq" = ( @@ -58494,6 +58492,7 @@ /obj/machinery/light{ dir = 1 }, +/obj/machinery/restaurant_portal/restaurant, /turf/open/floor/wood, /area/service/bar) "oFp" = ( @@ -59817,8 +59816,6 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/table/wood, -/obj/effect/spawner/lootdrop/gambling, /turf/open/floor/wood, /area/service/bar) "pds" = ( @@ -60286,6 +60283,7 @@ dir = 1 }, /obj/structure/table/reinforced, +/obj/item/holosign_creator/robot_seat/bar, /turf/open/floor/iron, /area/service/bar) "pod" = ( @@ -68883,6 +68881,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/structure/chair/stool{ + pixel_y = 8 + }, /turf/open/floor/wood, /area/service/bar) "sGh" = ( @@ -74850,6 +74851,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2, +/obj/structure/chair/stool{ + pixel_y = 8 + }, /turf/open/floor/wood, /area/service/bar) "vih" = ( @@ -75238,6 +75242,7 @@ id = "kitchen_counter"; name = "Kitchen Counter Shutters" }, +/obj/item/holosign_creator/robot_seat/restaurant, /turf/open/floor/iron/cafeteria{ dir = 5 }, @@ -117069,7 +117074,7 @@ bhG bjp tFU hkR -ciV +otW otW pTE rNI @@ -117588,7 +117593,7 @@ rXA rSf oNP vic -imL +ciV sFA mio vlj diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm index a87781a40c0..73d5ed53dd3 100644 --- a/code/__DEFINES/ai.dm +++ b/code/__DEFINES/ai.dm @@ -60,3 +60,12 @@ #define BB_VENDING_UNTILT_COOLDOWN "BB_vending_untilt_cooldown" #define BB_VENDING_BUSY_TILTING "BB_vending_busy_tilting" #define BB_VENDING_LAST_HIT_SUCCESFUL "BB_vending_last_hit_succesful" + +///Robot customer AI controller blackboard keys +#define BB_CUSTOMER_CURRENT_ORDER "BB_customer_current_order" +#define BB_CUSTOMER_MY_SEAT "BB_customer_my_seat" +#define BB_CUSTOMER_PATIENCE "BB_customer_patience" +#define BB_CUSTOMER_CUSTOMERINFO "BB_customer_customerinfo" +#define BB_CUSTOMER_EATING "BB_customer_eating" +#define BB_CUSTOMER_ATTENDING_VENUE "BB_customer_attending_avenue" +#define BB_CUSTOMER_LEAVING "BB_customer_leaving" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 1e5f6703642..a9c9d34892b 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -909,6 +909,8 @@ ///called on an object by its NTNET connection component on a port distruction (port, list/data)) #define COMSIG_COMPONENT_NTNET_PORT_UPDATED "ntnet_port_updated" +///Restaurant +#define COMSIG_ITEM_SOLD_TO_CUSTOMER "item_sold_to_customer" //Nanites diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index f8694d882f2..b59162b943c 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -57,3 +57,21 @@ #define FOOD_LIKED 1 #define FOOD_DISLIKED 2 #define FOOD_TOXIC 3 + +///Venue reagent requirement +#define VENUE_BAR_MINIMUM_REAGENTS 10 + + + +///Food price classes +#define FOOD_PRICE_TRASH 10 //cheap and quick. +#define FOOD_PRICE_CHEAP 40 //In line with prices of cheap snacks and foods you find in vending machine, practically disposable. +#define FOOD_PRICE_NORMAL 100 //Half a crate of profit, selling 4 of these lets you buy a kitchen crate from cargo. +#define FOOD_PRICE_EXOTIC 300 //Making one of these should be worth the time investment, solid chunk of profit. +#define FOOD_PRICE_LEGENDARY 1000 //Large windfall for making something from this list. + + +#define DRINK_PRICE_STOCK 20 +#define DRINK_PRICE_EASY 35 +#define DRINK_PRICE_MEDIUM 80 +#define DRINK_PRICE_HIGH 200 diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index 02af15e40d2..1c6d639ebce 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -24,6 +24,7 @@ #define FOOTSTEP_MOB_HUMAN 5 //Warning: Only works on /mob/living/carbon/human #define FOOTSTEP_MOB_SLIME 6 #define FOOTSTEP_OBJ_MACHINE 7 +#define FOOTSTEP_OBJ_ROBOT 8 /* diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 5d945cf5d1c..cb002c68c1b 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -127,6 +127,7 @@ #define INIT_ORDER_NETWORKS 45 #define INIT_ORDER_ECONOMY 40 #define INIT_ORDER_OUTPUTS 35 +#define INIT_ORDER_RESTAURANT 34 #define INIT_ORDER_ATOMS 30 #define INIT_ORDER_LANGUAGE 25 #define INIT_ORDER_MACHINES 20 diff --git a/code/controllers/subsystem/restaurant.dm b/code/controllers/subsystem/restaurant.dm new file mode 100644 index 00000000000..7917c0fc77e --- /dev/null +++ b/code/controllers/subsystem/restaurant.dm @@ -0,0 +1,24 @@ +/*! +This subsystem exists to serve as a holder for important info for the restaurant system for chef and bartender. +*/ + +SUBSYSTEM_DEF(restaurant) + name = "Restaurant" + wait = 20 SECONDS //Roll for new guests but don't do it too fast. + init_order = INIT_ORDER_RESTAURANT + flags = SS_NO_FIRE + ///All venues that exist, assoc list of type - reference + var/list/all_venues = list() + ///All customer data datums that exist, assoc list of type - reference + var/list/all_customers = list() + ///Seats claimed by robots. They want these. Don't be rude about it to them. assoc list of seat key and robot mob value + var/list/claimed_seats = list() + ///Caches appearances of food, assoc list where key is the type of food, and value is the appearance. Used so we don't have to keep creating new food. Gets filled whenever a new food that hasn't been ordered gets ordered for the first time. + var/list/food_appearance_cache = list() + +/datum/controller/subsystem/restaurant/Initialize(timeofday) + . = ..() + for(var/key in subtypesof(/datum/venue)) + all_venues[key] = new key() + for(var/key in subtypesof(/datum/customer_data)) + all_customers[key] = new key() diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index abe43e515cd..635df1e8594 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -16,8 +16,6 @@ have ways of interacting with a specific atom and control it. They posses a blac var/ai_status ///Current movement target of the AI, generally set by decision making. var/atom/current_movement_target - ///Delay between atom movements, if this is not a multiplication of the delay in - var/move_delay ///This is a list of variables the AI uses and can be mutated by actions. When an action is performed you pass this list and any relevant keys for the variables it can mutate. var/list/blackboard = list() ///Tracks recent pathing attempts, if we fail too many in a row we fail our current plans. @@ -115,7 +113,7 @@ have ways of interacting with a specific atom and control it. They posses a blac return else if(ai_movement.moving_controllers[src] != current_movement_target) //We're too far, if we're not already moving start doing it. - ai_movement.start_moving_towards(src, current_movement_target) //Then start moving + ai_movement.start_moving_towards(src, current_movement_target, current_behavior.required_distance) //Then start moving if(current_behavior.behavior_flags & AI_BEHAVIOR_MOVE_AND_PERFORM) //If we can move and perform then do so. current_behavior.perform(delta_time, src) diff --git a/code/datums/ai/generic_actions.dm b/code/datums/ai/generic_actions.dm index a3af839a568..99b75ae230a 100644 --- a/code/datums/ai/generic_actions.dm +++ b/code/datums/ai/generic_actions.dm @@ -14,3 +14,11 @@ var/mob/living/living_pawn = controller.pawn INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick(screeches)) finish_action(controller, TRUE) + +///Moves to target then finishes +/datum/ai_behavior/move_to_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/move_to_target/perform(delta_time, datum/ai_controller/controller) + . = ..() + finish_action(controller, TRUE) diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index 6b0eb02cfb9..495db7ae672 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -2,10 +2,12 @@ /datum/ai_movement ///Assoc list ist of controllers that are currently moving as key, and what they are moving to as value var/list/moving_controllers = list() + ///Does this type require processing? + var/requires_processing = TRUE /datum/ai_movement/proc/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target) controller.pathing_attempts = 0 - if(!moving_controllers.len) + if(!moving_controllers.len && requires_processing) START_PROCESSING(SSai_movement, src) moving_controllers[controller] = current_movement_target @@ -13,6 +15,6 @@ controller.pathing_attempts = 0 moving_controllers -= controller - if(!moving_controllers.len) + if(!moving_controllers.len && requires_processing) STOP_PROCESSING(SSai_movement, src) diff --git a/code/datums/ai/movement/ai_movement_basic_avoidance.dm b/code/datums/ai/movement/ai_movement_basic_avoidance.dm new file mode 100644 index 00000000000..25b868d6f44 --- /dev/null +++ b/code/datums/ai/movement/ai_movement_basic_avoidance.dm @@ -0,0 +1,12 @@ +///Uses Byond's basic obstacle avoidance mvovement +/datum/ai_movement/basic_avoidance + requires_processing = FALSE + +/datum/ai_movement/basic_avoidance/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) + . = ..() + walk_to(controller.pawn, current_movement_target, min_distance, controller.movement_delay) + + +/datum/ai_movement/basic_avoidance/stop_moving_towards(datum/ai_controller/controller) + . = ..() + walk_to(controller.pawn, src) diff --git a/code/datums/ai/robot_customer/robot_customer_behaviors.dm b/code/datums/ai/robot_customer/robot_customer_behaviors.dm new file mode 100644 index 00000000000..36608ff8101 --- /dev/null +++ b/code/datums/ai/robot_customer/robot_customer_behaviors.dm @@ -0,0 +1,111 @@ +/datum/ai_behavior/find_seat + action_cooldown = 8 SECONDS + +/datum/ai_behavior/find_seat/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] + + var/obj/structure/holosign/robot_seat/found_seat + + for(var/obj/structure/holosign/robot_seat/potential_seat in oview(7, controller.pawn)) + + if(potential_seat.linked_venue != controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE]) //Incorrect venue + continue + + if(SSrestaurant.claimed_seats[potential_seat]) //Someone called dibs + continue + var/turf/seat_turf = get_turf(potential_seat) + + if(seat_turf.is_blocked_turf()) //Someone called dibsies + continue + + found_seat = potential_seat + break + + if(found_seat) + customer_pawn.say(pick(customer_data.found_seat_lines)) + controller.blackboard[BB_CUSTOMER_MY_SEAT] = found_seat + SSrestaurant.claimed_seats[found_seat] = customer_pawn + finish_action(controller, TRUE) + else + customer_pawn.say(pick(customer_data.cant_find_seat_lines)) + finish_action(controller, FALSE) + + +/datum/ai_behavior/order_food + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + required_distance = 0 + +/datum/ai_behavior/order_food/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] + + if(get_turf(controller.blackboard[BB_CUSTOMER_MY_SEAT]) == get_turf(customer_pawn)) + var/obj/structure/chair/my_seat = locate(/obj/structure/chair) in get_turf(customer_pawn) + if(my_seat) + controller.pawn.setDir(my_seat.dir) //Sit in your seat + + var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] + + controller.blackboard[BB_CUSTOMER_CURRENT_ORDER] = attending_venue.order_food(customer_pawn, customer_data) + + finish_action(controller, TRUE) + +/datum/ai_behavior/wait_for_food + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM + required_distance = 0 + +/datum/ai_behavior/wait_for_food/perform(delta_time, datum/ai_controller/controller) + . = ..() + if(controller.blackboard[BB_CUSTOMER_EATING]) + finish_action(controller, TRUE) + return + + controller.blackboard[BB_CUSTOMER_PATIENCE] -= delta_time + if(controller.blackboard[BB_CUSTOMER_PATIENCE] < 0 || controller.blackboard[BB_CUSTOMER_LEAVING]) // Check if we're leaving because sometthing mightve forced us to + finish_action(controller, FALSE) + return + + if(DT_PROB(1, delta_time)) + var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] + customer_pawn.say(pick(customer_data.wait_for_food_lines)) + + if(get_turf(controller.blackboard[BB_CUSTOMER_MY_SEAT]) == get_turf(controller.pawn)) + var/obj/structure/chair/my_seat = locate(/obj/structure/chair) in get_turf(controller.pawn) + if(my_seat) + controller.pawn.setDir(my_seat.dir) //Sit in your seat + + + ///Now check if theres a meal infront of us. + var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] + + var/turf/infront_turf = get_step(controller.pawn, controller.pawn.dir) + for(var/obj/item/I in infront_turf.contents) + if(attending_venue.is_correct_order(I, controller.blackboard[BB_CUSTOMER_CURRENT_ORDER])) + var/datum/ai_controller/robot_customer/customer = controller + customer.eat_order(I, attending_venue) + break + + +/datum/ai_behavior/wait_for_food/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] + controller.blackboard[BB_CUSTOMER_LEAVING] = TRUE + customer_pawn.update_icon() //They might have a special leaving accesoiry (french flag) + if(succeeded) + customer_pawn.say(pick(customer_data.leave_happy_lines)) + else + customer_pawn.say(pick(customer_data.leave_mad_lines)) + +/datum/ai_behavior/leave_venue + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + required_distance = 1 + +/datum/ai_behavior/leave_venue/perform(delta_time, datum/ai_controller/controller) + . = ..() + qdel(controller.pawn) //save the world, my final message, goodbye. + finish_action(controller, TRUE) diff --git a/code/datums/ai/robot_customer/robot_customer_controller.dm b/code/datums/ai/robot_customer/robot_customer_controller.dm new file mode 100644 index 00000000000..7f17974c171 --- /dev/null +++ b/code/datums/ai/robot_customer/robot_customer_controller.dm @@ -0,0 +1,60 @@ +/datum/ai_controller/robot_customer + ai_movement = /datum/ai_movement/basic_avoidance + movement_delay = 1 SECONDS + blackboard = list(BB_CUSTOMER_CURRENT_ORDER = null, + BB_CUSTOMER_MY_SEAT = null, + BB_CUSTOMER_PATIENCE = 999, + BB_CUSTOMER_CUSTOMERINFO = null, + BB_CUSTOMER_EATING = FALSE, + BB_CUSTOMER_LEAVING = FALSE, + BB_CUSTOMER_ATTENDING_VENUE = null) + + +/datum/ai_controller/robot_customer/TryPossessPawn(atom/new_pawn) + if(!istype(new_pawn, /mob/living/simple_animal/robot_customer)) + return AI_CONTROLLER_INCOMPATIBLE + RegisterSignal(new_pawn, COMSIG_PARENT_ATTACKBY, .proc/on_attackby) + return ..() //Run parent at end + +/datum/ai_controller/robot_customer/UnpossessPawn(destroy) + UnregisterSignal(pawn, list(COMSIG_PARENT_ATTACKBY)) + return ..() //Run parent at end + +/datum/ai_controller/robot_customer/SelectBehaviors(delta_time) + current_behaviors = list() + if(blackboard[BB_CUSTOMER_LEAVING]) + var/datum/venue/attending_venue = blackboard[BB_CUSTOMER_ATTENDING_VENUE] + current_movement_target = attending_venue.restaurant_portal + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/leave_venue) + return + + var/obj/my_seat = blackboard[BB_CUSTOMER_MY_SEAT] + + if(!my_seat) //We havn't got a seat yet! find one! + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/find_seat) + return + + current_movement_target = my_seat + + if(!blackboard[BB_CUSTOMER_CURRENT_ORDER]) //We havn't ordered yet even ordered yet. go on! go over there and go do it! + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/order_food) + return + else + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/wait_for_food) + + +/datum/ai_controller/robot_customer/proc/on_attackby(datum/source, obj/item/I, mob/user) + SIGNAL_HANDLER + var/datum/venue/attending_venue = blackboard[BB_CUSTOMER_ATTENDING_VENUE] + if(attending_venue.is_correct_order(I, blackboard[BB_CUSTOMER_CURRENT_ORDER])) + to_chat(user, "You hand [I] to [pawn]") + eat_order(I, attending_venue) + return COMPONENT_NO_AFTERATTACK + + +/datum/ai_controller/robot_customer/proc/eat_order(obj/item/order_item, datum/venue/attending_venue) + if(!blackboard[BB_CUSTOMER_EATING]) + blackboard[BB_CUSTOMER_EATING] = TRUE + attending_venue.on_get_order(pawn, order_item) + + diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index 4f51e30e173..ff9a56a5e6a 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -40,6 +40,10 @@ footstep_sounds = 'sound/effects/bang.ogg' RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_simplestep_machine) //Note that this doesn't get called for humans. return + if(FOOTSTEP_OBJ_ROBOT) + footstep_sounds = 'sound/effects/tank_treads.ogg' + RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_simplestep_machine) //Note that this doesn't get called for humans. + return RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_simplestep) //Note that this doesn't get called for humans. ///Prepares a footstep. Determines if it should get played. Returns the turf it should get played on. Note that it is always a /turf/open diff --git a/code/datums/elements/food/food_trash.dm b/code/datums/elements/food/food_trash.dm index dccda8caaf1..1cfd5b22de4 100644 --- a/code/datums/elements/food/food_trash.dm +++ b/code/datums/elements/food/food_trash.dm @@ -25,6 +25,7 @@ RegisterSignal(target, COMSIG_ITEM_ON_GRIND, .proc/generate_trash) RegisterSignal(target, COMSIG_ITEM_ON_JUICE, .proc/generate_trash) RegisterSignal(target, COMSIG_ITEM_ON_COMPOSTED, .proc/generate_trash) + RegisterSignal(target, COMSIG_ITEM_SOLD_TO_CUSTOMER, .proc/generate_trash) /datum/element/food_trash/Detach(datum/target) . = ..() diff --git a/code/datums/elements/food/venue_price.dm b/code/datums/elements/food/venue_price.dm new file mode 100644 index 00000000000..76016deaf3b --- /dev/null +++ b/code/datums/elements/food/venue_price.dm @@ -0,0 +1,23 @@ +///This component can be used to give something value for venues +/datum/element/venue_price + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + var/venue_price + +/datum/element/venue_price/Attach(datum/target, venue_price) + . = ..() + if(!venue_price) + stack_trace("A venue_price element was attached to something without specifying an actual price.") + return ELEMENT_INCOMPATIBLE + src.venue_price = venue_price + RegisterSignal(target, COMSIG_ITEM_SOLD_TO_CUSTOMER, .proc/item_sold) + +/datum/element/venue_price/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_ITEM_SOLD_TO_CUSTOMER) + +/datum/element/venue_price/proc/item_sold(datum/source, obj/item/container) + SIGNAL_HANDLER + + new /obj/item/holochip(get_turf(container), venue_price) + playsound(get_turf(container), 'sound/effects/cashregister.ogg', 60, TRUE) diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index 5ee152fed7c..48dffe0746c 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -186,3 +186,6 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) ..(key, I, FALSE) seer = M add_hud_to(seer) + + +/datum/atom_hud/alternate_appearance/basic/food_demands diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index c2b356f8866..37b38b302f5 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1192,6 +1192,12 @@ /obj/item/stock_parts/matter_bin = 2) needs_anchored = FALSE +/obj/item/circuitboard/machine/restaurant_portal + name = "Restaurant Portal" + icon_state = "service" + build_path = /obj/machinery/restaurant_portal + needs_anchored = TRUE + /obj/item/circuitboard/machine/abductor name = "alien board (Report This)" icon_state = "abductor_mod" diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm index 77e0fe141a6..5c21b664d10 100644 --- a/code/game/objects/items/food/_food.dm +++ b/code/game/objects/items/food/_food.dm @@ -34,6 +34,8 @@ var/junkiness ///Will this food turn into badrecipe on a grill? Don't use this for everything; preferably mostly for food that is made on a grill to begin with so it burns after some time var/burns_on_grill = FALSE + ///Price of this food if sold in a venue + var/venue_value /obj/item/food/Initialize() . = ..() @@ -43,6 +45,8 @@ tastes = string_assoc_list(tastes) if(eatverbs) eatverbs = string_list(eatverbs) + if(venue_value) + AddElement(/datum/element/venue_price, venue_value) MakeEdible() MakeProcessable() MakeLeaveTrash() diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm index afc122f6a61..41510dba45f 100644 --- a/code/game/objects/items/food/bread.dm +++ b/code/game/objects/items/food/bread.dm @@ -30,6 +30,7 @@ tastes = list("bread" = 10) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_CHEAP /obj/item/food/bread/plain/Initialize() . = ..() @@ -69,6 +70,8 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 10, /datum/reagent/consumable/nutriment/protein = 12) tastes = list("bread" = 10, "meat" = 10) foodtypes = GRAIN | MEAT + venue_value = FOOD_PRICE_CHEAP + /obj/item/food/bread/meat/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/meat, 5, 30) @@ -141,6 +144,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 10, /datum/reagent/consumable/nutriment/protein = 10) tastes = list("bread" = 10, "tofu" = 10) foodtypes = GRAIN | VEGETABLES + venue_value = FOOD_PRICE_CHEAP /obj/item/food/bread/tofu/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/tofu, 5, 30) @@ -221,6 +225,7 @@ attack_verb_simple = list("touche") tastes = list("bread" = 1) foodtypes = GRAIN + venue_value = FOOD_PRICE_CHEAP /obj/item/food/garlicbread name = "garlic bread" @@ -232,6 +237,7 @@ bite_consumption = 3 tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) foodtypes = GRAIN + venue_value = FOOD_PRICE_NORMAL /obj/item/food/deepfryholder name = "Deep Fried Foods Holder Obj" @@ -317,6 +323,7 @@ tastes = list("butter" = 1, "biscuit" = 1) foodtypes = GRAIN | BREAKFAST w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_CHEAP /obj/item/food/butterdog name = "butterdog" diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm index 65e96a1a904..2e58e14a080 100644 --- a/code/game/objects/items/food/burgers.dm +++ b/code/game/objects/items/food/burgers.dm @@ -9,11 +9,12 @@ w_class = WEIGHT_CLASS_SMALL /obj/item/food/burger/plain - name = "burger" + name = "plain burger" desc = "The cornerstone of every nutritious breakfast." food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 1) foodtypes = GRAIN | MEAT custom_price = PAYCHECK_ASSISTANT * 0.8 + venue_value = FOOD_PRICE_CHEAP /obj/item/food/burger/plain/Initialize() . = ..() @@ -35,6 +36,7 @@ foodtypes = MEAT | GRAIN | GROSS var/subjectname = "" var/subjectjob = null + venue_value = FOOD_PRICE_CHEAP /obj/item/food/burger/human/CheckParts(list/parts_list) ..() @@ -54,6 +56,8 @@ desc = "You monster." food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 6) foodtypes = GRAIN | MEAT | GROSS + venue_value = FOOD_PRICE_EXOTIC + /obj/item/food/burger/appendix name = "appendix burger" @@ -62,6 +66,7 @@ icon_state = "appendixburger" tastes = list("bun" = 4, "grass" = 2) foodtypes = GRAIN | MEAT | GROSS + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/fish name = "fillet -o- carp sandwich" @@ -70,6 +75,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("bun" = 4, "fish" = 4) foodtypes = GRAIN | MEAT + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/burger/tofu name = "tofu burger" @@ -78,6 +84,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("bun" = 4, "tofu" = 4) foodtypes = GRAIN | VEGETABLES + venue_value = FOOD_PRICE_CHEAP /obj/item/food/burger/roburger name = "roburger" @@ -86,6 +93,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/nanomachines = 6, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("bun" = 4, "lettuce" = 2, "sludge" = 1) foodtypes = GRAIN | TOXIC + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/burger/roburgerbig name = "roburger" @@ -103,6 +111,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("bun" = 4, "acid" = 4) foodtypes = GRAIN | MEAT + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/burger/bearger name = "bearger" @@ -110,6 +119,7 @@ icon_state = "bearger" food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 5) foodtypes = GRAIN | MEAT + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/burger/clown name = "clown burger" @@ -117,6 +127,7 @@ icon_state = "clownburger" food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/medicine/mannitol = 6, /datum/reagent/consumable/nutriment/vitamin = 6) foodtypes = GRAIN | FRUIT + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/mime name = "mime burger" @@ -124,6 +135,7 @@ icon_state = "mimeburger" food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 9, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/nothing = 6) foodtypes = GRAIN + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/brain name = "brainburger" @@ -132,6 +144,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/medicine/mannitol = 6, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/nutriment/protein = 6) tastes = list("bun" = 4, "brains" = 2) foodtypes = GRAIN | MEAT | GROSS + venue_value = FOOD_PRICE_CHEAP /obj/item/food/burger/ghost name = "ghost burger" @@ -143,6 +156,7 @@ alpha = 170 verb_say = "moans" verb_yell = "wails" + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/burger/ghost/Initialize() . = ..() @@ -251,6 +265,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("bun" = 4, "magic" = 2) foodtypes = GRAIN | MEAT + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/bigbite name = "big bite burger" @@ -259,6 +274,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 5) w_class = WEIGHT_CLASS_NORMAL foodtypes = GRAIN | MEAT | DAIRY + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/jelly name = "jelly burger" @@ -266,6 +282,7 @@ icon_state = "jellyburger" tastes = list("bun" = 4, "jelly" = 2) foodtypes = GRAIN | MEAT + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/burger/jelly/slime food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/toxin/slimejelly = 6, /datum/reagent/consumable/nutriment/vitamin = 6) @@ -285,6 +302,7 @@ max_volume = 100 tastes = list("bun" = 4, "type two diabetes" = 10) foodtypes = GRAIN | MEAT | DAIRY + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/burger/fivealarm name = "five alarm burger" @@ -292,6 +310,7 @@ icon_state = "fivealarmburger" food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/capsaicin = 5, /datum/reagent/consumable/condensedcapsaicin = 5, /datum/reagent/consumable/nutriment/vitamin = 6) foodtypes = GRAIN | MEAT + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/rat name = "rat burger" @@ -299,6 +318,7 @@ icon_state = "ratburger" food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2) foodtypes = GRAIN | MEAT | GROSS + venue_value = FOOD_PRICE_CHEAP /obj/item/food/burger/baseball name = "home run baseball burger" @@ -307,6 +327,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2) foodtypes = GRAIN | GROSS custom_price = PAYCHECK_ASSISTANT * 0.8 + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/baconburger name = "bacon burger" @@ -316,6 +337,7 @@ tastes = list("bacon" = 4, "bun" = 2) foodtypes = GRAIN | MEAT custom_premium_price = PAYCHECK_ASSISTANT * 1.6 + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/empoweredburger name = "empowered burger" @@ -324,6 +346,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/liquidelectricity = 5) tastes = list("bun" = 2, "pure electricity" = 4) foodtypes = GRAIN | TOXIC + venue_value = FOOD_PRICE_CHEAP /obj/item/food/burger/crab name = "crab burger" @@ -332,6 +355,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("bun" = 2, "crab meat" = 4) foodtypes = GRAIN | MEAT + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/soylent name = "soylent burger" @@ -340,6 +364,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("bun" = 2, "assistant" = 4) foodtypes = GRAIN | MEAT | DAIRY + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/burger/rib name = "mcrib" @@ -348,6 +373,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/bbqsauce = 1) tastes = list("bun" = 2, "pork patty" = 4) foodtypes = GRAIN | MEAT + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/mcguffin name = "mcguffin" @@ -356,6 +382,7 @@ tastes = list("muffin" = 2, "bacon" = 3) food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/eggyolk = 3, /datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 1) foodtypes = GRAIN | MEAT | BREAKFAST + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/chicken name = "chicken sandwich" //Apparently the proud people of Americlapstan object to this thing being called a burger. Apparently McDonald's just calls it a burger in Europe as to not scare and confuse us. @@ -364,6 +391,7 @@ tastes = list("bun" = 2, "chicken" = 4, "God's covenant" = 1) food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/mayonnaise = 3, /datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 2) foodtypes = GRAIN | MEAT | FRIED + venue_value = FOOD_PRICE_NORMAL /obj/item/food/burger/cheese name = "cheese burger" @@ -372,6 +400,7 @@ tastes = list("bun" = 2, "beef patty" = 4, "cheese" = 3) food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 2) foodtypes = GRAIN | MEAT | DAIRY + venue_value = FOOD_PRICE_CHEAP /obj/item/food/burger/cheese/Initialize() . = ..() diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm index fffd8713c0d..a1b9a3225eb 100644 --- a/code/game/objects/items/food/cake.dm +++ b/code/game/objects/items/food/cake.dm @@ -43,6 +43,8 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/oculine = 10, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR + venue_value = FOOD_PRICE_CHEAP + /obj/item/food/cake/carrot/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/carrot, 5, 30) @@ -81,6 +83,8 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/nutriment/protein = 5) tastes = list("cake" = 4, "cream cheese" = 3) foodtypes = GRAIN | DAIRY + venue_value = FOOD_PRICE_CHEAP + /obj/item/food/cake/cheese/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/cheese, 5, 30) @@ -100,6 +104,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/orange/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/orange, 5, 30) @@ -118,6 +123,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/lime/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/lime, 5, 30) @@ -136,6 +142,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/lemon/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/lemon, 5, 30) @@ -154,6 +161,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR + venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/chocolate/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/chocolate, 5, 30) @@ -243,6 +251,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/apple/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/apple, 5, 30) @@ -279,6 +288,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR + venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/pumpkinspice/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pumpkinspice, 5, 30) @@ -351,6 +361,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 60, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1) foodtypes = GRAIN | DAIRY | SUGAR | JUNKFOOD + venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/pound_cake/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pound_cake_slice, 7, 30) diff --git a/code/game/objects/items/food/egg.dm b/code/game/objects/items/food/egg.dm index f3534674ca5..a48a584cf83 100644 --- a/code/game/objects/items/food/egg.dm +++ b/code/game/objects/items/food/egg.dm @@ -113,6 +113,7 @@ w_class = WEIGHT_CLASS_SMALL tastes = list("egg" = 1, "cheese" = 1) foodtypes = MEAT | BREAKFAST | DAIRY + venue_value = FOOD_PRICE_CHEAP /obj/item/food/omelette/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/kitchen/fork)) diff --git a/code/game/objects/items/food/meat.dm b/code/game/objects/items/food/meat.dm index 2bce1d3d662..65cea9a6e97 100644 --- a/code/game/objects/items/food/meat.dm +++ b/code/game/objects/items/food/meat.dm @@ -52,6 +52,7 @@ tastes = list("fish" = 1, "breadcrumbs" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/fishandchips name = "fish and chips" @@ -60,6 +61,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("fish" = 1, "chips" = 1) foodtypes = MEAT | VEGETABLES | FRIED + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/fishfry name = "fish fry" @@ -118,6 +120,7 @@ tastes = list("meat" = 1, "salmon" = 1) foodtypes = MEAT | ALCOHOL w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/raw_meatball name = "raw meatball" @@ -169,6 +172,7 @@ foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL burns_on_grill = TRUE + venue_value = FOOD_PRICE_CHEAP /obj/item/food/meatball/human name = "strange meatball" @@ -281,6 +285,7 @@ var/roasted = FALSE w_class = WEIGHT_CLASS_SMALL burns_on_grill = TRUE + venue_value = FOOD_PRICE_CHEAP /obj/item/food/sausage/MakeProcessable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 30) @@ -450,6 +455,7 @@ tastes = list("\"chicken\"" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_TINY + venue_value = FOOD_PRICE_CHEAP /obj/item/food/nugget/Initialize() . = ..() @@ -511,6 +517,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("tender meat" = 3, "metal" = 1) foodtypes = MEAT | GROSS + venue_value = FOOD_PRICE_CHEAP /obj/item/food/kebab/monkey name = "meat-kebab" @@ -518,6 +525,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("meat" = 3, "metal" = 1) foodtypes = MEAT + venue_value = FOOD_PRICE_CHEAP /obj/item/food/kebab/tofu name = "tofu-kebab" @@ -525,6 +533,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 15) tastes = list("tofu" = 3, "metal" = 1) foodtypes = VEGETABLES + venue_value = FOOD_PRICE_CHEAP /obj/item/food/kebab/tail name = "lizard-tail kebab" @@ -541,6 +550,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("rat meat" = 1, "metal" = 1) foodtypes = MEAT | GROSS + venue_value = FOOD_PRICE_CHEAP /obj/item/food/kebab/rat/double name = "double rat-kebab" diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 5ebd68d9d84..d86d56f9cc6 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -23,7 +23,7 @@ icon_state = "royalcheese" food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/gold = 20, /datum/reagent/toxin/mutagen = 5) w_class = WEIGHT_CLASS_BULKY - tastes = list("cheese" = 4, "royalty" = 1) + tastes = list("cheese" = 4, "royalty" = 1) rat_heal = 70 /obj/item/food/cheese @@ -120,6 +120,7 @@ tastes = list("fries" = 3, "salt" = 1) foodtypes = VEGETABLES | GRAIN | FRIED w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_CHEAP /obj/item/food/fries/Initialize() . = ..() @@ -157,6 +158,7 @@ tastes = list("fries" = 3, "cheese" = 1) foodtypes = VEGETABLES | GRAIN | DAIRY w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_CHEAP /obj/item/food/cheesyfries/Initialize() . = ..() @@ -762,6 +764,7 @@ w_class = WEIGHT_CLASS_SMALL tastes = list("cream cheese" = 4, "crab" = 3, "crispiness" = 2) foodtypes = MEAT | DAIRY | GRAIN + venue_value = FOOD_PRICE_CHEAP /obj/item/food/cornchips name = "boritos corn chips" diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm index 81a4a21ece1..09f1cc1ba16 100644 --- a/code/game/objects/items/food/pastries.dm +++ b/code/game/objects/items/food/pastries.dm @@ -612,6 +612,7 @@ tastes = list("bun" = 3, "meat" = 2) foodtypes = GRAIN | MEAT | VEGETABLES w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_CHEAP /obj/item/food/hotdog/debug eat_time = 0 @@ -711,6 +712,7 @@ foodtypes = GRAIN | SUGAR | BREAKFAST w_class = WEIGHT_CLASS_SMALL burns_on_grill = TRUE + venue_value = FOOD_PRICE_CHEAP /obj/item/food/pancakes/raw name = "goopy pancake" diff --git a/code/game/objects/items/food/pie.dm b/code/game/objects/items/food/pie.dm index 2b4fbe51b54..1636921a233 100644 --- a/code/game/objects/items/food/pie.dm +++ b/code/game/objects/items/food/pie.dm @@ -7,6 +7,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("pie" = 1) foodtypes = GRAIN + venue_value = FOOD_PRICE_NORMAL /obj/item/food/pieslice name = "pie slice" @@ -68,6 +69,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 11, /datum/reagent/consumable/berryjuice = 5, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("pie" = 1, "blackberries" = 1) foodtypes = GRAIN | FRUIT | SUGAR + venue_value = FOOD_PRICE_NORMAL /obj/item/food/pie/bearypie name = "beary pie" diff --git a/code/game/objects/items/food/pizza.dm b/code/game/objects/items/food/pizza.dm index 6072923b769..c5487432916 100644 --- a/code/game/objects/items/food/pizza.dm +++ b/code/game/objects/items/food/pizza.dm @@ -6,6 +6,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 28, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) foodtypes = GRAIN | DAIRY | VEGETABLES + venue_value = FOOD_PRICE_CHEAP /// type is spawned 6 at a time and replaces this pizza when processed by cutting tool var/obj/item/food/pizzaslice/slice_type ///What label pizza boxes use if this pizza spawns in them. @@ -99,6 +100,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY slice_type = /obj/item/food/pizzaslice/vegetable boxtag = "Gourmet Vegetable" + venue_value = FOOD_PRICE_NORMAL /obj/item/food/pizzaslice/vegetable name = "vegetable pizza slice" diff --git a/code/game/objects/items/food/salad.dm b/code/game/objects/items/food/salad.dm index e1c2519d88d..90b04b25f5d 100644 --- a/code/game/objects/items/food/salad.dm +++ b/code/game/objects/items/food/salad.dm @@ -9,6 +9,7 @@ tastes = list("leaves" = 1) foodtypes = VEGETABLES eatverbs = list("devour","nibble","gnaw","gobble","chomp") //who the fuck gnaws and devours on a salad + venue_value = FOOD_PRICE_NORMAL /obj/item/food/salad/aesirsalad name = "\improper Aesir salad" diff --git a/code/game/objects/items/food/soup.dm b/code/game/objects/items/food/soup.dm index e48ebd0261c..b93129d336e 100644 --- a/code/game/objects/items/food/soup.dm +++ b/code/game/objects/items/food/soup.dm @@ -8,6 +8,7 @@ tastes = list("tasteless soup" = 1) foodtypes = VEGETABLES eatverbs = list("slurp","sip","inhale","drink") + venue_value = FOOD_PRICE_CHEAP /obj/item/food/soup/wish name = "wish soup" @@ -31,6 +32,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/water = 5) tastes = list("meat" = 1) foodtypes = MEAT + venue_value = FOOD_PRICE_NORMAL /obj/item/food/soup/slime name = "slime soup" @@ -39,6 +41,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/toxin/slimejelly = 10, /datum/reagent/consumable/nutriment/vitamin = 9, /datum/reagent/water = 5) tastes = list("slime" = 1) foodtypes = TOXIC | SUGAR + venue_value = FOOD_PRICE_NORMAL /obj/item/food/soup/blood name = "tomato soup" @@ -72,6 +75,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 9, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 8) tastes = list("vegetables" = 1) foodtypes = VEGETABLES + venue_value = FOOD_PRICE_NORMAL /obj/item/food/soup/nettle name = "nettle soup" @@ -80,6 +84,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 9, /datum/reagent/medicine/omnizine = 5) tastes = list("nettles" = 1) foodtypes = VEGETABLES + venue_value = FOOD_PRICE_NORMAL /obj/item/food/soup/mystery name = "mystery soup" @@ -102,7 +107,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/capsaicin = 3, /datum/reagent/consumable/tomatojuice = 4, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("hot peppers" = 1) foodtypes = VEGETABLES | MEAT - + venue_value = FOOD_PRICE_NORMAL /obj/item/food/soup/coldchili name = "cold chili" desc = "This slush is barely a liquid!" @@ -126,6 +131,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 9, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("the jungle" = 1, "banana" = 1) foodtypes = FRUIT + venue_value = FOOD_PRICE_NORMAL /obj/item/food/soup/tomato name = "tomato soup" @@ -207,7 +213,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("sweet potato" = 1) foodtypes = VEGETABLES | SUGAR - + venue_value = FOOD_PRICE_NORMAL /obj/item/food/soup/beet/red name = "red beet soup" desc = "Quite a delicacy." @@ -231,6 +237,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("creamy texture" = 1, "crab" = 4) foodtypes = MEAT + venue_value = FOOD_PRICE_EXOTIC /obj/item/food/soup/electron name = "electron soup" diff --git a/code/game/objects/items/food/spaghetti.dm b/code/game/objects/items/food/spaghetti.dm index e47e9775db7..525b7b7a5f1 100644 --- a/code/game/objects/items/food/spaghetti.dm +++ b/code/game/objects/items/food/spaghetti.dm @@ -8,6 +8,7 @@ microwaved_type = /obj/item/food/spaghetti/boiledspaghetti tastes = list("pasta" = 1) foodtypes = GRAIN + venue_value = FOOD_PRICE_CHEAP /obj/item/food/spaghetti/Initialize() . = ..() diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 037316a108f..9dc243b69b2 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -20,6 +20,8 @@ /obj/item/holosign_creator/examine(mob/user) . = ..() + if(!signs) + return . += "It is currently maintaining [signs.len]/[max_signs] projections." /obj/item/holosign_creator/afterattack(atom/target, mob/user, proximity_flag) @@ -65,6 +67,13 @@ qdel(H) to_chat(user, "You clear all active holograms.") +/obj/item/holosign_creator/Destroy() + . = ..() + if(LAZYLEN(signs)) + for(var/H in signs) + qdel(H) + + /obj/item/holosign_creator/janibarrier name = "custodial holobarrier projector" desc = "A holographic projector that creates hard light wet floor barriers." diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 1e8961819d7..f769d657330 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -8,11 +8,13 @@ max_integrity = 1 armor = list(MELEE = 0, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = 20) var/obj/item/holosign_creator/projector + var/use_vis_overlay = TRUE /obj/structure/holosign/Initialize(loc, source_projector) . = ..() - alpha = 0 - SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it + if(use_vis_overlay) + alpha = 0 + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it if(source_projector) projector = source_projector LAZYADD(projector.signs, src) @@ -27,6 +29,9 @@ . = ..() if(.) return + attack_holosign(user, modifiers) + +/obj/structure/holosign/proc/attack_holosign(mob/living/user, list/modifiers) user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) user.changeNext_move(CLICK_CD_MELEE) take_damage(5 , BRUTE, MELEE, 1) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm index dfffb5a68a3..84e6cb64a99 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm @@ -17,7 +17,7 @@ subcategory = CAT_BURGER /datum/crafting_recipe/food/burger - name = "Burger" + name = "Plain Burger" reqs = list( /obj/item/food/patty/plain = 1, /obj/item/food/bun = 1 diff --git a/code/modules/food_and_drinks/restaurant/_venue.dm b/code/modules/food_and_drinks/restaurant/_venue.dm new file mode 100644 index 00000000000..52686e4f074 --- /dev/null +++ b/code/modules/food_and_drinks/restaurant/_venue.dm @@ -0,0 +1,188 @@ +///Represents the abstract concept of a food venue in the code. +/datum/venue + ///Name of the venue, also used for the icon state of any radials it can be selected in + var/name = "unnamed venue" + ///Max amount of guests at any time + var/max_guests = 6 + ///Weighted list of customer types + var/list/customer_types = list(/datum/customer_data/american = 5, /datum/customer_data/italian = 3, /datum/customer_data/french = 3) + ///Is the venue open at the moment? + var/open + ///Portal linked to this venue at the moment + var/obj/machinery/restaurant_portal/restaurant_portal + ///Lists the current visitors of a venue + var/list/current_visitors = list() + ///Cooldown for next guest to arrive + COOLDOWN_DECLARE(visit_cooldown) + ///Min time between new visits + var/min_time_between_visitor = 60 SECONDS + ///Max time between new visits + var/max_time_between_visitor = 90 SECONDS + ///Required access to mess with the venue + var/req_access = ACCESS_KITCHEN + + +/datum/venue/process(delta_time) + if(!COOLDOWN_FINISHED(src, visit_cooldown)) + return + COOLDOWN_START(src, visit_cooldown, rand(min_time_between_visitor, max_time_between_visitor)) + if(current_visitors.len < max_guests) + create_new_customer() + +///Spawns a new customer at the portal +/datum/venue/proc/create_new_customer() + var/mob/living/simple_animal/robot_customer/new_customer = new /mob/living/simple_animal/robot_customer(get_turf(restaurant_portal), pickweight(customer_types), src) + current_visitors += new_customer + +/datum/venue/proc/order_food(mob/living/simple_animal/robot_customer/customer_pawn, datum/customer_data/customer_data) + return + +///Checks if the object used is correct for the venue +/datum/venue/proc/is_correct_order(atom/movable/object_used, wanted_item) + return FALSE + +///The line the robot says when ordering +/datum/venue/proc/order_food_line(order) + return "broken venue pls call a coder" + +///Effects for when a customer receives their order at this venue +/datum/venue/proc/on_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) + SEND_SIGNAL(order_item, COMSIG_ITEM_SOLD_TO_CUSTOMER, order_item) + +///Toggles whether the venue is open or not +/datum/venue/proc/toggle_open() + if(open) + close() + else + open() + +/datum/venue/proc/open() + open = TRUE + restaurant_portal.update_icon() + COOLDOWN_START(src, visit_cooldown, 10 SECONDS) //First one comes faster + START_PROCESSING(SSobj, src) + +/datum/venue/proc/close() + open = FALSE + restaurant_portal.update_icon() + STOP_PROCESSING(SSobj, src) + for(var/mob/living/simple_animal/robot_customer as anything in current_visitors) + robot_customer.ai_controller.blackboard[BB_CUSTOMER_LEAVING] = TRUE //LEAVEEEEEE + +/obj/machinery/restaurant_portal + name = "restaurant portal" + desc = "A robot-only gate into the wonders of Space Station cuisine!" + icon = 'icons/obj/machines/restaurant_portal.dmi' + icon_state = "portal" + density = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 10 + active_power_usage = 100 + circuit = /obj/item/circuitboard/machine/restaurant_portal + + layer = BELOW_OBJ_LAYER + density = FALSE + anchored = TRUE + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | UNACIDABLE | ACID_PROOF + ///What venue is this portal for? Uses a typepath which is turned into an instance on Initialize + var/datum/venue/linked_venue = /datum/venue + + +/obj/machinery/restaurant_portal/Initialize() + . = ..() + if(linked_venue) + linked_venue = SSrestaurant.all_venues[linked_venue] + linked_venue.restaurant_portal = src + +/obj/machinery/restaurant_portal/Destroy() + . = ..() + +/obj/machinery/restaurant_portal/update_overlays() + . = ..() + if(!linked_venue.open) //Any open venues + . += mutable_appearance(icon, "portal_door") + +/obj/machinery/restaurant_portal/attack_hand(mob/living/user) + var/obj/item/card/id/used_id = user.get_idcard(TRUE) + + if(!used_id) + return ..() + + if(!(linked_venue.req_access in used_id.GetAccess())) + to_chat(user, "This card lacks the access to change this venues status.") + return + + linked_venue.toggle_open() + update_icon() + +/obj/machinery/restaurant_portal/attacked_by(obj/item/I, mob/living/user) + if(!istype(I, /obj/item/card/id)) + return ..() + + var/obj/item/card/id/used_id = I + + if(!(linked_venue.req_access in used_id.GetAccess())) + to_chat(user, "This card lacks the access to change this venues status.") + return + + var/list/radial_items = list() + var/list/radial_results = list() + + for(var/type_key in SSrestaurant.all_venues) + var/datum/venue/venue = SSrestaurant.all_venues[type_key] + radial_items[venue.name] = image('icons/obj/machines/restaurant_portal.dmi', venue.name) + radial_results[venue.name] = venue + + var/choice = show_radial_menu(user, src, radial_items, null, require_near = TRUE) + + if(!choice) + return + + var/datum/venue/chosen_venue = radial_results[choice] + + + + if(!(chosen_venue.req_access in used_id.GetAccess())) + to_chat(user, "This card lacks the access to change this venues status.") + return + + to_chat(user, "You change the portal's linked venue.") + + if(linked_venue && linked_venue.restaurant_portal) //We're already linked, unlink us. + if(linked_venue.open) + linked_venue.close() + linked_venue.restaurant_portal.linked_venue = null + + linked_venue = chosen_venue + linked_venue.restaurant_portal = src + + +/obj/item/holosign_creator/robot_seat + name = "seating indicator placer" + creation_time = 1 SECONDS + holosign_type = /obj/structure/holosign/robot_seat + desc = "Use this to place seats for your restaurant guests!" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/item/holosign_creator/robot_seat/attack_self(mob/user) + return +/obj/structure/holosign/robot_seat + density = FALSE + desc = "Used to indicate a place to sit for a robot tourist. I better be careful." + icon = 'icons/effects/effects.dmi' + icon_state = "eating_zone" + layer = BELOW_MOB_LAYER + use_vis_overlay = FALSE + var/datum/venue/linked_venue = /datum/venue + +/obj/structure/holosign/robot_seat/Initialize(loc, source_projector) + . = ..() + linked_venue = SSrestaurant.all_venues[linked_venue] + +/obj/structure/holosign/robot_seat/attack_holosign(mob/living/user, list/modifiers) + return + +/obj/structure/holosign/robot_seat/attacked_by(obj/item/I, mob/living/user) + . = ..() + if(I.type == projector?.type && !SSrestaurant.claimed_seats[src]) + qdel(src) diff --git a/code/modules/food_and_drinks/restaurant/customers/_customer.dm b/code/modules/food_and_drinks/restaurant/customers/_customer.dm new file mode 100644 index 00000000000..a714d7657eb --- /dev/null +++ b/code/modules/food_and_drinks/restaurant/customers/_customer.dm @@ -0,0 +1,86 @@ +/datum/customer_data + ///Name of the robot's origin + var/nationality = "Generic" + ///The types of food this robot likes in a assoc list of venue type | weighted list. does NOT include subtypes. + var/list/orderable_objects = list() + ///The amount a robot pays for each food he likes in an assoc list type | payment + var/list/order_prices = list() + ///Datum AI used for the robot. Should almost never be overwritten unless theyre subtypes of ai_controller/robot_customer + var/datum/ai_controller/ai_controller_used = /datum/ai_controller/robot_customer + ///Patience of the AI, how long they will wait for their meal. + var/total_patience = 600 SECONDS + ///Lines the robot says when it finds a seat + var/list/found_seat_lines = list("I found a seat") + ///Lines the robot says when it can't find a seat + var/list/cant_find_seat_lines = list("I did not find a seat") + ///Lines the robot says when leaving without food + var/list/leave_mad_lines = list("Leaving without food") + ///Lines the robot says when leaving with food + var/list/leave_happy_lines = list("Leaving with food") + ///Lines the robot says when leaving waiting for food + var/list/wait_for_food_lines = list("I'm still waiting for food") + ///Clothing sets to pick from when dressing the robot. + var/list/clothing_sets = list("amerifat_clothes") + ///List of prefixes for our robots name + var/list/name_prefixes + ///Prefix file to uise + var/prefix_file = "strings/names/american_prefix.txt" + ///Base icon for the customer + var/base_icon = "amerifat" + +/datum/customer_data/New() + . = ..() + name_prefixes = world.file2list(prefix_file) + +/datum/customer_data/proc/get_overlays(mob/living/simple_animal/robot_customer/customer) + return + +/datum/customer_data/american + nationality = "Space-American" + orderable_objects = list( + /datum/venue/restaurant = list(/obj/item/food/burger/plain = 25, /obj/item/food/burger/cheese = 15, /obj/item/food/burger/superbite = 1, /obj/item/food/fries = 10, /obj/item/food/cheesyfries = 6, /obj/item/food/pie/applepie = 4, /obj/item/food/pie/pumpkinpie = 2, /obj/item/food/hotdog = 8, /obj/item/food/pizza/pineapple = 1, /obj/item/food/burger/baconburger = 10, /obj/item/food/pancakes = 4), + /datum/venue/bar = list(/datum/reagent/consumable/ethanol/b52 = 6, /datum/reagent/consumable/ethanol/manhattan = 3, /datum/reagent/consumable/ethanol/atomicbomb = 1, /datum/reagent/consumable/ethanol/beer = 25)) + + + found_seat_lines = list("I hope there's a seat that supports my weight.", "I hope I can bring my gun in here.", "I hope they have the triple deluxe fatty burger.", "I just love the culture here.") + cant_find_seat_lines = list("I'm so tired from standing...", "I have chronic back pain, please hurry up and get me a seat!", "I'm not going to tip if I don't get a seat.") + leave_mad_lines = list("NO TIP FOR YOU. GOODBYE!", "At least at SpaceDonalds they serve their food FAST!", "This venue is horrendous!", "I will speak to your manager!", "I'll be sure to leave a bad Yelp review.") + leave_happy_lines = list("An extra tip for you my friend.", "Thanks for the great food!", "Diabetes is a myth anyway!") + wait_for_food_lines = list("Listen buddy, I'm getting real impatient over here!", "I've been waiting for ages...") + + +/datum/customer_data/italian + nationality = "Space-Italian" + prefix_file = "strings/names/italian_prefix.txt" + base_icon = "italian" + clothing_sets = list("italian_pison", "italian_godfather") + + found_seat_lines = list("What a wonderful place to sit.", "I hope they serve it like-a my momma used to make it.") + cant_find_seat_lines = list("Mamma mia! I just want a seat!", "Why-a you making me stand here?") + leave_mad_lines = list("I have-a not seen-a this much disrespect in years!", "What-a horrendous establishment!") + leave_happy_lines = list("That's amoreee!", "Just like momma used to make it!") + wait_for_food_lines = list("I'ma so hungry...") + orderable_objects = list( + /datum/venue/restaurant = list(/obj/item/food/spaghetti/pastatomato = 20, /obj/item/food/spaghetti/copypasta = 6, /obj/item/food/spaghetti/meatballspaghetti = 4, /obj/item/food/pizza/vegetable = 2, /obj/item/food/pizza/mushroom = 2, /obj/item/food/pizza/meat = 2, /obj/item/food/pizza/margherita = 2), + /datum/venue/bar = list(/datum/reagent/consumable/ethanol/fanciulli = 5, /datum/reagent/consumable/ethanol/branca_menta = 3, /datum/reagent/consumable/ethanol/beer = 10, /datum/reagent/consumable/lemonade = 8, /datum/reagent/consumable/ethanol/godfather = 5)) + + +/datum/customer_data/french + nationality = "Space-French" + prefix_file = "strings/names/french_prefix.txt" + base_icon = "french" + clothing_sets = list("french_fit") + found_seat_lines = list("Hon hon hon", "It's not the Eiffel tower but it will do.", "Yuck, I guess this will make do.") + cant_find_seat_lines = list("Making someone like me stand? How dare you.", "What a filthy lobby!") + leave_mad_lines = list("Sacre bleu!", "Merde! This place is shittier than the Rhine!") + leave_happy_lines = list("Hon hon hon.", "A good effort.") + wait_for_food_lines = list("Hon hon hon") + orderable_objects = list( + /datum/venue/restaurant = list(/obj/item/food/baguette = 20, /obj/item/food/garlicbread = 5, /obj/item/food/soup/onion = 4, /obj/item/food/pie/berryclafoutis = 2, /obj/item/food/omelette = 15), + /datum/venue/bar = list(/datum/reagent/consumable/ethanol/champagne = 15, /datum/reagent/consumable/ethanol/mojito = 5, /datum/reagent/consumable/ethanol/sidecar = 5, /datum/reagent/consumable/ethanol/between_the_sheets = 4, /datum/reagent/consumable/ethanol/beer = 10)) + +/datum/customer_data/french/get_overlays(mob/living/simple_animal/robot_customer/customer) + if(customer.ai_controller.blackboard[BB_CUSTOMER_LEAVING]) + var/mutable_appearance/flag = mutable_appearance(customer.icon, "french_flag") + flag.appearance_flags = RESET_COLOR + return flag diff --git a/code/modules/food_and_drinks/restaurant/generic_venues.dm b/code/modules/food_and_drinks/restaurant/generic_venues.dm new file mode 100644 index 00000000000..d319d269a84 --- /dev/null +++ b/code/modules/food_and_drinks/restaurant/generic_venues.dm @@ -0,0 +1,119 @@ +/////RESTAURANT///// +/datum/venue/restaurant + name = "restaurant" + req_access = ACCESS_KITCHEN + +/datum/venue/restaurant/order_food(mob/living/simple_animal/robot_customer/customer_pawn, datum/customer_data/customer_data) + var/obj/item/object_to_order = pickweight(customer_data.orderable_objects[type]) //Get what object we are ordering + + . = object_to_order + + customer_pawn.say(order_food_line(object_to_order)) + + var/appearance = SSrestaurant.food_appearance_cache[object_to_order] + + if(!appearance) //We havn't made this one before, do so now. + var/obj/item/temp_object = new object_to_order() //Make a temp object so we can see it including any overlays + appearance = temp_object.appearance //And then steal its appearance + SSrestaurant.food_appearance_cache[object_to_order] = appearance //and cache it for future orders + qdel(temp_object) + + var/image/I = image(icon = 'icons/obj/machines/restaurant_portal.dmi' , icon_state = "thought_bubble", loc = customer_pawn, layer = HUD_LAYER) + + I.appearance = appearance + I.underlays += mutable_appearance(icon = 'icons/obj/machines/restaurant_portal.dmi' , icon_state = "thought_bubble") + I.pixel_y = 32 + I.pixel_x = 16 + I.plane = HUD_PLANE + I.appearance_flags = RESET_COLOR + customer_pawn.hud_to_show_on_hover = customer_pawn.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/food_demands, "food_thoughts", I) + +/datum/venue/restaurant/is_correct_order(atom/movable/object_used, wanted_item) + return object_used.type == wanted_item + +/datum/venue/restaurant/order_food_line(obj/item/order) + return "I'll take \a [initial(order.name)]" + +/datum/venue/restaurant/on_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) + . = ..() + customer_pawn.visible_message("[customer_pawn] pushes [order_item] into their mouth-shaped hole!", "You push [order_item] into your mouth-shaped hole.") + playsound(get_turf(customer_pawn),'sound/items/eatfood.ogg', rand(10,50), TRUE) + qdel(order_item) + +/obj/machinery/restaurant_portal/restaurant + linked_venue = /datum/venue/restaurant +/obj/item/holosign_creator/robot_seat/restaurant + name = "restaurant seating indicator placer" + holosign_type = /obj/structure/holosign/robot_seat/restaurant + +/obj/structure/holosign/robot_seat/restaurant + name = "restaurant seating" + linked_venue = /datum/venue/restaurant + + + + +/////BAR///// +/datum/venue/bar + name = "bar" + req_access = ACCESS_BAR + min_time_between_visitor = 40 SECONDS + max_time_between_visitor = 60 SECONDS + +/datum/venue/bar/order_food(mob/living/simple_animal/robot_customer/customer_pawn, datum/customer_data/customer_data) + var/datum/reagent/reagent_to_order = pickweight(customer_data.orderable_objects[type]) + + var/glass_visual + + if(initial(reagent_to_order.glass_icon_state)) + glass_visual = initial(reagent_to_order.glass_icon_state) + else if(initial(reagent_to_order.shot_glass_icon_state)) + glass_visual = initial(reagent_to_order.shot_glass_icon_state) + else if(initial(reagent_to_order.fallback_icon_state)) + glass_visual = initial(reagent_to_order.fallback_icon_state) + else + CRASH("[reagent_to_order] has no icon sprite for restaurant code, please set a fallback_icon_state for this reagent.") + + customer_pawn.say(order_food_line(reagent_to_order)) + + var/image/I = image(icon = 'icons/obj/machines/restaurant_portal.dmi' , icon_state = "thought_bubble", loc = customer_pawn, layer = HUD_LAYER) + I.add_overlay(mutable_appearance('icons/obj/drinks.dmi', glass_visual)) + I.pixel_y = 32 + I.pixel_x = 16 + I.plane = HUD_PLANE + I.appearance_flags = RESET_COLOR + customer_pawn.hud_to_show_on_hover = customer_pawn.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/food_demands, "food_thoughts", I) + + return reagent_to_order + +/datum/venue/bar/order_food_line(datum/reagent/order) + return "I'll take a glass of [initial(order.name)]" + +/datum/venue/bar/on_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) + var/datum/reagent/ordered_reagent_type = customer_pawn.ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER] + + for(var/datum/reagent/reagent as anything in order_item.reagents.reagent_list) + if(reagent.type != ordered_reagent_type) + continue + SEND_SIGNAL(reagent, COMSIG_ITEM_SOLD_TO_CUSTOMER, order_item) + + customer_pawn.visible_message("[customer_pawn] slurps up [order_item] in one go!", "You slurp up [order_item] in one go.") + playsound(get_turf(customer_pawn), 'sound/items/drink.ogg', 50, TRUE) + order_item.reagents.clear_reagents() + + +///The bar needs to have a minimum amount of the reagent +/datum/venue/bar/is_correct_order(object_used, wanted_item) + if(istype(object_used, /obj/item/reagent_containers/food/drinks)) + var/obj/item/reagent_containers/food/drinks/potential_drink = object_used + return potential_drink.reagents.has_reagent(wanted_item, VENUE_BAR_MINIMUM_REAGENTS) +/obj/machinery/restaurant_portal/bar + linked_venue = /datum/venue/bar + +/obj/item/holosign_creator/robot_seat/bar + name = "bar seating indicator placer" + holosign_type = /obj/structure/holosign/robot_seat/bar + +/obj/structure/holosign/robot_seat/bar + name = "bar seating" + linked_venue = /datum/venue/bar diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e0116c6c960..ac2d36b73f1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -191,10 +191,6 @@ // called when something steps onto a human // this could be made more general, but for now just handle mulebot /mob/living/carbon/human/Crossed(atom/movable/AM) - var/mob/living/simple_animal/bot/mulebot/MB = AM - if(istype(MB)) - MB.RunOver(src) - . = ..() spreadFire(AM) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 6e3045641db..eaa6c9a4517 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -115,6 +115,13 @@ return return ..() +/mob/living/simple_animal/bot/mulebot/Cross(atom/movable/AM) + . = ..() + if(ishuman(AM)) + RunOver(AM) + + + /// returns true if the bot is fully powered. /mob/living/simple_animal/bot/mulebot/proc/has_power(bypass_open_check) return (!open || bypass_open_check) && cell && cell.charge > 0 && (!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) @@ -724,7 +731,6 @@ visible_message("[src] knocks over [L]!") return ..() -// called from mob/living/carbon/human/Crossed() // when mulebot is in the same loc /mob/living/simple_animal/bot/mulebot/proc/RunOver(mob/living/carbon/human/H) log_combat(src, H, "run over", null, "(DAMTYPE: [uppertext(BRUTE)])") diff --git a/code/modules/mob/living/simple_animal/friendly/robot_customer.dm b/code/modules/mob/living/simple_animal/friendly/robot_customer.dm new file mode 100644 index 00000000000..a1cfa1f00a9 --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/robot_customer.dm @@ -0,0 +1,81 @@ +///Robot customers +/mob/living/simple_animal/robot_customer + name = "space-tourist bot" + maxHealth = 50000000 //go fuck yourself + health = 50000000 + desc = "I wonder what they'll order..." + icon = 'icons/mob/tourists.dmi' + icon_state = "amerifat" + icon_living = "amerifat" + ///Override so it uses datum ai + can_have_ai = FALSE + AIStatus = AI_OFF + del_on_death = TRUE + mob_biotypes = MOB_ROBOTIC|MOB_HUMANOID + ai_controller = /datum/ai_controller/robot_customer + unsuitable_atmos_damage = 0 + minbodytemp = 0 + maxbodytemp = 1000 + var/clothes_set = "amerifat_clothes" + var/datum/atom_hud/hud_to_show_on_hover + + +/mob/living/simple_animal/robot_customer/Initialize(mapload, datum/customer_data/customer_data = /datum/customer_data/american, datum/venue/attending_venue = SSrestaurant.all_venues[/datum/venue/restaurant]) + ADD_TRAIT(src, TRAIT_NOMOBSWAP, INNATE_TRAIT) //dont push me bitch + ADD_TRAIT(src, TRAIT_NO_TELEPORT, INNATE_TRAIT) //dont teleport me bitch + AddComponent(/datum/component/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, vary = TRUE) + var/datum/customer_data/customer_info = SSrestaurant.all_customers[customer_data] + clothes_set = pick(customer_info.clothing_sets) + ai_controller = customer_info.ai_controller_used + . = ..() + ai_controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] = customer_info + ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] = attending_venue + ai_controller.blackboard[BB_CUSTOMER_PATIENCE] = customer_info.total_patience + icon_state = customer_info.base_icon + name = "[pick(customer_info.name_prefixes)]-bot ([customer_info.nationality])" + color = rgb(rand(150,255), rand(150,255), rand(150,255)) + update_icon() + +///Clean up on the mobs seat etc when its deleted (Either by murder or because it left) +/mob/living/simple_animal/robot_customer/Destroy() + var/datum/venue/attending_venue = ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] + attending_venue.current_visitors -= src + SSrestaurant.claimed_seats[ai_controller.blackboard[BB_CUSTOMER_MY_SEAT]] = null + QDEL_NULL(hud_to_show_on_hover) + return ..() + +/mob/living/simple_animal/robot_customer/MouseEntered(location, control, params) + . = ..() + hud_to_show_on_hover?.add_hud_to(usr) + +/mob/living/simple_animal/robot_customer/MouseExited(location, control, params) + . = ..() + hud_to_show_on_hover?.remove_hud_from(usr) + +/mob/living/simple_animal/robot_customer/update_overlays() + . = ..() + var/mutable_appearance/features = mutable_appearance(icon, "[icon_state]_features") + features.appearance_flags = RESET_COLOR + . += features + + var/mutable_appearance/clothes = mutable_appearance(icon, clothes_set) + clothes.appearance_flags = RESET_COLOR + . += clothes + + var/datum/customer_data/customer_info = ai_controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] + + var/bonus_overlays = customer_info.get_overlays(src) + if(bonus_overlays) + . += bonus_overlays + +/mob/living/simple_animal/robot_customer/send_speech(message, message_range, obj/source, bubble_type, list/spans, datum/language/message_language, list/message_mods) + . = ..() + playsound(get_turf(src), 'sound/effects/tourist_talk.ogg', 100, TRUE) + +/mob/living/simple_animal/robot_customer/examine(mob/user) + . = ..() + if(ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER]) + var/datum/venue/attending_venue = ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] + . += "Their order was: \"[attending_venue.order_food_line(ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER])].\"" + + diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index cc857f2022d..2e44f79e58d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -173,7 +173,7 @@ var/pet_bonus_emote = "" -/mob/living/simple_animal/Initialize() +/mob/living/simple_animal/Initialize(mapload) . = ..() GLOB.simple_animals[AIStatus] += src if(gender == PLURAL) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index e2e259432c7..63061bf24cf 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -34,6 +34,8 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/glass_icon_state = null /// used for shot glasses, mostly for alcohol var/shot_glass_icon_state = null + /// fallback icon if the reagent has no glass or shot glass icon state. Used for restaurants. + var/fallback_icon_state = null /// reagent holder this belongs to var/datum/reagents/holder = null /// LIQUID, SOLID, GAS diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 946f11919cd..1088f2f3e94 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -98,6 +98,8 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A freezing pint of beer." ph = 4 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + fallback_icon_state = "beer" + glass_price = DRINK_PRICE_STOCK // Beer is a chemical composition of alcohol and various other things. It's a garbage nutrient but hey, it's still one. Also alcohol is bad, mmmkay? @@ -116,6 +118,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A freezing pint of watery light beer." ph = 5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + fallback_icon_state = "beer" /datum/reagent/consumable/ethanol/beer/maltliquor name = "Malt Liquor" @@ -894,6 +897,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed." shot_glass_icon_state = "b52glass" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M) playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE) @@ -946,6 +950,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Manhattan" glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/ethanol/manhattan_proj @@ -1457,6 +1462,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Atomic Bomb" glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH /datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/M, delta_time, times_fired) M.set_drugginess(50 * REM * delta_time) @@ -1928,6 +1934,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Sidecar" glass_desc = "The one ride you'll gladly give up the wheel for." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/between_the_sheets name = "Between the Sheets" @@ -1977,6 +1984,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Mojito" glass_desc = "A drink that looks as refreshing as it tastes." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/moscow_mule name = "Moscow Mule" @@ -2038,6 +2046,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of fanciulli" glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH /datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/M, delta_time, times_fired) M.adjust_nutrition(-5 * REM * delta_time) @@ -2062,6 +2071,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of branca menta" glass_desc = "A glass of Branca Menta, perfect for those lazy and hot Sunday summer afternoons." //Get lazy literally by drinking this chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/M, delta_time, times_fired) @@ -2207,6 +2217,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Champagne" glass_desc = "The flute clearly displays the slowly rising bubbles." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/ethanol/wizz_fizz @@ -2493,6 +2504,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Godfather" glass_desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/godmother name = "Godmother" diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 93a20cea5ef..b921a7efeb1 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -329,6 +329,7 @@ glass_name = "pitcher of lemonade" glass_desc = "This drink leaves you feeling nostalgic for some reason." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/tea/arnold_palmer name = "Arnold Palmer" diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index b3e08a0ee6d..aced7fd7d5b 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -11,13 +11,20 @@ name = "Consumable" taste_description = "generic food" taste_mult = 4 - /// How much nutrition this reagent supplies - var/nutriment_factor = 1 * REAGENTS_METABOLISM - var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes impure_chem = /datum/reagent/water inverse_chem_val = 0.1 inverse_chem = /datum/reagent/water failed_chem = /datum/reagent/consumable/nutriment + /// How much nutrition this reagent supplies + var/nutriment_factor = 1 * REAGENTS_METABOLISM + var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes' + ///The amount a robot will pay for a glass of this (20 units but can be higher if you pour more, be frugal!) + var/glass_price + +/datum/reagent/consumable/New() + . = ..() + if(glass_price) + AddElement(/datum/element/venue_price, glass_price) /datum/reagent/consumable/on_mob_life(mob/living/carbon/M, delta_time, times_fired) current_cycle++ diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 3e5208a9c47..12e489a9365 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -1217,3 +1217,24 @@ materials = list(/datum/material/iron = 100, /datum/material/glass = 50) build_path = /obj/item/assembly/control category = list("initial","Misc") + + +/datum/design/holosign/restaurant + name = "Restaurant Seating Projector" + desc = "A holographic projector that creates seating designation for restaurants." + id = "holosignrestaurant" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) + build_path = /obj/item/holosign_creator/robot_seat/restaurant + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/holosign/bar + name = "Bar Seating Projector" + desc = "A holographic projector that creates seating designation for bars." + id = "holosignbar" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) + build_path = /obj/item/holosign_creator/robot_seat/bar + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 3bb3f2d6335..293f9c2ccad 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -633,6 +633,14 @@ build_path = /obj/item/circuitboard/machine/sheetifier category = list ("Misc. Machinery") + +/datum/design/board/restaurant_portal + name = "Machine Design (Restaurant Portal)" + desc = "The circuit board for a restaurant portal" + id = "restaurant_portal" + build_path = /obj/item/circuitboard/machine/restaurant_portal + category = list ("Misc. Machinery") + /datum/design/board/vendatray name = "Machine Design (Vend-a-Tray)" desc = "The circuit board for a Vend-a-Tray." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index f02b791f2c9..120c120c678 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -9,7 +9,7 @@ description = "NT default research technologies." // Default research tech, prevents bricking design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "basic_electrolite", "c-reader", "desttagger", "salestagger", "handlabel", "packagewrap", - "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", + "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "restaurant_portal", "paystand", "space_heater", "bucket", "sec_rshot", "sec_beanbag_slug", "sec_Islug", "sec_dart", "sec_38", "rglass", "plasteel", "experi_scanner", "destructive_scanner", "doppler_array", "plastitanium", "plasmaglass", "plasmareinforcedglass", "titaniumglass", "plastitaniumglass", "plastic_knife", "plastic_fork", "plastic_spoon", "conveyor_belt", "conveyor_switch", "b6mm","b6mm_rubber","b9mm","b9mm_rubber","b10mm","b10mm_rubber","b12mm","b12mm_rubber") //SKYRAT EDIT ADDITION - SEC_HAUL diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 7bdbe698795979482ed34bec237152ebe4f465e4..0a947c671bf3d8da57f2648f77eeee1a1239ff60 100644 GIT binary patch delta 31494 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 DLWc-u delta 31117 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 bu^Yllad+kUKuyMl`HPagnq0|!)4=}^4nWWc diff --git a/icons/mob/tourists.dmi b/icons/mob/tourists.dmi new file mode 100644 index 0000000000000000000000000000000000000000..546cff2aed7b50554977d255bbddd9447174b167 GIT binary patch literal 4291 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/restaurant_portal.dmi b/icons/obj/machines/restaurant_portal.dmi new file mode 100644 index 0000000000000000000000000000000000000000..62591d4b56f4f6a5fefd2cbaeb43628df50a6112 GIT binary patch literal 3629 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 literal 0 HcmV?d00001 diff --git a/sound/effects/tank_treads.ogg b/sound/effects/tank_treads.ogg new file mode 100644 index 0000000000000000000000000000000000000000..be4e0ff273beaf3e47d8ad9078993f88cd4f4c61 GIT binary patch literal 22864 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 literal 0 HcmV?d00001 diff --git a/sound/effects/tourist_talk.ogg b/sound/effects/tourist_talk.ogg new file mode 100644 index 0000000000000000000000000000000000000000..239e1a797537bb6f7905378be9e055d8bafec92e GIT binary patch literal 17209 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 LWIrQ