Skip to content

Commit

Permalink
[MIRROR] Clowns can now make balloon... toys. And also mallets and ha…
Browse files Browse the repository at this point in the history
…ts. (#1911) (#2837)

* Clowns can now make balloon... toys. And also mallets and hats. (#82288)

<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

Clowns will now start with a box of 24 random long balloons and a
skillchip in their noggin allowing them to create balloon animals by
combining two of them of different colour together. Owners of the
skillchip also gain access to crafting recepies of balloon mallets,
vests, helmets and tophats, all created from long balloons. A crate of
long balloons, with a box of balloons inside, can be bought at cargo, in
case the clown runs out. I might edit this once I wake up, its 3 in the
morning right now.
Oh also, resprited how balloons look in inventory.


![image](https://github.com/tgstation/tgstation/assets/122572637/2d7ce955-c787-48a5-bfda-4613d2eed837)

## Why It's Good For The Game

Balloon animals funny.
Silly features are my favourite kind of features, and this one's
open-ended too.
Someone on the coder chat recommended someone would do it that one time,
here it goes.


## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

:cl:
add: Added long balloon box to the clown's starting inventory, and a
skill-chip of long lost honk-motherian knowledge to their brain.
add: Added long balloons. Consequently, added balloon animals to make
from such balloons. Also, balloon top hat, vest, helmet, and a mallet.
Don't ask about the mallet.
add: A long balloons box harvested fresh from the farms on the clown
planet will be able to be shipped in a crate to the cargo department
near you!
add: As per requests; water balloons can now be printed at service
lathe, and entertainment modsuit can now blow long balloons!
image: Balloons will now have an unique sprite when in the inventory,
compared when to on the ground.
/:cl:

<!-- Both :cl:'s are required for the changelog to work! You can put
your name to the right of the first :cl: if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->

---------





* Clowns can now make balloon... toys. And also mallets and hats.

* Update storage.dmi

---------

Co-authored-by: NovaBot <[email protected]>
Co-authored-by: YesterdaysPromise <[email protected]>
Co-authored-by: _0Steven <[email protected]>
Co-authored-by: san7890 <[email protected]>
Co-authored-by: Jacquerel <[email protected]>
Co-authored-by: Mal <[email protected]>
  • Loading branch information
7 people authored Apr 11, 2024
1 parent d55fc5d commit b35d62a
Show file tree
Hide file tree
Showing 38 changed files with 409 additions and 6 deletions.
2 changes: 2 additions & 0 deletions code/__DEFINES/traits/declarations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_BRAINWASHING "brainwashing"
/// Allows chef's to chefs kiss their food, to make them with love
#define TRAIT_CHEF_KISS "chefs_kiss"
/// Allows clowns to bend balloons into animals
#define TRAIT_BALLOON_SUTRA "balloon_sutra"

///Movement type traits for movables. See elements/movetype_handler.dm
#define TRAIT_MOVE_GROUND "move_ground"
Expand Down
1 change: 1 addition & 0 deletions code/_globalvars/traits/_traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_BADDNA" = TRAIT_BADDNA,
"TRAIT_BADTOUCH" = TRAIT_BADTOUCH,
"TRAIT_BALD" = TRAIT_BALD,
"TRAIT_BALLOON_SUTRA" = TRAIT_BALLOON_SUTRA,
"TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE,
"TRAIT_BEING_BLADE_SHIELDED" = TRAIT_BEING_BLADE_SHIELDED,
"TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY,
Expand Down
15 changes: 15 additions & 0 deletions code/datums/components/crafting/melee_weapon.dm
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,21 @@
time = 4 SECONDS
category = CAT_WEAPON_MELEE


/datum/crafting_recipe/balloon_mallet
name = "Balloon Mallet"
result = /obj/item/balloon_mallet
reqs = list(
/obj/item/toy/balloon/long = 18,
)
time = 10 SECONDS
category = CAT_WEAPON_MELEE

/datum/crafting_recipe/balloon_mallet/check_requirements(mob/user, list/collected_requirements)
. = ..()
if(HAS_TRAIT(user, TRAIT_BALLOON_SUTRA))
return TRUE

/datum/crafting_recipe/tailwhip
name = "Liz O' Nine Tails"
result = /obj/item/melee/chainofcommand/tailwhip
Expand Down
39 changes: 39 additions & 0 deletions code/datums/components/crafting/tailoring.dm
Original file line number Diff line number Diff line change
Expand Up @@ -442,3 +442,42 @@
/obj/item/clothing/suit/armor/vest = 1,
)
category = CAT_CLOTHING

/datum/crafting_recipe/balloon_helmet
result = /obj/item/clothing/head/helmet/balloon
reqs = list(
/obj/item/toy/balloon/long = 6,
)
time = 4 SECONDS
category = CAT_CLOTHING

/datum/crafting_recipe/balloon_helmet/check_requirements(mob/user, list/collected_requirements)
. = ..()
if(HAS_TRAIT(user, TRAIT_BALLOON_SUTRA))
return TRUE

/datum/crafting_recipe/balloon_tophat
result = /obj/item/clothing/head/hats/tophat/balloon
reqs = list(
/obj/item/toy/balloon/long = 6,
)
time = 4 SECONDS
category = CAT_CLOTHING

/datum/crafting_recipe/balloon_tophat/check_requirements(mob/user, list/collected_requirements)
. = ..()
if(HAS_TRAIT(user, TRAIT_BALLOON_SUTRA))
return TRUE

/datum/crafting_recipe/balloon_vest
result = /obj/item/clothing/suit/armor/balloon_vest
reqs = list(
/obj/item/toy/balloon/long = 18,
)
time = 8 SECONDS
category = CAT_CLOTHING

/datum/crafting_recipe/balloon_vest/check_requirements(mob/user, list/collected_requirements)
. = ..()
if(HAS_TRAIT(user, TRAIT_BALLOON_SUTRA))
return TRUE
5 changes: 5 additions & 0 deletions code/datums/mood_events/generic_negative_events.dm
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,11 @@
mood_change = -6
timeout = 5 MINUTES

/datum/mood_event/mallet_humiliation
description = "Getting hit by such a stupid weapon feels rather humiliating..."
mood_change = -3
timeout = 10 SECONDS

///Wizard cheesy grand finale - what everyone but the wizard gets
/datum/mood_event/madness_despair
description = "UNWORTHY, UNWORTHY, UNWORTHY!!!"
Expand Down
16 changes: 16 additions & 0 deletions code/game/objects/items/storage/boxes/service_boxes.dm
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,22 @@
for(var/i in 1 to 5)
new /obj/item/reagent_containers/spray/chemsprayer/party(src)

/obj/item/storage/box/balloons
name = "box of long balloons"
desc = "A completely randomized and wacky box of long balloons, harvested straight from balloon farms on the clown planet."
illustration = "balloon"

/obj/item/storage/box/balloons/Initialize(mapload)
. = ..()
atom_storage.max_slots = 24
atom_storage.set_holdable(list(/obj/item/toy/balloon/long))
atom_storage.max_total_storage = 24
atom_storage.allow_quick_gather = FALSE

/obj/item/storage/box/balloons/PopulateContents()
for(var/i in 1 to 24)
new /obj/item/toy/balloon/long(src)

/obj/item/storage/box/stickers
name = "box of stickers"
desc = "A box full of random stickers. Do give to the clown."
Expand Down
174 changes: 168 additions & 6 deletions code/game/objects/items/toys.dm
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@
/obj/item/toy/waterballoon
name = "water balloon"
desc = "A translucent balloon. There's nothing in it."
icon = 'icons/obj/toys/toy.dmi'
icon_state = "waterballoon-e"
icon = 'icons/obj/toys/balloons.dmi'
icon_state = "balloon_red-e"
inhand_icon_state = "balloon-empty"

/obj/item/toy/waterballoon/Initialize(mapload)
Expand Down Expand Up @@ -107,15 +107,15 @@
icon_state = "waterballoon"
inhand_icon_state = "balloon"
else
icon_state = "waterballoon-e"
icon_state = "balloon_red-e"
inhand_icon_state = "balloon-empty"
return ..()

#define BALLOON_COLORS list("red", "blue", "green", "yellow")
#define BALLOON_COLORS list("red", "blue", "green", "yellow", "orange", "purple")

/obj/item/toy/balloon
name = "balloon"
desc = "No birthday is complete without it."
desc = "No birthday is complete without it. Sealed with a mechanical bluespace wrap so it remains floating no matter what."
icon = 'icons/obj/toys/balloons.dmi'
icon_state = "balloon"
inhand_icon_state = "balloon"
Expand All @@ -127,6 +127,68 @@
throw_range = 7
force = 0
var/random_color = TRUE
/// the string of the dmi state the balloon has while on the floor.
var/world_state
/// the string of the dmi state the balloon has while in your inventory.
var/storage_state
/// the string describing the name of balloon's current colour.
var/current_color

/obj/item/toy/balloon/long
name = "long balloon"
desc = "A perfect balloon to contort into goofy forms. Sealed with a mechanical bluespace wrap so it remains floating no matter what."
icon_state = "balloon_long"
inhand_icon_state = "balloon"
w_class = WEIGHT_CLASS_NORMAL
/// Combinations of balloon colours to make specific animals.
var/list/balloon_combos = list(
list("red", "blue") = /obj/item/toy/balloon_animal/guy,
list("red", "green") = /obj/item/toy/balloon_animal/nukie,
list("red", "yellow") = /obj/item/toy/balloon_animal/clown,
list("red", "orange") = /obj/item/toy/balloon_animal/cat,
list("red", "purple") = /obj/item/toy/balloon_animal/fly,
list("blue", "green") = /obj/item/toy/balloon_animal/podguy,
list("blue", "yellow") = /obj/item/toy/balloon_animal/ai,
list("blue", "orange") = /obj/item/toy/balloon_animal/dog,
list("blue", "purple") = /obj/item/toy/balloon_animal/xeno,
list("green", "yellow") = /obj/item/toy/balloon_animal/banana,
list("green", "orange") = /obj/item/toy/balloon_animal/lizard,
list("green", "purple") = /obj/item/toy/balloon_animal/slime,
list("yellow", "orange") = /obj/item/toy/balloon_animal/moth,
list("yellow", "purple") = /obj/item/toy/balloon_animal/ethereal,
list("orange", "purple") = /obj/item/toy/balloon_animal/plasmaman,
)

/obj/item/toy/balloon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
. = ..()
if(isturf(loc))
icon_state = "[world_state]"
else
icon_state = "[storage_state]"
update_appearance()

/obj/item/toy/balloon/long/attackby(obj/item/attacking_item, mob/living/user, params)
if(!istype(attacking_item, /obj/item/toy/balloon/long) || !HAS_TRAIT(user, TRAIT_BALLOON_SUTRA))
return ..()

var/obj/item/toy/balloon/long/hit_by = attacking_item
if(hit_by.current_color == current_color)
to_chat(user, span_warning("You must use balloons of different colours to do that!"))
return ..()
visible_message(
span_notice("[user.name] starts contorting up a balloon animal!"),
blind_message = span_hear("You hear balloons being contorted."),
vision_distance = 3,
ignored_mobs = user,
)
for(var/list/pair_of_colors in balloon_combos)
if((hit_by.current_color == pair_of_colors[1] && current_color == pair_of_colors[2]) || (current_color == pair_of_colors[1] && hit_by.current_color == pair_of_colors[2]))
var/path_to_spawn = balloon_combos[pair_of_colors]
user.put_in_hands(new path_to_spawn)
break
qdel(hit_by)
qdel(src)
return TRUE

/obj/item/toy/balloon/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/ammo_casing/foam_dart) && ismonkey(user))
Expand Down Expand Up @@ -157,17 +219,27 @@
. = ..()
if(random_color)
var/chosen_balloon_color = pick(BALLOON_COLORS)
current_color = "[chosen_balloon_color]"
name = "[chosen_balloon_color] [name]"
icon_state = "[icon_state]_[chosen_balloon_color]"
inhand_icon_state = icon_state
world_state = "[icon_state]"
storage_state = "[icon_state]_storage"

