Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions code/__DEFINES/traits/definitions.dm
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_PRESERVE_UI_WITHOUT_CLIENT "preserve_ui_without_client"
/// This mob can't have a split personality
#define TRAIT_NO_SPLIT_PERSONALITY "no_split_personality"
/// Can see the lore blurb of items for culture different than their own.
#define TRAIT_CULTURAL_KNOWLEDGE "Cultural Erudite"
#define TRAIT_VIRGIN "virginity"

/// This mob's surgical operations ignore ALL speed modifiers (even positive ones!) besides tool quality.
Expand Down
1 change: 1 addition & 0 deletions code/_globalvars/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,7 @@ GLOBAL_LIST_INIT(roguetraits, list(
TRAIT_COIN_ILLITERATE = span_info("I care little for the concept of coins and prefer to barter via other means."),
TRAIT_LUCKY_COOK = span_info("Xylix smiles upon my cooking, I often end up with impossible amounts of extra goods..."),
TRAIT_ABOMINATION = span_info("I am an abomination, others will recognise me for what I am"),
TRAIT_CULTURAL_KNOWLEDGE = span_info("I intimately understand cultures other than my own and may consult their viewpoint when examining certain items."),
TRAIT_COURTAGENT = span_info("I am an Agent of the Court, employed by the Hand. I am able to recognise my colleagues"),
TRAIT_GATEKEEPER = span_info("I am well practiced in the art of swiftly opening and sealing the gates, alongside levers and switches.")
))
Expand Down
24 changes: 24 additions & 0 deletions code/datums/quirks/boon/_boon.dm
Original file line number Diff line number Diff line change
Expand Up @@ -288,3 +288,27 @@
return

to_chat(owner, span_notice("You catch your reflection and can't help but admire yourself."))

/datum/quirk/boon/beautiful/on_remove()
. = ..()
if(!owner)
return
REMOVE_TRAIT(owner, TRAIT_BEAUTIFUL, "[type]")

/datum/quirk/boon/cultural_scholar
name = "Cultural Erudite"
desc = "Whether through long travels, extended scholarship, or osmosis, you've acquired deep knowledge of other culture and how they think. \
When examining items, you may consult cultural lore blurbs for cultures that aren't your own."
point_value = -1

/datum/quirk/boon/cultural_scholar/on_spawn()
. = ..()
if(!owner)
return
ADD_TRAIT(owner, TRAIT_CULTURAL_KNOWLEDGE, "[type]")

/datum/quirk/boon/cultural_scholar/on_remove()
. = ..()
if(!owner)
return
REMOVE_TRAIT(owner, TRAIT_CULTURAL_KNOWLEDGE, "[type]")
22 changes: 22 additions & 0 deletions code/game/objects/items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,12 @@
/// Needed for grandmaster/martyr weapons, might be shitcode, might be usable for the future, *shrug, it works
var/toggle_state

/* Optional lore description for the item, a list linking a human mob's culture.name var alongside a string.
If the human mob has the prerequisite culture, they will see the corresponding string.
For instance, to make two descriptions, one for vanderlin, one for grenzelhoft you'd have :
list(list("Vanderlin", "This is a vanderlinian description."), list("Grenzelhoft", "this is a grenzelhoftian description")) */
var/culture_desc[][2] = list(list("no_culture", "description"),) // defined twice because we need the len and the default text helps.

Check warning on line 312 in code/game/objects/items.dm

View workflow job for this annotation

GitHub Actions / Run Linters

OD0000: List doubly initialized

/obj/item/Initialize(mapload)
if (attack_verb)
attack_verb = typelist("attack_verb", attack_verb)
Expand Down Expand Up @@ -1615,6 +1621,21 @@
. = ..()
if(currecipe)
. += span_warning("It is currently being worked on to become \a [currecipe.name].")
/// Check for item culture descriptions.
if (ishuman(user) && culture_desc[1][1] != "no_culture") // make sure the mob has a culture to check for + avoid unecessary controls.
var/mob/living/carbon/human/humanexaminer = user
for(var/culture_range = 1, culture_range <= culture_desc.len, culture_range++)
if(humanexaminer.culture.name == culture_desc[culture_range][1])
var/str = "<details><summary><b>ANAMNESIS:</b> [span_tooltip("You are from [humanexaminer.culture.name]", humanexaminer.culture.name)]</summary>"
str += culture_desc[culture_range][2]
str += "</details>"
. += span_info(str)
else if(HAS_TRAIT(humanexaminer, TRAIT_CULTURAL_KNOWLEDGE))
var/str = "<details><summary><b>ANAMNESIS:</b> [span_tooltip("You are culturally knowledgeable.", culture_desc[culture_range][1])]</summary>"
str += culture_desc[culture_range][2]
str += "</details>"
. += span_info(str)

if(!get_precursor_data(src))
return
var/alch_skill = user.attributes ? GET_MOB_SKILL_VALUE(user, /datum/attribute/skill/craft/alchemy) : 60
Expand All @@ -1637,6 +1658,7 @@
if(alch_skill >= SKILL_LEVEL_EXPERT)
. += span_notice(" Smells faintly of [smell].")


