From 4407d1174ae261af889188ff67a8d68e61c620de Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:56:43 -0600 Subject: [PATCH] Space Carps & Dragons now speak Carptongue instead of Common. Space Dragons also speak Draconic. (#89034) ## About The Pull Request ![image](https://github.com/user-attachments/assets/df57849b-c465-465a-9f8b-fc6550183794) - Space Carps and Space Dragons no longer speak Common. - Space Carps and Space Dragons now speak Carptongue, a language native to Space Carps. - Space Dragons also speak Draconic. - Space Dragons can still understand common, they just can't speak it. - Space Craps cannot understand common, unless they're a special carp (Cayenne, Lia, Magicarps, those spawned from plushies) - Ash Drakes and Ice Whelps also no longer speak Common, and instead speak Draconic. They can still understand common. - Carp Infusion now lets you speak and understand Carptongue. - Fish Infusion now lets you speak and understand Carptongue. - Fire Sharks now speak Carptongue instead of Common. They can still understand common (to receive directions). ## Why It's Good For The Game #89032 made me think "hey why CAN carps speak Common?" So I thought "What if the Space Dragon spoke Draconic instead since it's a big lizard" But naturally the Space Dragon still needs to communicate verbally to its carps and, well, carps aren't really lizards so they shouldn't get Draconic right? So I thought "Why not add a Fish language" Now, various aquatic space creatures have a language that they can speak between one another in privacy, while the Space Dragon can still communicate to the crew for gimmicks via the curator (or draconic if they want to speak to lizards) ## Changelog :cl: Melbert add: Adds Carptongue language, spoken by Space Carps. del: Space Carps no longer speak or understand Common. Special carps like Cayenne and Lia can still understand common. add: Space Dragons can speak Draconic and Carptongue. del: Space Dragons no longer speak Common. They can still understand it. add: Ash Drakes and Ice Whelps now speak Draconic. del: Ash Drakes and Ice Whelps no longer speak Common. They can still understand it. add: Fire Sharks now speak Carptongue. del: Fire Sharks no longer speak Common. They can still understand it. add: Fish and Carp Infusion now grant Carptongue, letting you speak to (and understand) Space Carps. add: Sleeping Carp grants you Carptongue, but as most human tongues can't speak it, you'll only be able to understand Space Carps unless you steal a fish tongue. /:cl: --- code/datums/martial/sleeping_carp.dm | 2 + .../dna_infuser/organ_sets/carp_organs.dm | 4 ++ .../dna_infuser/organ_sets/fish_organs.dm | 6 +++ code/game/objects/items/dehy_carp.dm | 1 + code/modules/language/_language_holder.dm | 39 ++++++++++++++++++ code/modules/language/carptongue.dm | 12 ++++++ .../mob/living/basic/heretic/fire_shark.dm | 1 + .../basic/icemoon/ice_whelp/ice_whelp.dm | 1 + .../mob/living/basic/space_fauna/carp/carp.dm | 2 + .../living/basic/space_fauna/carp/magicarp.dm | 1 + .../space_fauna/space_dragon/space_dragon.dm | 1 + .../simple_animal/hostile/megafauna/drake.dm | 1 + icons/ui/chat/language.dmi | Bin 6211 -> 6289 bytes tgstation.dme | 1 + 14 files changed, 72 insertions(+) create mode 100644 code/modules/language/carptongue.dm diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index b5ff49037e6..fdfd6e404ec 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -17,11 +17,13 @@ RegisterSignal(new_holder, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) RegisterSignal(new_holder, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile)) new_holder.faction |= FACTION_CARP //:D + new_holder.grant_language(/datum/language/carptongue, ALL, type) /datum/martial_art/the_sleeping_carp/on_remove(mob/living/remove_from) remove_from.remove_traits(scarp_traits, SLEEPING_CARP_TRAIT) UnregisterSignal(remove_from, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_PRE_BULLET_ACT)) remove_from.faction -= FACTION_CARP //:( + remove_from.remove_language(/datum/language/carptongue, ALL, type) return ..() /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/attacker, mob/living/defender) diff --git a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm index 221881c6ea5..263285769b2 100644 --- a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm @@ -94,6 +94,10 @@ if(tooth_fairy) new /obj/item/knife/carp(tooth_fairy) +/obj/item/organ/tongue/carp/get_possible_languages() + . = ..() + . += /datum/language/carptongue + /obj/item/knife/carp name = "carp tooth" desc = "Looks sharp. Sharp enough to poke someone's eye out. Holy fuck it's big." diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm index 69f5a23798f..9c885f38628 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm @@ -47,6 +47,7 @@ if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish)) add_speed_buff() owner.mind?.adjust_experience(/datum/skill/fishing, SKILL_EXP_JOURNEYMAN, silent = TRUE) + owner.grant_language(/datum/language/carptongue, ALL, type) /datum/status_effect/organ_set_bonus/fish/disable_bonus() . = ..() @@ -71,6 +72,7 @@ if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish)) remove_speed_buff() owner.mind?.adjust_experience(/datum/skill/fishing, -SKILL_EXP_JOURNEYMAN, silent = TRUE) + owner.remove_language(/datum/language/carptongue, ALL, type) /datum/status_effect/organ_set_bonus/fish/proc/get_perceived_food_quality(datum/source, datum/component/edible/edible, list/extra_quality) SIGNAL_HANDLER @@ -419,6 +421,10 @@ . = ..() AddElement(/datum/element/noticable_organ, "Slick black ink seldom rivulets from %PRONOUN_their mouth.", BODY_ZONE_PRECISE_MOUTH) +/obj/item/organ/tongue/inky/get_possible_languages() + . = ..() + . += /datum/language/carptongue + ///Organ from fish with the toxic trait. Allows the user to use tetrodotoxin as a healing chem instead of a toxin. /obj/item/organ/liver/fish name = "mutated fish-liver" diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index e863f09ecde..21cc1922783 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -62,6 +62,7 @@ //Make carp non-hostile to user if(owner) spawned_mob.faction = list("[REF(owner)]") + spawned_mob.grant_language(/datum/language/common, UNDERSTOOD_LANGUAGE, LANGUAGE_ATOM) for(var/mob/living/viewer in viewers(5, get_turf(src))) to_chat(viewer, viewer == owner ? span_notice("The newly grown [spawned_mob.name] looks up at you with friendly eyes.") : span_warning("You have a bad feeling about this.")) qdel(src) diff --git a/code/modules/language/_language_holder.dm b/code/modules/language/_language_holder.dm index b48a1ab1530..8e970ddd17a 100644 --- a/code/modules/language/_language_holder.dm +++ b/code/modules/language/_language_holder.dm @@ -321,6 +321,16 @@ GLOBAL_LIST_INIT(prototype_language_holders, init_language_holder_prototypes()) ) selected_language = /datum/language/uncommon +/datum/language_holder/lizard/hear_common + selected_language = /datum/language/draconic + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/draconic = list(LANGUAGE_ATOM), + ) + /datum/language_holder/monkey understood_languages = list( /datum/language/common = list(LANGUAGE_ATOM), @@ -503,6 +513,35 @@ GLOBAL_LIST_INIT(prototype_language_holders, init_language_holder_prototypes()) /datum/language/nekomimetic = list(LANGUAGE_ATOM), ) +/datum/language_holder/carp + selected_language = /datum/language/carptongue + understood_languages = list( + /datum/language/carptongue = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/carptongue = list(LANGUAGE_ATOM), + ) + +/datum/language_holder/carp/dragon + understood_languages = list( + /datum/language/carptongue = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + /datum/language/common = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/carptongue = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + ) + +/datum/language_holder/carp/hear_common + understood_languages = list( + /datum/language/carptongue = list(LANGUAGE_ATOM), + /datum/language/common = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/carptongue = list(LANGUAGE_ATOM), + ) + // Given to atoms by default /datum/language_holder/atom_basic understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) diff --git a/code/modules/language/carptongue.dm b/code/modules/language/carptongue.dm new file mode 100644 index 00000000000..34ef4c4b5cd --- /dev/null +++ b/code/modules/language/carptongue.dm @@ -0,0 +1,12 @@ +/datum/language/carptongue + name = "Carptongue" + desc = "Various fishy sounds that might make sense to space carps." + key = "c" + icon_state = "fish" + flags = NO_STUTTER|TONGUELESS_SPEECH + sentence_chance = 0 + space_chance = 75 + syllables = list("glub", "blub", "bloop") + default_priority = 25 + default_name_syllable_min = 1 + default_name_syllable_max = 2 diff --git a/code/modules/mob/living/basic/heretic/fire_shark.dm b/code/modules/mob/living/basic/heretic/fire_shark.dm index 847584ae41a..e7375f4b33f 100644 --- a/code/modules/mob/living/basic/heretic/fire_shark.dm +++ b/code/modules/mob/living/basic/heretic/fire_shark.dm @@ -22,6 +22,7 @@ speak_emote = list("screams") basic_mob_flags = DEL_ON_DEATH ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles + initial_language_holder = /datum/language_holder/carp/hear_common /mob/living/basic/heretic_summon/fire_shark/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm index cc6bd1c900e..a270692991a 100644 --- a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm @@ -15,6 +15,7 @@ ) crusher_loot = /obj/item/crusher_trophy/tail_spike speed = 12 + initial_language_holder = /datum/language_holder/lizard/hear_common maxHealth = 300 health = 300 diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp.dm b/code/modules/mob/living/basic/space_fauna/carp/carp.dm index d62804f1ca1..bc70e6dc03a 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -40,6 +40,7 @@ butcher_results = list(/obj/item/food/fishmeat/carp = 2, /obj/item/stack/sheet/animalhide/carp = 1) greyscale_config = /datum/greyscale_config/carp ai_controller = /datum/ai_controller/basic_controller/carp + initial_language_holder = /datum/language_holder/carp habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = 1500 @@ -197,6 +198,7 @@ gold_core_spawnable = NO_SPAWN gender = FEMALE // Both current existing pet carp are female but you can remove this if someone else gets a male one? ai_controller = /datum/ai_controller/basic_controller/carp/pet + initial_language_holder = /datum/language_holder/carp/hear_common /mob/living/basic/carp/pet/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm b/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm index 3b6d1e5e922..1eccb697b59 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm @@ -52,6 +52,7 @@ GLOBAL_LIST_INIT(magicarp_spell_colours, list( gold_core_spawnable = NO_SPAWN greyscale_config = /datum/greyscale_config/carp_magic ai_controller = /datum/ai_controller/basic_controller/carp/ranged + initial_language_holder = /datum/language_holder/carp/hear_common // its magic tamed_commands = list( /datum/pet_command/idle, /datum/pet_command/free, diff --git a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm index 662242ce60f..bbdb134190d 100644 --- a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm +++ b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm @@ -46,6 +46,7 @@ death_sound = 'sound/mobs/non-humanoids/space_dragon/space_dragon_roar.ogg' death_message = "screeches in agony as it collapses to the floor, its life extinguished." butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) + initial_language_holder = /datum/language_holder/carp/dragon can_buckle_to = FALSE lighting_cutoff_red = 12 lighting_cutoff_green = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index a5feaad351f..3189f261746 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -60,6 +60,7 @@ loot = list(/obj/structure/closet/crate/necropolis/dragon) butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/ashdrake = 10) + initial_language_holder = /datum/language_holder/lizard/hear_common var/swooping = NONE var/player_cooldown = 0 gps_name = "Fiery Signal" diff --git a/icons/ui/chat/language.dmi b/icons/ui/chat/language.dmi index 2c4da48352bd1e4344f035246812748e736f272f..6ddd93530b670d0b356132df2fb65180ae5b502b 100644 GIT binary patch delta 6277 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 delta 6199 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 V>kLO{%}W3P002ovPDHLkV1hQzNzVWP diff --git a/tgstation.dme b/tgstation.dme index 8f39003a2c3..31035ae171a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4531,6 +4531,7 @@ #include "code\modules\language\beachbum.dm" #include "code\modules\language\buzzwords.dm" #include "code\modules\language\calcic.dm" +#include "code\modules\language\carptongue.dm" #include "code\modules\language\codespeak.dm" #include "code\modules\language\common.dm" #include "code\modules\language\draconic.dm"