more work

This commit is contained in:
Metis
2024-09-13 01:50:58 -04:00
parent 8fd779ef02
commit 7b0780804f
320 changed files with 12185 additions and 161 deletions

View File

@@ -0,0 +1,67 @@
//Small Sprite for borgs --Cyanosis
//Basically the same as /small_sprite, but i'm screaming for modularization
/datum/action/cyborg_small_sprite
name = "Toggle Giant Sprite"
desc = "Others will continue to see you giant."
icon_icon = 'icons/obj/plushes.dmi'
button_icon_state = "securityk9"
background_icon_state = "bg_default_on" //looks techy enough
var/designated_module as text
var/small = FALSE
var/small_icon = null
var/small_icon_state = null
var/image/icon_image
var/i_am_wide = FALSE //transform stuff so we appear in the middle of a tile instead of between two WHEN PLUSHIE
/datum/action/cyborg_small_sprite/k9 //turns you into a marketable plushie
designated_module = "Security K-9 Unit"
small_icon = 'icons/obj/plushes.dmi'
small_icon_state = "securityk9"
i_am_wide = TRUE
/datum/action/cyborg_small_sprite/medihound
designated_module = "MediHound"
small_icon = 'icons/obj/plushes.dmi'
small_icon_state = "medihound"
i_am_wide = TRUE
/datum/action/cyborg_small_sprite/scrubpup
designated_module = "Scrub Pup"
small_icon = 'icons/obj/plushes.dmi'
small_icon_state = "scrubpuppy"
i_am_wide = TRUE
/datum/action/cyborg_small_sprite/Grant(mob/M)
..()
if(!owner)
return
update_image()
RegisterSignal(owner, COMSIG_CYBORG_MODULE_CHANGE,PROC_REF(update_image))
/datum/action/cyborg_small_sprite/Remove(mob/M)
UnregisterSignal(owner, COMSIG_CYBORG_MODULE_CHANGE)
..()
/datum/action/cyborg_small_sprite/Trigger()
if(!icon_image)
update_image()
if(!small)
owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "cyborg_smallsprite", icon_image)
else
owner.remove_alt_appearance("cyborg_smallsprite")
small = !small
return TRUE
/datum/action/cyborg_small_sprite/proc/update_image()
var/image/I
if(small_icon && small_icon_state)
I = image(icon=small_icon,icon_state=small_icon_state,loc=owner,layer=owner.layer,pixel_x=owner.pixel_x,pixel_y=owner.pixel_y)
else
I = image(icon=owner.icon,icon_state=owner.icon_state,loc=owner,layer=owner.layer,pixel_x=owner.pixel_x,pixel_y=owner.pixel_y)
I.overlays = owner.overlays
var/matrix/M = matrix() //I don't understand why, I don't want to know why, but this matrix is needed
M.Scale(0.5) //If you ever change the borg's size, be sure to change this too
M.Translate(8*i_am_wide, -8) //x position is for WIDE borgs. If they're not wide, this doesn't matter
I.transform = M //also why do images have transforms
I.override = TRUE
icon_image = I

View File

