Merge branch 'master' into mapsyncs43293845982

This commit is contained in:
deathride58
2018-01-08 06:18:11 +00:00
committed by GitHub
35 changed files with 269 additions and 142 deletions

View File

@@ -1,4 +1,5 @@
/datum/component/forensics /datum/component/forensics
dupe_mode = COMPONENT_DUPE_UNIQUE
var/list/fingerprints //assoc print = print var/list/fingerprints //assoc print = print
var/list/hiddenprints //assoc ckey = realname/gloves/ckey var/list/hiddenprints //assoc ckey = realname/gloves/ckey
var/list/blood_DNA //assoc dna = bloodtype var/list/blood_DNA //assoc dna = bloodtype

View File

@@ -58,13 +58,22 @@ GLOBAL_LIST_EMPTY(blob_nodes)
/mob/camera/blob/proc/validate_location() /mob/camera/blob/proc/validate_location()
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
var/area/A = get_area(T) if(!is_valid_turf(T) && LAZYLEN(GLOB.blobstart))
if(((A && !A.blob_allowed) || !T || !is_station_level(T.z)) && LAZYLEN(GLOB.blobstart)) var/list/blobstarts = shuffle(GLOB.blobstart)
T = get_turf(pick(GLOB.blobstart)) for(var/_T in blobstarts)
if(is_valid_turf(_T))
T = _T
break
if(!T) if(!T)
CRASH("No blobspawnpoints and blob spawned in nullspace.") CRASH("No blobspawnpoints and blob spawned in nullspace.")
forceMove(T) forceMove(T)
/mob/camera/blob/proc/is_valid_turf(turf/T)
var/area/A = get_area(T)
if((A && !A.blob_allowed) || !T || !is_station_level(T.z) || isspaceturf(T))
return FALSE
return TRUE
/mob/camera/blob/Life() /mob/camera/blob/Life()
if(!blob_core) if(!blob_core)
if(!placed) if(!placed)

View File

@@ -1,5 +1,11 @@
#define ARK_GRACE_PERIOD 300 //In seconds, how long the crew has before the Ark truly "begins" #define ARK_GRACE_PERIOD 300 //In seconds, how long the crew has before the Ark truly "begins"
/proc/clockwork_ark_active() //A helper proc so the Ark doesn't have to be typecast every time it's checked; returns null if there is no Ark and its active var otherwise
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar
if(!G)
return
return G.active
//The gateway to Reebe, from which Ratvar emerges. //The gateway to Reebe, from which Ratvar emerges.
/obj/structure/destructible/clockwork/massive/celestial_gateway /obj/structure/destructible/clockwork/massive/celestial_gateway
name = "\improper Ark of the Clockwork Justicar" name = "\improper Ark of the Clockwork Justicar"
@@ -63,7 +69,7 @@
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/cry_havoc() /obj/structure/destructible/clockwork/massive/celestial_gateway/proc/cry_havoc()
visible_message("<span class='boldwarning'>[src] shudders and roars to life, its parts beginning to whirr and screech!</span>") visible_message("<span class='boldwarning'>[src] shudders and roars to life, its parts beginning to whirr and screech!</span>")
hierophant_message("<span class='bold large_brass'>The Ark is activating! Get back to the base!</span>") hierophant_message("<span class='bold large_brass'>The Ark is activating! You will be transported there soon!</span>")
for(var/mob/M in GLOB.player_list) for(var/mob/M in GLOB.player_list)
if(is_servant_of_ratvar(M) || isobserver(M) || M.z == z) if(is_servant_of_ratvar(M) || isobserver(M) || M.z == z)
M.playsound_local(M, 'sound/magic/clockwork/ark_activation_sequence.ogg', 30, FALSE, pressure_affected = FALSE) M.playsound_local(M, 'sound/magic/clockwork/ark_activation_sequence.ogg', 30, FALSE, pressure_affected = FALSE)
@@ -86,6 +92,8 @@
var/datum/stack_recipe/R = V var/datum/stack_recipe/R = V
if(R.title == "wall gear") if(R.title == "wall gear")
R.time *= 2 //Building walls becomes slower when the Ark activates R.time *= 2 //Building walls becomes slower when the Ark activates
mass_recall()
recalls_remaining++ //So it doesn't use up a charge
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/open_portal(turf/T) /obj/structure/destructible/clockwork/massive/celestial_gateway/proc/open_portal(turf/T)
new/obj/effect/clockwork/city_of_cogs_rift(T) new/obj/effect/clockwork/city_of_cogs_rift(T)
@@ -261,6 +269,12 @@
if(!step_away(O, src, 2) || get_dist(O, src) < 2) if(!step_away(O, src, 2) || get_dist(O, src) < 2)
O.take_damage(50, BURN, "bomb") O.take_damage(50, BURN, "bomb")
O.update_icon() O.update_icon()
for(var/V in GLOB.player_list)
var/mob/M = V
if(is_servant_of_ratvar(M) && M.z != z)
M.forceMove(get_step(src, SOUTH))
M.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
M.clear_fullscreen("flash", 5)
if(grace_period) if(grace_period)
grace_period-- grace_period--
return return