/obj/item/toy/balloon/corgi
name = "corgi balloon"
desc = "A balloon with a corgi face on it. For the all year good boys."
desc = "A balloon in the shape of a corgi's head. For the all year good boys."
icon_state = "corgi"
inhand_icon_state = "corgi"
random_color = FALSE

/obj/item/toy/balloon/heart
name = "heart balloon"
desc = "A balloon in the shape of a heart. How lovely"
icon_state = "heart"
inhand_icon_state = "heart"
random_color = FALSE

/obj/item/toy/balloon/syndicate
name = "syndicate balloon"
desc = "There is a tag on the back that reads \"FUK NT!11!\"."
Expand Down Expand Up @@ -200,6 +272,96 @@

#undef BALLOON_COLORS

/*
* Balloon animals
*/

/obj/item/toy/balloon_animal
name = "balloon animal"
desc = "You shouldn't have this."
icon = 'icons/obj/toys/balloons.dmi'
icon_state = "balloon_guy"
throwforce = 0
throw_speed = 2
throw_range = 5
force = 0

/obj/item/toy/balloon_animal/guy
name = "balloon guy"
desc = "A balloon effigy of the everyday standard issue human guy. Wonder if he pays balloon taxes. He probably evades them."
icon_state = "balloon_guy"

/obj/item/toy/balloon_animal/nukie
name = "balloon nukie"
desc = "A balloon effigy of syndicate's nuclear operative. Either made to appease them and pray for survival, or to poke fun at them."
icon_state = "balloon_nukie"