@@ -0,0 +1,105 @@
//Jay Sparrow
//The base for this datum is found in reagent.dm
/datum/bounty/lewd
var/required_volume = 10
var/shipped_volume = 0
var/datum/reagent/wanted_reagent
/datum/bounty/lewd/completion_string()
return {"[round(shipped_volume)]/[required_volume] Units"}
/datum/bounty/lewd/can_claim()
return ..() && shipped_volume >= required_volume
/datum/bounty/lewd/applies_to(obj/O)
if(!istype(O, /obj/item/reagent_containers))
return FALSE
if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type))
return FALSE
if(O.flags_1 & HOLOGRAM_1)
return FALSE
return shipped_volume < required_volume
/datum/bounty/lewd/ship(obj/O)
if(!applies_to(O))
return
shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type)
if(shipped_volume > required_volume)
shipped_volume = required_volume
/datum/bounty/lewd/compatible_with(other_bounty)
return TRUE //Not a lot of different reagents right now, so no sense in closing these off.
/datum/bounty/lewd/fluid
name = "Discretionary Bounty"
reward = 1500
datum/bounty/lewd/fluid/New() //GS13 made some edits here that changes stuff into fatty-related junk
var/reagent_type
switch(rand(1, 20)) //So we can set probabilities for each kind
if(1,2,3,4,5)//Nutriment bounty
required_volume = 200
reagent_type = /datum/reagent/consumable/nutriment
wanted_reagent = new reagent_type
name = wanted_reagent.name
description = "CentCom's food lab requires more nutriment to experiment with."
reward += rand(2, 7) * 500
if(6,7) //Big nutriment bounty
required_volume = 1000
reagent_type = /datum/reagent/consumable/nutriment
wanted_reagent = new reagent_type
name = wanted_reagent.name
description = "CentCom's food lab have requested vast amounts of nutriment for undisclosed purposes."
reward += rand(10, 17) * 500
if(8,9,10,11,12) //Milk
required_volume = 200
reagent_type = /datum/reagent/consumable/milk
wanted_reagent = new reagent_type
name = wanted_reagent.name
description = "CentCom's kitchen is low on dairy, and this station always seems to have plenty for some reason. Mind sending us some?"
reward += rand(2, 7) * 500
if(13,14) //Mega Milk
required_volume = 1000
reagent_type = /datum/reagent/consumable/milk
wanted_reagent = new reagent_type
name = wanted_reagent.name
description = "The GATO annual bake sale is soon, and all of our milk has expired. Help us out."
reward += rand(10, 17) * 500 //Milk is generally easier to get. Make the reward a little lower.
if(15,16) //A little romance
var/static/list/possible_reagents = list(\
/datum/reagent/drug/aphrodisiac,\
/datum/reagent/consumable/ethanol/between_the_sheets,\
/datum/reagent/drug/aphrodisiacplus,\
/datum/reagent/lube)
required_volume = 30
reagent_type = pick(possible_reagents)
wanted_reagent = new reagent_type
name = wanted_reagent.name
description = "A CentCom official wants something to spice up the bedroom. We told them this was a misuse of their power. It went through anyways."
reward += rand(0, 5) * 500
if(17,18,19,20) //Not as popular of a fluid, so we will leave it the lowest chance.
required_volume = 50
reagent_type = /datum/reagent/consumable/lipoifier
wanted_reagent = new reagent_type
name = wanted_reagent.name
description = "The quality of GATO's meat-related products have diminished. Send us some lipoifier to help with meat production."
reward += rand(2, 7) * 500
/* //Just not getting this to work.
//Freeform sales
/datum/export/lewd/reagent_container
cost = 0 //Base cost of canister. We only care about what's inside.
unit_name = "Fluid Container"
export_types = list(/obj/item/reagent_containers/)
/datum/export/lewd/reagent_containers/get_cost(obj/O)
var/obj/item/reagent_containers/C = O
var/worth = 0
var/fluids = C.reagents.reagent_list
worth += fluids[/datum/reagent/consumable/semen]*2
worth += fluids[/datum/reagent/consumable/milk]*2
worth += fluids[/datum/reagent/consumable/femcum]*5
return worth
*/

View File

