Merge pull request #1 from VOREStation/master

Sync
This commit is contained in:
BlackMajor
2019-11-13 10:59:05 +13:00
committed by GitHub
1182 changed files with 214422 additions and 140166 deletions
+1 -1
View File
@@ -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
View File
@@ -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
+2 -2
View File
@@ -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
View File
@@ -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()
+1
View File
@@ -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"
+1
View File
@@ -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
+1
View File
@@ -8,6 +8,7 @@
#define HALLOSS "halloss"
#define ELECTROCUTE "electrocute"
#define BIOACID "bioacid"
#define SEARING "searing"
#define CUT "cut"
#define BRUISE "bruise"
+6 -3
View File
@@ -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
View File
@@ -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"
+1
View File
@@ -35,3 +35,4 @@
#define SPECIES_MONKEY_NEVREAN "Sparra"
#define SPECIES_MONKEY_SERGAL "Saru"
#define SPECIES_MONKEY_VULPKANIN "Wolpin"
#define SPECIES_WEREBEAST "Werebeast"
+2 -1
View File
@@ -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
View File
@@ -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"
+2 -1
View File
@@ -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
+1
View File
@@ -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)
+2 -2
View File
@@ -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
+49 -40
View File
@@ -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,
+15 -1
View File
@@ -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
+31 -3
View File
@@ -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 .
+1 -1
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
/*
+1 -1
View File
@@ -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.
+2 -2
View File
@@ -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)
+4 -4
View File
@@ -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)
-96
View File
@@ -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
-56
View File
@@ -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")
-169
View File
@@ -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)
+3 -3
View File
@@ -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)
+135
View File
@@ -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)
+3 -3
View File
@@ -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
+18
View File
@@ -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
*/
+7
View File
@@ -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
+1 -1
View File
@@ -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
+3 -3
View File
@@ -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")
+12 -1
View File
@@ -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
+8
View File
@@ -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
+5 -5
View File
@@ -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
+4 -4
View File
@@ -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
+6 -6
View File
@@ -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
+2 -2
View File
@@ -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
-138
View File
@@ -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(
+36 -1
View File
@@ -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"
+50 -38
View File
@@ -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
+36 -1
View File
@@ -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"
+41 -19
View File
@@ -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
+20
View File
@@ -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
+50
View File
@@ -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
+57
View File
@@ -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
+42
View File
@@ -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
+4 -24
View File
@@ -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
+7 -7
View File
@@ -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].")
+4 -4
View File
@@ -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
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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 -252
View File
@@ -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"
+6
View File
@@ -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
View File
@@ -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 -1
View File
@@ -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
+2
View File
@@ -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!
+22 -3
View File
@@ -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)
+13 -13
View File
@@ -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>")
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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
+20 -20
View File
@@ -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())
+10 -38
View File
@@ -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
+42
View File
@@ -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()
+3 -3
View File
@@ -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"
+23
View File
@@ -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
+2 -2
View File
@@ -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
+28
View File
@@ -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