Skip to content

Commit

Permalink
Adds tongs (tgstation#78698)
Browse files Browse the repository at this point in the history
## About The Pull Request


![dreamseeker_6nkq7xbypa](https://github.com/tgstation/tgstation/assets/7483112/60f86b9d-a5aa-4630-8ab4-8956b2e44665).

Adds tongs, as requested on the [Official TGStation13
Forums](https://tgstation13.org/phpBB/viewtopic.php?f=9&t=33026)
Tongs can be used to pick up food from two tiles away, and feed it to
people who are two tiles away.
You can also use them while in your hand to snap them together like a
crab, or use them to harmlessly pinch people who are up to two tiles
away.

Tongs are available from the kitchen's dinnerware vendor, the autolathe,
and the service lathe.

## Why It's Good For The Game

You can feed people from across a counter, without touching the food and
spreading your germs to them.

## Changelog

:cl: Coded by Jacquerel, Sprited by Dalmationer
add: Added tongs to the kitchen, which you can use to manipulate food
from further away
/:cl:
  • Loading branch information
Jacquerel authored and admeeer committed Oct 4, 2023
1 parent feee57e commit 139a590
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 10 deletions.
100 changes: 100 additions & 0 deletions code/game/objects/items/tongs.dm
@@ -0,0 +1,100 @@
/// Tongs, let you pick up and feed people food from further away.
/obj/item/kitchen/tongs
name = "tongs"
desc = "So you never have to touch anything with your dirty, unwashed hands."
reach = 2
icon_state = "tongs"
base_icon_state = "tongs"
inhand_icon_state = "fork" // close enough
attack_verb_continuous = list("pinches", "tongs", "nips")
attack_verb_simple = list("pinch", "tong", "nip")
/// What are we holding in our tongs?
var/obj/item/tonged
/// Sound to play when we click our tongs together
var/clack_sound = 'sound/items/handling/component_drop.ogg'
/// Time to wait between clacking sounds
var/clack_delay = 2 SECONDS
/// Have we clacked recently?
COOLDOWN_DECLARE(clack_cooldown)

/obj/item/kitchen/tongs/Destroy(force)
QDEL_NULL(tonged)
return ..()

/obj/item/kitchen/tongs/examine(mob/user)
. = ..()
if (!isnull(tonged))
. += span_notice("It is holding [tonged].")

/obj/item/kitchen/tongs/dropped(mob/user, silent)
. = ..()
drop_tonged()

/obj/item/kitchen/tongs/attack_self(mob/user, modifiers)
. = ..()
if(.)
return TRUE
if (!isnull(tonged))
drop_tonged()
return TRUE
if (!COOLDOWN_FINISHED(src, clack_cooldown))
return TRUE
user.visible_message(span_notice("[user] clacks [user.p_their()] [src] together like a crab. Click clack!"))
click_clack()
return TRUE

/// Release the food we are holding
/obj/item/kitchen/tongs/proc/drop_tonged()
if (isnull(tonged))
return
visible_message(span_notice("[tonged] falls to the ground!"))
var/turf/location = drop_location()
tonged.forceMove(location)
tonged.do_drop_animation(location)

/// Play a clacking sound and appear closed, then open again
/obj/item/kitchen/tongs/proc/click_clack()
COOLDOWN_START(src, clack_cooldown, clack_delay)
playsound(src, clack_sound, vol = 100, vary = FALSE)
icon_state = "[base_icon_state]_closed"
var/delay = min(0.5 SECONDS, clack_delay / 2) // Just in case someone's been fucking with the cooldown
addtimer(CALLBACK(src, PROC_REF(clack)), delay, TIMER_DELETE_ME)

/// Plays a clacking sound and appear open
/obj/item/kitchen/tongs/proc/clack()
playsound(src, clack_sound, vol = 100, vary = FALSE)
icon_state = base_icon_state

/obj/item/kitchen/tongs/Exited(atom/movable/leaving, direction)
. = ..()
if (leaving != tonged)
return
tonged = null
update_appearance(UPDATE_ICON)

/obj/item/kitchen/tongs/pre_attack(obj/item/attacked, mob/living/user, params)
if (!isnull(tonged))
attacked.attackby(tonged, user)
return TRUE
if (isliving(attacked))
if (COOLDOWN_FINISHED(src, clack_cooldown))
click_clack()
return ..()
if (!IsEdible(attacked) || attacked.w_class > WEIGHT_CLASS_NORMAL || !isnull(tonged))
return ..()
tonged = attacked
attacked.do_pickup_animation(src)
attacked.forceMove(src)
update_appearance(UPDATE_ICON)

/obj/item/kitchen/tongs/update_overlays()
. = ..()
if (isnull(tonged))
return
var/mutable_appearance/held_food = new /mutable_appearance(tonged.appearance)
held_food.layer = layer
held_food.plane = plane
held_food.transform = held_food.transform.Scale(0.7, 0.7)
held_food.pixel_x = 6
held_food.pixel_y = 6
. += held_food
10 changes: 6 additions & 4 deletions code/modules/cargo/packs/organic.dm
Expand Up @@ -299,10 +299,12 @@
ONLY 5000 BUX GET NOW! Contains a grill and fuel."
cost = CARGO_CRATE_VALUE * 8
crate_type = /obj/structure/closet/crate
contains = list(/obj/item/stack/sheet/mineral/coal/five,
/obj/machinery/grill/unwrenched,
/obj/item/reagent_containers/cup/soda_cans/monkey_energy,
)
contains = list(
/obj/item/stack/sheet/mineral/coal/five,
/obj/item/kitchen/tongs,
/obj/item/reagent_containers/cup/soda_cans/monkey_energy,
/obj/machinery/grill/unwrenched,
)
crate_name = "grilling starter kit crate"

/datum/supply_pack/organic/grillfuel
Expand Down
13 changes: 7 additions & 6 deletions code/modules/jobs/job_types/cook.dm
Expand Up @@ -33,13 +33,14 @@
// Adds up to 100, don't mess it up
mail_goodies = list(
/obj/item/storage/box/ingredients/random = 40,
/obj/item/reagent_containers/cup/bottle/caramel = 8,
/obj/item/reagent_containers/condiment/flour = 8,
/obj/item/reagent_containers/condiment/rice = 8,
/obj/item/reagent_containers/condiment/ketchup = 8,
/obj/item/reagent_containers/condiment/enzyme = 8,
/obj/item/reagent_containers/condiment/soymilk = 8,
/obj/item/reagent_containers/cup/bottle/caramel = 7,
/obj/item/reagent_containers/condiment/flour = 7,
/obj/item/reagent_containers/condiment/rice = 7,
/obj/item/reagent_containers/condiment/ketchup = 7,
/obj/item/reagent_containers/condiment/enzyme = 7,
/obj/item/reagent_containers/condiment/soymilk = 7,
/obj/item/kitchen/spoon/soup_ladle = 6,
/obj/item/kitchen/tongs = 6,
/obj/item/knife/kitchen = 4,
/obj/item/knife/butcher = 2,
)
Expand Down
12 changes: 12 additions & 0 deletions code/modules/research/designs/autolathe/service_designs.dm
Expand Up @@ -142,6 +142,18 @@
)
departmental_flags = DEPARTMENT_BITFLAG_SERVICE

/datum/design/tongs
name = "Tongs"
id = "tongs"
build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2)
build_path = /obj/item/kitchen/tongs
category = list(
RND_CATEGORY_INITIAL,
RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_KITCHEN,
)
departmental_flags = DEPARTMENT_BITFLAG_SERVICE

/datum/design/tray
name = "Serving Tray"
id = "servingtray"
Expand Down
1 change: 1 addition & 0 deletions code/modules/research/techweb/all_nodes.dm
Expand Up @@ -115,6 +115,7 @@
"titaniumglass",
"toner_large",
"toner",
"tongs",
"toy_armblade",
"toy_balloon",
"toygun",
Expand Down
1 change: 1 addition & 0 deletions code/modules/vending/drinnerware.dm
Expand Up @@ -14,6 +14,7 @@
/obj/item/kitchen/spoon/soup_ladle = 3,
/obj/item/clothing/suit/apron/chef = 2,
/obj/item/kitchen/rollingpin = 2,
/obj/item/kitchen/tongs = 2,
/obj/item/knife/kitchen = 2,
),
),
Expand Down
Binary file modified icons/obj/service/kitchen.dmi
Binary file not shown.
1 change: 1 addition & 0 deletions tgstation.dme
Expand Up @@ -2158,6 +2158,7 @@
#include "code\game\objects\items\taster.dm"
#include "code\game\objects\items\teleportation.dm"
#include "code\game\objects\items\theft_tools.dm"
#include "code\game\objects\items\tongs.dm"
#include "code\game\objects\items\toy_mechs.dm"
#include "code\game\objects\items\toys.dm"
#include "code\game\objects\items\trash.dm"
Expand Down

0 comments on commit 139a590

Please sign in to comment.