@@ -0,0 +1,46 @@
/datum/crafting_recipe/milking_machine
name = "Milking Machine"
reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 2, /obj/item/stack/sheet/cardboard = 1, /obj/item/reagent_containers/glass/beaker = 2, /obj/item/stock_parts/manipulator = 1)
result = /obj/item/milking_machine
tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
category = CAT_MISC
/datum/crafting_recipe/milking_machine/penis
name = "Penis Milking Machine"
reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 1, /obj/item/stack/sheet/cardboard = 1, /obj/item/reagent_containers/glass/beaker/large = 1, /obj/item/stock_parts/manipulator = 1)
result = /obj/item/milking_machine/penis
//to do: put carpentry in it's own crafting tab
/datum/crafting_recipe/weak_metal
name = "Heated Metal"
reqs = list(/obj/item/stack/sheet/metal = 5)
tools = list(TOOL_WELDER)
category = CAT_CARPENTRY
result = /obj/item/processed/metal
/datum/crafting_recipe/processed_wood
name = "Processable Wood"
reqs = list(/obj/item/stack/sheet/mineral/wood = 5)
tools = list(TOOL_WIRECUTTER, TOOL_WELDER)
category = CAT_CARPENTRY
result = /obj/item/processed/wood/plank
/datum/crafting_recipe/stool_base
name = "Stool Base"
reqs = list(/obj/item/processed/wood/seat = 1, /obj/item/processed/wood/gluepeg = 4)
category = CAT_CARPENTRY
result = /obj/item/processed/wood/stool1
/datum/crafting_recipe/clothcushion
name = "Cloth Cushion"
reqs = list(/obj/item/stack/sheet/cloth = 2, /obj/item/stack/sheet/cotton = 5)
tools = list(TOOL_WIRECUTTER)
category = CAT_CARPENTRY
result = /obj/item/cushion
/datum/crafting_recipe/silkcushion
name = "Silk Cushion"
reqs = list(/obj/item/stack/sheet/silk = 2, /obj/item/stack/sheet/cotton = 5)
tools = list(TOOL_WIRECUTTER)
category = CAT_CARPENTRY
result = /obj/item/cushion/silk

View File

