Merge branch 'master' into Pizza
This commit is contained in:
@@ -97,6 +97,7 @@
|
||||
#define NO_DNA_COPY 14
|
||||
#define DRINKSBLOOD 15
|
||||
#define NOEYES 16
|
||||
#define MARKINGS 17
|
||||
|
||||
#define ORGAN_SLOT_BRAIN "brain"
|
||||
#define ORGAN_SLOT_APPENDIX "appendix"
|
||||
|
||||
@@ -7,4 +7,7 @@
|
||||
#define TICK_USAGE_REAL world.tick_usage //to be used where the result isn't checked
|
||||
|
||||
#define TICK_CHECK ( TICK_USAGE > Master.current_ticklimit )
|
||||
#define CHECK_TICK if TICK_CHECK stoplag()
|
||||
#define CHECK_TICK ( TICK_CHECK ? stoplag() : 0 )
|
||||
|
||||
#define TICK_CHECK_HIGH_PRIORITY ( TICK_USAGE > 95 )
|
||||
#define CHECK_TICK_HIGH_PRIORITY ( TICK_CHECK_HIGH_PRIORITY? stoplag() : 0 )
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
#define R_DEFAULT R_AUTOLOGIN
|
||||
|
||||
#define R_EVERYTHING (1<<15)-1 //the sum of all other rank permissions, used for +EVERYTHING
|
||||
#define R_EVERYTHING ALL //the sum of all other rank permissions, used for +EVERYTHING
|
||||
|
||||
#define ADMIN_QUE(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];adminmoreinfo=[REF(user)]'>?</a>)"
|
||||
#define ADMIN_FLW(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];adminplayerobservefollow=[REF(user)]'>FLW</a>)"
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
#define MUTCOLORS3 36
|
||||
#define NOAROUSAL 37 //Stops all arousal effects
|
||||
#define NOGENITALS 38 //Cannot create, use, or otherwise have genitals
|
||||
#define MATRIXED 39 //if icon is color matrix'd
|
||||
|
||||
//Citadel istypes
|
||||
#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
|
||||
|
||||
@@ -97,6 +97,20 @@
|
||||
//the define for visible message range in combat
|
||||
#define COMBAT_MESSAGE_RANGE 3
|
||||
|
||||
//Shove knockdown lengths (deciseconds)
|
||||
#define SHOVE_KNOCKDOWN_SOLID 30
|
||||
#define SHOVE_KNOCKDOWN_HUMAN 30
|
||||
#define SHOVE_KNOCKDOWN_TABLE 30
|
||||
#define SHOVE_KNOCKDOWN_COLLATERAL 10
|
||||
//Shove slowdown
|
||||
#define SHOVE_SLOWDOWN_ID "shove_slowdown"
|
||||
#define SHOVE_SLOWDOWN_LENGTH 30
|
||||
#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier
|
||||
//Shove disarming item list
|
||||
GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
|
||||
/obj/item/gun)))
|
||||
|
||||
|
||||
//Combat object defines
|
||||
|
||||
//Embedded objects
|
||||
@@ -118,6 +132,10 @@
|
||||
#define TRIGGER_GUARD_ALLOW_ALL -1
|
||||
#define TRIGGER_GUARD_NONE 0
|
||||
#define TRIGGER_GUARD_NORMAL 1
|
||||
//E-gun self-recharge values
|
||||
#define EGUN_NO_SELFCHARGE 0
|
||||
#define EGUN_SELFCHARGE 1
|
||||
#define EGUN_SELFCHARGE_BORG 2
|
||||
|
||||
//Object/Item sharpness
|
||||
#define IS_BLUNT 0
|
||||
|
||||
@@ -4,6 +4,11 @@
|
||||
#define ALL (~0) //For convenience.
|
||||
#define NONE 0
|
||||
|
||||
//for convenience
|
||||
#define ENABLE_BITFIELD(variable, flag) (variable |= (flag))
|
||||
#define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag))
|
||||
#define CHECK_BITFIELD(variable, flag) (variable & flag)
|
||||
|
||||
GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768))
|
||||
|
||||
// for /datum/var/datum_flags
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250)
|
||||
|
||||
#define LIGHT_COLOR_BLUEGREEN "#7DE1AF" //Light blueish green. rgb(125, 225, 175)
|
||||
#define LIGHT_COLOR_PALEBLUE "#7DAFE1" //A pale blue-ish color. rgb(125, 175, 225)
|
||||
#define LIGHT_COLOR_CYAN "#7DE1E1" //Diluted cyan. rgb(125, 225, 225)
|
||||
#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF" //More-saturated cyan. rgb(64, 206, 255)
|
||||
#define LIGHT_COLOR_DARK_BLUE "#6496FA" //Saturated blue. rgb(51, 117, 248)
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
#define ISINRANGE(val, min, max) (min <= val && val <= max)
|
||||
|
||||
// Same as above, exclusive.
|
||||
#define ISINRANGE_EX(val, min, max) (min < val && val > max)
|
||||
#define ISINRANGE_EX(val, min, max) (min < val && val < max)
|
||||
|
||||
#define ISINTEGER(x) (round(x) == x)
|
||||
|
||||
|
||||
@@ -51,10 +51,11 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
|
||||
|
||||
//Human Overlays Indexes/////////
|
||||
//LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS
|
||||
#define MUTATIONS_LAYER 30 //mutations. Tk headglows, cold resistance glow, etc
|
||||
#define GENITALS_BEHIND_LAYER 29 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer
|
||||
#define BODY_BEHIND_LAYER 28 //certain mutantrace features (tail when looking south) that must appear behind the body parts
|
||||
#define BODYPARTS_LAYER 27 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
|
||||
#define MUTATIONS_LAYER 31 //mutations. Tk headglows, cold resistance glow, etc
|
||||
#define GENITALS_BEHIND_LAYER 30 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer
|
||||
#define BODY_BEHIND_LAYER 29 //certain mutantrace features (tail when looking south) that must appear behind the body parts
|
||||
#define BODYPARTS_LAYER 28 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
|
||||
#define MARKING_LAYER 27 //Matrixed body markings because clashing with snouts?
|
||||
#define BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts
|
||||
#define GENITALS_ADJ_LAYER 25
|
||||
#define BODY_LAYER 24 //underwear, undershirts, socks, eyes, lips(makeup)
|
||||
@@ -82,7 +83,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
|
||||
#define HANDS_LAYER 3
|
||||
#define BODY_FRONT_LAYER 2
|
||||
#define FIRE_LAYER 1 //If you're on fire
|
||||
#define TOTAL_LAYERS 30 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
|
||||
#define TOTAL_LAYERS 31 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
|
||||
|
||||
//Human Overlay Index Shortcuts for alternate_worn_layer, layers
|
||||
//Because I *KNOW* somebody will think layer+1 means "above"
|
||||
@@ -98,8 +99,9 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
|
||||
//Security levels
|
||||
#define SEC_LEVEL_GREEN 0
|
||||
#define SEC_LEVEL_BLUE 1
|
||||
#define SEC_LEVEL_RED 2
|
||||
#define SEC_LEVEL_DELTA 3
|
||||
#define SEC_LEVEL_AMBER 2
|
||||
#define SEC_LEVEL_RED 3
|
||||
#define SEC_LEVEL_DELTA 4
|
||||
|
||||
//some arbitrary defines to be used by self-pruning global lists. (see master_controller)
|
||||
#define PROCESS_KILL 26 //Used to trigger removal from a processing list
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
|
||||
#define NODROP (1<<8) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
|
||||
#define ABSTRACT (1<<9) // for all things that are technically items but used for various different stuff
|
||||
#define IMMUTABLE_SLOW (1<<10) //When players should not be able to change the slowdown of the item (Speed potions, ect)
|
||||
|
||||
// Flags for the clothing_flags var on /obj/item/clothing
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
#define LINGHIVE_LINK 3
|
||||
|
||||
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
|
||||
#define MAX_MESSAGE_LEN 1024
|
||||
#define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen?
|
||||
#define MAX_NAME_LEN 42
|
||||
#define MAX_BROADCAST_LEN 512
|
||||
#define MAX_CHARTER_LEN 80
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#define TRANSIT_REQUEST 1
|
||||
#define TRANSIT_READY 2
|
||||
|
||||
#define SHUTTLE_TRANSIT_BORDER 8
|
||||
#define SHUTTLE_TRANSIT_BORDER 10
|
||||
|
||||
#define PARALLAX_LOOP_TIME 25
|
||||
#define HYPERSPACE_END_TIME 5
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
|
||||
#define TRAIT_NIGHT_VISION "night_vision"
|
||||
#define TRAIT_LIGHT_STEP "light_step"
|
||||
#define TRAIT_SPEEDY_STEP "speedy_step"
|
||||
#define TRAIT_SPIRITUAL "spiritual"
|
||||
#define TRAIT_VORACIOUS "voracious"
|
||||
#define TRAIT_SELF_AWARE "self_aware"
|
||||
@@ -90,4 +91,4 @@
|
||||
#define STASIS_MUTE "stasis"
|
||||
#define GENETICS_SPELL "genetics_spell"
|
||||
#define EYES_COVERED "eyes_covered"
|
||||
#define CULT_EYES "cult_eyes"
|
||||
#define CULT_EYES "cult_eyes"
|
||||
|
||||
@@ -37,6 +37,7 @@ GLOBAL_LIST_EMPTY(mam_ears_list)
|
||||
GLOBAL_LIST_EMPTY(mam_tails_list)
|
||||
GLOBAL_LIST_EMPTY(mam_tails_animated_list)
|
||||
GLOBAL_LIST_EMPTY(taur_list)
|
||||
GLOBAL_LIST_EMPTY(mam_snouts_list)
|
||||
|
||||
//Exotic Species
|
||||
GLOBAL_LIST_EMPTY(exotic_tails_list)
|
||||
@@ -242,7 +243,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
|
||||
if("Wolf")
|
||||
hdna.features["mam_tail"] = "Wolf"
|
||||
hdna.features["mam_ears"] = "Wolf"
|
||||
hdna.features["snout"] = "Wolf"
|
||||
hdna.features["mam_snouts"] = "Wolf"
|
||||
hdna.features["mam_body_markings"] = "Wolf"
|
||||
hdna.features["mcolor"] = "555"
|
||||
hdna.features["mcolor2"] = "999"
|
||||
@@ -250,7 +251,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
|
||||
if("Fox")
|
||||
hdna.features["mam_tail"] = "Fox"
|
||||
hdna.features["mam_ears"] = "Fox"
|
||||
hdna.features["snout"] = "Fox, Long"
|
||||
hdna.features["mam_snouts"] = "Fox, Long"
|
||||
hdna.features["mam_body_markings"] = "Fox"
|
||||
hdna.features["mcolor"] = "f60"
|
||||
hdna.features["mcolor2"] = "fff"
|
||||
@@ -258,6 +259,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
|
||||
if("Fennec")
|
||||
hdna.features["mam_tail"] = "Fennec"
|
||||
hdna.features["mam_ears"] = "Fennec"
|
||||
hdna.features["snout"] = "Fox, Short"
|
||||
hdna.features["mam_snouts"] = "Fox, Short"
|
||||
hdna.features["mam_body_markings"] = "Fox"
|
||||
H.regenerate_icons()
|
||||
|
||||
@@ -511,6 +511,13 @@
|
||||
var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
|
||||
announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common
|
||||
|
||||
/proc/GetHexColors(const/hexa)
|
||||
return list(
|
||||
GetRedPart(hexa)/ 255,
|
||||
GetGreenPart(hexa)/ 255,
|
||||
GetBluePart(hexa)/ 255
|
||||
)
|
||||
|
||||
/proc/GetRedPart(const/hexa)
|
||||
return hex2num(copytext(hexa, 2, 4))
|
||||
|
||||
|
||||
@@ -37,13 +37,9 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails_animated, GLOB.mam_tails_animated_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list)
|
||||
//avian bodyparts (i swear this isn't starbound)
|
||||
// init_sprite_accessory_subtypes(/datum/sprite_accessory/beaks/avian, GLOB.avian_beaks_list)
|
||||
// init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/avian, GLOB.avian_tails_list)
|
||||
// init_sprite_accessory_subtypes(/datum/sprite_accessory/avian_wings, GLOB.avian_wings_list)
|
||||
// init_sprite_accessory_subtypes(/datum/sprite_accessory/avian_open_wings, GLOB.avian_open_wings_list)
|
||||
//xeno parts (hiss?)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_head, GLOB.xeno_head_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_tail, GLOB.xeno_tail_list)
|
||||
|
||||
+18
-2
@@ -712,7 +712,19 @@ world
|
||||
var/static/icon/flat_template = icon('icons/effects/effects.dmi', "nothing")
|
||||
|
||||
#define BLANK icon(flat_template)
|
||||
#define SET_SELF(SETVAR) var/icon/SELF_ICON=icon(icon(curicon, curstate, base_icon_dir),"",SOUTH,no_anim?1:null);if(A.alpha<255)SELF_ICON.Blend(rgb(255,255,255,A.alpha),ICON_MULTIPLY);if(A.color)SELF_ICON.Blend(A.color,ICON_MULTIPLY);;##SETVAR=SELF_ICON;
|
||||
#define SET_SELF(SETVAR) do { \
|
||||
var/icon/SELF_ICON=icon(icon(curicon, curstate, base_icon_dir),"",SOUTH,no_anim?1:null); \
|
||||
if(A.alpha<255) { \
|
||||
SELF_ICON.Blend(rgb(255,255,255,A.alpha),ICON_MULTIPLY);\
|
||||
} \
|
||||
if(A.color) { \
|
||||
if(islist(A.color)){ \
|
||||
SELF_ICON.MapColors(arglist(A.color))} \
|
||||
else{ \
|
||||
SELF_ICON.Blend(A.color,ICON_MULTIPLY)} \
|
||||
} \
|
||||
##SETVAR=SELF_ICON;\
|
||||
} while (0)
|
||||
|
||||
#define INDEX_X_LOW 1
|
||||
#define INDEX_X_HIGH 2
|
||||
@@ -860,7 +872,11 @@ world
|
||||
flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1)
|
||||
|
||||
if(A.color)
|
||||
flat.Blend(A.color, ICON_MULTIPLY)
|
||||
if(islist(A.color))
|
||||
flat.MapColors(arglist(A.color))
|
||||
else
|
||||
flat.Blend(A.color, ICON_MULTIPLY)
|
||||
|
||||
if(A.alpha < 255)
|
||||
flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY)
|
||||
|
||||
|
||||
@@ -91,6 +91,8 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
|
||||
if(!GLOB.mam_ears_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list)
|
||||
if(!GLOB.mam_snouts_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list)
|
||||
|
||||
// if(ishuman(src))
|
||||
// var/mob/living/carbon/human/H = src
|
||||
@@ -113,11 +115,11 @@
|
||||
"mcolor2" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
|
||||
"mcolor3" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
|
||||
"tail_lizard" = pick(GLOB.tails_list_lizard),
|
||||
"tail_human" = "None",
|
||||
"tail_human" = pick(GLOB.tails_list_human),
|
||||
"wings" = "None",
|
||||
"snout" = pick(GLOB.snouts_list),
|
||||
"horns" = pick(GLOB.horns_list),
|
||||
"ears" = "None",
|
||||
"ears" = pick(GLOB.ears_list),
|
||||
"frills" = pick(GLOB.frills_list),
|
||||
"spines" = pick(GLOB.spines_list),
|
||||
"body_markings" = pick(GLOB.body_markings_list),
|
||||
@@ -127,6 +129,7 @@
|
||||
"taur" = "None",
|
||||
"mam_body_markings" = pick(GLOB.mam_body_markings_list),
|
||||
"mam_ears" = pick(GLOB.mam_ears_list),
|
||||
"mam_snouts" = pick(GLOB.mam_snouts_list),
|
||||
"mam_tail" = pick(GLOB.mam_tails_list),
|
||||
"mam_tail_animated" = "None",
|
||||
"xenodorsal" = "Standard",
|
||||
|
||||
@@ -192,7 +192,9 @@
|
||||
//Set news report and mode result
|
||||
mode.set_round_result()
|
||||
|
||||
send2irc("Server", "Round just ended.")
|
||||
var/survival_rate = GLOB.joined_player_list.len ? "[PERCENT(popcount[POPCOUNT_SURVIVORS]/GLOB.joined_player_list.len)]%" : "there's literally no player"
|
||||
|
||||
send2irc("Server", "A round of [mode.name] just ended[mode_result == "undefined" ? "." : " with a [mode_result]."] Survival rate: [survival_rate]")
|
||||
|
||||
if(length(CONFIG_GET(keyed_list/cross_server)))
|
||||
send_news_report()
|
||||
@@ -583,4 +585,4 @@
|
||||
qdel(query_update_everything_ranks)
|
||||
return
|
||||
qdel(query_update_everything_ranks)
|
||||
qdel(query_check_everything_ranks)
|
||||
qdel(query_check_everything_ranks)
|
||||
|
||||
+24
-91
@@ -63,96 +63,29 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0)
|
||||
|
||||
//Takes a value of time in deciseconds.
|
||||
//Returns a text value of that number in hours, minutes, or seconds.
|
||||
/proc/DisplayTimeText(time_value, truncate = FALSE)
|
||||
var/second = (time_value)*0.1
|
||||
var/second_adjusted = null
|
||||
var/second_rounded = FALSE
|
||||
var/minute = null
|
||||
var/hour = null
|
||||
var/day = null
|
||||
|
||||
/proc/DisplayTimeText(time_value, round_seconds_to = 0.1)
|
||||
var/second = FLOOR(time_value * 0.1, round_seconds_to)
|
||||
if(!second)
|
||||
return "0 seconds"
|
||||
if(second >= 60)
|
||||
minute = FLOOR(second/60, 1)
|
||||
second = round(second - (minute*60), 0.1)
|
||||
second_rounded = TRUE
|
||||
if(second) //check if we still have seconds remaining to format, or if everything went into minute.
|
||||
second_adjusted = round(second) //used to prevent '1 seconds' being shown
|
||||
if(day || hour || minute)
|
||||
if(second_adjusted == 1 && second >= 1)
|
||||
second = " and 1 second"
|
||||
else if(second > 1)
|
||||
second = " and [second_adjusted] seconds"
|
||||
else //shows a fraction if seconds is < 1
|
||||
if(second_rounded) //no sense rounding again if it's already done
|
||||
second = " and [second] seconds"
|
||||
else
|
||||
second = " and [round(second, 0.1)] seconds"
|
||||
else
|
||||
if(second_adjusted == 1 && second >= 1)
|
||||
second = "[truncate ? "second" : "1 second"]"
|
||||
else if(second > 1)
|
||||
second = "[second_adjusted] seconds"
|
||||
else
|
||||
if(second_rounded)
|
||||
second = "[second] seconds"
|
||||
else
|
||||
second = "[round(second, 0.1)] seconds"
|
||||
else
|
||||
second = null
|
||||
|
||||
if(!minute)
|
||||
return "[second]"
|
||||
if(minute >= 60)
|
||||
hour = FLOOR(minute/60, 1)
|
||||
minute = (minute - (hour*60))
|
||||
if(minute) //alot simpler from here since you don't have to worry about fractions
|
||||
if(minute != 1)
|
||||
if((day || hour) && second)
|
||||
minute = ", [minute] minutes"
|
||||
else if((day || hour) && !second)
|
||||
minute = " and [minute] minutes"
|
||||
else
|
||||
minute = "[minute] minutes"
|
||||
else
|
||||
if((day || hour) && second)
|
||||
minute = ", 1 minute"
|
||||
else if((day || hour) && !second)
|
||||
minute = " and 1 minute"
|
||||
else
|
||||
minute = "[truncate ? "minute" : "1 minute"]"
|
||||
else
|
||||
minute = null
|
||||
|
||||
if(!hour)
|
||||
return "[minute][second]"
|
||||
if(hour >= 24)
|
||||
day = FLOOR(hour/24, 1)
|
||||
hour = (hour - (day*24))
|
||||
return "right now"
|
||||
if(second < 60)
|
||||
return "[second] second[(second != 1)? "s":""]"
|
||||
var/minute = FLOOR(second / 60, 1)
|
||||
second = FLOOR(MODULUS(second, 60), round_seconds_to)
|
||||
var/secondT
|
||||
if(second)
|
||||
secondT = " and [second] second[(second != 1)? "s":""]"
|
||||
if(minute < 60)
|
||||
return "[minute] minute[(minute != 1)? "s":""][secondT]"
|
||||
var/hour = FLOOR(minute / 60, 1)
|
||||
minute = MODULUS(minute, 60)
|
||||
var/minuteT
|
||||
if(minute)
|
||||
minuteT = " and [minute] minute[(minute != 1)? "s":""]"
|
||||
if(hour < 24)
|
||||
return "[hour] hour[(hour != 1)? "s":""][minuteT][secondT]"
|
||||
var/day = FLOOR(hour / 24, 1)
|
||||
hour = MODULUS(hour, 24)
|
||||
var/hourT
|
||||
if(hour)
|
||||
if(hour != 1)
|
||||
if(day && (minute || second))
|
||||
hour = ", [hour] hours"
|
||||
else if(day && (!minute || !second))
|
||||
hour = " and [hour] hours"
|
||||
else
|
||||
hour = "[hour] hours"
|
||||
else
|
||||
if(day && (minute || second))
|
||||
hour = ", 1 hour"
|
||||
else if(day && (!minute || !second))
|
||||
hour = " and 1 hour"
|
||||
else
|
||||
hour = "[truncate ? "hour" : "1 hour"]"
|
||||
else
|
||||
hour = null
|
||||
|
||||
if(!day)
|
||||
return "[hour][minute][second]"
|
||||
if(day > 1)
|
||||
day = "[day] days"
|
||||
else
|
||||
day = "[truncate ? "day" : "1 day"]"
|
||||
|
||||
return "[day][hour][minute][second]"
|
||||
hourT = " and [hour] hour[(hour != 1)? "s":""]"
|
||||
return "[day] day[(day != 1)? "s":""][hourT][minuteT][secondT]"
|
||||
|
||||
@@ -1239,6 +1239,20 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
|
||||
pixel_x = initialpixelx
|
||||
pixel_y = initialpixely
|
||||
|
||||
/atom/proc/do_jiggle(targetangle = 45)
|
||||
var/matrix/OM = matrix(transform)
|
||||
var/matrix/M = matrix(transform)
|
||||
M.Turn(pick(-targetangle, targetangle))
|
||||
animate(src, transform = M, time = 10, easing = ELASTIC_EASING)
|
||||
animate(src, transform = OM, time = 10, easing = ELASTIC_EASING)
|
||||
|
||||
/atom/proc/do_squish(squishx = 1.2, squishy = 0.6)
|
||||
var/matrix/OM = matrix(transform)
|
||||
var/matrix/M = matrix(transform)
|
||||
M.Scale(squishx, squishy)
|
||||
animate(src, transform = M, time = 10, easing = BOUNCE_EASING)
|
||||
animate(src, transform = OM, time = 10, easing = BOUNCE_EASING)
|
||||
|
||||
/proc/weightclass2text(var/w_class)
|
||||
switch(w_class)
|
||||
if(WEIGHT_CLASS_TINY)
|
||||
@@ -1530,4 +1544,4 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
. = list()
|
||||
for(var/i in L)
|
||||
if(condition.Invoke(i))
|
||||
. |= i
|
||||
. |= i
|
||||
|
||||
@@ -6,6 +6,8 @@ GLOBAL_LIST_EMPTY(deadmins) //all ckeys who have used the de-admin verb.
|
||||
GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client
|
||||
GLOBAL_LIST_EMPTY(stealthminID) //reference list with IDs that store ckeys, for stealthmins
|
||||
|
||||
GLOBAL_LIST_EMPTY(bunker_passthrough)
|
||||
|
||||
//Since it didn't really belong in any other category, I'm putting this here
|
||||
//This is for procs to replace all the goddamn 'in world's that are chilling around the code
|
||||
|
||||
|
||||
@@ -125,8 +125,12 @@
|
||||
if(prob(33))
|
||||
I.add_mob_blood(src)
|
||||
var/turf/location = get_turf(src)
|
||||
add_splatter_floor(location)
|
||||
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
|
||||
if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
C.bleed(totitemdamage)
|
||||
else
|
||||
add_splatter_floor(location)
|
||||
if(totitemdamage >= 10 && get_dist(user, src) <= 1) //people with TK won't get smeared with blood
|
||||
user.add_mob_blood(src)
|
||||
return TRUE //successful attack
|
||||
|
||||
@@ -163,4 +167,7 @@
|
||||
attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!"
|
||||
visible_message("<span class='danger'>[attack_message]</span>",\
|
||||
"<span class='userdanger'>[attack_message]</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
if(hit_area == BODY_ZONE_HEAD)
|
||||
if(prob(2))
|
||||
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
|
||||
return 1
|
||||
|
||||
@@ -62,6 +62,8 @@
|
||||
|
||||
/datum/config_entry/flag/allow_ai // allow ai job
|
||||
|
||||
/datum/config_entry/flag/allow_ai_multicam //whether the AI can use their multicam
|
||||
|
||||
/datum/config_entry/flag/disable_human_mood
|
||||
|
||||
/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen.
|
||||
@@ -162,16 +164,22 @@
|
||||
config_entry_value = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
|
||||
|
||||
/datum/config_entry/string/alert_blue_upto
|
||||
config_entry_value = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted."
|
||||
config_entry_value = "The station has received reliable information about potential threats to the station. Security staff may have weapons visible, random searches are permitted."
|
||||
|
||||
/datum/config_entry/string/alert_blue_downto
|
||||
config_entry_value = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed."
|
||||
config_entry_value = "Significant confirmed threats have been neutralized. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still permitted."
|
||||
|
||||
/datum/config_entry/string/alert_amber_upto
|
||||
config_entry_value = "There are significant confirmed threats to the station. Security staff may have weapons unholstered at all times. Random searches are allowed and advised."
|
||||
|
||||
/datum/config_entry/string/alert_amber_downto
|
||||
config_entry_value = "The immediate threat has passed. Security is no longer authorized to use lethal force, but may continue to have weapons drawn. Access requirements have been restored."
|
||||
|
||||
/datum/config_entry/string/alert_red_upto
|
||||
config_entry_value = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised."
|
||||
config_entry_value = "There is an immediate serious threat to the station. Security is now authorized to use lethal force. Additionally, access requirements on some machines have been lifted."
|
||||
|
||||
/datum/config_entry/string/alert_red_downto
|
||||
config_entry_value = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised."
|
||||
config_entry_value = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security is still authorized to use lethal force."
|
||||
|
||||
/datum/config_entry/string/alert_delta
|
||||
config_entry_value = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
|
||||
/datum/config_entry/string/servername // server name (the name of the game window)
|
||||
|
||||
/datum/config_entry/string/servertagline
|
||||
config_entry_value = "We forgot to set the server's tagline in config.txt"
|
||||
|
||||
/datum/config_entry/string/serversqlname // short form server name used for the DB
|
||||
|
||||
/datum/config_entry/string/stationname // station name (the name of the station in-game)
|
||||
|
||||
@@ -4,7 +4,7 @@ SUBSYSTEM_DEF(air_turfs)
|
||||
name = "Atmospherics - Turfs"
|
||||
init_order = INIT_ORDER_AIR_TURFS
|
||||
priority = FIRE_PRIORITY_AIR_TURFS
|
||||
wait = 1
|
||||
wait = 2
|
||||
flags = SS_BACKGROUND
|
||||
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
|
||||
var/list/currentrun = list()
|
||||
|
||||
@@ -435,11 +435,13 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
GLOB.the_gateway.awaygate = new_gate
|
||||
GLOB.the_gateway.wait = world.time
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override)
|
||||
/datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override, border_type_override)
|
||||
UNTIL(initialized && !clearing_reserved_turfs)
|
||||
var/datum/turf_reservation/reserve = new type
|
||||
if(turf_type_override)
|
||||
reserve.turf_type = turf_type_override
|
||||
if(border_type_override)
|
||||
reserve.borderturf = border_type_override
|
||||
if(!z)
|
||||
for(var/i in levels_by_trait(ZTRAIT_RESERVED))
|
||||
if(reserve.Reserve(width, height, i))
|
||||
|
||||
@@ -281,7 +281,10 @@ SUBSYSTEM_DEF(shuttle)
|
||||
if(emergency.timeLeft(1) < emergencyCallTime)
|
||||
return
|
||||
if(SEC_LEVEL_BLUE)
|
||||
if(emergency.timeLeft(1) < emergencyCallTime * 0.5)
|
||||
if(emergency.timeLeft(1) < emergencyCallTime * 0.6)
|
||||
return
|
||||
if(SEC_LEVEL_AMBER)
|
||||
if(emergency.timeLeft(1) < emergencyCallTime * 0.4)
|
||||
return
|
||||
else
|
||||
if(emergency.timeLeft(1) < emergencyCallTime * 0.25)
|
||||
@@ -440,17 +443,22 @@ SUBSYSTEM_DEF(shuttle)
|
||||
*/
|
||||
|
||||
var/transit_path = /turf/open/space/transit
|
||||
var/border_path = /turf/open/space/transit/border
|
||||
switch(travel_dir)
|
||||
if(NORTH)
|
||||
transit_path = /turf/open/space/transit/north
|
||||
border_path = /turf/open/space/transit/border/north
|
||||
if(SOUTH)
|
||||
transit_path = /turf/open/space/transit/south
|
||||
border_path = /turf/open/space/transit/border/south
|
||||
if(EAST)
|
||||
transit_path = /turf/open/space/transit/east
|
||||
border_path = /turf/open/space/transit/border/east
|
||||
if(WEST)
|
||||
transit_path = /turf/open/space/transit/west
|
||||
border_path = /turf/open/space/transit/border/west
|
||||
|
||||
var/datum/turf_reservation/proposal = SSmapping.RequestBlockReservation(transit_width, transit_height, null, /datum/turf_reservation/transit, transit_path)
|
||||
var/datum/turf_reservation/proposal = SSmapping.RequestBlockReservation(transit_width, transit_height, null, /datum/turf_reservation/transit, transit_path, border_path)
|
||||
|
||||
if(!istype(proposal))
|
||||
return FALSE
|
||||
|
||||
@@ -269,7 +269,7 @@ SUBSYSTEM_DEF(timer)
|
||||
var/new_bucket_count
|
||||
var/i = 1
|
||||
for (i in 1 to length(alltimers))
|
||||
var/datum/timedevent/timer = alltimers[1]
|
||||
var/datum/timedevent/timer = alltimers[i]
|
||||
if (!timer)
|
||||
continue
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ SUBSYSTEM_DEF(traumas)
|
||||
//phobia types is to pull from randomly for brain traumas, e.g. conspiracies is for special assignment only
|
||||
phobia_types = list("spiders", "space", "security", "clowns", "greytide", "lizards",
|
||||
"skeletons", "snakes", "robots", "doctors", "authority", "the supernatural",
|
||||
"aliens", "strangers", "birds", "falling", "anime", "mimes"
|
||||
"aliens", "strangers", "birds", "falling", "anime", "mimes", "cats"
|
||||
)
|
||||
|
||||
phobia_words = list("spiders" = strings(PHOBIA_FILE, "spiders"),
|
||||
@@ -35,7 +35,8 @@ SUBSYSTEM_DEF(traumas)
|
||||
"birds" = strings(PHOBIA_FILE, "birds"),
|
||||
"falling" = strings(PHOBIA_FILE, "falling"),
|
||||
"anime" = strings(PHOBIA_FILE, "anime"),
|
||||
"mimes" = strings(PHOBIA_FILE, "mimes")
|
||||
"mimes" = strings(PHOBIA_FILE, "mimes"),
|
||||
"cats" = strings(PHOBIA_FILE, "cats")
|
||||
)
|
||||
|
||||
phobia_mobs = list("spiders" = typecacheof(list(/mob/living/simple_animal/hostile/poison/giant_spider)),
|
||||
@@ -54,7 +55,8 @@ SUBSYSTEM_DEF(traumas)
|
||||
/mob/living/simple_animal/pet/penguin)),
|
||||
"birds" = typecacheof(list(/mob/living/simple_animal/parrot, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
|
||||
/mob/living/simple_animal/pet/penguin)),
|
||||
"anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian))
|
||||
"anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian)),
|
||||
"cats"= typecacheof(list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/hostile/cat_butcherer))
|
||||
)
|
||||
|
||||
|
||||
@@ -152,7 +154,10 @@ SUBSYSTEM_DEF(traumas)
|
||||
/obj/item/storage/backpack/mime, /obj/item/reagent_containers/food/snacks/grown/banana/mime,
|
||||
/obj/item/grown/bananapeel/mimanapeel, /obj/item/cartridge/virus/mime, /obj/item/clothing/shoes/sneakers/mime,
|
||||
/obj/item/bedsheet/mime, /obj/item/reagent_containers/food/snacks/burger/mime, /obj/item/clothing/head/beret, /obj/item/clothing/mask/gas/sexymime,
|
||||
/obj/item/clothing/under/sexymime, /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/mecha/combat/reticence))
|
||||
/obj/item/clothing/under/sexymime, /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/mecha/combat/reticence)),
|
||||
|
||||
"cats" = typecacheof(list(/obj/item/organ/ears/cat, /obj/item/organ/tail/cat, /obj/item/laser_pointer, /obj/item/toy/cattoy, /obj/item/clothing/head/kitty,
|
||||
/obj/item/clothing/head/collectable/kitty, /obj/item/melee/chainofcommand/tailwhip/kitty, /obj/item/stack/sheet/animalhide/cat))
|
||||
)
|
||||
|
||||
phobia_turfs = list("space" = typecacheof(list(/turf/open/space, /turf/open/floor/holofloor/space, /turf/open/floor/fakespace)),
|
||||
@@ -170,7 +175,8 @@ SUBSYSTEM_DEF(traumas)
|
||||
"the supernatural" = typecacheof(list(/datum/species/golem/clockwork, /datum/species/golem/runic)),
|
||||
"aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod,
|
||||
/datum/species/shadow)),
|
||||
"anime" = typecacheof(list(/datum/species/human/felinid))
|
||||
"anime" = typecacheof(list(/datum/species/human/felinid)),
|
||||
"cats" = typecacheof(list(/datum/species/human/felinid))
|
||||
)
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -463,4 +463,3 @@
|
||||
// so just reset the user mob's machine var
|
||||
if(src && src.mob)
|
||||
src.mob.unset_machine()
|
||||
return
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
/datum/component/storage/concrete/pockets/shoes/Initialize()
|
||||
. = ..()
|
||||
cant_hold = typecacheof(list(/obj/item/screwdriver/power))
|
||||
can_hold = typecacheof(list(
|
||||
/obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen,
|
||||
/obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector,
|
||||
@@ -44,6 +45,7 @@
|
||||
|
||||
/datum/component/storage/concrete/pockets/shoes/clown/Initialize()
|
||||
. = ..()
|
||||
cant_hold = typecacheof(list(/obj/item/screwdriver/power))
|
||||
can_hold = typecacheof(list(
|
||||
/obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen,
|
||||
/obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector,
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
click_gather = TRUE
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
max_combined_w_class = 100
|
||||
max_items = 75
|
||||
max_items = 100
|
||||
display_numerical_stacking = TRUE
|
||||
|
||||
/datum/component/storage/concrete/rped/can_be_inserted(obj/item/I, stop_messages, mob/M)
|
||||
@@ -22,7 +22,7 @@
|
||||
click_gather = TRUE
|
||||
max_w_class = WEIGHT_CLASS_BULKY // can fit vending refills
|
||||
max_combined_w_class = 800
|
||||
max_items = 325
|
||||
max_items = 350
|
||||
display_numerical_stacking = TRUE
|
||||
|
||||
/datum/component/storage/concrete/bluespace/rped/can_be_inserted(obj/item/I, stop_messages, mob/M)
|
||||
@@ -31,3 +31,6 @@
|
||||
if (!stop_messages)
|
||||
to_chat(M, "<span class='warning'>[parent] only accepts machine parts!</span>")
|
||||
return FALSE
|
||||
|
||||
/datum/component/storage/concrete/cyborg/rped
|
||||
max_items = 150
|
||||
|
||||
@@ -169,10 +169,12 @@
|
||||
if(locked)
|
||||
to_chat(M, "<span class='warning'>[parent] seems to be locked!</span>")
|
||||
return FALSE
|
||||
var/atom/A = parent
|
||||
var/obj/item/I = O
|
||||
if(collection_mode == COLLECT_ONE)
|
||||
if(can_be_inserted(I, null, M))
|
||||
handle_item_insertion(I, null, M)
|
||||
A.do_squish()
|
||||
return
|
||||
if(!isturf(I.loc))
|
||||
return
|
||||
@@ -189,6 +191,7 @@
|
||||
stoplag(1)
|
||||
qdel(progress)
|
||||
to_chat(M, "<span class='notice'>You put everything you could [insert_preposition] [parent].</span>")
|
||||
A.do_squish(1.4, 0.4)
|
||||
|
||||
/datum/component/storage/proc/handle_mass_item_insertion(list/things, datum/component/storage/src_object, mob/user, datum/progressbar/progress)
|
||||
var/atom/source_real_location = src_object.real_location()
|
||||
@@ -246,6 +249,7 @@
|
||||
while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress)))
|
||||
stoplag(1)
|
||||
qdel(progress)
|
||||
A.do_squish(0.8, 1.2)
|
||||
|
||||
/datum/component/storage/proc/mass_remove_from_storage(atom/target, list/things, datum/progressbar/progress, trigger_on_found = TRUE)
|
||||
var/atom/real_location = real_location()
|
||||
@@ -455,6 +459,7 @@
|
||||
return FALSE
|
||||
if(dump_destination.storage_contents_dump_act(src, M))
|
||||
playsound(A, "rustle", 50, 1, -5)
|
||||
A.do_squish(0.8, 1.2)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -473,6 +478,8 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
handle_item_insertion(I, FALSE, M)
|
||||
var/atom/A = parent
|
||||
A.do_squish()
|
||||
|
||||
/datum/component/storage/proc/return_inv(recursive)
|
||||
var/list/ret = list()
|
||||
@@ -514,6 +521,7 @@
|
||||
if(A.loc != M)
|
||||
return
|
||||
playsound(A, "rustle", 50, 1, -5)
|
||||
A.do_jiggle()
|
||||
if(istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(A, H.held_index)
|
||||
@@ -539,6 +547,8 @@
|
||||
if(!L.incapacitated() && I == L.get_active_held_item())
|
||||
if(!SEND_SIGNAL(I, COMSIG_CONTAINS_STORAGE) && can_be_inserted(I, FALSE)) //If it has storage it should be trying to dump, not insert.
|
||||
handle_item_insertion(I, FALSE, L)
|
||||
var/atom/A = parent
|
||||
A.do_squish()
|
||||
|
||||
//This proc return 1 if the item can be picked up and 0 if it can't.
|
||||
//Set the stop_messages to stop it from printing messages
|
||||
@@ -712,6 +722,7 @@
|
||||
to_chat(user, "<span class='warning'>[parent] seems to be locked!</span>")
|
||||
else
|
||||
show_to(user)
|
||||
A.do_jiggle()
|
||||
|
||||
/datum/component/storage/proc/signal_on_pickup(datum/source, mob/user)
|
||||
var/atom/A = parent
|
||||
@@ -732,16 +743,30 @@
|
||||
return hide_from(target)
|
||||
|
||||
/datum/component/storage/proc/on_alt_click(datum/source, mob/user)
|
||||
if(!isliving(user) || user.incapacitated() || !quickdraw || locked || !user.CanReach(parent))
|
||||
if(!isliving(user) || !user.CanReach(parent))
|
||||
return
|
||||
var/obj/item/I = locate() in real_location()
|
||||
if(!I)
|
||||
if(locked)
|
||||
to_chat(user, "<span class='warning'>[parent] seems to be locked!</span>")
|
||||
return
|
||||
remove_from_storage(I, get_turf(user))
|
||||
if(!user.put_in_hands(I))
|
||||
to_chat(user, "<span class='notice'>You fumble for [I] and it falls on the floor.</span>")
|
||||
|
||||
var/atom/A = parent
|
||||
if(!quickdraw)
|
||||
A.add_fingerprint(user)
|
||||
user_show_to_mob(user)
|
||||
playsound(A, "rustle", 50, 1, -5)
|
||||
return
|
||||
|
||||
if(!user.incapacitated())
|
||||
var/obj/item/I = locate() in real_location()
|
||||
if(!I)
|
||||
return
|
||||
A.add_fingerprint(user)
|
||||
remove_from_storage(I, get_turf(user))
|
||||
if(!user.put_in_hands(I))
|
||||
to_chat(user, "<span class='notice'>You fumble for [I] and it falls on the floor.</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] draws [I] from [parent]!</span>", "<span class='notice'>You draw [I] from [parent].</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] draws [I] from [parent]!</span>", "<span class='notice'>You draw [I] from [parent].</span>")
|
||||
|
||||
/datum/component/storage/proc/action_trigger(datum/signal_source, datum/action/source)
|
||||
gather_mode_switch(source.owner)
|
||||
|
||||
+4
-1
@@ -8,6 +8,7 @@
|
||||
var/datum/species/species = new /datum/species/human //The type of mutant race the player is if applicable (i.e. potato-man)
|
||||
var/list/features = list("FFF") //first value is mutant color
|
||||
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
|
||||
var/nameless = FALSE
|
||||
var/list/mutations = list() //All mutations are from now on here
|
||||
var/list/temporary_mutations = list() //Timers for temporary mutations
|
||||
var/list/previous = list() //For temporary name/ui/ue/blood_type modifications
|
||||
@@ -43,6 +44,7 @@
|
||||
destination.set_species(species.type, icon_update=0)
|
||||
destination.dna.features = features.Copy()
|
||||
destination.dna.real_name = real_name
|
||||
destination.dna.nameless = nameless
|
||||
destination.dna.temporary_mutations = temporary_mutations.Copy()
|
||||
if(ishuman(destination))
|
||||
var/mob/living/carbon/human/H = destination
|
||||
@@ -59,6 +61,7 @@
|
||||
new_dna.features = features.Copy()
|
||||
new_dna.species = new species.type
|
||||
new_dna.real_name = real_name
|
||||
new_dna.nameless = nameless
|
||||
new_dna.mutations = mutations.Copy()
|
||||
|
||||
/datum/dna/proc/add_mutation(mutation_name)
|
||||
@@ -199,7 +202,7 @@
|
||||
|
||||
|
||||
/datum/dna/proc/is_same_as(datum/dna/D)
|
||||
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name)
|
||||
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless)
|
||||
if(species.type == D.species.type && features == D.features && blood_type == D.blood_type)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -109,6 +109,10 @@
|
||||
description = "<span class='warning'>It sure is dark around here...</span>\n"
|
||||
mood_change = -3
|
||||
|
||||
/datum/mood_event/brightlight
|
||||
description = "<span class='warning'>The light feels unbearable...</span>\n"
|
||||
mood_change = -3
|
||||
|
||||
/datum/mood_event/family_heirloom_missing
|
||||
description = "<span class='warning'>I'm missing my family heirloom...</span>\n"
|
||||
mood_change = -4
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
/obj/screen/alert/status_effect/vanguard
|
||||
name = "Vanguard"
|
||||
desc = "You're absorbing stuns! 25% of all stuns taken will affect you after this effect ends."
|
||||
desc = "You're absorbing stuns! Your stamina is greatly increased, but not infinite. 25% of all stuns taken will affect you after this effect ends."
|
||||
icon_state = "vanguard"
|
||||
alerttooltipstyle = "clockcult"
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
owner.visible_message("<span class='warning'>[owner] begins to faintly glow!</span>", "<span class='brass'>You will absorb all stuns for the next twenty seconds.</span>")
|
||||
owner.SetStun(0, FALSE)
|
||||
owner.SetKnockdown(0)
|
||||
owner.setStaminaLoss(0, FALSE)
|
||||
progbar = new(owner, duration, owner)
|
||||
progbar.bar.color = list("#FAE48C", "#FAE48C", "#FAE48C", rgb(0,0,0))
|
||||
progbar.update(duration - world.time)
|
||||
|
||||
@@ -458,7 +458,7 @@
|
||||
var/old_health
|
||||
|
||||
/datum/status_effect/kindle/tick()
|
||||
owner.Knockdown(15)
|
||||
owner.Knockdown(15, TRUE, FALSE, 15)
|
||||
if(iscarbon(owner))
|
||||
var/mob/living/carbon/C = owner
|
||||
C.silent = max(2, C.silent)
|
||||
|
||||
@@ -58,6 +58,14 @@
|
||||
gain_text = "<span class='notice'>You walk with a little more litheness.</span>"
|
||||
lose_text = "<span class='danger'>You start tromping around like a barbarian.</span>"
|
||||
|
||||
/datum/quirk/quick_step
|
||||
name = "Quick Step"
|
||||
desc = "You walk with determined strides, and out-pace most people when walking."
|
||||
value = 2
|
||||
mob_trait = TRAIT_SPEEDY_STEP
|
||||
gain_text = "<span class='notice'>You feel determined. No time to lose.</span>"
|
||||
lose_text = "<span class='danger'>You feel less determined. What's the rush, man?</span>"
|
||||
|
||||
/datum/quirk/musician
|
||||
name = "Musician"
|
||||
desc = "You can tune handheld musical instruments to play melodies that clear certain negative effects and soothe the soul."
|
||||
|
||||
@@ -38,19 +38,33 @@
|
||||
var/obj/item/heirloom_type
|
||||
switch(quirk_holder.mind.assigned_role)
|
||||
if("Clown")
|
||||
heirloom_type = /obj/item/paint/anycolor
|
||||
heirloom_type = /obj/item/bikehorn/golden
|
||||
if("Mime")
|
||||
heirloom_type = /obj/item/reagent_containers/food/snacks/baguette
|
||||
heirloom_type = /obj/item/paint/anycolor
|
||||
heirloom_type = /obj/item/toy/dummy
|
||||
if("Cook")
|
||||
heirloom_type = /obj/item/kitchen/knife/scimitar
|
||||
if("Medical Doctor")
|
||||
heirloom_type = /obj/item/healthanalyzer/advanced
|
||||
if("Station Engineer")
|
||||
heirloom_type = /obj/item/wirecutters/brass
|
||||
if("Atmospheric Technician")
|
||||
heirloom_type = /obj/item/extinguisher/mini/family
|
||||
if("Lawyer")
|
||||
heirloom_type = /obj/item/gavelhammer
|
||||
heirloom_type = /obj/item/storage/briefcase/lawyer/family
|
||||
if("Janitor")
|
||||
heirloom_type = /obj/item/mop
|
||||
if("Security Officer")
|
||||
heirloom_type = /obj/item/book/manual/wiki/security_space_law
|
||||
heirloom_type = /obj/item/clothing/accessory/medal/silver/valor
|
||||
if("Scientist")
|
||||
heirloom_type = /obj/item/toy/plush/slimeplushie
|
||||
if("Assistant")
|
||||
heirloom_type = /obj/item/storage/toolbox/mechanical/old/heirloom
|
||||
if("Chaplain")
|
||||
heirloom_type = /obj/item/camera/spooky/family
|
||||
if("Captain")
|
||||
heirloom_type = /obj/item/clothing/accessory/medal/gold/captain/family
|
||||
if(!heirloom_type)
|
||||
heirloom_type = pick(
|
||||
/obj/item/toy/cards/deck,
|
||||
@@ -144,6 +158,21 @@
|
||||
else
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "nyctophobia")
|
||||
|
||||
/datum/quirk/lightless
|
||||
name = "Light Sensitivity"
|
||||
desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Nanotrasen was more considerate of your needs..."
|
||||
value = -1
|
||||
gain_text = "<span class='danger'>The safty of light feels off...</span>"
|
||||
lose_text = "<span class='notice'>Enlighing.</span>"
|
||||
|
||||
/datum/quirk/lightless/on_process()
|
||||
var/turf/T = get_turf(quirk_holder)
|
||||
var/lums = T.get_lumcount()
|
||||
if(lums >= 0.8)
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "brightlight", /datum/mood_event/brightlight)
|
||||
else
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "brightlight")
|
||||
|
||||
/datum/quirk/nonviolent
|
||||
name = "Pacifist"
|
||||
desc = "The thought of violence makes you sick. So much so, in fact, that you can't hurt anyone."
|
||||
@@ -257,14 +286,32 @@
|
||||
|
||||
/datum/quirk/phobia
|
||||
name = "Phobia"
|
||||
desc = "You've had a traumatic past, that has scared you for life while dealing with your greatest fear."
|
||||
desc = "You've had a traumatic past, one that has scarred you for life, and cripples you when dealing with your greatest fears."
|
||||
value = -2 // It can hardstun you. You can be a job that your phobia targets...
|
||||
gain_text = "<span class='danger'>You feel your fears manifest themselfs.</span>"
|
||||
lose_text = "<span class='notice'>You feel your fears fade away.</span>"
|
||||
medical_record_text = "Patient has an extreme or irrational fear of or aversion to something."
|
||||
gain_text = "<span class='danger'>You begin to tremble as an immeasurable fear grips your mind.</span>"
|
||||
lose_text = "<span class='notice'>Your confidence wipes away the fear that had been plaguing you.</span>"
|
||||
medical_record_text = "Patient has an extreme or irrational fear and aversion to an undefined stimuli."
|
||||
var/datum/brain_trauma/mild/phobia/phobia
|
||||
|
||||
|
||||
/datum/quirk/phobia/add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
phobia = new
|
||||
H.gain_trauma(phobia, TRAUMA_RESILIENCE_SURGERY)
|
||||
|
||||
/datum/quirk/mute
|
||||
name = "Mute"
|
||||
desc = "Due to some accident, medical condition, or simply by choice, you are completely unable to speak."
|
||||
value = -2 //HALP MAINTS
|
||||
mob_trait = TRAIT_MUTE
|
||||
gain_text = "<span class='danger'>You find yourself unable to speak!</span>"
|
||||
lose_text = "<span class='notice'>You feel a growing strength in your vocal chords.</span>"
|
||||
medical_record_text = "Functionally mute, patient is unable to use their voice in any capacity."
|
||||
|
||||
/datum/quirk/mute/add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
H.gain_trauma(TRAIT_MUTE, TRAUMA_RESILIENCE_SURGERY)
|
||||
|
||||
/datum/quirk/mute/on_process()
|
||||
if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums))
|
||||
to_chat(quirk_holder, "<span class='boldannounce'>Your antagonistic nature has caused your voice to be heard.</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -93,6 +93,10 @@
|
||||
/datum/weather/ash_storm/weather_act(mob/living/L)
|
||||
if(is_ash_immune(L))
|
||||
return
|
||||
if(is_species(L, /datum/species/lizard/ashwalker))
|
||||
if(L.getStaminaLoss() <= STAMINA_SOFTCRIT)
|
||||
L.adjustStaminaLossBuffered(4)
|
||||
return
|
||||
L.adjustFireLoss(4)
|
||||
|
||||
|
||||
|
||||
@@ -29,6 +29,13 @@
|
||||
/area/centcom/holding
|
||||
name = "Holding Facility"
|
||||
|
||||
/area/centcom/vip
|
||||
name = "VIP Zone"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
/area/centcom/winterball
|
||||
name = "winterball Zone"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
|
||||
/area/centcom/supplypod
|
||||
name = "Supplypod Facility"
|
||||
icon_state = "supplypod"
|
||||
|
||||
@@ -622,8 +622,12 @@
|
||||
else if(direction & WEST)
|
||||
pixel_x_diff = -8
|
||||
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
|
||||
animate(src, pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2)
|
||||
var/matrix/OM = matrix(transform)
|
||||
var/matrix/M = matrix(transform)
|
||||
M.Turn(pixel_x_diff ? pixel_x_diff*2 : pick(-16, 16))
|
||||
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, transform = M, time = 2)
|
||||
animate(src, pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, transform = OM, time = 2)
|
||||
|
||||
/atom/movable/proc/do_item_attack_animation(atom/A, visual_effect_icon, obj/item/used_item)
|
||||
var/image/I
|
||||
|
||||
@@ -56,19 +56,6 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
|
||||
return 0
|
||||
|
||||
/datum/game_mode/changeling/post_setup()
|
||||
//Decide if it's ok for the lings to have a team objective
|
||||
//And then set it up to be handed out in forge_changeling_objectives
|
||||
var/list/team_objectives = subtypesof(/datum/objective/changeling_team_objective)
|
||||
var/list/possible_team_objectives = list()
|
||||
for(var/T in team_objectives)
|
||||
var/datum/objective/changeling_team_objective/CTO = T
|
||||
|
||||
if(changelings.len >= initial(CTO.min_lings))
|
||||
possible_team_objectives += T
|
||||
|
||||
if(possible_team_objectives.len && prob(20*changelings.len))
|
||||
GLOB.changeling_team_objective_type = pick(possible_team_objectives)
|
||||
|
||||
for(var/datum/mind/changeling in changelings)
|
||||
log_game("[key_name(changeling)] has been selected as a changeling")
|
||||
var/datum/antagonist/changeling/new_antag = new()
|
||||
|
||||
@@ -37,6 +37,7 @@ Credit where due:
|
||||
4. PJB3005 from /vg/ for the failed continuation PR
|
||||
5. Xhuis from /tg/ for coding the first iteration of the mode, and the new, reworked version
|
||||
6. ChangelingRain from /tg/ for maintaining the gamemode for months after its release prior to its rework
|
||||
7. Clockwork cult code as of now, at least the one being pulled from Citadel Station's master branch, is being, or already is, fixed by Coolgat3 and Avunia.
|
||||
|
||||
*/
|
||||
|
||||
@@ -130,10 +131,10 @@ Credit where due:
|
||||
config_tag = "clockwork_cult"
|
||||
antag_flag = ROLE_SERVANT_OF_RATVAR
|
||||
false_report_weight = 10
|
||||
required_players = 24
|
||||
required_enemies = 4
|
||||
required_players = 20
|
||||
required_enemies = 2
|
||||
recommended_enemies = 4
|
||||
enemy_minimum_age = 14
|
||||
enemy_minimum_age = 7
|
||||
protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") //Silicons can eventually be converted
|
||||
restricted_jobs = list("Chaplain", "Captain")
|
||||
announce_span = "brass"
|
||||
@@ -267,7 +268,7 @@ Credit where due:
|
||||
//Servant of Ratvar outfit
|
||||
/datum/outfit/servant_of_ratvar
|
||||
name = "Servant of Ratvar"
|
||||
uniform = /obj/item/clothing/under/chameleon/ratvar
|
||||
uniform = /obj/item/clothing/under/rank/engineer //no more chameleon suit for them, as requested
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
back = /obj/item/storage/backpack
|
||||
ears = /obj/item/radio/headset
|
||||
|
||||
@@ -37,10 +37,10 @@
|
||||
false_report_weight = 10
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
|
||||
protected_jobs = list()
|
||||
required_players = 24
|
||||
required_enemies = 4
|
||||
required_players = 20
|
||||
required_enemies = 2
|
||||
recommended_enemies = 4
|
||||
enemy_minimum_age = 14
|
||||
enemy_minimum_age = 7
|
||||
|
||||
announce_span = "cult"
|
||||
announce_text = "Some crew members are trying to start a cult to Nar'Sie!\n\
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
name = "nuclear emergency"
|
||||
config_tag = "nuclear"
|
||||
false_report_weight = 10
|
||||
required_players = 30 // 30 players - 3 players to be the nuke ops = 27 players remaining
|
||||
required_players = 28 // 30 players - 3 players to be the nuke ops = 25 players remaining
|
||||
required_enemies = 2
|
||||
recommended_enemies = 5
|
||||
antag_flag = ROLE_OPERATIVE
|
||||
enemy_minimum_age = 14
|
||||
enemy_minimum_age = 7
|
||||
|
||||
announce_span = "danger"
|
||||
announce_text = "Syndicate forces are approaching the station in an attempt to destroy it!\n\
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
///////////////////////////
|
||||
/datum/game_mode/revolution/announce()
|
||||
to_chat(world, "<B>The current game mode is - Revolution!</B>")
|
||||
to_chat(world, "<B>Some crewmembers are attempting to start a revolution!<BR>\nRevolutionaries - Kill the Captain, HoP, HoS, CE, RD and CMO. Convert other crewmembers (excluding the heads of staff, and security officers) to your cause by flashing them. Protect your leaders.<BR>\nPersonnel - Protect the heads of staff. Kill the leaders of the revolution, and brainwash the other revolutionaries (by beating them in the head).</B>")
|
||||
to_chat(world, "<B>Some crewmembers are attempting to start a revolution!<BR>\nRevolutionaries - Kill the Captain, HoP, HoS, CE, RD, QM and CMO. Convert other crewmembers (excluding the heads of staff, and security officers) to your cause by flashing them. Protect your leaders.<BR>\nPersonnel - Protect the heads of staff. Kill the leaders of the revolution, and brainwash the other revolutionaries (by beating them in the head).</B>")
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
required_players = 20
|
||||
required_enemies = 1
|
||||
recommended_enemies = 1
|
||||
enemy_minimum_age = 14
|
||||
enemy_minimum_age = 7
|
||||
round_ends_with_antag_death = 1
|
||||
announce_span = "danger"
|
||||
announce_text = "There is a space wizard attacking the station!\n\
|
||||
|
||||
@@ -212,6 +212,17 @@
|
||||
icon_state = "sleeper_s"
|
||||
controls_inside = TRUE
|
||||
|
||||
/obj/machinery/sleeper/syndie/Initialize()
|
||||
. = ..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/circuitboard/machine/sleeper(null)
|
||||
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
|
||||
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
|
||||
component_parts += new /obj/item/stack/sheet/glass(null)
|
||||
component_parts += new /obj/item/stack/sheet/glass(null)
|
||||
component_parts += new /obj/item/stack/cable_coil(null)
|
||||
RefreshParts()
|
||||
|
||||
/obj/machinery/sleeper/syndie/fullupgrade/Initialize()
|
||||
. = ..()
|
||||
component_parts = list()
|
||||
|
||||
@@ -227,7 +227,7 @@
|
||||
if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes.
|
||||
connected_message("Clone Rejected: Deceased.")
|
||||
if(internal_radio)
|
||||
SPEAK("The cloning of [mob_occupant.real_name] has been \
|
||||
SPEAK("The cloning has been \
|
||||
aborted due to unrecoverable tissue failure.")
|
||||
go_out()
|
||||
mob_occupant.apply_vore_prefs()
|
||||
@@ -261,7 +261,7 @@
|
||||
else if((mob_occupant.cloneloss <= (100 - heal_level)))
|
||||
connected_message("Cloning Process Complete.")
|
||||
if(internal_radio)
|
||||
SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.")
|
||||
SPEAK("The cloning cycle is complete.")
|
||||
|
||||
// If the cloner is upgraded to debugging high levels, sometimes
|
||||
// organs and limbs can be missing.
|
||||
@@ -319,7 +319,7 @@
|
||||
return
|
||||
else
|
||||
connected_message("Emergency Ejection")
|
||||
SPEAK("An emergency ejection of [clonemind.name] has occurred. Survival not guaranteed.")
|
||||
SPEAK("An emergency ejection of the current clone has occurred. Survival not guaranteed.")
|
||||
to_chat(user, "<span class='notice'>You force an emergency ejection. </span>")
|
||||
go_out()
|
||||
mob_occupant.apply_vore_prefs()
|
||||
@@ -412,7 +412,7 @@
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mob_occupant && prob(100/(severity*efficiency)))
|
||||
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
|
||||
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0))
|
||||
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of, ERROR: John Doe, prematurely." ,0))
|
||||
mob_occupant.apply_vore_prefs()
|
||||
go_out()
|
||||
|
||||
|
||||
@@ -6,54 +6,55 @@
|
||||
icon_screen = "invaders"
|
||||
clockwork = TRUE //it'd look weird
|
||||
var/list/prizes = list(
|
||||
/obj/item/storage/box/snappops = 2,
|
||||
/obj/item/toy/talking/AI = 2,
|
||||
/obj/item/toy/talking/codex_gigas = 2,
|
||||
/obj/item/clothing/under/syndicate/tacticool = 2,
|
||||
/obj/item/toy/sword = 2,
|
||||
/obj/item/toy/gun = 2,
|
||||
/obj/item/gun/ballistic/shotgun/toy/crossbow = 2,
|
||||
/obj/item/storage/box/fakesyndiesuit = 2,
|
||||
/obj/item/storage/crayons = 2,
|
||||
/obj/item/toy/spinningtoy = 2,
|
||||
/obj/item/toy/prize/ripley = 1,
|
||||
/obj/item/toy/prize/fireripley = 1,
|
||||
/obj/item/toy/prize/deathripley = 1,
|
||||
/obj/item/toy/prize/gygax = 1,
|
||||
/obj/item/toy/prize/durand = 1,
|
||||
/obj/item/toy/prize/honk = 1,
|
||||
/obj/item/toy/prize/marauder = 1,
|
||||
/obj/item/toy/prize/seraph = 1,
|
||||
/obj/item/toy/prize/mauler = 1,
|
||||
/obj/item/toy/prize/odysseus = 1,
|
||||
/obj/item/toy/prize/phazon = 1,
|
||||
/obj/item/toy/prize/reticence = 1,
|
||||
/obj/item/toy/cards/deck = 2,
|
||||
/obj/item/toy/nuke = 2,
|
||||
/obj/item/toy/minimeteor = 2,
|
||||
/obj/item/toy/redbutton = 2,
|
||||
/obj/item/toy/talking/owl = 2,
|
||||
/obj/item/toy/talking/griffin = 2,
|
||||
/obj/item/coin/antagtoken = 2,
|
||||
/obj/item/stack/tile/fakespace/loaded = 2,
|
||||
/obj/item/stack/tile/fakepit/loaded = 2,
|
||||
/obj/item/toy/toy_xeno = 2,
|
||||
/obj/item/storage/box/actionfigure = 1,
|
||||
/obj/item/restraints/handcuffs/fake = 2,
|
||||
/obj/item/grenade/chem_grenade/glitter/pink = 1,
|
||||
/obj/item/grenade/chem_grenade/glitter/blue = 1,
|
||||
/obj/item/grenade/chem_grenade/glitter/white = 1,
|
||||
/obj/item/toy/eightball = 2,
|
||||
/obj/item/toy/windupToolbox = 2,
|
||||
/obj/item/toy/clockwork_watch = 2,
|
||||
/obj/item/toy/toy_dagger = 2,
|
||||
/obj/item/extendohand/acme = 1,
|
||||
/obj/item/hot_potato/harmless/toy = 1,
|
||||
/obj/item/card/emagfake = 1,
|
||||
/obj/item/clothing/shoes/wheelys = 2,
|
||||
/obj/item/clothing/shoes/kindleKicks = 2,
|
||||
/obj/item/storage/belt/military/snack = 2
|
||||
)
|
||||
/obj/item/storage/box/snappops = 8,
|
||||
/obj/item/toy/talking/AI = 8,
|
||||
/obj/item/toy/talking/codex_gigas = 8,
|
||||
/obj/item/clothing/under/syndicate/tacticool = 8,
|
||||
/obj/item/toy/sword = 8,
|
||||
/obj/item/toy/gun = 8,
|
||||
/obj/item/gun/ballistic/shotgun/toy/crossbow = 8,
|
||||
/obj/item/storage/box/fakesyndiesuit = 8,
|
||||
/obj/item/storage/crayons = 8,
|
||||
/obj/item/toy/spinningtoy = 8,
|
||||
/obj/item/toy/prize/ripley = 4,
|
||||
/obj/item/toy/prize/fireripley = 4,
|
||||
/obj/item/toy/prize/deathripley = 4,
|
||||
/obj/item/toy/prize/gygax = 4,
|
||||
/obj/item/toy/prize/durand = 4,
|
||||
/obj/item/toy/prize/honk = 4,
|
||||
/obj/item/toy/prize/marauder = 4,
|
||||
/obj/item/toy/prize/seraph = 4,
|
||||
/obj/item/toy/prize/mauler = 4,
|
||||
/obj/item/toy/prize/odysseus = 4,
|
||||
/obj/item/toy/prize/phazon = 4,
|
||||
/obj/item/toy/prize/reticence = 4,
|
||||
/obj/item/toy/cards/deck = 8,
|
||||
/obj/item/toy/nuke = 8,
|
||||
/obj/item/toy/minimeteor = 8,
|
||||
/obj/item/toy/redbutton = 8,
|
||||
/obj/item/toy/talking/owl = 8,
|
||||
/obj/item/toy/talking/griffin = 8,
|
||||
/obj/item/coin/antagtoken = 8,
|
||||
/obj/item/stack/tile/fakespace/loaded = 8,
|
||||
/obj/item/stack/tile/fakepit/loaded = 8,
|
||||
/obj/item/toy/toy_xeno = 8,
|
||||
/obj/item/storage/box/actionfigure = 4,
|
||||
/obj/item/restraints/handcuffs/fake = 8,
|
||||
/obj/item/grenade/chem_grenade/glitter/pink = 4,
|
||||
/obj/item/grenade/chem_grenade/glitter/blue = 4,
|
||||
/obj/item/grenade/chem_grenade/glitter/white = 4,
|
||||
/obj/item/toy/eightball = 8,
|
||||
/obj/item/toy/windupToolbox = 8,
|
||||
/obj/item/toy/clockwork_watch = 8,
|
||||
/obj/item/toy/toy_dagger = 8,
|
||||
/obj/item/extendohand/acme = 4,
|
||||
/obj/item/hot_potato/harmless/toy = 4,
|
||||
/obj/item/card/emagfake = 4,
|
||||
/obj/item/clothing/shoes/wheelys = 8,
|
||||
/obj/item/clothing/shoes/kindleKicks = 8,
|
||||
/obj/item/storage/belt/military/snack = 8,
|
||||
/obj/item/toy/plush/random = 450
|
||||
)//plushies have a 0.6 chance
|
||||
|
||||
light_color = LIGHT_COLOR_GREEN
|
||||
|
||||
|
||||
@@ -108,8 +108,10 @@
|
||||
tmp_alertlevel = SEC_LEVEL_GREEN
|
||||
if(tmp_alertlevel < SEC_LEVEL_GREEN)
|
||||
tmp_alertlevel = SEC_LEVEL_GREEN
|
||||
if(tmp_alertlevel > SEC_LEVEL_BLUE)
|
||||
tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this
|
||||
if(tmp_alertlevel == SEC_LEVEL_BLUE)
|
||||
tmp_alertlevel = SEC_LEVEL_BLUE
|
||||
if(tmp_alertlevel > SEC_LEVEL_AMBER)
|
||||
tmp_alertlevel = SEC_LEVEL_AMBER //Cannot engage delta with this
|
||||
set_security_level(tmp_alertlevel)
|
||||
if(GLOB.security_level != old_level)
|
||||
to_chat(usr, "<span class='notice'>Authorization confirmed. Modifying security level.</span>")
|
||||
@@ -390,8 +392,10 @@
|
||||
tmp_alertlevel = SEC_LEVEL_GREEN
|
||||
if(tmp_alertlevel < SEC_LEVEL_GREEN)
|
||||
tmp_alertlevel = SEC_LEVEL_GREEN
|
||||
if(tmp_alertlevel > SEC_LEVEL_BLUE)
|
||||
tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this
|
||||
if(tmp_alertlevel == SEC_LEVEL_BLUE)
|
||||
tmp_alertlevel = SEC_LEVEL_BLUE
|
||||
if(tmp_alertlevel > SEC_LEVEL_AMBER)
|
||||
tmp_alertlevel = SEC_LEVEL_AMBER //Cannot engage delta with this
|
||||
set_security_level(tmp_alertlevel)
|
||||
if(GLOB.security_level != old_level)
|
||||
//Only notify people if an actual change happened
|
||||
@@ -548,6 +552,7 @@
|
||||
if(GLOB.security_level == SEC_LEVEL_DELTA)
|
||||
dat += "<font color='red'><b>The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate.</b></font>"
|
||||
else
|
||||
dat += "<A HREF='?src=[REF(src)];operation=securitylevel;newalertlevel=[SEC_LEVEL_AMBER]'>Amber</A><BR>"
|
||||
dat += "<A HREF='?src=[REF(src)];operation=securitylevel;newalertlevel=[SEC_LEVEL_BLUE]'>Blue</A><BR>"
|
||||
dat += "<A HREF='?src=[REF(src)];operation=securitylevel;newalertlevel=[SEC_LEVEL_GREEN]'>Green</A>"
|
||||
if(STATE_CONFIRM_LEVEL)
|
||||
@@ -690,6 +695,7 @@
|
||||
if(GLOB.security_level == SEC_LEVEL_DELTA)
|
||||
dat += "<font color='red'><b>The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate.</b></font>"
|
||||
else
|
||||
dat += "<A HREF='?src=[REF(src)];operation=ai-securitylevel;newalertlevel=[SEC_LEVEL_AMBER]'>Amber</A><BR>"
|
||||
dat += "<A HREF='?src=[REF(src)];operation=ai-securitylevel;newalertlevel=[SEC_LEVEL_BLUE]'>Blue</A><BR>"
|
||||
dat += "<A HREF='?src=[REF(src)];operation=ai-securitylevel;newalertlevel=[SEC_LEVEL_GREEN]'>Green</A>"
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "jukebox"
|
||||
verb_say = "states"
|
||||
density = TRUE
|
||||
req_access = list(ACCESS_BAR)
|
||||
req_one_access = list(ACCESS_BAR, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_ENGINE, ACCESS_CARGO, ACCESS_THEATRE)
|
||||
var/active = FALSE
|
||||
var/list/rangers = list()
|
||||
var/stop = 0
|
||||
|
||||
@@ -327,7 +327,11 @@
|
||||
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
|
||||
var/turf/location = get_turf(src)
|
||||
//add_blood doesn't work for borgs/xenos, but add_blood_floor does.
|
||||
L.add_splatter_floor(location)
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.bleed(DOOR_CRUSH_DAMAGE)
|
||||
else
|
||||
L.add_splatter_floor(location)
|
||||
for(var/obj/mecha/M in get_turf(src))
|
||||
M.take_damage(DOOR_CRUSH_DAMAGE)
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
/obj/machinery/suit_storage_unit/engine
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/engine
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type= /obj/item/clothing/shoes/magboots
|
||||
|
||||
/obj/machinery/suit_storage_unit/ce
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite
|
||||
|
||||
@@ -275,6 +275,18 @@
|
||||
variance = 25
|
||||
harmful = TRUE
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/seedscatter
|
||||
name = "\improper Melon Seed \"Scattershot\""
|
||||
desc = "A weapon for combat exosuits. Shoots a spread of pellets, shaped as seed."
|
||||
icon_state = "mecha_scatter"
|
||||
equip_cooldown = 30
|
||||
projectile = /obj/item/projectile/bullet/seed
|
||||
projectiles = 4
|
||||
projectile_energy_cost = 55
|
||||
projectiles_per_shot = 10
|
||||
variance = 20
|
||||
harmful = TRUE
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
|
||||
name = "\improper Ultra AC 2"
|
||||
desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst."
|
||||
|
||||
@@ -56,6 +56,8 @@ would spawn and follow the beaker, even if it is carried or thrown.
|
||||
/datum/effect_system/proc/generate_effect()
|
||||
if(holder)
|
||||
location = get_turf(holder)
|
||||
if(location.contents.len > 200) //Bandaid to prevent server crash exploit
|
||||
return
|
||||
var/obj/effect/E = new effect_type(location)
|
||||
total_effects++
|
||||
var/direction
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
for(var/turf/open/floor/earth in view(3,src))
|
||||
if(is_type_in_typecache(earth, blacklisted_glowshroom_turfs))
|
||||
continue
|
||||
if(!ownturf.CanAtmosPass(earth))
|
||||
if(!disease_air_spread_walk(ownturf, earth))
|
||||
continue
|
||||
if(spreadsIntoAdjacent || !locate(/obj/structure/glowshroom) in view(1,earth))
|
||||
possibleLocs += earth
|
||||
|
||||
@@ -536,12 +536,16 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own
|
||||
. = ..(target, range, speed, thrower, spin, diagonals_first, callback)
|
||||
|
||||
|
||||
/obj/item/proc/after_throw(datum/callback/callback)
|
||||
if (callback) //call the original callback
|
||||
. = callback.Invoke()
|
||||
throw_speed = initial(throw_speed) //explosions change this.
|
||||
item_flags &= ~IN_INVENTORY
|
||||
var/matrix/M = matrix(transform)
|
||||
M.Turn(rand(-170, 170))
|
||||
transform = M
|
||||
pixel_x = rand(-8, 8)
|
||||
pixel_y = rand(-8, 8)
|
||||
|
||||
/obj/item/proc/remove_item_from_storage(atom/newLoc) //please use this if you're going to snowflake an item out of a obj/item/storage
|
||||
if(!newLoc)
|
||||
|
||||
@@ -36,6 +36,7 @@ RLD
|
||||
var/no_ammo_message = "<span class='warning'>The \'Low Ammo\' light on the device blinks yellow.</span>"
|
||||
var/has_ammobar = FALSE //controls whether or not does update_icon apply ammo indicator overlays
|
||||
var/ammo_sections = 10 //amount of divisions in the ammo indicator overlay/number of ammo indicator states
|
||||
var/custom_range = 7
|
||||
|
||||
/obj/item/construction/Initialize()
|
||||
. = ..()
|
||||
@@ -75,6 +76,10 @@ RLD
|
||||
loaded = loadwithsheets(W, plasmarglassmultiplier*sheetmultiplier, user) //8 matter for one plasma rglass sheet
|
||||
else if(istype(W, /obj/item/stack/sheet/rglass))
|
||||
loaded = loadwithsheets(W, rglassmultiplier*sheetmultiplier, user) //6 matter for one rglass sheet
|
||||
else if(istype(W, /obj/item/stack/rods))
|
||||
loaded = loadwithsheets(W, sheetmultiplier * 0.5, user) // 2 matter for 1 rod, as 2 rods are produced from 1 metal
|
||||
else if(istype(W, /obj/item/stack/tile/plasteel))
|
||||
loaded = loadwithsheets(W, sheetmultiplier * 0.25, user) // 1 matter for 1 floortile, as 4 tiles are produced from 1 metal
|
||||
if(loaded)
|
||||
to_chat(user, "<span class='notice'>[src] now holds [matter]/[max_matter] matter-units.</span>")
|
||||
else
|
||||
@@ -119,7 +124,7 @@ RLD
|
||||
return .
|
||||
|
||||
/obj/item/construction/proc/range_check(atom/A, mob/user)
|
||||
if(!(A in view(7, get_turf(user))))
|
||||
if(!(A in range(custom_range, get_turf(user))))
|
||||
to_chat(user, "<span class='warning'>The \'Out of Range\' light on [src] blinks red.</span>")
|
||||
return FALSE
|
||||
else
|
||||
@@ -445,13 +450,23 @@ RLD
|
||||
matter = 160
|
||||
|
||||
/obj/item/construction/rcd/combat
|
||||
name = "industrial RCD"
|
||||
name = "Combat RCD"
|
||||
desc = "A device used to rapidly build and deconstruct. Reload with metal, plasteel, glass or compressed matter cartridges. This RCD has been upgraded to be able to remove Rwalls!"
|
||||
icon_state = "ircd"
|
||||
item_state = "ircd"
|
||||
max_matter = 500
|
||||
matter = 500
|
||||
canRturf = TRUE
|
||||
|
||||
/obj/item/construction/rcd/industrial
|
||||
name = "industrial RCD"
|
||||
icon_state = "ircd"
|
||||
item_state = "ircd"
|
||||
max_matter = 500
|
||||
matter = 500
|
||||
delay_mod = 0.6
|
||||
sheetmultiplier = 8
|
||||
|
||||
/obj/item/rcd_ammo
|
||||
name = "compressed matter cartridge"
|
||||
desc = "Highly compressed matter for the RCD."
|
||||
@@ -464,6 +479,8 @@ RLD
|
||||
var/ammoamt = 40
|
||||
|
||||
/obj/item/rcd_ammo/large
|
||||
name = "large compressed matter cartridge"
|
||||
desc = "Highly compressed matter for the RCD. Has four times the matter packed into the same space as a normal cartridge."
|
||||
materials = list(MAT_METAL=48000, MAT_GLASS=32000)
|
||||
ammoamt = 160
|
||||
|
||||
@@ -509,8 +526,9 @@ RLD
|
||||
icon_state = "rld-5"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
matter = 200
|
||||
max_matter = 200
|
||||
matter = 500
|
||||
max_matter = 500
|
||||
sheetmultiplier = 16
|
||||
var/mode = LIGHT_MODE
|
||||
actions_types = list(/datum/action/item_action/pick_color)
|
||||
|
||||
@@ -521,7 +539,7 @@ RLD
|
||||
|
||||
var/walldelay = 10
|
||||
var/floordelay = 10
|
||||
var/decondelay = 15
|
||||
var/decondelay = 10
|
||||
|
||||
var/color_choice = null
|
||||
|
||||
|
||||
@@ -8,72 +8,70 @@
|
||||
item_state = "candle1"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
light_color = LIGHT_COLOR_FIRE
|
||||
heat = 1000
|
||||
var/wax = 1000
|
||||
var/lit = FALSE
|
||||
var/infinite = FALSE
|
||||
var/start_lit = FALSE
|
||||
heat = 1000
|
||||
|
||||
/obj/item/candle/Initialize()
|
||||
. = ..()
|
||||
if(start_lit)
|
||||
// No visible message
|
||||
light(show_message = FALSE)
|
||||
light()
|
||||
|
||||
/obj/item/candle/update_icon()
|
||||
var/i
|
||||
if(wax>750)
|
||||
i = 1
|
||||
else if(wax>400)
|
||||
i = 2
|
||||
else i = 3
|
||||
icon_state = "candle[i][lit ? "_lit" : ""]"
|
||||
|
||||
icon_state = "candle[(wax > 400) ? ((wax > 750) ? 1 : 2) : 3][lit ? "_lit" : ""]"
|
||||
|
||||
/obj/item/candle/attackby(obj/item/W, mob/user, params)
|
||||
..()
|
||||
var/msg = W.ignition_effect(src, user)
|
||||
if(msg)
|
||||
light(msg)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/candle/fire_act(exposed_temperature, exposed_volume)
|
||||
if(!src.lit)
|
||||
if(!lit)
|
||||
light() //honk
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/candle/is_hot()
|
||||
return lit * heat
|
||||
|
||||
/obj/item/candle/proc/light(show_message)
|
||||
if(!src.lit)
|
||||
src.lit = TRUE
|
||||
//src.damtype = "fire"
|
||||
if(!lit)
|
||||
lit = TRUE
|
||||
if(show_message)
|
||||
usr.visible_message(show_message)
|
||||
set_light(CANDLE_LUMINOSITY, 0.8)
|
||||
set_light(CANDLE_LUMINOSITY)
|
||||
START_PROCESSING(SSobj, src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/candle/proc/put_out_candle()
|
||||
if(!lit)
|
||||
return
|
||||
lit = FALSE
|
||||
update_icon()
|
||||
set_light(0)
|
||||
return TRUE
|
||||
|
||||
/obj/item/candle/extinguish()
|
||||
put_out_candle()
|
||||
return ..()
|
||||
|
||||
/obj/item/candle/process()
|
||||
if(!lit)
|
||||
return
|
||||
return PROCESS_KILL
|
||||
if(!infinite)
|
||||
wax--
|
||||
if(!wax)
|
||||
new/obj/item/trash/candle(src.loc)
|
||||
new /obj/item/trash/candle(loc)
|
||||
qdel(src)
|
||||
update_icon()
|
||||
open_flame()
|
||||
|
||||
/obj/item/candle/attack_self(mob/user)
|
||||
if(lit)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] snuffs [src].</span>")
|
||||
lit = FALSE
|
||||
update_icon()
|
||||
set_light(0)
|
||||
|
||||
/obj/item/candle/is_hot()
|
||||
return lit * heat
|
||||
|
||||
if(put_out_candle())
|
||||
user.visible_message("<span class='notice'>[user] snuffs [src].</span>")
|
||||
|
||||
/obj/item/candle/infinite
|
||||
infinite = TRUE
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
/obj/item/flashlight/attack_self(mob/user)
|
||||
on = !on
|
||||
update_brightness(user)
|
||||
playsound(user, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, 1)
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
@@ -42,6 +42,18 @@
|
||||
sprite_name = "miniFE"
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/extinguisher/mini/family
|
||||
name = "pocket fire extinguisher"
|
||||
desc = "A old fashen pocket fire extinguisher that has been modified with a larger water tank, and a small high-power sprayer. It feels cool to the touch and has a small humming to it..."
|
||||
icon_state = "miniFE0"
|
||||
item_state = "miniFE"
|
||||
throwforce = 1
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 2
|
||||
max_water = 40
|
||||
power = 7
|
||||
cooling_power = 3
|
||||
|
||||
/obj/item/extinguisher/Initialize()
|
||||
. = ..()
|
||||
create_reagents(max_water)
|
||||
@@ -215,7 +227,7 @@
|
||||
repetition++
|
||||
addtimer(CALLBACK(src, /obj/item/extinguisher/proc/move_chair, B, movementdirection, repetition), timer_seconds)
|
||||
|
||||
/obj/item/extinguisher/AltClick(mob/user)
|
||||
/obj/item/extinguisher/screwdriver_act(mob/user, obj/item/tool)
|
||||
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
return
|
||||
EmptyExtinguisher(user)
|
||||
@@ -230,3 +242,4 @@
|
||||
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
|
||||
|
||||
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "<span class='info'>You quietly empty out \the [src] using its release valve.</span>")
|
||||
|
||||
|
||||
@@ -82,6 +82,8 @@
|
||||
addtimer(CALLBACK(src, .proc/prime), isnull(delayoverride)? det_time : delayoverride)
|
||||
|
||||
/obj/item/grenade/proc/prime()
|
||||
var/turf/T = get_turf(src)
|
||||
log_game("Grenade detonation at [AREACOORD(T)], location [loc]")
|
||||
|
||||
/obj/item/grenade/proc/update_mob()
|
||||
if(ismob(loc))
|
||||
|
||||
@@ -11,12 +11,45 @@
|
||||
strip_delay = 80
|
||||
dog_fashion = null
|
||||
|
||||
// CITADEL CHANGES: More variants
|
||||
/obj/item/clothing/head/helmet/chaplain/bland
|
||||
icon_state = "knight_generic"
|
||||
item_state = "knight_generic"
|
||||
|
||||
/obj/item/clothing/head/helmet/chaplain/bland/horned
|
||||
name = "horned crusader helmet"
|
||||
desc = "Helfen, Wehren, Heilen."
|
||||
icon_state = "knight_horned"
|
||||
item_state = "knight_horned"
|
||||
|
||||
/obj/item/clothing/head/helmet/chaplain/bland/winged
|
||||
name = "winged crusader helmet"
|
||||
desc = "Helfen, Wehren, Heilen."
|
||||
icon_state = "knight_winged"
|
||||
item_state = "knight_winged"
|
||||
// CITADEL CHANGES ENDS HERE
|
||||
|
||||
/obj/item/clothing/suit/armor/riot/chaplain
|
||||
name = "crusader armour"
|
||||
desc = "God wills it!"
|
||||
icon_state = "knight_templar"
|
||||
item_state = "knight_templar"
|
||||
|
||||
// CITADEL CHANGES: More variants
|
||||
/obj/item/clothing/suit/armor/riot/chaplain/teutonic
|
||||
desc = "Help, Defend, Heal!"
|
||||
icon_state = "knight_teutonic"
|
||||
item_state = "knight_teutonic"
|
||||
|
||||
/obj/item/clothing/suit/armor/riot/chaplain/teutonic/alt
|
||||
icon_state = "knight_teutonic_alt"
|
||||
item_state = "knight_teutonic_alt"
|
||||
|
||||
/obj/item/clothing/suit/armor/riot/chaplain/hospitaller
|
||||
icon_state = "knight_hospitaller"
|
||||
item_state = "knight_hospitaller"
|
||||
// CITADEL CHANGES ENDS HERE
|
||||
|
||||
/obj/item/holybeacon
|
||||
name = "armaments beacon"
|
||||
desc = "Contains a set of armaments for the chaplain."
|
||||
@@ -60,6 +93,22 @@
|
||||
new /obj/item/clothing/head/helmet/chaplain(src)
|
||||
new /obj/item/clothing/suit/armor/riot/chaplain(src)
|
||||
|
||||
// CITADEL CHANGES: More Variants
|
||||
/obj/item/storage/box/holy/teutonic
|
||||
name = "Teutonic Kit"
|
||||
|
||||
/obj/item/storage/box/holy/teutonic/PopulateContents() // It just works
|
||||
pick(new /obj/item/clothing/head/helmet/chaplain/bland/horned(src), new /obj/item/clothing/head/helmet/chaplain/bland/winged(src))
|
||||
pick(new /obj/item/clothing/suit/armor/riot/chaplain/teutonic(src), new /obj/item/clothing/suit/armor/riot/chaplain/teutonic/alt(src))
|
||||
|
||||
/obj/item/storage/box/holy/hospitaller
|
||||
name = "Hospitaller Kit"
|
||||
|
||||
/obj/item/storage/box/holy/hospitaller/PopulateContents()
|
||||
new /obj/item/clothing/head/helmet/chaplain/bland(src)
|
||||
new /obj/item/clothing/suit/armor/riot/chaplain/hospitaller(src)
|
||||
// CITADEL CHANGES ENDS HERE
|
||||
|
||||
/obj/item/storage/box/holy/student
|
||||
name = "Profane Scholar Kit"
|
||||
|
||||
@@ -210,7 +259,7 @@
|
||||
if(QDELETED(src) || !choice || M.stat || !in_range(M, src) || M.restrained() || !M.canmove || reskinned)
|
||||
return
|
||||
|
||||
var/A = display_names[choice] // This needs to be on a separate var as list member access is not allowed for new
|
||||
var/A = display_names[choice] // This needs to be on a separate var as list member access is not allowed for new
|
||||
holy_weapon = new A
|
||||
|
||||
SSreligion.holy_weapon_type = holy_weapon.type
|
||||
|
||||
@@ -29,8 +29,12 @@
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/rev/head) || target.mind.unconvertable)
|
||||
if(!silent)
|
||||
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
|
||||
var/obj/item/implanter/I = loc
|
||||
removed(target, 1)
|
||||
qdel(src)
|
||||
if(istype(I))
|
||||
I.imp = null
|
||||
I.update_icon()
|
||||
return FALSE
|
||||
|
||||
var/datum/antagonist/rev/rev = target.mind.has_antag_datum(/datum/antagonist/rev)
|
||||
|
||||
@@ -176,3 +176,12 @@
|
||||
user.visible_message("<span class='suicide'>[user] begins flattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return BRUTELOSS
|
||||
/* Trays moved to /obj/item/storage/bag */
|
||||
|
||||
/obj/item/kitchen/knife/scimitar
|
||||
name = "Scimitar knife"
|
||||
desc = "A knife used to cleanly butcher. Its razor-sharp edge has been honed for butchering, but has been poorly maintained over the years."
|
||||
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/kitchen/knife/scimiar/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 90 - force, 100, force - 60) //bonus chance increases depending on force
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
var/mopping = 0
|
||||
var/mopcount = 0
|
||||
var/mopcap = 5
|
||||
var/mopspeed = 30
|
||||
var/stamusage = 5
|
||||
force_string = "robust... against germs"
|
||||
var/insertable = TRUE
|
||||
|
||||
@@ -39,6 +39,12 @@
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
var/mob/living/L = user
|
||||
|
||||
if(istype(L) && L.getStaminaLoss() >= STAMINA_SOFTCRIT)
|
||||
to_chat(user, "<span class='danger'>You're too exhausted for that.</span>")
|
||||
return
|
||||
|
||||
if(reagents.total_volume < 1)
|
||||
to_chat(user, "<span class='warning'>Your mop is dry!</span>")
|
||||
return
|
||||
@@ -49,11 +55,13 @@
|
||||
return
|
||||
|
||||
if(T)
|
||||
user.visible_message("[user] begins to clean \the [T] with [src].", "<span class='notice'>You begin to clean \the [T] with [src]...</span>")
|
||||
|
||||
if(do_after(user, src.mopspeed, target = T))
|
||||
to_chat(user, "<span class='notice'>You finish mopping.</span>")
|
||||
clean(T)
|
||||
user.visible_message("[user] cleans \the [T] with [src].", "<span class='notice'>You clean \the [T] with [src].</span>")
|
||||
clean(T)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(T, used_item = src)
|
||||
if(istype(L))
|
||||
L.adjustStaminaLossBuffered(stamusage)
|
||||
playsound(T, "slosh", 50, 1)
|
||||
|
||||
|
||||
/obj/effect/attackby(obj/item/I, mob/user, params)
|
||||
@@ -86,7 +94,7 @@
|
||||
force = 6
|
||||
throwforce = 8
|
||||
throw_range = 4
|
||||
mopspeed = 20
|
||||
stamusage = 2
|
||||
var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water.
|
||||
var/refill_rate = 1 //Rate per process() tick mop refills itself
|
||||
var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING
|
||||
|
||||
@@ -56,22 +56,34 @@
|
||||
icon_state = "paint_neutral"
|
||||
|
||||
/obj/item/paint/anycolor/attack_self(mob/user)
|
||||
var/t1 = input(user, "Please select a color:", "Locking Computer", null) in list( "red", "blue", "green", "yellow", "violet", "black", "white")
|
||||
var/t1 = input(user, "Please select a color:", "Locking Computer", null) in list( "red", "pink", "blue", "cyan", "green", "lime", "yellow", "orange", "violet", "purple", "black", "gray", "white")
|
||||
if ((user.get_active_held_item() != src || user.stat || user.restrained()))
|
||||
return
|
||||
switch(t1)
|
||||
if("red")
|
||||
item_color = "C73232"
|
||||
if("pink")
|
||||
item_color = "FFC0CD"
|
||||
if("blue")
|
||||
item_color = "5998FF"
|
||||
if("cyan")
|
||||
item_color = "00FFFF"
|
||||
if("green")
|
||||
item_color = "2A9C3B"
|
||||
if("lime")
|
||||
item_color = "00FF00"
|
||||
if("yellow")
|
||||
item_color = "CFB52B"
|
||||
if("orange")
|
||||
item_color = "fFA700"
|
||||
if("violet")
|
||||
item_color = "AE4CCD"
|
||||
if("purple")
|
||||
item_color = "800080"
|
||||
if("white")
|
||||
item_color = "FFFFFF"
|
||||
if("gray")
|
||||
item_color = "808080"
|
||||
if("black")
|
||||
item_color = "333333"
|
||||
icon_state = "paint_[t1]"
|
||||
|
||||
@@ -359,6 +359,16 @@
|
||||
if(mood_message)
|
||||
desc += mood_message
|
||||
|
||||
/obj/item/toy/plush/random
|
||||
name = "Illegal plushie"
|
||||
desc = "Something fucked up"
|
||||
|
||||
/obj/item/toy/plush/random/Initialize()
|
||||
..()
|
||||
var/newtype = pick(subtypesof(/obj/item/toy/plush))
|
||||
new newtype(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/toy/plush/carpplushie
|
||||
name = "space carp plushie"
|
||||
desc = "An adorable stuffed toy that resembles a space carp."
|
||||
@@ -486,13 +496,87 @@
|
||||
attack_verb = list("clawed", "hissed", "tail slapped")
|
||||
squeak_override = list('sound/weapons/slash.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/durgit
|
||||
icon_state = "durgit"
|
||||
item_state = "durgit"
|
||||
squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1) //Durgit's the origin of the sound
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/rio
|
||||
icon_state = "rio"
|
||||
item_state = "rio"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/dan
|
||||
icon_state = "dan"
|
||||
item_state = "dan"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/urinsu
|
||||
icon_state = "urinsu"
|
||||
item_state = "urinsu"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/arfrehn
|
||||
icon_state = "arfrehn"
|
||||
item_state = "arfrehn"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/soars
|
||||
icon_state = "soars"
|
||||
item_state = "soars"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/ghostie
|
||||
icon_state = "ghostie"
|
||||
item_state = "ghostie"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/amber
|
||||
icon_state = "amber"
|
||||
item_state = "amber"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/cyan
|
||||
icon_state = "cyan"
|
||||
item_state = "cyan"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/meena
|
||||
icon_state = "meena"
|
||||
item_state = "meena"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/stalks
|
||||
icon_state = "stalks"
|
||||
item_state = "stalks"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/kobold
|
||||
icon_state = "kobold"
|
||||
item_state = "kobold"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/gorgi
|
||||
icon_state = "gorgi"
|
||||
item_state = "gorgi"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/almaz
|
||||
icon_state = "almaz"
|
||||
item_state = "almaz"
|
||||
squeak_override = list('modular_citadel/sound/voice/raptor_purr.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/snakeplushie
|
||||
name = "snake plushie"
|
||||
desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing."
|
||||
icon_state = "plushie_snake"
|
||||
item_state = "plushie_snake"
|
||||
attack_verb = list("bitten", "hissed", "tail slapped")
|
||||
squeak_override = list('sound/weapons/bite.ogg' = 1)
|
||||
squeak_override = list('modular_citadel/sound/voice/hiss.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/snakeplushie/sasha
|
||||
icon_state = "sasha"
|
||||
item_state = "sasha"
|
||||
|
||||
/obj/item/toy/plush/snakeplushie/shay
|
||||
icon_state = "shay"
|
||||
item_state = "shay"
|
||||
|
||||
/obj/item/toy/plush/snakeplushie/vulken
|
||||
icon_state = "vulken"
|
||||
item_state = "vulken"
|
||||
|
||||
/obj/item/toy/plush/snakeplushie/jecca
|
||||
icon_state = "jecca"
|
||||
item_state = "jecca"
|
||||
|
||||
/obj/item/toy/plush/nukeplushie
|
||||
name = "operative plushie"
|
||||
@@ -517,6 +601,253 @@
|
||||
icon_state = "plushie_awake"
|
||||
item_state = "plushie_awake"
|
||||
|
||||
/obj/item/toy/plush/mothplushie
|
||||
name = "insect plushie"
|
||||
desc = "An adorable stuffed toy that resembles some kind of insect"
|
||||
icon_state = "cydia"
|
||||
item_state = "cydia"
|
||||
squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mothplushie/bumble
|
||||
icon_state = "bumble"
|
||||
item_state = "bumble"
|
||||
|
||||
/obj/item/toy/plush/mothplushie/nameko
|
||||
icon_state = "nameko"
|
||||
item_state = "nameko"
|
||||
|
||||
/obj/item/toy/plush/mothplushie/suru
|
||||
icon_state = "suru"
|
||||
item_state = "suru"
|
||||
|
||||
/obj/item/toy/plush/xeno
|
||||
name = "xenohybrid plushie"
|
||||
desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember."
|
||||
icon_state = "seras"
|
||||
item_state = "seras"
|
||||
squeak_override = list('sound/voice/hiss2.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/lampplushie
|
||||
name = "lamp plushie"
|
||||
desc = "A toy lamp plushie, doesn't actually make light, but it still toggles on and off. Click clack!"
|
||||
icon_state = "plushie_lamp"
|
||||
item_state = "plushie_lamp"
|
||||
attack_verb = list("lit", "flickered", "flashed")
|
||||
squeak_override = list('sound/weapons/magout.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/borgplushie
|
||||
name = "robot plushie"
|
||||
desc = "An adorable stuffed toy of a robot."
|
||||
icon_state = "securityk9"
|
||||
item_state = "securityk9"
|
||||
attack_verb = list("beeped", "booped", "pinged")
|
||||
squeak_override = list('sound/machines/beep.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/borgplushie/medihound
|
||||
icon_state = "medihound"
|
||||
item_state = "medihound"
|
||||
|
||||
/obj/item/toy/plush/borgplushie/scrubpuppy
|
||||
icon_state = "scrubpuppy"
|
||||
item_state = "scrubpuppy"
|
||||
|
||||
/obj/item/toy/plush/borgplushie/seeking
|
||||
icon_state = "seeking"
|
||||
item_state = "seeking"
|
||||
|
||||
/obj/item/toy/plush/borgplushie/neeb
|
||||
icon_state = "neeb"
|
||||
item_state = "neeb"
|
||||
|
||||
/obj/item/toy/plush/bird
|
||||
name = "bird plushie"
|
||||
desc = "An adorable stuffed plushie that resembles an avian."
|
||||
icon_state = "sylas"
|
||||
item_state = "sylas"
|
||||
attack_verb = list("peeped", "beeped", "poofed")
|
||||
squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/bird/esela
|
||||
icon_state = "esela"
|
||||
item_state = "esela"
|
||||
|
||||
/obj/item/toy/plush/bird/jahonna
|
||||
icon_state = "jahonna"
|
||||
item_state = "jahonna"
|
||||
|
||||
/obj/item/toy/plush/bird/krick
|
||||
icon_state = "krick"
|
||||
item_state = "krick"
|
||||
|
||||
/obj/item/toy/plush/bird/birddi
|
||||
icon_state = "birddi"
|
||||
item_state = "birddi"
|
||||
|
||||
/obj/item/toy/plush/bird/jewel
|
||||
icon_state = "jewel"
|
||||
item_state = "jewel"
|
||||
|
||||
/obj/item/toy/plush/sergal
|
||||
name = "sergal plushie"
|
||||
desc = "An adorable stuffed plushie that resembles a sagaru."
|
||||
icon_state = "faux"
|
||||
item_state = "faux"
|
||||
squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/sergal/gladwyn
|
||||
icon_state = "gladwyn"
|
||||
item_state = "gladwyn"
|
||||
|
||||
/obj/item/toy/plush/sergal/jermaine
|
||||
icon_state = "jermaine"
|
||||
item_state = "jermaine"
|
||||
|
||||
/obj/item/toy/plush/mammal
|
||||
name = "mammal plushie"
|
||||
desc = "An adorable stuffed toy resembling some sort of crew member."
|
||||
icon_state = "dubious"
|
||||
item_state = "dubious"
|
||||
|
||||
/obj/item/toy/plush/mammal/gavin
|
||||
icon_state = "gavin"
|
||||
item_state = "gavin"
|
||||
|
||||
/obj/item/toy/plush/mammal/blep
|
||||
icon_state = "blep"
|
||||
item_state = "blep"
|
||||
|
||||
/obj/item/toy/plush/mammal/circe
|
||||
icon_state = "circe"
|
||||
item_state = "circe"
|
||||
|
||||
/obj/item/toy/plush/mammal/robin
|
||||
icon_state = "robin"
|
||||
item_state = "robin"
|
||||
|
||||
/obj/item/toy/plush/mammal/pavel
|
||||
icon_state = "pavel"
|
||||
item_state = "pavel"
|
||||
|
||||
/obj/item/toy/plush/mammal/oten
|
||||
icon_state = "oten"
|
||||
item_state = "oten"
|
||||
|
||||
/obj/item/toy/plush/mammal/ray
|
||||
icon_state = "ray"
|
||||
item_state = "ray"
|
||||
|
||||
/obj/item/toy/plush/mammal/dawud
|
||||
icon_state = "dawud"
|
||||
item_state = "dawud"
|
||||
|
||||
/obj/item/toy/plush/mammal/edgar
|
||||
icon_state = "edgar"
|
||||
item_state = "edgar"
|
||||
|
||||
/obj/item/toy/plush/mammal/frank
|
||||
icon_state = "frank"
|
||||
item_state = "frank"
|
||||
|
||||
/obj/item/toy/plush/mammal/poojawa
|
||||
icon_state = "poojawa"
|
||||
item_state = "poojawa"
|
||||
|
||||
/obj/item/toy/plush/mammal/hazel
|
||||
icon_state = "hazel"
|
||||
item_state = "hazel"
|
||||
|
||||
/obj/item/toy/plush/mammal/joker
|
||||
icon_state = "joker"
|
||||
item_state = "joker"
|
||||
|
||||
/obj/item/toy/plush/mammal/gunther
|
||||
icon_state = "gunther"
|
||||
item_state = "gunther"
|
||||
|
||||
/obj/item/toy/plush/mammal/fox
|
||||
icon_state = "fox"
|
||||
item_state = "fox"
|
||||
|
||||
/obj/item/toy/plush/mammal/rae
|
||||
desc = "An adorable stuffed toy of an artic fox."
|
||||
icon_state = "rae"
|
||||
item_state = "rae"
|
||||
|
||||
/obj/item/toy/plush/mammal/zed
|
||||
icon_state = "zed"
|
||||
item_state = "zed"
|
||||
|
||||
/obj/item/toy/plush/mammal/dog
|
||||
desc = "An adorable stuffed toy that resembles a canine."
|
||||
icon_state = "katlin"
|
||||
item_state = "katlin"
|
||||
attack_verb = list("barked", "boofed", "borked")
|
||||
squeak_override = list(
|
||||
'modular_citadel/sound/voice/bark1.ogg' = 1,
|
||||
'modular_citadel/sound/voice/bark2.ogg' = 1
|
||||
)
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/frost
|
||||
icon_state = "frost"
|
||||
item_state = "frost"
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/atticus
|
||||
icon_state = "atticus"
|
||||
item_state = "atticus"
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/fletch
|
||||
icon_state = "fletch"
|
||||
item_state = "fletch"
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/vincent
|
||||
icon_state = "vincent"
|
||||
item_state = "vincent"
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/zigfried
|
||||
desc = "An adorable stuffed toy of a very good boy."
|
||||
icon_state = "zigfried"
|
||||
item_state = "zigfried"
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/nikolai
|
||||
icon_state = "nikolai"
|
||||
item_state = "nikolai"
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/flynn
|
||||
icon_state = "flynn"
|
||||
item_state = "flynn"
|
||||
|
||||
/obj/item/toy/plush/catgirl
|
||||
name = "feline plushie"
|
||||
desc = "An adorable stuffed toy that resembles a feline."
|
||||
icon_state = "bailey"
|
||||
item_state = "bailey"
|
||||
attack_verb = list("headbutt", "scritched", "bit")
|
||||
squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/catgirl/mikeel
|
||||
desc = "An adorable stuffed toy of some tauric cat person."
|
||||
icon_state = "mikeel"
|
||||
item_state = "mikeel"
|
||||
|
||||
/obj/item/toy/plush/catgirl/skylar
|
||||
desc = "An adorable stuffed toy that resembles a degenerate."
|
||||
icon_state = "skylar"
|
||||
item_state = "skylar"
|
||||
attack_verb = list("powergamed", "merged", "tabled")
|
||||
squeak_override = list('sound/effects/meow1.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/catgirl/drew
|
||||
icon_state = "drew"
|
||||
item_state = "drew"
|
||||
|
||||
/obj/item/toy/plush/catgirl/fermis
|
||||
name = "medcat plushie"
|
||||
desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people."
|
||||
icon_state = "fermis"
|
||||
item_state = "fermis"
|
||||
attack_verb = list("cuddled", "petpatted", "wigglepurred")
|
||||
squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/awakenedplushie/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/edit_complainer)
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
require_module = 1
|
||||
module_type = /obj/item/robot_module/security
|
||||
//module_type = /obj/item/robot_module/security
|
||||
|
||||
/obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
|
||||
@@ -266,6 +266,9 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
|
||||
if("large")
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
var/matrix/M = matrix(transform)
|
||||
M.Turn(rand(-170, 170))
|
||||
transform = M
|
||||
|
||||
/obj/item/shard/afterattack(atom/A as mob|obj, mob/user, proximity)
|
||||
. = ..()
|
||||
|
||||
@@ -190,8 +190,10 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
|
||||
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
|
||||
new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("plywood chair", /obj/structure/chair/comfy/plywood, 4, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("rustic wooden door", /obj/structure/mineral_door/woodrustic, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
|
||||
@@ -441,6 +441,23 @@
|
||||
new /obj/item/clothing/mask/muzzle(src)
|
||||
new /obj/item/mmi/syndie(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/surgery_adv
|
||||
name = "advanced surgery duffel bag"
|
||||
desc = "A large duffel bag for holding surgical tools. Bears the logo of an advanced med-tech firm."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/surgery_adv/PopulateContents()
|
||||
new /obj/item/hemostat/adv(src)
|
||||
new /obj/item/circular_saw/adv(src)
|
||||
new /obj/item/scalpel/adv(src)
|
||||
new /obj/item/retractor/adv(src)
|
||||
new /obj/item/cautery/adv(src)
|
||||
new /obj/item/surgicaldrill/adv(src)
|
||||
new /obj/item/surgical_drapes(src)
|
||||
new /obj/item/storage/firstaid/tactical(src)
|
||||
new /obj/item/clothing/suit/straight_jacket(src)
|
||||
new /obj/item/clothing/mask/muzzle(src)
|
||||
new /obj/item/mmi/syndie(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/ammo
|
||||
name = "ammunition duffel bag"
|
||||
desc = "A large duffel bag for holding extra weapons ammunition and supplies."
|
||||
|
||||
@@ -168,6 +168,20 @@
|
||||
/obj/item/pinpointer/crew
|
||||
))
|
||||
|
||||
|
||||
/obj/item/storage/belt/medical/surgery_belt_adv
|
||||
name = "surgical supply belt"
|
||||
desc = "A specialized belt designed for holding surgical equipment. It seems to have specific pockets for each and every surgical tool you can think of."
|
||||
|
||||
/obj/item/storage/belt/medical/surgery_belt_adv/PopulateContents()
|
||||
new /obj/item/hemostat/adv(src)
|
||||
new /obj/item/circular_saw/adv(src)
|
||||
new /obj/item/scalpel/adv(src)
|
||||
new /obj/item/retractor/adv(src)
|
||||
new /obj/item/cautery/adv(src)
|
||||
new /obj/item/surgicaldrill/adv(src)
|
||||
new /obj/item/surgical_drapes(src)
|
||||
|
||||
/obj/item/storage/belt/security
|
||||
name = "security belt"
|
||||
desc = "Can hold security gear like handcuffs and flashes."
|
||||
|
||||
@@ -30,6 +30,30 @@
|
||||
/obj/item/storage/briefcase/lawyer
|
||||
folder_path = /obj/item/folder/blue
|
||||
|
||||
/obj/item/storage/briefcase/lawyer/family
|
||||
name = "battered briefcase"
|
||||
desc = "An old briefcase, this one has seen better days in its time. It's clear they don't make them nowadays as good as they used to. The corners are modified with metal trim adding in weight!"
|
||||
|
||||
/obj/item/storage/briefcase/lawyer/family/PopulateContents()
|
||||
new /obj/item/stamp/law(src)
|
||||
new /obj/item/pen/fountain(src)
|
||||
new /obj/item/paper_bin(src)
|
||||
new /obj/item/storage/box/evidence(src)
|
||||
new /obj/item/storage/box/lawyer(src)
|
||||
|
||||
/obj/item/storage/box/lawyer
|
||||
name = "Box of lawyer tools"
|
||||
desc = "A custom made box, full of items used by a Lawyer, all packed into one box!"
|
||||
|
||||
/obj/item/storage/box/lawyer/PopulateContents()
|
||||
new /obj/item/clothing/gloves/color/white(src)
|
||||
new /obj/item/folder/white(src)
|
||||
new /obj/item/clothing/glasses/regular(src)
|
||||
new /obj/item/folder/red(src)
|
||||
new /obj/item/gavelhammer(src)
|
||||
new /obj/item/stack/sheet/cloth(src)
|
||||
new /obj/item/reagent_containers/glass/beaker/waterbottle(src)
|
||||
|
||||
/obj/item/storage/briefcase/lawyer/PopulateContents()
|
||||
new /obj/item/stamp/law(src)
|
||||
..()
|
||||
|
||||
@@ -99,6 +99,26 @@
|
||||
new /obj/item/storage/pill_bottle/charcoal(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
|
||||
/obj/item/storage/firstaid/radbgone
|
||||
name = "radiation treatment kit"
|
||||
desc = "Used to treat minor toxic blood content and major radiation poisoning."
|
||||
icon_state = "antitoxin"
|
||||
item_state = "firstaid-toxin"
|
||||
|
||||
/obj/item/storage/firstaid/radbgone/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins licking the lead paint off \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return TOXLOSS
|
||||
|
||||
/obj/item/storage/firstaid/radbgone/PopulateContents()
|
||||
if(empty)
|
||||
return
|
||||
new /obj/item/reagent_containers/syringe/charcoal(src)
|
||||
new /obj/item/storage/pill_bottle/charcoal(src)
|
||||
new /obj/item/reagent_containers/pill/mutadone(src)
|
||||
new /obj/item/reagent_containers/pill/antirad(src)
|
||||
new /obj/item/reagent_containers/food/drinks/bottle/vodka(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
|
||||
/obj/item/storage/firstaid/o2
|
||||
name = "oxygen deprivation treatment kit"
|
||||
desc = "A box full of oxygen goodies."
|
||||
@@ -191,6 +211,14 @@
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/reagent_containers/pill/charcoal(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/antirad
|
||||
name = "bottle of charcoal pills"
|
||||
desc = "Contains pills used to counter radiation poisoning."
|
||||
|
||||
/obj/item/storage/pill_bottle/anitrad/PopulateContents()
|
||||
for(var/i in 1 to 5)
|
||||
new /obj/item/reagent_containers/pill/antirad(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/epinephrine
|
||||
name = "bottle of epinephrine pills"
|
||||
desc = "Contains pills used to stabilize patients."
|
||||
|
||||
@@ -84,13 +84,6 @@
|
||||
//Citadel change buffed to base levels
|
||||
total_mass = 2
|
||||
|
||||
/obj/item/storage/toolbox/mechanical/old/heirloom/afterattack(atom/A, mob/user, proximity) //Citadel Adds massive buff to machinery destruction
|
||||
. = ..()
|
||||
if(proximity)
|
||||
if(isobj(A))
|
||||
var/obj/O = A
|
||||
O.take_damage(20)
|
||||
|
||||
/obj/item/storage/toolbox/mechanical/old/heirloom/PopulateContents()
|
||||
return
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_items = 4
|
||||
STR.cant_hold = typecacheof(list(/obj/item/screwdriver/power))
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/stack/spacecash,
|
||||
/obj/item/card,
|
||||
|
||||
@@ -1039,6 +1039,7 @@
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "snowball"
|
||||
throwforce = 12 //pelt your enemies to death with lumps of snow
|
||||
damtype = STAMINA
|
||||
|
||||
/obj/item/toy/snowball/afterattack(atom/target as mob|obj|turf|area, mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -192,6 +192,17 @@
|
||||
/obj/structure/chair/comfy/lime
|
||||
color = rgb(255,251,0)
|
||||
|
||||
/obj/structure/chair/comfy/plywood
|
||||
name = "plywood chair"
|
||||
desc = "A relaxing plywood chair."
|
||||
icon_state = "plywood_chair"
|
||||
anchored = FALSE
|
||||
buildstacktype = /obj/item/stack/sheet/mineral/wood
|
||||
buildstackamount = 4
|
||||
|
||||
/obj/structure/chair/comfy/plywood/GetArmrest()
|
||||
return mutable_appearance('icons/obj/chairs.dmi', "plywood_chair_armrest")
|
||||
|
||||
/obj/structure/chair/comfy/shuttle
|
||||
name = "shuttle seat"
|
||||
desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for smoother flights."
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
new /obj/item/door_remote/chief_medical_officer(src)
|
||||
new /obj/item/clothing/neck/petcollar(src)
|
||||
new /obj/item/pet_carrier(src)
|
||||
new /obj/item/storage/belt/medical/surgery_belt_adv(src)
|
||||
new /obj/item/wallframe/defib_mount(src)
|
||||
new /obj/item/circuitboard/machine/techfab/department/medical(src)
|
||||
new /obj/item/storage/photo_album/CMO(src)
|
||||
@@ -99,4 +100,4 @@
|
||||
new /obj/item/storage/box/pillbottles(src)
|
||||
new /obj/item/storage/box/pillbottles(src)
|
||||
new /obj/item/storage/box/medsprays(src)
|
||||
new /obj/item/storage/box/medsprays(src)
|
||||
new /obj/item/storage/box/medsprays(src)
|
||||
|
||||
@@ -63,7 +63,8 @@
|
||||
|
||||
/obj/structure/closet/firecloset/PopulateContents()
|
||||
..()
|
||||
|
||||
if (prob(50))
|
||||
new /obj/item/reagent_containers/hypospray/medipen/firelocker(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/tank/internals/oxygen/red(src)
|
||||
@@ -71,6 +72,9 @@
|
||||
new /obj/item/clothing/head/hardhat/red(src)
|
||||
|
||||
/obj/structure/closet/firecloset/full/PopulateContents()
|
||||
..()
|
||||
if (prob(50))
|
||||
new /obj/item/reagent_containers/hypospray/medipen/firelocker(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/flashlight(src)
|
||||
@@ -132,6 +136,8 @@
|
||||
|
||||
/obj/structure/closet/radiation/PopulateContents()
|
||||
..()
|
||||
if(prob(50))
|
||||
new /obj/item/storage/firstaid/radbgone(src)
|
||||
new /obj/item/geiger_counter(src)
|
||||
new /obj/item/clothing/suit/radiation(src)
|
||||
new /obj/item/clothing/head/radiation(src)
|
||||
@@ -146,18 +152,38 @@
|
||||
|
||||
/obj/structure/closet/bombcloset/PopulateContents()
|
||||
..()
|
||||
if(prob(70))
|
||||
new /obj/item/screwdriver(src)
|
||||
if(prob(50))
|
||||
new /obj/item/multitool(src)
|
||||
if(prob(70))
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/clothing/suit/bomb_suit(src)
|
||||
new /obj/item/clothing/under/color/black(src)
|
||||
new /obj/item/clothing/shoes/sneakers/black(src)
|
||||
new /obj/item/clothing/head/bomb_hood(src)
|
||||
|
||||
/obj/structure/closet/bombcloset/security/PopulateContents()
|
||||
..()
|
||||
if(prob(90))
|
||||
new /obj/item/screwdriver(src)
|
||||
if(prob(70))
|
||||
new /obj/item/multitool(src)
|
||||
if(prob(90))
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/clothing/suit/bomb_suit/security(src)
|
||||
new /obj/item/clothing/under/rank/security(src)
|
||||
new /obj/item/clothing/shoes/jackboots(src)
|
||||
new /obj/item/clothing/head/bomb_hood/security(src)
|
||||
|
||||
/obj/structure/closet/bombcloset/white/PopulateContents()
|
||||
..()
|
||||
if(prob(50))
|
||||
new /obj/item/screwdriver(src)
|
||||
if(prob(20))
|
||||
new /obj/item/multitool(src)
|
||||
if(prob(50))
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/clothing/suit/bomb_suit/white(src)
|
||||
new /obj/item/clothing/under/color/black(src)
|
||||
new /obj/item/clothing/shoes/sneakers/black(src)
|
||||
|
||||
@@ -70,6 +70,13 @@
|
||||
desc = "A towering basalt sculpture of a drake. Cracks run down its surface and parts of it have fallen off."
|
||||
icon_state = "drake_statue_falling"
|
||||
|
||||
/obj/structure/fluff/lightpost
|
||||
name = "lightpost"
|
||||
desc = "A homely lightpost adorned with festive decor."
|
||||
icon = 'icons/obj/2x2.dmi'
|
||||
icon_state = "lightpost"
|
||||
deconstructible = FALSE
|
||||
layer = EDGED_TURF_LAYER
|
||||
|
||||
/obj/structure/fluff/bus
|
||||
name = "bus"
|
||||
@@ -167,3 +174,11 @@
|
||||
desc = "A crudely-made sign with the words 'fok of' written in some sort of red paint."
|
||||
icon = 'icons/obj/fluff.dmi'
|
||||
icon_state = "fokof"
|
||||
|
||||
/obj/structure/fluff/snowlegion
|
||||
name = "snowlegion"
|
||||
desc = "Looks like that weird kid with the tiger plushie has been round here again."
|
||||
icon = 'icons/obj/fluff.dmi'
|
||||
icon_state = "snowlegion"
|
||||
anchored = TRUE
|
||||
deconstructible = FALSE
|
||||
|
||||
@@ -75,7 +75,11 @@
|
||||
L.visible_message("<span class='danger'>[user] slams [L] onto the meat spike!</span>", "<span class='userdanger'>[user] slams you onto the meat spike!</span>", "<span class='italics'>You hear a squishy wet noise.</span>")
|
||||
L.forceMove(drop_location())
|
||||
L.emote("scream")
|
||||
L.add_splatter_floor()
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.bleed(30)
|
||||
else
|
||||
L.add_splatter_floor()
|
||||
L.adjustBruteLoss(30)
|
||||
L.setDir(2)
|
||||
buckle_mob(L, force=1)
|
||||
|
||||
@@ -51,6 +51,20 @@
|
||||
new /obj/item/stack/rods(get_turf(src), number_of_rods)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/lattice/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
if(the_rcd.mode == RCD_FLOORWALL)
|
||||
return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2)
|
||||
|
||||
/obj/structure/lattice/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
if(passed_mode == RCD_FLOORWALL)
|
||||
to_chat(user, "<span class='notice'>You build a floor.</span>")
|
||||
var/turf/T = src.loc
|
||||
if(isspaceturf(T))
|
||||
T.PlaceOnTop(/turf/open/floor/plating)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/lattice/singularity_pull(S, current_size)
|
||||
if(current_size >= STAGE_FOUR)
|
||||
deconstruct()
|
||||
|
||||
@@ -223,6 +223,16 @@
|
||||
max_integrity = 200
|
||||
rad_insulation = RAD_VERY_LIGHT_INSULATION
|
||||
|
||||
/obj/structure/mineral_door/woodrustic
|
||||
name = "rustic wood door"
|
||||
icon_state = "woodrustic"
|
||||
openSound = 'sound/effects/doorcreaky.ogg'
|
||||
closeSound = 'sound/effects/doorcreaky.ogg'
|
||||
sheetType = /obj/item/stack/sheet/mineral/wood
|
||||
sheetAmount = 10
|
||||
max_integrity = 200
|
||||
rad_insulation = RAD_VERY_LIGHT_INSULATION
|
||||
|
||||
/obj/structure/mineral_door/paperframe
|
||||
name = "paper frame door"
|
||||
icon_state = "paperframe"
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
name = "magic mirror"
|
||||
desc = "Turn and face the strange... face."
|
||||
icon_state = "magic_mirror"
|
||||
var/list/races_blacklist = list("skeleton", "agent", "angel", "military_synth", "memezombies", "clockwork golem servant", "android", "synth", "mush")
|
||||
var/list/races_blacklist = list("skeleton", "agent", "angel", "military_synth", "memezombies", "clockwork golem servant", "android", "synth", "mush", "zombie", "memezombie")
|
||||
var/list/choosable_races = list()
|
||||
|
||||
/obj/structure/mirror/magic/New()
|
||||
|
||||
@@ -45,3 +45,12 @@
|
||||
name = "command department"
|
||||
desc = "A direction sign, pointing out which way the Command department is."
|
||||
icon_state = "direction_bridge"
|
||||
|
||||
/obj/structure/sign/directions/bar
|
||||
name = "bar"
|
||||
desc = "A direction sign, pointing out which way the Bar is."
|
||||
icon_state = "direction_bar"
|
||||
/obj/structure/sign/directions/cafe
|
||||
name = "cafe"
|
||||
desc = "A direction sign, pointing out which way the Cafe is."
|
||||
icon_state = "direction_cafe"
|
||||
|
||||
+26
-7
@@ -1,4 +1,4 @@
|
||||
/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE)
|
||||
/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, soundenvwet = -10000, soundenvdry = 0)
|
||||
if(isarea(source))
|
||||
throw EXCEPTION("playsound(): source is an area")
|
||||
return
|
||||
@@ -21,13 +21,16 @@
|
||||
for(var/P in listeners)
|
||||
var/mob/M = P
|
||||
if(get_dist(M, turf_source) <= maxdistance)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
|
||||
for(var/P in SSmobs.dead_players_by_zlevel[z])
|
||||
var/mob/M = P
|
||||
if(get_dist(M, turf_source) <= maxdistance)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
|
||||
|
||||
/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S, envwet = -10000, envdry = 0)
|
||||
/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S, envwet = -10000, envdry = 0, manual_x, manual_y)
|
||||
if(audiovisual_redirect)
|
||||
var/turf/T = get_turf(src)
|
||||
audiovisual_redirect.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, 0, -1000, turf_source.x - T.x, turf_source.y - T.y)
|
||||
if(!client || !can_hear())
|
||||
return
|
||||
|
||||
@@ -49,7 +52,9 @@
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
//sound volume falloff with distance
|
||||
var/distance = get_dist(T, turf_source)
|
||||
var/distance = 0
|
||||
if(!manual_x && !manual_y)
|
||||
distance = get_dist(T, turf_source)
|
||||
|
||||
S.volume -= max(distance - world.view, 0) * 2 //multiplicative falloff to add on top of natural audio falloff.
|
||||
|
||||
@@ -77,9 +82,17 @@
|
||||
if(S.volume <= 0)
|
||||
return //No sound
|
||||
|
||||
var/dx = turf_source.x - T.x // Hearing from the right/left
|
||||
var/dx = 0 // Hearing from the right/left
|
||||
if(!manual_x)
|
||||
dx = turf_source.x - T.x
|
||||
else
|
||||
dx = manual_x
|
||||
S.x = dx
|
||||
var/dz = turf_source.y - T.y // Hearing from infront/behind
|
||||
var/dz = 0 // Hearing from infront/behind
|
||||
if(!manual_x)
|
||||
dz = turf_source.y - T.y
|
||||
else
|
||||
dz = manual_y
|
||||
S.z = dz
|
||||
// The y value is for above your head, but there is no ceiling in 2d spessmens.
|
||||
S.y = 1
|
||||
@@ -200,5 +213,11 @@
|
||||
'sound/vore/prey/death_04.ogg','sound/vore/prey/death_05.ogg','sound/vore/prey/death_06.ogg',
|
||||
'sound/vore/prey/death_07.ogg','sound/vore/prey/death_08.ogg','sound/vore/prey/death_09.ogg',
|
||||
'sound/vore/prey/death_10.ogg')
|
||||
if("clang")
|
||||
soundin = pick('sound/effects/clang1.ogg', 'sound/effects/clang2.ogg')
|
||||
if("clangsmall")
|
||||
soundin = pick('sound/effects/clangsmall1.ogg', 'sound/effects/clangsmall2.ogg')
|
||||
if("slosh")
|
||||
soundin = pick('sound/effects/slosh1.ogg', 'sound/effects/slosh2.ogg')
|
||||
//END OF CIT CHANGES
|
||||
return soundin
|
||||
|
||||
@@ -49,6 +49,14 @@
|
||||
baseturfs = /turf/closed/indestructible/sandstone
|
||||
smooth = SMOOTH_TRUE
|
||||
|
||||
/turf/closed/indestructible/wood
|
||||
name = "wooden wall"
|
||||
desc = "A wall with wooden plating. Stiff."
|
||||
icon = 'icons/turf/walls/wood_wall.dmi'
|
||||
icon_state = "wood"
|
||||
baseturfs = /turf/closed/indestructible/wood
|
||||
smooth = SMOOTH_TRUE
|
||||
|
||||
/turf/closed/indestructible/oldshuttle/corner
|
||||
icon_state = "corner"
|
||||
|
||||
@@ -76,6 +84,7 @@
|
||||
icon = 'icons/turf/walls/riveted.dmi'
|
||||
icon_state = "riveted"
|
||||
smooth = SMOOTH_TRUE
|
||||
explosion_block = INFINITY
|
||||
|
||||
/turf/closed/indestructible/riveted/uranium
|
||||
icon = 'icons/turf/walls/uranium_wall.dmi'
|
||||
|
||||
@@ -49,6 +49,20 @@
|
||||
if(istype(AM))
|
||||
playsound(src,sound,50,1)
|
||||
|
||||
/turf/open/indestructible/cobble/side
|
||||
icon_state = "cobble_side"
|
||||
|
||||
/turf/open/indestructible/cobble/corner
|
||||
icon_state = "cobble_corner"
|
||||
|
||||
/turf/open/indestructible/cobble
|
||||
name = "cobblestone path"
|
||||
desc = "A simple but beautiful path made of various sized stones."
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "cobble"
|
||||
baseturfs = /turf/open/indestructible/cobble
|
||||
tiled_dirt = FALSE
|
||||
|
||||
/turf/open/indestructible/necropolis
|
||||
name = "necropolis floor"
|
||||
desc = "It's regarding you suspiciously."
|
||||
@@ -231,6 +245,10 @@
|
||||
return 0
|
||||
if(C.m_intent == MOVE_INTENT_WALK && (lube&NO_SLIP_WHEN_WALKING))
|
||||
return 0
|
||||
if(ishuman(C) && (lube&NO_SLIP_WHEN_WALKING))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(!H.sprinting && H.getStaminaLoss() >= 20)
|
||||
return 0
|
||||
if(!(lube&SLIDE_ICE))
|
||||
to_chat(C, "<span class='notice'>You slipped[ O ? " on the [O.name]" : ""]!</span>")
|
||||
playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3)
|
||||
|
||||
@@ -126,6 +126,17 @@
|
||||
else
|
||||
to_chat(user, "<span class='danger'>You hit [src], to no effect!</span>")
|
||||
|
||||
/turf/open/floor/plating/foam/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
if(the_rcd.mode == RCD_FLOORWALL)
|
||||
return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1)
|
||||
|
||||
/turf/open/floor/plating/foam/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
if(passed_mode == RCD_FLOORWALL)
|
||||
to_chat(user, "<span class='notice'>You build a floor.</span>")
|
||||
ChangeTurf(/turf/open/floor/plating)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/turf/open/floor/plating/foam/ex_act()
|
||||
..()
|
||||
ScrapeAway()
|
||||
|
||||
@@ -4,11 +4,14 @@
|
||||
#define RANDOM_LOWER_X 50
|
||||
#define RANDOM_LOWER_Y 50
|
||||
|
||||
#define RIVERGEN_SAFETY_LOCK 1000000
|
||||
|
||||
/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/open/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y)
|
||||
var/list/river_nodes = list()
|
||||
var/num_spawned = 0
|
||||
var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z))
|
||||
while(num_spawned < nodes && possible_locs.len)
|
||||
var/safety = 0
|
||||
while(num_spawned < nodes && possible_locs.len && (safety++ < RIVERGEN_SAFETY_LOCK))
|
||||
var/turf/T = pick(possible_locs)
|
||||
var/area/A = get_area(T)
|
||||
if(!istype(A, whitelist_area) || (T.flags_1 & NO_LAVA_GEN_1))
|
||||
@@ -16,7 +19,8 @@
|
||||
else
|
||||
river_nodes += new /obj/effect/landmark/river_waypoint(T)
|
||||
num_spawned++
|
||||
|
||||
|
||||
safety = 0
|
||||
//make some randomly pathing rivers
|
||||
for(var/A in river_nodes)
|
||||
var/obj/effect/landmark/river_waypoint/W = A
|
||||
@@ -30,7 +34,7 @@
|
||||
break
|
||||
var/detouring = 0
|
||||
var/cur_dir = get_dir(cur_turf, target_turf)
|
||||
while(cur_turf != target_turf)
|
||||
while(cur_turf != target_turf && (safety++ < RIVERGEN_SAFETY_LOCK))
|
||||
|
||||
if(detouring) //randomly snake around a bit
|
||||
if(prob(20))
|
||||
|
||||
@@ -26,7 +26,30 @@
|
||||
/turf/open/space/transit/east
|
||||
dir = EAST
|
||||
|
||||
/turf/open/space/transit/Entered(atom/movable/AM, atom/OldLoc)
|
||||
/turf/open/space/transit/border
|
||||
opacity = TRUE
|
||||
|
||||
/turf/open/space/transit/border/south
|
||||
dir = SOUTH
|
||||
|
||||
/turf/open/space/transit/border/north
|
||||
dir = NORTH
|
||||
|
||||
/turf/open/space/transit/border/west
|
||||
dir = WEST
|
||||
|
||||
/turf/open/space/transit/border/east
|
||||
dir = EAST
|
||||
|
||||
/turf/open/space/transit/centcom
|
||||
dir = SOUTH
|
||||
|
||||
/turf/open/space/transit/centcom/Entered(atom/movable/AM, atom/OldLoc)
|
||||
..()
|
||||
if(!locate(/obj/structure/lattice) in src)
|
||||
throw_atom(AM)
|
||||
|
||||
/turf/open/space/transit/border/Entered(atom/movable/AM, atom/OldLoc)
|
||||
..()
|
||||
if(!locate(/obj/structure/lattice) in src)
|
||||
throw_atom(AM)
|
||||
@@ -66,6 +89,8 @@
|
||||
|
||||
var/turf/T = locate(_x, _y, _z)
|
||||
AM.forceMove(T)
|
||||
var/turf/throwturf = get_ranged_target_turf(T, dir, 1)
|
||||
AM.safe_throw_at(throwturf, 1, 4, null, FALSE)
|
||||
|
||||
|
||||
/turf/open/space/transit/CanBuildHere()
|
||||
|
||||
+1
-1
@@ -263,7 +263,7 @@ GLOBAL_VAR(restart_counter)
|
||||
s += "Citadel" //Replace this with something else. Or ever better, delete it and uncomment the game version. CIT CHANGE - modifies the hub entry link
|
||||
s += "</a>"
|
||||
s += ")\]" //CIT CHANGE - encloses the server title in brackets to make the hub entry fancier
|
||||
s += "<br><small><i>That furry /TG/code server your mother warned you about.</i></small><br>" //CIT CHANGE - adds a tagline!
|
||||
s += "<br>[CONFIG_GET(string/servertagline)]<br>" //CIT CHANGE - adds a tagline!
|
||||
|
||||
var/n = 0
|
||||
for (var/mob/M in GLOB.player_list)
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(deathchecks = TRUE)
|
||||
if(real_mind && mind)
|
||||
real_mind.current.audiovisual_redirect = null
|
||||
real_mind.current.ckey = ckey
|
||||
real_mind.current.stop_sound_channel(CHANNEL_HEARTBEAT)
|
||||
if(deathchecks && vr_sleeper)
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
to_chat(occupant, "<span class='warning'>Transferring to virtual reality...</span>")
|
||||
if(vr_human && vr_human.stat == CONSCIOUS && !vr_human.real_mind)
|
||||
SStgui.close_user_uis(occupant, src)
|
||||
human_occupant.audiovisual_redirect = vr_human
|
||||
vr_human.real_mind = human_occupant.mind
|
||||
vr_human.ckey = human_occupant.ckey
|
||||
to_chat(vr_human, "<span class='notice'>Transfer successful! You are now playing as [vr_human] in VR!</span>")
|
||||
@@ -166,11 +167,13 @@
|
||||
vr_human.undershirt = H.undershirt
|
||||
vr_human.underwear = H.underwear
|
||||
vr_human.updateappearance(TRUE, TRUE, TRUE)
|
||||
vr_human.give_genitals(TRUE) //CITADEL ADD
|
||||
if(outfit)
|
||||
var/datum/outfit/O = new outfit()
|
||||
O.equip(vr_human)
|
||||
if(transfer && H.mind)
|
||||
SStgui.close_user_uis(H, src)
|
||||
H.audiovisual_redirect = vr_human
|
||||
vr_human.ckey = H.ckey
|
||||
|
||||
/obj/machinery/vr_sleeper/proc/cleanup_vr_human()
|
||||
@@ -227,4 +230,4 @@
|
||||
for (var/mob/living/carbon/human/virtual_reality/H in vr_area)
|
||||
if (H.stat == DEAD && !H.vr_sleeper && !H.real_mind)
|
||||
qdel(H)
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
|
||||
|
||||
@@ -605,6 +605,24 @@
|
||||
world.update_status()
|
||||
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle AI", "[!alai ? "Disabled" : "Enabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/datum/admins/proc/toggleMulticam()
|
||||
set category = "Server"
|
||||
set desc="Turns mutlicam on and off."
|
||||
set name="Toggle Multicam"
|
||||
var/almcam = CONFIG_GET(flag/allow_ai_multicam)
|
||||
CONFIG_SET(flag/allow_ai_multicam, !almcam)
|
||||
if (almcam)
|
||||
to_chat(world, "<B>The AI no longer has multicam.</B>")
|
||||
for(var/i in GLOB.ai_list)
|
||||
var/mob/living/silicon/ai/aiPlayer = i
|
||||
if(aiPlayer.multicam_on)
|
||||
aiPlayer.end_multicam()
|
||||
else
|
||||
to_chat(world, "<B>The AI now has multicam.</B>")
|
||||
log_admin("[key_name(usr)] toggled AI multicam.")
|
||||
world.update_status()
|
||||
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Multicam", "[!almcam ? "Disabled" : "Enabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/datum/admins/proc/toggleaban()
|
||||
set category = "Server"
|
||||
set desc="Respawn basically"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user