mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-24 17:11:40 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into parachute
# Conflicts: # icons/obj/storage.dmi
This commit is contained in:
@@ -23,7 +23,7 @@ var/savefile/Banlist
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
|
||||
else
|
||||
Banlist.cd = "/base/[ckey][id]"
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMENANT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMANENT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
||||
.["reason"] = "ckey/id"
|
||||
return .
|
||||
else
|
||||
@@ -49,7 +49,7 @@ var/savefile/Banlist
|
||||
else
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
|
||||
else
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMENANT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMANENT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
||||
.["reason"] = matches
|
||||
return .
|
||||
return 0
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
/datum/gear/eyes/medical
|
||||
display_name = "Medical HUD (Medical)"
|
||||
path = /obj/item/clothing/glasses/hud/health
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
|
||||
|
||||
/datum/gear/eyes/medical/prescriptionmed
|
||||
display_name = "Medical HUD, prescription (Medical)"
|
||||
|
||||
@@ -183,6 +183,12 @@
|
||||
desc = "Small spaces and tight quarters makes you feel distressed. Unfortunately both are rather common when living in space."
|
||||
modifier_type = /datum/modifier/trait/phobia/claustrophobe
|
||||
|
||||
|
||||
/datum/trait/modifier/mental/blennophobe
|
||||
name = "Blennophobia"
|
||||
desc = "Slimes are quite dangerous, but just the aspect of something being slimey is uncomfortable."
|
||||
modifier_type = /datum/modifier/trait/phobia/blennophobe
|
||||
|
||||
/*
|
||||
// Uncomment this when/if these get finished.
|
||||
/datum/trait/modifier/mental/synthphobe
|
||||
@@ -239,4 +245,4 @@
|
||||
name = "Promethean-phobic"
|
||||
desc = "Boilerplate racism for jellos goes here."
|
||||
mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
/obj/item/clothing/under/color/blackf
|
||||
name = "feminine black jumpsuit"
|
||||
desc = "It's very smart and in a ladies-size!"
|
||||
desc = "It's very smart and in a ladies size!"
|
||||
icon_state = "black"
|
||||
worn_state = "blackf"
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
/obj/item/clothing/under/color/orange
|
||||
name = "orange jumpsuit"
|
||||
desc = "It's standardised prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
|
||||
desc = "It's standardized prisoner-wear. Its suit sensors are permanently set to the \"Tracking\" position."
|
||||
icon_state = "orange"
|
||||
has_sensor = 2
|
||||
sensor_mode = 3
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
|
||||
/obj/item/clothing/under/rank/clown
|
||||
name = "clown suit"
|
||||
desc = "<i>'HONK!'</i>"
|
||||
desc = "<i><font face='comic sans ms'>Honk!</i></font>"
|
||||
icon_state = "clown"
|
||||
rolled_sleeves = -1
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
|
||||
/obj/item/clothing/under/lawyer/oldman
|
||||
name = "Old Man's Suit"
|
||||
desc = "A classic suit for the older gentleman with built in back support."
|
||||
desc = "A classic suit for the older gentleman, with built in back support."
|
||||
icon_state = "oldman"
|
||||
item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny")
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ var/list/dreams = list(
|
||||
"an Unathi","a Tajaran","the Station Intelligence core","the mining station","the research station","a beaker of strange liquid",
|
||||
"a Teshari", "a Diona nymph","the supermatter","Major Bill","a Morpheus ship with a ridiculous name","the Exodus","a star",
|
||||
"a Dionaea gestalt","the chapel","a distant scream","endless chittering noises","glowing eyes in the shadows","an empty glass",
|
||||
"a disoriented Promethean","towers of plastic","a Gygax","a synthetic","a Man-Machine Interface","maintanence drones",
|
||||
"a disoriented Promethean","towers of plastic","a Gygax","a synthetic","a Man-Machine Interface","maintenance drones",
|
||||
"unintelligible writings","a Fleet ship",
|
||||
)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/integrated_circuit/memory
|
||||
name = "memory chip"
|
||||
desc = "This tiny chip can store one piece of data."
|
||||
icon_state = "memory"
|
||||
icon_state = "memory1"
|
||||
complexity = 1
|
||||
inputs = list()
|
||||
outputs = list()
|
||||
|
||||
@@ -162,4 +162,5 @@
|
||||
))
|
||||
|
||||
/material/snow/generate_recipes()
|
||||
return // Snowmen and snowballs may come here later.
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
|
||||
@@ -735,7 +735,7 @@ var/list/name_to_material
|
||||
destruction_desc = "crumples"
|
||||
|
||||
/material/snow
|
||||
name = "snow"
|
||||
name = MAT_SNOW
|
||||
stack_type = /obj/item/stack/material/snow
|
||||
flags = MATERIAL_BRITTLE
|
||||
icon_base = "solid"
|
||||
@@ -749,7 +749,7 @@ var/list/name_to_material
|
||||
melting_point = T0C+1
|
||||
destruction_desc = "crumples"
|
||||
sheet_singular_name = "pile"
|
||||
sheet_plural_name = "piles"
|
||||
sheet_plural_name = "pile" //Just a bigger pile
|
||||
|
||||
/material/cloth //todo
|
||||
name = "cloth"
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
|
||||
var/open_tiles_needed = 15 // Tends to be just right, as maint triggers this but hallways don't.
|
||||
|
||||
on_created_text = "<span class='warning'>You are terrified of tight spaces. Why did you come to space??</span>"
|
||||
on_created_text = "<span class='warning'>You are terrified of tight spaces. Why did you come to space?</span>"
|
||||
on_expired_text = "<span class='notice'>Small rooms aren't so bad now.</span>"
|
||||
|
||||
zero_fear_up = list(
|
||||
@@ -357,6 +357,90 @@
|
||||
|
||||
return fear_amount
|
||||
|
||||
/datum/modifier/trait/phobia/blennophobe
|
||||
name = "blennophobia"
|
||||
desc = "Slimes are quite dangerous, but just the aspect of something being slimey is uncomfortable."
|
||||
fear_decay_rate = 1
|
||||
|
||||
on_created_text = "<span class='warning'>You are disgusted and horrified by slime.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel more... okay with slime.</span>"
|
||||
|
||||
zero_fear_up = list(
|
||||
"<span class='warning'><font size='3'>That's some slime!</font></span>",
|
||||
"<span class='warning'><font size='3'>There's slime right there!</font></span>"
|
||||
)
|
||||
zero_fear_down = list(
|
||||
"<span class='notice'>The slime is out of sight and out of mind.</span>",
|
||||
"<span class='notice'>Clean. No more slime.</span>"
|
||||
)
|
||||
|
||||
half_fear_up = list(
|
||||
"<span class='danger'><font size='3'>The slimes might strike at any point!</font></span>",
|
||||
"<span class='danger'><font size='3'>The slime is still there!</font></span>"
|
||||
)
|
||||
half_fear_down = list(
|
||||
"<span class='warning'>The slime is gone... right?</span>",
|
||||
"<span class='warning'>You can't see any slime right now, but you're still anxious.</span>"
|
||||
)
|
||||
|
||||
full_fear_up = list(
|
||||
"<span class='danger'><font size='4'>The slime is everywhere!</font></span>",
|
||||
"<span class='danger'><font size='4'>You're gonna get absorbed if you don't get out!</font></span>"
|
||||
)
|
||||
full_fear_down = list(
|
||||
"<span class='danger'>There must be more of that slime somewhere...</span>",
|
||||
"<span class='danger'>No more of this slime, please....</span>"
|
||||
)
|
||||
|
||||
/datum/modifier/trait/phobia/blennophobe/should_fear()
|
||||
if(holder.blinded)
|
||||
return 0 // Can't fear what cannot be seen.
|
||||
|
||||
var/fear_amount = 0
|
||||
for(var/atom/thing in view(5, holder)) // See haemophobia for why this is 5.
|
||||
if(istype(thing, /obj/structure/blob)) // blobs are uncomfortable things
|
||||
fear_amount += 3
|
||||
|
||||
if(istype(thing, /obj/effect/alien/resin)) // Resin's a bit slimy according to its own description.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /obj/item/weed_extract))
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /obj/effect/decal/cleanable/mucus)) // Blennophobia apparently includes mucus, so!
|
||||
fear_amount += 2
|
||||
|
||||
if(istype(thing, /obj/item/slime_extract)) // Gooey.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /obj/item/slime_cube)) // Also gooey, alongside harbinger of bad news.
|
||||
fear_amount += 2
|
||||
|
||||
if(istype(thing, /obj/item/organ/internal/brain/slime))
|
||||
fear_amount += 2
|
||||
|
||||
if(istype(thing, /obj/item/clothing/head/collectable/slime)) // Some hats are spooky so people can be assholes with them.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /mob/living/simple_animal/slime)) // An actual predatory specimen!
|
||||
var/mob/living/simple_animal/slime/S = thing
|
||||
if(S.stat == DEAD) // Dead slimes are somewhat less spook.
|
||||
fear_amount += 4
|
||||
if(S.is_adult == TRUE) //big boy
|
||||
fear_amount += 8
|
||||
else
|
||||
fear_amount += 6
|
||||
|
||||
if(istype(thing, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/S = thing
|
||||
if(istype(S.species, /datum/species/skrell)) //Skrell ARE slimey.
|
||||
fear_amount += 1
|
||||
if(istype(S.species, /datum/species/shapeshifter/promethean))
|
||||
fear_amount += 4
|
||||
else
|
||||
return
|
||||
return fear_amount
|
||||
|
||||
// Note for the below 'phobias' are of the xeno-phobic variety, and are less centered on pure fear as above, and more on a mix of distrust, fear, and disdainfulness.
|
||||
// As such, they are mechanically different than the fear-based phobias, in that instead of a buildup of fearful messages, it does intermittent messages specific to what holder sees.
|
||||
|
||||
@@ -367,7 +451,7 @@
|
||||
closely, waiting to strike."
|
||||
|
||||
on_created_text = "<span class='warning'>You remain vigilant against the Alien.</span>"
|
||||
on_expired_text = "<span class='notice'>Aliens aren't so bad afterall.</span>"
|
||||
on_expired_text = "<span class='notice'>Aliens aren't so bad after all.</span>"
|
||||
|
||||
var/last_message = null // world.time we last did a message.
|
||||
var/message_cooldown = 1 MINUTE
|
||||
@@ -442,7 +526,7 @@
|
||||
desc = "Humans are bound to get us all killed with their reckless use of technology..."
|
||||
|
||||
on_created_text = "<span class='warning'>You unfortunately are likely to have to deal with humans today.</span>"
|
||||
on_expired_text = "<span class='notice'>Humans aren't so bad afterall.</span>"
|
||||
on_expired_text = "<span class='notice'>Humans aren't so bad after all.</span>"
|
||||
|
||||
/datum/modifier/trait/phobia/xenophobia/human/get_xenos()
|
||||
var/list/humans = list()
|
||||
@@ -471,7 +555,7 @@
|
||||
desc = "The Skrell pretend that they are Humanity's enlightened allies, but you can see past that."
|
||||
|
||||
on_created_text = "<span class='warning'>Hopefully no Skrell show up today.</span>"
|
||||
on_expired_text = "<span class='notice'>Skrell aren't so bad afterall.</span>"
|
||||
on_expired_text = "<span class='notice'>Skrell aren't so bad after all.</span>"
|
||||
|
||||
/datum/modifier/trait/phobia/xenophobia/skrell/get_xenos()
|
||||
var/list/skrell = list()
|
||||
@@ -490,3 +574,4 @@
|
||||
"WetSkrell was a mistake."
|
||||
)
|
||||
return pick(generic_responses)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
|
||||
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
|
||||
icon = 'icons/mob/ghost.dmi'
|
||||
icon_state = "ghost"
|
||||
layer = 4
|
||||
layer = 3.9 //Just below normal mobs
|
||||
stat = DEAD
|
||||
canmove = 0
|
||||
blinded = 0
|
||||
@@ -501,6 +501,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
src << "<font color='blue'>Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)</font>"
|
||||
src << "<font color='blue'>Heat Capacity: [round(environment.heat_capacity(),0.1)]</font>"
|
||||
|
||||
/mob/observer/dead/verb/check_radiation()
|
||||
set name = "Check Radiation"
|
||||
set category = "Ghost"
|
||||
|
||||
var/turf/t = get_turf(src)
|
||||
if(t)
|
||||
var/rads = radiation_repository.get_rads_at_turf(t)
|
||||
to_chat(src, "<span class='notice'>Radiation level: [rads ? rads : "0"] Bq.</span>")
|
||||
|
||||
|
||||
/mob/observer/dead/verb/become_mouse()
|
||||
set name = "Become mouse"
|
||||
set category = "Ghost"
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
var/virus_immune
|
||||
var/short_sighted // Permanent weldervision.
|
||||
var/blood_volume = 560 // Initial blood volume.
|
||||
var/bloodloss_rate = 1 // Multiplier for how fast a species bleeds out. Higher = Faster
|
||||
var/hunger_factor = 0.05 // Multiplier for hunger.
|
||||
|
||||
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
|
||||
|
||||
@@ -35,12 +35,14 @@
|
||||
ambiguous_genders = TRUE
|
||||
gluttonous = 1
|
||||
slowdown = 0.5
|
||||
total_health = 125
|
||||
brute_mod = 0.85
|
||||
burn_mod = 0.85
|
||||
metabolic_rate = 0.85
|
||||
item_slowdown_mod = 0.5
|
||||
mob_size = MOB_LARGE
|
||||
blood_volume = 840
|
||||
bloodloss_rate = 0.75
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_UNATHI)
|
||||
name_language = LANGUAGE_UNATHI
|
||||
@@ -235,6 +237,8 @@
|
||||
flash_mod = 1.2
|
||||
chemOD_mod = 0.9
|
||||
|
||||
bloodloss_rate = 1.5
|
||||
|
||||
ambiguous_genders = TRUE
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
|
||||
|
||||
@@ -661,9 +661,9 @@ default behaviour is:
|
||||
/mob/living/Move(a, b, flag)
|
||||
|
||||
if (buckled && buckled.loc != a) //not updating position
|
||||
if (!buckled.anchored)
|
||||
if(istype(buckled, /mob)) //If you're buckled to a mob, a la slime things, keep on rolling.
|
||||
return buckled.Move(a, b)
|
||||
else
|
||||
else //Otherwise, no running around for you.
|
||||
return 0
|
||||
|
||||
if (restrained())
|
||||
|
||||
@@ -37,8 +37,10 @@ var/list/mob_hat_cache = list()
|
||||
integrated_light_power = 3
|
||||
local_transmit = 1
|
||||
|
||||
can_pull_size = ITEMSIZE_NORMAL
|
||||
can_pull_size = ITEMSIZE_NO_CONTAINER
|
||||
can_pull_mobs = MOB_PULL_SMALLER
|
||||
can_enter_vent_with = list(
|
||||
/obj)
|
||||
|
||||
mob_bump_flag = SIMPLE_ANIMAL
|
||||
mob_swap_flags = SIMPLE_ANIMAL
|
||||
@@ -71,13 +73,22 @@ var/list/mob_hat_cache = list()
|
||||
module_type = /obj/item/weapon/robot_module/drone/construction
|
||||
hat_x_offset = 1
|
||||
hat_y_offset = -12
|
||||
can_pull_size = ITEMSIZE_HUGE
|
||||
can_pull_mobs = MOB_PULL_SAME
|
||||
|
||||
/mob/living/silicon/robot/drone/mining
|
||||
icon_state = "miningdrone"
|
||||
item_state = "constructiondrone"
|
||||
law_type = /datum/ai_laws/mining_drone
|
||||
module_type = /obj/item/weapon/robot_module/drone/mining
|
||||
hat_x_offset = 1
|
||||
hat_y_offset = -12
|
||||
can_pull_mobs = MOB_PULL_SAME
|
||||
|
||||
/mob/living/silicon/robot/drone/New()
|
||||
|
||||
..()
|
||||
|
||||
verbs += /mob/living/proc/ventcrawl
|
||||
verbs += /mob/living/proc/hide
|
||||
remove_language("Robot Talk")
|
||||
add_language("Robot Talk", 0)
|
||||
@@ -145,18 +156,18 @@ var/list/mob_hat_cache = list()
|
||||
|
||||
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
|
||||
if(hat)
|
||||
user << "<span class='warning'>\The [src] is already wearing \the [hat].</span>"
|
||||
to_chat(user, "<span class='warning'>\The [src] is already wearing \the [hat].</span>")
|
||||
return
|
||||
user.unEquip(W)
|
||||
wear_hat(W)
|
||||
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
|
||||
return
|
||||
else if(istype(W, /obj/item/borg/upgrade/))
|
||||
user << "<span class='danger'>\The [src] is not compatible with \the [W].</span>"
|
||||
to_chat(user, "<span class='danger'>\The [src] is not compatible with \the [W].</span>")
|
||||
return
|
||||
|
||||
else if (istype(W, /obj/item/weapon/crowbar))
|
||||
user << "<span class='danger'>\The [src] is hermetically sealed. You can't open the case.</span>"
|
||||
to_chat(user, "<span class='danger'>\The [src] is hermetically sealed. You can't open the case.</span>")
|
||||
return
|
||||
|
||||
else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
|
||||
@@ -164,11 +175,11 @@ var/list/mob_hat_cache = list()
|
||||
if(stat == 2)
|
||||
|
||||
if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave.
|
||||
user << "<span class='danger'>The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.</span>"
|
||||
to_chat(user, "<span class='danger'>The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.</span>")
|
||||
return
|
||||
|
||||
if(!allowed(usr))
|
||||
user << "<span class='danger'>Access denied.</span>"
|
||||
to_chat(user, "<span class='danger'>Access denied.</span>")
|
||||
return
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] swipes \his ID card through \the [src], attempting to reboot it.</span>", "<span class='danger'>>You swipe your ID card through \the [src], attempting to reboot it.</span>")
|
||||
@@ -189,7 +200,7 @@ var/list/mob_hat_cache = list()
|
||||
if(allowed(usr))
|
||||
shut_down()
|
||||
else
|
||||
user << "<span class='danger'>Access denied.</span>"
|
||||
to_chat(user, "<span class='danger'>Access denied.</span>")
|
||||
|
||||
return
|
||||
|
||||
@@ -197,16 +208,16 @@ var/list/mob_hat_cache = list()
|
||||
|
||||
/mob/living/silicon/robot/drone/emag_act(var/remaining_charges, var/mob/user)
|
||||
if(!client || stat == 2)
|
||||
user << "<span class='danger'>There's not much point subverting this heap of junk.</span>"
|
||||
to_chat(user, "<span class='danger'>There's not much point subverting this heap of junk.</span>")
|
||||
return
|
||||
|
||||
if(emagged)
|
||||
src << "<span class='danger'>\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.</span>"
|
||||
user << "<span class='danger'>You attempt to subvert [src], but the sequencer has no effect.</span>"
|
||||
to_chat(user, "<span class='danger'>\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.</span>")
|
||||
to_chat(user, "<span class='danger'>You attempt to subvert [src], but the sequencer has no effect.</span>")
|
||||
return
|
||||
|
||||
user << "<span class='danger'>You swipe the sequencer across [src]'s interface and watch its eyes flicker.</span>"
|
||||
src << "<span class='danger'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.</span>"
|
||||
to_chat(user, "<span class='danger'>You swipe the sequencer across [src]'s interface and watch its eyes flicker.</span>")
|
||||
to_chat(user, "<span class='danger'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.</span>")
|
||||
|
||||
message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
|
||||
log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
|
||||
@@ -337,3 +348,11 @@ var/list/mob_hat_cache = list()
|
||||
/mob/living/silicon/robot/drone/construction/updatename()
|
||||
real_name = "construction drone ([rand(100,999)])"
|
||||
name = real_name
|
||||
|
||||
/mob/living/silicon/robot/drone/mining/init()
|
||||
..()
|
||||
flavor_text = "It's a bulky mining drone stamped with a Grayson logo."
|
||||
|
||||
/mob/living/silicon/robot/drone/mining/updatename()
|
||||
real_name = "mining drone ([rand(100,999)])"
|
||||
name = real_name
|
||||
|
||||
@@ -30,6 +30,11 @@
|
||||
fabricator_tag = "Upper Level Construction"
|
||||
drone_type = /mob/living/silicon/robot/drone/construction
|
||||
|
||||
/obj/machinery/drone_fabricator/mining
|
||||
name = "mining drone fabricator"
|
||||
fabricator_tag = "Upper Level Mining"
|
||||
drone_type = /mob/living/silicon/robot/drone/mining
|
||||
|
||||
/obj/machinery/drone_fabricator/New()
|
||||
..()
|
||||
|
||||
|
||||
@@ -628,7 +628,7 @@
|
||||
if(!opened)
|
||||
usr << "You must access the borgs internals!"
|
||||
else if(!src.module && U.require_module)
|
||||
usr << "The borg must choose a module before he can be upgraded!"
|
||||
usr << "The borg must choose a module before it can be upgraded!"
|
||||
else if(U.locked)
|
||||
usr << "The upgrade is locked and cannot be used yet!"
|
||||
else
|
||||
|
||||
@@ -31,6 +31,7 @@ var/global/list/robot_modules = list(
|
||||
var/list/datum/matter_synth/synths = list()
|
||||
var/obj/item/emag = null
|
||||
var/obj/item/borg/upgrade/jetpack = null
|
||||
var/obj/item/borg/upgrade/advhealth = null
|
||||
var/list/subsystems = list()
|
||||
var/list/obj/item/borg/upgrade/supported_upgrades = list()
|
||||
|
||||
@@ -871,4 +872,17 @@ var/global/list/robot_modules = list(
|
||||
var/obj/item/device/lightreplacer/LR = locate() in src.modules
|
||||
LR.Charge(R, amount)
|
||||
..()
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/weapon/robot_module/drone/mining
|
||||
name = "miner drone module"
|
||||
channels = list("Supply" = 1)
|
||||
networks = list(NETWORK_MINE)
|
||||
|
||||
/obj/item/weapon/robot_module/drone/mining/New()
|
||||
..()
|
||||
src.modules += new /obj/item/borg/sight/material(src)
|
||||
src.modules += new /obj/item/weapon/pickaxe/borgdrill(src)
|
||||
src.modules += new /obj/item/weapon/storage/bag/ore(src)
|
||||
src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
|
||||
src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src)
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
/obj/item/weapon/robot_module/robot/syndicate/combat_medic/New(var/mob/living/silicon/robot/R)
|
||||
..()
|
||||
src.modules += new /obj/item/borg/sight/hud/med(src)
|
||||
src.modules += new /obj/item/device/healthanalyzer(src)
|
||||
src.modules += new /obj/item/device/healthanalyzer/advanced(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/borghypo/merc(src)
|
||||
|
||||
// Surgery things.
|
||||
|
||||
@@ -143,6 +143,9 @@ var/const/CE_STABLE_THRESHOLD = 0.5
|
||||
var/blood_max = 0
|
||||
var/blood_loss_divisor = 30 //lower factor = more blood loss
|
||||
|
||||
// Some species bleed out differently
|
||||
blood_loss_divisor /= species.bloodloss_rate
|
||||
|
||||
// Some modifiers can make bleeding better or worse. Higher multiplers = more bleeding.
|
||||
var/blood_loss_modifier_multiplier = 1.0
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
|
||||
@@ -41,7 +41,12 @@ var/list/fusion_cores = list()
|
||||
/obj/machinery/power/fusion_core/process()
|
||||
if((stat & BROKEN) || !powernet || !owned_field)
|
||||
Shutdown()
|
||||
|
||||
if(owned_field)
|
||||
spawn(1)
|
||||
owned_field.stability_monitor()
|
||||
owned_field.radiation_scale()
|
||||
owned_field.temp_dump()
|
||||
owned_field.temp_color()
|
||||
/obj/machinery/power/fusion_core/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#define FUSION_ENERGY_PER_K 20
|
||||
#define FUSION_MAX_ENVIRO_HEAT 5000 //raise this if you want the reactor to dump more energy into the atmosphere
|
||||
#define PLASMA_TEMP_RADIATION_DIVISIOR 15 //radiation divisior. plasma temp / divisor = radiation.
|
||||
|
||||
/obj/effect/fusion_em_field
|
||||
name = "electromagnetic field"
|
||||
@@ -7,7 +9,7 @@
|
||||
icon_state = "emfield_s1"
|
||||
alpha = 50
|
||||
layer = 4
|
||||
light_color = COLOR_BLUE
|
||||
light_color = "#cc7700"
|
||||
|
||||
var/size = 1
|
||||
var/energy = 0
|
||||
@@ -16,6 +18,7 @@
|
||||
var/field_strength = 0.01
|
||||
var/tick_instability = 0
|
||||
var/percent_unstable = 0
|
||||
var/stable = 1
|
||||
|
||||
var/obj/machinery/power/fusion_core/owned_core
|
||||
var/list/dormant_reactant_quantities = list()
|
||||
@@ -33,8 +36,8 @@
|
||||
|
||||
var/light_min_range = 2
|
||||
var/light_min_power = 3
|
||||
var/light_max_range = 10
|
||||
var/light_max_power = 10
|
||||
var/light_max_range = 5
|
||||
var/light_max_power = 5
|
||||
|
||||
var/last_range
|
||||
var/last_power
|
||||
@@ -173,8 +176,6 @@
|
||||
|
||||
check_instability()
|
||||
Radiate()
|
||||
if(radiation)
|
||||
radiation_repository.radiate(src, radiation)
|
||||
return 1
|
||||
|
||||
/obj/effect/fusion_em_field/proc/check_instability()
|
||||
@@ -200,9 +201,10 @@
|
||||
var/flare
|
||||
var/fuel_loss
|
||||
var/rupture
|
||||
if(percent_unstable < 0.7)
|
||||
if(percent_unstable < 0.2)
|
||||
visible_message("<span class='danger'>\The [src] ripples uneasily, like a disturbed pond.</span>")
|
||||
fuel_loss = prob(5)
|
||||
flare = prob(50)
|
||||
else if(percent_unstable < 0.9)
|
||||
visible_message("<span class='danger'>\The [src] undulates violently, shedding plumes of plasma!</span>")
|
||||
flare = prob(50)
|
||||
@@ -238,6 +240,7 @@
|
||||
set_light(15, 15, "#CCCCFF")
|
||||
empulse(get_turf(src), ceil(plasma_temperature/1000), ceil(plasma_temperature/300))
|
||||
sleep(5)
|
||||
global_announcer.autosay("WARNING: FIELD RUPTURE IMMINENT!", "Containment Monitor")
|
||||
RadiateAll()
|
||||
explosion(get_turf(owned_core),-1,-1,8,10) // Blow out all the windows.
|
||||
return
|
||||
@@ -318,12 +321,6 @@
|
||||
tick_instability += rand(15,30)
|
||||
AM.emp_act(empsev)
|
||||
|
||||
if(owned_core && owned_core.loc)
|
||||
var/datum/gas_mixture/environment = owned_core.loc.return_air()
|
||||
if(environment && environment.temperature < (T0C+1000)) // Putting an upper bound on it to stop it being used in a TEG.
|
||||
environment.add_thermal_energy(plasma_temperature*20000)
|
||||
radiation = 0
|
||||
|
||||
/obj/effect/fusion_em_field/proc/change_size(var/newsize = 1)
|
||||
var/changed = 0
|
||||
switch(newsize)
|
||||
@@ -490,5 +487,59 @@
|
||||
AddEnergy(Proj.damage)
|
||||
update_icon()
|
||||
return 0
|
||||
//All procs below this point are called in _core.dm, starting at line 41.
|
||||
//Stability monitoring. Gives radio annoucements if field stability is below 80%
|
||||
/obj/effect/fusion_em_field/proc/stability_monitor()
|
||||
var/warnpoint = 0.10
|
||||
var/warnmessage = "Warning! Field unstable! Instability at [percent_unstable * 100]%, plasma temperature at [plasma_temperature + 295]k."
|
||||
var/stablemessage = "Containment field returning to stable conditions."
|
||||
|
||||
#undef FUSION_HEAT_CAP
|
||||
if(percent_unstable >= warnpoint)
|
||||
global_announcer.autosay(warnmessage, "Field Stability Monitor", "Engineering")
|
||||
stable = 0
|
||||
sleep(20 SECONDS)
|
||||
return
|
||||
if(percent_unstable < warnpoint && stable == 0)
|
||||
global_announcer.autosay(stablemessage, "Field Stability Monitor", "Engineering")
|
||||
stable = 1
|
||||
return
|
||||
|
||||
//Reaction radiation is fairly buggy and there's at least three procs dealing with radiation here, this is to ensure constant radiation output.
|
||||
/obj/effect/fusion_em_field/proc/radiation_scale()
|
||||
radiation_repository.radiate(src, 2 + plasma_temperature / PLASMA_TEMP_RADIATION_DIVISIOR)
|
||||
|
||||
//Somehow fixing the radiation issue managed to break this, but moving it to it's own proc seemed to have fixed it. I don't know.
|
||||
/obj/effect/fusion_em_field/proc/temp_dump()
|
||||
if(owned_core && owned_core.loc)
|
||||
var/datum/gas_mixture/environment = owned_core.loc.return_air()
|
||||
if(environment && environment.temperature < (T0C+FUSION_MAX_ENVIRO_HEAT))
|
||||
environment.add_thermal_energy(plasma_temperature*20000)
|
||||
|
||||
//Temperature changes depending on color.
|
||||
/obj/effect/fusion_em_field/proc/temp_color()
|
||||
if(plasma_temperature > 60000) //high ultraviolet - magenta
|
||||
light_color = "#cc005f"
|
||||
light_max_range = 25
|
||||
light_max_power = 10
|
||||
else if(plasma_temperature > 12000) //ultraviolet - blue
|
||||
light_color = "#1b00cc"
|
||||
light_max_range = 20
|
||||
light_max_power = 10
|
||||
else if(plasma_temperature > 8000) //nearing ultraviolet - cyan
|
||||
light_color = "#00cccc"
|
||||
light_max_range = 15
|
||||
light_max_power = 10
|
||||
else if(plasma_temperature > 4000) // green
|
||||
light_color = "#1ab705"
|
||||
light_max_range = 10
|
||||
light_max_power = 10
|
||||
else if(plasma_temperature <= 4000) //orange
|
||||
light_color = "#cc7700"
|
||||
light_max_range = 5
|
||||
light_max_power = 5
|
||||
return
|
||||
|
||||
|
||||
#undef FUSION_HEAT_CAP
|
||||
#undef FUSION_MAX_ENVIRO_HEAT
|
||||
#undef PLASMA_TEMP_RADIATION_DIVISIOR
|
||||
@@ -48,14 +48,13 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy)
|
||||
s_react = "deuterium"
|
||||
energy_consumption = 1
|
||||
energy_production = 2
|
||||
|
||||
// Advanced production reactions (todo)
|
||||
|
||||
/decl/fusion_reaction/deuterium_helium
|
||||
p_react = "deuterium"
|
||||
s_react = "helium-3"
|
||||
energy_consumption = 1
|
||||
energy_production = 5
|
||||
radiation = 2
|
||||
|
||||
/decl/fusion_reaction/deuterium_tritium
|
||||
p_react = "deuterium"
|
||||
@@ -64,7 +63,6 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy)
|
||||
energy_production = 1
|
||||
products = list("helium-3" = 1)
|
||||
instability = 0.5
|
||||
radiation = 3
|
||||
|
||||
/decl/fusion_reaction/deuterium_lithium
|
||||
p_react = "deuterium"
|
||||
|
||||
8
code/modules/power/fusion/fusion_reagents.dm
Normal file
8
code/modules/power/fusion/fusion_reagents.dm
Normal file
@@ -0,0 +1,8 @@
|
||||
//Additional fusion reagents. These likely don't have any other use aside from the RUST, but if you want to make stuff with 'em, be my guest.
|
||||
|
||||
/datum/reagent/helium3
|
||||
name = "helium-3"
|
||||
description = "A colorless, odorless, tasteless and generally inert gas used in fusion reactors. Non-radioactive."
|
||||
id = "helium-3"
|
||||
reagent_state = GAS
|
||||
color = "#808080"
|
||||
@@ -1,7 +1,7 @@
|
||||
// It.. uses a lot of power. Everything under power is engineering stuff, at least.
|
||||
|
||||
/obj/machinery/computer/gravity_control_computer
|
||||
name = "Gravity Generator Control"
|
||||
name = "gravity generator control"
|
||||
desc = "A computer to control a local gravity generator. Qualified personnel only."
|
||||
icon_state = "airtunnel0e"
|
||||
anchored = 1
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
/obj/machinery/gravity_generator/
|
||||
name = "Gravitational Generator"
|
||||
name = "gravitational generator"
|
||||
desc = "A device which produces a gravaton field when set up."
|
||||
icon = 'icons/obj/singularity.dmi'
|
||||
icon_state = "TheSingGen"
|
||||
@@ -94,7 +94,7 @@
|
||||
else
|
||||
dat += "<tt><font color=red>[A]</tt></font><br>"
|
||||
|
||||
dat += "<br><tt>Maintainence Functions:</tt><br>"
|
||||
dat += "<br><tt>Maintenance Functions:</tt><br>"
|
||||
if(gravity_generator:on)
|
||||
dat += "<a href='byond://?src=\ref[src];gentoggle=1'><font color=red> TURN GRAVITY GENERATOR OFF. </font></a>"
|
||||
else
|
||||
|
||||
@@ -29,7 +29,8 @@
|
||||
|
||||
//Placeholder for effect that trigger on eating that aren't tied to reagents.
|
||||
/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M)
|
||||
if(!usr) return
|
||||
if(!usr)
|
||||
usr = M
|
||||
if(!reagents.total_volume)
|
||||
M.visible_message("<span class='notice'>[M] finishes eating \the [src].</span>","<span class='notice'>You finish eating \the [src].</span>")
|
||||
usr.drop_from_inventory(src) //so icons update :[
|
||||
@@ -224,7 +225,7 @@
|
||||
return
|
||||
user.visible_message("<b>[user]</b> nibbles away at \the [src].","You nibble away at \the [src].")
|
||||
bitecount++
|
||||
if(reagents && user.reagents)
|
||||
if(reagents)
|
||||
reagents.trans_to_mob(user, bitesize, CHEM_INGEST)
|
||||
spawn(5)
|
||||
if(!src && !user.client)
|
||||
|
||||
@@ -15,57 +15,55 @@
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
return
|
||||
|
||||
New()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
if (!possible_transfer_amounts)
|
||||
src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
|
||||
..()
|
||||
/obj/structure/reagent_dispensers/New()
|
||||
var/datum/reagents/R = new/datum/reagents(5000)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
if (!possible_transfer_amounts)
|
||||
src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
|
||||
..()
|
||||
|
||||
examine(mob/user)
|
||||
if(!..(user, 2))
|
||||
/obj/structure/reagent_dispensers/examine(mob/user)
|
||||
if(!..(user, 2))
|
||||
return
|
||||
user << "<span class='notice'>It contains:</span>"
|
||||
if(reagents && reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
user << "<span class='notice'>[R.volume] units of [R.name]</span>"
|
||||
else
|
||||
user << "<span class='notice'>Nothing.</span>"
|
||||
|
||||
/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
|
||||
set name = "Set transfer amount"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
|
||||
if (N)
|
||||
amount_per_transfer_from_this = N
|
||||
|
||||
/obj/structure/reagent_dispensers/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
user << "<span class='notice'>It contains:</span>"
|
||||
if(reagents && reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
user << "<span class='notice'>[R.volume] units of [R.name]</span>"
|
||||
else
|
||||
user << "<span class='notice'>Nothing.</span>"
|
||||
|
||||
verb/set_APTFT() //set amount_per_transfer_from_this
|
||||
set name = "Set transfer amount"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
|
||||
if (N)
|
||||
amount_per_transfer_from_this = N
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/reagent_dispensers/blob_act()
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//Dispensers
|
||||
/obj/structure/reagent_dispensers/watertank
|
||||
name = "watertank"
|
||||
@@ -73,16 +71,19 @@
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "watertank"
|
||||
amount_per_transfer_from_this = 10
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("water",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/watertank/high/New()
|
||||
/obj/structure/reagent_dispensers/watertank/New()
|
||||
..()
|
||||
reagents.add_reagent("water", 1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/watertank/high
|
||||
name = "high-capacity water tank"
|
||||
desc = "A highly-pressurized water tank made to hold vast amounts of water.."
|
||||
icon_state = "watertank_high"
|
||||
|
||||
/obj/structure/reagent_dispensers/watertank/high/New()
|
||||
..()
|
||||
reagents.add_reagent("water",4000)
|
||||
reagents.add_reagent("water", 4000)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank
|
||||
name = "fueltank"
|
||||
@@ -92,9 +93,10 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
var/modded = 0
|
||||
var/obj/item/device/assembly_holder/rig = null
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("fuel",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/New()
|
||||
..()
|
||||
reagents.add_reagent("fuel",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/examine(mob/user)
|
||||
if(!..(user, 2))
|
||||
@@ -201,9 +203,10 @@
|
||||
anchored = 1
|
||||
density = 0
|
||||
amount_per_transfer_from_this = 45
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("condensedcapsaicin",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/peppertank/New()
|
||||
..()
|
||||
reagents.add_reagent("condensedcapsaicin",1000)
|
||||
|
||||
|
||||
/obj/structure/reagent_dispensers/water_cooler
|
||||
@@ -347,9 +350,10 @@
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "beertankTEMP"
|
||||
amount_per_transfer_from_this = 10
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("beer",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/beerkeg/New()
|
||||
..()
|
||||
reagents.add_reagent("beer",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/beerkeg/fakenuke
|
||||
name = "nuclear beer keg"
|
||||
@@ -365,9 +369,9 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
anchored = 1
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("virusfood", 1000)
|
||||
/obj/structure/reagent_dispensers/virusfood/New()
|
||||
..()
|
||||
reagents.add_reagent("virusfood", 1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/acid
|
||||
name = "Sulphuric Acid Dispenser"
|
||||
@@ -377,6 +381,6 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
anchored = 1
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("sacid", 1000)
|
||||
/obj/structure/reagent_dispensers/acid/New()
|
||||
..()
|
||||
reagents.add_reagent("sacid", 1000)
|
||||
|
||||
@@ -752,7 +752,7 @@ other types of metals and chemistry for reagents).
|
||||
sort_string = "VABAI"
|
||||
|
||||
/datum/design/item/communicator
|
||||
name = "Communcator"
|
||||
name = "Communicator"
|
||||
id = "communicator"
|
||||
req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500)
|
||||
|
||||
@@ -332,6 +332,13 @@
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 7500, "phoron" = 11250, "uranium" = 15000)
|
||||
build_path = /obj/item/borg/upgrade/jetpack
|
||||
|
||||
/datum/design/item/prosfab/robot_upgrade/advhealth
|
||||
name = "Advanced Health Analyzer Module"
|
||||
desc = "An advanced health analyzer suitable for diagnosing more serious injuries."
|
||||
id = "borg_advhealth_module"
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6500, "diamond" = 350)
|
||||
build_path = /obj/item/borg/upgrade/advhealth
|
||||
|
||||
/datum/design/item/prosfab/robot_upgrade/syndicate
|
||||
name = "Scrambled Equipment Module"
|
||||
desc = "Allows for the construction of lethal upgrades for cyborgs."
|
||||
|
||||
Reference in New Issue
Block a user