@@ -0,0 +1,191 @@
/datum/element/mob_holder/micro
/datum/element/mob_holder/micro/Attach(datum/target, _worn_state, _alt_worn, _right_hand, _left_hand, _inv_slots = NONE, _proctype)
. = ..()
if(!isliving(target))
return ELEMENT_INCOMPATIBLE
worn_state = _worn_state
alt_worn = _alt_worn
right_hand = _right_hand
left_hand = _left_hand
inv_slots = _inv_slots
proctype = _proctype
RegisterSignal(target, COMSIG_CLICK_ALT,PROC_REF(mob_try_pickup_micro), override = TRUE)
RegisterSignal(target, COMSIG_PARENT_EXAMINE,PROC_REF(on_examine), override = TRUE)
RegisterSignal(target, COMSIG_MICRO_PICKUP_FEET,PROC_REF(mob_pickup_micro_feet))
/datum/element/mob_holder/micro/Detach(datum/source, force)
. = ..()
UnregisterSignal(source, COMSIG_CLICK_ALT)
UnregisterSignal(source, COMSIG_PARENT_EXAMINE)
UnregisterSignal(source, COMSIG_MICRO_PICKUP_FEET)
/datum/element/mob_holder/micro/proc/mob_pickup_micro(mob/living/source, mob/user)
var/obj/item/clothing/head/mob_holder/micro/holder = new(get_turf(source), source, worn_state, alt_worn, right_hand, left_hand, inv_slots)
if(!holder)
return
user.put_in_hands(holder)
return
//shoehorned (get it?) and lazy way to do instant foot pickups cause haha funny.
/datum/element/mob_holder/micro/proc/mob_pickup_micro_feet(mob/living/source, mob/user)
var/obj/item/clothing/head/mob_holder/micro/holder = new(get_turf(source), source, worn_state, alt_worn, right_hand, left_hand, inv_slots)
if(!holder)
return
user.equip_to_slot(holder,ITEM_SLOT_SHOES)
return
/datum/element/mob_holder/micro/proc/mob_try_pickup_micro(mob/living/source, mob/user)
if(!ishuman(user) || !user.Adjacent(source) || user.incapacitated())
return FALSE
if(abs(user.get_effective_size()/source.get_effective_size()) < 2.0 )
to_chat(user, "<span class='warning'>They're too big to pick up!</span>")
return FALSE
if(user.get_active_held_item())
to_chat(user, "<span class='warning'>Your hands are full!</span>")
return FALSE
if(source.buckled)
to_chat(user, "<span class='warning'>[source] is buckled to something!</span>")
return FALSE
if(source == user)
to_chat(user, "<span class='warning'>You can't pick yourself up.</span>")
return FALSE
source.visible_message("<span class='warning'>[user] starts picking up [source].</span>", \
"<span class='userdanger'>[user] starts picking you up!</span>")
var/p = abs(source.get_effective_size()/user.get_effective_size() * 40) //Scale how fast the pickup will be depending on size difference
if(!do_after(user, p, target = source))
return FALSE
if(user.get_active_held_item()||source.buckled)
return FALSE
source.visible_message("<span class='warning'>[user] picks up [source]!</span>", \
"<span class='userdanger'>[user] picks you up!</span>")
to_chat(user, "<span class='notice'>You pick [source] up.</span>")
source.drop_all_held_items()
mob_pickup_micro(source, user)
return TRUE
/obj/item/clothing/head/mob_holder/micro
name = "micro"
desc = "Another person, small enough to fit in your hand."
icon = null
icon_state = ""
slot_flags = ITEM_SLOT_FEET | ITEM_SLOT_HEAD | ITEM_SLOT_ID | ITEM_SLOT_BACK | ITEM_SLOT_NECK
w_class = null //handled by their size
can_head = TRUE
/obj/item/clothing/head/mob_holder/micro/Initialize(mapload, mob/living/M, _worn_state, alt_worn, lh_icon, rh_icon, _can_head_override = FALSE)
. = ..()
if(M)
M.setDir(SOUTH)
held_mob = M
M.forceMove(src)
appearance = M.appearance
name = M.name
desc = M.desc
assimilate(M)
if(_can_head_override)
can_head = _can_head_override
if(alt_worn)
alternate_worn_icon = alt_worn
if(_worn_state)
item_state = _worn_state
icon_state = _worn_state
if(lh_icon)
lefthand_file = lh_icon
if(rh_icon)
righthand_file = rh_icon
/obj/item/clothing/head/mob_holder/micro/Destroy()
if(held_mob)
release()
return ..()
/obj/item/clothing/head/mob_holder/micro/dropped()
..()
if(isturf(loc))//don't release on soft-drops
release()
/obj/item/clothing/head/mob_holder/micro/relaymove(mob/user)
return
//TODO: add a timer to escape someone's grip dependant on size diff
/obj/item/clothing/head/mob_holder/micro/container_resist(mob/living/user)
if(user.incapacitated())
to_chat(user, "<span class='warning'>You can't escape while you're restrained like this!</span>")
return
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
var/mob/living/L = loc
visible_message("<span class='warning'>[src] begins to squirm in [L]'s grasp!</span>")
if(!do_after(user, 100, target = src))
to_chat(loc, "<span class='warning'>[src] stops resisting.</span>")
return
visible_message("<span class='warning'>[src] escapes [L]!")
release()
/obj/item/clothing/head/mob_holder/micro/assume_air(datum/gas_mixture/env)
var/atom/location = loc
if(!loc)
return //null
var/turf/T = get_turf(loc)
while(location != T)
location = location.loc
if(ismob(location))
return location.loc.assume_air(env)
return location.assume_air(env)
/obj/item/clothing/head/mob_holder/micro/remove_air(amount)
var/atom/location = loc
if(!loc)
return //null
var/turf/T = get_turf(loc)
while(location != T)
location = location.loc
if(ismob(location))
return location.loc.remove_air(amount)
return location.remove_air(amount)
/obj/item/clothing/head/mob_holder/micro/examine(var/mob/user)
for(var/mob/living/M in contents)
M.examine(user)
/obj/item/clothing/head/mob_holder/micro/MouseDrop(mob/M as mob)
..()
if(M != usr) return
if(usr == src) return
if(!Adjacent(usr)) return
if(istype(M,/mob/living/silicon/ai)) return
for(var/mob/living/carbon/human/O in contents)
O.show_inv(usr)
/obj/item/clothing/head/mob_holder/micro/attack_self(var/mob/living/user)
if(cooldown < world.time)
for(var/mob/living/carbon/human/M in contents)
cooldown = world.time + 15
if(user.a_intent == "harm") //TO:DO, rework all of these interactions to be a lot more in depth
visible_message("<span class='danger'> [user] slams their fist down on [M]!</span>")
playsound(loc, 'sound/weapons/punch1.ogg', 50, 1)
M.adjustBruteLoss(5)
return
if(user.a_intent == "disarm")
visible_message("<span class='danger'> [user] pins [M] down with a finger!</span>")
playsound(loc, 'sound/effects/bodyfall1.ogg', 50, 1)
M.adjustStaminaLoss(10)
return
if(user.a_intent == "grab")
visible_message("<span class='danger'> [user] squeezes their fist around [M]!</span>")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
M.adjustOxyLoss(5)
return
M.help_shake_act(user)
/obj/item/clothing/head/mob_holder/micro/attacked_by(obj/item/I, mob/living/user)
for(var/mob/living/carbon/human/M in contents)
M.attacked_by(I, user)