View File

@@ -11,11 +11,11 @@
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
var/usability = 0 var/usability = 0
var/reusable = TRUE var/old_shard = FALSE
var/spent = FALSE var/spent = FALSE
/obj/item/device/soulstone/proc/was_used() /obj/item/device/soulstone/proc/was_used()
if(!reusable) if(old_shard)
spent = TRUE spent = TRUE
name = "dull [name]" name = "dull [name]"
desc = "A fragment of the legendary treasure known simply as \ desc = "A fragment of the legendary treasure known simply as \
@@ -27,7 +27,7 @@
/obj/item/device/soulstone/anybody/chaplain /obj/item/device/soulstone/anybody/chaplain
name = "mysterious old shard" name = "mysterious old shard"
reusable = FALSE old_shard = TRUE
/obj/item/device/soulstone/pickup(mob/living/user) /obj/item/device/soulstone/pickup(mob/living/user)
..() ..()
@@ -38,7 +38,10 @@
/obj/item/device/soulstone/examine(mob/user) /obj/item/device/soulstone/examine(mob/user)
..() ..()
if(usability || iscultist(user) || iswizard(user) || isobserver(user)) if(usability || iscultist(user) || iswizard(user) || isobserver(user))
to_chat(user, "<span class='cult'>A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades.</span>") if (old_shard)
to_chat(user, "<span class='cult'>A soulstone, used to capture a soul, either from dead humans or from freed shades.</span>")
else
to_chat(user, "<span class='cult'>A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades.</span>")
to_chat(user, "<span class='cult'>The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade.</span>") to_chat(user, "<span class='cult'>The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade.</span>")
if(spent) if(spent)
to_chat(user, "<span class='cult'>This shard is spent; it is now just a creepy rock.</span>") to_chat(user, "<span class='cult'>This shard is spent; it is now just a creepy rock.</span>")
@@ -151,7 +154,7 @@
if(contents.len) if(contents.len)
to_chat(user, "<span class='userdanger'>Capture failed!</span>: The soulstone is full! Free an existing soul to make room.") to_chat(user, "<span class='userdanger'>Capture failed!</span>: The soulstone is full! Free an existing soul to make room.")
else else
if(T.stat != CONSCIOUS) if((!old_shard && T.stat != CONSCIOUS) || (old_shard && T.stat == DEAD))
if(T.client == null) if(T.client == null)
to_chat(user, "<span class='userdanger'>Capture failed!</span>: The soul has already fled its mortal frame. You attempt to bring it back...") to_chat(user, "<span class='userdanger'>Capture failed!</span>: The soul has already fled its mortal frame. You attempt to bring it back...")
getCultGhost(T,user) getCultGhost(T,user)

View File