/obj/item/toy/balloon_animal/clown
name = "balloon clown"
desc = "A balloon clown, smiling from ear to ear and beyond!"
icon_state = "balloon_clown"

/obj/item/toy/balloon_animal/cat
name = "balloon cat"
desc = "Without the sharp claws, balloon cats are possibly cuter than their live counterparts, though not as relatable, warm and fuzzy."
icon_state = "balloon_cat"

/obj/item/toy/balloon_animal/fly
name = "balloon fly"
desc = "A balloon effigy of a flyperson. Thankfully, it doesn't come with balloon vomit."
icon_state = "balloon_fly"

/obj/item/toy/balloon_animal/podguy
name = "balloon podguy"
desc = "A balloon effigy of a podperson. Though, actual podpeople have heads and not stalks and leaves."
icon_state = "balloon_podguy"

/obj/item/toy/balloon_animal/ai
name = "balloon ai core"
desc = "A somewhat unrealistic balloon effigy of the station's AI core. Actual AI propably wouldn't smile like this."
icon_state = "balloon_ai"

/obj/item/toy/balloon_animal/dog
name = "balloon dog"
desc = "A balloon effigy of the best boy. It cannot truly compare, but it makes an effort."
icon_state = "balloon_dog"

/obj/item/toy/balloon_animal/xeno
name = "balloon xeno"
desc = "A balloon effigy of a spooky xeno! Too squishy to scare anyone itself, though."
icon_state = "balloon_xeno"