View File

@@ -0,0 +1,96 @@
//This file contains everything to spawn ERT for cleaning up a nuclear reactor meltdown, if those things could actually explode
//ERT
/datum/ert/cleanup
rename_team = "Emergency Cleanup Crew"
code = "Blue" //CC probably wouldn't know if it was sabotage or not, but nuclear waste is a hazard to personnel
mission = "Remove all nuclear residue from X station"
enforce_human = FALSE
opendoors = FALSE
polldesc = "a Sanitation Expert in nuclear waste"
teamsize = 3 //2 is not enough for such a big area, 4 is too much
leader_role = /datum/antagonist/ert/cleanup
roles = list(/datum/antagonist/ert/cleanup)
/datum/ert/cleanup/New()
mission = "Remove all nuclear waste on [station_name()]."
//Antag mind & team (for objectives on what to do)
/datum/antagonist/ert/cleanup
name = "Nuclear Waste Expert"
role = "Nuclear Waste Expert"
ert_team = /datum/team/ert/cleanup
outfit = /datum/outfit/ert/cleanup
/datum/antagonist/ert/cleanup/greet()
//\an [name] because modularization is nice
to_chat(owner, "You are \an [name].\n\
Your job is to remove all nuclear waste and residue contaminants from [station_name()], \
under orders of GATO's Crew Health and Safety Division, as formerly as possible.\n\
You are not required to repair any construction damages, as you are not equipped for such.")
/datum/team/ert/cleanup
mission = "Remove all nuclear waste aboard the station."
objectives = list("Remove all nuclear waste aboard the station.")
//Outfit
/datum/outfit/ert/cleanup
name = "Emergency Cleanup Technician"
id = /obj/item/card/id/ert/Engineer/cleanup
uniform = /obj/item/clothing/under/rank/chief_engineer
suit = /obj/item/clothing/suit/space/hardsuit/rd/hev/no_sound/nuclear_sanitation
glasses = /obj/item/clothing/glasses/meson/engine
back = /obj/item/storage/backpack/industrial
gloves = /obj/item/clothing/gloves/color/yellow/nuclear_sanitation
shoes = /obj/item/clothing/shoes/jackboots/nuclear_sanitation
suit_store = /obj/item/tank/internals/emergency_oxygen/engi
belt = /obj/item/gun/energy/e_gun/advtaser
backpack_contents = list(/obj/item/storage/firstaid/radbgone=2,
/obj/item/storage/firstaid/toxin=1,
/obj/item/jawsoflife=1,
/obj/item/shovel=1,
/obj/item/geiger_counter=1)
/datum/outfit/ert/cleanup/New()
if(prob(30))
l_hand = /obj/item/inducer/sci/combat //A whole engine gets destroyed, so add a nice inducer to help charge areas back up
. = ..()
//Clothes
/obj/item/radio/headset/headset_cent/cleanup
icon_state = "rob_headset" //cause it looks fancy
keyslot = new /obj/item/encryptionkey/headset_eng
/obj/item/card/id/ert/Engineer/cleanup
registered_name = "Waste Expert"
assignment = "Emergency Cleanup Technician"
/obj/item/card/id/ert/Engineer/cleanup/Initialize(mapload)
access = get_ert_access("eng")+get_region_accesses(1)+get_region_accesses(5)+get_region_accesses(7) //CC eng, general, engineering, and command
/obj/item/clothing/gloves/color/yellow/nuclear_sanitation
name = "thick gloves"
desc = "A pair of yellow gloves. They help protect from radiation."
siemens_coefficient = 0.85
permeability_coefficient = 0.7
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 20, "rad" = 100, "fire" = 0, "acid" = 50)
item_color = "chief"
/obj/item/clothing/shoes/jackboots/nuclear_sanitation
desc = "A pair of jackboots, sewn with special material to help protect from radiation."
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 5, "bomb" = 5, "bio" = 0, "rad" = 100, "fire" = 10, "acid" = 70)
item_color = "chief"
/obj/item/clothing/suit/space/hardsuit/rd/hev/no_sound/nuclear_sanitation
name = "improved radiation suit"
desc = "A radiation suit that's been manufactured for being a hardsuit. It provides complete protection from radiation and bio contaminants."
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd/hev/no_scanner/nuclear_sanitation
slowdown = 0.7 //removes 30% of the slowness. This is actually a considerable amount
/obj/item/clothing/head/helmet/space/hardsuit/rd/hev/no_scanner/nuclear_sanitation
name = "improved radiation hood"
desc = "It protects from radiation and bio contaminants."