@@ -283,6 +283,9 @@
if(!is_servant_of_ratvar(user)) if(!is_servant_of_ratvar(user))
to_chat(user, "<span class='warning'>[src]'s keys are in a language foreign to you, and you don't understand anything on its screen.</span>") to_chat(user, "<span class='warning'>[src]'s keys are in a language foreign to you, and you don't understand anything on its screen.</span>")
return return
if(clockwork_ark_active())
to_chat(user, "<span class='warning'>The Ark is active, and [src] has shut down.</span>")
return
. = ..() . = ..()
/datum/action/innate/servant_warp /datum/action/innate/servant_warp

View File

@@ -130,7 +130,6 @@
if(authenticated==2) if(authenticated==2)
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
make_announcement(usr) make_announcement(usr)
deadchat_broadcast("<span class='deadsay bold'>[usr.name] made an priority announcement.</span>", usr)
if("crossserver") if("crossserver")
if(authenticated==2) if(authenticated==2)
@@ -702,6 +701,7 @@
if(!input || !user.canUseTopic(src)) if(!input || !user.canUseTopic(src))
return return
SScommunications.make_announcement(user, is_silicon, input) SScommunications.make_announcement(user, is_silicon, input)
deadchat_broadcast("<span class='deadsay bold'>[user.name] made an priority announcement.</span>", user)
/obj/machinery/computer/communications/proc/post_status(command, data1, data2) /obj/machinery/computer/communications/proc/post_status(command, data1, data2)

View File

@@ -3,6 +3,14 @@
anchored = TRUE anchored = TRUE
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/decal/Initialize()
. = ..()
if(!isturf(loc) || NeverShouldHaveComeHere(loc))
return INITIALIZE_HINT_QDEL
/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T)
return isspaceturf(T) || isclosedturf(T) || islava(T) || istype(T, /turf/open/water) || ischasm(T)
/obj/effect/decal/ex_act(severity, target) /obj/effect/decal/ex_act(severity, target)
qdel(src) qdel(src)
@@ -12,7 +20,7 @@
/obj/effect/decal/HandleTurfChange(turf/T) /obj/effect/decal/HandleTurfChange(turf/T)
..() ..()
if(T == loc && (isspaceturf(T) || isclosedturf(T) || islava(T) || istype(T, /turf/open/water) || ischasm(T))) if(T == loc && NeverShouldHaveComeHere(T))
qdel(src) qdel(src)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -9,7 +9,7 @@
points = 50 points = 50
var/blink_range = 8 // The teleport range when crushed/thrown at someone. var/blink_range = 8 // The teleport range when crushed/thrown at someone.
refined_type = /obj/item/stack/sheet/bluespace_crystal refined_type = /obj/item/stack/sheet/bluespace_crystal
grind_results = list("bluespace" = 2) grind_results = list("bluespace" = 20)
/obj/item/ore/bluespace_crystal/refined /obj/item/ore/bluespace_crystal/refined
name = "refined bluespace crystal" name = "refined bluespace crystal"
@@ -49,7 +49,7 @@
blink_range = 4 // Not as good as the organic stuff! blink_range = 4 // Not as good as the organic stuff!
points = 0 //nice try points = 0 //nice try
refined_type = null refined_type = null
grind_results = list("bluespace" = 1, "silicon" = 2) grind_results = list("bluespace" = 10, "silicon" = 20)
//Polycrystals, aka stacks //Polycrystals, aka stacks
/obj/item/stack/sheet/bluespace_crystal /obj/item/stack/sheet/bluespace_crystal
@@ -60,7 +60,7 @@
materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT) materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT)
attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed") attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed")
novariants = TRUE novariants = TRUE
grind_results = list("bluespace" = 2) grind_results = list("bluespace" = 20)
var/crystal_type = /obj/item/ore/bluespace_crystal/refined var/crystal_type = /obj/item/ore/bluespace_crystal/refined
/obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening /obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening

View File

