Files
Bubberstation/code/modules/language/language_manuals.dm
SkyratBot 98774c8580 [MIRROR] Fixes mind traits (Curator, Miner, Clown) [MDB IGNORE] (#21397)
* Fixes mind traits (Curator, Miner, Clown) (#75593)

## About The Pull Request

Tower of Babel (Curator), Naive (Clown), and Storm detector (Shaft
Miner), are all traits that are given to your mind upon taking these
jobs.
However, we have been checking the body for these traits, not the mind.
This meant that Shaft miners werent alerted of ice storms, Clowns didnt
have their unique examine text, and Curators were affected by Tower of
Babel.
This fixes all those issues.

Naive and Tower of Babel realistically should only be on the mind, so I
changed all instances to check the mind. Storm detection is something
you can get through analyzers, so I left it as a check for both your
body and mind traits.

Clown's Naive:

![image](https://github.com/tgstation/tgstation/assets/53777086/30e92026-5d1d-44a5-9969-206df99c5e8f)

Tower of Babel:

![image](https://github.com/tgstation/tgstation/assets/53777086/b1d41f9d-e020-495c-89de-0d4e2c953442)

## Why It's Good For The Game

Fixes several bugs for 3 jobs all at once. I don't see any issue reports
on any of these, but they existed.

## Changelog

🆑
fix: Shaft Miners are now alerted of Icemoon storms, Clowns are naive,
and Curators are immune to the Tower of Babel again.
/🆑

* Fixes mind traits (Curator, Miner, Clown)

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2023-05-24 16:34:55 +02:00

115 lines
4.5 KiB
Plaintext

/obj/item/language_manual
icon = 'icons/obj/library.dmi'
icon_state = "book2"
/// Number of charges the book has, limits the number of times it can be used.
var/charges = 1
/// Path to a language datum that the book teaches.
var/datum/language/language = /datum/language/common
/// Flavour text to display when the language is successfully learned.
var/flavour_text = "suddenly your mind is filled with codewords and responses"
/obj/item/language_manual/attack_self(mob/living/user)
if(!isliving(user))
return
if(user.has_language(language))
to_chat(user, span_boldwarning("You start skimming through [src], but you already know [initial(language.name)]."))
return
to_chat(user, span_boldannounce("You start skimming through [src], and [flavour_text]."))
user.grant_language(language)
user.remove_blocked_language(language, source=LANGUAGE_ALL)
ADD_TRAIT(user.mind, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) // this makes you immune to babel effects
use_charge(user)
/obj/item/language_manual/attack(mob/living/M, mob/living/user)
if(!istype(M) || !istype(user))
return
if(M == user)
attack_self(user)
return
playsound(loc, SFX_PUNCH, 25, TRUE, -1)
if(M.stat == DEAD)
M.visible_message(span_danger("[user] smacks [M]'s lifeless corpse with [src]."), span_userdanger("[user] smacks your lifeless corpse with [src]."), span_hear("You hear smacking."))
else if(M.has_language(language))
M.visible_message(span_danger("[user] beats [M] over the head with [src]!"), span_userdanger("[user] beats you over the head with [src]!"), span_hear("You hear smacking."))
else
M.visible_message(span_notice("[user] teaches [M] by beating [M.p_them()] over the head with [src]!"), span_boldnotice("As [user] hits you with [src], [flavour_text]."), span_hear("You hear smacking."))
M.grant_language(language, TRUE, TRUE, LANGUAGE_MIND)
use_charge(user)
/obj/item/language_manual/proc/use_charge(mob/user)
charges--
if(!charges)
var/turf/T = get_turf(src)
T.visible_message(span_warning("The cover and contents of [src] start shifting and changing! It slips out of your hands!"))
new /obj/item/book/manual/random(T)
qdel(src)
/obj/item/language_manual/codespeak_manual
name = "codespeak manual"
desc = "The book's cover reads: \"Codespeak(tm) - Secure your communication with metaphors so elaborate, they seem randomly generated!\""
language = /datum/language/codespeak
flavour_text = "suddenly your mind is filled with codewords and responses"
/obj/item/language_manual/codespeak_manual/unlimited
name = "deluxe codespeak manual"
charges = INFINITY
/obj/item/language_manual/roundstart_species
/obj/item/language_manual/roundstart_species/Initialize(mapload)
. = ..()
language = pick( \
/datum/language/voltaic, \
/datum/language/nekomimetic, \
/datum/language/draconic, \
/datum/language/moffic, \
/datum/language/calcic \
)
name = "[initial(language.name)] manual"
desc = "The book's cover reads: \"[initial(language.name)] for Xenos - Learn common galactic tongues in seconds.\""
flavour_text = "you feel empowered with a mastery over [initial(language.name)]"
/obj/item/language_manual/roundstart_species/unlimited
charges = INFINITY
/obj/item/language_manual/roundstart_species/unlimited/Initialize(mapload)
. = ..()
name = "deluxe [initial(language.name)] manual"
/obj/item/language_manual/roundstart_species/five
charges = 5
/obj/item/language_manual/roundstart_species/five/Initialize(mapload)
. = ..()
name = "extended [initial(language.name)] manual"
// So drones can teach borgs and AI dronespeak. For best effect, combine with mother drone lawset.
/obj/item/language_manual/dronespeak_manual
name = "dronespeak manual"
desc = "The book's cover reads: \"Understanding Dronespeak - An exercise in futility.\" The book is written entirely in binary, non-silicons probably won't understand it."
language = /datum/language/drone
flavour_text = "suddenly the drone chittering makes sense"
charges = INFINITY
/obj/item/language_manual/dronespeak_manual/attack(mob/living/M, mob/living/user)
// If they are not drone or silicon, we don't want them to learn this language.
if(!(isdrone(M) || issilicon(M)))
M.visible_message(span_danger("[user] beats [M] over the head with [src]!"), span_userdanger("[user] beats you over the head with [src]!"), span_hear("You hear smacking."))
return
return ..()
/obj/item/language_manual/dronespeak_manual/attack_self(mob/living/user)
if(!(isdrone(user) || issilicon(user)))
to_chat(user, span_danger("You beat yourself over the head with [src]!"))
return
return ..()