View File

@@ -0,0 +1,29 @@
/datum/mood_event/heatneed
description = "<span class='warning'>I need someone to satisfy me, my heat is driving me crazy.</span>\n"
mood_change = -3
timeout = 2 MINUTES
/datum/mood_event/heat
description = "<span class='userlove'>I have satisfied my heat, and I'm filled with happiness!</span>\n"
mood_change = 3
timeout = 5 MINUTES
/datum/mood_event/kiss
description = "<span class='nicegreen'>Someone kissed me, I feel happy!</span>\n"
mood_change = 2
timeout = 3 MINUTES
/datum/mood_event/deathsaw
description = "<span class='boldwarning'>I saw someone die!</span>\n"
mood_change = -5
timeout = 20 MINUTES //May be fine tuned in the future.
/datum/mood_event/healsbadman
description = "<span class='warning'>I feel like I'm held together by flimsy string, and could fall apart at any moment!</span>\n"
mood_change = -4
timeout = 2 MINUTES
/datum/mood_event/copium
description = "<span class='nicegreen'>Things are going to be okay, right?</span>\n"
mood_change = 3
timeout = 3 MINUTES

View File

@@ -0,0 +1,8 @@
/datum/map_template/ruin/lavaland/duohermit
name = "Makeshift Big Shelter"
id = "duohermitcave"
description = "A place of shelter for a couple of stranded hermits, scraping by to live another day."
suffix = "lavaland_surface_duohermit.dmm"
allow_duplicates = FALSE
never_spawn_with = list(/datum/map_template/ruin/lavaland/hermit)
cost = 5

View File