@@ -111,7 +111,7 @@
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
heal_brute = 40 heal_brute = 40
self_delay = 20 self_delay = 20
grind_results = list("styptic_powder" = 1) grind_results = list("styptic_powder" = 10)
/obj/item/stack/medical/bruise_pack/suicide_act(mob/user) /obj/item/stack/medical/bruise_pack/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is bludgeoning [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] is bludgeoning [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -148,4 +148,4 @@
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
heal_burn = 40 heal_burn = 40
self_delay = 20 self_delay = 20
grind_results = list("silver_sulfadiazine" = 1) grind_results = list("silver_sulfadiazine" = 10)

View File

@@ -22,7 +22,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 100) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 100)
resistance_flags = ACID_PROOF resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/glass merge_type = /obj/item/stack/sheet/glass
grind_results = list("silicon" = 1) grind_results = list("silicon" = 20)
/obj/item/stack/sheet/glass/cyborg /obj/item/stack/sheet/glass/cyborg
materials = list() materials = list()
@@ -80,7 +80,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100)
resistance_flags = ACID_PROOF resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmaglass merge_type = /obj/item/stack/sheet/plasmaglass
grind_results = list("silicon" = 1, "plasma" = 1) grind_results = list("silicon" = 20, "plasma" = 10)
/obj/item/stack/sheet/plasmaglass/fifty /obj/item/stack/sheet/plasmaglass/fifty
amount = 50 amount = 50
@@ -130,7 +130,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 100) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 100)
resistance_flags = ACID_PROOF resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/rglass merge_type = /obj/item/stack/sheet/rglass
grind_results = list("silicon" = 1, "iron" = 1) grind_results = list("silicon" = 20, "iron" = 10)
/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params) /obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params)
add_fingerprint(user) add_fingerprint(user)
@@ -171,7 +171,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
resistance_flags = ACID_PROOF resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmarglass merge_type = /obj/item/stack/sheet/plasmarglass
grind_results = list("silicon" = 1, "plasma" = 1, "iron" = 1) grind_results = list("silicon" = 20, "plasma" = 10, "iron" = 10)
/obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE) /obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.prglass_recipes recipes = GLOB.prglass_recipes

View File

@@ -11,7 +11,7 @@
throw_range = 7 throw_range = 7
flags_1 = CONDUCT_1 flags_1 = CONDUCT_1
max_amount = 60 max_amount = 60
grind_results = list("silicon" = 1, "copper" = 1) grind_results = list("silicon" = 20, "copper" = 5)
/obj/item/stack/light_w/attackby(obj/item/O, mob/user, params) /obj/item/stack/light_w/attackby(obj/item/O, mob/user, params)

View File

