diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index e2e342dd03a..1a113bf804e 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -127,6 +127,13 @@
#define SCREWYHUD_DEAD 2
#define SCREWYHUD_HEALTHY 3
+//Threshold levels for beauty for humans
+#define BEAUTY_LEVEL_HORRID -66
+#define BEAUTY_LEVEL_BAD -33
+#define BEAUTY_LEVEL_DECENT 33
+#define BEAUTY_LEVEL_GOOD 66
+#define BEAUTY_LEVEL_GREAT 100
+
//Moods levels for humans
#define MOOD_LEVEL_HAPPY4 15
#define MOOD_LEVEL_HAPPY3 10
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 443b4eaab43..d9a87f523fc 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -177,6 +177,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_EMPATH "empath"
#define TRAIT_FRIENDLY "friendly"
#define TRAIT_GRABWEAKNESS "grab_weakness"
+#define TRAIT_SNOB "snob"
// common trait sources
#define TRAIT_GENERIC "generic"
diff --git a/code/datums/components/beauty.dm b/code/datums/components/beauty.dm
new file mode 100644
index 00000000000..54d96626eb2
--- /dev/null
+++ b/code/datums/components/beauty.dm
@@ -0,0 +1,28 @@
+/datum/component/beauty
+ var/beauty = 0
+
+/datum/component/beauty/Initialize(beautyamount)
+ if(!ismovableatom(parent))
+ return COMPONENT_INCOMPATIBLE
+ beauty = beautyamount
+ RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/enter_area)
+ RegisterSignal(parent, COMSIG_EXIT_AREA, .proc/exit_area)
+ var/area/A = get_area(parent)
+ enter_area(null, A)
+
+/datum/component/beauty/proc/enter_area(datum/source, area/A)
+ if(A.outdoors)
+ return
+ A.totalbeauty += beauty
+ A.update_beauty()
+
+/datum/component/beauty/proc/exit_area(datum/source, area/A)
+ if(A.outdoors)
+ return
+ A.totalbeauty -= beauty
+ A.update_beauty()
+
+/datum/component/beauty/Destroy()
+ . = ..()
+ var/area/A = get_area(parent)
+ exit_area(null, A)
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index ecf164c5725..0ad142f8aec 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -353,11 +353,34 @@
add_event(null, "charge", /datum/mood_event/charged)
/datum/component/mood/proc/check_area_mood(datum/source, var/area/A)
+ update_beauty(A)
if(A.mood_bonus)
add_event(null, "area", /datum/mood_event/area, A.mood_bonus, A.mood_message)
else
clear_event(null, "area")
+/datum/component/mood/proc/update_beauty(area/A)
+ if(A.outdoors) //if we're outside, we don't care.
+ clear_event(null, "area_beauty")
+ return FALSE
+ if(HAS_TRAIT(parent, TRAIT_SNOB))
+ switch(A.beauty)
+ if(-INFINITY to BEAUTY_LEVEL_HORRID)
+ add_event(null, "area_beauty", /datum/mood_event/horridroom)
+ return
+ if(BEAUTY_LEVEL_HORRID to BEAUTY_LEVEL_BAD)
+ add_event(null, "area_beauty", /datum/mood_event/badroom)
+ return
+ switch(A.beauty)
+ if(BEAUTY_LEVEL_BAD to BEAUTY_LEVEL_DECENT)
+ clear_event(null, "area_beauty")
+ if(BEAUTY_LEVEL_DECENT to BEAUTY_LEVEL_GOOD)
+ add_event(null, "area_beauty", /datum/mood_event/decentroom)
+ if(BEAUTY_LEVEL_GOOD to BEAUTY_LEVEL_GREAT)
+ add_event(null, "area_beauty", /datum/mood_event/goodroom)
+ if(BEAUTY_LEVEL_GREAT to INFINITY)
+ add_event(null, "area_beauty", /datum/mood_event/greatroom)
+
///Called when parent is ahealed.
/datum/component/mood/proc/on_revive(datum/source, full_heal)
if(!full_heal)
diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm
index e1e8c29871d..f355ab3cf6e 100644
--- a/code/datums/materials/_material.dm
+++ b/code/datums/materials/_material.dm
@@ -26,6 +26,8 @@ Simple datum which is instanced once per type and is used for every object of sa
var/value_per_unit = 0
///Armor modifiers, multiplies an items normal armor vars by these amounts.
var/armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1)
+ ///How beautiful is this material per unit?
+ var/beauty_modifier = 0
///This proc is called when the material is added to an object.
/datum/material/proc/on_applied(atom/source, amount, material_flags)
@@ -38,6 +40,9 @@ Simple datum which is instanced once per type and is used for every object of sa
if(material_flags & MATERIAL_ADD_PREFIX)
source.name = "[name] [source.name]"
+ if(beauty_modifier)
+ addtimer(CALLBACK(source, /datum.proc/AddComponent, /datum/component/beauty, beauty_modifier * amount), 0)
+
if(istype(source, /obj)) //objs
on_applied_obj(source, amount, material_flags)
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index 55d3760cf5e..70e4245b8ef 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -18,7 +18,8 @@
categories = list(MAT_CATEGORY_RIGID = TRUE)
integrity_modifier = 0.1
sheet_type = /obj/item/stack/sheet/glass
- value_per_unit = 0.0025
+ value_per_unit = 0.001
+ beauty_modifier = 0.05
armor_modifiers = list("melee" = 0.2, "bullet" = 0.2, "laser" = 0, "energy" = 1, "bomb" = 0, "bio" = 0.2, "rad" = 0.2, "fire" = 1, "acid" = 0.2) // yeah ok retard
///Has no special properties. Could be good against vampires in the future perhaps.
@@ -29,7 +30,8 @@
color = "#bdbebf"
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/silver
- value_per_unit = 0.025
+ value_per_unit = 0.25
+ beauty_modifier = 0.075
///Slight force increase
/datum/material/gold
@@ -41,6 +43,7 @@
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/gold
value_per_unit = 0.0625
+ beauty_modifier = 0.15
armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 1.15, "energy" = 1.15, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1.1)
///Has no special properties
@@ -52,6 +55,7 @@
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/diamond
value_per_unit = 0.25
+ beauty_modifier = 0.3
armor_modifiers = list("melee" = 1.3, "bullet" = 1.3, "laser" = 0.6, "energy" = 1, "bomb" = 1.2, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1)
///Is slightly radioactive
@@ -63,6 +67,7 @@
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/uranium
value_per_unit = 0.05
+ beauty_modifier = 0.3 //It shines so beautiful
armor_modifiers = list("melee" = 1.5, "bullet" = 1.4, "laser" = 0.5, "energy" = 0.5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 1, "acid" = 1)
/datum/material/uranium/on_applied(atom/source, amount, material_flags)
@@ -83,6 +88,7 @@
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/plasma
value_per_unit = 0.1
+ beauty_modifier = 0.15
armor_modifiers = list("melee" = 1.4, "bullet" = 0.7, "laser" = 0, "energy" = 1.2, "bomb" = 0, "bio" = 1.2, "rad" = 1, "fire" = 0, "acid" = 0.5)
/datum/material/plasma/on_applied(atom/source, amount, material_flags)
@@ -103,6 +109,7 @@
desc = "Crystals with bluespace properties"
color = "#506bc7"
categories = list(MAT_CATEGORY_ORE = TRUE)
+ beauty_modifier = 0.5
sheet_type = /obj/item/stack/sheet/bluespace_crystal
value_per_unit = 0.15
@@ -115,6 +122,7 @@
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/bananium
value_per_unit = 0.5
+ beauty_modifier = 0.5
armor_modifiers = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 0) //Clowns cant be blown away.
/datum/material/bananium/on_applied(atom/source, amount, material_flags)
@@ -139,6 +147,7 @@
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/titanium
value_per_unit = 0.0625
+ beauty_modifier = 0.05
armor_modifiers = list("melee" = 1.35, "bullet" = 1.3, "laser" = 1.3, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1)
/datum/material/runite
@@ -150,6 +159,7 @@
categories = list(MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/runite
value_per_unit = 0.3
+ beauty_modifier = 0.5
armor_modifiers = list("melee" = 1.35, "bullet" = 2, "laser" = 0.5, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 1.4, "acid" = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle.
///Force decrease
@@ -161,6 +171,7 @@
strength_modifier = 0.85
sheet_type = /obj/item/stack/sheet/plastic
value_per_unit = 0.0125
+ beauty_modifier = -0.01
armor_modifiers = list("melee" = 1.5, "bullet" = 1.1, "laser" = 0.3, "energy" = 0.5, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1.1, "acid" = 1)
///Force decrease and mushy sound effect. (Not yet implemented)
@@ -182,6 +193,7 @@
categories = list(MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/adamantine
value_per_unit = 0.25
+ beauty_modifier = 0.4
armor_modifiers = list("melee" = 1.5, "bullet" = 1.5, "laser" = 1.3, "energy" = 1.3, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 2.5, "acid" = 1)
///RPG Magic. (Admin only)
@@ -193,6 +205,7 @@
categories = list(MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/mythril
value_per_unit = 0.75
+ beauty_modifier = 0.5
armor_modifiers = list("melee" = 2, "bullet" = 2, "laser" = 2, "energy" = 2, "bomb" = 2, "bio" = 2, "rad" = 2, "fire" = 2, "acid" = 2)
/datum/material/mythril/on_applied_obj(atom/source, amount, material_flags)
diff --git a/code/datums/mood_events/beauty_events.dm b/code/datums/mood_events/beauty_events.dm
new file mode 100644
index 00000000000..47c31811290
--- /dev/null
+++ b/code/datums/mood_events/beauty_events.dm
@@ -0,0 +1,19 @@
+/datum/mood_event/horridroom
+ description = "This room looks terrible!\n"
+ mood_change = -5
+
+/datum/mood_event/badroom
+ description = "This room looks really bad.\n"
+ mood_change = -3
+
+/datum/mood_event/decentroom
+ description = "This room looks alright.\n"
+ mood_change = 1
+
+/datum/mood_event/goodroom
+ description = "This room looks really pretty!\n"
+ mood_change = 3
+
+/datum/mood_event/greatroom
+ description = "This room is beautiful!\n"
+ mood_change = 5
diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm
index 014b18448c7..1f38a7d9cf6 100644
--- a/code/datums/traits/neutral.dm
+++ b/code/datums/traits/neutral.dm
@@ -33,6 +33,15 @@
if(!initial(species.disliked_food) & MEAT)
species.disliked_food &= ~MEAT
+/datum/quirk/snob
+ name = "Snob"
+ desc = "You care about the finer things, if a room doesn't look nice its just not really worth it, is it?"
+ value = 0
+ gain_text = "You feel like you understand what things should look like."
+ lose_text = "Well who cares about deco anyways?"
+ medical_record_text = "Patient seems to be rather stuck up."
+ mob_trait = TRAIT_SNOB
+
/datum/quirk/pineapple_liker
name = "Ananas Affinity"
desc = "You find yourself greatly enjoying fruits of the ananas genus. You can't seem to ever get enough of their sweet goodness!"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 2dd73cde3fe..e53e16a2687 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -27,6 +27,10 @@
var/poweralm = TRUE
var/lightswitch = TRUE
+ var/totalbeauty = 0 //All beauty in this area combined, only includes indoor area.
+ var/beauty = 0 // Beauty average per open turf in the area
+ var/beauty_threshold = 150 //If a room is too big it doesn't have beauty.
+
var/requires_power = TRUE
var/always_unpowered = FALSE // This gets overridden to 1 for space in area/Initialize().
@@ -167,6 +171,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
*/
/area/LateInitialize()
power_change() // all machines set to current power level, also updates icon
+ update_beauty()
/**
* Register this area as belonging to a z level
@@ -596,6 +601,17 @@ GLOBAL_LIST_EMPTY(teleportlocs)
L.client.played = TRUE
addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600)
+///Divides total beauty in the room by roomsize to allow us to get an average beauty per tile.
+/area/proc/update_beauty()
+ if(!areasize)
+ beauty = 0
+ return FALSE
+ if(areasize >= beauty_threshold)
+ beauty = 0
+ return FALSE //Too big
+ beauty = totalbeauty / areasize
+
+
/**
* Called when an atom exits an area
*
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index 9225f331674..706599a3152 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -66,6 +66,8 @@
original_name = name // can't use initial because of random posters
name = "poster - [name]"
desc = "A large piece of space-resistant printed paper. [desc]"
+
+ addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 300), 0)
/obj/structure/sign/poster/proc/randomise(base_type)
var/list/poster_types = subtypesof(base_type)
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index d4263dbd1c4..64f3eb4c08a 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -5,6 +5,7 @@
var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA
var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints
var/mergeable_decal = TRUE //when two of these are on a same tile or do we need to merge them into just one?
+ var/beauty = 0
/obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases)
. = ..()
@@ -25,6 +26,8 @@
if(LAZYLEN(diseases_to_add))
AddComponent(/datum/component/infective, diseases_to_add)
+ addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, beauty), 0)
+
var/turf/T = get_turf(src)
if(T && is_station_level(T.z))
SSblackbox.record_feedback("tally", "station_mess_created", 1, name)
diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm
index 0bf4387063d..3e36332aa87 100644
--- a/code/game/objects/effects/decals/cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/cleanable/aliens.dm
@@ -8,6 +8,7 @@
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
bloodiness = BLOOD_AMOUNT_PER_DECAL
blood_state = BLOOD_STATE_XENO
+ beauty = -250
/obj/effect/decal/cleanable/xenoblood/Initialize()
. = ..()
diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm
index b0154535d14..dfb5a1d552e 100644
--- a/code/game/objects/effects/decals/cleanable/food.dm
+++ b/code/game/objects/effects/decals/cleanable/food.dm
@@ -2,6 +2,7 @@
/obj/effect/decal/cleanable/food
icon = 'icons/effects/tomatodecal.dmi'
gender = NEUTER
+ beauty = -100
/obj/effect/decal/cleanable/food/tomato_smudge
name = "tomato smudge"
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 25e5579655e..c82f7c8f73d 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -6,6 +6,7 @@
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
blood_state = BLOOD_STATE_HUMAN
bloodiness = BLOOD_AMOUNT_PER_DECAL
+ beauty = -100
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
C.add_blood_DNA(return_blood_DNA())
@@ -34,11 +35,13 @@
desc = "They look like tracks left by wheels."
icon_state = "tracks"
random_icon_states = null
+ beauty = -50
/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose
name = "blood"
icon = 'icons/effects/blood.dmi'
desc = "Your instincts say you shouldn't be following these."
+ beauty = -50
var/list/existing_dirs = list()
/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in()
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index ef4436c4d5b..96baf3f8fbe 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -3,6 +3,7 @@
desc = "Someone should clean that up."
icon = 'icons/obj/objects.dmi'
icon_state = "shards"
+ beauty = -50
/obj/effect/decal/cleanable/ash
name = "ashes"
@@ -10,6 +11,7 @@
icon = 'icons/obj/objects.dmi'
icon_state = "ash"
mergeable_decal = FALSE
+ beauty = -50
/obj/effect/decal/cleanable/ash/Initialize()
. = ..()
@@ -24,6 +26,7 @@
/obj/effect/decal/cleanable/ash/large
name = "large pile of ashes"
icon_state = "big_ash"
+ beauty = -100
/obj/effect/decal/cleanable/ash/large/Initialize()
. = ..()
@@ -34,6 +37,7 @@
desc = "Back to sand."
icon = 'icons/obj/shards.dmi'
icon_state = "tiny"
+ beauty = -100
/obj/effect/decal/cleanable/glass/Initialize()
. = ..()
@@ -52,6 +56,7 @@
canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall)
smooth = SMOOTH_FALSE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ beauty = -75
/obj/effect/decal/cleanable/dirt/Initialize()
. = ..()
@@ -78,6 +83,7 @@
light_power = 3
light_range = 2
light_color = LIGHT_COLOR_GREEN
+ beauty = -300
/obj/effect/decal/cleanable/greenglow/ex_act()
return
@@ -93,6 +99,7 @@
layer = WALL_OBJ_LAYER
icon_state = "cobweb1"
resistance_flags = FLAMMABLE
+ beauty = -100
/obj/effect/decal/cleanable/cobweb/cobweb2
icon_state = "cobweb2"
@@ -104,10 +111,12 @@
icon = 'icons/effects/effects.dmi'
icon_state = "molten"
mergeable_decal = FALSE
+ beauty = -150
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
icon_state = "big_molten"
+ beauty = -300
//Vomit (sorry)
/obj/effect/decal/cleanable/vomit
@@ -116,6 +125,7 @@
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
+ beauty = -150
/obj/effect/decal/cleanable/vomit/attack_hand(mob/user)
. = ..()
diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
index 63d64150971..ca7cdaf90c7 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -10,6 +10,7 @@
blood_state = BLOOD_STATE_OIL
bloodiness = BLOOD_AMOUNT_PER_DECAL
mergeable_decal = FALSE
+ beauty = -50
/obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions)
set waitfor = 0
@@ -49,6 +50,7 @@
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
blood_state = BLOOD_STATE_OIL
bloodiness = BLOOD_AMOUNT_PER_DECAL
+ beauty = -100
/obj/effect/decal/cleanable/oil/Initialize()
. = ..()
@@ -74,6 +76,7 @@
/obj/effect/decal/cleanable/oil/streak
icon_state = "streak1"
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
+ beauty = -50
/obj/effect/decal/cleanable/oil/slippery/ComponentInitialize()
. = ..()
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 944b1634156..733e518ee09 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -473,6 +473,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/statuebust/Initialize()
. = ..()
AddComponent(/datum/component/art, impressiveness)
+ addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 1000), 0)
/obj/item/statuebust/hippocratic
name = "hippocrates bust"
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index ed109a08bf4..547a6de518c 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -317,6 +317,7 @@
/obj/item/twohanded/required/kirbyplants/Initialize()
. = ..()
AddComponent(/datum/component/tactical)
+ addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 500), 0)
/obj/item/twohanded/required/kirbyplants/random
icon = 'icons/obj/flora/_flora.dmi'
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index df8203bcab7..6ce62d69b45 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -15,6 +15,7 @@
/obj/structure/statue/Initialize()
. = ..()
AddComponent(art_type, impressiveness)
+ addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, impressiveness * 75), 0)
/obj/structure/statue/attackby(obj/item/W, mob/living/user, params)
add_fingerprint(user)
@@ -298,4 +299,4 @@
name = "\improper Karl Marx bust"
desc = "A bust depicting a certain 19th century economist. You get the feeling a specter is haunting the station."
icon_state = "marx"
- art_type = /datum/component/art/rev
\ No newline at end of file
+ art_type = /datum/component/art/rev
diff --git a/tgstation.dme b/tgstation.dme
index 655fbe81973..68e58113754 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -354,6 +354,7 @@
#include "code\datums\components\armor_plate.dm"
#include "code\datums\components\art.dm"
#include "code\datums\components\bane.dm"
+#include "code\datums\components\beauty.dm"
#include "code\datums\components\beetlejuice.dm"
#include "code\datums\components\butchering.dm"
#include "code\datums\components\caltrop.dm"
@@ -517,6 +518,7 @@
#include "code\datums\materials\_material.dm"
#include "code\datums\materials\basemats.dm"
#include "code\datums\mood_events\_mood_event.dm"
+#include "code\datums\mood_events\beauty_events.dm"
#include "code\datums\mood_events\drink_events.dm"
#include "code\datums\mood_events\drug_events.dm"
#include "code\datums\mood_events\generic_negative_events.dm"