more work
This commit is contained in:
67
hyperstation/code/datums/actions.dm
Normal file
67
hyperstation/code/datums/actions.dm
Normal 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
|
||||
105
hyperstation/code/datums/components/crafting/bounties.dm
Normal file
105
hyperstation/code/datums/components/crafting/bounties.dm
Normal 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
|
||||
*/
|
||||
46
hyperstation/code/datums/components/crafting/recipes.dm
Normal file
46
hyperstation/code/datums/components/crafting/recipes.dm
Normal 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
|
||||
191
hyperstation/code/datums/elements/holder_micro.dm
Normal file
191
hyperstation/code/datums/elements/holder_micro.dm
Normal 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)
|
||||
96
hyperstation/code/datums/ert_hazard_cleanup.dm
Normal file
96
hyperstation/code/datums/ert_hazard_cleanup.dm
Normal 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."
|
||||
29
hyperstation/code/datums/mood_events/events.dm
Normal file
29
hyperstation/code/datums/mood_events/events.dm
Normal 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
|
||||
8
hyperstation/code/datums/ruins/lavaland.dm
Normal file
8
hyperstation/code/datums/ruins/lavaland.dm
Normal 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
|
||||
63
hyperstation/code/datums/traits/good.dm
Normal file
63
hyperstation/code/datums/traits/good.dm
Normal 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)
|
||||
47
hyperstation/code/datums/traits/neutral.dm
Normal file
47
hyperstation/code/datums/traits/neutral.dm
Normal 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."
|
||||
93
hyperstation/code/datums/weather/oxygen_rain.dm
Normal file
93
hyperstation/code/datums/weather/oxygen_rain.dm
Normal 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
|
||||
*/
|
||||
Reference in New Issue
Block a user