@@ -330,7 +330,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
sheettype = "runed" sheettype = "runed"
merge_type = /obj/item/stack/sheet/runed_metal merge_type = /obj/item/stack/sheet/runed_metal
novariants = TRUE novariants = TRUE
grind_results = list("iron" = 0.5, "blood" = 1.5) grind_results = list("iron" = 5, "blood" = 15)
/obj/item/stack/sheet/runed_metal/ratvar_act() /obj/item/stack/sheet/runed_metal/ratvar_act()
new /obj/item/stack/tile/brass(loc, amount) new /obj/item/stack/tile/brass(loc, amount)
@@ -394,7 +394,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
throw_range = 3 throw_range = 3
turf_type = /turf/open/floor/clockwork turf_type = /turf/open/floor/clockwork
novariants = FALSE novariants = FALSE
grind_results = list("iron" = 0.5, "teslium" = 1.5) grind_results = list("iron" = 5, "teslium" = 15)
/obj/item/stack/tile/brass/narsie_act() /obj/item/stack/tile/brass/narsie_act()
new /obj/item/stack/sheet/runed_metal(loc, amount) new /obj/item/stack/sheet/runed_metal(loc, amount)
@@ -445,7 +445,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
throw_speed = 1 throw_speed = 1
throw_range = 3 throw_range = 3
grind_results = list("carbon" = 1) grind_results = list("carbon" = 10)
GLOBAL_LIST_INIT(plastic_recipes, list( GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \

View File

@@ -55,8 +55,8 @@ FLOOR SAFES
if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open) if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open)
if(user) if(user)
visible_message("<i><b>[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!</b></i>") visible_message("<i><b>[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!</b></i>")
return 1 return TRUE
return 0 return FALSE
/obj/structure/safe/proc/decrement(num) /obj/structure/safe/proc/decrement(num)
@@ -83,7 +83,7 @@ FLOOR SAFES
/obj/structure/safe/attack_hand(mob/user) /obj/structure/safe/attack_hand(mob/user)
user.set_machine(src) user.set_machine(src)
var/dat = "<center>" var/dat = "<center>"
dat += "<a href='?src=[REF(src)];open=1'>[open ? "Close" : "Open"] [src]</a> | <a href='?src=[REF(src)];decrement=1'>-</a> [dial * 5] <a href='?src=[REF(src)];increment=1'>+</a>" dat += "<a href='?src=[REF(src)];open=1'>[open ? "Close" : "Open"] [src]</a> | <a href='?src=[REF(src)];decrement=1'>-</a> [dial] <a href='?src=[REF(src)];increment=1'>+</a>"
if(open) if(open)
dat += "<table>" dat += "<table>"
for(var/i = contents.len, i>=1, i--) for(var/i = contents.len, i>=1, i--)
@@ -101,9 +101,9 @@ FLOOR SAFES
if(!user.canUseTopic(src)) if(!user.canUseTopic(src))
return return
var/canhear = 0 var/canhear = FALSE
if(user.is_holding_item_of_type(/obj/item/clothing/neck/stethoscope)) if(user.is_holding_item_of_type(/obj/item/clothing/neck/stethoscope))
canhear = 1 canhear = TRUE
if(href_list["open"]) if(href_list["open"])
if(check_unlocked()) if(check_unlocked())

View File

@@ -22,18 +22,16 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
/datum/gas_mixture /datum/gas_mixture
var/list/gases var/list/gases
var/temperature //kelvins var/temperature = 0 //kelvins
var/tmp/temperature_archived var/tmp/temperature_archived = 0
var/volume //liters var/volume = CELL_VOLUME //liters
var/last_share var/last_share = 0
var/list/reaction_results var/list/reaction_results
/datum/gas_mixture/New(volume = CELL_VOLUME) /datum/gas_mixture/New(volume)
gases = new gases = new
temperature = 0 if (!isnull(volume))
temperature_archived = 0 src.volume = volume
src.volume = volume
last_share = 0
reaction_results = new reaction_results = new
//listmos procs //listmos procs

View File