@@ -0,0 +1,63 @@
/datum/quirk/narsianspeaker
name = "Nar-Sian speaker"
desc = "Obsessed with forbidden knowledge regarding the blood cult, you've learned how to speak their ancient language."
value = 1
category = CATEGORY_LANGUAGES
gain_text = "<span class='notice'>Your mind feels sensitive to the slurred, ancient language of Nar'Sian cultists.</span>"
lose_text = "<span class='notice'>You forget how to speak Nar'Sian!</span>"
/datum/quirk/narsianspeaker/add()
var/mob/living/M = quirk_holder
M.grant_language(/datum/language/narsie)
/datum/quirk/narsianspeaker/remove()
if(quirk_holder)
quirk_holder.remove_language(/datum/language/ratvar)
/datum/quirk/ratvarianspeaker
name = "Ratvarian speaker"
desc = "Obsessed with the inner workings of the clock cult, you've learned how to speak their language."
value = 1
category = CATEGORY_LANGUAGES
gain_text = "<span class='notice'>Your mind feels sensitive to the ancient language of Ratvarian cultists.</span>"
lose_text = "<span class='notice'>You forget how to speak Ratvarian!</span>"
/datum/quirk/ratvarianspeaker/add()
var/mob/living/M = quirk_holder
M.grant_language(/datum/language/ratvar)
/datum/quirk/ratvarianspeaker/remove()
if(quirk_holder)
quirk_holder.remove_language(/datum/language/ratvar)
/datum/quirk/encodedspeaker
name = "Encoded Audio speaker"
desc = "You've been augmented with language encoders, allowing you to understand encoded audio."
value = 1
category = CATEGORY_LANGUAGES
gain_text = "<span class='notice'>Your mouth feels a little weird for a moment as your language encoder kicks in.</span>"
lose_text = "<span class='notice'>You feel your encoded audio chip malfunction. You can no longer speak or understand the language of fax machines.</span>"
/datum/quirk/encodedspeaker/add()
var/mob/living/M = quirk_holder
M.grant_language(/datum/language/machine)
/datum/quirk/encodedspeaker/remove()
if(quirk_holder)
quirk_holder.remove_language(/datum/language/ratvar)
/datum/quirk/xenospeaker
name = "Xenocommon speaker"
desc = "Through time observing and interacting with xenos and xeno hybrids, you've learned the intricate hissing patterns of their language."
value = 1
category = CATEGORY_LANGUAGES
gain_text = "<span class='notice'>You feel that you are now able to hiss in the same way xenomorphs do.</span>"
lose_text = "<span class='notice'>You seem to no longer know how to speak xenocommon.</span>"
/datum/quirk/xenospeaker/add()
var/mob/living/M = quirk_holder
M.grant_language(/datum/language/xenocommon)
/datum/quirk/xenospeaker/remove()
if(quirk_holder)
quirk_holder.remove_language(/datum/language/ratvar)

View File

@@ -0,0 +1,47 @@
//Skyrat port start
/datum/quirk/alcohol_lightweight
name = "Alcoholic Lightweight"
desc = "Alcohol really goes straight to your head, gotta be careful with what you drink."
value = 0
category = CATEGORY_ALCOHOL
mob_trait = TRAIT_ALCOHOL_LIGHTWEIGHT
gain_text = "<span class='notice'>You feel woozy thinking of alcohol.</span>"
lose_text = "<span class='notice'>You regain your stomach for drinks.</span>"
//Skyrat port stop
/datum/quirk/cursed_blood
name = "Cursed Blood"
desc = "Your lineage is cursed with the paleblood curse. Best to stay away from holy water... Hell water, on the other hand..."
value = 0
category = CATEGORY_GAMEPLAY
mob_trait = TRAIT_CURSED_BLOOD
gain_text = "<span class='notice'>A curse from a land where men return as beasts runs deep in your blood. Best to stay away from holy water... Hell water, on the other hand...</span>"
lose_text = "<span class='notice'>You feel the weight of the curse in your blood finally gone.</span>"
medical_record_text = "Patient suffers from an unknown type of aversion to holy reagents. Keep them away from a chaplain."
/datum/quirk/inheat
name = "In Heat"
desc = "Your system burns with the desire to be bred, your body will betray you and alert others' to your desire when examining you. Satisfying your lust will make you happy, but ignoring it may cause you to become sad and needy."
value = 0
category = CATEGORY_SEXUAL
mob_trait = TRAIT_HEAT
gain_text = "<span class='notice'>You body burns with the desire to be bred.</span>"
lose_text = "<span class='notice'>You feel more in control of your body and thoughts.</span>"
/datum/quirk/macrophile
name = "Macrophile"
desc = "You are attracted to larger people, and being stepped on by them."
value = 0
category = CATEGORY_SEXUAL
mob_trait = TRAIT_MACROPHILE
gain_text = "<span class='notice'>You feel attracted to people larger than you."
lose_text = "<span class='notice'>You feel less attracted to people larger than you."
/datum/quirk/microphile
name = "Microphile"
desc = "You are attracted to smaller people, and stepping on them."
value = 0
category = CATEGORY_SEXUAL
mob_trait = TRAIT_MICROPHILE
gain_text = "<span class='notice'>You feel attracted to people smaller than you."
lose_text = "<span class='notice'>You feel less attracted to people smaller than you."

