5140cff38c
Floyd / Qustinnus (Sprites by Ausops, Some moodlets by Ike709)
add: Adds mood, which can be found by clicking on the face icon on your screen.
add: Adds various moodlets which affect your mood. Try eating your favourite food, playing an arcade game, reading a book, or petting a doggo to increase your moo. Also be sure to take care of your hunger on a regular basis, like always.
add: Adds config option to disable/enable mood.
add: Indoor area's now have a beauty var defined by the amount of cleanables in them, (We can later expand this to something like rimworld, where structures could make rooms more beautiful). These also affect mood. (Janitor now has gameplay purpose besides slipping and removing useless decals)
remove: Removes hunger slowdown, replacing it with slowdown by being depressed
imageadd: Icons for mood states and depression states
What this PR is
This PR adds a system that allows player to gain and lose moodlets based on events occuring to, and around them. These events then give the player a mood value based on what it is. For example a hug could give you +1 mood, while being stabbed in the eye with a screwdriver can give -5 mood. All these moodlets together determine the mood of your character which currently affects the following things:
Movement speed - If you are very sad you move slower. Replacing movement slow from hunger. (hunger now instead affects mood)
Screen blur - If you are sad you gain an overlay that slightly blurs the screen, increasing in severity as you get sadder.
Interaction / do after speed - If you are sad or happy your interaction speed with things such as handcuffs is changed. with a 25% longer time if you are sad, or 10% shorter time if you are extremely happy.
Hunger rate - You gain hunger slower if you are very happy.
173 lines
6.4 KiB
Plaintext
173 lines
6.4 KiB
Plaintext
/* Clown Items
|
|
* Contains:
|
|
* Soap
|
|
* Bike Horns
|
|
* Air Horns
|
|
* Canned Laughter
|
|
*/
|
|
|
|
/*
|
|
* Soap
|
|
*/
|
|
|
|
/obj/item/soap
|
|
name = "soap"
|
|
desc = "A cheap bar of soap. Doesn't smell."
|
|
gender = PLURAL
|
|
icon = 'icons/obj/items_and_weapons.dmi'
|
|
icon_state = "soap"
|
|
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
|
|
w_class = WEIGHT_CLASS_TINY
|
|
flags_1 = NOBLUDGEON_1
|
|
throwforce = 0
|
|
throw_speed = 3
|
|
throw_range = 7
|
|
grind_results = list("lye" = 10)
|
|
var/cleanspeed = 50 //slower than mop
|
|
force_string = "robust... against germs"
|
|
|
|
/obj/item/soap/Initialize()
|
|
. = ..()
|
|
AddComponent(/datum/component/slippery, 80)
|
|
|
|
/obj/item/soap/nanotrasen
|
|
desc = "A Nanotrasen brand bar of soap. Smells of plasma."
|
|
icon_state = "soapnt"
|
|
|
|
/obj/item/soap/homemade
|
|
desc = "A homemade bar of soap. Smells of... well...."
|
|
icon_state = "soapgibs"
|
|
cleanspeed = 45 // a little faster to reward chemists for going to the effort
|
|
|
|
/obj/item/soap/deluxe
|
|
desc = "A deluxe Waffle Co. brand bar of soap. Smells of high-class luxury."
|
|
icon_state = "soapdeluxe"
|
|
cleanspeed = 40 //same speed as mop because deluxe -- captain gets one of these
|
|
|
|
/obj/item/soap/syndie
|
|
desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster."
|
|
icon_state = "soapsyndie"
|
|
cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes
|
|
|
|
/obj/item/soap/suicide_act(mob/user)
|
|
user.say(";FFFFFFFFFFFFFFFFUUUUUUUDGE!!")
|
|
user.visible_message("<span class='suicide'>[user] lifts [src] to their mouth and gnaws on it furiously, producing a thick froth! [user.p_they(TRUE)]'ll never get that BB gun now!</span>")
|
|
new /obj/effect/particle_effect/foam(loc)
|
|
return (TOXLOSS)
|
|
|
|
/obj/item/soap/afterattack(atom/target, mob/user, proximity)
|
|
if(!proximity || !check_allowed_items(target))
|
|
return
|
|
//I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing.
|
|
//So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
|
|
target.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
|
|
if(user.client && ((target in user.client.screen) && !user.is_holding(target)))
|
|
to_chat(user, "<span class='warning'>You need to take that [target.name] off before cleaning it!</span>")
|
|
else if(istype(target, /obj/effect/decal/cleanable))
|
|
user.visible_message("[user] begins to scrub \the [target.name] out with [src].", "<span class='warning'>You begin to scrub \the [target.name] out with [src]...</span>")
|
|
if(do_after(user, src.cleanspeed, target = target))
|
|
to_chat(user, "<span class='notice'>You scrub \the [target.name] out.</span>")
|
|
qdel(target)
|
|
else if(ishuman(target) && user.zone_selected == "mouth")
|
|
var/mob/living/carbon/human/H = user
|
|
user.visible_message("<span class='warning'>\the [user] washes \the [target]'s mouth out with [src.name]!</span>", "<span class='notice'>You wash \the [target]'s mouth out with [src.name]!</span>") //washes mouth out with soap sounds better than 'the soap' here
|
|
H.lip_style = null //removes lipstick
|
|
H.update_body()
|
|
return
|
|
else if(istype(target, /obj/structure/window))
|
|
user.visible_message("[user] begins to clean \the [target.name] with [src]...", "<span class='notice'>You begin to clean \the [target.name] with [src]...</span>")
|
|
if(do_after(user, src.cleanspeed, target = target))
|
|
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
|
|
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
|
target.set_opacity(initial(target.opacity))
|
|
else
|
|
user.visible_message("[user] begins to clean \the [target.name] with [src]...", "<span class='notice'>You begin to clean \the [target.name] with [src]...</span>")
|
|
if(do_after(user, src.cleanspeed, target = target))
|
|
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
|
|
var/obj/effect/decal/cleanable/C = locate() in target
|
|
qdel(C)
|
|
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
|
target.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
|
target.wash_cream()
|
|
return
|
|
|
|
|
|
/*
|
|
* Bike Horns
|
|
*/
|
|
|
|
/obj/item/bikehorn
|
|
name = "bike horn"
|
|
desc = "A horn off of a bicycle."
|
|
icon = 'icons/obj/items_and_weapons.dmi'
|
|
icon_state = "bike_horn"
|
|
item_state = "bike_horn"
|
|
lefthand_file = 'icons/mob/inhands/equipment/horns_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/horns_righthand.dmi'
|
|
throwforce = 0
|
|
hitsound = null //To prevent tap.ogg playing, as the item lacks of force
|
|
w_class = WEIGHT_CLASS_TINY
|
|
throw_speed = 3
|
|
throw_range = 7
|
|
attack_verb = list("HONKED")
|
|
|
|
/obj/item/bikehorn/Initialize()
|
|
. = ..()
|
|
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50)
|
|
|
|
/obj/item/weapon/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user)
|
|
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
|
|
if(mood)
|
|
mood.add_event("honk", /datum/mood_event/honk)
|
|
|
|
/obj/item/bikehorn/suicide_act(mob/user)
|
|
user.visible_message("<span class='suicide'>[user] solemnly points the horn at [user.p_their()] temple! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
|
playsound(src, 'sound/items/bikehorn.ogg', 50, 1)
|
|
return (BRUTELOSS)
|
|
|
|
//air horn
|
|
/obj/item/bikehorn/airhorn
|
|
name = "air horn"
|
|
desc = "Damn son, where'd you find this?"
|
|
icon_state = "air_horn"
|
|
|
|
/obj/item/bikehorn/airhorn/Initialize()
|
|
. = ..()
|
|
AddComponent(/datum/component/squeak, list('sound/items/airhorn2.ogg'=1), 50)
|
|
|
|
//golden bikehorn
|
|
/obj/item/bikehorn/golden
|
|
name = "golden bike horn"
|
|
desc = "Golden? Clearly, it's made with bananium! Honk!"
|
|
icon_state = "gold_horn"
|
|
item_state = "gold_horn"
|
|
var/flip_cooldown = 0
|
|
|
|
/obj/item/bikehorn/golden/attack()
|
|
if(flip_cooldown < world.time)
|
|
flip_mobs()
|
|
return ..()
|
|
|
|
/obj/item/bikehorn/golden/attack_self(mob/user)
|
|
if(flip_cooldown < world.time)
|
|
flip_mobs()
|
|
..()
|
|
|
|
/obj/item/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user)
|
|
var/turf/T = get_turf(src)
|
|
for(M in ohearers(7, T))
|
|
if(ishuman(M) && M.can_hear())
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
|
|
continue
|
|
M.emote("flip")
|
|
flip_cooldown = world.time + 7
|
|
|
|
//canned laughter
|
|
/obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter
|
|
name = "Canned Laughter"
|
|
desc = "Just looking at this makes you want to giggle."
|
|
icon_state = "laughter"
|
|
list_reagents = list("laughter" = 50)
|