@@ -301,7 +301,8 @@ Pipelines + Other Objects -> Pipe network
#define VENT_SOUND_DELAY 30 #define VENT_SOUND_DELAY 30
/obj/machinery/atmospherics/relaymove(mob/living/user, direction) /obj/machinery/atmospherics/relaymove(mob/living/user, direction)
if(!(direction & initialize_directions)) //cant go this way. direction &= initialize_directions
if(!direction || !(direction in GLOB.cardinals)) //cant go this way.
return return
if(user in buckled_mobs)// fixes buckle ventcrawl edgecase fuck bug if(user in buckled_mobs)// fixes buckle ventcrawl edgecase fuck bug
@@ -322,13 +323,12 @@ Pipelines + Other Objects -> Pipe network
if(world.time - user.last_played_vent > VENT_SOUND_DELAY) if(world.time - user.last_played_vent > VENT_SOUND_DELAY)
user.last_played_vent = world.time user.last_played_vent = world.time
playsound(src, 'sound/machines/ventcrawl.ogg', 50, 1, -3) playsound(src, 'sound/machines/ventcrawl.ogg', 50, 1, -3)
else else if(is_type_in_typecache(src, GLOB.ventcrawl_machinery) && can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent
if((direction & initialize_directions) || is_type_in_typecache(src, GLOB.ventcrawl_machinery) && can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent user.forceMove(loc)
user.forceMove(loc) user.visible_message("<span class='notice'>You hear something squeezing through the ducts...</span>","<span class='notice'>You climb out the ventilation system.")
user.visible_message("<span class='notice'>You hear something squeezing through the ducts...</span>","<span class='notice'>You climb out the ventilation system.")
user.canmove = 0 user.canmove = FALSE
spawn(1) addtimer(VARSET_CALLBACK(user, canmove, TRUE), 1)
user.canmove = 1
/obj/machinery/atmospherics/AltClick(mob/living/L) /obj/machinery/atmospherics/AltClick(mob/living/L)

View File

@@ -205,8 +205,26 @@
/mob/proc/put_in_hands(obj/item/I, del_on_fail = FALSE) /mob/proc/put_in_hands(obj/item/I, del_on_fail = FALSE)
if(!I) if(!I)
return FALSE return FALSE
// If the item is a stack and we're already holding a stack then merge
if (istype(I, /obj/item/stack))
var/obj/item/stack/I_stack = I
var/obj/item/stack/active_stack = get_active_held_item()
if (istype(active_stack) && istype(I_stack, active_stack.merge_type))
if (I_stack.merge(active_stack))
to_chat(usr, "<span class='notice'>Your [active_stack.name] stack now contains [active_stack.get_amount()] [active_stack.singular_name]\s.</span>")
return TRUE
else
var/obj/item/stack/inactive_stack = get_inactive_held_item()
if (istype(inactive_stack) && istype(I_stack, inactive_stack.merge_type))
if (I_stack.merge(inactive_stack))
to_chat(usr, "<span class='notice'>Your [inactive_stack.name] stack now contains [inactive_stack.get_amount()] [inactive_stack.singular_name]\s.</span>")
return TRUE
if(put_in_active_hand(I)) if(put_in_active_hand(I))
return TRUE return TRUE
var/hand = get_empty_held_index_for_side("l") var/hand = get_empty_held_index_for_side("l")
if(!hand) if(!hand)
hand = get_empty_held_index_for_side("r") hand = get_empty_held_index_for_side("r")

View File

@@ -386,12 +386,22 @@ All effects don't start immediately, but rather get worse over time; the rate is
81-90: Extremely high alcohol content - light brain damage, passing out 81-90: Extremely high alcohol content - light brain damage, passing out
91-100: Dangerously toxic - swift death 91-100: Dangerously toxic - swift death
*/ */
#define BALLMER_POINTS 5
GLOBAL_LIST_INIT(ballmer_good_msg, list("Hey guys, what if we rolled out a bluespace wiring system so mice can't destroy the powergrid anymore?",
"Hear me out here. What if, and this is just a theory, we made R&D controllable from our PDAs?",
"I'm thinking we should roll out a git repository for our research under the AGPLv3 license so that we can share it among the other stations freely.",
"I dunno about you guys, but IDs and PDAs being separate is clunky as fuck. Maybe we should merge them into a chip in our arms? That way they can't be stolen easily.",
"Why the fuck aren't we just making every pair of shoes into galoshes? We have the technology."))
GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put a webserver that's automatically turned on with default admin passwords into every PDA?",
"So like, you know how we separate our codebase from the master copy that runs on our consumer boxes? What if we merged the two and undid the separation between codebase and server?",
"Dude, radical idea: H.O.N.K mechs but with no bananium required.",
"Best idea ever: Disposal pipes instead of hallways."))
/mob/living/carbon/human/handle_status_effects() /mob/living/carbon/human/handle_status_effects()
..() ..()
if(drunkenness) if(drunkenness)
drunkenness = max(drunkenness - (drunkenness * 0.04), 0) drunkenness = max(drunkenness - (drunkenness * 0.04), 0)
if(drunkenness >= 6) if(drunkenness >= 6)
if(prob(25)) if(prob(25))
slurring += 2 slurring += 2
@@ -399,7 +409,22 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(drunkenness >= 11 && slurring < 5) if(drunkenness >= 11 && slurring < 5)
slurring += 1.2 slurring += 1.2
if(mind && (mind.assigned_role == "Scientist" || mind.assigned_role == "Research Director"))
if(SSresearch.science_tech)
if(drunkenness >= 12.9 && drunkenness <= 13.8)
drunkenness = round(drunkenness, 0.01)
var/ballmer_percent = 0
if(drunkenness == 13.35) // why run math if I dont have to
ballmer_percent = 1
else
ballmer_percent = (-abs(drunkenness - 13.35) / 0.9) + 1
if(prob(5))
say(pick(GLOB.ballmer_good_msg))
SSresearch.science_tech.research_points += (BALLMER_POINTS * ballmer_percent)
if(drunkenness > 26) // by this point you're into windows ME territory
if(prob(5))
SSresearch.science_tech.research_points -= BALLMER_POINTS
say(pick(GLOB.ballmer_windows_me_msg))
if(drunkenness >= 41) if(drunkenness >= 41)
if(prob(25)) if(prob(25))
confused += 2 confused += 2

