mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-26 05:27:39 +01:00
@@ -1,4 +1,4 @@
|
||||
#### Brief description of the issue
|
||||
#### Brief description of the bug
|
||||
|
||||
|
||||
#### What you expected to happen
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively,
|
||||
//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively,
|
||||
//but it does not permit gas to flow back from the environment into the injector. Can be turned off to prevent any gas flow.
|
||||
//When it receives the "inject" signal, it will try to pump it's entire contents into the environment regardless of pressure, using power.
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
use_power = 0
|
||||
idle_power_usage = 150 //internal circuitry, friction losses and stuff
|
||||
power_rating = 15000 //15000 W ~ 20 HP
|
||||
|
||||
|
||||
var/injecting = 0
|
||||
|
||||
var/volume_rate = 50 //flow rate limit
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/New()
|
||||
..()
|
||||
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more.
|
||||
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more.
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/Destroy()
|
||||
unregister_radio(src, frequency)
|
||||
@@ -60,21 +60,21 @@
|
||||
|
||||
if((stat & (NOPOWER|BROKEN)) || !use_power)
|
||||
return
|
||||
|
||||
|
||||
var/power_draw = -1
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
|
||||
if(environment && air_contents.temperature > 0)
|
||||
var/transfer_moles = (volume_rate/air_contents.volume)*air_contents.total_moles //apply flow rate limit
|
||||
power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating)
|
||||
|
||||
|
||||
if (power_draw >= 0)
|
||||
last_power_draw = power_draw
|
||||
use_power(power_draw)
|
||||
|
||||
|
||||
if(network)
|
||||
network.update = 1
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/proc/inject()
|
||||
@@ -84,7 +84,7 @@
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
if (!environment)
|
||||
return 0
|
||||
|
||||
|
||||
injecting = 1
|
||||
|
||||
if(air_contents.temperature > 0)
|
||||
@@ -155,4 +155,23 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/hide(var/i)
|
||||
update_underlays()
|
||||
update_underlays()
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>You toggle \the [src].</span>")
|
||||
injecting = !injecting
|
||||
use_power = injecting
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
if (!W.is_wrench())
|
||||
return ..()
|
||||
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
"You hear a ratchet.")
|
||||
deconstruct()
|
||||
|
||||
@@ -47,6 +47,8 @@
|
||||
var/radio_filter_out
|
||||
var/radio_filter_in
|
||||
|
||||
var/datum/looping_sound/air_pump/soundloop
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/on
|
||||
use_power = 1
|
||||
icon_state = "map_vent_out"
|
||||
@@ -68,6 +70,10 @@
|
||||
pressure_checks = 2
|
||||
pressure_checks_default = 2
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/Initialize()
|
||||
. = ..()
|
||||
soundloop = new(list(src), FALSE)
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/New()
|
||||
..()
|
||||
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP
|
||||
@@ -84,6 +90,7 @@
|
||||
if(initial_loc)
|
||||
initial_loc.air_vent_info -= id_tag
|
||||
initial_loc.air_vent_names -= id_tag
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/high_volume
|
||||
@@ -164,11 +171,15 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/proc/can_pump()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
soundloop.stop()
|
||||
return 0
|
||||
if(!use_power)
|
||||
soundloop.stop()
|
||||
return 0
|
||||
if(welded)
|
||||
soundloop.stop()
|
||||
return 0
|
||||
soundloop.start()
|
||||
return 1
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/process()
|
||||
|
||||
+3
-3
@@ -9,13 +9,13 @@ mob/proc/airflow_stun()
|
||||
if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0
|
||||
|
||||
if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN))
|
||||
src << "<span class='notice'>You stay upright as the air rushes past you.</span>"
|
||||
to_chat(src, "<span class='notice'>You stay upright as the air rushes past you.</span>")
|
||||
return 0
|
||||
if(buckled)
|
||||
src << "<span class='notice'>Air suddenly rushes past you!</span>"
|
||||
to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>")
|
||||
return 0
|
||||
if(!lying)
|
||||
src << "<span class='warning'>The sudden rush of air knocks you over!</span>"
|
||||
to_chat(src, "<span class='warning'>The sudden rush of air knocks you over!</span>")
|
||||
Weaken(5)
|
||||
last_airflow_stun = world.time
|
||||
|
||||
|
||||
@@ -10,10 +10,10 @@ client/proc/ZoneTick()
|
||||
|
||||
var/result = air_master.Tick()
|
||||
if(result)
|
||||
src << "Successfully Processed."
|
||||
to_chat(src, "Successfully Processed.")
|
||||
|
||||
else
|
||||
src << "Failed to process! ([air_master.tick_progress])"
|
||||
to_chat(src, "Failed to process! ([air_master.tick_progress])")
|
||||
*/
|
||||
|
||||
client/proc/Zone_Info(turf/T as null|turf)
|
||||
|
||||
+6
-4
@@ -102,7 +102,8 @@ obj/var/contaminated = 0
|
||||
if(vsc.plc.SKIN_BURNS && (species.breath_type != "phoron"))
|
||||
if(!pl_head_protected() || !pl_suit_protected())
|
||||
burn_skin(0.75)
|
||||
if(prob(20)) src << "<span class='danger'>Your skin burns!</span>"
|
||||
if(prob(20))
|
||||
to_chat(src, "<span class='danger'>Your skin burns!</span>")
|
||||
updatehealth()
|
||||
|
||||
//Burn eyes if exposed.
|
||||
@@ -133,17 +134,18 @@ obj/var/contaminated = 0
|
||||
if(vsc.plc.GENETIC_CORRUPTION && (species.breath_type != "phoron"))
|
||||
if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION)
|
||||
randmutb(src)
|
||||
src << "<span class='danger'>High levels of toxins cause you to spontaneously mutate!</span>"
|
||||
to_chat(src, "<span class='danger'>High levels of toxins cause you to spontaneously mutate!</span>")
|
||||
domutcheck(src,null)
|
||||
|
||||
/mob/living/carbon/human/proc/burn_eyes()
|
||||
var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES]
|
||||
if(E)
|
||||
if(prob(20)) src << "<span class='danger'>Your eyes burn!</span>"
|
||||
if(prob(20))
|
||||
to_chat(src, "<span class='danger'>Your eyes burn!</span>")
|
||||
E.damage += 2.5
|
||||
eye_blurry = min(eye_blurry+1.5,50)
|
||||
if (prob(max(0,E.damage - 15) + 1) &&!eye_blind)
|
||||
src << "<span class='danger'>You are blinded!</span>"
|
||||
to_chat(src, "<span class='danger'>You are blinded!</span>")
|
||||
Blind(20)
|
||||
|
||||
/mob/living/carbon/human/proc/pl_head_protected()
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#define DM_FLAG_NUMBING 0x1
|
||||
#define DM_FLAG_STRIPPING 0x2
|
||||
#define DM_FLAG_LEAVEREMAINS 0x4
|
||||
#define DM_FLAG_THICKBELLY 0x8
|
||||
|
||||
//Item related modes
|
||||
#define IM_HOLD "Hold"
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#define CE_ALCOHOL_TOXIC "alcotoxic" // Liver damage
|
||||
#define CE_SPEEDBOOST "gofast" // Hyperzine
|
||||
#define CE_SLOWDOWN "goslow" // Slowdown
|
||||
#define CE_ANTACID "nopuke" // Don't puke.
|
||||
|
||||
#define REAGENTS_PER_SHEET 20
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#define HALLOSS "halloss"
|
||||
#define ELECTROCUTE "electrocute"
|
||||
#define BIOACID "bioacid"
|
||||
#define SEARING "searing"
|
||||
|
||||
#define CUT "cut"
|
||||
#define BRUISE "bruise"
|
||||
|
||||
@@ -175,6 +175,7 @@
|
||||
#define MAT_LEAD "lead"
|
||||
#define MAT_SUPERMATTER "supermatter"
|
||||
#define MAT_METALHYDROGEN "mhydrogen"
|
||||
#define MAT_OSMIUM "osmium"
|
||||
|
||||
#define SHARD_SHARD "shard"
|
||||
#define SHARD_SHRAPNEL "shrapnel"
|
||||
@@ -347,10 +348,12 @@ var/global/list/##LIST_NAME = list();\
|
||||
#define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT
|
||||
|
||||
// Radiation 'levels'. Used for the geiger counter, for visuals and sound. They are in different files so this goes here.
|
||||
#define RAD_LEVEL_LOW 0.01 // Around the level at which radiation starts to become harmful
|
||||
#define RAD_LEVEL_MODERATE 10
|
||||
#define RAD_LEVEL_LOW 0.5 // Around the level at which radiation starts to become harmful
|
||||
#define RAD_LEVEL_MODERATE 5
|
||||
#define RAD_LEVEL_HIGH 25
|
||||
#define RAD_LEVEL_VERY_HIGH 50
|
||||
#define RAD_LEVEL_VERY_HIGH 75
|
||||
|
||||
#define RADIATION_THRESHOLD_CUTOFF 0.1 // Radiation will not affect a tile when below this value.
|
||||
|
||||
//https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity
|
||||
#define MOUSE_OPACITY_TRANSPARENT 0
|
||||
|
||||
+21
-3
@@ -194,10 +194,24 @@
|
||||
#define O_KIDNEYS "kidneys"
|
||||
#define O_APPENDIX "appendix"
|
||||
#define O_VOICE "voicebox"
|
||||
#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_APPENDIX, O_VOICE)
|
||||
#define O_SPLEEN "spleen"
|
||||
#define O_STOMACH "stomach"
|
||||
#define O_INTESTINE "intestine"
|
||||
#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_SPLEEN, O_APPENDIX, O_VOICE, O_STOMACH, O_INTESTINE)
|
||||
|
||||
// Augments
|
||||
#define O_AUG_TSHADE "integrated thermolensing implant"
|
||||
#define O_AUG_EYES "occular augment"
|
||||
|
||||
#define O_AUG_L_FOREARM "left forearm augment"
|
||||
#define O_AUG_R_FOREARM "right forearm augment"
|
||||
#define O_AUG_L_UPPERARM "left upperarm augment"
|
||||
#define O_AUG_R_UPPERARM "right upperarm augment"
|
||||
#define O_AUG_L_HAND "left hand augment"
|
||||
#define O_AUG_R_HAND "right hand augment"
|
||||
|
||||
#define O_AUG_RIBS "rib augment"
|
||||
#define O_AUG_SPINE "spinal augment"
|
||||
#define O_AUG_PELVIC "pelvic augment"
|
||||
|
||||
// Non-Standard organs
|
||||
#define O_MOUTH "mouth"
|
||||
@@ -210,13 +224,17 @@
|
||||
#define O_GBLADDER "gas bladder"
|
||||
#define O_POLYP "polyp segment"
|
||||
#define O_ANCHOR "anchoring ligament"
|
||||
#define O_REGBRUTE "pneumoregenitor"
|
||||
#define O_REGBURN "thermoregenitor"
|
||||
#define O_REGOXY "respiroregenitor"
|
||||
#define O_REGTOX "toxoregenitor"
|
||||
#define O_ACID "acid gland"
|
||||
#define O_EGG "egg sac"
|
||||
#define O_RESIN "resin spinner"
|
||||
#define O_AREJECT "immune hub"
|
||||
#define O_VENTC "morphoplastic node"
|
||||
#define O_VRLINK "virtual node"
|
||||
#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK)
|
||||
#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_REGBRUTE, O_REGBURN, O_REGOXY, O_REGTOX, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK)
|
||||
|
||||
// External organs, aka limbs
|
||||
#define BP_L_FOOT "l_foot"
|
||||
|
||||
@@ -35,3 +35,4 @@
|
||||
#define SPECIES_MONKEY_NEVREAN "Sparra"
|
||||
#define SPECIES_MONKEY_SERGAL "Saru"
|
||||
#define SPECIES_MONKEY_VULPKANIN "Wolpin"
|
||||
#define SPECIES_WEREBEAST "Werebeast"
|
||||
|
||||
@@ -8,11 +8,12 @@
|
||||
#define CHANNEL_AMBIENCE 1018
|
||||
#define CHANNEL_BUZZ 1017
|
||||
#define CHANNEL_BICYCLE 1016
|
||||
#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel
|
||||
|
||||
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
|
||||
//KEEP IT UPDATED
|
||||
|
||||
#define CHANNEL_HIGHEST_AVAILABLE 1015
|
||||
#define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015
|
||||
|
||||
#define SOUND_MINIMUM_PRESSURE 10
|
||||
#define FALLOFF_SOUNDS 0.5
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#define SPECIES_WHITELIST_SELECTABLE 0x20 // Can select and customize, but not join as
|
||||
|
||||
#define LANGUAGE_SLAVIC "Pan-Slavic"
|
||||
#define LANGUAGE_BIRDSONG "Birdsong"
|
||||
#define LANGUAGE_SAGARU "Sagaru"
|
||||
#define LANGUAGE_CANILUNZT "Canilunzt"
|
||||
|
||||
@@ -36,7 +36,8 @@
|
||||
#define ARCHAEO_ALIEN_ITEM 36
|
||||
#define ARCHAEO_ALIEN_BOAT 37
|
||||
#define ARCHAEO_IMPERION_CIRCUIT 38
|
||||
#define MAX_ARCHAEO 38
|
||||
#define ARCHAEO_TELECUBE 39
|
||||
#define MAX_ARCHAEO 39
|
||||
|
||||
#define DIGSITE_GARDEN 1
|
||||
#define DIGSITE_ANIMAL 2
|
||||
|
||||
@@ -5,3 +5,4 @@ GLOBAL_LIST_EMPTY(stealthminID)
|
||||
GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client
|
||||
GLOBAL_LIST_EMPTY(clients)
|
||||
GLOBAL_LIST_EMPTY(players_by_zlevel)
|
||||
GLOBAL_LIST_EMPTY(round_text_log)
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
var/extension = copytext(path,-4,0)
|
||||
if( !fexists(path) || !(extension in valid_extensions) )
|
||||
src << "<font color='red'>Error: browse_files(): File not found/Invalid file([path]).</font>"
|
||||
to_chat(src, "<font color='red'>Error: browse_files(): File not found/Invalid file([path]).</font>")
|
||||
return
|
||||
|
||||
return path
|
||||
@@ -53,7 +53,7 @@
|
||||
/client/proc/file_spam_check()
|
||||
var/time_to_wait = fileaccess_timer - world.time
|
||||
if(time_to_wait > 0)
|
||||
src << "<font color='red'>Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.</font>"
|
||||
to_chat(src, "<font color='red'>Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.</font>")
|
||||
return 1
|
||||
fileaccess_timer = world.time + FTPDELAY
|
||||
return 0
|
||||
|
||||
@@ -42,40 +42,8 @@ var/global/list/item_vore_blacklist = list(
|
||||
/obj/item/weapon/disk/nuclear,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz)
|
||||
|
||||
var/global/list/digestion_sounds = list(
|
||||
'sound/vore/digest1.ogg',
|
||||
'sound/vore/digest2.ogg',
|
||||
'sound/vore/digest3.ogg',
|
||||
'sound/vore/digest4.ogg',
|
||||
'sound/vore/digest5.ogg',
|
||||
'sound/vore/digest6.ogg',
|
||||
'sound/vore/digest7.ogg',
|
||||
'sound/vore/digest8.ogg',
|
||||
'sound/vore/digest9.ogg',
|
||||
'sound/vore/digest10.ogg',
|
||||
'sound/vore/digest11.ogg',
|
||||
'sound/vore/digest12.ogg')
|
||||
|
||||
var/global/list/death_sounds = list(
|
||||
'sound/vore/death1.ogg',
|
||||
'sound/vore/death2.ogg',
|
||||
'sound/vore/death3.ogg',
|
||||
'sound/vore/death4.ogg',
|
||||
'sound/vore/death5.ogg',
|
||||
'sound/vore/death6.ogg',
|
||||
'sound/vore/death7.ogg',
|
||||
'sound/vore/death8.ogg',
|
||||
'sound/vore/death9.ogg',
|
||||
'sound/vore/death10.ogg')
|
||||
|
||||
var/global/list/hunger_sounds = list(
|
||||
'sound/vore/growl1.ogg',
|
||||
'sound/vore/growl2.ogg',
|
||||
'sound/vore/growl3.ogg',
|
||||
'sound/vore/growl4.ogg',
|
||||
'sound/vore/growl5.ogg')
|
||||
|
||||
var/global/list/vore_sounds = list(
|
||||
//Classic Vore sounds
|
||||
var/global/list/classic_vore_sounds = list(
|
||||
"Gulp" = 'sound/vore/gulp.ogg',
|
||||
"Insert" = 'sound/vore/insert.ogg',
|
||||
"Insertion1" = 'sound/vore/insertion1.ogg',
|
||||
@@ -86,15 +54,55 @@ var/global/list/vore_sounds = list(
|
||||
"Squish2" = 'sound/vore/squish2.ogg',
|
||||
"Squish3" = 'sound/vore/squish3.ogg',
|
||||
"Squish4" = 'sound/vore/squish4.ogg',
|
||||
"Rustle (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
|
||||
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
|
||||
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
|
||||
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
|
||||
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"None" = null)
|
||||
|
||||
var/global/list/struggle_sounds = list(
|
||||
"Squish1" = 'sound/vore/squish1.ogg',
|
||||
"Squish2" = 'sound/vore/squish2.ogg',
|
||||
"Squish3" = 'sound/vore/squish3.ogg',
|
||||
"Squish4" = 'sound/vore/squish4.ogg')
|
||||
var/global/list/classic_release_sounds = list(
|
||||
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
|
||||
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
|
||||
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
|
||||
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
|
||||
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"Splatter" = 'sound/effects/splat.ogg',
|
||||
"None" = null
|
||||
)
|
||||
|
||||
//Poojy's Fancy Sounds
|
||||
var/global/list/fancy_vore_sounds = list(
|
||||
"Gulp" = 'sound/vore/sunesound/pred/swallow_01.ogg',
|
||||
"Swallow" = 'sound/vore/sunesound/pred/swallow_02.ogg',
|
||||
"Insertion1" = 'sound/vore/sunesound/pred/insertion_01.ogg',
|
||||
"Insertion2" = 'sound/vore/sunesound/pred/insertion_02.ogg',
|
||||
"Tauric Swallow" = 'sound/vore/sunesound/pred/taurswallow.ogg',
|
||||
"Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg',
|
||||
"Schlorp" = 'sound/vore/sunesound/pred/schlorp.ogg',
|
||||
"Squish1" = 'sound/vore/sunesound/pred/squish_01.ogg',
|
||||
"Squish2" = 'sound/vore/sunesound/pred/squish_02.ogg',
|
||||
"Squish3" = 'sound/vore/sunesound/pred/squish_03.ogg',
|
||||
"Squish4" = 'sound/vore/sunesound/pred/squish_04.ogg',
|
||||
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
|
||||
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
|
||||
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
|
||||
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
|
||||
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"None" = null
|
||||
)
|
||||
|
||||
var/global/list/fancy_release_sounds = list(
|
||||
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
|
||||
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
|
||||
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
|
||||
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
|
||||
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg',
|
||||
"Pred Escape" = 'sound/vore/sunesound/pred/escape.ogg',
|
||||
"Splatter" = 'sound/effects/splat.ogg',
|
||||
"None" = null
|
||||
)
|
||||
|
||||
var/global/list/global_vore_egg_types = list(
|
||||
"Unathi" = UNATHI_EGG,
|
||||
@@ -124,6 +132,7 @@ var/global/list/tf_vore_egg_types = list(
|
||||
|
||||
var/global/list/edible_trash = list(/obj/item/broken_device,
|
||||
/obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars,
|
||||
/obj/item/device/communicator, //TFF 19/9/19 - add option to nom communicators and commwatches,
|
||||
/obj/item/clothing/mask,
|
||||
/obj/item/clothing/glasses,
|
||||
/obj/item/clothing/gloves,
|
||||
|
||||
@@ -42,4 +42,18 @@
|
||||
for(var/x_pixel = 1 to I.Width())
|
||||
if (I.GetPixel(x_pixel, y_pixel))
|
||||
return y_pixel - 1
|
||||
return null
|
||||
return null
|
||||
|
||||
//Standard behaviour is to cut pixels from the main icon that are covered by pixels from the mask icon unless passed mask_ready, see below.
|
||||
/proc/get_icon_difference(var/icon/main, var/icon/mask, var/mask_ready)
|
||||
/*You should skip prep if the mask is already sprited properly. This significantly improves performance by eliminating most of the realtime icon work.
|
||||
e.g. A 'ready' mask is a mask where the part you want cut out is missing (no pixels, 0 alpha) from the sprite, and everything else is solid white.*/
|
||||
|
||||
if(istype(main) && istype(mask))
|
||||
if(!mask_ready) //Prep the mask if we're using a regular old sprite and not a special-made mask.
|
||||
mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible.
|
||||
mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white.
|
||||
mask.BecomeAlphaMask() //Make all the black pixels vanish (fully transparent), leaving only the white background pixels.
|
||||
|
||||
main.AddAlphaMask(mask) //Make the pixels in the main icon that are in the transparent zone of the mask icon also vanish (fully transparent).
|
||||
return main
|
||||
|
||||
@@ -61,8 +61,8 @@
|
||||
|
||||
/proc/log_access_in(client/new_client)
|
||||
if (config.log_access)
|
||||
var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
|
||||
WRITE_LOG(diary, "ACCESS IN: [message]")
|
||||
var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
|
||||
WRITE_LOG(diary, "ACCESS IN: [message]") //VOREStation Edit
|
||||
|
||||
/proc/log_access_out(mob/last_mob)
|
||||
if (config.log_access)
|
||||
@@ -73,26 +73,46 @@
|
||||
if (config.log_say)
|
||||
WRITE_LOG(diary, "SAY: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
//Log the message to in-game dialogue logs, as well.
|
||||
if(speaker.client)
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>SAY:</u> - <span style=\"color:#32cd32\">[text]</span>"
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>SAY:</u> - <span style=\"color:#32cd32\">[text]</span>"
|
||||
|
||||
/proc/log_ooc(text, client/user)
|
||||
if (config.log_ooc)
|
||||
WRITE_LOG(diary, "OOC: [user.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[user]</b>) <u>OOC:</u> - <span style=\"color:blue\"><b>[text]</b></span>"
|
||||
|
||||
/proc/log_aooc(text, client/user)
|
||||
if (config.log_ooc)
|
||||
WRITE_LOG(diary, "AOOC: [user.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[user]</b>) <u>AOOC:</u> - <span style=\"color:red\"><b>[text]</b></span>"
|
||||
|
||||
/proc/log_looc(text, client/user)
|
||||
if (config.log_ooc)
|
||||
WRITE_LOG(diary, "LOOC: [user.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[user]</b>) <u>LOOC:</u> - <span style=\"color:orange\"><b>[text]</b></span>"
|
||||
|
||||
/proc/log_whisper(text, mob/speaker)
|
||||
if (config.log_whisper)
|
||||
WRITE_LOG(diary, "WHISPER: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
if(speaker.client)
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>SAY:</u> - <span style=\"color:gray\"><i>[text]</i></span>"
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>SAY:</u> - <span style=\"color:gray\"><i>[text]</i></span>"
|
||||
|
||||
|
||||
/proc/log_emote(text, mob/speaker)
|
||||
if (config.log_emote)
|
||||
WRITE_LOG(diary, "EMOTE: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
if(speaker.client)
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>EMOTE:</u> - <span style=\"color:#CCBADC\">[text]</span>"
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>EMOTE:</u> - <span style=\"color:#CCBADC\">[text]</span>"
|
||||
|
||||
/proc/log_attack(attacker, defender, message)
|
||||
if (config.log_attack)
|
||||
WRITE_LOG(diary, "ATTACK: [attacker] against [defender]: [message]")
|
||||
@@ -113,6 +133,10 @@
|
||||
if (config.log_say)
|
||||
WRITE_LOG(diary, "DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>DEADSAY:</u> - <span style=\"color:green\">[text]</span>"
|
||||
GLOB.round_text_log += "<font size=1><span style=\"color:#7e668c\"><b>([time_stamp()])</b> (<b>[src]/[speaker.client]</b>) <u>DEADSAY:</u> - [text]</span></font>"
|
||||
|
||||
|
||||
/proc/log_ghostemote(text, mob/speaker)
|
||||
if (config.log_emote)
|
||||
WRITE_LOG(diary, "DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
@@ -125,6 +149,10 @@
|
||||
if (config.log_pda)
|
||||
WRITE_LOG(diary, "PDA: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>MSG:</u> - <span style=\"color:[COLOR_GREEN]\">[text]</span>"
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>MSG:</u> - <span style=\"color:[COLOR_GREEN]\">[text]</span>"
|
||||
|
||||
|
||||
/proc/log_to_dd(text)
|
||||
world.log << text //this comes before the config check because it can't possibly runtime
|
||||
if(config.log_world_output)
|
||||
@@ -222,7 +250,7 @@
|
||||
|
||||
if(include_link && is_special_character(M) && highlight_special_characters)
|
||||
name = "<font color='#FFA500'>[name]</font>" //Orange
|
||||
|
||||
|
||||
. += "/([name])"
|
||||
|
||||
return .
|
||||
|
||||
@@ -358,7 +358,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
break
|
||||
if(newname)
|
||||
break //That's a suitable name!
|
||||
src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
|
||||
to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.")
|
||||
|
||||
if(!newname) //we'll stick with the oldname then
|
||||
return
|
||||
|
||||
+15
-2
@@ -114,6 +114,19 @@
|
||||
trigger_aiming(TARGET_CAN_CLICK)
|
||||
return 1
|
||||
|
||||
// VOREStation Addition Start: inbelly item interaction
|
||||
if(isbelly(loc) && (loc == A.loc))
|
||||
if(W)
|
||||
var/resolved = W.resolve_attackby(A,src)
|
||||
if(!resolved && A && W)
|
||||
W.afterattack(A, src, 1, params) // 1: clicking something Adjacent
|
||||
else
|
||||
if(ismob(A)) // No instant mob attacking
|
||||
setClickCooldown(get_attack_speed())
|
||||
UnarmedAttack(A, 1)
|
||||
return
|
||||
// VOREStation Addition End
|
||||
|
||||
if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that
|
||||
return
|
||||
|
||||
@@ -170,7 +183,7 @@
|
||||
/mob/living/UnarmedAttack(var/atom/A, var/proximity_flag)
|
||||
|
||||
if(!ticker)
|
||||
src << "You cannot attack people before the game has started."
|
||||
to_chat(src, "You cannot attack people before the game has started.")
|
||||
return 0
|
||||
|
||||
if(stat)
|
||||
@@ -303,7 +316,7 @@
|
||||
nutrition = max(nutrition - rand(1,5),0)
|
||||
handle_regular_hud_updates()
|
||||
else
|
||||
src << "<span class='warning'>You're out of energy! You need food!</span>"
|
||||
to_chat(src, "<span class='warning'>You're out of energy! You need food!</span>")
|
||||
|
||||
// Simple helper to face what you clicked on, in case it should be needed in more than one place
|
||||
/mob/proc/face_atom(var/atom/A)
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
if(is_component_functioning("camera"))
|
||||
aiCamera.captureimage(A, usr)
|
||||
else
|
||||
src << "<span class='userdanger'>Your camera isn't functional.</span>"
|
||||
to_chat(src, "<span class='userdanger'>Your camera isn't functional.</span>")
|
||||
return
|
||||
|
||||
/*
|
||||
|
||||
@@ -282,7 +282,7 @@
|
||||
if(!mob)
|
||||
return // Paranoid.
|
||||
if(isnull(slot) || !isnum(slot))
|
||||
src << "<span class='warning'>.activate_ability requires a number as input, corrisponding to the slot you wish to use.</span>"
|
||||
to_chat(src, "<span class='warning'>.activate_ability requires a number as input, corrisponding to the slot you wish to use.</span>")
|
||||
return // Bad input.
|
||||
if(!mob.ability_master)
|
||||
return // No abilities.
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
if(!client) return
|
||||
client.inquisitive_ghost = !client.inquisitive_ghost
|
||||
if(client.inquisitive_ghost)
|
||||
src << "<span class='notice'>You will now examine everything you click on.</span>"
|
||||
to_chat(src, "<span class='notice'>You will now examine everything you click on.</span>")
|
||||
else
|
||||
src << "<span class='notice'>You will no longer examine things you click on.</span>"
|
||||
to_chat(src, "<span class='notice'>You will no longer examine things you click on.</span>")
|
||||
|
||||
/mob/observer/dead/DblClickOn(var/atom/A, var/params)
|
||||
if(client.buildmode)
|
||||
|
||||
@@ -18,15 +18,15 @@
|
||||
|
||||
switch(hardsuit_click_mode)
|
||||
if(MIDDLE_CLICK)
|
||||
src << "Hardsuit activation mode set to middle-click."
|
||||
to_chat(src, "Hardsuit activation mode set to middle-click.")
|
||||
if(ALT_CLICK)
|
||||
src << "Hardsuit activation mode set to alt-click."
|
||||
to_chat(src, "Hardsuit activation mode set to alt-click.")
|
||||
if(CTRL_CLICK)
|
||||
src << "Hardsuit activation mode set to control-click."
|
||||
to_chat(src, "Hardsuit activation mode set to control-click.")
|
||||
else
|
||||
// should never get here, but just in case:
|
||||
soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]")
|
||||
src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click."
|
||||
to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.")
|
||||
hardsuit_click_mode = MIDDLE_CLICK
|
||||
|
||||
/mob/living/MiddleClickOn(atom/A)
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
var/datum/controller/process/planet/planet_controller = null
|
||||
|
||||
/datum/controller/process/planet
|
||||
var/list/planets = list()
|
||||
var/list/z_to_planet = list()
|
||||
|
||||
/datum/controller/process/planet/setup()
|
||||
name = "planet controller"
|
||||
planet_controller = src
|
||||
schedule_interval = 1 MINUTE
|
||||
start_delay = 20 SECONDS
|
||||
|
||||
var/list/planet_datums = typesof(/datum/planet) - /datum/planet
|
||||
for(var/P in planet_datums)
|
||||
var/datum/planet/NP = new P()
|
||||
planets.Add(NP)
|
||||
|
||||
allocateTurfs()
|
||||
|
||||
/datum/controller/process/planet/proc/allocateTurfs()
|
||||
for(var/turf/simulated/OT in outdoor_turfs)
|
||||
for(var/datum/planet/P in planets)
|
||||
if(OT.z in P.expected_z_levels)
|
||||
P.planet_floors |= OT
|
||||
OT.vis_contents |= P.weather_holder.visuals
|
||||
break
|
||||
outdoor_turfs.Cut() //Why were you in there INCORRECTLY?
|
||||
|
||||
for(var/turf/unsimulated/wall/planetary/PW in planetary_walls)
|
||||
for(var/datum/planet/P in planets)
|
||||
if(PW.type == P.planetary_wall_type)
|
||||
P.planet_walls |= PW
|
||||
break
|
||||
planetary_walls.Cut()
|
||||
|
||||
/datum/controller/process/planet/proc/unallocateTurf(var/turf/T)
|
||||
for(var/planet in planets)
|
||||
var/datum/planet/P = planet
|
||||
if(T.z in P.expected_z_levels)
|
||||
P.planet_floors -= T
|
||||
T.vis_contents -= P.weather_holder.visuals
|
||||
|
||||
/datum/controller/process/planet/doWork()
|
||||
if(outdoor_turfs.len || planetary_walls.len)
|
||||
allocateTurfs()
|
||||
|
||||
for(var/datum/planet/P in planets)
|
||||
P.process(schedule_interval / 10)
|
||||
SCHECK //Your process() really shouldn't take this long...
|
||||
|
||||
//Sun light needs changing
|
||||
if(P.needs_work & PLANET_PROCESS_SUN)
|
||||
P.needs_work &= ~PLANET_PROCESS_SUN
|
||||
// Remove old value from corners
|
||||
var/list/sunlit_corners = P.sunlit_corners
|
||||
var/old_lum_r = -P.sun["lum_r"]
|
||||
var/old_lum_g = -P.sun["lum_g"]
|
||||
var/old_lum_b = -P.sun["lum_b"]
|
||||
if(old_lum_r || old_lum_g || old_lum_b)
|
||||
for(var/C in P.sunlit_corners)
|
||||
var/datum/lighting_corner/LC = C
|
||||
LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b)
|
||||
SCHECK
|
||||
sunlit_corners.Cut()
|
||||
|
||||
// Calculate new values to apply
|
||||
var/new_brightness = P.sun["brightness"]
|
||||
var/new_color = P.sun["color"]
|
||||
var/lum_r = new_brightness * GetRedPart (new_color) / 255
|
||||
var/lum_g = new_brightness * GetGreenPart(new_color) / 255
|
||||
var/lum_b = new_brightness * GetBluePart (new_color) / 255
|
||||
var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs.
|
||||
for(var/I in P.planet_floors)
|
||||
var/turf/simulated/T = I
|
||||
if(!T.lighting_corners_initialised)
|
||||
T.generate_missing_corners()
|
||||
for(var/C in T.get_corners())
|
||||
var/datum/lighting_corner/LC = C
|
||||
if(LC.update_gen != update_gen && LC.active)
|
||||
sunlit_corners += LC
|
||||
LC.update_gen = update_gen
|
||||
LC.update_lumcount(lum_r, lum_g, lum_b)
|
||||
SCHECK
|
||||
update_gen--
|
||||
P.sun["lum_r"] = lum_r
|
||||
P.sun["lum_g"] = lum_g
|
||||
P.sun["lum_b"] = lum_b
|
||||
|
||||
//Temperature needs updating
|
||||
if(P.needs_work & PLANET_PROCESS_TEMP)
|
||||
P.needs_work &= ~PLANET_PROCESS_TEMP
|
||||
//Set new temperatures
|
||||
for(var/W in P.planet_walls)
|
||||
var/turf/unsimulated/wall/planetary/wall = W
|
||||
wall.set_temperature(P.weather_holder.temperature)
|
||||
SCHECK
|
||||
@@ -1,56 +0,0 @@
|
||||
/datum/controller/process/radiation
|
||||
var/repository/radiation/linked = null
|
||||
|
||||
/datum/controller/process/radiation/setup()
|
||||
name = "radiation controller"
|
||||
schedule_interval = 20 // every 2 seconds
|
||||
linked = radiation_repository
|
||||
|
||||
/datum/controller/process/radiation/doWork()
|
||||
sources_decay()
|
||||
cache_expires()
|
||||
irradiate_targets()
|
||||
|
||||
// Step 1 - Sources Decay
|
||||
/datum/controller/process/radiation/proc/sources_decay()
|
||||
var/list/sources = linked.sources
|
||||
for(var/thing in sources)
|
||||
var/datum/radiation_source/S = thing
|
||||
if(QDELETED(S))
|
||||
sources.Remove(S)
|
||||
continue
|
||||
if(S.decay)
|
||||
S.update_rad_power(S.rad_power - config.radiation_decay_rate)
|
||||
if(S.rad_power <= config.radiation_lower_limit)
|
||||
sources.Remove(S)
|
||||
SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case.
|
||||
|
||||
// Step 2 - Cache Expires
|
||||
/datum/controller/process/radiation/proc/cache_expires()
|
||||
var/list/resistance_cache = linked.resistance_cache
|
||||
for(var/thing in resistance_cache)
|
||||
var/turf/T = thing
|
||||
if(QDELETED(T))
|
||||
resistance_cache.Remove(T)
|
||||
continue
|
||||
if((length(T.contents) + 1) != resistance_cache[T])
|
||||
resistance_cache.Remove(T) // If its stale REMOVE it! It will get added if its needed.
|
||||
SCHECK
|
||||
|
||||
// Step 3 - Registered irradiatable things are checked for radiation
|
||||
/datum/controller/process/radiation/proc/irradiate_targets()
|
||||
var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway.
|
||||
if(length(linked.sources) > 0)
|
||||
for(var/thing in registered_listeners)
|
||||
var/atom/A = thing
|
||||
if(QDELETED(A))
|
||||
continue
|
||||
var/turf/T = get_turf(thing)
|
||||
var/rads = linked.get_rads_at_turf(T)
|
||||
if(rads)
|
||||
A.rad_act(rads)
|
||||
SCHECK
|
||||
|
||||
/datum/controller/process/radiation/statProcess()
|
||||
..()
|
||||
stat(null, "[linked.sources.len] sources, [linked.resistance_cache.len] cached turfs")
|
||||
@@ -1,169 +0,0 @@
|
||||
/var/datum/controller/process/scheduler/scheduler
|
||||
|
||||
/************
|
||||
* Scheduler *
|
||||
************/
|
||||
/datum/controller/process/scheduler
|
||||
var/list/scheduled_tasks
|
||||
|
||||
/datum/controller/process/scheduler/setup()
|
||||
name = "scheduler"
|
||||
schedule_interval = 1 SECOND
|
||||
scheduled_tasks = list()
|
||||
scheduler = src
|
||||
|
||||
/datum/controller/process/scheduler/doWork()
|
||||
var/world_time = world.time
|
||||
for(last_object in scheduled_tasks)
|
||||
var/datum/scheduled_task/scheduled_task = last_object
|
||||
if(world_time < scheduled_task.trigger_time)
|
||||
break // Too early for this one, and therefore too early for all remaining.
|
||||
try
|
||||
unschedule(scheduled_task)
|
||||
scheduled_task.pre_process()
|
||||
scheduled_task.process()
|
||||
scheduled_task.post_process()
|
||||
catch(var/exception/e)
|
||||
catchException(e, last_object)
|
||||
SCHECK
|
||||
|
||||
// We've been restarted, probably due to having a massive list of tasks.
|
||||
// Lets copy over the task list as safely as we can and try to chug thru it...
|
||||
// Note: We won't be informed about tasks being destroyed, but this is the best we can do.
|
||||
/datum/controller/process/scheduler/copyStateFrom(var/datum/controller/process/scheduler/target)
|
||||
scheduled_tasks = list()
|
||||
for(var/datum/scheduled_task/st in target.scheduled_tasks)
|
||||
if(!QDELETED(st) && istype(st))
|
||||
schedule(st)
|
||||
scheduler = src
|
||||
|
||||
// We are being killed. Least we can do is deregister all those events we registered
|
||||
/datum/controller/process/scheduler/onKill()
|
||||
for(var/st in scheduled_tasks)
|
||||
GLOB.destroyed_event.unregister(st, src)
|
||||
|
||||
/datum/controller/process/scheduler/statProcess()
|
||||
..()
|
||||
stat(null, "[scheduled_tasks.len] task\s")
|
||||
|
||||
/datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st)
|
||||
dd_insertObjectList(scheduled_tasks, st)
|
||||
|
||||
/datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st)
|
||||
scheduled_tasks -= st
|
||||
|
||||
/**********
|
||||
* Helpers *
|
||||
**********/
|
||||
/proc/schedule_task_in(var/in_time, var/procedure, var/list/arguments = list())
|
||||
return schedule_task(world.time + in_time, procedure, arguments)
|
||||
|
||||
/proc/schedule_callback_in(var/in_time, var/datum/callback)
|
||||
return schedule_callback(world.time + in_time, callback)
|
||||
|
||||
/proc/schedule_task_with_source_in(var/in_time, var/source, var/procedure, var/list/arguments = list())
|
||||
return schedule_task_with_source(world.time + in_time, source, procedure, arguments)
|
||||
|
||||
/proc/schedule_task(var/trigger_time, var/procedure, var/list/arguments)
|
||||
var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/destroy_scheduled_task, list())
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/proc/schedule_callback(var/trigger_time, var/datum/callback)
|
||||
var/datum/scheduled_task/callback/st = new/datum/scheduled_task/callback(trigger_time, callback, /proc/destroy_scheduled_task, list())
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/proc/schedule_task_with_source(var/trigger_time, var/source, var/procedure, var/list/arguments)
|
||||
var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/destroy_scheduled_task, list())
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/proc/schedule_repeating_task(var/trigger_time, var/repeat_interval, var/procedure, var/list/arguments)
|
||||
var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval))
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/proc/schedule_repeating_task_with_source(var/trigger_time, var/repeat_interval, var/source, var/procedure, var/list/arguments)
|
||||
var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval))
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/*************
|
||||
* Task Datum *
|
||||
*************/
|
||||
/datum/scheduled_task
|
||||
var/trigger_time
|
||||
var/procedure
|
||||
var/list/arguments
|
||||
var/task_after_process
|
||||
var/list/task_after_process_args
|
||||
|
||||
/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
|
||||
..()
|
||||
src.trigger_time = trigger_time
|
||||
src.procedure = procedure
|
||||
src.arguments = arguments ? arguments : list()
|
||||
src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task
|
||||
src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list()
|
||||
task_after_process_args += src
|
||||
|
||||
/datum/scheduled_task/Destroy()
|
||||
scheduler.unschedule(src)
|
||||
procedure = null
|
||||
arguments.Cut()
|
||||
task_after_process = null
|
||||
task_after_process_args.Cut()
|
||||
return ..()
|
||||
|
||||
/datum/scheduled_task/dd_SortValue()
|
||||
return trigger_time
|
||||
|
||||
/datum/scheduled_task/proc/pre_process()
|
||||
task_triggered_event.raise_event(list(src))
|
||||
|
||||
/datum/scheduled_task/proc/process()
|
||||
if(procedure)
|
||||
call(procedure)(arglist(arguments))
|
||||
|
||||
/datum/scheduled_task/proc/post_process()
|
||||
call(task_after_process)(arglist(task_after_process_args))
|
||||
|
||||
// Resets the trigger time, has no effect if the task has already triggered
|
||||
/datum/scheduled_task/proc/trigger_task_in(var/trigger_in)
|
||||
src.trigger_time = world.time + trigger_in
|
||||
|
||||
/datum/scheduled_task/callback
|
||||
var/datum/callback/callback
|
||||
|
||||
/datum/scheduled_task/callback/New(var/trigger_time, var/datum/callback, var/proc/task_after_process, var/list/task_after_process_args)
|
||||
src.callback = callback
|
||||
..(trigger_time = trigger_time, task_after_process = task_after_process, task_after_process_args = task_after_process_args)
|
||||
|
||||
/datum/scheduled_task/callback/process()
|
||||
callback.Invoke()
|
||||
|
||||
/datum/scheduled_task/source
|
||||
var/datum/source
|
||||
|
||||
/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
|
||||
src.source = source
|
||||
GLOB.destroyed_event.register(src.source, src, /datum/scheduled_task/source/proc/source_destroyed)
|
||||
..(trigger_time, procedure, arguments, task_after_process, task_after_process_args)
|
||||
|
||||
/datum/scheduled_task/source/Destroy()
|
||||
source = null
|
||||
return ..()
|
||||
|
||||
/datum/scheduled_task/source/process()
|
||||
call(source, procedure)(arglist(arguments))
|
||||
|
||||
/datum/scheduled_task/source/proc/source_destroyed()
|
||||
qdel(src)
|
||||
|
||||
/proc/destroy_scheduled_task(var/datum/scheduled_task/st)
|
||||
qdel(st)
|
||||
|
||||
/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st)
|
||||
st.trigger_time = world.time + trigger_delay
|
||||
scheduler.schedule(st)
|
||||
@@ -240,9 +240,9 @@ SUBSYSTEM_DEF(garbage)
|
||||
time = TICK_DELTA_TO_MS(tick)/100
|
||||
if (time > highest_del_time)
|
||||
highest_del_time = time
|
||||
if (time > 10)
|
||||
log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)")
|
||||
message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).")
|
||||
if (time > 20) //VOREStation Edit
|
||||
log_game("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete)") //VOREStation Edit
|
||||
message_admins("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete).") //VOREStation Edit
|
||||
postpone(time)
|
||||
|
||||
/datum/controller/subsystem/garbage/proc/HardQueue(datum/D)
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
SUBSYSTEM_DEF(radiation)
|
||||
name = "Radiation"
|
||||
wait = 2 SECONDS
|
||||
flags = SS_NO_INIT
|
||||
|
||||
var/list/sources = list() // all radiation source datums
|
||||
var/list/sources_assoc = list() // Sources indexed by turf for de-duplication.
|
||||
var/list/resistance_cache = list() // Cache of turf's radiation resistance.
|
||||
|
||||
var/tmp/list/current_sources = list()
|
||||
var/tmp/list/current_res_cache = list()
|
||||
var/tmp/list/listeners = list()
|
||||
|
||||
/datum/controller/subsystem/radiation/fire(resumed = FALSE)
|
||||
if (!resumed)
|
||||
current_sources = sources.Copy()
|
||||
current_res_cache = resistance_cache.Copy()
|
||||
listeners = living_mob_list.Copy()
|
||||
|
||||
while(current_sources.len)
|
||||
var/datum/radiation_source/S = current_sources[current_sources.len]
|
||||
current_sources.len--
|
||||
|
||||
if(QDELETED(S))
|
||||
sources -= S
|
||||
else if(S.decay)
|
||||
S.update_rad_power(S.rad_power - config.radiation_decay_rate)
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
while(current_res_cache.len)
|
||||
var/turf/T = current_res_cache[current_res_cache.len]
|
||||
current_res_cache.len--
|
||||
|
||||
if(QDELETED(T))
|
||||
resistance_cache -= T
|
||||
else if((length(T.contents) + 1) != resistance_cache[T])
|
||||
resistance_cache -= T // If its stale REMOVE it! It will get added if its needed.
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
if(!sources.len)
|
||||
listeners.Cut()
|
||||
|
||||
while(listeners.len)
|
||||
var/atom/A = listeners[listeners.len]
|
||||
listeners.len--
|
||||
|
||||
if(!QDELETED(A))
|
||||
var/turf/T = get_turf(A)
|
||||
var/rads = get_rads_at_turf(T)
|
||||
if(rads)
|
||||
A.rad_act(rads)
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/radiation/stat_entry()
|
||||
..("S:[sources.len], RC:[resistance_cache.len]")
|
||||
|
||||
// Ray trace from all active radiation sources to T and return the strongest effect.
|
||||
/datum/controller/subsystem/radiation/proc/get_rads_at_turf(var/turf/T)
|
||||
. = 0
|
||||
if(!istype(T))
|
||||
return
|
||||
|
||||
for(var/value in sources)
|
||||
var/datum/radiation_source/source = value
|
||||
if(source.rad_power < .)
|
||||
continue // Already being affected by a stronger source
|
||||
if(source.source_turf.z != T.z)
|
||||
continue // Radiation is not multi-z
|
||||
if(source.respect_maint)
|
||||
var/area/A = T.loc
|
||||
if(A.flags & RAD_SHIELDED)
|
||||
continue // In shielded area
|
||||
|
||||
var/dist = get_dist(source.source_turf, T)
|
||||
if(dist > source.range)
|
||||
continue // Too far to possibly affect
|
||||
if(source.flat)
|
||||
. = max(., source.rad_power)
|
||||
continue // No need to ray trace for flat field
|
||||
|
||||
// Okay, now ray trace to find resistence!
|
||||
var/turf/origin = source.source_turf
|
||||
var/working = source.rad_power
|
||||
while(origin != T)
|
||||
origin = get_step_towards(origin, T) //Raytracing
|
||||
if(!resistance_cache[origin]) //Only get the resistance if we don't already know it.
|
||||
origin.calc_rad_resistance()
|
||||
if(origin.cached_rad_resistance)
|
||||
working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.1)
|
||||
if((working <= .) || (working <= RADIATION_THRESHOLD_CUTOFF))
|
||||
break // Already affected by a stronger source (or its zero...)
|
||||
. = max((working / (dist ** 2)), .) //Butchered version of the inverse square law. Works for this purpose
|
||||
if(. <= RADIATION_THRESHOLD_CUTOFF)
|
||||
. = 0
|
||||
|
||||
// Add a radiation source instance to the repository. It will override any existing source on the same turf.
|
||||
/datum/controller/subsystem/radiation/proc/add_source(var/datum/radiation_source/S)
|
||||
if(!isturf(S.source_turf))
|
||||
return
|
||||
var/datum/radiation_source/existing = sources_assoc[S.source_turf]
|
||||
if(existing)
|
||||
qdel(existing)
|
||||
sources += S
|
||||
sources_assoc[S.source_turf] = S
|
||||
|
||||
// Creates a temporary radiation source that will decay
|
||||
/datum/controller/subsystem/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account
|
||||
if(!(source && power)) //Sanity checking
|
||||
return
|
||||
var/datum/radiation_source/S = new()
|
||||
S.source_turf = get_turf(source)
|
||||
S.update_rad_power(power)
|
||||
add_source(S)
|
||||
|
||||
// Sets the radiation in a range to a constant value.
|
||||
/datum/controller/subsystem/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
||||
if(!(source && power && range))
|
||||
return
|
||||
var/datum/radiation_source/S = new()
|
||||
S.flat = TRUE
|
||||
S.range = range
|
||||
S.respect_maint = respect_maint
|
||||
S.source_turf = get_turf(source)
|
||||
S.update_rad_power(power)
|
||||
add_source(S)
|
||||
|
||||
// Irradiates a full Z-level. Hacky way of doing it, but not too expensive.
|
||||
/datum/controller/subsystem/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
||||
if(!(power && source))
|
||||
return
|
||||
var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z)
|
||||
flat_radiate(epicentre, power, world.maxx, respect_maint)
|
||||
@@ -105,7 +105,7 @@ SUBSYSTEM_DEF(vote)
|
||||
factor = 1.4
|
||||
choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor)
|
||||
world << "<font color='purple'>Crew Transfer Factor: [factor]</font>"
|
||||
greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"])
|
||||
greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit
|
||||
|
||||
. = list() // Get all options with that many votes and return them in a list
|
||||
if(greatest_votes)
|
||||
@@ -220,8 +220,8 @@ SUBSYSTEM_DEF(vote)
|
||||
if(ticker.current_state <= GAME_STATE_SETTING_UP)
|
||||
initiator_key << "The crew transfer button has been disabled!"
|
||||
return 0
|
||||
question = "End the shift?"
|
||||
choices.Add("Initiate Crew Transfer", "Continue The Round")
|
||||
question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //VOREStation Edit
|
||||
choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
|
||||
if(VOTE_ADD_ANTAGONIST)
|
||||
if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
|
||||
return 0
|
||||
|
||||
@@ -32,3 +32,21 @@
|
||||
name = "magazine (.44 rubber)"
|
||||
path =/obj/item/ammo_magazine/m44/rubber
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/classic_smg_9mm
|
||||
name = "SMG magazine (9mm)"
|
||||
path = /obj/item/ammo_magazine/m9mml
|
||||
hidden = 1
|
||||
/* De-coded?
|
||||
/datum/category_item/autolathe/arms/classic_smg_9mmr
|
||||
name = "SMG magazine (9mm rubber)"
|
||||
path = /obj/item/ammo_magazine/m9mml/rubber
|
||||
|
||||
/datum/category_item/autolathe/arms/classic_smg_9mmp
|
||||
name = "SMG magazine (9mm practice)"
|
||||
path = /obj/item/ammo_magazine/m9mml/practice
|
||||
|
||||
/datum/category_item/autolathe/arms/classic_smg_9mmf
|
||||
name = "SMG magazine (9mm flash)"
|
||||
path = /obj/item/ammo_magazine/m9mml/flash
|
||||
*/
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/category_item/autolathe/engineering/timeclock
|
||||
name = "timeclock electronics"
|
||||
path =/obj/item/weapon/circuitboard/timeclock
|
||||
|
||||
/datum/category_item/autolathe/engineering/id_restorer
|
||||
name = "ID restoration console electronics"
|
||||
path =/obj/item/weapon/circuitboard/id_restorer
|
||||
@@ -117,7 +117,7 @@
|
||||
/datum/ghost_query/lost_drone
|
||||
role_name = "Lost Drone"
|
||||
question = "A lost drone onboard has been discovered by a crewmember and they are attempting to reactivate it. Would you like to play as the drone?"
|
||||
be_special_flag = BE_AI
|
||||
//be_special_flag = BE_AI //VOREStation Removal: Positronic role is never used because intended purpose is unfitting, so remove the check
|
||||
check_bans = list("AI", "Cyborg")
|
||||
cutoff_number = 1
|
||||
|
||||
|
||||
@@ -35,10 +35,10 @@ client/verb/showrevinfo()
|
||||
set desc = "Check the current server code revision"
|
||||
|
||||
if(revdata.revision)
|
||||
src << "<b>Server revision:</b> [revdata.branch] - [revdata.date]"
|
||||
to_chat(src, "<b>Server revision:</b> [revdata.branch] - [revdata.date]")
|
||||
if(config.githuburl)
|
||||
src << "<a href='[config.githuburl]/commit/[revdata.revision]'>[revdata.revision]</a>"
|
||||
to_chat(src, "<a href='[config.githuburl]/commit/[revdata.revision]'>[revdata.revision]</a>")
|
||||
else
|
||||
src << revdata.revision
|
||||
else
|
||||
src << "Revision unknown"
|
||||
to_chat(src, "Revision unknown")
|
||||
|
||||
@@ -43,4 +43,15 @@
|
||||
mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1)
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/microwave/microwave-end.ogg'
|
||||
volume = 90
|
||||
volume = 90
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/air_pump
|
||||
start_sound = 'sound/machines/air_pump/airpumpstart.ogg'
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/air_pump/airpumpidle.ogg' = 1)
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg'
|
||||
volume = 20
|
||||
pref_check = /datum/client_preference/air_pump_noise
|
||||
@@ -44,6 +44,14 @@
|
||||
name = OUTFIT_JOB_NAME("Cook")
|
||||
id_pda_assignment = "Cook"
|
||||
|
||||
// Rykka adds Server Outfit
|
||||
|
||||
/decl/hierarchy/outfit/job/service/server
|
||||
name = OUTFIT_JOB_NAME("Server")
|
||||
uniform = /obj/item/clothing/under/waiter
|
||||
|
||||
// End Outfit addition
|
||||
|
||||
/decl/hierarchy/outfit/job/service/gardener
|
||||
name = OUTFIT_JOB_NAME("Gardener")
|
||||
uniform = /obj/item/clothing/under/rank/hydroponics
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/decl/hierarchy/outfit/military/fleet/pt
|
||||
name = OUTFIT_MILITARY("Fleet PT")
|
||||
uniform = /obj/item/clothing/under/pt/fleet
|
||||
uniform = /obj/item/clothing/under/solgov/pt/fleet
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
|
||||
/decl/hierarchy/outfit/military/fleet/utility
|
||||
name = OUTFIT_MILITARY("Fleet Utility")
|
||||
uniform = /obj/item/clothing/under/utility/fleet
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
uniform = /obj/item/clothing/under/solgov/utility/fleet
|
||||
shoes = /obj/item/clothing/shoes/boots/duty
|
||||
|
||||
/decl/hierarchy/outfit/military/fleet/service
|
||||
name = OUTFIT_MILITARY("Fleet Service")
|
||||
uniform = /obj/item/clothing/under/service/fleet
|
||||
uniform = /obj/item/clothing/under/solgov/service/fleet
|
||||
shoes = /obj/item/clothing/shoes/dress/white
|
||||
|
||||
/decl/hierarchy/outfit/military/fleet/dress
|
||||
name = OUTFIT_MILITARY("Fleet Dress")
|
||||
uniform = /obj/item/clothing/under/service/fleet
|
||||
uniform = /obj/item/clothing/under/solgov/service/fleet
|
||||
shoes = /obj/item/clothing/shoes/dress/white
|
||||
suit = /obj/item/clothing/suit/storage/toggle/dress/fleet
|
||||
gloves = /obj/item/clothing/gloves/white
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/decl/hierarchy/outfit/military/marine/pt
|
||||
name = OUTFIT_MILITARY("Marine PT")
|
||||
uniform = /obj/item/clothing/under/pt/marine
|
||||
uniform = /obj/item/clothing/under/solgov/pt/marine
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
|
||||
/decl/hierarchy/outfit/military/marine/utility
|
||||
name = OUTFIT_MILITARY("Marine Utility")
|
||||
uniform = /obj/item/clothing/under/utility/marine
|
||||
uniform = /obj/item/clothing/under/solgov/utility/marine
|
||||
shoes = /obj/item/clothing/shoes/boots/jungle
|
||||
|
||||
/decl/hierarchy/outfit/military/marine/service
|
||||
name = OUTFIT_MILITARY("Marine Service")
|
||||
uniform = /obj/item/clothing/under/service/marine
|
||||
uniform = /obj/item/clothing/under/solgov/service/marine
|
||||
shoes = /obj/item/clothing/shoes/dress
|
||||
suit = /obj/item/clothing/suit/storage/service/marine
|
||||
|
||||
/decl/hierarchy/outfit/military/marine/dress
|
||||
name = OUTFIT_MILITARY("Marine Dress")
|
||||
uniform = /obj/item/clothing/under/mildress/marine
|
||||
uniform = /obj/item/clothing/under/solgov/mildress/marine
|
||||
shoes = /obj/item/clothing/shoes/dress/white
|
||||
suit = /obj/item/clothing/suit/dress/marine
|
||||
gloves = /obj/item/clothing/gloves/white
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/decl/hierarchy/outfit/military/sifguard/pt
|
||||
name = OUTFIT_MILITARY("SifGuard PT")
|
||||
uniform = /obj/item/clothing/under/pt/sifguard
|
||||
uniform = /obj/item/clothing/under/solgov/pt/sifguard
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
|
||||
/decl/hierarchy/outfit/military/sifguard/utility
|
||||
name = OUTFIT_MILITARY("SifGuard Utility")
|
||||
uniform = /obj/item/clothing/under/utility/sifguard
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
uniform = /obj/item/clothing/under/solgov/utility/sifguard
|
||||
shoes = /obj/item/clothing/shoes/boots/tactical
|
||||
|
||||
/decl/hierarchy/outfit/military/sifguard/service
|
||||
name = OUTFIT_MILITARY("SifGuard Service")
|
||||
uniform = /obj/item/clothing/under/utility/sifguard
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
uniform = /obj/item/clothing/under/solgov/utility/sifguard
|
||||
shoes = /obj/item/clothing/shoes/boots/tactical
|
||||
suit = /obj/item/clothing/suit/storage/service/sifguard
|
||||
|
||||
/decl/hierarchy/outfit/military/sifguard/dress
|
||||
name = OUTFIT_MILITARY("SifGuard Dress")
|
||||
uniform = /obj/item/clothing/under/mildress/sifguard
|
||||
uniform = /obj/item/clothing/under/solgov/mildress/sifguard
|
||||
shoes = /obj/item/clothing/shoes/dress
|
||||
suit = /obj/item/clothing/suit/dress/expedition
|
||||
gloves = /obj/item/clothing/gloves/white
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/decl/hierarchy/outfit/USDF/Marine
|
||||
name = "USDF marine"
|
||||
uniform = /obj/item/clothing/under/utility/marine/green
|
||||
uniform = /obj/item/clothing/under/solgov/utility/marine/green
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
l_ear = /obj/item/device/radio/headset/centcom
|
||||
@@ -30,7 +30,7 @@
|
||||
head = /obj/item/clothing/head/dress/marine/command/admiral
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
l_ear = /obj/item/device/radio/headset/centcom
|
||||
uniform = /obj/item/clothing/under/mildress/marine/command
|
||||
uniform = /obj/item/clothing/under/solgov/mildress/marine/command
|
||||
back = /obj/item/weapon/storage/backpack/satchel
|
||||
belt = /obj/item/weapon/gun/projectile/revolver/consul
|
||||
l_pocket = /obj/item/ammo_magazine/s44
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
var/global/repository/radiation/radiation_repository = new()
|
||||
|
||||
/repository/radiation
|
||||
var/list/sources = list() // all radiation source datums
|
||||
var/list/sources_assoc = list() // Sources indexed by turf for de-duplication.
|
||||
var/list/resistance_cache = list() // Cache of turf's radiation resistance.
|
||||
|
||||
// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom.
|
||||
// Sources will decay over time, unless something is renewing their power!
|
||||
/datum/radiation_source
|
||||
var/turf/source_turf // Location of the radiation source.
|
||||
var/rad_power // Strength of the radiation being emitted.
|
||||
var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter)
|
||||
var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas.
|
||||
var/flat = FALSE // True for power falloff with distance.
|
||||
var/range // Cached maximum range, used for quick checks against mobs.
|
||||
|
||||
/datum/radiation_source/Destroy()
|
||||
radiation_repository.sources -= src
|
||||
if(radiation_repository.sources_assoc[src.source_turf] == src)
|
||||
radiation_repository.sources_assoc -= src.source_turf
|
||||
src.source_turf = null
|
||||
. = ..()
|
||||
|
||||
/datum/radiation_source/proc/update_rad_power(var/new_power = null)
|
||||
if(new_power == null || new_power == rad_power)
|
||||
return // No change
|
||||
else if(new_power <= 0)
|
||||
qdel(src) // Decayed to nothing
|
||||
else
|
||||
rad_power = new_power
|
||||
if(!flat)
|
||||
range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist
|
||||
|
||||
// Ray trace from all active radiation sources to T and return the strongest effect.
|
||||
/repository/radiation/proc/get_rads_at_turf(var/turf/T)
|
||||
if(!istype(T)) return 0
|
||||
|
||||
. = 0
|
||||
for(var/value in sources)
|
||||
var/datum/radiation_source/source = value
|
||||
if(source.rad_power < .)
|
||||
continue // Already being affected by a stronger source
|
||||
if(source.source_turf.z != T.z)
|
||||
continue // Radiation is not multi-z
|
||||
var/dist = get_dist(source.source_turf, T)
|
||||
if(dist > source.range)
|
||||
continue // Too far to possibly affect
|
||||
if(source.respect_maint)
|
||||
var/atom/A = T.loc
|
||||
if(A.flags & RAD_SHIELDED)
|
||||
continue // In shielded area
|
||||
if(source.flat)
|
||||
. = max(., source.rad_power)
|
||||
continue // No need to ray trace for flat field
|
||||
|
||||
// Okay, now ray trace to find resistence!
|
||||
var/turf/origin = source.source_turf
|
||||
var/working = source.rad_power
|
||||
while(origin != T)
|
||||
origin = get_step_towards(origin, T) //Raytracing
|
||||
if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it.
|
||||
origin.calc_rad_resistance()
|
||||
working = max((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0)
|
||||
if(working <= .)
|
||||
break // Already affected by a stronger source (or its zero...)
|
||||
. = max((working * (1 / (dist ** 2))), .) //Butchered version of the inverse square law. Works for this purpose
|
||||
|
||||
// Add a radiation source instance to the repository. It will override any existing source on the same turf.
|
||||
/repository/radiation/proc/add_source(var/datum/radiation_source/S)
|
||||
if(!isturf(S.source_turf))
|
||||
return
|
||||
var/datum/radiation_source/existing = sources_assoc[S.source_turf]
|
||||
if(existing)
|
||||
qdel(existing)
|
||||
sources += S
|
||||
sources_assoc[S.source_turf] = S
|
||||
|
||||
// Creates a temporary radiation source that will decay
|
||||
/repository/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account
|
||||
if(!(source && power)) //Sanity checking
|
||||
return
|
||||
var/datum/radiation_source/S = new()
|
||||
S.source_turf = get_turf(source)
|
||||
S.update_rad_power(power)
|
||||
add_source(S)
|
||||
|
||||
// Sets the radiation in a range to a constant value.
|
||||
/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
||||
if(!(source && power && range))
|
||||
return
|
||||
var/datum/radiation_source/S = new()
|
||||
S.flat = TRUE
|
||||
S.range = range
|
||||
S.respect_maint = respect_maint
|
||||
S.source_turf = get_turf(source)
|
||||
S.update_rad_power(power)
|
||||
add_source(S)
|
||||
|
||||
// Irradiates a full Z-level. Hacky way of doing it, but not too expensive.
|
||||
/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
||||
if(!(power && source))
|
||||
return
|
||||
var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z)
|
||||
flat_radiate(epicentre, power, world.maxx, respect_maint)
|
||||
|
||||
/turf
|
||||
var/cached_rad_resistance = 0
|
||||
|
||||
/turf/proc/calc_rad_resistance()
|
||||
cached_rad_resistance = 0
|
||||
for(var/obj/O in src.contents)
|
||||
if(O.rad_resistance) //Override
|
||||
cached_rad_resistance += O.rad_resistance
|
||||
|
||||
else if(O.density) //So open doors don't get counted
|
||||
var/material/M = O.get_material()
|
||||
if(!M) continue
|
||||
cached_rad_resistance += M.weight + M.radiation_resistance
|
||||
// Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana
|
||||
radiation_repository.resistance_cache[src] = (length(contents) + 1)
|
||||
|
||||
/turf/simulated/wall/calc_rad_resistance()
|
||||
radiation_repository.resistance_cache[src] = (length(contents) + 1)
|
||||
cached_rad_resistance = (density ? material.weight + material.radiation_resistance : 0)
|
||||
|
||||
/obj
|
||||
var/rad_resistance = 0 // Allow overriding rad resistance
|
||||
|
||||
// If people expand the system, this may be useful. Here as a placeholder until then
|
||||
/atom/proc/rad_act(var/severity)
|
||||
return 1
|
||||
|
||||
/mob/living/rad_act(var/severity)
|
||||
if(severity && !isbelly(loc)) //eaten mobs are made immune to radiation //VOREStation Edit Start
|
||||
src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad"))
|
||||
for(var/atom/I in src)
|
||||
I.rad_act(severity) ///VOREStation Edit End
|
||||
@@ -1,3 +1,6 @@
|
||||
/datum/supply_pack/randomised/hospitality/pizza
|
||||
cost = 50
|
||||
|
||||
/datum/supply_pack/randomised/hospitality/burgers_vr
|
||||
num_contained = 5
|
||||
contains = list(
|
||||
|
||||
@@ -334,4 +334,39 @@
|
||||
contains = list(/obj/item/device/defib_kit = 2)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/medical
|
||||
containername = "Defibrillator crate"
|
||||
containername = "Defibrillator crate"
|
||||
|
||||
/datum/supply_pack/med/distillery
|
||||
name = "Chemical distiller crate"
|
||||
contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery = 1)
|
||||
cost = 175
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Chemical distiller crate"
|
||||
|
||||
/datum/supply_pack/med/advdistillery
|
||||
name = "Industrial Chemical distiller crate"
|
||||
contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial = 1)
|
||||
cost = 250
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Industrial Chemical distiller crate"
|
||||
|
||||
/datum/supply_pack/med/oxypump
|
||||
name = "Oxygen pump crate"
|
||||
contains = list(/obj/machinery/oxygen_pump/mobile = 1)
|
||||
cost = 125
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Oxygen pump crate"
|
||||
|
||||
/datum/supply_pack/med/anestheticpump
|
||||
name = "Anesthetic pump crate"
|
||||
contains = list(/obj/machinery/oxygen_pump/mobile/anesthetic = 1)
|
||||
cost = 130
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Anesthetic pump crate"
|
||||
|
||||
/datum/supply_pack/med/stablepump
|
||||
name = "Portable stabilizer crate"
|
||||
contains = list(/obj/machinery/oxygen_pump/mobile/stabilizer = 1)
|
||||
cost = 175
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Portable stabilizer crate"
|
||||
|
||||
@@ -1,38 +1,50 @@
|
||||
/datum/supply_pack/med/medicalbiosuits
|
||||
contains = list(
|
||||
/obj/item/clothing/head/bio_hood/scientist = 3,
|
||||
/obj/item/clothing/suit/bio_suit/scientist = 3,
|
||||
/obj/item/clothing/suit/bio_suit/virology = 3,
|
||||
/obj/item/clothing/head/bio_hood/virology = 3,
|
||||
/obj/item/clothing/suit/bio_suit/cmo,
|
||||
/obj/item/clothing/head/bio_hood/cmo,
|
||||
/obj/item/clothing/shoes/white = 7,
|
||||
/obj/item/clothing/mask/gas = 7,
|
||||
/obj/item/weapon/tank/oxygen = 7,
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
|
||||
/datum/supply_pack/med/virologybiosuits
|
||||
name = "Virology biohazard gear"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/bio_suit/virology = 3,
|
||||
/obj/item/clothing/head/bio_hood/virology = 3,
|
||||
/obj/item/clothing/mask/gas = 3,
|
||||
/obj/item/weapon/tank/oxygen = 3,
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Virology biohazard equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
/datum/supply_pack/med/virus
|
||||
name = "Virus sample crate"
|
||||
contains = list(/obj/item/weapon/virusdish/random = 4)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Virus sample crate"
|
||||
access = access_medical_equip
|
||||
/datum/supply_pack/med/medicalbiosuits
|
||||
contains = list(
|
||||
/obj/item/clothing/head/bio_hood/scientist = 3,
|
||||
/obj/item/clothing/suit/bio_suit/scientist = 3,
|
||||
/obj/item/clothing/suit/bio_suit/virology = 3,
|
||||
/obj/item/clothing/head/bio_hood/virology = 3,
|
||||
/obj/item/clothing/suit/bio_suit/cmo,
|
||||
/obj/item/clothing/head/bio_hood/cmo,
|
||||
/obj/item/clothing/shoes/white = 7,
|
||||
/obj/item/clothing/mask/gas = 7,
|
||||
/obj/item/weapon/tank/oxygen = 7,
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
|
||||
/datum/supply_pack/med/virologybiosuits
|
||||
name = "Virology biohazard gear"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/bio_suit/virology = 3,
|
||||
/obj/item/clothing/head/bio_hood/virology = 3,
|
||||
/obj/item/clothing/mask/gas = 3,
|
||||
/obj/item/weapon/tank/oxygen = 3,
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Virology biohazard equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
/datum/supply_pack/med/virus
|
||||
name = "Virus sample crate"
|
||||
contains = list(/obj/item/weapon/virusdish/random = 4)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Virus sample crate"
|
||||
access = access_medical_equip
|
||||
|
||||
|
||||
/datum/supply_pack/med/bloodpack
|
||||
containertype = /obj/structure/closet/crate/medical/blood
|
||||
|
||||
/datum/supply_pack/med/compactdefib
|
||||
name = "Compact Defibrillator crate"
|
||||
contains = list(/obj/item/device/defib_kit/compact = 1)
|
||||
cost = 90
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Compact Defibrillator crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -143,4 +143,39 @@
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Glucose Hypo Crate"
|
||||
containername = "Glucose Hypo Crate"
|
||||
|
||||
/datum/supply_pack/misc/mre_rations
|
||||
num_contained = 6
|
||||
name = "Emergency - MREs"
|
||||
contains = list(/obj/item/weapon/storage/mre,
|
||||
/obj/item/weapon/storage/mre/menu2,
|
||||
/obj/item/weapon/storage/mre/menu3,
|
||||
/obj/item/weapon/storage/mre/menu4,
|
||||
/obj/item/weapon/storage/mre/menu5,
|
||||
/obj/item/weapon/storage/mre/menu6,
|
||||
/obj/item/weapon/storage/mre/menu7,
|
||||
/obj/item/weapon/storage/mre/menu8,
|
||||
/obj/item/weapon/storage/mre/menu9,
|
||||
/obj/item/weapon/storage/mre/menu10)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "ready to eat rations"
|
||||
|
||||
/datum/supply_pack/misc/paste_rations
|
||||
name = "Emergency - Paste"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/mre/menu11 = 2
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "emergency rations"
|
||||
|
||||
/datum/supply_pack/misc/medical_rations
|
||||
name = "Emergency - VitaPaste"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/mre/menu13 = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "emergency rations"
|
||||
|
||||
@@ -13,24 +13,6 @@
|
||||
containername = "Belt-miner gear crate"
|
||||
access = access_mining
|
||||
|
||||
/datum/supply_pack/misc/rations
|
||||
name = "Emergency rations"
|
||||
contains = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4,
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "emergency rations"
|
||||
|
||||
/datum/supply_pack/misc/proteinrations
|
||||
name = "Emergency meat rations"
|
||||
contains = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 4,
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "emergency meat rations"
|
||||
|
||||
/datum/supply_pack/misc/eva_rig
|
||||
name = "eva hardsuit (empty)"
|
||||
contains = list(
|
||||
@@ -55,4 +37,44 @@
|
||||
containername = "industrial hardsuit crate"
|
||||
access = list(access_mining,
|
||||
access_eva)
|
||||
one_access = TRUE
|
||||
one_access = TRUE
|
||||
|
||||
/datum/supply_pack/misc/medical_rig
|
||||
name = "medical hardsuit (empty)"
|
||||
contains = list(
|
||||
/obj/item/weapon/rig/medical = 1
|
||||
)
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "medical hardsuit crate"
|
||||
access = access_medical
|
||||
|
||||
/datum/supply_pack/misc/security_rig
|
||||
name = "hazard hardsuit (empty)"
|
||||
contains = list(
|
||||
/obj/item/weapon/rig/hazard = 1
|
||||
)
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "hazard hardsuit crate"
|
||||
access = access_armory
|
||||
|
||||
/datum/supply_pack/misc/science_rig
|
||||
name = "ami hardsuit (empty)"
|
||||
contains = list(
|
||||
/obj/item/weapon/rig/hazmat = 1
|
||||
)
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "ami hardsuit crate"
|
||||
access = access_rd
|
||||
|
||||
/datum/supply_pack/misc/ce_rig
|
||||
name = "advanced voidsuit (empty)"
|
||||
contains = list(
|
||||
/obj/item/weapon/rig/ce = 1
|
||||
)
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "advanced voidsuit crate"
|
||||
access = access_ce
|
||||
|
||||
@@ -34,3 +34,23 @@
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
|
||||
/datum/supply_pack/security/trackingimplant
|
||||
name = "Implants - Tracking"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/box/trackimp = 1
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Tracking implants"
|
||||
access = access_security
|
||||
|
||||
/datum/supply_pack/security/chemicalimplant
|
||||
name = "Implants - Chemical"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/box/chemimp = 1
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Chemical implants"
|
||||
access = access_security
|
||||
|
||||
@@ -23,3 +23,53 @@
|
||||
name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)"
|
||||
item_cost = 50 //Original cost: 10
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
|
||||
|
||||
/datum/uplink_item/item/implants/imp_shades
|
||||
name = "Integrated Thermal-Shades Implant (Organic)"
|
||||
item_cost = 80
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug
|
||||
|
||||
/datum/uplink_item/item/implants/imp_taser
|
||||
name = "Integrated Taser Implant (Organic)"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/taser
|
||||
|
||||
/datum/uplink_item/item/implants/imp_laser
|
||||
name = "Integrated Laser Implant (Organic)"
|
||||
item_cost = 50
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/laser
|
||||
|
||||
/datum/uplink_item/item/implants/imp_dart
|
||||
name = "Integrated Dart Implant (Organic)"
|
||||
item_cost = 60
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/dart
|
||||
|
||||
/datum/uplink_item/item/implants/imp_toolkit
|
||||
name = "Integrated Toolkit Implant (Organic)"
|
||||
item_cost = 80
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit
|
||||
|
||||
/datum/uplink_item/item/implants/imp_medkit
|
||||
name = "Integrated Medkit Implant (Organic)"
|
||||
item_cost = 60
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit
|
||||
|
||||
/datum/uplink_item/item/implants/imp_analyzer
|
||||
name = "Integrated Research Scanner Implant (Organic)"
|
||||
item_cost = 20
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer
|
||||
|
||||
/datum/uplink_item/item/implants/imp_sword
|
||||
name = "Integrated Sword Implant (Organic)"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sword
|
||||
|
||||
/datum/uplink_item/item/implants/imp_sprinter
|
||||
name = "Integrated Sprinter Implant (Organic)"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
|
||||
|
||||
/datum/uplink_item/item/implants/imp_sprinter
|
||||
name = "Integrated Surge Implant (Organic)"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/surge
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/**********
|
||||
* Medical *
|
||||
**********/
|
||||
/datum/uplink_item/item/medical/mre
|
||||
name = "Meal, Ready to eat (Random)"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/storage/mre/random
|
||||
|
||||
/datum/uplink_item/item/medical/protein
|
||||
name = "Meal, Ready to eat (Protein)"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/storage/mre/menu10
|
||||
|
||||
/datum/uplink_item/item/medical/emergency
|
||||
name = "Meal, Ready to eat (Emergency)"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/storage/mre/menu11
|
||||
|
||||
/datum/uplink_item/item/medical/glucose
|
||||
name = "Glucose injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose
|
||||
|
||||
/datum/uplink_item/item/medical/purity
|
||||
name = "Purity injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity
|
||||
|
||||
/datum/uplink_item/item/medical/brute
|
||||
name = "Brute injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute
|
||||
|
||||
/datum/uplink_item/item/medical/burn
|
||||
name = "Burn injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn
|
||||
|
||||
/datum/uplink_item/item/medical/toxin
|
||||
name = "Toxin injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin
|
||||
|
||||
/datum/uplink_item/item/medical/oxy
|
||||
name = "Oxy injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy
|
||||
|
||||
/datum/uplink_item/item/medical/nanites
|
||||
name = "Healing Nanite pill bottle"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/storage/pill_bottle/healing_nanites
|
||||
|
||||
/datum/uplink_item/item/medical/insiderepair
|
||||
name = "Combat organ kit"
|
||||
item_cost = 120
|
||||
path = /obj/item/weapon/storage/firstaid/insiderepair
|
||||
@@ -0,0 +1,42 @@
|
||||
/********************
|
||||
* Devices and Tools *
|
||||
********************/
|
||||
/datum/uplink_item/item/tools/basiclaptop
|
||||
name = "Laptop (Basic)"
|
||||
item_cost = 5
|
||||
path = /obj/item/modular_computer/laptop/preset/custom_loadout/cheap
|
||||
|
||||
/datum/uplink_item/item/tools/survivalcapsule
|
||||
name = "Survival Capsule"
|
||||
item_cost = 5
|
||||
path = /obj/item/device/survivalcapsule
|
||||
|
||||
/datum/uplink_item/item/tools/nanopaste
|
||||
name = "Nanopaste (Advanced)"
|
||||
item_cost = 10
|
||||
path = /obj/item/stack/nanopaste/advanced
|
||||
|
||||
/datum/uplink_item/item/tools/elitetablet
|
||||
name = "Tablet (Advanced)"
|
||||
item_cost = 15
|
||||
path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced
|
||||
|
||||
/datum/uplink_item/item/tools/elitelaptop
|
||||
name = "Laptop (Advanced)"
|
||||
item_cost = 20
|
||||
path = /obj/item/modular_computer/laptop/preset/custom_loadout/elite
|
||||
|
||||
/datum/uplink_item/item/tools/luxurycapsule
|
||||
name = "Survival Capsule (Luxury)"
|
||||
item_cost = 40
|
||||
path = /obj/item/device/survivalcapsule/luxury
|
||||
|
||||
/datum/uplink_item/item/tools/translocator
|
||||
name = "Translocator"
|
||||
item_cost = 40
|
||||
path = /obj/item/device/perfect_tele
|
||||
|
||||
/datum/uplink_item/item/tools/barcapsule
|
||||
name = "Survival Capsule (Bar)"
|
||||
item_cost = 80
|
||||
path = /obj/item/device/survivalcapsule/luxurybar
|
||||
@@ -15,37 +15,17 @@
|
||||
path = /obj/item/weapon/material/knife/tacknife/combatknife
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword
|
||||
name = "Energy Sword, Random"
|
||||
name = "Energy Sword, Colorable"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_blue
|
||||
name = "Energy Sword, Blue"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/blue
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_green
|
||||
name = "Energy Sword, Green"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/green
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_red
|
||||
name = "Energy Sword, Red"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/red
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_purple
|
||||
name = "Energy Sword, Purple"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/purple
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_pirate
|
||||
name = "Energy Cutlass"
|
||||
name = "Energy Cutlass, Colorable"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/pirate
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_spear
|
||||
name = "Energy Spear"
|
||||
name = "Energy Spear, Colorable"
|
||||
item_cost = 50
|
||||
path = /obj/item/weapon/melee/energy/spear
|
||||
|
||||
@@ -192,4 +172,4 @@
|
||||
/datum/uplink_item/item/visible_weapons/xray
|
||||
name = "Xray Gun"
|
||||
item_cost = 85
|
||||
path = /obj/item/weapon/gun/energy/xray
|
||||
path = /obj/item/weapon/gun/energy/xray
|
||||
|
||||
@@ -14,33 +14,33 @@
|
||||
return
|
||||
|
||||
if(faction.is_antagonist(player))
|
||||
src << "<span class='warning'>\The [player.current] already serves the [faction.faction_descriptor].</span>"
|
||||
to_chat(src, "<span class='warning'>\The [player.current] already serves the [faction.faction_descriptor].</span>")
|
||||
return
|
||||
|
||||
if(player_is_antag(player))
|
||||
src << "<span class='warning'>\The [player.current]'s loyalties seem to be elsewhere...</span>"
|
||||
to_chat(src, "<span class='warning'>\The [player.current]'s loyalties seem to be elsewhere...</span>")
|
||||
return
|
||||
|
||||
if(!faction.can_become_antag(player))
|
||||
src << "<span class='warning'>\The [player.current] cannot be \a [faction.faction_role_text]!</span>"
|
||||
to_chat(src, "<span class='warning'>\The [player.current] cannot be \a [faction.faction_role_text]!</span>")
|
||||
return
|
||||
|
||||
if(world.time < player.rev_cooldown)
|
||||
src << "<span class='danger'>You must wait five seconds between attempts.</span>"
|
||||
to_chat(src, "<span class='danger'>You must wait five seconds between attempts.</span>")
|
||||
return
|
||||
|
||||
src << "<span class='danger'>You are attempting to convert \the [player.current]...</span>"
|
||||
to_chat(src, "<span class='danger'>You are attempting to convert \the [player.current]...</span>")
|
||||
log_admin("[src]([src.ckey]) attempted to convert [player.current].")
|
||||
message_admins("<span class='danger'>[src]([src.ckey]) attempted to convert [player.current].</span>")
|
||||
|
||||
player.rev_cooldown = world.time+100
|
||||
var/choice = alert(player.current,"Asked by [src]: Do you want to join the [faction.faction_descriptor]?","Join the [faction.faction_descriptor]?","No!","Yes!")
|
||||
if(choice == "Yes!" && faction.add_antagonist_mind(player, 0, faction.faction_role_text, faction.faction_welcome))
|
||||
src << "<span class='notice'>\The [player.current] joins the [faction.faction_descriptor]!</span>"
|
||||
to_chat(src, "<span class='notice'>\The [player.current] joins the [faction.faction_descriptor]!</span>")
|
||||
return
|
||||
if(choice == "No!")
|
||||
player << "<span class='danger'>You reject this traitorous cause!</span>"
|
||||
src << "<span class='danger'>\The [player.current] does not support the [faction.faction_descriptor]!</span>"
|
||||
to_chat(src, "<span class='danger'>\The [player.current] does not support the [faction.faction_descriptor]!</span>")
|
||||
|
||||
/mob/living/proc/convert_to_loyalist(mob/M as mob in oview(src))
|
||||
set name = "Convert Recidivist"
|
||||
|
||||
@@ -38,8 +38,8 @@
|
||||
if(!mind)
|
||||
return
|
||||
if(!is_special_character(mind))
|
||||
src << "<span class='warning'>While you may perhaps have goals, this verb's meant to only be visible \
|
||||
to antagonists. Please make a bug report!</span>"
|
||||
to_chat(src, "<span class='warning'>While you may perhaps have goals, this verb's meant to only be visible \
|
||||
to antagonists. Please make a bug report!</span>")
|
||||
return
|
||||
var/new_ambitions = input(src, "Write a short sentence of what your character hopes to accomplish \
|
||||
today as an antagonist. Remember that this is purely optional. It will be shown at the end of the \
|
||||
@@ -49,7 +49,7 @@
|
||||
new_ambitions = sanitize(new_ambitions)
|
||||
mind.ambitions = new_ambitions
|
||||
if(new_ambitions)
|
||||
src << "<span class='notice'>You've set your goal to be '[new_ambitions]'.</span>"
|
||||
to_chat(src, "<span class='notice'>You've set your goal to be '[new_ambitions]'.</span>")
|
||||
else
|
||||
src << "<span class='notice'>You leave your ambitions behind.</span>"
|
||||
to_chat(src, "<span class='notice'>You leave your ambitions behind.</span>")
|
||||
log_and_message_admins("has set their ambitions to now be: [new_ambitions].")
|
||||
|
||||
@@ -115,18 +115,18 @@ obj/item/clothing
|
||||
/*Checks if the wizard is wearing the proper attire.
|
||||
Made a proc so this is not repeated 14 (or more) times.*/
|
||||
/mob/proc/wearing_wiz_garb()
|
||||
src << "Silly creature, you're not a human. Only humans can cast this spell."
|
||||
to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.")
|
||||
return 0
|
||||
|
||||
// Humans can wear clothes.
|
||||
/mob/living/carbon/human/wearing_wiz_garb()
|
||||
if(!is_wiz_garb(src.wear_suit))
|
||||
src << "<span class='warning'>I don't feel strong enough without my robe.</span>"
|
||||
to_chat(src, "<span class='warning'>I don't feel strong enough without my robe.</span>")
|
||||
return 0
|
||||
if(!is_wiz_garb(src.shoes))
|
||||
src << "<span class='warning'>I don't feel strong enough without my sandals.</span>"
|
||||
to_chat(src, "<span class='warning'>I don't feel strong enough without my sandals.</span>")
|
||||
return 0
|
||||
if(!is_wiz_garb(src.head))
|
||||
src << "<span class='warning'>I don't feel strong enough without my hat.</span>"
|
||||
to_chat(src, "<span class='warning'>I don't feel strong enough without my hat.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -47,8 +47,8 @@ var/datum/antagonist/highlander/highlanders
|
||||
var/obj/item/weapon/card/id/W = new(player)
|
||||
W.name = "[player.real_name]'s ID Card"
|
||||
W.icon_state = "centcom"
|
||||
W.access = get_all_station_access()
|
||||
W.access += get_all_centcom_access()
|
||||
W.access = get_all_station_access().Copy
|
||||
W.access |= get_all_centcom_access()
|
||||
W.assignment = "Highlander"
|
||||
W.registered_name = player.real_name
|
||||
player.equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
@@ -2737,4 +2737,4 @@ var/list/the_station_areas = list (
|
||||
icon_state = "yellow"
|
||||
luminosity = 1
|
||||
dynamic_lighting = 0
|
||||
requires_power = 0
|
||||
requires_power = 0
|
||||
@@ -1,121 +1,4 @@
|
||||
/area/crew_quarters/sleep/vistor_room_1
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_2
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_3
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_4
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_5
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_6
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_7
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_8
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_9
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_10
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_11
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_12
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_1
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_2
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_3
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_4
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_5
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_6
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_7
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_8
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_9
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/Dorm_10
|
||||
flags = RAD_SHIELDED | BLUE_SHIELDED
|
||||
|
||||
/area/teleporter/departing
|
||||
name = "\improper Long-Range Teleporter"
|
||||
icon_state = "teleporter"
|
||||
music = "signal"
|
||||
|
||||
// Override telescience shielding on some areas
|
||||
/area/security/armoury
|
||||
flags = BLUE_SHIELDED
|
||||
|
||||
/area/security/tactical
|
||||
flags = BLUE_SHIELDED
|
||||
|
||||
/area/security/nuke_storage
|
||||
flags = BLUE_SHIELDED
|
||||
|
||||
/area/supply
|
||||
flags = BLUE_SHIELDED
|
||||
|
||||
// Add rad shielding to maintenance and construction sites
|
||||
/area/vacant
|
||||
flags = RAD_SHIELDED
|
||||
|
||||
/area/maintenance
|
||||
flags = RAD_SHIELDED
|
||||
|
||||
/area/rnd/research_storage //Located entirely in maint under public access, so why not that too
|
||||
flags = RAD_SHIELDED
|
||||
|
||||
// New shuttles
|
||||
/area/shuttle/administration/transit
|
||||
name = "Deep Space (AS)"
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/administration/away_mission
|
||||
name = "Away Mission (AS)"
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/awaymission/home
|
||||
name = "NSB Adephagia (AM)"
|
||||
icon_state = "shuttle2"
|
||||
|
||||
/area/shuttle/awaymission/warp
|
||||
name = "Deep Space (AM)"
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/awaymission/away
|
||||
name = "Away Mission (AM)"
|
||||
icon_state = "shuttle2"
|
||||
|
||||
/area/shuttle/awaymission/oldengbase
|
||||
name = "Old Construction Site (AM)"
|
||||
icon_state = "shuttle2"
|
||||
//TFF 28/8/19 - cleanup of areas placement - removes all but rogueminer_vr stuff.
|
||||
|
||||
/area/shuttle/belter/station
|
||||
name = "Belter Shuttle Landed"
|
||||
@@ -162,140 +45,6 @@
|
||||
icon_state = "red2"
|
||||
shuttle_area = /area/shuttle/belter/belt/zone4
|
||||
|
||||
/area/medical/resleeving
|
||||
name = "Resleeving Lab"
|
||||
icon_state = "genetics"
|
||||
|
||||
/area/bigship
|
||||
name = "Bigship"
|
||||
requires_power = 0
|
||||
flags = RAD_SHIELDED
|
||||
sound_env = SMALL_ENCLOSED
|
||||
base_turf = /turf/space
|
||||
icon_state = "red2"
|
||||
|
||||
/area/bigship/teleporter
|
||||
name = "Bigship Teleporter Room"
|
||||
|
||||
//////// Small Cruiser Areas ////////
|
||||
/area/houseboat
|
||||
name = "Small Cruiser"
|
||||
requires_power = 0
|
||||
flags = RAD_SHIELDED
|
||||
base_turf = /turf/space
|
||||
icon_state = "red2"
|
||||
lightswitch = TRUE
|
||||
|
||||
/area/houseboat/holodeck_area
|
||||
name = "Small Cruiser - Holodeck"
|
||||
icon_state = "blue2"
|
||||
|
||||
/area/houseboat/holodeck/off
|
||||
name = "Small Cruiser Holo - Off"
|
||||
icon_state = "blue2"
|
||||
/area/houseboat/holodeck/beach
|
||||
name = "Small Cruiser Holo - Beach"
|
||||
icon_state = "blue2"
|
||||
/area/houseboat/holodeck/snow
|
||||
name = "Small Cruiser Holo - Snow"
|
||||
icon_state = "blue2"
|
||||
/area/houseboat/holodeck/desert
|
||||
name = "Small Cruiser Holo - Desert"
|
||||
icon_state = "blue2"
|
||||
/area/houseboat/holodeck/picnic
|
||||
name = "Small Cruiser Holo - Picnic"
|
||||
icon_state = "blue2"
|
||||
/area/houseboat/holodeck/thunderdome
|
||||
name = "Small Cruiser Holo - Thunderdome"
|
||||
icon_state = "blue2"
|
||||
/area/houseboat/holodeck/basketball
|
||||
name = "Small Cruiser Holo - Basketball"
|
||||
icon_state = "blue2"
|
||||
/area/houseboat/holodeck/gaming
|
||||
name = "Small Cruiser Holo - Gaming Table"
|
||||
icon_state = "blue2"
|
||||
/area/houseboat/holodeck/space
|
||||
name = "Small Cruiser Holo - Space"
|
||||
icon_state = "blue2"
|
||||
/area/houseboat/holodeck/bunking
|
||||
name = "Small Cruiser Holo - Bunking"
|
||||
icon_state = "blue2"
|
||||
|
||||
/area/shuttle/cruiser/cruiser
|
||||
name = "Small Cruiser Shuttle - Cruiser"
|
||||
icon_state = "blue2"
|
||||
base_turf = /turf/simulated/floor/tiled/techfloor
|
||||
/area/shuttle/cruiser/station
|
||||
name = "Small Cruiser Shuttle - Station"
|
||||
icon_state = "blue2"
|
||||
|
||||
|
||||
// Tether Map has this shuttle
|
||||
/area/shuttle/tether/surface
|
||||
name = "Tether Shuttle Landed"
|
||||
icon_state = "shuttle"
|
||||
base_turf = /turf/simulated/floor/reinforced
|
||||
|
||||
/area/shuttle/tether/station
|
||||
name = "Tether Shuttle Dock"
|
||||
icon_state = "shuttle2"
|
||||
|
||||
/area/shuttle/tether/transit
|
||||
name = "Tether Shuttle Transit"
|
||||
icon_state = "shuttle2"
|
||||
|
||||
// rnd (Research and Development)
|
||||
/area/rnd/research/testingrange
|
||||
name = "\improper Weapons Testing Range"
|
||||
icon_state = "firingrange"
|
||||
|
||||
/area/rnd/research/researchdivision
|
||||
name = "\improper Research Division"
|
||||
icon_state = "research"
|
||||
|
||||
/area/rnd/outpost
|
||||
name = "\improper Research Outpost Hallway"
|
||||
icon_state = "research"
|
||||
|
||||
/area/rnd/outpost/airlock
|
||||
name = "\improper Research Outpost Airlock"
|
||||
icon_state = "green"
|
||||
|
||||
/area/rnd/outpost/eva
|
||||
name = "Research Outpost EVA Storage"
|
||||
icon_state = "eva"
|
||||
|
||||
/area/rnd/outpost/chamber
|
||||
name = "\improper Research Outpost Burn Chamber"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/rnd/outpost/atmos
|
||||
name = "Research Outpost Atmospherics"
|
||||
icon_state = "atmos"
|
||||
|
||||
/area/rnd/outpost/storage
|
||||
name = "\improper Research Outpost Gas Storage"
|
||||
icon_state = "toxstorage"
|
||||
|
||||
/area/rnd/outpost/mixing
|
||||
name = "\improper Research Outpost Gas Mixing"
|
||||
icon_state = "toxmix"
|
||||
|
||||
/area/rnd/outpost/heating
|
||||
name = "\improper Research Outpost Gas Heating"
|
||||
icon_state = "toxmix"
|
||||
|
||||
/area/rnd/outpost/testing
|
||||
name = "\improper Research Outpost Testing"
|
||||
icon_state = "toxtest"
|
||||
|
||||
/area/maintenance/substation/outpost
|
||||
name = "Research Outpost Substation"
|
||||
|
||||
/area/engineering/engine_gas
|
||||
name = "\improper Engine Gas Storage"
|
||||
icon_state = "engine_waste"
|
||||
|
||||
/area/chapel/observation
|
||||
name = "\improper Chapel Observation"
|
||||
icon_state = "chapel"
|
||||
@@ -0,0 +1,6 @@
|
||||
/area/shuttle_arrived()
|
||||
.=..()
|
||||
for(var/obj/machinery/telecomms/relay/R in contents)
|
||||
R.reset_z()
|
||||
for(var/obj/machinery/power/apc/A in contents)
|
||||
A.update_area()
|
||||
+2
-1
@@ -388,7 +388,8 @@
|
||||
blood_DNA = list()
|
||||
|
||||
was_bloodied = 1
|
||||
blood_color = "#A10808"
|
||||
if(!blood_color)
|
||||
blood_color = "#A10808"
|
||||
if(istype(M))
|
||||
if (!istype(M.dna, /datum/dna))
|
||||
M.dna = new /datum/dna(null)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/atom/movable
|
||||
layer = OBJ_LAYER
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER //VOREStation Edit
|
||||
var/last_move = null
|
||||
var/anchored = 0
|
||||
// var/elevation = 2 - not used anywhere
|
||||
|
||||
@@ -111,6 +111,8 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
// New stuff
|
||||
var/species = SPECIES_HUMAN
|
||||
var/list/body_markings = list()
|
||||
var/list/body_descriptors = null
|
||||
var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance.
|
||||
|
||||
// Make a copy of this strand.
|
||||
// USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION!
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
var/mind=null
|
||||
var/languages=null
|
||||
var/list/flavor=null
|
||||
var/gender = null
|
||||
var/list/body_descriptors = null
|
||||
var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance.
|
||||
|
||||
/datum/dna2/record/proc/GetData()
|
||||
@@ -706,7 +708,10 @@
|
||||
databuf.types = DNA2_BUF_UE
|
||||
databuf.dna = src.connected.occupant.dna.Clone()
|
||||
if(ishuman(connected.occupant))
|
||||
databuf.dna.real_name=connected.occupant.dna.real_name
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
databuf.dna.real_name = H.dna.real_name
|
||||
databuf.gender = H.gender
|
||||
databuf.body_descriptors = H.descriptors
|
||||
databuf.name = "Unique Identifier"
|
||||
src.buffers[bufferId] = databuf
|
||||
return 1
|
||||
@@ -717,7 +722,10 @@
|
||||
databuf.types = DNA2_BUF_UI|DNA2_BUF_UE
|
||||
databuf.dna = src.connected.occupant.dna.Clone()
|
||||
if(ishuman(connected.occupant))
|
||||
databuf.dna.real_name=connected.occupant.dna.real_name
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
databuf.dna.real_name = H.dna.real_name
|
||||
databuf.gender = H.gender
|
||||
databuf.body_descriptors = H.descriptors
|
||||
databuf.name = "Unique Identifier + Unique Enzymes"
|
||||
src.buffers[bufferId] = databuf
|
||||
return 1
|
||||
@@ -728,7 +736,10 @@
|
||||
databuf.types = DNA2_BUF_SE
|
||||
databuf.dna = src.connected.occupant.dna.Clone()
|
||||
if(ishuman(connected.occupant))
|
||||
databuf.dna.real_name=connected.occupant.dna.real_name
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
databuf.dna.real_name = H.dna.real_name
|
||||
databuf.gender = H.gender
|
||||
databuf.body_descriptors = H.descriptors
|
||||
databuf.name = "Structural Enzymes"
|
||||
src.buffers[bufferId] = databuf
|
||||
return 1
|
||||
@@ -764,10 +775,18 @@
|
||||
if ((buf.types & DNA2_BUF_UE))
|
||||
src.connected.occupant.real_name = buf.dna.real_name
|
||||
src.connected.occupant.name = buf.dna.real_name
|
||||
if(ishuman(connected.occupant))
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
H.gender = buf.gender
|
||||
H.descriptors = buf.body_descriptors
|
||||
src.connected.occupant.UpdateAppearance(buf.dna.UI.Copy())
|
||||
else if (buf.types & DNA2_BUF_SE)
|
||||
src.connected.occupant.dna.SE = buf.dna.SE
|
||||
src.connected.occupant.dna.UpdateSE()
|
||||
if(ishuman(connected.occupant))
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
H.gender = buf.gender
|
||||
H.descriptors = buf.body_descriptors
|
||||
domutcheck(src.connected.occupant,src.connected)
|
||||
src.connected.occupant.apply_effect(rand(20,50), IRRADIATE, check_protection = 0)
|
||||
return 1
|
||||
|
||||
@@ -129,19 +129,19 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
||||
return
|
||||
|
||||
if(src.stat > max_stat)
|
||||
src << "<span class='warning'>We are incapacitated.</span>"
|
||||
to_chat(src, "<span class='warning'>We are incapacitated.</span>")
|
||||
return
|
||||
|
||||
if(changeling.absorbed_dna.len < required_dna)
|
||||
src << "<span class='warning'>We require at least [required_dna] samples of compatible DNA.</span>"
|
||||
to_chat(src, "<span class='warning'>We require at least [required_dna] samples of compatible DNA.</span>")
|
||||
return
|
||||
|
||||
if(changeling.chem_charges < required_chems)
|
||||
src << "<span class='warning'>We require at least [required_chems] units of chemicals to do that!</span>"
|
||||
to_chat(src, "<span class='warning'>We require at least [required_chems] units of chemicals to do that!</span>")
|
||||
return
|
||||
|
||||
if(changeling.geneticdamage > max_genetic_damage)
|
||||
src << "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>"
|
||||
to_chat(src, "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>")
|
||||
return
|
||||
|
||||
return changeling
|
||||
@@ -204,11 +204,11 @@ turf/proc/AdjacentTurfsRangedSting()
|
||||
if(M.loc == src.loc)
|
||||
return 1 //target and source are in the same thing
|
||||
if(!isturf(src.loc) || !isturf(M.loc))
|
||||
src << "<span class='warning'>We cannot reach \the [M] with a sting!</span>"
|
||||
to_chat(src, "<span class='warning'>We cannot reach \the [M] with a sting!</span>")
|
||||
return 0 //One is inside, the other is outside something.
|
||||
// Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising
|
||||
if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail
|
||||
src << "<span class='warning'>We cannot find a path to sting \the [M] by!</span>"
|
||||
to_chat(src, "<span class='warning'>We cannot find a path to sting \the [M] by!</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -225,7 +225,7 @@ turf/proc/AdjacentTurfsRangedSting()
|
||||
if(!T)
|
||||
return
|
||||
if(T.isSynthetic())
|
||||
src << "<span class='notice'>We are unable to pierce the outer shell of [T].</span>"
|
||||
to_chat(src, "<span class='notice'>We are unable to pierce the outer shell of [T].</span>")
|
||||
return
|
||||
if(!(T in view(changeling.sting_range))) return
|
||||
if(!sting_can_reach(T, changeling.sting_range)) return
|
||||
@@ -236,7 +236,7 @@ turf/proc/AdjacentTurfsRangedSting()
|
||||
src.verbs -= verb_path
|
||||
spawn(10) src.verbs += verb_path
|
||||
|
||||
src << "<span class='notice'>We stealthily sting [T].</span>"
|
||||
to_chat(src, "<span class='notice'>We stealthily sting [T].</span>")
|
||||
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
|
||||
T << "<span class='warning'>You feel a tiny prick.</span>"
|
||||
return
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
return 1
|
||||
|
||||
if(M.head || M.wear_suit) //Make sure our slots aren't full
|
||||
src << "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits, or shoes.</span>"
|
||||
to_chat(src, "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits, or shoes.</span>")
|
||||
return 0
|
||||
|
||||
var/obj/item/clothing/suit/A = new armor_type(src)
|
||||
@@ -242,7 +242,7 @@
|
||||
var/mob/living/carbon/human/M = src
|
||||
|
||||
if(M.hands_are_full()) //Make sure our hands aren't full.
|
||||
src << "<span class='warning'>Our hands are full. Drop something first.</span>"
|
||||
to_chat(src, "<span class='warning'>Our hands are full. Drop something first.</span>")
|
||||
return 0
|
||||
|
||||
var/obj/item/weapon/W = new weapon_type(src)
|
||||
|
||||
@@ -16,41 +16,41 @@
|
||||
|
||||
var/obj/item/weapon/grab/G = src.get_active_hand()
|
||||
if(!istype(G))
|
||||
src << "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>"
|
||||
to_chat(src, "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/T = G.affecting
|
||||
if(!istype(T) || T.isSynthetic())
|
||||
src << "<span class='warning'>\The [T] is not compatible with our biology.</span>"
|
||||
to_chat(src, "<span class='warning'>\The [T] is not compatible with our biology.</span>")
|
||||
return
|
||||
|
||||
if(T.species.flags & NO_SCAN)
|
||||
src << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
|
||||
to_chat(src, "<span class='warning'>We do not know how to parse this creature's DNA!</span>")
|
||||
return
|
||||
|
||||
if(HUSK in T.mutations) //Lings can always absorb other lings, unless someone beat them to it first.
|
||||
if(!T.mind.changeling || T.mind.changeling && T.mind.changeling.geneticpoints < 0)
|
||||
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
|
||||
to_chat(src, "<span class='warning'>This creature's DNA is ruined beyond useability!</span>")
|
||||
return
|
||||
|
||||
if(G.state != GRAB_KILL)
|
||||
src << "<span class='warning'>We must have a tighter grip to absorb this creature.</span>"
|
||||
to_chat(src, "<span class='warning'>We must have a tighter grip to absorb this creature.</span>")
|
||||
return
|
||||
|
||||
if(changeling.isabsorbing)
|
||||
src << "<span class='warning'>We are already absorbing!</span>"
|
||||
to_chat(src, "<span class='warning'>We are already absorbing!</span>")
|
||||
return
|
||||
|
||||
changeling.isabsorbing = 1
|
||||
for(var/stage = 1, stage<=3, stage++)
|
||||
switch(stage)
|
||||
if(1)
|
||||
src << "<span class='notice'>This creature is compatible. We must hold still...</span>"
|
||||
to_chat(src, "<span class='notice'>This creature is compatible. We must hold still...</span>")
|
||||
if(2)
|
||||
src << "<span class='notice'>We extend a proboscis.</span>"
|
||||
to_chat(src, "<span class='notice'>We extend a proboscis.</span>")
|
||||
src.visible_message("<span class='warning'>[src] extends a proboscis!</span>")
|
||||
if(3)
|
||||
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
|
||||
to_chat(src, "<span class='notice'>We stab [T] with the proboscis.</span>")
|
||||
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
|
||||
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
|
||||
add_attack_logs(src,T,"Absorbed (changeling)")
|
||||
@@ -60,11 +60,11 @@
|
||||
|
||||
feedback_add_details("changeling_powers","A[stage]")
|
||||
if(!do_mob(src, T, 150) || G.state != GRAB_KILL)
|
||||
src << "<span class='warning'>Our absorption of [T] has been interrupted!</span>"
|
||||
to_chat(src, "<span class='warning'>Our absorption of [T] has been interrupted!</span>")
|
||||
changeling.isabsorbing = 0
|
||||
return
|
||||
|
||||
src << "<span class='notice'>We have absorbed [T]!</span>"
|
||||
to_chat(src, "<span class='notice'>We have absorbed [T]!</span>")
|
||||
src.visible_message("<span class='danger'>[src] sucks the fluids from [T]!</span>")
|
||||
T << "<span class='danger'>You have been absorbed by the changeling!</span>"
|
||||
if(src.nutrition < 400)
|
||||
@@ -76,7 +76,7 @@
|
||||
if(changeling.readapts > changeling.max_readapts)
|
||||
changeling.readapts = changeling.max_readapts
|
||||
|
||||
src << "<span class='notice'>We can now re-adapt, reverting our evolution so that we may start anew, if needed.</span>"
|
||||
to_chat(src, "<span class='notice'>We can now re-adapt, reverting our evolution so that we may start anew, if needed.</span>")
|
||||
|
||||
var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts, T.modifiers)
|
||||
absorbDNA(newDNA)
|
||||
@@ -98,7 +98,7 @@
|
||||
changeling.geneticpoints += 4
|
||||
changeling.max_geneticpoints += 4
|
||||
|
||||
src << "<span class='notice'>We absorbed another changeling, and we grow stronger. Our genomes increase.</span>"
|
||||
to_chat(src, "<span class='notice'>We absorbed another changeling, and we grow stronger. Our genomes increase.</span>")
|
||||
|
||||
T.mind.changeling.chem_charges = 0
|
||||
T.mind.changeling.geneticpoints = -1
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater))
|
||||
src << "<span class='notice'>We prepare an extra sharp blade.</span>"
|
||||
to_chat(src, "<span class='notice'>We prepare an extra sharp blade.</span>")
|
||||
return 1
|
||||
|
||||
else
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15))
|
||||
src << "<span class='notice'>We prepare an extra sharp claw.</span>"
|
||||
to_chat(src, "<span class='notice'>We prepare an extra sharp claw.</span>")
|
||||
return 1
|
||||
|
||||
else
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
if(held_item == null)
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent,0))
|
||||
src << "<span class='notice'>We will shock others more efficently.</span>"
|
||||
to_chat(src, "<span class='notice'>We will shock others more efficently.</span>")
|
||||
return 1
|
||||
else
|
||||
if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
|
||||
@@ -54,7 +54,7 @@
|
||||
"<span class='warning'>Our hand channels raw electricity into [G.affecting].</span>",
|
||||
"<span class='italics'>You hear sparks!</span>")
|
||||
else
|
||||
src << "<span class='warning'>Our gloves block us from shocking \the [G.affecting].</span>"
|
||||
to_chat(src, "<span class='warning'>Our gloves block us from shocking \the [G.affecting].</span>")
|
||||
src.mind.changeling.chem_charges -= 10
|
||||
return 1
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
sleep(1 SECOND)
|
||||
success = 1
|
||||
if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals.
|
||||
src << "<span class='warning'>We are unable to affect \the [held_item].</span>"
|
||||
to_chat(src, "<span class='warning'>We are unable to affect \the [held_item].</span>")
|
||||
else
|
||||
src.mind.changeling.chem_charges -= 10
|
||||
return success
|
||||
@@ -143,7 +143,7 @@
|
||||
var/mob/living/carbon/C = target
|
||||
|
||||
if(user.mind.changeling.chem_charges < shock_cost)
|
||||
src << "<span class='warning'>We require more chemicals to electrocute [C]!</span>"
|
||||
to_chat(src, "<span class='warning'>We require more chemicals to electrocute [C]!</span>")
|
||||
return 0
|
||||
|
||||
C.electrocute_act(electrocute_amount * siemens,src,1.0,BP_TORSO)
|
||||
@@ -156,7 +156,7 @@
|
||||
"<span class='warning'>Our hand channels raw electricity into [C]</span>",
|
||||
"<span class='italics'>You hear sparks!</span>")
|
||||
else
|
||||
src << "<span class='warning'>Our gloves block us from shocking \the [C].</span>"
|
||||
to_chat(src, "<span class='warning'>Our gloves block us from shocking \the [C].</span>")
|
||||
//qdel(src) //Since we're no longer a one hit stun, we need to stick around.
|
||||
user.mind.changeling.chem_charges -= shock_cost
|
||||
return 1
|
||||
@@ -165,7 +165,7 @@
|
||||
var/mob/living/silicon/S = target
|
||||
|
||||
if(user.mind.changeling.chem_charges < 10)
|
||||
src << "<span class='warning'>We require more chemicals to electrocute [S]!</span>"
|
||||
to_chat(src, "<span class='warning'>We require more chemicals to electrocute [S]!</span>")
|
||||
return 0
|
||||
|
||||
S.electrocute_act(60,src,0.75) //If only they had surge protectors.
|
||||
@@ -205,7 +205,7 @@
|
||||
success = 1
|
||||
break
|
||||
if(success == 0)
|
||||
src << "<span class='warning'>We are unable to affect \the [target].</span>"
|
||||
to_chat(src, "<span class='warning'>We are unable to affect \the [target].</span>")
|
||||
else
|
||||
qdel(src)
|
||||
return 1
|
||||
@@ -21,7 +21,7 @@
|
||||
var/duration = 300
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 150
|
||||
src << "<span class='notice'>They will be deprived of sight for longer.</span>"
|
||||
to_chat(src, "<span class='notice'>They will be deprived of sight for longer.</span>")
|
||||
spawn(duration)
|
||||
T.disabilities &= ~NEARSIGHTED
|
||||
T.Blind(10)
|
||||
|
||||
@@ -20,12 +20,12 @@
|
||||
var/inject_amount = 10
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
inject_amount = inject_amount * 1.5
|
||||
src << "<span class='notice'>We inject extra chemicals.</span>"
|
||||
to_chat(src, "<span class='notice'>We inject extra chemicals.</span>")
|
||||
if(T.reagents)
|
||||
T.reagents.add_reagent("cryotoxin", inject_amount)
|
||||
feedback_add_details("changeling_powers","CS")
|
||||
src.verbs -= /mob/proc/changeling_cryo_sting
|
||||
spawn(3 MINUTES)
|
||||
src << "<span class='notice'>Our cryogenic string is ready to be used once more.</span>"
|
||||
to_chat(src, "<span class='notice'>Our cryogenic string is ready to be used once more.</span>")
|
||||
src.verbs |= /mob/proc/changeling_cryo_sting
|
||||
return 1
|
||||
@@ -19,7 +19,7 @@
|
||||
var/duration = 300
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 100
|
||||
src << "<span class='notice'>They will be unable to hear for a little longer.</span>"
|
||||
to_chat(src, "<span class='notice'>They will be unable to hear for a little longer.</span>")
|
||||
T << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
|
||||
T.sdisabilities |= DEAF
|
||||
spawn(duration) T.sdisabilities &= ~DEAF
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/type_to_give = /datum/modifier/delayed_toxin_sting
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
type_to_give = /datum/modifier/delayed_toxin_sting/strong
|
||||
src << "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>"
|
||||
to_chat(src, "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>")
|
||||
|
||||
T.add_modifier(type_to_give, 2 MINUTES)
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
var/type_to_give = /datum/modifier/enfeeble
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
type_to_give = /datum/modifier/enfeeble/strong
|
||||
src << "<span class='notice'>We make them extremely weak.</span>"
|
||||
to_chat(src, "<span class='notice'>We make them extremely weak.</span>")
|
||||
H.add_modifier(type_to_give, 2 MINUTES)
|
||||
feedback_add_details("changeling_powers","ES")
|
||||
return 1
|
||||
@@ -24,15 +24,15 @@
|
||||
return
|
||||
|
||||
if(!istype(T) || T.isSynthetic())
|
||||
src << "<span class='warning'>\The [T] is not compatible with our biology.</span>"
|
||||
to_chat(src, "<span class='warning'>\The [T] is not compatible with our biology.</span>")
|
||||
return 0
|
||||
|
||||
if(T.species.flags & NO_SCAN)
|
||||
src << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
|
||||
to_chat(src, "<span class='warning'>We do not know how to parse this creature's DNA!</span>")
|
||||
return 0
|
||||
|
||||
if(HUSK in T.mutations)
|
||||
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
|
||||
to_chat(src, "<span class='warning'>This creature's DNA is ruined beyond useability!</span>")
|
||||
return 0
|
||||
|
||||
add_attack_logs(src,T,"DNA extraction sting (changeling)")
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/mob/living/carbon/C = src
|
||||
|
||||
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
|
||||
src << "<span class='danger'>We have no genomes, not even our own, and cannot regenerate.</span>"
|
||||
to_chat(src, "<span class='danger'>We have no genomes, not even our own, and cannot regenerate.</span>")
|
||||
return 0
|
||||
|
||||
if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No")
|
||||
@@ -44,7 +44,7 @@
|
||||
spawn(rand(2 MINUTES, 4 MINUTES))
|
||||
//The ling will now be able to choose when to revive
|
||||
src.verbs += /mob/proc/changeling_revive
|
||||
src << "<span class='notice'><font size='5'>We are ready to rise. Use the <b>Revive</b> verb when you are ready.</font></span>"
|
||||
to_chat(src, "<span class='notice'><font size='5'>We are ready to rise. Use the <b>Revive</b> verb when you are ready.</font></span>")
|
||||
|
||||
feedback_add_details("changeling_powers","FD")
|
||||
return 1
|
||||
@@ -22,10 +22,10 @@
|
||||
var/heal_amount = 2
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
heal_amount = heal_amount * 2
|
||||
src << "<span class='notice'>We will heal much faster.</span>"
|
||||
to_chat(src, "<span class='notice'>We will heal much faster.</span>")
|
||||
|
||||
spawn(0)
|
||||
src << "<span class='notice'>We begin to heal ourselves.</span>"
|
||||
to_chat(src, "<span class='notice'>We begin to heal ourselves.</span>")
|
||||
for(var/i = 0, i<50,i++)
|
||||
if(C)
|
||||
C.adjustBruteLoss(-heal_amount)
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
src.verbs -= /mob/proc/changeling_fleshmend
|
||||
spawn(50 SECONDS)
|
||||
src << "<span class='notice'>Our regeneration has slowed to normal levels.</span>"
|
||||
to_chat(src, "<span class='notice'>Our regeneration has slowed to normal levels.</span>")
|
||||
src.verbs += /mob/proc/changeling_fleshmend
|
||||
feedback_add_details("changeling_powers","FM")
|
||||
return 1
|
||||
@@ -34,7 +34,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
names += DNA.name
|
||||
|
||||
if(names.len <= 0)
|
||||
src << "<span class='notice'>The airwaves already have all of our DNA.</span>"
|
||||
to_chat(src, "<span class='notice'>The airwaves already have all of our DNA.</span>")
|
||||
return
|
||||
|
||||
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
|
||||
@@ -46,7 +46,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
|
||||
changeling.chem_charges -= 10
|
||||
hivemind_bank += chosen_dna
|
||||
src << "<span class='notice'>We channel the DNA of [S] to the air.</span>"
|
||||
to_chat(src, "<span class='notice'>We channel the DNA of [S] to the air.</span>")
|
||||
feedback_add_details("changeling_powers","HU")
|
||||
return 1
|
||||
|
||||
@@ -64,7 +64,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
names[DNA.name] = DNA
|
||||
|
||||
if(names.len <= 0)
|
||||
src << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
|
||||
to_chat(src, "<span class='notice'>There's no new DNA to absorb from the air.</span>")
|
||||
return
|
||||
|
||||
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
|
||||
@@ -75,6 +75,6 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
|
||||
changeling.chem_charges -= 20
|
||||
absorbDNA(chosen_dna)
|
||||
src << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
|
||||
to_chat(src, "<span class='notice'>We absorb the DNA of [S] from the air.</span>")
|
||||
feedback_add_details("changeling_powers","HD")
|
||||
return 1
|
||||
@@ -13,13 +13,13 @@
|
||||
if(!changeling) return
|
||||
|
||||
if(src.has_brain_worms())
|
||||
src << "<span class='warning'>We cannot perform this ability at the present time!</span>"
|
||||
to_chat(src, "<span class='warning'>We cannot perform this ability at the present time!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = src
|
||||
|
||||
if(!istype(H) || !H.species.primitive_form)
|
||||
src << "<span class='warning'>We cannot perform this ability in this form!</span>"
|
||||
to_chat(src, "<span class='warning'>We cannot perform this ability in this form!</span>")
|
||||
return
|
||||
|
||||
changeling.chem_charges--
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
if(changeling.mimicing)
|
||||
changeling.mimicing = ""
|
||||
src << "<span class='notice'>We return our vocal glands to their original location.</span>"
|
||||
to_chat(src, "<span class='notice'>We return our vocal glands to their original location.</span>")
|
||||
return
|
||||
|
||||
var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
|
||||
@@ -28,8 +28,8 @@
|
||||
|
||||
changeling.mimicing = mimic_voice
|
||||
|
||||
src << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
|
||||
src << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
|
||||
to_chat(src, "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>")
|
||||
to_chat(src, "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>")
|
||||
|
||||
feedback_add_details("changeling_powers","MV")
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
return 0
|
||||
src.mind.changeling.chem_charges -= 20
|
||||
|
||||
src << "<span class='notice'>We cleanse impurities from our form.</span>"
|
||||
to_chat(src, "<span class='notice'>We cleanse impurities from our form.</span>")
|
||||
|
||||
var/mob/living/carbon/human/C = src
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/heal_amount = 5
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
heal_amount = heal_amount * 2
|
||||
src << "<span class='notice'>We will heal much faster.</span>"
|
||||
to_chat(src, "<span class='notice'>We will heal much faster.</span>")
|
||||
|
||||
for(var/i = 0, i<10,i++)
|
||||
if(C)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/healing_amount = 40
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
healing_amount = C.maxHealth
|
||||
src << "<span class='notice'>We completely heal ourselves.</span>"
|
||||
to_chat(src, "<span class='notice'>We completely heal ourselves.</span>")
|
||||
spawn(0)
|
||||
C.adjustBruteLoss(-healing_amount)
|
||||
C.adjustFireLoss(-healing_amount)
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
if(!changeling)
|
||||
return 0
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
src << "<span class='warning'>We will no longer empower our abilities.</span>"
|
||||
to_chat(src, "<span class='warning'>We will no longer empower our abilities.</span>")
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
return 0
|
||||
src << "<span class='notice'>We empower ourselves. Our abilities will now be extra potent.</span>"
|
||||
to_chat(src, "<span class='notice'>We empower ourselves. Our abilities will now be extra potent.</span>")
|
||||
src.mind.changeling.recursive_enhancement = 1
|
||||
feedback_add_details("changeling_powers","RE")
|
||||
return 1
|
||||
@@ -7,7 +7,7 @@
|
||||
if(!changeling)
|
||||
return
|
||||
if(src.mind.changeling.readapts <= 0)
|
||||
to_chat(src, "<span class='warning'>We must first absorb another compatable creature!</span>")
|
||||
to_chat(src, "<span class='warning'>We must first absorb another compatible creature!</span>")
|
||||
src.mind.changeling.readapts = 0
|
||||
return
|
||||
|
||||
@@ -26,6 +26,6 @@
|
||||
H.remove_modifiers_of_type(/datum/modifier/endoarmor) //Revert endoarmor too.
|
||||
src.make_changeling() //And give back our freebies.
|
||||
|
||||
src << "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>"
|
||||
to_chat(src, "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>")
|
||||
|
||||
ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
return 0
|
||||
|
||||
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
|
||||
src << "<span class='danger'>You have no genomes, not even your own, and cannot revive.</span>"
|
||||
to_chat(src, "<span class='danger'>You have no genomes, not even your own, and cannot revive.</span>")
|
||||
return 0
|
||||
|
||||
if(src.stat == DEAD)
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
if(istype(src,/mob/living/carbon))
|
||||
var/mob/living/carbon/C = src
|
||||
if(C.suiciding)
|
||||
src << "You're committing suicide, this isn't going to work."
|
||||
to_chat(src, "You're committing suicide, this isn't going to work.")
|
||||
return 0
|
||||
if(C.does_not_breathe == 0)
|
||||
C.does_not_breathe = 1
|
||||
src << "<span class='notice'>We stop breathing, as we no longer need to.</span>"
|
||||
to_chat(src, "<span class='notice'>We stop breathing, as we no longer need to.</span>")
|
||||
return 1
|
||||
else
|
||||
C.does_not_breathe = 0
|
||||
src << "<span class='notice'>We resume breathing, as we now need to again.</span>"
|
||||
to_chat(src, "<span class='notice'>We resume breathing, as we now need to again.</span>")
|
||||
return 0
|
||||
@@ -95,13 +95,13 @@
|
||||
if(!changeling) return 0
|
||||
|
||||
if(is_muzzled())
|
||||
src << "<span class='danger'>Mmmf mrrfff!</span>"
|
||||
to_chat(src, "<span class='danger'>Mmmf mrrfff!</span>")
|
||||
return 0
|
||||
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.silent)
|
||||
src << "<span class='danger'>You can't speak!</span>"
|
||||
to_chat(src, "<span class='danger'>You can't speak!</span>")
|
||||
return 0
|
||||
|
||||
if(world.time < (changeling.last_shriek + 10 SECONDS) )
|
||||
@@ -125,7 +125,7 @@
|
||||
range_med = range_med * 2
|
||||
range_light = range_light * 2
|
||||
range_long = range_long * 2
|
||||
src << "<span class='notice'>We are extra loud.</span>"
|
||||
to_chat(src, "<span class='notice'>We are extra loud.</span>")
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
|
||||
visible_message("<span class='notice'>[src] appears to shout.</span>")
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/duration = 30
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 10
|
||||
src << "<span class='notice'>They will be unable to cry out in fear for a little longer.</span>"
|
||||
to_chat(src, "<span class='notice'>They will be unable to cry out in fear for a little longer.</span>")
|
||||
T.silent += duration
|
||||
feedback_add_details("changeling_powers","SS")
|
||||
return 1
|
||||
@@ -34,7 +34,7 @@
|
||||
if(!T)
|
||||
return 0
|
||||
if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
|
||||
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
|
||||
to_chat(src, "<span class='warning'>Our sting appears ineffective against its DNA.</span>")
|
||||
return 0
|
||||
add_attack_logs(src,T,"Transformation sting (changeling)")
|
||||
T.visible_message("<span class='warning'>[T] transforms!</span>")
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
icon_state = "ghost-narsie"
|
||||
overlays = 0
|
||||
invisibility = 0
|
||||
src << "<span class='sinister'>Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.</span>"
|
||||
to_chat(src, "<span class='sinister'>Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.</span>")
|
||||
|
||||
/mob/living/cultify()
|
||||
if(iscultist(src) && client)
|
||||
|
||||
@@ -284,7 +284,7 @@ var/global/datum/controller/gameticker/ticker
|
||||
var/mob/living/carbon/human/new_char = player.create_character()
|
||||
if(new_char)
|
||||
qdel(player)
|
||||
if(istype(new_char))
|
||||
if(istype(new_char) && !(new_char.mind.assigned_role=="Cyborg"))
|
||||
data_core.manifest_inject(new_char)
|
||||
//VOREStation Edit End
|
||||
|
||||
@@ -304,7 +304,7 @@ var/global/datum/controller/gameticker/ticker
|
||||
if(!player_is_antag(player.mind, only_offstation_roles = 1))
|
||||
job_master.EquipRank(player, player.mind.assigned_role, 0)
|
||||
UpdateFactionList(player)
|
||||
equip_custom_items(player)
|
||||
//equip_custom_items(player) //VOREStation Removal
|
||||
//player.apply_traits() //VOREStation Removal
|
||||
if(captainless)
|
||||
for(var/mob/M in player_list)
|
||||
|
||||
@@ -273,7 +273,7 @@
|
||||
if(explode)
|
||||
explosion(src.loc, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 4, flash_range = 6, adminlog = 0)
|
||||
new /obj/effect/decal/cleanable/greenglow(get_turf(src))
|
||||
radiation_repository.radiate(src, 50)
|
||||
SSradiation.radiate(src, 50)
|
||||
|
||||
// This meteor fries toasters.
|
||||
/obj/effect/meteor/emp
|
||||
|
||||
@@ -122,13 +122,13 @@
|
||||
electrocute_act(instability * 0.3, "unstable energies", 0.75)
|
||||
if(1)
|
||||
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
|
||||
src << "<span class='danger'>Your chassis alerts you to overheating from an unknown external force!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis alerts you to overheating from an unknown external force!</span>")
|
||||
if(2)
|
||||
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
|
||||
src << "<span class='danger'>Your chassis makes the sound of metal groaning!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis makes the sound of metal groaning!</span>")
|
||||
if(3)
|
||||
safe_blink(src, range = 6)
|
||||
src << "<span class='warning'>You're teleported against your will!</span>"
|
||||
to_chat(src, "<span class='warning'>You're teleported against your will!</span>")
|
||||
if(4)
|
||||
emp_act(3)
|
||||
|
||||
@@ -141,10 +141,10 @@
|
||||
emp_act(2)
|
||||
if(2)
|
||||
adjustFireLoss(instability * 0.3) //30 burn @ 100 instability
|
||||
src << "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>")
|
||||
if(3)
|
||||
adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability
|
||||
src << "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>")
|
||||
|
||||
if(101 to 200) //Lethal
|
||||
rng = rand(0,4)
|
||||
@@ -155,10 +155,10 @@
|
||||
emp_act(1)
|
||||
if(2)
|
||||
adjustFireLoss(instability * 0.4) //40 burn @ 100 instability
|
||||
src << "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>")
|
||||
if(3)
|
||||
adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability
|
||||
src << "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>")
|
||||
|
||||
/mob/living/carbon/human/instability_effects()
|
||||
if(instability)
|
||||
@@ -190,23 +190,23 @@
|
||||
if(2)
|
||||
if(can_feel_pain())
|
||||
apply_effect(instability * 0.3, AGONY)
|
||||
src << "<span class='danger'>You feel a sharp pain!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel a sharp pain!</span>")
|
||||
if(3)
|
||||
apply_effect(instability * 0.3, EYE_BLUR)
|
||||
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
|
||||
to_chat(src, "<span class='danger'>Your eyes start to get cloudy!</span>")
|
||||
if(4)
|
||||
electrocute_act(instability * 0.3, "unstable energies")
|
||||
if(5)
|
||||
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
|
||||
src << "<span class='danger'>You feel your skin burn!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel your skin burn!</span>")
|
||||
if(6)
|
||||
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
|
||||
src << "<span class='danger'>You feel a sharp pain as an unseen force harms your body!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel a sharp pain as an unseen force harms your body!</span>")
|
||||
if(7)
|
||||
adjustToxLoss(instability * 0.15) //7.5 tox @ 50 instability
|
||||
if(8)
|
||||
safe_blink(src, range = 6)
|
||||
src << "<span class='warning'>You're teleported against your will!</span>"
|
||||
to_chat(src, "<span class='warning'>You're teleported against your will!</span>")
|
||||
|
||||
if(50 to 100) //Severe
|
||||
rng = rand(0,8)
|
||||
@@ -218,18 +218,18 @@
|
||||
if(2)
|
||||
if(can_feel_pain())
|
||||
apply_effect(instability * 0.7, AGONY)
|
||||
src << "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>")
|
||||
if(3)
|
||||
apply_effect(instability * 0.5, EYE_BLUR)
|
||||
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
|
||||
to_chat(src, "<span class='danger'>Your eyes start to get cloudy!</span>")
|
||||
if(4)
|
||||
electrocute_act(instability * 0.5, "extremely unstable energies")
|
||||
if(5)
|
||||
fire_act()
|
||||
src << "<span class='danger'>You spontaneously combust!</span>"
|
||||
to_chat(src, "<span class='danger'>You spontaneously combust!</span>")
|
||||
if(6)
|
||||
adjustCloneLoss(instability * 0.05) //5 cloneloss @ 100 instability
|
||||
src << "<span class='danger'>You feel your body slowly degenerate.</span>"
|
||||
to_chat(src, "<span class='danger'>You feel your body slowly degenerate.</span>")
|
||||
if(7)
|
||||
adjustToxLoss(instability * 0.25) //25 tox @ 100 instability
|
||||
|
||||
@@ -245,18 +245,18 @@
|
||||
if(2)
|
||||
if(can_feel_pain())
|
||||
apply_effect(instability, AGONY)
|
||||
src << "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>")
|
||||
if(3)
|
||||
apply_effect(instability, EYE_BLUR)
|
||||
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
|
||||
to_chat(src, "<span class='danger'>Your eyes start to get cloudy!</span>")
|
||||
if(4)
|
||||
electrocute_act(instability, "extremely unstable energies")
|
||||
if(5)
|
||||
fire_act()
|
||||
src << "<span class='danger'>You spontaneously combust!</span>"
|
||||
to_chat(src, "<span class='danger'>You spontaneously combust!</span>")
|
||||
if(6)
|
||||
adjustCloneLoss(instability * 0.10) //5 cloneloss @ 100 instability
|
||||
src << "<span class='danger'>You feel your body slowly degenerate.</span>"
|
||||
to_chat(src, "<span class='danger'>You feel your body slowly degenerate.</span>")
|
||||
if(7)
|
||||
adjustToxLoss(instability * 0.40) //40 tox @ 100 instability
|
||||
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too.
|
||||
l_spell.on_combine_cast(S, src)
|
||||
else //Welp
|
||||
src << "<span class='warning'>You require a free hand to use this function.</span>"
|
||||
to_chat(src, "<span class='warning'>You require a free hand to use this function.</span>")
|
||||
return 0
|
||||
|
||||
if(S.run_checks())
|
||||
|
||||
@@ -1,54 +1,26 @@
|
||||
//VOREStation Edit - Basically this whole file
|
||||
/datum/job/intern
|
||||
title = "Intern"
|
||||
flag = INTERN
|
||||
department = "Civilian"
|
||||
department_flag = ENGSEC // VOREStation Edit - Ran out of bits
|
||||
faction = "Station"
|
||||
total_positions = -1
|
||||
spawn_positions = -1
|
||||
supervisors = "the staff from the departmen you're interning in"
|
||||
selection_color = "#555555"
|
||||
economic_modifier = 2
|
||||
access = list() //See /datum/job/assistant/get_access()
|
||||
minimal_access = list() //See /datum/job/assistant/get_access()
|
||||
outfit_type = /decl/hierarchy/outfit/job/assistant/intern
|
||||
alt_titles = list("Apprentice Engineer","Medical Intern","Lab Assistant","Security Cadet","Jr. Cargo Tech", "Jr. Explorer") //VOREStation Edit
|
||||
timeoff_factor = 0 //VOREStation Edit - Interns, noh
|
||||
|
||||
//VOREStation Add
|
||||
/datum/job/intern/New()
|
||||
..()
|
||||
if(config)
|
||||
total_positions = config.limit_interns
|
||||
spawn_positions = config.limit_interns
|
||||
//VOREStation Add End
|
||||
|
||||
// VOREStation Add
|
||||
/datum/job/assistant
|
||||
title = USELESS_JOB
|
||||
title = "Assistant"
|
||||
flag = ASSISTANT
|
||||
department = "Civilian"
|
||||
department_flag = CIVILIAN
|
||||
faction = "Station"
|
||||
total_positions = -1
|
||||
spawn_positions = -1
|
||||
supervisors = "nobody! You don't work here"
|
||||
supervisors = "absolutely everyone"
|
||||
selection_color = "#515151"
|
||||
economic_modifier = 1
|
||||
access = list()
|
||||
minimal_access = list()
|
||||
access = list() //See /datum/job/assistant/get_access()
|
||||
minimal_access = list() //See /datum/job/assistant/get_access()
|
||||
outfit_type = /decl/hierarchy/outfit/job/assistant
|
||||
timeoff_factor = 0
|
||||
/datum/job/assistant/New()
|
||||
..()
|
||||
if(config)
|
||||
total_positions = config.limit_visitors
|
||||
spawn_positions = config.limit_visitors
|
||||
/* alt_titles = list(
|
||||
"Technical Assistant",
|
||||
"Medical Intern",
|
||||
"Research Assistant",
|
||||
"Visitor" = /decl/hierarchy/outfit/job/assistant/visitor
|
||||
) */ //VOREStation Removal: no alt-titles for visitors
|
||||
|
||||
/datum/job/assistant/get_access()
|
||||
if(config.assistant_maint)
|
||||
return list(access_maint_tunnels)
|
||||
else
|
||||
return list()
|
||||
//VOREStation Add End
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/datum/job/intern
|
||||
title = "Intern"
|
||||
flag = INTERN
|
||||
department = "Civilian"
|
||||
department_flag = ENGSEC // Ran out of bits
|
||||
faction = "Station"
|
||||
total_positions = -1
|
||||
spawn_positions = -1
|
||||
supervisors = "the staff from the department you're interning in"
|
||||
selection_color = "#555555"
|
||||
economic_modifier = 2
|
||||
access = list() //See /datum/job/intern/get_access()
|
||||
minimal_access = list() //See /datum/job/intern/get_access()
|
||||
outfit_type = /decl/hierarchy/outfit/job/assistant/intern
|
||||
alt_titles = list("Apprentice Engineer","Medical Intern","Lab Assistant","Security Cadet","Jr. Cargo Tech", "Jr. Explorer", "Server" = /decl/hierarchy/outfit/job/service/server)
|
||||
timeoff_factor = 0 // Interns, noh
|
||||
|
||||
/datum/job/intern/New()
|
||||
..()
|
||||
if(config)
|
||||
total_positions = config.limit_interns
|
||||
spawn_positions = config.limit_interns
|
||||
|
||||
/datum/job/intern/get_access()
|
||||
if(config.assistant_maint)
|
||||
return list(access_maint_tunnels)
|
||||
else
|
||||
return list()
|
||||
|
||||
/datum/job/assistant // Visitor
|
||||
title = USELESS_JOB
|
||||
supervisors = "nobody! You don't work here"
|
||||
timeoff_factor = 0
|
||||
|
||||
/datum/job/assistant/New()
|
||||
..()
|
||||
if(config)
|
||||
total_positions = config.limit_visitors
|
||||
spawn_positions = config.limit_visitors
|
||||
|
||||
/datum/job/assistant/get_access()
|
||||
return list()
|
||||
@@ -31,7 +31,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
H.implant_loyalty(src)
|
||||
*/
|
||||
/datum/job/captain/get_access()
|
||||
return get_all_station_access()
|
||||
return get_all_station_access().Copy()
|
||||
|
||||
/datum/job/hop
|
||||
title = "Head of Personnel"
|
||||
@@ -60,13 +60,13 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
|
||||
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_hop, access_RC_announce, access_keycard_auth) //, access_gateway) //VOREStation Edit
|
||||
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
|
||||
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
|
||||
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_hop, access_RC_announce, access_keycard_auth) //, access_gateway) //VOREStation Edit
|
||||
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
|
||||
|
||||
/datum/job/secretary
|
||||
title = "Command Secretary"
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/datum/job/captain
|
||||
disallow_jobhop = TRUE
|
||||
|
||||
/datum/job/hop
|
||||
|
||||
disallow_jobhop = TRUE
|
||||
alt_titles = list("Deputy Director", "Crew Resources Officer")
|
||||
|
||||
access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
|
||||
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
|
||||
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_hop, access_RC_announce, access_keycard_auth)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
|
||||
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
|
||||
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_hop, access_RC_announce, access_keycard_auth)
|
||||
|
||||
/datum/job/secretary
|
||||
disallow_jobhop = TRUE
|
||||
@@ -132,8 +132,8 @@
|
||||
department = "Civilian"
|
||||
department_flag = CIVILIAN
|
||||
faction = "Station"
|
||||
total_positions = 2 // VOREStation Edit. Original number is 1.
|
||||
spawn_positions = 2 // VOREStation Edit. Original number is 1.
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/librarian
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/datum/job/chef
|
||||
total_positions = 2 //IT TAKES A LOT TO MAKE A STEW
|
||||
spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO
|
||||
|
||||
/datum/job/cargo_tech
|
||||
total_positions = 3
|
||||
spawn_positions = 3
|
||||
|
||||
/datum/job/mining
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
|
||||
/datum/job/janitor //Lots of janitor substations on station.
|
||||
total_positions = 3
|
||||
spawn_positions = 3
|
||||
alt_titles = list("Custodian", "Sanitation Technician", "Maid")
|
||||
|
||||
//TFF 5/9/19 - restore librarian job slot to 2
|
||||
/datum/job/librarian
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
alt_titles = list("Journalist", "Historian", "Writer")
|
||||
|
||||
/datum/job/lawyer
|
||||
disallow_jobhop = TRUE
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user