/**
* Returns the atom(either itself or an internal module) that will interact/attack the target on behalf of us
* For example an object can have different `tool_behaviours` (e.g borg omni tool) but will return an internal reference of that tool to attack for us
Expand Down
2 changes: 1 addition & 1 deletion code/modules/clothing/ring/misc.dm
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@
/obj/item/clothing/ring/apothecary_ring/examine(mob/user)
. = ..()
if(is_apothecary_job(user.mind.assigned_role))
. += span_info("A hefty bloody made out of thaumic iron, proof of my successful graduation. \
. += span_info("A hefty bloody ring made out of thaumic iron, proof of my successful graduation. \
It doesn't get any easier to wear with time, but at least it proves I'm a confirmed alchemist \
and can legally manipulate lux, so long as I follow Pestra's teachings.")
else
Expand Down
7 changes: 5 additions & 2 deletions code/modules/cooking/raw/NeuFood_dough.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1604,18 +1604,21 @@

/obj/item/reagent_containers/food/snacks/grenzelbun
name = "grenzelbun"
desc = "The classic wiener in a bun, a staple food of Grenzelhoft cuisine."
desc = "The classic wiener in a bun, a staple food of Grenzelhoft cuisine." // handled upon examine
icon_state = "grenzbun"
base_icon_state = "grenzbun"
bitesize = 5
w_class = WEIGHT_CLASS_NORMAL

nutrition = (RAWMEAT_NUTRITION + SMALLDOUGH_NUTRITION) * COOK_MOD
rotprocess = SHELFLIFE_EXTREME
foodtype = GRAIN | MEAT
faretype = FARE_NEUTRAL
tastes = list("savory sausage" = 1, "bread" = 1)
item_weight = 180 GRAMS
culture_desc = list(list("Grenzelhoft", "Shameless cultural appropriation in the form of a bun. \
Any true resident of the Black Empire knows sausages go best with mashed tatoes"),
list("Rockhill", "Close yet quite far from a propper, tasty pie."))


/obj/item/reagent_containers/food/snacks/grenzelbun_cocaumole
name = "grenzelbun with cocaumole"
Expand Down
3 changes: 2 additions & 1 deletion code/modules/jobs/job_types/garrison/town_elder.dm
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
forced_flaw = /datum/quirk/boon/folk_hero

traits = list(
TRAIT_OLDPARTY
TRAIT_OLDPARTY,
TRAIT_CULTURAL_KNOWLEDGE
)

spells = list(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
TRAIT_PSYDONITE,
TRAIT_FOREIGNER,
TRAIT_RECOGNIZED,
TRAIT_CULTURAL_KNOWLEDGE, // travelled far and wide and is experienced.
)

attribute_sheet = /datum/attribute_holder/sheet/job/inspector
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
TRAIT_PSYDONITE,
TRAIT_FOREIGNER,
TRAIT_RECOGNIZED,
TRAIT_CULTURAL_KNOWLEDGE, // travelled far and wide and is experienced.
)

/datum/job/advclass/puritan/ordinator/after_spawn(mob/living/carbon/human/spawned, client/player_client)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
TRAIT_DUALWIELDER,
TRAIT_FOREIGNER,
TRAIT_RECOGNIZED,
TRAIT_CULTURAL_KNOWLEDGE, // travelled far and wide and is experienced.
)
/datum/job/advclass/puritan/preceptor/after_spawn(mob/living/carbon/human/spawned, client/player_client)
. = ..()
Expand Down
1 change: 1 addition & 0 deletions code/modules/jobs/job_types/nobility/archivist.dm
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
traits = list(
TRAIT_NOBLE_BLOOD,
TRAIT_NOBLE_POWER,
TRAIT_CULTURAL_KNOWLEDGE,
TRAIT_VIRGIN,
)

Expand Down
4 changes: 4 additions & 0 deletions code/modules/jobs/job_types/nobility/hand.dm
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,10 @@
attribute_sheet_old = /datum/attribute_holder/sheet/job/advisor/old
honorary = "Councilor"

traits = list(
TRAIT_CULTURAL_KNOWLEDGE
)

/datum/outfit/hand/advisor
name = "Advisor (Hand)"
shirt = /obj/item/clothing/shirt/undershirt/fancy
Expand Down
1 change: 1 addition & 0 deletions code/modules/jobs/job_types/nobility/lord.dm
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ GLOBAL_LIST_EMPTY(lord_titles)
TRAIT_NOSEGRAB,
TRAIT_HEAVYARMOR,
TRAIT_MEDIUMARMOR,
TRAIT_CULTURAL_KNOWLEDGE,
)

voicepack_m = /datum/voicepack/male/evil
Expand Down
3 changes: 2 additions & 1 deletion code/modules/jobs/job_types/nobility/merchant.dm
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@
attribute_sheet = /datum/attribute_holder/sheet/job/merchant

traits = list(
TRAIT_SEEPRICES
TRAIT_SEEPRICES,
TRAIT_CULTURAL_KNOWLEDGE // cultural osmosis, potentially travelled across the world, definitely spoke with people who have.
)

/datum/outfit/merchant
Expand Down
Loading