View File

@@ -807,6 +807,15 @@
build_path = /obj/item/stock_parts/cell/emergency_light build_path = /obj/item/stock_parts/cell/emergency_light
category = list("initial", "Electronics") category = list("initial", "Electronics")
/datum/design/packageWrap
name = "Package Wrapping"
id = "packagewrap"
build_type = AUTOLATHE
materials = list(MAT_METAL = 200, MAT_GLASS = 200)
build_path = /obj/item/stack/packageWrap
category = list("initial", "Misc")
maxstack = 30
/datum/design/holodisk /datum/design/holodisk
name = "Holodisk" name = "Holodisk"
id = "holodisk" id = "holodisk"

View File

@@ -24,9 +24,7 @@
stoplag(1) stoplag(1)
/obj/effect/proc_holder/spell/targeted/touch/can_cast(mob/user = usr) /obj/effect/proc_holder/spell/targeted/touch/can_cast(mob/user = usr)
if(attached_hand) return ..() && attached_hand
return TRUE
return ..()
/obj/effect/proc_holder/spell/targeted/touch/proc/ChargeHand(mob/living/carbon/user) /obj/effect/proc_holder/spell/targeted/touch/proc/ChargeHand(mob/living/carbon/user)
attached_hand = new hand_path(src) attached_hand = new hand_path(src)

View File

@@ -20,6 +20,8 @@ GLOBAL_LIST(uplink_purchase_logs_by_key) //assoc key = /datum/uplink_purchase_lo
/datum/uplink_purchase_log/Destroy() /datum/uplink_purchase_log/Destroy()
purchase_log = null purchase_log = null
parent = null parent = null
if(GLOB.uplink_purchase_logs_by_key[owner] == src)
GLOB.uplink_purchase_logs_by_key -= owner
return ..() return ..()
/datum/uplink_purchase_log/proc/MergeWithAndDel(datum/uplink_purchase_log/other) /datum/uplink_purchase_log/proc/MergeWithAndDel(datum/uplink_purchase_log/other)

View File

@@ -61,14 +61,9 @@
return ..() return ..()
/obj/vehicle/ridden/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) /obj/vehicle/ridden/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE)
if(user.incapacitated()) if(!in_range(user, src) || !in_range(M, src))
return return FALSE
for(var/atom/movable/A in get_turf(src)) . = ..(M, user, FALSE)
if(A.density)
if(A != src && A != M)
return
M.forceMove(get_turf(src))
. = ..()
/obj/vehicle/ridden/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE) /obj/vehicle/ridden/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
if(!force && occupant_amount() >= max_occupants) if(!force && occupant_amount() >= max_occupants)

View File

@@ -51,7 +51,8 @@ BAN_LEGACY_SYSTEM
## Unhash this to enable playtime requirements for head jobs. ## Unhash this to enable playtime requirements for head jobs.
#USE_EXP_RESTRICTIONS_HEADS #USE_EXP_RESTRICTIONS_HEADS
## Unhash this to override head jobs' playtime requirements with this number of hours. ## Unhash this to override head jobs' playtime requirements with this number of hours.
#USE_EXP_RESTRICTIONS_HEADS_HOURS 15 ## Leave this commented out to use the values defined in the job datums. Values in the datums are stored as minutes.
#USE_EXP_RESTRICTIONS_HEADS_HOURS 3
## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime. ## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime.
#USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT #USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT
## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist. ## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist.

