From bc7c578ce51dda0634b8d6e2b1c470a922174c89 Mon Sep 17 00:00:00 2001
From: Crowbar764 <59719612+Crowbar764@users.noreply.github.com>
Date: Sun, 1 Oct 2023 17:41:25 +0100
Subject: [PATCH] TGUI: Microwave (#4523)
# About the pull request
Gives microwaves a TGUI.
![image](https://github.com/cmss13-devs/cmss13/assets/59719612/72072d6f-bdf9-42d6-a0db-819c98df63da)
# Testing Photographs and Procedure
Screenshots & Videos
![image](https://github.com/cmss13-devs/cmss13/assets/59719612/39c49b3c-a8e6-4215-96aa-ab206172976c)
![image](https://github.com/cmss13-devs/cmss13/assets/59719612/0c2fe594-c1c8-4c7c-ae41-e66b078be903)
![image](https://github.com/cmss13-devs/cmss13/assets/59719612/9f4703a6-fb00-47dd-bfbe-e0c1b1e9d5de)
![image](https://github.com/cmss13-devs/cmss13/assets/59719612/a8943afc-88a2-4ade-867d-00c46c777a8f)
# Changelog
:cl: Casper
ui: added microwave TGUI
/:cl:
---
code/game/machinery/kitchen/microwave.dm | 144 ++++++++++----------
tgui/packages/tgui/interfaces/Microwave.tsx | 86 ++++++++++++
2 files changed, 158 insertions(+), 72 deletions(-)
create mode 100644 tgui/packages/tgui/interfaces/Microwave.tsx
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index f4611b9042db..220772e98b17 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -139,7 +139,6 @@
if (!(R.id in acceptable_reagents))
to_chat(user, SPAN_DANGER("Your [O] contains components unsuitable for cookery."))
return 1
- //G.reagents.trans_to(src,G.amount_per_transfer_from_this)
else if(istype(O,/obj/item/grab))
return 1
else
@@ -152,74 +151,78 @@
/obj/structure/machinery/microwave/attack_hand(mob/user as mob)
user.set_interaction(src)
- interact(user)
+ tgui_interact(user)
+
+/obj/structure/machinery/microwave/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if (!ui)
+ ui = new(user, src, "Microwave", "Microwave Controls")
+ ui.open()
//*******************
//* Microwave Menu
//********************/
-
-/obj/structure/machinery/microwave/interact(mob/user as mob) // The microwave Menu
- var/dat = ""
- if(src.broken > 0)
- dat = {"Bzzzzttttt"}
- else if(src.operating)
- dat = {"Microwaving in progress!
Please wait...!"}
- else if(src.dirty==100)
- dat = {"This microwave is dirty!
Please clean it before use!"}
- else
- var/list/items_counts = new
- var/list/items_measures = new
- var/list/items_measures_p = new
- for (var/obj/O in contents)
- var/display_name = O.name
- if (istype(O,/obj/item/reagent_container/food/snacks/egg))
- items_measures[display_name] = "egg"
- items_measures_p[display_name] = "eggs"
- if (istype(O,/obj/item/reagent_container/food/snacks/tofu))
- items_measures[display_name] = "tofu chunk"
- items_measures_p[display_name] = "tofu chunks"
- if (istype(O,/obj/item/reagent_container/food/snacks/meat)) //any meat
- items_measures[display_name] = "slab of meat"
- items_measures_p[display_name] = "slabs of meat"
- if (istype(O,/obj/item/reagent_container/food/snacks/donkpocket))
- display_name = "Turnovers"
- items_measures[display_name] = "turnover"
- items_measures_p[display_name] = "turnovers"
- if (istype(O,/obj/item/reagent_container/food/snacks/carpmeat))
- items_measures[display_name] = "fillet of meat"
- items_measures_p[display_name] = "fillets of meat"
- items_counts[display_name]++
- for (var/O in items_counts)
- var/N = items_counts[O]
- if (!(O in items_measures))
- dat += {"[capitalize(O)]: [N] [lowertext(O)]\s
"}
- else
- if (N==1)
- dat += {"[capitalize(O)]: [N] [items_measures[O]]
"}
- else
- dat += {"[capitalize(O)]: [N] [items_measures_p[O]]
"}
-
- for (var/datum/reagent/R in reagents.reagent_list)
- var/display_name = R.name
- if (R.id == "hotsauce")
- display_name = "Hotsauce"
- if (R.id == "frostoil")
- display_name = "Coldsauce"
- dat += {"[display_name]: [R.volume] unit\s
"}
-
- if (items_counts.len==0 && reagents.reagent_list.len==0)
- dat = {"The microwave is empty
"}
+/obj/structure/machinery/microwave/ui_data(mob/user)
+ var/list/data = list()
+
+ data["operating"] = operating
+ data["broken"] = (broken > 0)
+ data["dirty"] = (dirty == 100)
+
+ var/list/ingredients = list()
+ var/list/items_counts = list()
+ var/list/items_measures = list()
+ var/list/items_measures_p = list()
+
+ for (var/obj/contents_item as anything in contents)
+ var/display_name = contents_item.name
+
+ if (istype(contents_item, /obj/item/reagent_container/food/snacks/tofu))
+ items_measures[display_name] = "tofu chunk"
+ items_measures_p[display_name] = "tofu chunks"
+ if (istype(contents_item, /obj/item/reagent_container/food/snacks/meat)) //any meat
+ items_measures[display_name] = "slab of meat"
+ items_measures_p[display_name] = "slabs of meat"
+ if (istype(contents_item, /obj/item/reagent_container/food/snacks/donkpocket))
+ display_name = "Turnovers"
+ items_measures[display_name] = "turnover"
+ items_measures_p[display_name] = "turnovers"
+ if (istype(contents_item, /obj/item/reagent_container/food/snacks/carpmeat))
+ items_measures[display_name] = "fillet of meat"
+ items_measures_p[display_name] = "fillets of meat"
+ items_counts[display_name]++
+
+ for (var/contents_item in items_counts)
+ var/list/item = list()
+
+ item["name"] = capitalize(contents_item)
+ item["count"] = items_counts[contents_item]
+
+ if (!(contents_item in items_measures))
+ item["measure"] = "[lowertext(contents_item)][items_counts[contents_item] > 1 ? "s" : ""]" // Adds 's' for plurals.
+ else if (items_counts[contents_item] == 1)
+ item["measure"] = items_measures[contents_item]
else
- dat = {"Ingredients:
[dat]"}
- dat += {"
\
-Turn on!
\
-Eject ingredients!
\
-"}
+ item["measure"] = items_measures_p[contents_item]
+
+ ingredients += list(item)
+
+ for (var/datum/reagent/contents_reagent as anything in reagents.reagent_list)
+ var/list/reagent = list()
- show_browser(user, dat, "Microwave Controls", "microwave")
- return
+ reagent["count"] = contents_reagent.volume
+ reagent["measure"] = contents_reagent.volume > 1 ? "units" : "unit"
+ reagent["name"] = contents_reagent.name
+ if (contents_reagent.id == "hotsauce")
+ reagent["name"] = "Hotsauce"
+ if (contents_reagent.id == "frostoil")
+ reagent["name"] = "Coldsauce"
+ ingredients += list(reagent)
+
+ data["ingredients"] = ingredients
+ return data
//***********************************
//* Microwave Menu Handling/Cooking
@@ -322,7 +325,7 @@
if (src.reagents.total_volume)
src.dirty++
src.reagents.clear_reagents()
- to_chat(usr, SPAN_NOTICE(" You dispose of the microwave contents."))
+ to_chat(usr, SPAN_NOTICE("You dispose of the microwave contents."))
src.updateUsrDialog()
/obj/structure/machinery/microwave/proc/muck_start()
@@ -365,19 +368,16 @@
ffuu.reagents.add_reagent("toxin", amount/10)
return ffuu
-/obj/structure/machinery/microwave/Topic(href, href_list)
- if(..())
- return
-
- usr.set_interaction(src)
- if(src.operating)
- src.updateUsrDialog()
+/obj/structure/machinery/microwave/ui_act(action, params)
+ . = ..()
+ if(.)
return
- switch(href_list["action"])
+ switch (action)
if ("cook")
cook(usr.get_skill_duration_multiplier(SKILL_DOMESTIC)) // picking the right microwave setting for the right food. when's the last time you used the special setting on the microwave? i bet you just slam the 30 second increment. Do you know how much programming went into putting the Pizza setting into a microwave emitter?
- if ("dispose")
+ if ("eject_all")
dispose()
- return
+
+ return TRUE
diff --git a/tgui/packages/tgui/interfaces/Microwave.tsx b/tgui/packages/tgui/interfaces/Microwave.tsx
new file mode 100644
index 000000000000..da16a9f44b49
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Microwave.tsx
@@ -0,0 +1,86 @@
+import { useBackend } from '../backend';
+import { Button, NoticeBox, Section, Flex, Box } from '../components';
+import { BooleanLike } from 'common/react';
+import { Window } from '../layouts';
+
+type Ingredient = {
+ name: string;
+ count: number;
+ measure: string;
+};
+
+type BackendContext = {
+ operating: BooleanLike;
+ broken: BooleanLike;
+ dirty: BooleanLike;
+ ingredients: Ingredient[];
+};
+
+export const Microwave = (props, context) => {
+ const { data, act } = useBackend(context);
+ const { operating, broken, dirty, ingredients } = data;
+
+ return (
+
+
+
+
+
+
+
+ }>
+ {!!operating && (
+
+ Cooking...
+
+ )}
+
+ {!!broken && (
+
+ Appliance broken. Please contact your local technician.
+
+ )}
+
+ {!!dirty && (
+
+ This microwave is too dirty. Cleaning required.
+
+ )}
+
+ {!ingredients.length && None}
+
+
+ {ingredients.map((ingredient) => {
+ return (
+
+ {ingredient.name}: {ingredient.count}{' '}
+ {ingredient.measure}
+
+ );
+ })}
+
+
+
+
+ );
+};