/obj/item/toy/balloon_animal/banana
name = "balloon banana"
desc = "A balloon banana. This one can't be slipped on. Good for psychological warfare, though."
icon_state = "balloon_banana"

/obj/item/toy/balloon_animal/lizard
name = "balloon lizard"
desc = "A balloon effigy of a lizard. One of the first species to adapt to clown planet's culture. Perhaps because they are naturally laughable?"
icon_state = "balloon_lizard"

/obj/item/toy/balloon_animal/slime
name = "balloon slime"
desc = "A balloon effigy of single specimen of the galaxy-wide slime scourge, of purple variety. Slimes tried to invade clown planet once. They got quickly washed out by water-spitting flowers, though."
icon_state = "balloon_slime"

/obj/item/toy/balloon_animal/moth
name = "balloon moth"
desc = "A balloon effigy of a common member of moth flotillas. Very few of them ever decide to settle on the clown planet, but those who do have the best 'piece-of-cloth-dissapearing' acts."
icon_state = "balloon_moth"

/obj/item/toy/balloon_animal/ethereal
name = "balloon ethereal"
desc = "A balloon effigy of an ethereal artisan. Clownery is one form of art, and as such, ethereals were both drawn to and readily accepted at clown planet. Don't mind the lighbulb head, it's art too."
icon_state = "balloon_ethereal"

/obj/item/toy/balloon_animal/plasmaman
name = "balloon plasmaman"
desc = "A balloon effigy of a plasmaman. Among the rarest on the clown planet, only having appeared recently thanks to ready trade between clown planet and NT."
icon_state = "balloon_plasmaman"


/*
* Captain's Aid
*/
Expand Down
42 changes: 42 additions & 0 deletions code/game/objects/items/weaponry.dm
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,48 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
if(user.combat_mode)
return ..(M, user)


/obj/item/balloon_mallet
name = "balloon mallet"
desc = "It's a mallet, a weapon known for being heavy, but made from notoriously light balloons. Air inside removes any force from the swings. It'd be quite embarrassing to get hit by this."
icon = 'icons/obj/weapons/hammer.dmi'
icon_state = "balloon_mallet"
inhand_icon_state = "balloon_mallet"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
siemens_coefficient = 0
force = 1
throw_speed = 1
throwforce = 1
throw_range = 1
w_class = WEIGHT_CLASS_HUGE
attack_verb_continuous = list("mallets", "smoother")
attack_verb_simple = list("mallet", "smoother")
max_integrity = 20
armor_type = /datum/armor/item_banhammer
resistance_flags = FIRE_PROOF

/obj/item/balloon_mallet/examine(mob/user)
. = ..()
if(HAS_TRAIT(user,TRAIT_BALLOON_SUTRA))
. = "A sacred weapon of the higher castes from the clown planet, used to strike fear into the hearts of their foes. Wield it with care."

/obj/item/balloon_mallet/attack(mob/living/target, mob/living/user)
playsound(loc, 'sound/creatures/clown/hehe.ogg', 20)
if (!isliving(target))
return
switch(target.mob_mood.sanity)
if (SANITY_INSANE to SANITY_CRAZY)
force = 8
if (SANITY_UNSTABLE to SANITY_DISTURBED)
force = 4
target.add_mood_event("humiliated", /datum/mood_event/mallet_humiliation)
if (SANITY_NEUTRAL to SANITY_GREAT)
target.add_mood_event("humiliated", /datum/mood_event/mallet_humiliation)

if(user.combat_mode)
return ..(target, user)

/obj/item/sord
name = "\improper SORD"
desc = "This thing is so unspeakably shitty you are having a hard time even holding it."
Expand Down
Loading

0 comments on commit b35d62a

Please sign in to comment.