View File

@@ -0,0 +1,93 @@
//GS13 Edit
/*
/datum/weather/oxygen_rain
name = "oxygen rain"
desc = "The weather of Layenia can be quite unpredictable. Given the natural low temperature of Layenia, the formation of natural croxygenic liquid gases is possible."
telegraph_duration = 300
telegraph_message = "<span class='boldwarning'>Oxygen clouds condense above and around the station...</span>"
telegraph_overlay = "rain_med"
weather_message = "<span class='userdanger'><i>Liquid oxygen pours down around you! It's freezing!</i></span>"
weather_overlay = "rain_high"
weather_duration_lower = 1200
weather_duration_upper = 4000
end_duration = 300
end_message = "<span class='boldannounce'>The downpour gradually slows to a light shower before fading away...</span>"
end_overlay = "rain_low"
area_type = /area/layenia
target_trait = ZTRAIT_STATION
immunity_type = "storm" // temp
probability = 2 //The chances of this happening are very low after all. We'll rarely see it, but it's worth it.
barometer_predictable = TRUE
var/datum/looping_sound/weak_outside_oxygenrain/sound_wo = new(list(), FALSE, TRUE)
var/datum/looping_sound/weak_inside_oxygenrain/sound_wi = new(list(), FALSE, TRUE)
/datum/weather/oxygen_rain/telegraph()
. = ..()
priority_announce("[station_name()]: A large quantity of condensed low temperature oxygen clouds has been detected around and above the station. A liquid oxygen downpour is expected.",
sound = 'sound/misc/notice2.ogg',
sender_override = "GATO Meteorology Division")
for(var/V in GLOB.player_list)
var/mob/M = V
if((M.client?.prefs?.toggles & SOUND_MIDI) && is_station_level(M.z))
M.playsound_local(M, 'hyperstation/sound/ambience/embrace.ogg', 40, FALSE, pressure_affected = FALSE)
/*
"Sappheiros - Embrace" is under a Creative Commons license (CC BY 3.0)
https://www.youtube.com/channel/UCxLKyBhC6igFhLEb0gxvQNg
Music promoted by BreakingCopyright: https://youtu.be/DzYp5uqixz0
*/
var/list/inside_areas = list()
var/list/outside_areas = list()
var/list/eligible_areas = list()
for (var/z in impacted_z_levels)
eligible_areas += SSmapping.areas_in_z["[z]"]
for(var/i in 1 to eligible_areas.len)
var/area/place = eligible_areas[i]
if(place.outdoors)
outside_areas += place
else
inside_areas += place
CHECK_TICK
sound_wo.output_atoms = outside_areas
sound_wi.output_atoms = inside_areas
sound_wo.start()
sound_wi.start()
/datum/weather/oxygen_rain/end()
. = ..()
sound_wo.stop()
sound_wi.stop()
/datum/weather/oxygen_rain/weather_act(mob/living/L)
//This is liquid oxygen after all. (-180C give or take)
L.adjust_bodytemperature(-rand(5,10))
/datum/looping_sound/weak_outside_oxygenrain
mid_sounds = list(
'sound/weather/oxygenrain/outside/weak_mid1.ogg'=1,
'sound/weather/oxygenrain/outside/weak_mid2.ogg'=1
)
mid_length = 80
start_sound = 'sound/weather/oxygenrain/outside/weak_start.ogg'
start_length = 130
end_sound = 'sound/weather/oxygenrain/outside/weak_end.ogg'
volume = 50
/datum/looping_sound/weak_inside_oxygenrain
mid_sounds = list(
'sound/weather/oxygenrain/inside/weak_mid1.ogg'=1,
'sound/weather/oxygenrain/inside/weak_mid2.ogg'=1
)
mid_length = 80
start_sound = 'sound/weather/oxygenrain/inside/weak_start.ogg'
start_length = 130
end_sound = 'sound/weather/oxygenrain/inside/weak_end.ogg'
volume = 30
*/