View File

@@ -0,0 +1,4 @@
author: "CitadelStationBot"
delete-after: True
changes:
- config: "The default config for head of staff exp override is closer to the actual default with no override."

View File

@@ -0,0 +1,4 @@
author: "CitadelStationBot"
delete-after: True
changes:
- bugfix: "Lavaboats no longer set you on fire."

View File

@@ -0,0 +1,4 @@
author: "CitadelStationBot"
delete-after: True
changes:
- bugfix: "Decals will no longer spawn where they don't belong"

View File

@@ -0,0 +1,4 @@
author: "CitadelStationBot"
delete-after: True
changes:
- bugfix: "comms consoles no longer announce in deadchat announcements if they were cooling down and unsuccessful."

View File

@@ -0,0 +1,4 @@
author: "MrDoomBringer"
delete-after: True
changes:
- rscadd: "Advances in NanoTrasen's wrapping department have resulted in the easy creation of package wrap from all station autolathes!"

View File

@@ -0,0 +1,4 @@
author: "Xhuis"
delete-after: True
changes:
- balance: "Servants are now teleported to the Ark when it activates, and cannot leave Reebe afterwards."

View File

@@ -0,0 +1,4 @@
author: "JohnGinnane"
delete-after: True
changes:
- rscadd: "Newly crafted stacks are merged with held stacks of the same type."

View File

@@ -0,0 +1,4 @@
author: "Iamgoofball"
delete-after: True
changes:
- bugfix: "Booze now properly reflects programming speed."

View File

@@ -0,0 +1,4 @@
author: "ninjanomnom"
delete-after: True
changes:
- bugfix: "Moving diagonally in pipes should no longer eject you from the pipe."

View File

@@ -0,0 +1,4 @@
author: "More Robust Than You"
delete-after: True
changes:
- bugfix: "Blob Overminds should no longer to be able to spawn on ANY space tile"

View File

@@ -0,0 +1,5 @@
author: "Dax Dupont"
delete-after: True
changes:
- balance: "The chaplain's soul stone now requires death instead of (soft) crit."
- bugfix: "The examine text now properly states that it can only capture a single soul."

View File

@@ -1,7 +1,6 @@
Added the <b>Eminence</b>, a leader role that servants can become by interacting with the new eminence spire structure in Reebe. When revived by a vitality matrix, servants will gain a 1-minute debuff that prevents revival again.
Scripture has been re-colored in the slab interface to show its niche at a glance. Vitality matrices must now be placed at least one tile apart.
Added traps, including the brass skewer and steam vent. Servants are now teleported to and locked on Reebe once the Ark starts.
Added trap triggers, including the pressure sensor, lever, and repeater. Cyborgs are now damaged by brass skewers.
Traps and trap triggers can be linked by using your clockwork slab on them. Traps chained to each other will cause those traps to activate as well. Vitality matrices no longer work on buckled mobs (including skewered ones.)
You can instantly remove traps you misplace by using a wrench on them. Pressure sensors have much less health.
<b><i>Mending Mantra has been removed.</i></b>

View File

@@ -1,9 +1,8 @@
@echo off @echo off
REM Get the documents folder from the registry. REM Get the documents folder from the registry.
for /f "tokens=3* delims= " %%a in ( @echo off
'reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"' for /f "tokens=3*" %%p in ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Personal') do (
) do ( set DocumentsFolder=%%p
set documents=%%a %%b
) )
REM Copy assets to the BYOND cache REM Copy assets to the BYOND cache
cmd /c copy assets\* "%documents%\BYOND\cache" /y cmd /c copy assets\* "%DocumentsFolder%\BYOND\cache" /y