mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-18 19:39:53 +01:00
@@ -0,0 +1,315 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"c" = (
|
||||
/turf/open/lava/smooth/lava_land_surface,
|
||||
/area/ruin/unpowered)
|
||||
"d" = (
|
||||
/obj/effect/decal/remains/human,
|
||||
/mob/living/simple_animal/hostile/carp/eyeball,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"e" = (
|
||||
/obj/effect/decal/remains/human,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered)
|
||||
"f" = (
|
||||
/obj/effect/decal/cleanable/blood/gibs/human/limb,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"g" = (
|
||||
/obj/effect/decal/cleanable/blood,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"l" = (
|
||||
/obj/effect/decal/remains/human,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"o" = (
|
||||
/obj/structure/lunaraltar,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"q" = (
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"s" = (
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered)
|
||||
"x" = (
|
||||
/obj/effect/decal/cleanable/blood,
|
||||
/obj/effect/decal/cleanable/blood,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"y" = (
|
||||
/obj/effect/decal/cleanable/blood/gibs/human,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"A" = (
|
||||
/mob/living/simple_animal/hostile/carp/eyeball,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"R" = (
|
||||
/obj/effect/decal/cleanable/ash/large,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
"X" = (
|
||||
/obj/effect/decal/cleanable/blood/gibs/human/lizard/limb,
|
||||
/turf/open/floor/plasteel/cult/airless,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
c
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
s
|
||||
e
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
s
|
||||
s
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
e
|
||||
s
|
||||
s
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
e
|
||||
s
|
||||
s
|
||||
a
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
a
|
||||
s
|
||||
s
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
e
|
||||
s
|
||||
a
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
s
|
||||
a
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
a
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
l
|
||||
f
|
||||
d
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
a
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
l
|
||||
q
|
||||
g
|
||||
g
|
||||
y
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
A
|
||||
q
|
||||
o
|
||||
x
|
||||
g
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
l
|
||||
q
|
||||
R
|
||||
X
|
||||
l
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
a
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
q
|
||||
q
|
||||
A
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
a
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
a
|
||||
s
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
s
|
||||
s
|
||||
a
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
a
|
||||
s
|
||||
s
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
e
|
||||
s
|
||||
a
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
a
|
||||
e
|
||||
s
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
e
|
||||
s
|
||||
s
|
||||
a
|
||||
"}
|
||||
(14,1,1) = {"
|
||||
a
|
||||
s
|
||||
e
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
s
|
||||
s
|
||||
s
|
||||
a
|
||||
"}
|
||||
(15,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
c
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -37381,13 +37381,13 @@
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/folder/white,
|
||||
/obj/item/stamp/cmo,
|
||||
/obj/item/clothing/glasses/hud/health,
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/clothing/glasses/hud/health/gar,
|
||||
/turf/open/floor/plasteel/cafeteria,
|
||||
/area/crew_quarters/heads/cmo)
|
||||
"bDW" = (
|
||||
|
||||
@@ -4091,7 +4091,7 @@
|
||||
"bCp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 4},/turf/open/floor/plasteel/white,/area/medical/medbay/central)
|
||||
"bCr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable{icon_state = "1-2"},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/cmo)
|
||||
"bCs" = (/obj/structure/table/glass,/obj/item/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/pen{layer = 3.1},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/cmo)
|
||||
"bCt" = (/obj/structure/table/glass,/obj/item/folder/white,/obj/item/clothing/glasses/hud/health,/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/cmo)
|
||||
"bCt" = (/obj/structure/table/glass,/obj/item/folder/white,/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/obj/item/clothing/glasses/hud/health/gar,/turf/open/floor/plasteel/white,/area/crew_quarters/heads/cmo)
|
||||
"bCu" = (/obj/structure/table/glass,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/stack/medical/gauze,/obj/item/clothing/neck/stethoscope,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/cmo)
|
||||
"bCv" = (/obj/structure/cable{icon_state = "2-4"},/obj/structure/disposalpipe/sorting/mail{dir = 8; sortType = 10},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/cable{icon_state = "1-4"},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/cmo)
|
||||
"bCx" = (/obj/structure/cable{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/turf/open/floor/plating,/area/maintenance/department/engine)
|
||||
|
||||
+54823
-54759
File diff suppressed because it is too large
Load Diff
@@ -12,6 +12,8 @@
|
||||
#define ROBOTICIST (1<<8)
|
||||
#define AI_JF (1<<9)
|
||||
#define CYBORG (1<<10)
|
||||
#define JR_OFFICER (1<<11)
|
||||
#define JR_ENGINEER (1<<12)
|
||||
|
||||
|
||||
#define MEDSCI (1<<1)
|
||||
@@ -23,6 +25,8 @@
|
||||
#define DOCTOR (1<<4)
|
||||
#define GENETICIST (1<<5)
|
||||
#define VIROLOGIST (1<<6)
|
||||
#define JR_DOCTOR (1<<7)
|
||||
#define JR_SCIENTIST (1<<9)
|
||||
|
||||
|
||||
#define CIVILIAN (1<<2)
|
||||
|
||||
@@ -66,8 +66,9 @@
|
||||
#define SPACEVINE_LAYER 4.8
|
||||
#define SPACEVINE_MOB_LAYER 4.9
|
||||
//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define
|
||||
#define GASFIRE_LAYER 5.05
|
||||
#define RIPPLE_LAYER 5.1
|
||||
#define ABOVE_FLY_LAYER 5.1
|
||||
#define GASFIRE_LAYER 5.2
|
||||
#define RIPPLE_LAYER 5.3
|
||||
|
||||
#define GHOST_LAYER 6
|
||||
#define LOW_LANDMARK_LAYER 9
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#define LOG_GAME (1 << 12)
|
||||
#define LOG_ADMIN_PRIVATE (1 << 13)
|
||||
#define LOG_ASAY (1 << 14)
|
||||
#define LOG_VIRUS (1 << 15)
|
||||
|
||||
//Individual logging panel pages
|
||||
#define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK)
|
||||
|
||||
@@ -272,3 +272,5 @@
|
||||
|
||||
#define PULL_PRONE_SLOWDOWN 0.6
|
||||
#define HUMAN_CARRY_SLOWDOWN 0
|
||||
|
||||
#define TYPING_INDICATOR_TIMEOUT 10 MINUTES
|
||||
|
||||
@@ -123,6 +123,7 @@
|
||||
#define TRAIT_CALCIUM_HEALER "calcium_healer"
|
||||
#define TRAIT_ALCOHOL_LIGHTWEIGHT "alcohol_lightweight" //Skyrat port
|
||||
#define TRAIT_CURSED_BLOOD "cursed_blood" //Yo dawg I heard you like bloodborne references so I put a
|
||||
#define TRAIT_RADRESONANCE "radioactive resonance" //Hyperstation edit
|
||||
|
||||
#define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking
|
||||
#define TRAIT_CAPTAIN_METABOLISM "captain-metabolism"
|
||||
@@ -184,6 +185,7 @@
|
||||
#define OBESITY "obesity"
|
||||
#define MAGIC_TRAIT "magic"
|
||||
#define TRAUMA_TRAIT "trauma"
|
||||
#define DISEASE_TRAIT "disease"
|
||||
#define SPECIES_TRAIT "species"
|
||||
#define ORGAN_TRAIT "organ"
|
||||
#define JOB_TRAIT "job"
|
||||
|
||||
@@ -381,6 +381,12 @@
|
||||
i++
|
||||
return i
|
||||
|
||||
/proc/count_occurences_of_value(list/L, val, limit) //special thanks to salmonsnake
|
||||
. = 0
|
||||
for (var/i in 1 to limit)
|
||||
if (L[i] == val)
|
||||
.++
|
||||
|
||||
/proc/find_record(field, value, list/L)
|
||||
for(var/datum/data/record/R in L)
|
||||
if(R.fields[field] == value)
|
||||
|
||||
@@ -61,6 +61,10 @@
|
||||
if (CONFIG_GET(flag/log_game))
|
||||
WRITE_LOG(GLOB.world_game_log, "GAME: [text]")
|
||||
|
||||
/proc/log_virus(text)
|
||||
if (CONFIG_GET(flag/log_virus))
|
||||
WRITE_LOG(GLOB.world_virus_log, "VIRUS: [text]")
|
||||
|
||||
/proc/log_access(text)
|
||||
if (CONFIG_GET(flag/log_access))
|
||||
WRITE_LOG(GLOB.world_game_log, "ACCESS: [text]")
|
||||
|
||||
@@ -26,6 +26,8 @@ GLOBAL_VAR(query_debug_log)
|
||||
GLOBAL_PROTECT(query_debug_log)
|
||||
GLOBAL_VAR(world_job_debug_log)
|
||||
GLOBAL_PROTECT(world_job_debug_log)
|
||||
GLOBAL_VAR(world_virus_log)
|
||||
GLOBAL_PROTECT(world_virus_log)
|
||||
|
||||
GLOBAL_LIST_EMPTY(bombers)
|
||||
GLOBAL_PROTECT(bombers)
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
|
||||
/datum/config_entry/flag/log_game // log game events
|
||||
|
||||
/datum/config_entry/flag/log_virus // log virology data
|
||||
|
||||
/datum/config_entry/flag/log_vote // log voting
|
||||
|
||||
/datum/config_entry/flag/log_whisper // log client whisper
|
||||
|
||||
@@ -6,7 +6,17 @@ SUBSYSTEM_DEF(assets)
|
||||
var/list/preload = list()
|
||||
|
||||
/datum/controller/subsystem/assets/Initialize(timeofday)
|
||||
for(var/type in typesof(/datum/asset))
|
||||
|
||||
var/list/priority_assets = list(
|
||||
/datum/asset/simple/oui_theme_nano,
|
||||
/datum/asset/simple/goonchat
|
||||
)
|
||||
|
||||
for(var/type in priority_assets)
|
||||
var/datum/asset/A = new type()
|
||||
A.register()
|
||||
|
||||
for(var/type in typesof(/datum/asset) - (priority_assets | list(/datum/asset, /datum/asset/simple)))
|
||||
var/datum/asset/A = type
|
||||
if (type != initial(A._abstract))
|
||||
get_asset_datum(type)
|
||||
|
||||
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(input)
|
||||
// This is for when macro sets are eventualy datumized
|
||||
/datum/controller/subsystem/input/proc/setup_default_macro_sets()
|
||||
var/list/static/default_macro_sets
|
||||
|
||||
|
||||
if(default_macro_sets)
|
||||
macro_sets = default_macro_sets
|
||||
return
|
||||
@@ -33,10 +33,11 @@ SUBSYSTEM_DEF(input)
|
||||
"Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"",
|
||||
"O" = "ooc",
|
||||
"Ctrl+O" = "looc",
|
||||
"T" = "say",
|
||||
"Ctrl+T" = "whisper",
|
||||
"M" = "me",
|
||||
"Ctrl+M" = "subtle",
|
||||
"Ctrl+T" = "say",
|
||||
"T" = "say_indicator",
|
||||
"Y" = "whisper",
|
||||
"Ctrl+M" = "me",
|
||||
"M" = "me_indicator",
|
||||
"Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs
|
||||
"Any" = "\"KeyDown \[\[*\]\]\"",
|
||||
"Any+UP" = "\"KeyUp \[\[*\]\]\"",
|
||||
@@ -50,7 +51,9 @@ SUBSYSTEM_DEF(input)
|
||||
"Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"",
|
||||
"O" = "ooc",
|
||||
"T" = "say",
|
||||
"Ctrl+T" = "say_indicator",
|
||||
"M" = "me",
|
||||
"Ctrl+M" = "me_indicator",
|
||||
"Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs
|
||||
"Any" = "\"KeyDown \[\[*\]\]\"",
|
||||
"Any+UP" = "\"KeyUp \[\[*\]\]\"",
|
||||
|
||||
@@ -91,6 +91,17 @@ SUBSYSTEM_DEF(mapping)
|
||||
seedRuins(space_ruins, CONFIG_GET(number/space_budget), /area/space, space_ruins_templates)
|
||||
SSmapping.seedStation()
|
||||
loading_ruins = FALSE
|
||||
/*
|
||||
//Hyper change - preload Reebe for midround purposes. I'll change this when I find a decent way to load maps midround.
|
||||
var/list/errorList = list()
|
||||
var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
|
||||
if(errorList.len) // reebe failed to load
|
||||
message_admins("Reebe failed to load!")
|
||||
log_game("Reebe failed to load!")
|
||||
return FALSE
|
||||
for(var/datum/parsed_map/PM in reebes)
|
||||
PM.initTemplateBounds()
|
||||
*/
|
||||
#endif
|
||||
repopulate_sorted_areas()
|
||||
// Set up Z-level transitions.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#define DYNAMIC_DEFAULT_CHAOS 1.5 //The default chaos value for low pop low vote rounds
|
||||
#define DYNAMIC_DEFAULT_CHAOS 1.0 //The default chaos value for low pop low vote rounds
|
||||
#define DYNAMIC_VOTE_NORMALIZATION 5 //If there are fewer than this many votes, the average will be skewed towards the default
|
||||
|
||||
SUBSYSTEM_DEF(vote)
|
||||
@@ -158,7 +158,7 @@ SUBSYSTEM_DEF(vote)
|
||||
. = (total / v)
|
||||
if(total == 0)//If statements down the road break if total is allowed to be 0 and it defaults to normal extended.
|
||||
. = 0.1
|
||||
text += "\n<b>Chaos level [obfuscated ? "???" : .]</b>"
|
||||
text += "\n<b>Chaos level [.]</b>"
|
||||
|
||||
if(mode != "custom" && mode != "dynamic")
|
||||
if(winners.len > 1 && !obfuscated) //CIT CHANGE - adds obfuscated votes
|
||||
@@ -285,6 +285,7 @@ SUBSYSTEM_DEF(vote)
|
||||
if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote
|
||||
choices.Add("secret", "extended")
|
||||
if("dynamic")
|
||||
obfuscated = TRUE
|
||||
choices.Add("0","1","2","3","4","5")
|
||||
if("custom")
|
||||
question = stripped_input(usr,"What is the vote for?")
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
|
||||
/datum/component/storage/proc/quick_empty(mob/M)
|
||||
var/atom/A = parent
|
||||
if((!ishuman(M) && (A.loc != M)) || (M.stat != CONSCIOUS) || M.restrained() || !M.canmove)
|
||||
if(!M.canUseStorage() || !A.Adjacent(M) || M.incapacitated())
|
||||
return
|
||||
if(check_locked(null, M, TRUE))
|
||||
return FALSE
|
||||
|
||||
@@ -144,3 +144,9 @@
|
||||
if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs)))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/mob/living/proc/CanSpreadAirborneDisease()
|
||||
return !is_mouth_covered()
|
||||
|
||||
/mob/living/carbon/CanSpreadAirborneDisease()
|
||||
return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.armor.getRating("bio") >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.armor.getRating("bio") >= 25)))
|
||||
@@ -55,6 +55,13 @@
|
||||
D.after_add()
|
||||
infectee.med_hud_set_status()
|
||||
|
||||
var/turf/source_turf = get_turf(infectee)
|
||||
log_virus("[key_name(infectee)] was infected by virus: [src.admin_details()] at [loc_name(source_turf)]")
|
||||
|
||||
//Return a string for admin logging uses, should describe the disease in detail
|
||||
/datum/disease/proc/admin_details()
|
||||
return "[src.name] : [src.type]"
|
||||
|
||||
/datum/disease/proc/stage_act()
|
||||
var/cure = has_cure()
|
||||
|
||||
@@ -65,15 +72,17 @@
|
||||
|
||||
if(!cure)
|
||||
if(prob(stage_prob))
|
||||
stage = min(stage + 1,max_stages)
|
||||
update_stage(min(stage + 1,max_stages))
|
||||
else
|
||||
if(prob(cure_chance))
|
||||
stage = max(stage - 1, 1)
|
||||
update_stage(max(stage - 1, 1))
|
||||
|
||||
if(disease_flags & CURABLE)
|
||||
if(cure && prob(cure_chance))
|
||||
cure()
|
||||
|
||||
/datum/disease/proc/update_stage(new_stage)
|
||||
stage = new_stage
|
||||
|
||||
/datum/disease/proc/has_cure()
|
||||
if(!(disease_flags & CURABLE))
|
||||
|
||||
@@ -31,9 +31,9 @@
|
||||
var/id = ""
|
||||
var/processing = FALSE
|
||||
var/mutable = TRUE //set to FALSE to prevent most in-game methods of altering the disease via virology
|
||||
var/oldres
|
||||
var/oldres //To prevent setting new cures unless resistance changes.
|
||||
|
||||
// The order goes from easy to cure to hard to cure.
|
||||
// The order goes from easy to cure to hard to cure. Keep in mind that sentient diseases pick two cures from tier 6 and up, ensure they wont react away in bodies.
|
||||
var/static/list/advance_cures = list(
|
||||
list( // level 1
|
||||
"copper", "silver", "iodine", "iron", "carbon"
|
||||
@@ -110,15 +110,22 @@
|
||||
return
|
||||
|
||||
if(symptoms && symptoms.len)
|
||||
|
||||
if(!processing)
|
||||
processing = TRUE
|
||||
for(var/datum/symptom/S in symptoms)
|
||||
S.Start(src)
|
||||
if(S.Start(src)) //this will return FALSE if the symptom is neutered
|
||||
S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10)
|
||||
S.on_stage_change(src)
|
||||
|
||||
for(var/datum/symptom/S in symptoms)
|
||||
S.Activate(src)
|
||||
|
||||
// Tell symptoms stage changed
|
||||
/datum/disease/advance/update_stage(new_stage)
|
||||
..()
|
||||
for(var/datum/symptom/S in symptoms)
|
||||
S.on_stage_change(src)
|
||||
|
||||
// Compares type then ID.
|
||||
/datum/disease/advance/IsSame(datum/disease/advance/D)
|
||||
|
||||
@@ -137,10 +144,16 @@
|
||||
A.symptoms += S.Copy()
|
||||
A.properties = properties.Copy()
|
||||
A.id = id
|
||||
A.mutable = mutable
|
||||
A.oldres = oldres
|
||||
//this is a new disease starting over at stage 1, so processing is not copied
|
||||
return A
|
||||
|
||||
//Describe this disease to an admin in detail (for logging)
|
||||
/datum/disease/advance/admin_details()
|
||||
var/list/name_symptoms = list()
|
||||
for(var/datum/symptom/S in symptoms)
|
||||
name_symptoms += S.name
|
||||
return "[name] sym:[english_list(name_symptoms)] r:[totalResistance()] s:[totalStealth()] ss:[totalStageSpeed()] t:[totalTransmittable()]"
|
||||
/*
|
||||
|
||||
NEW PROCS
|
||||
@@ -191,6 +204,10 @@
|
||||
/datum/disease/advance/proc/Refresh(new_name = FALSE)
|
||||
GenerateProperties()
|
||||
AssignProperties()
|
||||
if(processing && symptoms && symptoms.len)
|
||||
for(var/datum/symptom/S in symptoms)
|
||||
S.Start(src)
|
||||
S.on_stage_change(src)
|
||||
id = null
|
||||
|
||||
var/the_id = GetDiseaseID()
|
||||
@@ -342,28 +359,28 @@
|
||||
return id
|
||||
|
||||
|
||||
// Add a symptom, if it is over the limit (with a small chance to be able to go over)
|
||||
// we take a random symptom away and add the new one.
|
||||
// Add a symptom, if it is over the limit we take a random symptom away and add the new one.
|
||||
/datum/disease/advance/proc/AddSymptom(datum/symptom/S)
|
||||
|
||||
if(HasSymptom(S))
|
||||
return
|
||||
|
||||
if(symptoms.len < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1))
|
||||
symptoms += S
|
||||
else
|
||||
if(!(symptoms.len < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1)))
|
||||
RemoveSymptom(pick(symptoms))
|
||||
symptoms += S
|
||||
symptoms += S
|
||||
S.OnAdd(src)
|
||||
|
||||
// Simply removes the symptom.
|
||||
/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S)
|
||||
symptoms -= S
|
||||
S.OnRemove(src)
|
||||
|
||||
// Neuter a symptom, so it will only affect stats
|
||||
/datum/disease/advance/proc/NeuterSymptom(datum/symptom/S)
|
||||
if(!S.neutered)
|
||||
S.neutered = TRUE
|
||||
S.name += " (neutered)"
|
||||
S.OnRemove(src)
|
||||
|
||||
/*
|
||||
|
||||
@@ -417,7 +434,7 @@
|
||||
|
||||
var/i = VIRUS_SYMPTOM_LIMIT
|
||||
|
||||
var/datum/disease/advance/D = new(0, null)
|
||||
var/datum/disease/advance/D = new()
|
||||
D.symptoms = list()
|
||||
|
||||
var/list/symptoms = list()
|
||||
@@ -444,10 +461,6 @@
|
||||
return
|
||||
D.AssignName(new_name)
|
||||
D.Refresh()
|
||||
|
||||
for(var/datum/disease/advance/AD in SSdisease.active_diseases)
|
||||
AD.Refresh()
|
||||
|
||||
for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list))
|
||||
if(!is_station_level(H.z))
|
||||
continue
|
||||
@@ -458,7 +471,8 @@
|
||||
var/list/name_symptoms = list()
|
||||
for(var/datum/symptom/S in D.symptoms)
|
||||
name_symptoms += S.name
|
||||
message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]")
|
||||
message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.admin_details()]")
|
||||
log_virus("[key_name(user)] has triggered a custom virus outbreak of [D.admin_details()]!")
|
||||
|
||||
|
||||
/datum/disease/advance/proc/totalStageSpeed()
|
||||
|
||||
@@ -70,6 +70,6 @@ BONUS
|
||||
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6)
|
||||
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12)
|
||||
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18)
|
||||
if(infective)
|
||||
if(infective && M.CanSpreadAirborneDisease())
|
||||
A.spread(1)
|
||||
|
||||
|
||||
@@ -219,8 +219,10 @@
|
||||
level = 8
|
||||
passive_message = "<span class='notice'>The pain from your wounds makes you feel oddly sleepy...</span>"
|
||||
var/deathgasp = FALSE
|
||||
var/stabilize = FALSE
|
||||
var/active_coma = FALSE //to prevent multiple coma procs
|
||||
threshold_desc = "<b>Stealth 2:</b> Host appears to die when falling into a coma.<br>\
|
||||
<b>Resistance 4:</b> The virus also stabilizes the host while they are in critical condition.<br>\
|
||||
<b>Stage Speed 7:</b> Increases healing speed."
|
||||
|
||||
/datum/symptom/heal/coma/Start(datum/disease/advance/A)
|
||||
@@ -228,9 +230,25 @@
|
||||
return
|
||||
if(A.properties["stage_rate"] >= 7)
|
||||
power = 1.5
|
||||
if(A.properties["resistance"] >= 4)
|
||||
stabilize = TRUE
|
||||
if(A.properties["stealth"] >= 2)
|
||||
deathgasp = TRUE
|
||||
|
||||
/datum/symptom/heal/coma/on_stage_change(datum/disease/advance/A) //mostly copy+pasted from the code for self-respiration's TRAIT_NOBREATH stuff
|
||||
if(!..())
|
||||
return FALSE
|
||||
if(A.stage >= 4 && stabilize)
|
||||
ADD_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT)
|
||||
else
|
||||
REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT)
|
||||
return TRUE
|
||||
|
||||
/datum/symptom/heal/coma/End(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT)
|
||||
|
||||
/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
|
||||
var/mob/living/M = A.affected_mob
|
||||
if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
|
||||
@@ -427,6 +445,7 @@
|
||||
power = 2
|
||||
if(A.properties["transmittable"] >= 6)
|
||||
cellular_damage = TRUE
|
||||
ADD_TRAIT(A.affected_mob, TRAIT_RADRESONANCE, DISEASE_TRAIT)
|
||||
|
||||
/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/A)
|
||||
var/mob/living/M = A.affected_mob
|
||||
@@ -464,3 +483,8 @@
|
||||
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
|
||||
M.update_damage_overlays()
|
||||
return 1
|
||||
|
||||
/datum/symptom/heal/radiation/End(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
REMOVE_TRAIT(A.affected_mob, TRAIT_RADRESONANCE, DISEASE_TRAIT)
|
||||
|
||||
@@ -50,3 +50,19 @@ Bonus
|
||||
if(prob(base_message_chance))
|
||||
to_chat(M, "<span class='notice'>[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]</span>")
|
||||
return
|
||||
|
||||
/datum/symptom/oxygen/on_stage_change(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return FALSE
|
||||
var/mob/living/carbon/M = A.affected_mob
|
||||
if(A.stage >= 4)
|
||||
ADD_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
|
||||
else
|
||||
REMOVE_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
|
||||
return TRUE
|
||||
|
||||
/datum/symptom/oxygen/End(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
if(A.stage >= 4)
|
||||
REMOVE_TRAIT(A.affected_mob, TRAIT_NOBREATH, DISEASE_TRAIT)
|
||||
@@ -48,4 +48,5 @@ Bonus
|
||||
M.emote("sniff")
|
||||
else
|
||||
M.emote("sneeze")
|
||||
A.spread(4 + power)
|
||||
if(M.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
|
||||
A.spread(4 + power)
|
||||
@@ -8,12 +8,14 @@
|
||||
level = 5
|
||||
severity = 0
|
||||
|
||||
/datum/symptom/undead_adaptation/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
/datum/symptom/undead_adaptation/OnAdd(datum/disease/advance/A)
|
||||
A.process_dead = TRUE
|
||||
A.infectable_biotypes |= MOB_UNDEAD
|
||||
|
||||
/datum/symptom/undead_adaptation/OnRemove(datum/disease/advance/A)
|
||||
A.process_dead = FALSE
|
||||
A.infectable_biotypes -= MOB_UNDEAD
|
||||
|
||||
/datum/symptom/inorganic_adaptation
|
||||
name = "Inorganic Biology"
|
||||
desc = "The virus can survive and replicate even in an inorganic environment, increasing its resistance and infection rate."
|
||||
@@ -24,8 +26,8 @@
|
||||
level = 5
|
||||
severity = 0
|
||||
|
||||
/datum/symptom/inorganic_adaptation/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
/datum/symptom/inorganic_adaptation/OnAdd(datum/disease/advance/A)
|
||||
A.infectable_biotypes |= MOB_INORGANIC
|
||||
|
||||
|
||||
/datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A)
|
||||
A.infectable_biotypes -= MOB_INORGANIC
|
||||
|
||||
@@ -38,11 +38,10 @@
|
||||
return
|
||||
CRASH("We couldn't assign an ID!")
|
||||
|
||||
// Called when processing of the advance disease, which holds this symptom, starts.
|
||||
// Called when processing of the advance disease that holds this symptom infects a host and upon each Refresh() of that advance disease.
|
||||
/datum/symptom/proc/Start(datum/disease/advance/A)
|
||||
if(neutered)
|
||||
return FALSE
|
||||
next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10) //so it doesn't instantly activate on infection
|
||||
return TRUE
|
||||
|
||||
// Called when the advance disease is going to be deleted or when the advance disease stops processing.
|
||||
@@ -60,6 +59,11 @@
|
||||
next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10)
|
||||
return TRUE
|
||||
|
||||
/datum/symptom/proc/on_stage_change(datum/disease/advance/A)
|
||||
if(neutered)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/symptom/proc/Copy()
|
||||
var/datum/symptom/new_symp = new type
|
||||
new_symp.name = name
|
||||
@@ -69,3 +73,9 @@
|
||||
|
||||
/datum/symptom/proc/generate_threshold_desc()
|
||||
return
|
||||
|
||||
/datum/symptom/proc/OnAdd(datum/disease/advance/A) //Overload when a symptom needs to be active before processing, like changing biotypes.
|
||||
return
|
||||
|
||||
/datum/symptom/proc/OnRemove(datum/disease/advance/A) //But dont forget to remove them too.
|
||||
return
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
release()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/mob_can_equip(mob/living/M, mob/living/equipper, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE)
|
||||
if(!ishuman(M)) //monkeys holding monkeys holding monkeys...
|
||||
if(M == held_mob || !ishuman(M)) //monkeys holding monkeys holding monkeys...
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -233,3 +233,11 @@
|
||||
suffix = "lavaland_surface_oasis.dmm"
|
||||
allow_duplicates = FALSE
|
||||
cost = 0
|
||||
|
||||
/datum/map_template/ruin/lavaland/lunaraltar
|
||||
name = "Lunar Altar"
|
||||
id = "lunaraltar"
|
||||
description = "Millenia ago, the humanoids of this strange land used to offer sacrifices here..."
|
||||
suffix = "lavaland_surface_lunaraltar.dmm"
|
||||
allow_duplicates = FALSE
|
||||
cost = 10
|
||||
|
||||
@@ -252,6 +252,11 @@
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone)
|
||||
. = P.on_hit(src, 0, def_zone)
|
||||
|
||||
//used on altdisarm() for special interactions between the shoved victim (target) and the src, with user being the one shoving the target on it.
|
||||
// IMPORTANT: if you wish to add a new own shove_act() to a certain object, remember to add SHOVABLE_ONTO to its obj_flags bitfied var first.
|
||||
/atom/proc/shove_act(mob/living/target, mob/living/user)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/in_contents_of(container)//can take class or object instance as argument
|
||||
if(ispath(container))
|
||||
if(istype(src.loc, container))
|
||||
|
||||
@@ -150,6 +150,7 @@ Credit where due:
|
||||
var/datum/team/clockcult/main_clockcult
|
||||
|
||||
/datum/game_mode/clockwork_cult/pre_setup()
|
||||
/* //Reebe should be preloaded
|
||||
var/list/errorList = list()
|
||||
var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
|
||||
if(errorList.len) // reebe failed to load
|
||||
@@ -158,6 +159,7 @@ Credit where due:
|
||||
return FALSE
|
||||
for(var/datum/parsed_map/PM in reebes)
|
||||
PM.initTemplateBounds()
|
||||
*/
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
restricted_jobs += protected_jobs
|
||||
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
|
||||
|
||||
@@ -17,10 +17,10 @@ GLOBAL_VAR_INIT(dynamic_latejoin_delay_max, (25 MINUTES))
|
||||
GLOBAL_VAR_INIT(dynamic_midround_delay_min, (15 MINUTES))
|
||||
GLOBAL_VAR_INIT(dynamic_midround_delay_max, (35 MINUTES))
|
||||
|
||||
GLOBAL_VAR_INIT(dynamic_event_delay_min, (3 MINUTES))
|
||||
GLOBAL_VAR_INIT(dynamic_event_delay_max, (10 MINUTES))
|
||||
GLOBAL_VAR_INIT(dynamic_event_delay_min, (4 MINUTES))
|
||||
GLOBAL_VAR_INIT(dynamic_event_delay_max, (12 MINUTES))
|
||||
|
||||
GLOBAL_VAR_INIT(dynamic_threat_delay, (5 MINUTES))
|
||||
GLOBAL_VAR_INIT(dynamic_threat_delay, (4 MINUTES))
|
||||
|
||||
// Are HIGHLANDER_RULESETs allowed to stack?
|
||||
GLOBAL_VAR_INIT(dynamic_no_stacking, TRUE)
|
||||
@@ -125,9 +125,10 @@ GLOBAL_VAR_INIT(dynamic_chaos_level, 1.5)
|
||||
/datum/game_mode/dynamic/admin_panel()
|
||||
var/list/dat = list("<html><head><title>Game Mode Panel</title></head><body><h1><B>Game Mode Panel</B></h1>")
|
||||
dat += "Dynamic Mode <a href='?_src_=vars;[HrefToken()];Vars=[REF(src)]'>\[VV\]</A><BR>"
|
||||
dat += "Threat Level: <b>[threat_level]</b><br/>"
|
||||
|
||||
dat += "Threat to Spend: <b>[threat]</b> <a href='?src=\ref[src];[HrefToken()];adjustthreat=1'>\[Adjust\]</A> <a href='?src=\ref[src];[HrefToken()];threatlog=1'>\[View Log\]</a><br/>"
|
||||
dat += "Chaos Level: <b>[GLOB.dynamic_chaos_level]</b><br/>"
|
||||
//dat += "Threat Level: <b>[threat_level]</b><br/>"
|
||||
//dat += "Threat to Spend: <b>[threat]</b> <a href='?src=\ref[src];[HrefToken()];adjustthreat=1'>\[Adjust\]</A> <a href='?src=\ref[src];[HrefToken()];threatlog=1'>\[View Log\]</a><br/>"
|
||||
dat += "Threat Level: <b>[threat]</b> <a href='?src=\ref[src];[HrefToken()];adjustthreat=1'>\[Adjust\]</A> <a href='?src=\ref[src];[HrefToken()];threatlog=1'>\[View Log\]</a><br/>"
|
||||
dat += "<br/>"
|
||||
dat += "Parameters: centre = [GLOB.dynamic_curve_centre] ; width = [GLOB.dynamic_curve_width].<br/>"
|
||||
//dat += "<i>On average, <b>[peaceful_percentage]</b>% of the rounds are more peaceful.</i><br/>"
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
continue // Dead players cannot count as opponents
|
||||
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
|
||||
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
|
||||
|
||||
var/threat = max(min(round(mode.threat_level/10),9),1) //min() to stop index errors at 100 threat //Max to stop breaking at 0 threat.
|
||||
if (job_check < required_enemies[threat])
|
||||
return FALSE
|
||||
@@ -104,7 +103,7 @@
|
||||
typepath = /datum/round_event/pirates
|
||||
antag_flag = ROLE_TRAITOR
|
||||
enemy_roles = list("AI","Security Officer","Head of Security","Captain")
|
||||
required_enemies = list(2,2,2,2,1,1,1,1,0,0)
|
||||
required_enemies = list(3,3,2,2,2,1,1,1,1,0)
|
||||
weight = 3
|
||||
cost = 0
|
||||
earliest_start = 50 MINUTES
|
||||
@@ -120,82 +119,6 @@
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/* //not currently functional
|
||||
//////////////////////////////////////////
|
||||
// //
|
||||
// LEWD //
|
||||
// //
|
||||
//////////////////////////////////////////
|
||||
|
||||
//Might move this to midround antags, but I don't want it messing with the weights of regular antags right now
|
||||
//Only drops one horny antag at a time anyways
|
||||
|
||||
/datum/dynamic_ruleset/event/lewd
|
||||
name = "Horny Traitor"
|
||||
//config_tag = "pirates"
|
||||
//typepath = /datum/round_event/pirates
|
||||
antag_flag = ROLE_LEWD_TRAITOR
|
||||
antag_datum = /datum/antagonist/traitor/lewd
|
||||
enemy_roles = list()
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
protected_roles = list("AI","Cyborg")
|
||||
restricted_roles = list("Cyborg","AI")
|
||||
weight = 300 //JAY CHANGE THIS WHEN YOU ARE DONE TESTING
|
||||
cost = 0
|
||||
earliest_start = 50 MINUTES
|
||||
//blocking_rules = list(/datum/dynamic_ruleset/roundstart/nuclear,/datum/dynamic_ruleset/midround/from_ghosts/nuclear)
|
||||
requirements = list(10,10,10,10,10,10,10,10,10,10)
|
||||
high_population_requirement = 10
|
||||
occurances_max = 2
|
||||
chaos_min = 0
|
||||
chaos_max = 2.5
|
||||
minimum_required_age = 7
|
||||
admin_required = TRUE
|
||||
var/list/mob/living/carbon/human/lewd_candidates = list()
|
||||
var/list/mob/living/carbon/human/targets = list()
|
||||
var/num_lewd_traitors = 1 //The number of lewds to drop in
|
||||
var/numTraitors = 0 //Variable for later. Don't touch.
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
|
||||
/datum/dynamic_ruleset/event/lewd/ready(forced = FALSE)
|
||||
//to_chat(GLOB.admins, "makeLewd_traitors called")
|
||||
//var/datum/game_mode/traitor/lewd/temp = new
|
||||
|
||||
//if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
//continue
|
||||
|
||||
//if(CONFIG_GET(flag/protect_assistant_from_antagonist))
|
||||
//continue
|
||||
|
||||
//var/mob/living/carbon/human/T = null
|
||||
|
||||
for(var/mob/living/carbon/human/target in CURRENT_LIVING_PLAYERS)
|
||||
if(target.client.prefs.noncon)
|
||||
if(!(target.job in restricted_roles))
|
||||
targets += target
|
||||
|
||||
if(lewd_candidates.len)
|
||||
numTraitors = min(candidates.len, targets.len, num_lewd_traitors)
|
||||
if(numTraitors == 0)
|
||||
to_chat(GLOB.admins, "No lewd traitors created. Are there any valid targets?")
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
/datum/dynamic_ruleset/event/lewd/execute(forced = FALSE)
|
||||
var/mob/living/carbon/human/H = null
|
||||
if(numTraitors)
|
||||
for(var/i = 0, i<numTraitors, i++)
|
||||
H = pick(lewd_candidates)
|
||||
H.mind.make_LewdTraitor()
|
||||
lewd_candidates.Remove(H)
|
||||
return TRUE
|
||||
return FALSE
|
||||
*/
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
// SPIDERS //
|
||||
@@ -207,8 +130,8 @@
|
||||
//config_tag = "spiders"
|
||||
typepath = /datum/round_event/spider_infestation
|
||||
enemy_roles = list("AI","Security Officer","Head of Security","Captain")
|
||||
required_enemies = list(2,2,1,1,0,0,0,0,0,0)
|
||||
weight = 3
|
||||
required_enemies = list(3,2,2,2,2,1,1,1,0,0)
|
||||
weight = 2
|
||||
cost = 5
|
||||
requirements = list(101,20,15,10,10,10,10,10,10,10)
|
||||
high_population_requirement = 15
|
||||
@@ -228,7 +151,7 @@
|
||||
//config_tag = "ventclog"
|
||||
typepath = /datum/round_event/vent_clog
|
||||
enemy_roles = list("Chemist","Medical Doctor","Chief Medical Officer")
|
||||
required_enemies = list(1,1,1,1,1,1,0,0,0,0)
|
||||
required_enemies = list(2,2,2,2,2,2,2,2,2,0)
|
||||
cost = 2
|
||||
weight = 1
|
||||
repeatable_weight_decrease = 1
|
||||
@@ -293,12 +216,12 @@
|
||||
//config_tag = "meteor_wave"
|
||||
typepath = /datum/round_event/meteor_wave
|
||||
enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Captain","Cyborg")
|
||||
required_enemies = list(2,2,2,2,2,1,1,1,0,0)
|
||||
required_enemies = list(2,2,2,2,2,2,2,2,1,1)
|
||||
cost = 0
|
||||
weight = 2
|
||||
earliest_start = 45 MINUTES
|
||||
repeatable_weight_decrease = 2
|
||||
requirements = list(101,101,15,15,15,15,15,15,10,10)
|
||||
requirements = list(101,101,25,25,20,20,15,15,10,10)
|
||||
high_population_requirement = 30
|
||||
//property_weights = list("extended" = -2)
|
||||
occurances_max = 2
|
||||
@@ -307,21 +230,22 @@
|
||||
/datum/dynamic_ruleset/event/meteor_wave/ready()
|
||||
if(world.time-SSticker.round_start_time > 35 MINUTES && mode.threat_level > 40 && mode.threat >= 25 && prob(30))
|
||||
name = "Meteor Wave: Threatening"
|
||||
cost = 10
|
||||
cost = 5
|
||||
typepath = /datum/round_event/meteor_wave/threatening
|
||||
requirements = list(101,101,30,25,20,20,20,20,20,15)
|
||||
chaos_min = 1.8
|
||||
else if(world.time-SSticker.round_start_time > 45 MINUTES && mode.threat_level > 50 && mode.threat >= 40 && prob(30))
|
||||
name = "Meteor Wave: Catastrophic"
|
||||
cost = 0
|
||||
cost = 10
|
||||
typepath = /datum/round_event/meteor_wave/catastrophic
|
||||
required_enemies = list(3,3,3,3,3,3,3,3,3,3)
|
||||
required_enemies = list(3,3,3,3,3,2,2,2,2,2)
|
||||
requirements = list(101,101,40,30,30,30,30,30,30,30)
|
||||
chaos_min = 2.0
|
||||
else
|
||||
name = "Meteor Wave: Normal"
|
||||
cost = 5
|
||||
typepath = /datum/round_event/meteor_wave
|
||||
chaos_min = 1.2
|
||||
chaos_min = 1.5
|
||||
required_enemies = list(2,2,2,2,1,1,1,1,0,0)
|
||||
return ..()
|
||||
|
||||
@@ -336,12 +260,12 @@
|
||||
//config_tag = "anomaly_bluespace"
|
||||
typepath = /datum/round_event/anomaly/anomaly_bluespace
|
||||
enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain")
|
||||
required_enemies = list(1,1,1,0,0,0,0,0,0,0)
|
||||
weight = 3
|
||||
required_enemies = list(2,2,2,1,1,1,1,1,1,0)
|
||||
weight = 2
|
||||
earliest_start = 20 MINUTES
|
||||
repeatable_weight_decrease = 2
|
||||
cost = 3
|
||||
requirements = list(101,101,5,5,5,5,5,5,5,5)
|
||||
cost = 0
|
||||
requirements = list(101,101,10,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
//property_weights = list("extended" = 1)
|
||||
@@ -353,12 +277,12 @@
|
||||
//config_tag = "anomaly_flux"
|
||||
typepath = /datum/round_event/anomaly/anomaly_flux
|
||||
enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain")
|
||||
required_enemies = list(1,1,1,0,0,0,0,0,0,0)
|
||||
required_enemies = list(2,2,2,2,2,2,2,2,2,0)
|
||||
weight = 3
|
||||
earliest_start = 20 MINUTES
|
||||
repeatable_weight_decrease = 2
|
||||
cost = 3
|
||||
requirements = list(101,5,5,5,5,5,5,5,5,5)
|
||||
cost = 2
|
||||
requirements = list(101,101,10,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 10
|
||||
repeatable = TRUE
|
||||
//property_weights = list("extended" = 1)
|
||||
@@ -369,10 +293,10 @@
|
||||
name = "Anomaly: Gravitational"
|
||||
//config_tag = "anomaly_gravitational"
|
||||
typepath = /datum/round_event/anomaly/anomaly_grav
|
||||
weight = 4
|
||||
weight = 3
|
||||
repeatable_weight_decrease = 1
|
||||
cost = 0
|
||||
requirements = list(5,4,3,2,1,0,0,0,0,0)
|
||||
requirements = list(101,4,3,2,1,0,0,0,0,0)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
//property_weights = list("extended" = 1)
|
||||
@@ -388,7 +312,7 @@
|
||||
repeatable_weight_decrease = 1
|
||||
cost = 0
|
||||
enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain","Cyborg")
|
||||
required_enemies = list(2,2,2,2,2,1,1,1,1,1)
|
||||
required_enemies = list(2,2,2,2,2,1,1,1,1,0)
|
||||
requirements = list(101,101,10,10,10,10,10,10,10,10)
|
||||
high_population_requirement = 10
|
||||
repeatable = TRUE
|
||||
@@ -405,8 +329,8 @@
|
||||
repeatable_weight_decrease = 1
|
||||
cost = 0
|
||||
enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain","Cyborg")
|
||||
required_enemies = list(3,3,3,2,2,2,2,2,2,2)
|
||||
requirements = list(101,101,10,10,10,10,10,10,10,10)
|
||||
required_enemies = list(3,3,3,2,2,2,2,2,2,0)
|
||||
requirements = list(101,101,101,10,10,10,10,10,10,10)
|
||||
high_population_requirement = 10
|
||||
repeatable = TRUE
|
||||
//property_weights = list("extended" = 1)
|
||||
@@ -426,8 +350,9 @@
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
weight = 0 //This is changed in nuclearbomb.dm
|
||||
occurances_max = 1
|
||||
requirements = list(10,5,0,0,0,0,0,0,0,0) //SECURE THAT DISK
|
||||
requirements = list(10,10,10,10,10,10,10,10,10,10) //SECURE THAT DISK
|
||||
cost = 50
|
||||
chaos_min = 0.5
|
||||
|
||||
/datum/dynamic_ruleset/event/operative/get_weight()
|
||||
var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control
|
||||
@@ -453,9 +378,9 @@
|
||||
weight = 1
|
||||
earliest_start = 30 MINUTES
|
||||
repeatable_weight_decrease = 1
|
||||
cost = -10
|
||||
cost = 0
|
||||
enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain","Cyborg")
|
||||
required_enemies = list(2,1,1,1,1,1,0,0,0,0)
|
||||
required_enemies = list(3,2,2,2,1,1,1,0,0,0)
|
||||
requirements = list(101,25,20,15,15,15,10,10,10,10)
|
||||
high_population_requirement = 10
|
||||
repeatable = TRUE
|
||||
@@ -467,12 +392,12 @@
|
||||
name = "Carp Migration"
|
||||
//config_tag = "carp_migration"
|
||||
typepath = /datum/round_event/carp_migration
|
||||
weight = 5
|
||||
repeatable_weight_decrease = 3
|
||||
weight = 4
|
||||
repeatable_weight_decrease = 2
|
||||
cost = 4
|
||||
requirements = list(101,5,5,1,1,1,1,1,1,1)
|
||||
requirements = list(101,5,5,5,5,1,1,1,1,1)
|
||||
high_population_requirement = 10
|
||||
earliest_start = 0 MINUTES
|
||||
earliest_start = 10 MINUTES
|
||||
repeatable = TRUE
|
||||
//property_weights = list("extended" = 1)
|
||||
occurances_max = 3
|
||||
@@ -482,7 +407,7 @@
|
||||
name = "Communications Blackout"
|
||||
//config_tag = "communications_blackout"
|
||||
typepath = /datum/round_event/communications_blackout
|
||||
cost = 4
|
||||
cost = 2
|
||||
weight = 10
|
||||
repeatable_weight_decrease = 2
|
||||
enemy_roles = list("Chief Engineer","Station Engineer")
|
||||
@@ -549,7 +474,7 @@
|
||||
repeatable_weight_decrease = 2
|
||||
enemy_roles = list("Chief Engineer","Station Engineer")
|
||||
required_enemies = list(1,1,1,0,0,0,0,0,0,0)
|
||||
requirements = list(5,5,4,3,2,1,1,0,0,0)
|
||||
requirements = list(3,3,2,2,1,1,0,0,0,0)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
occurances_max = 10
|
||||
@@ -557,12 +482,12 @@
|
||||
/datum/dynamic_ruleset/event/heart_attack
|
||||
name = "Random Heart Attack"
|
||||
typepath = /datum/round_event/heart_attack
|
||||
cost = 15
|
||||
cost = 0
|
||||
weight = 2
|
||||
earliest_start = 30 MINUTES
|
||||
repeatable_weight_decrease = 1
|
||||
enemy_roles = list("Medical Doctor","Chief Medical Officer")
|
||||
required_enemies = list(2,2,2,2,2,2,2,2,2,2)
|
||||
enemy_roles = list("Medical Doctor","Chief Medical Officer", "Chemist")
|
||||
required_enemies = list(3,3,2,2,2,2,2,2,2,1)
|
||||
requirements = list(101,101,101,10,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
@@ -577,7 +502,7 @@
|
||||
weight = 2
|
||||
repeatable_weight_decrease = 2
|
||||
enemy_roles = list("Chemist","Chief Medical Officer","Geneticist","Medical Doctor","AI","Captain")
|
||||
required_enemies = list(1,1,1,1,1,1,1,1,1,1)
|
||||
required_enemies = list(2,2,2,2,1,1,1,1,1,0)
|
||||
requirements = list(5,5,5,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
//property_weights = list("extended" = 1,"chaos" = 1)
|
||||
@@ -596,7 +521,7 @@
|
||||
earliest_start = 40 MINUTES
|
||||
//property_weights = list("teamwork" = 1,"chaos" = 1, "extended" = -1)
|
||||
occurances_max = 1
|
||||
chaos_min = 1.0
|
||||
chaos_min = 1.3
|
||||
|
||||
|
||||
/datum/dynamic_ruleset/event/wormholes
|
||||
@@ -607,7 +532,7 @@
|
||||
weight = 2
|
||||
repeatable_weight_decrease = 1
|
||||
enemy_roles = list("AI","Medical Doctor","Station Engineer","Head of Personnel","Captain")
|
||||
required_enemies = list(2,2,2,2,2,2,2,2,2,2)
|
||||
required_enemies = list(2,2,2,2,2,2,2,2,2,0)
|
||||
requirements = list(5,5,5,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
//property_weights = list("extended" = 1)
|
||||
@@ -622,12 +547,12 @@
|
||||
weight = 1
|
||||
earliest_start = 40 MINUTES
|
||||
enemy_roles = list("AI","Security Officer","Head of Security","Captain","Station Engineer","Atmos Technician","Chief Engineer")
|
||||
required_enemies = list(4,4,4,4,3,3,3,3,3,2)
|
||||
required_enemies = list(4,4,4,4,3,3,3,3,2,2)
|
||||
requirements = list(101,101,50,40,40,40,40,35,30,30)
|
||||
high_population_requirement = 5
|
||||
//property_weights = list("extended" = -2)
|
||||
occurances_max = 1
|
||||
chaos_min = 2.0
|
||||
chaos_min = 1.5
|
||||
|
||||
/datum/dynamic_ruleset/event/sentient_disease
|
||||
name = "Sentient Disease"
|
||||
@@ -638,7 +563,7 @@
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = -5
|
||||
requirements = list(30,30,20,20,15,10,10,10,10,5) // yes, it can even happen in "extended"!
|
||||
requirements = list(101,101,20,20,15,10,10,10,10,5) // yes, it can even happen in "extended"!
|
||||
//property_weights = list("story_potential" = 1, "extended" = 1, "valid" = -2)
|
||||
high_population_requirement = 5
|
||||
occurances_max = 1
|
||||
@@ -653,7 +578,7 @@
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 5
|
||||
requirements = list(101,30,27,24,21,18,15,15,10,10)
|
||||
requirements = list(101,101,23,21,18,18,15,15,10,10)
|
||||
high_population_requirement = 15
|
||||
//property_weights = list("story_potential" = -2, "extended" = -1)
|
||||
occurances_max = 1 //Skyrat change.
|
||||
@@ -664,8 +589,8 @@
|
||||
controller = /datum/round_event_control/immovable_rod
|
||||
typepath = /datum/round_event/immovable_rod
|
||||
enemy_roles = list("Research Director","Chief Engineer","Station Engineer","Captain","Chaplain","AI")
|
||||
required_enemies = list(2,2,2,2,2,2,1,1,1,1)
|
||||
requirements = list(101,101,18,16,14,12,10,8,6,6)
|
||||
required_enemies = list(2,2,2,2,2,2,1,1,1,0)
|
||||
requirements = list(101,101,20,18,16,14,12,10,8,6)
|
||||
high_population_requirement = 15
|
||||
cost = 0
|
||||
occurances_max = 2
|
||||
@@ -739,29 +664,16 @@
|
||||
repeatable = TRUE
|
||||
occurances_max = 2
|
||||
|
||||
/datum/dynamic_ruleset/event/disease_outbreak/execute() //I do not know why this is necessary
|
||||
var/datum/round_event_control/E = locate(/datum/round_event_control/disease_outbreak) in SSevents.control
|
||||
var/datum/round_event/event = E.runEvent() //But it is.
|
||||
event.announceWhen = -1 //So it isn't double announced.
|
||||
return ..()
|
||||
|
||||
/datum/dynamic_ruleset/event/falsealarm //I THINK IT WORKS
|
||||
/datum/dynamic_ruleset/event/falsealarm
|
||||
name = "False Alarm"
|
||||
controller = /datum/round_event_control/falsealarm
|
||||
typepath = /datum/round_event/falsealarm
|
||||
requirements = list(0,0,0,0,0,0,0,0,0,0)
|
||||
requirements = list(5,5,5,5,5,5,5,5,5,5) //Tell me lieeeess
|
||||
high_population_requirement = 0
|
||||
weight = 5
|
||||
repeatable = TRUE
|
||||
occurances_max = 5
|
||||
|
||||
///datum/dynamic_ruleset/event/falsealarm/execute() //I do not know why this is necessary
|
||||
//var/datum/round_event_control/E = locate(/datum/round_event_control/falsealarm) in SSevents.control
|
||||
//var/datum/round_event/event = E.runEvent()
|
||||
//event.announceWhen = -1 //So it isn't double announced.
|
||||
//E.runEvent()
|
||||
//return ..()
|
||||
|
||||
/datum/dynamic_ruleset/event/grid_check
|
||||
name = "Grid Check"
|
||||
typepath = /datum/round_event/grid_check
|
||||
@@ -798,8 +710,8 @@
|
||||
name = "Grey Tide"
|
||||
typepath = /datum/round_event/grey_tide
|
||||
enemy_roles = list("Chief Engineer","Station Engineer","Captain","Atmospheric Technician","AI","Cyborg")
|
||||
required_enemies = list(3,2,2,2,2,2,1,1,1,1)
|
||||
requirements = list(101,101,5,5,5,5,5,5,5,5)
|
||||
required_enemies = list(3,2,2,2,2,2,1,1,1,0)
|
||||
requirements = list(101,101,101,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 0
|
||||
repeatable = TRUE
|
||||
weight = 4
|
||||
@@ -809,9 +721,10 @@
|
||||
/datum/dynamic_ruleset/event/sentience
|
||||
name = "Random Human-level Intelligence"
|
||||
typepath = /datum/round_event/ghost_role/sentience
|
||||
requirements = list(0,0,0,0,0,0,0,0,0,0)
|
||||
requirements = list(101,101,0,0,0,0,0,0,0,0)
|
||||
high_population_requirement = 0
|
||||
weight = 5
|
||||
repeatable_weight_decrease = 1
|
||||
|
||||
/datum/dynamic_ruleset/event/shuttle_loan
|
||||
name = "Shuttle Loan"
|
||||
@@ -829,7 +742,7 @@
|
||||
name = "Spacevine"
|
||||
typepath = /datum/round_event/spacevine
|
||||
enemy_roles = list("Cook","Botanist","Security Officer","Captain","Station Engineer")
|
||||
required_enemies = list(2,2,2,1,1,1,1,1,1,1)
|
||||
required_enemies = list(2,2,2,1,1,1,1,1,1,0)
|
||||
requirements = list(101,101,10,9,8,7,5,5,5,0)
|
||||
cost = 2
|
||||
high_population_requirement = 0
|
||||
@@ -842,11 +755,11 @@
|
||||
/datum/dynamic_ruleset/event/spontaneous_appendicitis
|
||||
name = "Spontaneous Appendicitis"
|
||||
typepath = /datum/round_event/spontaneous_appendicitis
|
||||
enemy_roles = list("Medical Doctor","Chief Medical Officer")
|
||||
required_enemies = list(2,2,1,1,1,1,1,1,1,1)
|
||||
enemy_roles = list("Medical Doctor","Chief Medical Officer","Roboticist")
|
||||
required_enemies = list(2,2,2,2,2,2,2,1,1,1)
|
||||
requirements = list(5,5,5,5,5,5,5,5,0,0)
|
||||
high_population_requirement = 5
|
||||
weight = 8
|
||||
weight = 5
|
||||
repeatable = TRUE
|
||||
repeatable_weight_decrease = 5
|
||||
repeatable_weight_decrease = 3
|
||||
occurances_max = 3
|
||||
@@ -18,6 +18,7 @@
|
||||
var/list/dead_players = list()
|
||||
var/list/list_observers = list()
|
||||
var/list/ghost_eligible = list()
|
||||
var/controller //round event controller for the event - Required for certain events dependendant on variables within their controllers
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts
|
||||
weight = 0
|
||||
@@ -99,9 +100,8 @@
|
||||
continue // Dead players cannot count as opponents
|
||||
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
|
||||
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
|
||||
|
||||
var/threat = min(round(mode.threat_level/10),9)
|
||||
if (job_check < required_enemies[threat])
|
||||
var/chaos = min(max(round(GLOB.dynamic_chaos_level * 2), 0), 9)
|
||||
if (job_check < required_enemies[chaos])
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -113,8 +113,20 @@
|
||||
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/execute()
|
||||
var/application_successful = send_applications(ghost_eligible)
|
||||
return assigned.len > 0 && application_successful
|
||||
message_admins("<span class='deadsay'><b>[name]</b> has just been randomly triggered!</span>") //STOP ASSUMING IT'S BADMINS!
|
||||
log_game("Midround triggering: [name]")
|
||||
var/datum/round_event/E
|
||||
//occurances_current++
|
||||
if(controller)
|
||||
var/datum/round_event_control/C = locate(controller) in SSevents.control
|
||||
E = C.runEvent()
|
||||
else
|
||||
var/application_successful = send_applications(ghost_eligible)
|
||||
return assigned.len > 0 && application_successful
|
||||
|
||||
testing("[time2text(world.time, "hh:mm:ss")] [E.type]")
|
||||
|
||||
return E
|
||||
|
||||
/// This sends a poll to ghosts if they want to be a ghost spawn from a ruleset.
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/proc/send_applications(list/possible_volunteers = list())
|
||||
@@ -221,7 +233,7 @@
|
||||
high_population_requirement = 10
|
||||
flags = TRAITOR_RULESET
|
||||
chaos_min = 2.0
|
||||
chaos_max = 4.0
|
||||
chaos_max = 3.5
|
||||
|
||||
/datum/dynamic_ruleset/midround/autotraitor/acceptable(population = 0, threat = 0)
|
||||
var/player_count = mode.current_players[CURRENT_LIVING_PLAYERS].len
|
||||
@@ -270,15 +282,15 @@
|
||||
antag_flag = ROLE_LEWD_TRAITOR
|
||||
antag_datum = /datum/antagonist/traitor/lewd
|
||||
//minimum_required_age = 7
|
||||
protected_roles = list("AI","Cyborg")
|
||||
restricted_roles = list("Cyborg","AI")
|
||||
protected_roles = list("AI","Cyborg", "Positronic Brain")
|
||||
restricted_roles = list("Cyborg","AI", "Positronic Brain")
|
||||
required_candidates = 1
|
||||
weight = 2
|
||||
cost = 0
|
||||
requirements = list(10,10,10,10,10,10,10,10,10,10)
|
||||
high_population_requirement = 10
|
||||
chaos_min = 0.1
|
||||
chaos_max = 2.5
|
||||
chaos_max = 2.0
|
||||
admin_required = TRUE
|
||||
//vars for execution
|
||||
var/list/mob/living/carbon/human/lewd_candidates = list()
|
||||
@@ -380,7 +392,7 @@
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
cost = 20
|
||||
requirements = list(101,101,55,50,45,40,35,30,25,20)
|
||||
requirements = list(101,101,101,45,40,35,30,25,20,15)
|
||||
high_population_requirement = 35
|
||||
required_type = /mob/living/silicon/ai
|
||||
var/ion_announce = 33
|
||||
@@ -428,7 +440,7 @@
|
||||
antag_datum = /datum/antagonist/wizard
|
||||
antag_flag = ROLE_WIZARD
|
||||
enemy_roles = list("Security Officer","Detective","Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,1,0,0)
|
||||
required_enemies = list(2,2,1,1,1,1,1,1,1,0)
|
||||
required_candidates = 1
|
||||
weight = 1
|
||||
cost = 20
|
||||
@@ -462,13 +474,13 @@
|
||||
antag_flag = ROLE_OPERATIVE
|
||||
antag_datum = /datum/antagonist/nukeop
|
||||
enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain")
|
||||
required_enemies = list(3,3,3,3,3,2,2,1,1,0)
|
||||
required_enemies = list(3,3,3,3,3,2,2,2,2,1)
|
||||
required_candidates = 5
|
||||
weight = 5
|
||||
cost = 35
|
||||
requirements = list(101,101,100,70,60,50,40,40,40,40)
|
||||
cost = 20
|
||||
requirements = list(101,100,95,85,70,60,50,40,30,20)
|
||||
high_population_requirement = 10
|
||||
var/operative_cap = list(2,2,2,2,3,3,4,4,5,5)
|
||||
var/operative_cap = list(1,1,1,2,2,3,3,4,4,5)
|
||||
var/datum/team/nuclear/nuke_team
|
||||
flags = HIGHLANDER_RULESET
|
||||
chaos_min = 4.0
|
||||
@@ -505,15 +517,17 @@
|
||||
name = "Blob"
|
||||
antag_datum = /datum/antagonist/blob
|
||||
antag_flag = ROLE_BLOB
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain", "Station Engineer")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
weight = 3
|
||||
cost = 20
|
||||
requirements = list(101,101,60,50,45,40,40,40,30,20)
|
||||
requirements = list(101,101,101,60,50,40,40,40,30,20)
|
||||
//requirements = list(0,0,0,0,0,0,0,0,0,0)
|
||||
high_population_requirement = 50
|
||||
repeatable = TRUE
|
||||
chaos_min = 3.5
|
||||
chaos_min = 4.0
|
||||
controller = /datum/round_event_control/blob
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant)
|
||||
var/body = applicant.become_overmind()
|
||||
@@ -534,11 +548,13 @@
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
cost = 15
|
||||
requirements = list(101,101,100,70,60,50,40,40,30,20)
|
||||
requirements = list(101,101,101,50,40,35,30,30,30,20)
|
||||
//requirements = list(0,0,0,0,0,0,0,0,0,0)
|
||||
high_population_requirement = 50
|
||||
repeatable = TRUE
|
||||
var/list/vents = list()
|
||||
chaos_min = 3.5
|
||||
controller = /datum/round_event_control/alien_infestation
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute()
|
||||
// 50% chance of being incremented by one
|
||||
@@ -575,12 +591,13 @@
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/nightmare
|
||||
name = "Nightmare"
|
||||
antag_datum = /datum/antagonist/nightmare
|
||||
controller = /datum/round_event_control/nightmare
|
||||
antag_flag = "Nightmare"
|
||||
antag_flag_override = ROLE_ALIEN
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
weight = 4
|
||||
cost = 10
|
||||
requirements = list(101,50,40,30,20,20,20,20,15,10)
|
||||
high_population_requirement = 50
|
||||
@@ -626,18 +643,18 @@
|
||||
antag_flag = ROLE_ABDUCTOR
|
||||
// Has two antagonist flags, in fact
|
||||
enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain")
|
||||
required_enemies = list(3,3,2,2,1,1,0,0,0,0)
|
||||
required_enemies = list(3,3,2,2,2,2,2,2,2,0)
|
||||
required_candidates = 2
|
||||
weight = 4
|
||||
weight = 3
|
||||
cost = 10
|
||||
requirements = list(101,101,50,45,40,30,20,20,10,10)
|
||||
requirements = list(101,101,101,101,40,30,30,30,30,30)
|
||||
blocking_rules = list(/datum/dynamic_ruleset/roundstart/nuclear,/datum/dynamic_ruleset/midround/from_ghosts/nuclear)
|
||||
high_population_requirement = 15
|
||||
var/datum/team/abductor_team/team
|
||||
//property_weights = list("extended" = -2, "valid" = 1, "trust" = -1, "chaos" = 2)
|
||||
repeatable_weight_decrease = 4
|
||||
repeatable = TRUE
|
||||
chaos_min = 2.0
|
||||
chaos_min = 4.0
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE)
|
||||
team = new /datum/team/abductor_team
|
||||
@@ -671,7 +688,7 @@
|
||||
required_enemies = list(3,2,2,2,2,1,1,1,1,0)
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 15
|
||||
cost = 10
|
||||
requirements = list(101,101,101,40,35,30,25,20,20,20)
|
||||
high_population_requirement = 30
|
||||
//property_weights = list("story_potential" = 1, "extended" = -2, "valid" = 2)
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
antag_datum = /datum/antagonist/traitor/
|
||||
minimum_required_age = 0
|
||||
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Cyborg", "Quartermaster")
|
||||
restricted_roles = list("Cyborg")
|
||||
restricted_roles = list("Cyborg", "AI") //Malf is it's own ruleset
|
||||
required_candidates = 1
|
||||
weight = 5
|
||||
cost = 10
|
||||
requirements = list(101,40,30,25,20,20,15,15,15,15)
|
||||
requirements = list(101,101,30,25,20,20,15,15,15,15)
|
||||
high_population_requirement = 10
|
||||
var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec)
|
||||
chaos_min = 2.5
|
||||
@@ -29,11 +29,11 @@
|
||||
antag_datum = /datum/antagonist/traitor/thief
|
||||
minimum_required_age = 0
|
||||
//protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Cyborg")
|
||||
restricted_roles = list("Cyborg")
|
||||
restricted_roles = list("Cyborg", "AI") //Malf is it's own ruleset
|
||||
//required_candidates = 1
|
||||
//weight = 5
|
||||
weight = 5
|
||||
cost = 0
|
||||
requirements = list(101,25,25,20,20,15,15,10,10,5)
|
||||
requirements = list(101,25,25,20,20,15,15,10,10,10)
|
||||
high_population_requirement = 10
|
||||
//var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec)
|
||||
chaos_min = 2.0
|
||||
@@ -76,12 +76,12 @@
|
||||
protected_roles = list("AI","Cyborg")
|
||||
restricted_roles = list("Cyborg","AI")
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
weight = 2
|
||||
cost = 0
|
||||
requirements = list(101,10,10,10,10,10,10,10,10,10)
|
||||
requirements = list(10,10,10,10,10,10,10,10,10,10)
|
||||
high_population_requirement = 10
|
||||
chaos_min = 0.1
|
||||
chaos_max = 2.5
|
||||
chaos_max = 2.0
|
||||
admin_required = TRUE
|
||||
//vars for execution
|
||||
var/list/mob/living/carbon/human/lewd_candidates = list()
|
||||
@@ -115,17 +115,6 @@
|
||||
M.mind.restricted_roles = restricted_roles
|
||||
return TRUE
|
||||
|
||||
/*
|
||||
/datum/dynamic_ruleset/roundstart/traitor/lewd/execute()
|
||||
var/datum/mind/M = null
|
||||
if(numTraitors)
|
||||
for(var/i = 0, i<numTraitors, i++)
|
||||
M = pick(assigned)
|
||||
assigned.Remove(M)
|
||||
M.make_LewdTraitor()
|
||||
return TRUE
|
||||
return FALSE
|
||||
*/
|
||||
|
||||
//////////////////////////////////////////
|
||||
// //
|
||||
@@ -300,7 +289,7 @@
|
||||
flags = HIGHLANDER_RULESET
|
||||
var/cultist_cap = list(2,2,2,3,3,4,4,4,4,4)
|
||||
var/datum/team/cult/main_cult
|
||||
chaos_min = 4.9
|
||||
chaos_min = 4.5
|
||||
admin_required = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/bloodcult/ready(forced = FALSE)
|
||||
@@ -356,7 +345,7 @@
|
||||
required_candidates = 5
|
||||
weight = 3
|
||||
cost = 20
|
||||
requirements = list(101,100,90,80,70,60,50,40,30,20)
|
||||
requirements = list(101,100,95,85,70,60,50,40,30,20)
|
||||
high_population_requirement = 10
|
||||
pop_per_requirement = 5
|
||||
flags = HIGHLANDER_RULESET
|
||||
@@ -559,11 +548,13 @@
|
||||
required_candidates = 4
|
||||
weight = 4
|
||||
cost = 0
|
||||
requirements = list(101,101,100,90,80,70,60,50,40,30)
|
||||
requirements = list(101,101,100,95,85,70,60,50,40,30)
|
||||
//requirements = list(0,0,0,0,0,0,0,0,0,0)
|
||||
high_population_requirement = 101
|
||||
flags = HIGHLANDER_RULESET
|
||||
var/ark_time
|
||||
chaos_min = 4.9
|
||||
var/servants = list(1,1,1,1,2,2,3,3,4,4)
|
||||
chaos_min = 4.5
|
||||
admin_required = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/clockcult/pre_execute()
|
||||
@@ -575,20 +566,23 @@
|
||||
return FALSE
|
||||
for(var/datum/parsed_map/PM in reebes)
|
||||
PM.initTemplateBounds()
|
||||
|
||||
/*
|
||||
var/starter_servants = 4
|
||||
var/number_players = num_players()
|
||||
if(number_players > 30)
|
||||
number_players -= 30
|
||||
starter_servants += round(number_players / 10)
|
||||
starter_servants = min(starter_servants, 8)
|
||||
*/
|
||||
var/indice_pop = min(10,round(mode.roundstart_pop_ready/5)+1)
|
||||
var/starter_servants = servants[indice_pop]
|
||||
for (var/i in 1 to starter_servants)
|
||||
var/mob/servant = pick(candidates)
|
||||
candidates -= servant
|
||||
assigned += servant.mind
|
||||
servant.mind.assigned_role = ROLE_SERVANT_OF_RATVAR
|
||||
servant.mind.special_role = ROLE_SERVANT_OF_RATVAR
|
||||
ark_time = 30 + round((number_players / 5))
|
||||
ark_time = 30 + round((mode.roundstart_pop_ready / 5))
|
||||
ark_time = min(ark_time, 35)
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
|
||||
if(BODY_ZONE_PRECISE_MOUTH)
|
||||
|
||||
if((M.head && M.head.flags_cover & HEADCOVERSMOUTH) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH))
|
||||
if(M.is_mouth_covered())
|
||||
to_chat(user, "<span class='notice'>You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSMOUTH) ? "helmet" : "mask"] first.</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -9,8 +9,14 @@
|
||||
*/
|
||||
/var/static/blacklisted_items = typecacheof(list(
|
||||
/obj/singularity,
|
||||
/obj/structure/destructible/clockwork/massive,
|
||||
/obj/machinery/power/supermatter_crystal))
|
||||
/obj/structure/destructible/clockwork/massive/ratvar,
|
||||
/obj/item/projectile,
|
||||
/obj/effect,
|
||||
/obj/belly,
|
||||
/obj/decal,
|
||||
/obj/docking_port,
|
||||
/obj/shapeshift_holder,
|
||||
/obj/screen))
|
||||
|
||||
GLOBAL_LIST_EMPTY(possible_gifts)
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
/obj/item/storage/firstaid/regular/PopulateContents()
|
||||
if(empty)
|
||||
return
|
||||
new /obj/item/stack/medical/plaster_gauze(src)
|
||||
new /obj/item/stack/medical/gauze(src)
|
||||
new /obj/item/stack/medical/bruise_pack(src)
|
||||
new /obj/item/stack/medical/bruise_pack(src)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/storage/box/syndicate
|
||||
|
||||
/obj/item/storage/box/syndicate/PopulateContents()
|
||||
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1, "stando" = 1)))
|
||||
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "baseball" = 1, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1, "stando" = 1)))
|
||||
if("bloodyspai") // 30 tc now this is more right
|
||||
new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set
|
||||
new /obj/item/clothing/mask/chameleon(src) // Goes with above
|
||||
@@ -52,7 +52,7 @@
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
new /obj/item/screwdriver/power(src) //2 tc item
|
||||
|
||||
if("murder") // 35 tc now
|
||||
if("murder") // 35 tc
|
||||
new /obj/item/melee/transforming/energy/sword/saber(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
new /obj/item/card/emag(src)
|
||||
@@ -62,6 +62,17 @@
|
||||
new /obj/item/clothing/glasses/phantomthief/syndicate(src)
|
||||
new /obj/item/reagent_containers/syringe/stimulants(src)
|
||||
|
||||
if("baseball") // 42~ tc
|
||||
new /obj/item/melee/baseball_bat/ablative/syndi(src) //Lets say 12 tc, lesser sleeping carp
|
||||
new /obj/item/clothing/glasses/sunglasses/garb(src) //Lets say 2 tc
|
||||
new /obj/item/card/emag(src) //6 tc
|
||||
new /obj/item/clothing/shoes/sneakers/noslip(src) //2tc
|
||||
new /obj/item/encryptionkey/syndicate(src) //1tc
|
||||
new /obj/item/autosurgeon/anti_drop(src) //Lets just say 7~
|
||||
new /obj/item/clothing/under/syndicate/baseball(src) //3tc
|
||||
new /obj/item/clothing/head/soft/baseball(src) //Lets say 4 tc
|
||||
new /obj/item/reagent_containers/hypospray/medipen/stimulants/baseball(src) //lets say 5tc
|
||||
|
||||
if("implant") // 67+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
|
||||
new /obj/item/implanter/freedom(src)
|
||||
new /obj/item/implanter/uplink/precharged(src)
|
||||
|
||||
@@ -563,6 +563,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
playsound(turf, 'sound/weapons/effects/batreflect2.ogg', 50, 1)
|
||||
return 1
|
||||
|
||||
/obj/item/melee/baseball_bat/ablative/syndi
|
||||
name = "syndicate major league bat"
|
||||
desc = "A metal bat made by the syndicate for the major league team."
|
||||
force = 18 //Spear damage...
|
||||
throwforce = 30
|
||||
|
||||
/obj/item/melee/flyswatter
|
||||
name = "flyswatter"
|
||||
desc = "Useful for killing insects of all sizes."
|
||||
@@ -668,7 +674,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
name = "bdsm whip"
|
||||
desc = "A less lethal version of the whip the librarian has. Still hurts, but just the way you like it."
|
||||
icon_state = "whip"
|
||||
item_state = "chain"
|
||||
item_state = "crop"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||
/obj/structure/grille/attack_animal(mob/user)
|
||||
. = ..()
|
||||
if(!shock(user, 70))
|
||||
if(!shock(user, 70) && !QDELETED(src)) //Last hit still shocks but shouldn't deal damage to the grille)
|
||||
take_damage(rand(5,10), BRUTE, "melee", 1)
|
||||
|
||||
/obj/structure/grille/attack_paw(mob/user)
|
||||
|
||||
@@ -27,6 +27,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
|
||||
dir = SOUTH
|
||||
var/message_cooldown
|
||||
var/breakout_time = 600
|
||||
var/obj/item/radio/radio = null
|
||||
var/hasradio = FALSE
|
||||
|
||||
/obj/structure/bodycontainer/Initialize()
|
||||
. = ..()
|
||||
@@ -128,7 +130,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
|
||||
var/turf/T = get_step(src, dir)
|
||||
connected.setDir(dir)
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(T)
|
||||
if(AM != radio)
|
||||
AM.forceMove(T)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/bodycontainer/proc/close()
|
||||
@@ -154,7 +157,41 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
|
||||
var/beeper = TRUE
|
||||
var/beep_cooldown = 50
|
||||
var/next_beep = 0
|
||||
//Hyperstation edit
|
||||
var/radio_key = /obj/item/encryptionkey/headset_med
|
||||
var/medical_channel = "Medical"
|
||||
var/inuse = FALSE
|
||||
hasradio = TRUE
|
||||
|
||||
/obj/structure/bodycontainer/morgue/Initialize()
|
||||
. = ..()
|
||||
radio = new(src)
|
||||
radio.anchored = TRUE
|
||||
radio.keyslot = new radio_key
|
||||
radio.listening = 0
|
||||
radio.recalculateChannels()
|
||||
|
||||
/obj/structure/bodycontainer/morgue/Destroy()
|
||||
QDEL_NULL(radio)
|
||||
GLOB.bodycontainers -= src
|
||||
open()
|
||||
if(connected)
|
||||
qdel(connected)
|
||||
connected = null
|
||||
return ..()
|
||||
/*
|
||||
/obj/structure/bodycontainer/morgue/proc/open2()
|
||||
recursive_organ_check(src)
|
||||
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
playsound(src, 'sound/effects/roll.ogg', 5, 1)
|
||||
var/turf/T = get_step(src, dir)
|
||||
connected.setDir(dir)
|
||||
for(var/atom/movable/AM in src)
|
||||
if(AM != radio)
|
||||
AM.forceMove(T)
|
||||
update_icon()
|
||||
*/
|
||||
//end of edit
|
||||
/obj/structure/bodycontainer/morgue/New()
|
||||
connected = new/obj/structure/tray/m_tray(src)
|
||||
connected.connected = src
|
||||
@@ -175,7 +212,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
|
||||
if (!connected || connected.loc != src) // Open or tray is gone.
|
||||
icon_state = "morgue0"
|
||||
else
|
||||
if(contents.len == 1) // Empty
|
||||
if(contents.len == 2) // Empty. Was length 1 because of the tray, is now length 2 because it includes a radio.
|
||||
icon_state = "morgue1"
|
||||
else
|
||||
icon_state = "morgue2" // Dead, brainded mob.
|
||||
@@ -381,3 +418,27 @@ GLOBAL_LIST_EMPTY(crematoriums)
|
||||
if(ismovableatom(caller))
|
||||
var/atom/movable/mover = caller
|
||||
. = . || (mover.pass_flags & PASSTABLE)
|
||||
|
||||
//Hyperstation edit starts here
|
||||
/obj/structure/bodycontainer/morgue/attack_ghost(mob/user)
|
||||
. = ..()
|
||||
if(!beeper || inuse)
|
||||
return
|
||||
|
||||
var/list/compiled = recursive_mob_check(src, 0, 0) // Search for mobs in all contents.
|
||||
if(!length(compiled)) // No mobs?
|
||||
return
|
||||
|
||||
for(var/mob/living/M in compiled)
|
||||
var/mob/living/mob_occupant = get_mob_or_brainmob(M)
|
||||
if(!mob_occupant.suiciding && !mob_occupant.hellbound)
|
||||
if(mob_occupant.stat == DEAD && mob_occupant.mind.key == user.client.key)
|
||||
inuse = TRUE
|
||||
visible_message("One of the morgue coffins currently holds a soul that is eager to have its body revived.")
|
||||
radio.talk_into(src, "One of the morgue coffins currently holds a soul that is eager to have its body revived.", medical_channel)
|
||||
playsound(loc, 'sound/machines/ping.ogg', 50)
|
||||
addtimer(CALLBACK(src, .proc/liftcooldown), 500)
|
||||
|
||||
/obj/structure/bodycontainer/morgue/proc/liftcooldown()
|
||||
inuse = FALSE
|
||||
//Hyperstation edit ends here
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
anchored = TRUE
|
||||
layer = TABLE_LAYER
|
||||
climbable = TRUE
|
||||
obj_flags = CAN_BE_HIT|SHOVABLE_ONTO
|
||||
pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.")
|
||||
var/frame = /obj/structure/table_frame
|
||||
var/framestack = /obj/item/stack/rods
|
||||
@@ -136,6 +137,15 @@
|
||||
var/mob/living/carbon/human/H = pushed_mob
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table)
|
||||
|
||||
/obj/structure/table/shove_act(mob/living/target, mob/living/user)
|
||||
if(!target.resting)
|
||||
target.Knockdown(SHOVE_KNOCKDOWN_TABLE)
|
||||
user.visible_message("<span class='danger'>[user.name] shoves [target.name] onto \the [src]!</span>",
|
||||
"<span class='danger'>You shove [target.name] onto \the [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
target.forceMove(src.loc)
|
||||
log_combat(user, target, "shoved", "onto [src] (table)")
|
||||
return TRUE
|
||||
|
||||
/obj/structure/table/attackby(obj/item/I, mob/user, params)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(istype(I, /obj/item/screwdriver) && deconstruction_ready)
|
||||
|
||||
@@ -457,6 +457,19 @@
|
||||
if(ismob(A) || .)
|
||||
A.ratvar_act()
|
||||
|
||||
//called on /datum/species/proc/altdisarm()
|
||||
/turf/shove_act(mob/living/target, mob/living/user, pre_act = FALSE)
|
||||
var/list/possibilities
|
||||
for(var/obj/O in contents)
|
||||
if(CHECK_BITFIELD(O.obj_flags, SHOVABLE_ONTO))
|
||||
LAZYADD(possibilities, O)
|
||||
else if(!O.CanPass(target, src))
|
||||
return FALSE
|
||||
if(possibilities)
|
||||
var/obj/O = pick(possibilities)
|
||||
return O.shove_act(target, user)
|
||||
return FALSE
|
||||
|
||||
/turf/proc/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
|
||||
underlay_appearance.icon = icon
|
||||
underlay_appearance.icon_state = icon_state
|
||||
|
||||
@@ -107,6 +107,7 @@ GLOBAL_VAR(restart_counter)
|
||||
GLOB.picture_log_directory = "data/picture_logs/[override_dir]"
|
||||
|
||||
GLOB.world_game_log = "[GLOB.log_directory]/game.log"
|
||||
GLOB.world_virus_log = "[GLOB.log_directory]/virus.log"
|
||||
GLOB.world_attack_log = "[GLOB.log_directory]/attack.log"
|
||||
GLOB.world_pda_log = "[GLOB.log_directory]/pda.log"
|
||||
GLOB.world_telecomms_log = "[GLOB.log_directory]/telecomms.log"
|
||||
|
||||
@@ -5,25 +5,48 @@ is currently following.
|
||||
*/
|
||||
|
||||
GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
new /datum/disease_ability/action/cough(),
|
||||
new /datum/disease_ability/action/sneeze(),
|
||||
new /datum/disease_ability/action/infect(),
|
||||
new /datum/disease_ability/symptom/cough(),
|
||||
new /datum/disease_ability/symptom/sneeze(),\
|
||||
new /datum/disease_ability/symptom/hallucigen(),
|
||||
new /datum/disease_ability/symptom/choking(),
|
||||
new /datum/disease_ability/symptom/confusion(),
|
||||
new /datum/disease_ability/symptom/youth(),
|
||||
new /datum/disease_ability/symptom/vomit(),
|
||||
new /datum/disease_ability/symptom/voice_change(),
|
||||
new /datum/disease_ability/symptom/visionloss(),
|
||||
new /datum/disease_ability/symptom/viraladaptation(),
|
||||
new /datum/disease_ability/symptom/vitiligo(),
|
||||
new /datum/disease_ability/symptom/sensory_restoration(),
|
||||
new /datum/disease_ability/symptom/itching(),
|
||||
new /datum/disease_ability/symptom/weight_loss(),
|
||||
new /datum/disease_ability/symptom/metabolism_heal(),
|
||||
new /datum/disease_ability/symptom/coma_heal()
|
||||
new /datum/disease_ability/action/cough,
|
||||
new /datum/disease_ability/action/sneeze,
|
||||
new /datum/disease_ability/action/infect,
|
||||
new /datum/disease_ability/symptom/mild/cough,
|
||||
new /datum/disease_ability/symptom/mild/sneeze,
|
||||
new /datum/disease_ability/symptom/medium/shedding,
|
||||
new /datum/disease_ability/symptom/medium/beard,
|
||||
new /datum/disease_ability/symptom/medium/hallucigen,
|
||||
new /datum/disease_ability/symptom/medium/choking,
|
||||
new /datum/disease_ability/symptom/medium/confusion,
|
||||
new /datum/disease_ability/symptom/medium/vomit,
|
||||
new /datum/disease_ability/symptom/medium/voice_change,
|
||||
new /datum/disease_ability/symptom/medium/visionloss,
|
||||
new /datum/disease_ability/symptom/medium/deafness,
|
||||
new /datum/disease_ability/symptom/powerful/narcolepsy,
|
||||
new /datum/disease_ability/symptom/medium/fever,
|
||||
new /datum/disease_ability/symptom/medium/shivering,
|
||||
new /datum/disease_ability/symptom/medium/headache,
|
||||
new /datum/disease_ability/symptom/medium/nano_boost,
|
||||
new /datum/disease_ability/symptom/medium/nano_destroy,
|
||||
new /datum/disease_ability/symptom/medium/viraladaptation,
|
||||
new /datum/disease_ability/symptom/medium/viralevolution,
|
||||
new /datum/disease_ability/symptom/medium/vitiligo,
|
||||
new /datum/disease_ability/symptom/medium/revitiligo,
|
||||
new /datum/disease_ability/symptom/medium/itching,
|
||||
new /datum/disease_ability/symptom/medium/heal/weight_loss,
|
||||
new /datum/disease_ability/symptom/medium/heal/sensory_restoration,
|
||||
new /datum/disease_ability/symptom/medium/heal/mind_restoration,
|
||||
new /datum/disease_ability/symptom/powerful/fire,
|
||||
new /datum/disease_ability/symptom/powerful/flesh_eating,
|
||||
// new /datum/disease_ability/symptom/powerful/genetic_mutation,
|
||||
new /datum/disease_ability/symptom/powerful/inorganic_adaptation,
|
||||
new /datum/disease_ability/symptom/powerful/heal/starlight,
|
||||
new /datum/disease_ability/symptom/powerful/heal/oxygen,
|
||||
new /datum/disease_ability/symptom/powerful/heal/chem,
|
||||
new /datum/disease_ability/symptom/powerful/heal/metabolism,
|
||||
new /datum/disease_ability/symptom/powerful/heal/dark,
|
||||
new /datum/disease_ability/symptom/powerful/heal/water,
|
||||
new /datum/disease_ability/symptom/powerful/heal/plasma,
|
||||
new /datum/disease_ability/symptom/powerful/heal/radiation,
|
||||
new /datum/disease_ability/symptom/powerful/heal/coma,
|
||||
new /datum/disease_ability/symptom/powerful/youth
|
||||
))
|
||||
|
||||
/datum/disease_ability
|
||||
@@ -54,7 +77,13 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
stage_speed += initial(S.stage_speed)
|
||||
transmittable += initial(S.transmittable)
|
||||
threshold_block += "<br><br>[initial(S.threshold_desc)]"
|
||||
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
|
||||
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
|
||||
if(symptoms.len == 1) //lazy boy's dream
|
||||
name = initial(S.name)
|
||||
if(short_desc == "")
|
||||
short_desc = initial(S.desc)
|
||||
if(long_desc == "")
|
||||
long_desc = initial(S.desc)
|
||||
|
||||
/datum/disease_ability/proc/CanBuy(mob/camera/disease/D)
|
||||
if(world.time < D.next_adaptation_time)
|
||||
@@ -77,8 +106,10 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
for(var/T in symptoms)
|
||||
var/datum/symptom/S = new T()
|
||||
SD.symptoms += S
|
||||
S.OnAdd(SD)
|
||||
if(SD.processing)
|
||||
S.Start(SD)
|
||||
if(S.Start(SD))
|
||||
S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10)
|
||||
SD.Refresh()
|
||||
for(var/T in actions)
|
||||
var/datum/action/A = new T()
|
||||
@@ -105,6 +136,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
var/datum/symptom/S = locate(T) in SD.symptoms
|
||||
if(S)
|
||||
SD.symptoms -= S
|
||||
S.OnRemove(SD)
|
||||
if(SD.processing)
|
||||
S.End(SD)
|
||||
qdel(S)
|
||||
@@ -152,8 +184,9 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
return FALSE
|
||||
to_chat(D, "<span class='notice'>You force [L.real_name] to cough.</span>")
|
||||
L.emote("cough")
|
||||
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
|
||||
SD.spread(2)
|
||||
if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
|
||||
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
|
||||
SD.spread(2)
|
||||
StartCooldown()
|
||||
return TRUE
|
||||
|
||||
@@ -185,11 +218,12 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
return FALSE
|
||||
to_chat(D, "<span class='notice'>You force [L.real_name] to sneeze.</span>")
|
||||
L.emote("sneeze")
|
||||
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
|
||||
if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
|
||||
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
|
||||
|
||||
for(var/mob/living/M in oview(4, SD.affected_mob))
|
||||
if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
|
||||
M.AirborneContractDisease(SD, TRUE)
|
||||
for(var/mob/living/M in oview(4, SD.affected_mob))
|
||||
if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
|
||||
M.AirborneContractDisease(SD, TRUE)
|
||||
|
||||
StartCooldown()
|
||||
return TRUE
|
||||
@@ -235,143 +269,192 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
StartCooldown()
|
||||
return TRUE
|
||||
|
||||
//passive symptom abilities
|
||||
/*******************BASE SYMPTOM TYPES*******************/
|
||||
// cost is for convenience and can be changed. If you're changing req_tot_points then don't use the subtype...
|
||||
//healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!)
|
||||
|
||||
/datum/disease_ability/symptom/cough
|
||||
name = "Involuntary Coughing"
|
||||
symptoms = list(/datum/symptom/cough)
|
||||
/datum/disease_ability/symptom/mild
|
||||
cost = 2
|
||||
required_total_points = 4
|
||||
category = "Symptom (Weak)"
|
||||
|
||||
/datum/disease_ability/symptom/medium
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
category = "Symptom"
|
||||
|
||||
/datum/disease_ability/symptom/medium/heal
|
||||
cost = 5
|
||||
category = "Symptom (+)"
|
||||
|
||||
/datum/disease_ability/symptom/powerful
|
||||
cost = 4
|
||||
required_total_points = 16
|
||||
category = "Symptom (Strong)"
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal
|
||||
cost = 8
|
||||
category = "Symptom (Strong+)"
|
||||
|
||||
|
||||
/******MILD******/
|
||||
|
||||
/datum/disease_ability/symptom/mild/cough
|
||||
name = "Involuntary Coughing"
|
||||
symptoms = list(/datum/symptom/cough)
|
||||
short_desc = "Cause victims to cough intermittently."
|
||||
long_desc = "Cause victims to cough intermittently, spreading your infection if your transmissibility is high."
|
||||
|
||||
/datum/disease_ability/symptom/sneeze
|
||||
/datum/disease_ability/symptom/mild/sneeze
|
||||
name = "Involuntary Sneezing"
|
||||
symptoms = list(/datum/symptom/sneeze)
|
||||
cost = 2
|
||||
required_total_points = 4
|
||||
short_desc = "Cause victims to sneeze intermittently."
|
||||
long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth."
|
||||
|
||||
/datum/disease_ability/symptom/beard
|
||||
//I don't think I need to justify the fact that this is the best symptom
|
||||
name = "Beard Growth"
|
||||
symptoms = list(/datum/symptom/beard)
|
||||
cost = 1
|
||||
required_total_points = 8
|
||||
short_desc = "Cause all victims to grow a luscious beard."
|
||||
long_desc = "Cause all victims to grow a luscious beard. Decreases stats slightly. Ineffective against Santa Claus."
|
||||
/******MEDIUM******/
|
||||
|
||||
/datum/disease_ability/symptom/hallucigen
|
||||
name = "Hallucinations"
|
||||
/datum/disease_ability/symptom/medium/shedding
|
||||
symptoms = list(/datum/symptom/shedding)
|
||||
|
||||
/datum/disease_ability/symptom/medium/beard
|
||||
symptoms = list(/datum/symptom/beard)
|
||||
short_desc = "Cause all victims to grow a luscious beard."
|
||||
long_desc = "Cause all victims to grow a luscious beard. Ineffective against Santa Claus."
|
||||
|
||||
/datum/disease_ability/symptom/medium/hallucigen
|
||||
symptoms = list(/datum/symptom/hallucigen)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to hallucinate."
|
||||
long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance."
|
||||
|
||||
/datum/disease_ability/symptom/choking
|
||||
name = "Choking"
|
||||
/datum/disease_ability/symptom/medium/choking
|
||||
symptoms = list(/datum/symptom/choking)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to choke."
|
||||
long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility."
|
||||
|
||||
|
||||
/datum/disease_ability/symptom/confusion
|
||||
name = "Confusion"
|
||||
/datum/disease_ability/symptom/medium/confusion
|
||||
symptoms = list(/datum/symptom/confusion)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to become confused."
|
||||
long_desc = "Cause victims to become confused intermittently."
|
||||
|
||||
/datum/disease_ability/symptom/youth
|
||||
name = "Eternal Youth"
|
||||
symptoms = list(/datum/symptom/youth)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to become eternally young."
|
||||
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
|
||||
|
||||
|
||||
/datum/disease_ability/symptom/vomit
|
||||
name = "Vomiting"
|
||||
/datum/disease_ability/symptom/medium/vomit
|
||||
symptoms = list(/datum/symptom/vomit)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to vomit."
|
||||
long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage."
|
||||
|
||||
/datum/disease_ability/symptom/voice_change
|
||||
name = "Voice Changing"
|
||||
/datum/disease_ability/symptom/medium/voice_change
|
||||
symptoms = list(/datum/symptom/voice_change)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Change the voice of victims."
|
||||
long_desc = "Change the voice of victims, causing confusion in communications."
|
||||
|
||||
/datum/disease_ability/symptom/visionloss
|
||||
name = "Vision Loss"
|
||||
/datum/disease_ability/symptom/medium/visionloss
|
||||
symptoms = list(/datum/symptom/visionloss)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Damage the eyes of victims, eventually causing blindness."
|
||||
long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats."
|
||||
|
||||
/datum/disease_ability/symptom/viraladaptation
|
||||
name = "Self-Adaptation"
|
||||
/datum/disease_ability/symptom/medium/deafness
|
||||
symptoms = list(/datum/symptom/deafness)
|
||||
|
||||
/datum/disease_ability/symptom/medium/fever
|
||||
symptoms = list(/datum/symptom/fever)
|
||||
|
||||
/datum/disease_ability/symptom/medium/shivering
|
||||
symptoms = list(/datum/symptom/shivering)
|
||||
|
||||
/datum/disease_ability/symptom/medium/headache
|
||||
symptoms = list(/datum/symptom/headache)
|
||||
|
||||
/datum/disease_ability/symptom/medium/nano_boost
|
||||
symptoms = list(/datum/symptom/nano_boost)
|
||||
|
||||
/datum/disease_ability/symptom/medium/nano_destroy
|
||||
symptoms = list(/datum/symptom/nano_destroy)
|
||||
|
||||
/datum/disease_ability/symptom/medium/viraladaptation
|
||||
symptoms = list(/datum/symptom/viraladaptation)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause your infection to become more resistant to detection and eradication."
|
||||
long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed."
|
||||
|
||||
/datum/disease_ability/symptom/vitiligo
|
||||
name = "Skin Paleness"
|
||||
/datum/disease_ability/symptom/medium/viralevolution
|
||||
symptoms = list(/datum/symptom/viralevolution)
|
||||
|
||||
/datum/disease_ability/symptom/medium/vitiligo
|
||||
symptoms = list(/datum/symptom/vitiligo)
|
||||
cost = 1
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to become pale."
|
||||
long_desc = "Cause victims to become pale. Decreases all stats."
|
||||
|
||||
/datum/disease_ability/symptom/sensory_restoration
|
||||
name = "Sensory Restoration"
|
||||
symptoms = list(/datum/symptom/sensory_restoration)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Regenerate eye and ear damage of victims."
|
||||
long_desc = "Regenerate eye and ear damage of victims."
|
||||
/datum/disease_ability/symptom/medium/revitiligo
|
||||
symptoms = list(/datum/symptom/revitiligo)
|
||||
|
||||
/datum/disease_ability/symptom/itching
|
||||
name = "Itching"
|
||||
/datum/disease_ability/symptom/medium/itching
|
||||
symptoms = list(/datum/symptom/itching)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to itch."
|
||||
long_desc = "Cause victims to itch, increasing all stats except stealth."
|
||||
|
||||
/datum/disease_ability/symptom/weight_loss
|
||||
name = "Weight Loss"
|
||||
/datum/disease_ability/symptom/medium/heal/weight_loss
|
||||
symptoms = list(/datum/symptom/weight_loss)
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to lose weight."
|
||||
long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing."
|
||||
|
||||
/datum/disease_ability/symptom/metabolism_heal
|
||||
name = "Metabolic Boost"
|
||||
/datum/disease_ability/symptom/medium/heal/sensory_restoration
|
||||
symptoms = list(/datum/symptom/sensory_restoration)
|
||||
short_desc = "Regenerate eye and ear damage of victims."
|
||||
long_desc = "Regenerate eye and ear damage of victims."
|
||||
|
||||
/datum/disease_ability/symptom/medium/heal/mind_restoration
|
||||
symptoms = list(/datum/symptom/mind_restoration)
|
||||
|
||||
/******POWERFUL******/
|
||||
|
||||
/datum/disease_ability/symptom/powerful/fire
|
||||
symptoms = list(/datum/symptom/fire)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/flesh_eating
|
||||
symptoms = list(/datum/symptom/flesh_eating)
|
||||
|
||||
/*
|
||||
/datum/disease_ability/symptom/powerful/genetic_mutation
|
||||
symptoms = list(/datum/symptom/genetic_mutation)
|
||||
cost = 8
|
||||
*/
|
||||
|
||||
/datum/disease_ability/symptom/powerful/inorganic_adaptation
|
||||
symptoms = list(/datum/symptom/inorganic_adaptation)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/narcolepsy
|
||||
symptoms = list(/datum/symptom/narcolepsy)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/youth
|
||||
symptoms = list(/datum/symptom/youth)
|
||||
short_desc = "Cause victims to become eternally young."
|
||||
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
|
||||
|
||||
/****HEALING SUBTYPE****/
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal/starlight
|
||||
symptoms = list(/datum/symptom/heal/starlight)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal/oxygen
|
||||
symptoms = list(/datum/symptom/oxygen)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal/chem
|
||||
symptoms = list(/datum/symptom/heal/chem)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal/metabolism
|
||||
symptoms = list(/datum/symptom/heal/metabolism)
|
||||
cost = 4
|
||||
required_total_points = 16
|
||||
short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster."
|
||||
long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly."
|
||||
|
||||
/datum/disease_ability/symptom/coma_heal
|
||||
name = "Regenerative Coma"
|
||||
/datum/disease_ability/symptom/powerful/heal/dark
|
||||
symptoms = list(/datum/symptom/heal/darkness)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal/water
|
||||
symptoms = list(/datum/symptom/heal/water)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal/plasma
|
||||
symptoms = list(/datum/symptom/heal/plasma)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal/radiation
|
||||
symptoms = list(/datum/symptom/heal/radiation)
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal/coma
|
||||
symptoms = list(/datum/symptom/heal/coma)
|
||||
cost = 8
|
||||
required_total_points = 16
|
||||
short_desc = "Cause victims to fall into a healing coma when hurt."
|
||||
long_desc = "Cause victims to fall into a healing coma when hurt."
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
if(cures.len)
|
||||
return
|
||||
var/list/not_used = advance_cures.Copy()
|
||||
not_used.Cut(1, 6) // Removes the first five tiers of cures.
|
||||
cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used)))
|
||||
|
||||
// Get the cure name from the cure_id
|
||||
|
||||
@@ -18,7 +18,7 @@ the new instance inside the host to be updated to the template's stats.
|
||||
layer = BELOW_MOB_LAYER
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
sight = SEE_SELF|SEE_THRU
|
||||
initial_language_holder = /datum/language_holder/empty
|
||||
initial_language_holder = /datum/language_holder/universal
|
||||
|
||||
var/freemove = TRUE
|
||||
var/freemove_end = 0
|
||||
@@ -43,7 +43,7 @@ the new instance inside the host to be updated to the template's stats.
|
||||
var/move_delay = 1
|
||||
|
||||
var/next_adaptation_time = 0
|
||||
var/adaptation_cooldown = 1200
|
||||
var/adaptation_cooldown = 600
|
||||
|
||||
var/list/purchased_abilities
|
||||
var/list/unpurchased_abilities
|
||||
@@ -118,10 +118,28 @@ the new instance inside the host to be updated to the template's stats.
|
||||
follow_next(Dir & NORTHWEST)
|
||||
last_move_tick = world.time
|
||||
|
||||
/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
. = ..()
|
||||
var/atom/movable/to_follow = speaker
|
||||
if(radio_freq)
|
||||
var/atom/movable/virtualspeaker/V = speaker
|
||||
to_follow = V.source
|
||||
var/link
|
||||
if(to_follow in hosts)
|
||||
link = FOLLOW_LINK(src, to_follow)
|
||||
else
|
||||
link = ""
|
||||
// Recompose the message, because it's scrambled by default
|
||||
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
|
||||
to_chat(src, "[link] [message]")
|
||||
|
||||
|
||||
/mob/camera/disease/mind_initialize()
|
||||
. = ..()
|
||||
if(!mind.has_antag_datum(/datum/antagonist/disease))
|
||||
mind.add_antag_datum(/datum/antagonist/disease)
|
||||
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
medsensor.add_hud_to(src)
|
||||
|
||||
/mob/camera/disease/proc/pick_name()
|
||||
var/static/list/taken_names
|
||||
@@ -247,9 +265,12 @@ the new instance inside the host to be updated to the template's stats.
|
||||
if(!move_listener)
|
||||
move_listener = L.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/follow_mob)))
|
||||
else
|
||||
L.TakeComponent(move_listener)
|
||||
if(QDELING(move_listener))
|
||||
move_listener = null
|
||||
if(L)
|
||||
L.TakeComponent(move_listener)
|
||||
if(QDELING(move_listener))
|
||||
move_listener = null
|
||||
else
|
||||
QDEL_NULL(move_listener)
|
||||
follow_mob()
|
||||
|
||||
/mob/camera/disease/proc/follow_next(reverse = FALSE)
|
||||
|
||||
@@ -23,7 +23,13 @@
|
||||
name = "Full Tank of Tritium"
|
||||
description = "Station 42 is looking to kickstart their research program. Ship them a tank full of Tritium."
|
||||
gas_type = /datum/gas/tritium
|
||||
|
||||
//Hyperstation edit
|
||||
/datum/bounty/item/engineering/gas/hypernoblium_tank
|
||||
name = "Full Tank of Hyper-Noblium"
|
||||
description = "The 7th Echelon is looking to research the effects of this rare gas in organics. They ask for a full tank of it. Are you up to the task?"
|
||||
gas_type = /datum/gas/hypernoblium
|
||||
reward = 75000 //Very, very difficult to make, requires a fuckton of structural re-design around engineering and can actually royally fuck up the entirety of the station if not done correctly.
|
||||
//Hypersation edit end
|
||||
/datum/bounty/item/engineering/pacman
|
||||
name = "P.A.C.M.A.N.-type portable generator"
|
||||
description = "A neighboring station had a problem with their SMES, and now need something to power their communications console. Can you send them a P.AC.M.A.N.?"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
name = "Trash Bag of Holding"
|
||||
description = "Centcom would make good use of high-capacity trash bags. If you have any, please ship them."
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/storage/backpack/holding)
|
||||
wanted_types = list(/obj/item/storage/bag/trash/bluespace)
|
||||
|
||||
/datum/bounty/item/science/bluespace_syringe
|
||||
name = "Bluespace Syringe"
|
||||
|
||||
@@ -1103,7 +1103,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
#undef APPEARANCE_CATEGORY_COLUMN
|
||||
#undef MAX_MUTANT_ROWS
|
||||
|
||||
/datum/preferences/proc/SetChoices(mob/user, limit = 17, list/splitJobs = list("Chief Engineer"), widthPerColumn = 295, height = 620)
|
||||
/datum/preferences/proc/SetChoices(mob/user, limit = 22, list/splitJobs = list("Chief Engineer"), widthPerColumn = 295, height = 620)
|
||||
if(!SSjob)
|
||||
return
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
if(istype(W, /obj/item/bluespace_thread))
|
||||
var/obj/item/bluespace_thread/B = W
|
||||
if ((istype(src, /obj/item/clothing/under) || istype(src, /obj/item/clothing/suit)) && roomy != 1) //Make sure the thread is used on an item that could be ripped off in the first place
|
||||
roomy = 1 //True
|
||||
roomy = TRUE //True
|
||||
user.show_message("<span class='notice'>You add a few stiches to your clothing, and find them to fit a little looser.</span>", 1)
|
||||
B.uses -= 1 //One use has been used
|
||||
if(B.uses <= 0)
|
||||
|
||||
@@ -224,6 +224,17 @@
|
||||
force = 12
|
||||
throwforce = 12
|
||||
|
||||
/obj/item/clothing/glasses/garb
|
||||
name = "plain black gar glasses"
|
||||
desc = "Go beyond impossible and kick reason to the curb! Doesn't seem to have flash protection and doesn't seem sharp either."
|
||||
icon_state = "garb"
|
||||
item_state = "garb"
|
||||
|
||||
/obj/item/clothing/glasses/garb/supergarb
|
||||
name = "plain black giga gar glasses"
|
||||
desc = "Believe in us humans. Also doesn't seem to have flash protection and doesn't seem sharp either."
|
||||
icon_state = "supergarb"
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/gar
|
||||
name = "gar glasses"
|
||||
desc = "Just who the hell do you think I am?!"
|
||||
|
||||
@@ -45,6 +45,20 @@
|
||||
vision_correction = 1
|
||||
glass_colour_type = /datum/client_colour/glass_colour/lightblue
|
||||
|
||||
/obj/item/clothing/glasses/hud/health/gar
|
||||
name = "gar health scanner HUD"
|
||||
desc = "When you're scared, that's all the more reason to move forward!"
|
||||
icon_state = "garh"
|
||||
item_state = "garh"
|
||||
hud_type = DATA_HUD_MEDICAL_ADVANCED
|
||||
glass_colour_type = /datum/client_colour/glass_colour/lightblue
|
||||
force = 10
|
||||
throwforce = 10
|
||||
throw_speed = 4
|
||||
attack_verb = list("sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/clothing/glasses/hud/health/night
|
||||
name = "night vision health scanner HUD"
|
||||
desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
|
||||
|
||||
@@ -129,3 +129,14 @@
|
||||
icon_state = "emtsoft"
|
||||
item_color = "emt"
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/clothing/head/soft/baseball
|
||||
name = "baseball cap"
|
||||
desc = "It's a robust baseball hat, this one belongs to syndicate major league team."
|
||||
icon_state = "baseballsoft"
|
||||
item_color = "baseballsoft"
|
||||
item_state = "baseballsoft"
|
||||
flags_inv = HIDEEYES|HIDEFACE
|
||||
armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90)
|
||||
strip_delay = 90 //You dont take a Major Leage cap
|
||||
dog_fashion = null
|
||||
|
||||
@@ -62,6 +62,16 @@
|
||||
desc = "A pair of orange rubber boots, designed to prevent slipping on wet surfaces while also drying them."
|
||||
icon_state = "galoshes_dry"
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/noslip
|
||||
desc = "A pair of black shoes, they have the soles of galoshes making them unable to be slipped on a wet surface."
|
||||
name = "black shoes"
|
||||
icon_state = "black"
|
||||
permeability_coefficient = 0.30
|
||||
clothing_flags = NOSLIP
|
||||
strip_delay = 50
|
||||
equip_delay_other = 50
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/shoes/galoshes/dry/step_action()
|
||||
var/turf/open/t_loc = get_turf(src)
|
||||
SEND_SIGNAL(t_loc, COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY)
|
||||
|
||||
@@ -103,6 +103,7 @@
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet)
|
||||
var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit
|
||||
var/obj/item/tank/jetpack/suit/jetpack = null
|
||||
roomy = TRUE
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/Initialize()
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
max_integrity = 250
|
||||
resistance_flags = NONE
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
roomy = TRUE
|
||||
|
||||
/obj/item/clothing/suit/armor/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -590,6 +590,7 @@
|
||||
item_state = "coatcentcom"
|
||||
armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom
|
||||
roomy = TRUE
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize()
|
||||
. = ..()
|
||||
@@ -598,6 +599,7 @@
|
||||
/obj/item/clothing/head/hooded/winterhood/centcom
|
||||
icon_state = "winterhood_centcom"
|
||||
armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
|
||||
roomy = TRUE
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/captain
|
||||
name = "captain's winter coat"
|
||||
|
||||
@@ -55,16 +55,6 @@
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
|
||||
/obj/item/clothing/suit/kaminacape
|
||||
name = "Kamina's Cape"
|
||||
desc = "Don't believe in yourself, dumbass. Believe in me. Believe in the Kamina who believes in you."
|
||||
icon_state = "kaminacape"
|
||||
body_parts_covered = 0
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/officercoat
|
||||
name = "Officer's Coat"
|
||||
desc = "Ein Mantel gemacht, um die Juden zu bestrafen."
|
||||
@@ -75,7 +65,7 @@
|
||||
|
||||
/obj/item/clothing/suit/soldiercoat
|
||||
name = "Soldier's Coat"
|
||||
desc = "Und das heißt: Erika."
|
||||
desc = "Und das hei�t: Erika."
|
||||
icon_state = "soldiersuit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
|
||||
@@ -119,12 +119,14 @@
|
||||
item_state = "g_suit"
|
||||
item_color = "officer"
|
||||
alt_covers_chest = TRUE
|
||||
roomy = TRUE
|
||||
/obj/item/clothing/under/rank/centcom_commander
|
||||
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders, adorned with a golden K and a star. signifying work under Kinaris."
|
||||
name = "\improper CentCom Commander's jumpsuit"
|
||||
icon_state = "centcom"
|
||||
item_state = "dg_suit"
|
||||
item_color = "centcom"
|
||||
roomy = TRUE
|
||||
/obj/item/clothing/under/rank/centcom_officer/skirt
|
||||
name = "\improper CentCom Officer's jumpskirt"
|
||||
desc = "It's a jumpskirt worn by CentCom's officials, adorned with a golden K and a star, signifying work under Kinaris."
|
||||
@@ -134,6 +136,7 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
roomy = TRUE
|
||||
/obj/item/clothing/under/space
|
||||
name = "\improper NASA jumpsuit"
|
||||
desc = "It has a NASA logo on it and is made of space-proofed materials."
|
||||
@@ -166,6 +169,7 @@
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
can_adjust = FALSE
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
roomy = TRUE
|
||||
/obj/item/clothing/under/owl
|
||||
name = "owl uniform"
|
||||
desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction."
|
||||
|
||||
@@ -70,6 +70,16 @@
|
||||
item_color = "syndicate_combat"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/syndicate/baseball
|
||||
name = "major league, number unknown"
|
||||
desc = "A major league outfit with the number faded number on the back. Seems rather robust for just a game"
|
||||
icon_state = "syndicatebaseball"
|
||||
item_state = "syndicatebaseball"
|
||||
item_color = "syndicatebaseball"
|
||||
has_sensor = NO_SENSORS
|
||||
armor = list("melee" = 15, "bullet" = 5, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION //Someone needs to sprite the alternate variant for mutants though. But it's better than an error.
|
||||
|
||||
/obj/item/clothing/under/syndicate/comfortable
|
||||
name = "Padded Uniform"
|
||||
desc = "A uniform of similar design to the combat uniform, it has had it's armor replaced with extra padding while providing pockets to hold useful gear."
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
/datum/round_event/heart_attack/start()
|
||||
var/list/heart_attack_contestants = list()
|
||||
for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
|
||||
if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest())
|
||||
if(!H.client || H.z != SSmapping.station_start || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest())
|
||||
continue
|
||||
if(H.satiety <= -60) //Multiple junk food items recently
|
||||
heart_attack_contestants[H] = 3
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
/var/list/blacklisted_sentient_animals = typecacheof(list(
|
||||
/mob/living/simple_animal/slime,
|
||||
/mob/living/simple_animal/hostile/megafauna,
|
||||
/mob/living/simple_animal/hostile/blob,
|
||||
/mob/living/simple_animal/jacq,
|
||||
/mob/living/simple_animal/holodeck_monkey,
|
||||
/mob/living/simple_animal/astral))
|
||||
|
||||
/datum/round_event_control/sentience
|
||||
name = "Random Human-level Intelligence"
|
||||
typepath = /datum/round_event/ghost_role/sentience
|
||||
@@ -33,6 +41,8 @@
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T || !is_station_level(T.z))
|
||||
continue
|
||||
if(is_type_in_typecache(L, blacklisted_sentient_animals))
|
||||
continue
|
||||
if(!(L in GLOB.player_list) && !L.mind)
|
||||
potential += L
|
||||
|
||||
|
||||
@@ -48,8 +48,14 @@
|
||||
var/cached_z
|
||||
var/static/blacklisted_items = typecacheof(list(
|
||||
/obj/singularity,
|
||||
/obj/structure/destructible/clockwork/massive,
|
||||
/obj/machinery/power/supermatter_crystal))
|
||||
/obj/structure/destructible/clockwork/massive/ratvar,
|
||||
/obj/item/projectile,
|
||||
/obj/effect,
|
||||
/obj/belly,
|
||||
/obj/decal,
|
||||
/obj/docking_port,
|
||||
/obj/shapeshift_holder,
|
||||
/obj/screen))
|
||||
|
||||
/mob/living/simple_animal/jacq/Initialize()
|
||||
..()
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
desc = "A plant sculped by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372."
|
||||
icon_state = "seed-trumpet"
|
||||
species = "spacemanstrumpet"
|
||||
plantname = "Spaceman's Trumpet Plant"
|
||||
plantname = "Spaceman Trumpet"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/trumpet
|
||||
lifespan = 80
|
||||
production = 5
|
||||
@@ -68,13 +68,14 @@
|
||||
icon_grow = "spacemanstrumpet-grow"
|
||||
icon_dead = "spacemanstrumpet-dead"
|
||||
mutatelist = list()
|
||||
genes = list( "Polypyrylium Oligomers")
|
||||
genes = list(/datum/plant_gene/reagent/polypyr)
|
||||
reagents_add = list("nutriment" = 0.05)
|
||||
rarity = 30
|
||||
|
||||
/obj/item/seeds/poppy/lily/trumpet/Initialize()
|
||||
..()
|
||||
unset_mutability(/datum/plant_gene/reagent/polypyr, PLANT_GENE_EXTRACTABLE)
|
||||
/obj/item/seeds/poppy/lily/trumpet/Initialize(mapload, nogenes = FALSE)
|
||||
. = ..()
|
||||
if(!nogenes)
|
||||
unset_mutability(/datum/plant_gene/reagent/polypyr, PLANT_GENE_EXTRACTABLE)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/trumpet
|
||||
seed = /obj/item/seeds/poppy/lily/trumpet
|
||||
@@ -317,4 +318,4 @@
|
||||
filling_color = "#FF6347"
|
||||
bitesize_mod = 8
|
||||
tastes = list("wax" = 1)
|
||||
foodtype = SUGAR
|
||||
foodtype = SUGAR
|
||||
|
||||
@@ -83,9 +83,10 @@
|
||||
mutatelist = list()
|
||||
reagents_add = list("nutriment" = 0.05, "silibinin" = 0.1)
|
||||
|
||||
/obj/item/seeds/galaxythistle/Initialize()
|
||||
..()
|
||||
unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE)
|
||||
/obj/item/seeds/galaxythistle/Initialize(mapload, nogenes = FALSE)
|
||||
. = ..()
|
||||
if(!nogenes)
|
||||
unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/galaxythistle
|
||||
seed = /obj/item/seeds/galaxythistle
|
||||
|
||||
@@ -216,10 +216,11 @@
|
||||
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
|
||||
reagents_add = list("nutriment" = 0.1)
|
||||
|
||||
/obj/item/seeds/chanterelle/jupitercup/Initialize()
|
||||
..()
|
||||
unset_mutability(/datum/plant_gene/reagent/teslium, PLANT_GENE_EXTRACTABLE)
|
||||
unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE)
|
||||
/obj/item/seeds/chanterelle/jupitercup/Initialize(mapload, nogenes = FALSE)
|
||||
. = ..()
|
||||
if(!nogenes)
|
||||
unset_mutability(/datum/plant_gene/reagent/teslium, PLANT_GENE_EXTRACTABLE)
|
||||
unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup
|
||||
seed = /obj/item/seeds/chanterelle/jupitercup
|
||||
|
||||
@@ -18,7 +18,9 @@
|
||||
return !istype(S, /obj/item/seeds/sample) // Samples can't accept new genes
|
||||
|
||||
/datum/plant_gene/proc/Copy()
|
||||
return new type
|
||||
var/datum/plant_gene/G = new type
|
||||
G.mutability_flags = mutability_flags
|
||||
return G
|
||||
|
||||
/datum/plant_gene/proc/apply_vars(obj/item/seeds/S) // currently used for fire resist, can prob. be further refactored
|
||||
return
|
||||
@@ -151,9 +153,9 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/plant_gene/reagent/polypyr
|
||||
/datum/plant_gene/reagent/polypyr
|
||||
name = "Polypyrylium Oligomers"
|
||||
reagent_id = "polypyrylium_oligomers"
|
||||
reagent_id = "polypyr"
|
||||
rate = 0.15
|
||||
|
||||
/datum/plant_gene/reagent/teslium
|
||||
@@ -495,4 +497,4 @@ datum/plant_gene/trait/glow/white
|
||||
name ="?????"
|
||||
|
||||
/datum/plant_gene/trait/plant_type/carnivory
|
||||
name = "Obligate Carnivory"
|
||||
name = "Obligate Carnivory"
|
||||
|
||||
@@ -56,6 +56,11 @@
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
seed_multiplier = M.rating
|
||||
|
||||
/obj/machinery/seed_extractor/examine(mob/user)
|
||||
. = ..()
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += "<span class='notice'>The status display reads: Extracting <b>[seed_multiplier]</b> seed(s) per piece of produce.<br>Machine can store up to <b>[max_seeds]</b> seeds.</span>"
|
||||
|
||||
/obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params)
|
||||
|
||||
if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", O))
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth
|
||||
var/weed_chance = 5 //Percentage chance per tray update to grow weeds
|
||||
|
||||
/obj/item/seeds/Initialize(loc, nogenes = 0)
|
||||
/obj/item/seeds/Initialize(mapload, nogenes = 0)
|
||||
. = ..()
|
||||
pixel_x = rand(-8, 8)
|
||||
pixel_y = rand(-8, 8)
|
||||
|
||||
@@ -12,8 +12,8 @@ Captain
|
||||
supervisors = "Kinaris officials and Space law"
|
||||
selection_color = "#ccccff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 20
|
||||
exp_requirements = 480
|
||||
minimal_player_age = 30
|
||||
exp_requirements = 3000
|
||||
exp_type = EXP_TYPE_COMMAND
|
||||
exp_type_department = EXP_TYPE_COMMAND
|
||||
|
||||
@@ -84,7 +84,7 @@ Head of Personnel
|
||||
selection_color = "#ddddff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 20
|
||||
exp_requirements = 180
|
||||
exp_requirements = 1500
|
||||
exp_type = EXP_TYPE_SERVICE
|
||||
exp_type_department = EXP_TYPE_SERVICE
|
||||
|
||||
|
||||
@@ -12,15 +12,15 @@ Quartermaster is a real head fuck you
|
||||
spawn_positions = 1
|
||||
supervisors = "the captain"
|
||||
selection_color = "#d7b088"
|
||||
minimal_player_age = 10
|
||||
minimal_player_age = 7
|
||||
exp_type = EXP_TYPE_SUPPLY
|
||||
exp_type_department = EXP_TYPE_SUPPLY
|
||||
exp_requirements = 300
|
||||
exp_requirements = 1200
|
||||
|
||||
outfit = /datum/outfit/job/quartermaster
|
||||
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT)
|
||||
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT)
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS, ACCESS_VAULT)
|
||||
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS, ACCESS_VAULT)
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
|
||||
@@ -35,6 +35,10 @@ Quartermaster is a real head fuck you
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
l_hand = /obj/item/clipboard
|
||||
|
||||
id = /obj/item/card/id/silver
|
||||
ears = /obj/item/radio/headset/heads/qm
|
||||
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
|
||||
|
||||
chameleon_extras = /obj/item/stamp/qm
|
||||
|
||||
/*
|
||||
@@ -81,7 +85,7 @@ Shaft Miner
|
||||
selection_color = "#dcba97"
|
||||
custom_spawn_text = "Remember, you are a miner, not a hunter. Hunting monsters is not a requirement of your job, the only requirement of your job is to provide materials for the station. Don't be afraid to run away if you're inexperienced with fighting the mining area's locals."
|
||||
minimal_player_age = 1
|
||||
exp_requirements = 120
|
||||
exp_requirements = 600
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_type_department = EXP_TYPE_SUPPLY
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ Chief Engineer
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ffeeaa"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 20
|
||||
exp_requirements = 300
|
||||
minimal_player_age = 14
|
||||
exp_requirements = 1500
|
||||
exp_type = EXP_TYPE_ENGINEERING
|
||||
exp_type_department = EXP_TYPE_ENGINEERING
|
||||
|
||||
@@ -79,8 +79,9 @@ Station Engineer
|
||||
minimal_player_age = 1
|
||||
supervisors = "the chief engineer"
|
||||
selection_color = "#fff5cc"
|
||||
exp_requirements = 120
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_ENGINEERING
|
||||
exp_type_department = EXP_TYPE_ENGINEERING
|
||||
|
||||
outfit = /datum/outfit/job/engineer
|
||||
|
||||
@@ -136,14 +137,16 @@ Atmospheric Technician
|
||||
minimal_player_age = 2
|
||||
supervisors = "the chief engineer"
|
||||
selection_color = "#fff5cc"
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_requirements = 600
|
||||
exp_type = EXP_TYPE_ENGINEERING
|
||||
exp_type_department = EXP_TYPE_ENGINEERING
|
||||
|
||||
outfit = /datum/outfit/job/atmos
|
||||
|
||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/datum/outfit/job/atmos
|
||||
name = "Atmospheric Technician"
|
||||
@@ -169,3 +172,65 @@ Atmospheric Technician
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
internals_slot = SLOT_S_STORE
|
||||
|
||||
/*
|
||||
Junior Engineer
|
||||
*/
|
||||
/datum/job/junior_engineer
|
||||
title = "Engineering Intern"
|
||||
flag = JR_ENGINEER
|
||||
department_head = list("Chief Engineer")
|
||||
department_flag = ENGSEC
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
minimal_player_age = 0
|
||||
supervisors = "the chief engineer, and any other more experienced engineers"
|
||||
selection_color = "#fff5cc"
|
||||
exp_requirements = 120
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/engineer/junior
|
||||
|
||||
access = list(ACCESS_TECH_STORAGE, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_TECH_STORAGE, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/datum/outfit/job/engineer/junior
|
||||
name = "Engineering Intern"
|
||||
jobtype = /datum/job/junior_engineer
|
||||
|
||||
belt = /obj/item/storage/belt/utility/full/engi
|
||||
l_pocket = /obj/item/pda/engineering
|
||||
ears = /obj/item/radio/headset/headset_eng
|
||||
uniform = /obj/item/clothing/under/rank/engineer
|
||||
shoes = /obj/item/clothing/shoes/workboots
|
||||
head = /obj/item/clothing/head/hardhat
|
||||
r_pocket = /obj/item/t_scanner
|
||||
|
||||
backpack = /obj/item/storage/backpack/industrial
|
||||
satchel = /obj/item/storage/backpack/satchel/eng
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
|
||||
box = /obj/item/storage/box/engineer
|
||||
pda_slot = SLOT_L_STORE
|
||||
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
|
||||
|
||||
/datum/outfit/job/engineer/junior/gloved/
|
||||
name = "Station Engineer (Gloves)"
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
|
||||
/datum/outfit/job/engineer/junior/gloved/rig/junior
|
||||
name = "Station Engineer (Hardsuit)"
|
||||
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/engine
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
head = null
|
||||
internals_slot = SLOT_S_STORE
|
||||
|
||||
/datum/job/junior_engineer/after_spawn(mob/living/carbon/human/H, mob/M) //Instead of going through the process of adding spawnpoints
|
||||
var/turf/T
|
||||
var/spawn_point = locate(/obj/effect/landmark/start/station_engineer) in GLOB.start_landmarks_list
|
||||
T = get_turf(spawn_point)
|
||||
H.Move(T)
|
||||
@@ -45,6 +45,7 @@
|
||||
|
||||
var/outfit = null
|
||||
|
||||
//Minutes required in specified job or department type.
|
||||
var/exp_requirements = 0
|
||||
|
||||
var/exp_type = ""
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//This file also determines the order for the choose your occupation chances screen.
|
||||
|
||||
//Engineering
|
||||
/datum/job/chief_engineer
|
||||
alt_titles = list("Head Engineer", "Construction Coordinator", "Project Manager")
|
||||
@@ -8,6 +10,8 @@
|
||||
/datum/job/atmos
|
||||
alt_titles = list("Firefighter", "Life Support Specialist")
|
||||
|
||||
/datum/job/junior_engineer
|
||||
|
||||
//Service
|
||||
/datum/job/assistant
|
||||
alt_titles = list("Civilian", "Visitor", "Businessman", "Trader", "Entertainer", "Tourist")
|
||||
@@ -49,12 +53,14 @@
|
||||
/datum/job/roboticist
|
||||
alt_titles = list("Biomechanical Engineer", "Mechatronic Engineer", "Mechanic")
|
||||
|
||||
/datum/job/junior_scientist
|
||||
|
||||
//Medical
|
||||
/datum/job/cmo
|
||||
alt_titles = list("Medical Director")
|
||||
|
||||
/datum/job/doctor
|
||||
alt_titles = list("Nurse", "Surgeon", "Physician")
|
||||
alt_titles = list("Nurse", "Surgeon", "Physician", "Paramedic")
|
||||
|
||||
/datum/job/chemist
|
||||
alt_titles = list("Pharmacist", "Pharmacologist")
|
||||
@@ -65,6 +71,8 @@
|
||||
/datum/job/geneticist
|
||||
alt_titles = list("Gene Therapist")
|
||||
|
||||
/datum/job/junior_doctor
|
||||
|
||||
//Security
|
||||
/datum/job/hos
|
||||
alt_titles = list("Chief of Security", "Security Commander")
|
||||
@@ -78,6 +86,8 @@
|
||||
/datum/job/detective
|
||||
alt_titles = list("Forensics Technician", "Private Investigator", "Gumshoe")
|
||||
|
||||
/datum/job/junior_officer
|
||||
|
||||
//Supply
|
||||
/datum/job/qm
|
||||
alt_titles = list("Supply Chief")
|
||||
|
||||
@@ -13,8 +13,8 @@ Chief Medical Officer
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ffddf0"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
exp_requirements = 300
|
||||
minimal_player_age = 14
|
||||
exp_requirements = 1500
|
||||
exp_type = EXP_TYPE_MEDICAL
|
||||
exp_type_department = EXP_TYPE_MEDICAL
|
||||
|
||||
@@ -72,6 +72,9 @@ Medical Doctor
|
||||
minimal_player_age = 1
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
exp_requirements = 240
|
||||
exp_type = EXP_TYPE_MEDICAL
|
||||
exp_type_department = EXP_TYPE_MEDICAL
|
||||
|
||||
outfit = /datum/outfit/job/doctor
|
||||
|
||||
@@ -94,6 +97,8 @@ Medical Doctor
|
||||
satchel = /obj/item/storage/backpack/satchel/med
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/med
|
||||
|
||||
backpack_contents = list(/obj/item/storage/hypospraykit/regular)
|
||||
|
||||
chameleon_extras = /obj/item/gun/syringe
|
||||
|
||||
/*
|
||||
@@ -110,8 +115,10 @@ Chemist
|
||||
minimal_player_age = 1
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_requirements = 60
|
||||
exp_requirements = 480
|
||||
exp_type = EXP_TYPE_MEDICAL
|
||||
exp_type_department = EXP_TYPE_MEDICAL
|
||||
|
||||
|
||||
outfit = /datum/outfit/job/chemist
|
||||
|
||||
@@ -133,6 +140,8 @@ Chemist
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/med
|
||||
l_hand = /obj/item/fermichem/pHbooklet
|
||||
|
||||
backpack_contents = list(/obj/item/storage/hypospraykit/regular)
|
||||
|
||||
chameleon_extras = /obj/item/gun/syringe
|
||||
|
||||
/*
|
||||
@@ -148,8 +157,9 @@ Geneticist
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief medical officer and research director"
|
||||
selection_color = "#ffeef0"
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_requirements = 30
|
||||
exp_requirements = 480
|
||||
exp_type = EXP_TYPE_MEDICAL
|
||||
exp_type_department = EXP_TYPE_MEDICAL
|
||||
|
||||
outfit = /datum/outfit/job/geneticist
|
||||
|
||||
@@ -186,8 +196,9 @@ Virologist
|
||||
minimal_player_age = 2
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_requirements = 120
|
||||
exp_requirements = 600
|
||||
exp_type = EXP_TYPE_MEDICAL
|
||||
exp_type_department = EXP_TYPE_MEDICAL
|
||||
|
||||
outfit = /datum/outfit/job/virologist
|
||||
|
||||
@@ -209,3 +220,50 @@ Virologist
|
||||
backpack = /obj/item/storage/backpack/virology
|
||||
satchel = /obj/item/storage/backpack/satchel/vir
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/med
|
||||
|
||||
|
||||
/*
|
||||
Junior Doctor
|
||||
*/
|
||||
/datum/job/junior_doctor
|
||||
title = "Medical Resident"
|
||||
flag = JR_DOCTOR
|
||||
department_head = list("Chief Medical Officer")
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
minimal_player_age = 0
|
||||
supervisors = "the chief medical officer, and any other senior medical staff"
|
||||
selection_color = "#ffeef0"
|
||||
exp_requirements = 120
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/doctor/junior
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/datum/outfit/job/doctor/junior
|
||||
name = "Medical Resident"
|
||||
jobtype = /datum/job/junior_doctor
|
||||
|
||||
belt = /obj/item/pda/medical
|
||||
ears = /obj/item/radio/headset/headset_med
|
||||
uniform = /obj/item/clothing/under/rank/medical
|
||||
shoes = /obj/item/clothing/shoes/sneakers/white
|
||||
suit = /obj/item/clothing/suit/toggle/labcoat
|
||||
l_hand = /obj/item/storage/firstaid/regular
|
||||
suit_store = /obj/item/flashlight/pen
|
||||
|
||||
backpack = /obj/item/storage/backpack/medic
|
||||
satchel = /obj/item/storage/backpack/satchel/med
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/med
|
||||
|
||||
chameleon_extras = /obj/item/gun/syringe
|
||||
|
||||
/datum/job/junior_doctor/after_spawn(mob/living/carbon/human/H, mob/M) //Instead of going through the process of adding spawnpoints
|
||||
var/turf/T
|
||||
var/spawn_point = locate(/obj/effect/landmark/start/medical_doctor) in GLOB.start_landmarks_list
|
||||
T = get_turf(spawn_point)
|
||||
H.Move(T)
|
||||
@@ -13,10 +13,10 @@ Research Director
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ffddff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
exp_type_department = EXP_TYPE_SCIENCE
|
||||
exp_requirements = 300
|
||||
minimal_player_age = 14
|
||||
exp_requirements = 1500
|
||||
exp_type = EXP_TYPE_SCIENCE
|
||||
exp_type_department = EXP_TYPE_SCIENCE
|
||||
|
||||
outfit = /datum/outfit/job/rd
|
||||
|
||||
@@ -71,12 +71,13 @@ Scientist
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 5
|
||||
spawn_positions = 3
|
||||
spawn_positions = 2
|
||||
minimal_player_age = 1
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
exp_requirements = 120
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_requirements = 480
|
||||
exp_type = EXP_TYPE_SCIENCE
|
||||
exp_type_department = EXP_TYPE_SCIENCE
|
||||
|
||||
|
||||
outfit = /datum/outfit/job/scientist
|
||||
@@ -111,8 +112,10 @@ Roboticist
|
||||
minimal_player_age = 2
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
exp_requirements = 120
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_SCIENCE
|
||||
exp_type_department = EXP_TYPE_SCIENCE
|
||||
|
||||
|
||||
outfit = /datum/outfit/job/roboticist
|
||||
|
||||
@@ -133,3 +136,46 @@ Roboticist
|
||||
satchel = /obj/item/storage/backpack/satchel/tox
|
||||
|
||||
pda_slot = SLOT_L_STORE
|
||||
|
||||
|
||||
/*
|
||||
Junior Scientist
|
||||
*/
|
||||
/datum/job/junior_scientist
|
||||
title = "Research Student"
|
||||
flag = JR_SCIENTIST
|
||||
department_head = list("Research Director")
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 1
|
||||
minimal_player_age = 0
|
||||
supervisors = "the research director, and any other senior science staff"
|
||||
selection_color = "#ffeeff"
|
||||
exp_requirements = 120
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
|
||||
outfit = /datum/outfit/job/scientist/junior
|
||||
|
||||
access = list(ACCESS_ROBOTICS, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS)
|
||||
minimal_access = list(ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/datum/outfit/job/scientist/junior
|
||||
name = "Scientist"
|
||||
jobtype = /datum/job/scientist
|
||||
|
||||
belt = /obj/item/pda/toxins
|
||||
ears = /obj/item/radio/headset/headset_sci
|
||||
uniform = /obj/item/clothing/under/rank/scientist
|
||||
shoes = /obj/item/clothing/shoes/sneakers/white
|
||||
suit = /obj/item/clothing/suit/toggle/labcoat/science
|
||||
|
||||
backpack = /obj/item/storage/backpack/science
|
||||
satchel = /obj/item/storage/backpack/satchel/tox
|
||||
|
||||
/datum/job/junior_scientist/after_spawn(mob/living/carbon/human/H, mob/M) //Instead of going through the process of adding spawnpoints
|
||||
var/turf/T
|
||||
var/spawn_point = locate(/obj/effect/landmark/start/scientist) in GLOB.start_landmarks_list
|
||||
T = get_turf(spawn_point)
|
||||
H.Move(T)
|
||||
@@ -20,7 +20,7 @@ Head of Security
|
||||
selection_color = "#ffdddd"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 20
|
||||
exp_requirements = 420
|
||||
exp_requirements = 2000
|
||||
exp_type = EXP_TYPE_SECURITY
|
||||
exp_type_department = EXP_TYPE_SECURITY
|
||||
|
||||
@@ -87,9 +87,10 @@ Warden
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
minimal_player_age = 3
|
||||
exp_requirements = 360
|
||||
exp_type = EXP_TYPE_CREW
|
||||
minimal_player_age = 9
|
||||
exp_requirements = 720
|
||||
exp_type = EXP_TYPE_SECURITY
|
||||
exp_type_department = EXP_TYPE_SECURITY
|
||||
|
||||
outfit = /datum/outfit/job/warden
|
||||
|
||||
@@ -118,7 +119,9 @@ Warden
|
||||
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
|
||||
r_pocket = /obj/item/assembly/flash/handheld
|
||||
l_pocket = /obj/item/restraints/handcuffs
|
||||
suit_store = /obj/item/gun/energy/e_gun/advtaser
|
||||
//suit_store = /obj/item/gun/energy/e_gun/advtaser
|
||||
suit_store = /obj/item/gun/energy/pumpaction/defender
|
||||
|
||||
backpack_contents = list(/obj/item/melee/baton/loaded=1)
|
||||
|
||||
backpack = /obj/item/storage/backpack/security
|
||||
@@ -143,9 +146,10 @@ Detective
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
minimal_player_age = 2
|
||||
minimal_player_age = 5
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_type = EXP_TYPE_SECURITY
|
||||
exp_type_department = EXP_TYPE_SECURITY
|
||||
|
||||
outfit = /datum/outfit/job/detective
|
||||
|
||||
@@ -199,9 +203,10 @@ Security Officer
|
||||
spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions()
|
||||
supervisors = "the head of security, and the head of your assigned department (if applicable)"
|
||||
selection_color = "#ffeeee"
|
||||
minimal_player_age = 1
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
minimal_player_age = 5
|
||||
exp_requirements = 420
|
||||
exp_type = EXP_TYPE_SECURITY
|
||||
exp_type_department = EXP_TYPE_SECURITY
|
||||
|
||||
outfit = /datum/outfit/job/security
|
||||
|
||||
@@ -344,3 +349,141 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S
|
||||
/obj/item/radio/headset/headset_sec/alt/department/sci
|
||||
keyslot = new /obj/item/encryptionkey/headset_sec
|
||||
keyslot2 = new /obj/item/encryptionkey/headset_sci
|
||||
|
||||
|
||||
/*
|
||||
Junior Security Officer
|
||||
*/
|
||||
/datum/job/junior_officer
|
||||
title = "Rookie"
|
||||
flag = JR_OFFICER
|
||||
department_head = list("Head of Security")
|
||||
department_flag = ENGSEC
|
||||
faction = "Station"
|
||||
total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions()
|
||||
spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions()
|
||||
supervisors = "the head of security, and the head of your assigned department (if applicable), and any other senior officer"
|
||||
selection_color = "#ffeeee"
|
||||
minimal_player_age = 3
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/security/junior
|
||||
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS()
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic)
|
||||
|
||||
|
||||
/datum/job/junior_officer/get_access()
|
||||
var/list/L = list()
|
||||
L |= ..() | check_config_for_sec_maint()
|
||||
return L
|
||||
|
||||
/datum/job/junior_officer/after_spawn(mob/living/carbon/human/H, mob/M)
|
||||
// Assign department security
|
||||
var/department
|
||||
if(M && M.client && M.client.prefs)
|
||||
department = M.client.prefs.prefered_security_department
|
||||
if(!LAZYLEN(GLOB.available_depts) || department == "None")
|
||||
return
|
||||
else if(department in GLOB.available_depts)
|
||||
LAZYREMOVE(GLOB.available_depts, department)
|
||||
else
|
||||
department = pick_n_take(GLOB.available_depts)
|
||||
var/ears = null
|
||||
var/accessory = null
|
||||
var/list/dep_access = null
|
||||
var/destination = null
|
||||
var/spawn_point = locate(/obj/effect/landmark/start/security_officer) in GLOB.start_landmarks_list
|
||||
switch(department)
|
||||
if(SEC_DEPT_SUPPLY)
|
||||
ears = /obj/item/radio/headset/headset_sec/alt/department/supply
|
||||
dep_access = list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION)
|
||||
destination = /area/security/checkpoint/supply
|
||||
spawn_point = locate(/obj/effect/landmark/start/depsec/supply) in GLOB.department_security_spawns
|
||||
accessory = /obj/item/clothing/accessory/armband/cargo
|
||||
if(SEC_DEPT_ENGINEERING)
|
||||
ears = /obj/item/radio/headset/headset_sec/alt/department/engi
|
||||
dep_access = list(ACCESS_CONSTRUCTION, ACCESS_ENGINE)
|
||||
destination = /area/security/checkpoint/engineering
|
||||
spawn_point = locate(/obj/effect/landmark/start/depsec/engineering) in GLOB.department_security_spawns
|
||||
accessory = /obj/item/clothing/accessory/armband/engine
|
||||
if(SEC_DEPT_MEDICAL)
|
||||
ears = /obj/item/radio/headset/headset_sec/alt/department/med
|
||||
dep_access = list(ACCESS_MEDICAL)
|
||||
destination = /area/security/checkpoint/medical
|
||||
spawn_point = locate(/obj/effect/landmark/start/depsec/medical) in GLOB.department_security_spawns
|
||||
accessory = /obj/item/clothing/accessory/armband/medblue
|
||||
if(SEC_DEPT_SCIENCE)
|
||||
ears = /obj/item/radio/headset/headset_sec/alt/department/sci
|
||||
dep_access = list(ACCESS_RESEARCH)
|
||||
destination = /area/security/checkpoint/science
|
||||
spawn_point = locate(/obj/effect/landmark/start/depsec/science) in GLOB.department_security_spawns
|
||||
accessory = /obj/item/clothing/accessory/armband/science
|
||||
|
||||
if(accessory)
|
||||
var/obj/item/clothing/under/U = H.w_uniform
|
||||
U.attach_accessory(new accessory)
|
||||
if(ears)
|
||||
if(H.ears)
|
||||
qdel(H.ears)
|
||||
H.equip_to_slot_or_del(new ears(H),SLOT_EARS)
|
||||
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
W.access |= dep_access
|
||||
|
||||
var/teleport = 0
|
||||
if(!CONFIG_GET(flag/sec_start_brig))
|
||||
if(destination || spawn_point)
|
||||
teleport = 1
|
||||
if(teleport)
|
||||
var/turf/T
|
||||
if(spawn_point)
|
||||
T = get_turf(spawn_point)
|
||||
H.Move(T)
|
||||
else
|
||||
var/safety = 0
|
||||
while(safety < 25)
|
||||
T = safepick(get_area_turfs(destination))
|
||||
if(T && !H.Move(T))
|
||||
safety += 1
|
||||
continue
|
||||
else
|
||||
break
|
||||
if(department)
|
||||
to_chat(M, "<b>You have been assigned to [department]!</b>")
|
||||
else
|
||||
to_chat(M, "<b>You have not been assigned to any department. Patrol the halls and help where needed.</b>")
|
||||
|
||||
|
||||
|
||||
/datum/outfit/job/security/junior
|
||||
name = "Security Officer"
|
||||
jobtype = /datum/job/officer
|
||||
|
||||
belt = /obj/item/pda/security
|
||||
ears = /obj/item/radio/headset/headset_sec/alt
|
||||
uniform = /obj/item/clothing/under/rank/security
|
||||
gloves = /obj/item/clothing/gloves/color/black
|
||||
head = /obj/item/clothing/head/helmet/sec
|
||||
suit = /obj/item/clothing/suit/armor/vest/alt
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
l_pocket = /obj/item/restraints/handcuffs
|
||||
r_pocket = /obj/item/assembly/flash/handheld
|
||||
suit_store = /obj/item/gun/energy/e_gun/advtaser
|
||||
backpack_contents = list(/obj/item/melee/baton/loaded=1)
|
||||
|
||||
backpack = /obj/item/storage/backpack/security
|
||||
satchel = /obj/item/storage/backpack/satchel/sec
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/sec
|
||||
box = /obj/item/storage/box/security
|
||||
|
||||
implants = list(/obj/item/implant/mindshield)
|
||||
|
||||
chameleon_extras = list(/obj/item/gun/energy/e_gun/advtaser, /obj/item/clothing/glasses/hud/security/sunglasses, /obj/item/clothing/head/helmet)
|
||||
//The helmet is necessary because /obj/item/clothing/head/helmet/sec is overwritten in the chameleon list by the standard helmet, which has the same name and icon state
|
||||
|
||||
|
||||
|
||||
@@ -11,10 +11,10 @@ AI
|
||||
selection_color = "#ccffcc"
|
||||
supervisors = "your laws"
|
||||
req_admin_notify = TRUE
|
||||
minimal_player_age = 5
|
||||
exp_requirements = 1200
|
||||
exp_type = EXP_TYPE_CREW
|
||||
// exp_type_department = EXP_TYPE_SILICON
|
||||
minimal_player_age = 14
|
||||
exp_requirements = 1800
|
||||
//exp_type = EXP_TYPE_CREW
|
||||
exp_type_department = EXP_TYPE_SILICON
|
||||
var/do_special_check = TRUE
|
||||
|
||||
/datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, outfit_override)
|
||||
@@ -78,9 +78,9 @@ Cyborg
|
||||
spawn_positions = 1
|
||||
supervisors = "your laws and the AI" //Nodrak
|
||||
selection_color = "#ddffdd"
|
||||
// minimal_player_age = 0
|
||||
// exp_requirements = 120
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
minimal_player_age = 0
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
/datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, outfit_override = null)
|
||||
return H.Robotize(FALSE, latejoin)
|
||||
|
||||
@@ -10,7 +10,8 @@ GLOBAL_LIST_INIT(command_positions, list(
|
||||
GLOBAL_LIST_INIT(engineering_positions, list(
|
||||
"Chief Engineer",
|
||||
"Station Engineer",
|
||||
"Atmospheric Technician"))
|
||||
"Atmospheric Technician",
|
||||
"Engineering Intern"))
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(medical_positions, list(
|
||||
@@ -18,13 +19,15 @@ GLOBAL_LIST_INIT(medical_positions, list(
|
||||
"Medical Doctor",
|
||||
"Geneticist",
|
||||
"Virologist",
|
||||
"Chemist"))
|
||||
"Chemist",
|
||||
"Medical Resident"))
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(science_positions, list(
|
||||
"Research Director",
|
||||
"Scientist",
|
||||
"Roboticist"))
|
||||
"Roboticist",
|
||||
"Research Student"))
|
||||
|
||||
GLOBAL_LIST_INIT(supply_positions, list(
|
||||
"Quartermaster",
|
||||
@@ -48,7 +51,8 @@ GLOBAL_LIST_INIT(security_positions, list(
|
||||
"Head of Security",
|
||||
"Warden",
|
||||
"Detective",
|
||||
"Security Officer"))
|
||||
"Security Officer",
|
||||
"Rookie"))
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(nonhuman_positions, list(
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
resist()
|
||||
return
|
||||
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
//Yes, they can only be rectangular.
|
||||
//Yes, I'm sorry.
|
||||
/datum/turf_reservation
|
||||
|
||||
@@ -31,5 +31,8 @@
|
||||
loc = destination
|
||||
Moved(oldloc, NONE, TRUE)
|
||||
|
||||
/mob/camera/canUseStorage()
|
||||
return FALSE
|
||||
|
||||
/mob/camera/emote(act, m_type=1, message = null, intentional = FALSE)
|
||||
return
|
||||
|
||||
@@ -21,6 +21,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
|
||||
set_focus(src)
|
||||
return INITIALIZE_HINT_NORMAL
|
||||
|
||||
/mob/dead/canUseStorage()
|
||||
return FALSE
|
||||
|
||||
/mob/dead/dust(just_ash, drop_items, force) //ghosts can't be vaporised.
|
||||
return
|
||||
|
||||
|
||||
@@ -945,7 +945,7 @@
|
||||
/mob/living/carbon/proc/update_disabled_bodyparts()
|
||||
for(var/B in bodyparts)
|
||||
var/obj/item/bodypart/BP = B
|
||||
BP.update_disabled()
|
||||
BP.update_disabled(silent)
|
||||
|
||||
/mob/living/carbon/vv_get_dropdown()
|
||||
. = ..()
|
||||
|
||||
@@ -85,6 +85,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
var/icon_limbs //Overrides the icon used for the limbs of this species. Mainly for downstream, and also because hardcoded icons disgust me. Implemented and maintained as a favor in return for a downstream's implementation of synths.
|
||||
|
||||
/// Our default override for typing indicator state
|
||||
var/typing_indicator_state
|
||||
|
||||
///////////
|
||||
// PROCS //
|
||||
///////////
|
||||
@@ -1302,6 +1305,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
radiation = 0
|
||||
return TRUE
|
||||
|
||||
if(HAS_TRAIT(H, TRAIT_RADRESONANCE))
|
||||
//Don't do anything.
|
||||
return TRUE
|
||||
|
||||
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
|
||||
if(!H.IsKnockdown())
|
||||
H.emote("collapse")
|
||||
@@ -1780,6 +1787,130 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
H.forcesay(GLOB.hit_appends) //forcesay checks stat already.
|
||||
return TRUE
|
||||
|
||||
/datum/species/proc/alt_spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
|
||||
if(!istype(M))
|
||||
return TRUE
|
||||
CHECK_DNA_AND_SPECIES(M)
|
||||
CHECK_DNA_AND_SPECIES(H)
|
||||
|
||||
if(!istype(M)) //sanity check for drones.
|
||||
return TRUE
|
||||
if(M.mind)
|
||||
attacker_style = M.mind.martial_art
|
||||
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK))
|
||||
log_combat(M, H, "attempted to touch")
|
||||
H.visible_message("<span class='warning'>[M] attempted to touch [H]!</span>")
|
||||
return TRUE
|
||||
switch(M.a_intent)
|
||||
if(INTENT_HELP)
|
||||
if(M == H)
|
||||
althelp(M, H, attacker_style)
|
||||
return TRUE
|
||||
return FALSE
|
||||
if(INTENT_DISARM)
|
||||
altdisarm(M, H, attacker_style)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/species/proc/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(user == target && istype(user))
|
||||
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
|
||||
to_chat(user, "<span class='warning'>You're too exhausted for that.</span>")
|
||||
return
|
||||
if(!user.resting)
|
||||
to_chat(user, "<span class='notice'>You can only force yourself up if you're on the ground.</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] forces [p_them()]self up to [p_their()] feet!</span>", "<span class='notice'>You force yourself up to your feet!</span>")
|
||||
user.resting = 0
|
||||
user.update_canmove()
|
||||
user.adjustStaminaLossBuffered(user.stambuffer) //Rewards good stamina management by making it easier to instantly get up from resting
|
||||
playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
|
||||
/datum/species/proc/altdisarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
|
||||
to_chat(user, "<span class='warning'>You're too exhausted.</span>")
|
||||
return FALSE
|
||||
if(target.check_block())
|
||||
target.visible_message("<span class='warning'>[target] blocks [user]'s shoving attempt!</span>")
|
||||
return FALSE
|
||||
if(attacker_style && attacker_style.disarm_act(user,target))
|
||||
return TRUE
|
||||
if(user.resting)
|
||||
return FALSE
|
||||
else
|
||||
if(user == target)
|
||||
return
|
||||
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
|
||||
user.adjustStaminaLossBuffered(4)
|
||||
playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
|
||||
|
||||
if(target.w_uniform)
|
||||
target.w_uniform.add_fingerprint(user)
|
||||
SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected)
|
||||
|
||||
if(!target.resting)
|
||||
target.adjustStaminaLoss(5)
|
||||
|
||||
if(target.is_shove_knockdown_blocked())
|
||||
return
|
||||
|
||||
var/turf/target_oldturf = target.loc
|
||||
var/shove_dir = get_dir(user.loc, target_oldturf)
|
||||
var/turf/target_shove_turf = get_step(target.loc, shove_dir)
|
||||
var/mob/living/carbon/human/target_collateral_human
|
||||
var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied
|
||||
|
||||
//Thank you based whoneedsspace
|
||||
target_collateral_human = locate(/mob/living/carbon/human) in target_shove_turf.contents
|
||||
if(target_collateral_human && target_collateral_human.resting)
|
||||
shove_blocked = TRUE
|
||||
else
|
||||
target_collateral_human = null
|
||||
target.Move(target_shove_turf, shove_dir)
|
||||
if(get_turf(target) == target_oldturf)
|
||||
shove_blocked = TRUE
|
||||
|
||||
if(shove_blocked && !target.buckled)
|
||||
var/directional_blocked = !target.Adjacent(target_shove_turf)
|
||||
var/targetatrest = target.resting
|
||||
if((directional_blocked || (!target_collateral_human && !target_shove_turf.shove_act(target, user))) && !targetatrest)
|
||||
target.Knockdown(SHOVE_KNOCKDOWN_SOLID)
|
||||
user.visible_message("<span class='danger'>[user.name] shoves [target.name], knocking them down!</span>",
|
||||
"<span class='danger'>You shove [target.name], knocking them down!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
log_combat(user, target, "shoved", "knocking them down")
|
||||
else if(target_collateral_human && !targetatrest)
|
||||
target.Knockdown(SHOVE_KNOCKDOWN_HUMAN)
|
||||
target_collateral_human.Knockdown(SHOVE_KNOCKDOWN_COLLATERAL)
|
||||
user.visible_message("<span class='danger'>[user.name] shoves [target.name] into [target_collateral_human.name]!</span>",
|
||||
"<span class='danger'>You shove [target.name] into [target_collateral_human.name]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
log_combat(user, target, "shoved", "into [target_collateral_human.name]")
|
||||
|
||||
else
|
||||
user.visible_message("<span class='danger'>[user.name] shoves [target.name]!</span>",
|
||||
"<span class='danger'>You shove [target.name]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
var/target_held_item = target.get_active_held_item()
|
||||
var/knocked_item = FALSE
|
||||
if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types))
|
||||
target_held_item = null
|
||||
if(!target.has_movespeed_modifier(SHOVE_SLOWDOWN_ID))
|
||||
target.add_movespeed_modifier(SHOVE_SLOWDOWN_ID, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH)
|
||||
if(target_held_item)
|
||||
target.visible_message("<span class='danger'>[target.name]'s grip on \the [target_held_item] loosens!</span>",
|
||||
"<span class='danger'>Your grip on \the [target_held_item] loosens!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
addtimer(CALLBACK(target, /mob/living/carbon/human/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
|
||||
else if(target_held_item)
|
||||
target.dropItemToGround(target_held_item)
|
||||
knocked_item = TRUE
|
||||
target.visible_message("<span class='danger'>[target.name] drops \the [target_held_item]!!</span>",
|
||||
"<span class='danger'>You drop \the [target_held_item]!!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
var/append_message = ""
|
||||
if(target_held_item)
|
||||
if(knocked_item)
|
||||
append_message = "causing them to drop [target_held_item]"
|
||||
else
|
||||
append_message = "loosening their grip on [target_held_item]"
|
||||
log_combat(user, target, "shoved", append_message)
|
||||
|
||||
/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H)
|
||||
var/hit_percent = (100-(blocked+armor))/100
|
||||
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/mob/living/carbon/human/get_typing_indicator_icon_state()
|
||||
return dna?.species?.typing_indicator_state || ..()
|
||||
@@ -117,7 +117,7 @@
|
||||
if(pickupTarget)
|
||||
if(restrained() || blacklistItems[pickupTarget] || HAS_TRAIT(pickupTarget, TRAIT_NODROP))
|
||||
pickupTarget = null
|
||||
else
|
||||
else if(!isobj(loc) || istype(loc, /obj/item/clothing/head/mob_holder))
|
||||
pickupTimer++
|
||||
if(pickupTimer >= 4)
|
||||
blacklistItems[pickupTarget] ++
|
||||
@@ -132,10 +132,8 @@
|
||||
pickupTarget = null
|
||||
pickupTimer = 0
|
||||
else if(ismob(pickupTarget.loc)) // in someones hand
|
||||
if(istype(pickupTarget, /obj/item/clothing/head/mob_holder/))
|
||||
var/obj/item/clothing/head/mob_holder/h = pickupTarget
|
||||
if(h && h.held_mob==src)
|
||||
return//dont let them pickpocket themselves
|
||||
if(istype(pickupTarget, /obj/item/clothing/head/mob_holder))
|
||||
return//dont let them pickpocket themselves or hold other monkys.
|
||||
var/mob/M = pickupTarget.loc
|
||||
if(!pickpocketing)
|
||||
pickpocketing = TRUE
|
||||
|
||||
@@ -373,6 +373,11 @@
|
||||
if(stat || IsUnconscious() || IsStun() || IsKnockdown() || recoveringstam || (!ignore_restraints && restrained(ignore_grab))) // CIT CHANGE - adds recoveringstam check here
|
||||
return TRUE
|
||||
|
||||
/mob/living/canUseStorage()
|
||||
if (get_num_arms() <= 0)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/InCritical()
|
||||
return (health <= crit_threshold && (stat == SOFT_CRIT || stat == UNCONSCIOUS))
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD)
|
||||
pressure_resistance = 10
|
||||
|
||||
typing_indicator_enabled = TRUE
|
||||
|
||||
var/resize = 1 //Badminnery resize
|
||||
var/lastattacker = null
|
||||
var/lastattackerckey = null
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/mob/living/Moved()
|
||||
. = ..()
|
||||
update_turf_movespeed(loc)
|
||||
//Hide typing indicator if we move.
|
||||
clear_typing_indicator()
|
||||
if(is_shifted)
|
||||
is_shifted = FALSE
|
||||
pixel_x = get_standard_pixel_x_offset(lying)
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
/mob/living/silicon/proc/post_lawchange(announce = TRUE)
|
||||
throw_alert("newlaw", /obj/screen/alert/newlaw)
|
||||
if(announce && last_lawchange_announce != world.time)
|
||||
to_chat(src, "<b>Your laws have been changed.</b>")
|
||||
to_chat(src, "<span class='big bold'><font color = red>Your laws have been changed.</font color></span>")
|
||||
SEND_SOUND(src, 'hyperstation/sound/misc/ai_laws_update.ogg')
|
||||
addtimer(CALLBACK(src, .proc/show_laws), 0)
|
||||
last_lawchange_announce = world.time
|
||||
|
||||
|
||||
@@ -113,30 +113,26 @@
|
||||
icon_dead = "original_dead"
|
||||
//Read_Memory()
|
||||
. = ..()
|
||||
|
||||
/*
|
||||
/mob/living/simple_animal/pet/cat/Runtime/Life()
|
||||
/*
|
||||
if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP)
|
||||
Deploy_The_Cats()
|
||||
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
|
||||
Write_Memory()
|
||||
memory_saved = TRUE
|
||||
*/
|
||||
..()
|
||||
|
||||
*/
|
||||
/mob/living/simple_animal/pet/cat/Runtime/make_babies()
|
||||
var/mob/baby = ..()
|
||||
if(baby)
|
||||
children += baby
|
||||
return baby
|
||||
|
||||
/mob/living/simple_animal/pet/cat/Runtime/death()
|
||||
/*
|
||||
/mob/living/simple_animal/pet/cat/Runtime/death()
|
||||
if(!memory_saved)
|
||||
Write_Memory(TRUE)
|
||||
..()
|
||||
*/
|
||||
|
||||
/mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory()
|
||||
if(fexists("data/npc_saves/Runtime.sav")) //legacy compatability to convert old format to new
|
||||
var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
|
||||
|
||||
@@ -130,8 +130,11 @@
|
||||
/mob/living/simple_animal/hostile/proc/ListTargets()//Step 1, find out what we can see
|
||||
if(!search_objects)
|
||||
. = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
|
||||
|
||||
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
|
||||
var/static/hostile_machines
|
||||
if(istype(src, /mob/living/simple_animal/hostile/megafauna)) //If we are a megafauna, don't attack turrets as they're hard coded to not shoot us.
|
||||
hostile_machines = typecacheof(list(/obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
|
||||
else
|
||||
hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
|
||||
|
||||
for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines))
|
||||
if(can_see(targets_from, HM, vision_range))
|
||||
|
||||
@@ -260,7 +260,7 @@
|
||||
visible_message("<span class='danger'>[M] pulls [src] off!</span>")
|
||||
return
|
||||
attacked += 5
|
||||
if(nutrition >= 100) //steal some nutrition. negval handled in life()
|
||||
if(nutrition >= 100 && !istype(src, /mob/living/simple_animal/slime)) //steal some nutrition. negval handled in life()
|
||||
nutrition -= (50 + (40 * M.is_adult))
|
||||
M.add_nutrition(50 + (40 * M.is_adult))
|
||||
if(health > 0)
|
||||
|
||||
@@ -830,6 +830,9 @@
|
||||
/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
return
|
||||
|
||||
/mob/proc/canUseStorage()
|
||||
return FALSE
|
||||
|
||||
/mob/proc/faction_check_mob(mob/target, exact_match)
|
||||
if(exact_match) //if we need an exact match, we need to do some bullfuckery.
|
||||
var/list/faction_src = faction.Copy()
|
||||
|
||||
@@ -126,4 +126,17 @@
|
||||
|
||||
|
||||
///Whether the mob is updating glide size when movespeed updates or not
|
||||
var/updating_glide_size = TRUE
|
||||
var/updating_glide_size = TRUE
|
||||
|
||||
var/flavor_text = ""
|
||||
var/flavor_text_2 = "" //version of the above that only lasts for the current round.
|
||||
|
||||
///////TYPING INDICATORS///////
|
||||
/// Set to true if we want to show typing indicators.
|
||||
var/typing_indicator_enabled = FALSE
|
||||
/// Default icon_state of our typing indicator. Currently only supports paths (because anything else is, as of time of typing this, unnecesary.
|
||||
var/typing_indicator_state = /obj/effect/overlay/typing_indicator
|
||||
/// The timer that will remove our indicator for early aborts (like when an user finishes their message)
|
||||
var/typing_indicator_timerid
|
||||
/// Current state of our typing indicator. Used for cut overlay, DO NOT RUNTIME ASSIGN OTHER THAN FROM SHOW/CLEAR. Used to absolutely ensure we do not get stuck overlays.
|
||||
var/mutable_appearance/typing_indicator_current
|
||||
|
||||
+47
-16
@@ -1,17 +1,60 @@
|
||||
//Speech verbs.
|
||||
/mob/verb/say_verb(message as text)
|
||||
set name = "Say"
|
||||
// the _keybind verbs uses "as text" versus "as text|null" to force a popup when pressed by a keybind.
|
||||
/mob/verb/say_typing_indicator()
|
||||
set name = "say_indicator"
|
||||
set hidden = TRUE
|
||||
set category = "IC"
|
||||
display_typing_indicator()
|
||||
var/message = input(usr, "", "say") as text|null
|
||||
// If they don't type anything just drop the message.
|
||||
clear_typing_indicator() // clear it immediately!
|
||||
if(!length(message))
|
||||
return
|
||||
return say_verb(message)
|
||||
|
||||
/mob/verb/say_verb(message as text)
|
||||
set name = "say"
|
||||
set category = "IC"
|
||||
if(!length(message))
|
||||
return
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
if(message)
|
||||
say(message)
|
||||
clear_typing_indicator() // clear it immediately!
|
||||
say(message)
|
||||
|
||||
/mob/verb/me_typing_indicator()
|
||||
set name = "me_indicator"
|
||||
set hidden = TRUE
|
||||
set category = "IC"
|
||||
display_typing_indicator()
|
||||
var/message = input(usr, "", "me") as message|null
|
||||
// If they don't type anything just drop the message.
|
||||
clear_typing_indicator() // clear it immediately!
|
||||
if(!length(message))
|
||||
return
|
||||
return me_verb(message)
|
||||
|
||||
/mob/verb/me_verb(message as message)
|
||||
set name = "me"
|
||||
set category = "IC"
|
||||
if(!length(message))
|
||||
return
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
|
||||
message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
clear_typing_indicator() // clear it immediately!
|
||||
|
||||
usr.emote("me",1,message,TRUE)
|
||||
|
||||
|
||||
/mob/verb/whisper_verb(message as text)
|
||||
set name = "Whisper"
|
||||
set category = "IC"
|
||||
if(!length(message))
|
||||
return
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
@@ -20,18 +63,6 @@
|
||||
/mob/proc/whisper(message, datum/language/language=null)
|
||||
say(message, language) //only living mobs actually whisper, everything else just talks
|
||||
|
||||
/mob/verb/me_verb(message as message)
|
||||
set name = "Me"
|
||||
set category = "IC"
|
||||
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
|
||||
usr.emote("me",1,message,TRUE)
|
||||
|
||||
/mob/proc/say_dead(var/message)
|
||||
var/name = real_name
|
||||
var/alt_name = ""
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user