Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 11/19/2017_submap_validation

# Conflicts resolved:
#	code/unit_tests/map_tests.dm
This commit is contained in:
Neerti
2017-11-19 06:09:01 -05:00
119 changed files with 15169 additions and 14900 deletions

View File

@@ -23,6 +23,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/recursive_enhancement = 0 //Used to power up other abilities from the ling power with the same name. var/recursive_enhancement = 0 //Used to power up other abilities from the ling power with the same name.
var/list/purchased_powers_history = list() //Used for round-end report, includes respec uses too. var/list/purchased_powers_history = list() //Used for round-end report, includes respec uses too.
var/last_shriek = null // world.time when the ling last used a shriek. var/last_shriek = null // world.time when the ling last used a shriek.
var/next_escape = 0 // world.time when the ling can next use Escape Restraints
/datum/changeling/New(var/gender=FEMALE) /datum/changeling/New(var/gender=FEMALE)
..() ..()

View File

@@ -0,0 +1,63 @@
/datum/power/changeling/escape_restraints
name = "Escape Restraints"
desc = "We evolve more complex joints"
helptext = "We can instantly escape from most restraints and bindings, but we cannot do it often."
enhancedtext = "More frequent escapes."
ability_icon_state = "ling_escape_restraints"
genomecost = 2
verbpath = /mob/proc/changeling_escape_restraints
//Escape Cuffs. By design this does not escape from straight jackets
/mob/proc/changeling_escape_restraints()
set category = "Changeling"
set name = "Escape Restraints (40)"
set desc = "Removes handcuffs and legcuffs instantly."
var/escape_cooldown = 5 MINUTES //This is used later to prevent spamming
var/mob/living/carbon/human/C = src
var/datum/changeling/changeling = changeling_power(40,0,100,CONSCIOUS)
if(!changeling)
return 0
if(world.time < changeling.next_escape)
to_chat(src, "<span class='warning'>We are still recovering from our last escape...</span>")
return 0
if(!(C.handcuffed || C.legcuffed)) // No need to waste chems if there's nothing to break out of
to_chat(C, "<span class='warning'>We are are not restrained in a way we can escape...</span>")
return 0
changeling.chem_charges -= 40
to_chat(C,"<span class='notice'>We contort our extremities and slip our cuffs.</span>")
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
if(C.handcuffed)
var/obj/item/weapon/W = C.handcuffed
C.handcuffed = null
if(C.buckled && C.buckled.buckle_require_restraints)
C.buckled.unbuckle_mob()
C.update_inv_handcuffed()
if (C.client)
C.client.screen -= W
if(W)
W.loc = C.loc
W.dropped(C)
if(W)
W.layer = initial(W.layer)
if(C.legcuffed)
var/obj/item/weapon/W = C.legcuffed
C.legcuffed = null
C.update_inv_legcuffed()
if(C.client)
C.client.screen -= W
if(W)
W.loc = C.loc
W.dropped(C)
if(W)
W.layer = initial(W.layer)
if(src.mind.changeling.recursive_enhancement)
escape_cooldown *= 0.5
changeling.next_escape = world.time + escape_cooldown //And now we set the timer
feedback_add_details("changeling_powers","ESR")
return 1

View File

@@ -74,7 +74,7 @@ var/global/datum/controller/occupations/job_master
proc/FreeRole(var/rank) //making additional slot on the fly proc/FreeRole(var/rank) //making additional slot on the fly
var/datum/job/job = GetJob(rank) var/datum/job/job = GetJob(rank)
if(job && job.current_positions >= job.total_positions && job.total_positions != -1) if(job && job.total_positions != -1)
job.total_positions++ job.total_positions++
return 1 return 1
return 0 return 0

View File

@@ -127,6 +127,36 @@
icon = 'icons/obj/doors/Doormaint.dmi' icon = 'icons/obj/doors/Doormaint.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_mai assembly_type = /obj/structure/door_assembly/door_assembly_mai
/obj/machinery/door/airlock/maintenance/cargo
icon = 'icons/obj/doors/Doormaint_cargo.dmi'
req_one_access = list(access_cargo)
/obj/machinery/door/airlock/maintenance/command
icon = 'icons/obj/doors/Doormaint_command.dmi'
req_one_access = list(access_heads)
/obj/machinery/door/airlock/maintenance/common
icon = 'icons/obj/doors/Doormaint_common.dmi'
/obj/machinery/door/airlock/maintenance/engi
icon = 'icons/obj/doors/Doormaint_engi.dmi'
req_one_access = list(access_engine)
/obj/machinery/door/airlock/maintenance/int
icon = 'icons/obj/doors/Doormaint_int.dmi'
/obj/machinery/door/airlock/maintenance/medical
icon = 'icons/obj/doors/Doormaint_med.dmi'
req_one_access = list(access_medical)
/obj/machinery/door/airlock/maintenance/rnd
icon = 'icons/obj/doors/Doormaint_rnd.dmi'
req_one_access = list(access_research)
/obj/machinery/door/airlock/maintenance/sec
icon = 'icons/obj/doors/Doormaint_sec.dmi'
req_one_access = list(access_security)
/obj/machinery/door/airlock/external /obj/machinery/door/airlock/external
name = "External Airlock" name = "External Airlock"
icon = 'icons/obj/doors/Doorext.dmi' icon = 'icons/obj/doors/Doorext.dmi'

View File

@@ -2,15 +2,44 @@
/obj/machinery/door/airlock/multi_tile /obj/machinery/door/airlock/multi_tile
width = 2 width = 2
appearance_flags = 0 appearance_flags = 0
var/obj/machinery/filler_object/filler1
var/obj/machinery/filler_object/filler2
/obj/machinery/door/airlock/multi_tile/New() /obj/machinery/door/airlock/multi_tile/New()
..() ..()
SetBounds() SetBounds()
if(opacity)
create_fillers()
/obj/machinery/door/airlock/multi_tile/Destroy()
qdel_null(filler1)
qdel_null(filler2)
return ..()
/obj/machinery/door/airlock/multi_tile/Move() /obj/machinery/door/airlock/multi_tile/Move()
. = ..() . = ..()
SetBounds() SetBounds()
/obj/machinery/door/airlock/multi_tile/open()
. = ..()
if(filler1)
filler1.set_opacity(opacity)
if(filler2)
filler2.set_opacity(opacity)
return .
/obj/machinery/door/airlock/multi_tile/close()
. = ..()
if(filler1)
filler1.set_opacity(opacity)
if(filler2)
filler2.set_opacity(opacity)
return .
/obj/machinery/door/airlock/multi_tile/proc/SetBounds() /obj/machinery/door/airlock/multi_tile/proc/SetBounds()
if(dir in list(EAST, WEST)) if(dir in list(EAST, WEST))
bound_width = width * world.icon_size bound_width = width * world.icon_size
@@ -19,9 +48,35 @@
bound_width = world.icon_size bound_width = world.icon_size
bound_height = width * world.icon_size bound_height = width * world.icon_size
/obj/machinery/door/airlock/multi_tile/proc/create_fillers()
if(src.dir > 3)
filler1 = new/obj/machinery/filler_object (src.loc)
filler2 = new/obj/machinery/filler_object (get_step(src,EAST))
else
filler1 = new/obj/machinery/filler_object (src.loc)
filler2 = new/obj/machinery/filler_object (get_step(src,NORTH))
filler1.density = 0
filler2.density = 0
filler1.set_opacity(opacity)
filler2.set_opacity(opacity)
/obj/machinery/door/airlock/multi_tile/glass /obj/machinery/door/airlock/multi_tile/glass
name = "Glass Airlock" name = "Glass Airlock"
icon = 'icons/obj/doors/Door2x1glass.dmi' icon = 'icons/obj/doors/Door2x1glass.dmi'
opacity = 0 opacity = 0
glass = 1 glass = 1
assembly_type = /obj/structure/door_assembly/multi_tile assembly_type = /obj/structure/door_assembly/multi_tile
/obj/machinery/door/airlock/multi_tile/metal
name = "Airlock"
icon = 'icons/obj/doors/Door2x1metal.dmi'
assembly_type = /obj/structure/door_assembly/multi_tile
/obj/machinery/filler_object
name = ""
icon = 'icons/obj/doors/rapid_pdoor.dmi'
icon_state = ""
density = 0
/obj/machinery/door/airlock/multi_tile/metal/mait
icon = 'icons/obj/doors/Door2x1_Maint.dmi'

View File

@@ -47,7 +47,7 @@
/obj/machinery/power/supply_beacon/attackby(var/obj/item/weapon/W, var/mob/user) /obj/machinery/power/supply_beacon/attackby(var/obj/item/weapon/W, var/mob/user)
if(!use_power && istype(W, /obj/item/weapon/wrench)) if(!use_power && istype(W, /obj/item/weapon/wrench))
if(!anchored && !connect_to_network()) if(!anchored && !connect_to_network())
user << "<span class='warning'>This device must be placed over an exposed cable.</span>" to_chat(user, "<span class='warning'>This device must be placed over an exposed cable.</span>")
return return
anchored = !anchored anchored = !anchored
user.visible_message("<span class='notice'>\The [user] [anchored ? "secures" : "unsecures"] \the [src].</span>") user.visible_message("<span class='notice'>\The [user] [anchored ? "secures" : "unsecures"] \the [src].</span>")
@@ -59,13 +59,13 @@
if(expended) if(expended)
use_power = 0 use_power = 0
user << "<span class='warning'>\The [src] has used up its charge.</span>" to_chat (user, "<span class='warning'>\The [src] has used up its charge.</span>")
return return
if(anchored) if(anchored)
return use_power ? deactivate(user) : activate(user) return use_power ? deactivate(user) : activate(user)
else else
user << "<span class='warning'>You need to secure the beacon with a wrench first!</span>" to_chat(user, "<span class='warning'>You need to secure the beacon with a wrench first!</span>")
return return
/obj/machinery/power/supply_beacon/attack_ai(var/mob/user) /obj/machinery/power/supply_beacon/attack_ai(var/mob/user)
@@ -76,12 +76,12 @@
if(expended) if(expended)
return return
if(surplus() < 500) if(surplus() < 500)
if(user) user << "<span class='notice'>The connected wire doesn't have enough current.</span>" if(user) to_chat(user, "<span class='notice'>The connected wire doesn't have enough current.</span>")
return return
set_light(3, 3, "#00CCAA") set_light(3, 3, "#00CCAA")
icon_state = "beacon_active" icon_state = "beacon_active"
use_power = 1 use_power = 1
if(user) user << "<span class='notice'>You activate the beacon. The supply drop will be dispatched soon.</span>" if(user) to_chat(user, "<span class='notice'>You activate the beacon. The supply drop will be dispatched soon.</span>")
/obj/machinery/power/supply_beacon/proc/deactivate(var/mob/user, var/permanent) /obj/machinery/power/supply_beacon/proc/deactivate(var/mob/user, var/permanent)
if(permanent) if(permanent)
@@ -92,7 +92,7 @@
set_light(0) set_light(0)
use_power = 0 use_power = 0
target_drop_time = null target_drop_time = null
if(user) user << "<span class='notice'>You deactivate the beacon.</span>" if(user) to_chat(user, "<span class='notice'>You deactivate the beacon.</span>")
/obj/machinery/power/supply_beacon/Destroy() /obj/machinery/power/supply_beacon/Destroy()
if(use_power) if(use_power)

View File

@@ -374,7 +374,10 @@
// This proc is used so that we can return out of the revive process while ensuring that busy and update_icon() are handled // This proc is used so that we can return out of the revive process while ensuring that busy and update_icon() are handled
/obj/item/weapon/shockpaddles/proc/do_revive(mob/living/carbon/human/H, mob/user) /obj/item/weapon/shockpaddles/proc/do_revive(mob/living/carbon/human/H, mob/user)
if(!H.client && !H.teleop) if(!H.client && !H.teleop)
to_chat(find_dead_player(H.ckey, 1), "Someone is attempting to resuscitate you. Re-enter your body if you want to be revived!") for(var/mob/observer/dead/ghost in player_list)
if(ghost.mind == H.mind)
to_chat(ghost, "<b><font color = #330033><font size = 3>Someone is attempting to resuscitate you. Re-enter your body if you want to be revived!</b> (Verbs -> Ghost -> Re-enter corpse)</font></font>")
break
//beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("<span class='warning'>\The [user] begins to place [src] on [H]'s chest.</span>", "<span class='warning'>You begin to place [src] on [H]'s chest...</span>") user.visible_message("<span class='warning'>\The [user] begins to place [src] on [H]'s chest.</span>", "<span class='warning'>You begin to place [src] on [H]'s chest...</span>")

View File

@@ -290,6 +290,7 @@
name = "desk lamp" name = "desk lamp"
desc = "A desk lamp with an adjustable mount." desc = "A desk lamp with an adjustable mount."
icon_state = "lamp" icon_state = "lamp"
force = 10
brightness_on = 5 brightness_on = 5
w_class = ITEMSIZE_LARGE w_class = ITEMSIZE_LARGE
flags = CONDUCT flags = CONDUCT

View File

@@ -42,7 +42,7 @@
name = "light replacer" name = "light replacer"
desc = "A device to automatically replace lights. Refill with working lightbulbs or sheets of glass." desc = "A device to automatically replace lights. Refill with working lightbulbs or sheets of glass."
force = 8
icon = 'icons/obj/janitor.dmi' icon = 'icons/obj/janitor.dmi'
icon_state = "lightreplacer0" icon_state = "lightreplacer0"
flags = CONDUCT flags = CONDUCT
@@ -61,32 +61,32 @@
/obj/item/device/lightreplacer/examine(mob/user) /obj/item/device/lightreplacer/examine(mob/user)
if(..(user, 2)) if(..(user, 2))
user << "It has [uses] lights remaining." to_chat(user, "It has [uses] lights remaining.")
/obj/item/device/lightreplacer/attackby(obj/item/W, mob/user) /obj/item/device/lightreplacer/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/stack/material) && W.get_material_name() == "glass") if(istype(W, /obj/item/stack/material) && W.get_material_name() == "glass")
var/obj/item/stack/G = W var/obj/item/stack/G = W
if(uses >= max_uses) if(uses >= max_uses)
user << "<span class='warning'>[src.name] is full.</span>" to_chat(user, "<span class='warning'>[src.name] is full.</span>")
return return
else if(G.use(1)) else if(G.use(1))
AddUses(16) //Autolathe converts 1 sheet into 16 lights. add_uses(16) //Autolathe converts 1 sheet into 16 lights.
user << "<span class='notice'>You insert a piece of glass into \the [src.name]. You have [uses] light\s remaining.</span>" to_chat(user, "<span class='notice'>You insert a piece of glass into \the [src.name]. You have [uses] light\s remaining.</span>")
return return
else else
user << "<span class='warning'>You need one sheet of glass to replace lights.</span>" to_chat(user, "<span class='warning'>You need one sheet of glass to replace lights.</span>")
if(istype(W, /obj/item/weapon/light)) if(istype(W, /obj/item/weapon/light))
var/obj/item/weapon/light/L = W var/obj/item/weapon/light/L = W
if(L.status == 0) // LIGHT OKAY if(L.status == 0) // LIGHT OKAY
if(uses < max_uses) if(uses < max_uses)
AddUses(1) add_uses(1)
user << "You insert \the [L.name] into \the [src.name]. You have [uses] light\s remaining." to_chat(user, "You insert \the [L.name] into \the [src.name]. You have [uses] light\s remaining.")
user.drop_item() user.drop_item()
qdel(L) qdel(L)
return return
else else
user << "You need a working light." to_chat(user, "You need a working light.")
return return
/obj/item/device/lightreplacer/attack_self(mob/user) /obj/item/device/lightreplacer/attack_self(mob/user)
@@ -95,10 +95,10 @@
var/mob/living/silicon/robot/R = user var/mob/living/silicon/robot/R = user
if(R.emagged) if(R.emagged)
src.Emag() src.Emag()
usr << "You shortcircuit the [src]." to_chat(usr, You short circuit the [src].")
return return
*/ */
usr << "It has [uses] lights remaining." to_chat(usr, "It has [uses] lights remaining.")
/obj/item/device/lightreplacer/update_icon() /obj/item/device/lightreplacer/update_icon()
icon_state = "lightreplacer[emagged]" icon_state = "lightreplacer[emagged]"
@@ -107,17 +107,17 @@
/obj/item/device/lightreplacer/proc/Use(var/mob/user) /obj/item/device/lightreplacer/proc/Use(var/mob/user)
playsound(src.loc, 'sound/machines/click.ogg', 50, 1) playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
AddUses(-1) add_uses(-1)
return 1 return 1
// Negative numbers will subtract // Negative numbers will subtract
/obj/item/device/lightreplacer/proc/AddUses(var/amount = 1) /obj/item/device/lightreplacer/proc/add_uses(var/amount = 1)
uses = min(max(uses + amount, 0), max_uses) uses = min(max(uses + amount, 0), max_uses)
/obj/item/device/lightreplacer/proc/Charge(var/mob/user, var/amount = 1) /obj/item/device/lightreplacer/proc/Charge(var/mob/user, var/amount = 1)
charge += amount charge += amount
if(charge > 6) if(charge > 6)
AddUses(1) add_uses(1)
charge = 0 charge = 0
/obj/item/device/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U) /obj/item/device/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U)

View File

@@ -426,12 +426,12 @@
for(var/obj/item/weapon/light/L in src.contents) for(var/obj/item/weapon/light/L in src.contents)
if(L.status == 0) if(L.status == 0)
if(LP.uses < LP.max_uses) if(LP.uses < LP.max_uses)
LP.AddUses(1) LP.add_uses(1)
amt_inserted++ amt_inserted++
remove_from_storage(L, T) remove_from_storage(L, T)
qdel(L) qdel(L)
if(amt_inserted) if(amt_inserted)
user << "You inserted [amt_inserted] light\s into \the [LP.name]. You have [LP.uses] light\s remaining." to_chat(user, "You inserted [amt_inserted] light\s into \the [LP.name]. You have [LP.uses] light\s remaining.")
return return
if(!can_be_inserted(W)) if(!can_be_inserted(W))
@@ -441,14 +441,14 @@
var/obj/item/weapon/tray/T = W var/obj/item/weapon/tray/T = W
if(T.calc_carry() > 0) if(T.calc_carry() > 0)
if(prob(85)) if(prob(85))
user << "<span class='warning'>The tray won't fit in [src].</span>" to_chat(user, "<span class='warning'>The tray won't fit in [src].</span>")
return return
else else
W.forceMove(get_turf(user)) W.forceMove(get_turf(user))
if ((user.client && user.s_active != src)) if ((user.client && user.s_active != src))
user.client.screen -= W user.client.screen -= W
W.dropped(user) W.dropped(user)
user << "<span class='warning'>God damnit!</span>" to_chat(user, "<span class='warning'>God damn it!</span>")
W.add_fingerprint(user) W.add_fingerprint(user)
return handle_item_insertion(W) return handle_item_insertion(W)
@@ -506,9 +506,9 @@
collection_mode = !collection_mode collection_mode = !collection_mode
switch (collection_mode) switch (collection_mode)
if(1) if(1)
usr << "[src] now picks up all items in a tile at once." to_chat(usr, "[src] now picks up all items on a tile at once.")
if(0) if(0)
usr << "[src] now picks up one item at a time." to_chat(usr, "[src] now picks up one item at a time.")
/obj/item/weapon/storage/verb/quick_empty() /obj/item/weapon/storage/verb/quick_empty()
@@ -539,7 +539,7 @@
var/total_storage_space = 0 var/total_storage_space = 0
for(var/obj/item/I in contents) for(var/obj/item/I in contents)
total_storage_space += I.get_storage_cost() total_storage_space += I.get_storage_cost()
max_storage_space = max(total_storage_space,max_storage_space) //prevents spawned containers from being too small for their contents max_storage_space = max(total_storage_space,max_storage_space) //Prevents spawned containers from being too small for their contents.
src.boxes = new /obj/screen/storage( ) src.boxes = new /obj/screen/storage( )
src.boxes.name = "storage" src.boxes.name = "storage"

View File

@@ -1060,4 +1060,22 @@ var/list/multi_point_spawns
/obj/item/clothing/suit/space/void/security/riot, /obj/item/clothing/suit/space/void/security/riot,
/obj/item/clothing/head/helmet/space/void/security/riot /obj/item/clothing/head/helmet/space/void/security/riot
) )
)
/obj/random/multiple/voidsuit/mining
name = "Random Mining Voidsuit"
desc = "This is a random mining voidsuit."
icon = 'icons/obj/clothing/suits.dmi'
icon_state = "rig-mining"
/obj/random/multiple/voidsuit/mining/item_to_spawn()
return pick(
prob(5);list(
/obj/item/clothing/suit/space/void/mining,
/obj/item/clothing/head/helmet/space/void/mining
),
prob(1);list(
/obj/item/clothing/suit/space/void/mining/alt,
/obj/item/clothing/head/helmet/space/void/mining/alt
)
) )

View File

@@ -77,6 +77,9 @@
return return
return return
/obj/structure/morgue/attack_robot(mob/user)
if(Adjacent(user))
attack_hand(user)
/obj/structure/morgue/attack_hand(mob/user as mob) /obj/structure/morgue/attack_hand(mob/user as mob)
if (src.connected) if (src.connected)
@@ -156,6 +159,10 @@
connected = null connected = null
return ..() return ..()
/obj/structure/m_tray/attack_robot(mob/user)
if(Adjacent(user))
attack_hand(user)
/obj/structure/m_tray/attack_hand(mob/user as mob) /obj/structure/m_tray/attack_hand(mob/user as mob)
if (src.connected) if (src.connected)
for(var/atom/movable/A as mob|obj in src.loc) for(var/atom/movable/A as mob|obj in src.loc)
@@ -181,7 +188,7 @@
if (user != O) if (user != O)
for(var/mob/B in viewers(user, 3)) for(var/mob/B in viewers(user, 3))
if ((B.client && !( B.blinded ))) if ((B.client && !( B.blinded )))
B << "<span class='warning'>\The [user] stuffs [O] into [src]!</span>" to_chat(B, "<span class='warning'>\The [user] stuffs [O] into [src]!</span>")
return return
@@ -189,25 +196,16 @@
* Crematorium * Crematorium
*/ */
/obj/structure/crematorium /obj/structure/morgue/crematorium
name = "crematorium" name = "crematorium"
desc = "A human incinerator. Works well on barbeque nights." desc = "A human incinerator. Works well on barbeque nights."
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "crema1" icon_state = "crema1"
density = 1
var/obj/structure/c_tray/connected = null
anchored = 1.0
var/cremating = 0 var/cremating = 0
var/id = 1 var/id = 1
var/locked = 0 var/locked = 0
/obj/structure/crematorium/Destroy() /obj/structure/morgue/crematorium/update()
if(connected)
qdel(connected)
connected = null
return ..()
/obj/structure/crematorium/proc/update()
if (src.connected) if (src.connected)
src.icon_state = "crema0" src.icon_state = "crema0"
else else
@@ -217,37 +215,7 @@
src.icon_state = "crema1" src.icon_state = "crema1"
return return
/obj/structure/crematorium/ex_act(severity) /obj/structure/morgue/crematorium/attack_hand(mob/user as mob)
switch(severity)
if(1.0)
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
ex_act(severity)
qdel(src)
return
if(2.0)
if (prob(50))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
ex_act(severity)
qdel(src)
return
if(3.0)
if (prob(5))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
ex_act(severity)
qdel(src)
return
return
/obj/structure/crematorium/attack_hand(mob/user as mob)
// if (cremating) AWW MAN! THIS WOULD BE SO MUCH MORE FUN ... TO WATCH
// user.show_message("<span class='warning'>Uh-oh, that was a bad idea.</span>", 1)
// //usr << "Uh-oh, that was a bad idea."
// src:loc:poison += 20000000
// src:loc:firelevel = src:loc:poison
// return
if (cremating) if (cremating)
usr << "<span class='warning'>It's locked.</span>" usr << "<span class='warning'>It's locked.</span>"
return return
@@ -260,10 +228,10 @@
qdel(src.connected) qdel(src.connected)
else if (src.locked == 0) else if (src.locked == 0)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
src.connected = new /obj/structure/c_tray( src.loc ) src.connected = new /obj/structure/m_tray/c_tray( src.loc )
step(src.connected, SOUTH) step(src.connected, EAST)
src.connected.layer = OBJ_LAYER src.connected.layer = OBJ_LAYER
var/turf/T = get_step(src, SOUTH) var/turf/T = get_step(src, EAST)
if (T.contents.Find(src.connected)) if (T.contents.Find(src.connected))
src.connected.connected = src src.connected.connected = src
src.icon_state = "crema0" src.icon_state = "crema0"
@@ -276,7 +244,7 @@
src.add_fingerprint(user) src.add_fingerprint(user)
update() update()
/obj/structure/crematorium/attackby(P as obj, mob/user as mob) /obj/structure/morgue/crematorium/attackby(P as obj, mob/user as mob)
if (istype(P, /obj/item/weapon/pen)) if (istype(P, /obj/item/weapon/pen))
var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
if (user.get_active_hand() != P) if (user.get_active_hand() != P)
@@ -291,13 +259,13 @@
src.add_fingerprint(user) src.add_fingerprint(user)
return return
/obj/structure/crematorium/relaymove(mob/user as mob) /obj/structure/morgue/crematorium/relaymove(mob/user as mob)
if (user.stat || locked) if (user.stat || locked)
return return
src.connected = new /obj/structure/c_tray( src.loc ) src.connected = new /obj/structure/m_tray/c_tray( src.loc )
step(src.connected, SOUTH) step(src.connected, EAST)
src.connected.layer = OBJ_LAYER src.connected.layer = OBJ_LAYER
var/turf/T = get_step(src, SOUTH) var/turf/T = get_step(src, EAST)
if (T.contents.Find(src.connected)) if (T.contents.Find(src.connected))
src.connected.connected = src src.connected.connected = src
src.icon_state = "crema0" src.icon_state = "crema0"
@@ -309,25 +277,22 @@
src.connected = null src.connected = null
return return
/obj/structure/crematorium/proc/cremate(atom/A, mob/user as mob) /obj/structure/morgue/crematorium/proc/cremate(atom/A, mob/user as mob)
// for(var/obj/machinery/crema_switch/O in src) //trying to figure a way to call the switch, too drunk to sort it out atm
// if(var/on == 1)
// return
if(cremating) if(cremating)
return //don't let you cremate something twice or w/e return //don't let you cremate something twice or w/e
if(contents.len <= 0) if(contents.len <= 0)
for (var/mob/M in viewers(src)) for (var/mob/M in viewers(src))
M.show_message("<span class='warning'>You hear a hollow crackle.</span>", 1) to_chat(M,"<span class='warning'>You hear a hollow crackle.</span>")
return return
else else
if(!isemptylist(src.search_contents_for(/obj/item/weapon/disk/nuclear))) if(!isemptylist(src.search_contents_for(/obj/item/weapon/disk/nuclear)))
usr << "You get the feeling that you shouldn't cremate one of the items in the cremator." to_chat(user,"You get the feeling that you shouldn't cremate one of the items in the cremator.")
return return
for (var/mob/M in viewers(src)) for (var/mob/M in viewers(src))
M.show_message("<span class='warning'>You hear a roar as the crematorium activates.</span>", 1) to_chat(M,"<span class='warning'>You hear a roar as the crematorium activates.</span>")
cremating = 1 cremating = 1
locked = 1 locked = 1
@@ -363,51 +328,11 @@
/* /*
* Crematorium tray * Crematorium tray
*/ */
/obj/structure/c_tray /obj/structure/m_tray/c_tray
name = "crematorium tray" name = "crematorium tray"
desc = "Apply body before burning." desc = "Apply body before burning."
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "cremat" icon_state = "cremat"
density = 1
layer = 2.0
var/obj/structure/crematorium/connected = null
anchored = 1
throwpass = 1
/obj/structure/c_tray/Destroy()
if(connected && connected.connected == src)
connected.connected = null
connected = null
return ..()
/obj/structure/c_tray/attack_hand(mob/user as mob)
if (src.connected)
for(var/atom/movable/A as mob|obj in src.loc)
if (!( A.anchored ))
A.forceMove(src.connected)
//Foreach goto(26)
src.connected.connected = null
src.connected.update()
add_fingerprint(user)
//SN src = null
qdel(src)
return
return
/obj/structure/c_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)))
return
if (!ismob(O) && !istype(O, /obj/structure/closet/body_bag))
return
if (!ismob(user) || user.stat || user.lying || user.stunned)
return
O.forceMove(src.loc)
if (user != O)
for(var/mob/B in viewers(user, 3))
if ((B.client && !( B.blinded )))
B << text("<span class='warning'>[] stuffs [] into []!</span>", user, O, src)
//Foreach goto(99)
return
/obj/machinery/button/crematorium /obj/machinery/button/crematorium
name = "crematorium igniter" name = "crematorium igniter"
@@ -421,9 +346,9 @@
if(..()) if(..())
return return
if(src.allowed(user)) if(src.allowed(user))
for (var/obj/structure/crematorium/C in world) for (var/obj/structure/morgue/crematorium/C in world)
if (C.id == id) if (C.id == id)
if (!C.cremating) if (!C.cremating)
C.cremate(user) C.cremate(user)
else else
usr << "<span class='warning'>Access denied.</span>" to_chat(user,"<span class='warning'>Access denied.</span>")

View File

@@ -428,7 +428,7 @@
var/list/dirs = list() var/list/dirs = list()
if(anchored) if(anchored)
for(var/obj/structure/window/W in orange(src,1)) for(var/obj/structure/window/W in orange(src,1))
if(W.anchored && W.density && W.type == src.type && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows. if(W.anchored && W.density && W.glasstype == src.glasstype && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows.
dirs += get_dir(src, W) dirs += get_dir(src, W)
var/list/connections = dirs_to_corner_states(dirs) var/list/connections = dirs_to_corner_states(dirs)

View File

@@ -1467,7 +1467,7 @@ datum/admins/var/obj/item/weapon/paper/admin/faxreply // var to hold fax replies
if(destination.recievefax(P)) if(destination.receivefax(P))
src.owner << "<span class='notice'>Message reply to transmitted successfully.</span>" src.owner << "<span class='notice'>Message reply to transmitted successfully.</span>"
if(P.sender) // sent as a reply if(P.sender) // sent as a reply
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(P.sender)]") log_admin("[key_name(src.owner)] replied to a fax message from [key_name(P.sender)]")

View File

@@ -112,6 +112,8 @@ list[](
/datum/integrated_io/proc/write_data_to_pin(var/new_data) /datum/integrated_io/proc/write_data_to_pin(var/new_data)
if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want. if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want.
if(istext(new_data))
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
data = new_data data = new_data
holder.on_data_written() holder.on_data_written()

View File

@@ -4,11 +4,14 @@
/datum/integrated_io/string/ask_for_pin_data(mob/user) /datum/integrated_io/string/ask_for_pin_data(mob/user)
var/new_data = input("Please type in a string.","[src] string writing") as null|text var/new_data = input("Please type in a string.","[src] string writing") as null|text
if(holder.check_interactivity(user) ) new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(new_data && holder.check_interactivity(user) )
to_chat(user, "<span class='notice'>You input [new_data ? "new_data" : "NULL"] into the pin.</span>") to_chat(user, "<span class='notice'>You input [new_data ? "new_data" : "NULL"] into the pin.</span>")
write_data_to_pin(new_data) write_data_to_pin(new_data)
/datum/integrated_io/string/write_data_to_pin(var/new_data) /datum/integrated_io/string/write_data_to_pin(var/new_data)
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(isnull(new_data) || istext(new_data)) if(isnull(new_data) || istext(new_data))
data = new_data data = new_data
holder.on_data_written() holder.on_data_written()

View File

@@ -125,6 +125,7 @@
if("string") if("string")
accepting_refs = 0 accepting_refs = 0
new_data = input("Now type in a string.","[src] string writing") as null|text new_data = input("Now type in a string.","[src] string writing") as null|text
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(istext(new_data) && CanInteract(user, physical_state)) if(istext(new_data) && CanInteract(user, physical_state))
data_to_write = new_data data_to_write = new_data
to_chat(user, "<span class='notice'>You set \the [src]'s memory to \"[new_data]\".</span>") to_chat(user, "<span class='notice'>You set \the [src]'s memory to \"[new_data]\".</span>")

View File

@@ -85,7 +85,7 @@ var/datum/species/shapeshifter/promethean/prometheans
/mob/living/carbon/human/proc/regenerate /mob/living/carbon/human/proc/regenerate
) )
valid_transform_species = list("Human", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey") valid_transform_species = list("Human", "Vatborn", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey")
monochromatic = 1 monochromatic = 1
var/heal_rate = 0.5 // Temp. Regen per tick. var/heal_rate = 0.5 // Temp. Regen per tick.

View File

@@ -19,7 +19,7 @@
shuttle.area_offsite = shuttle.area_station shuttle.area_offsite = shuttle.area_station
shuttle_controller.shuttles[shuttle_tag] = shuttle shuttle_controller.shuttles[shuttle_tag] = shuttle
shuttle_controller.process_shuttles += shuttle shuttle_controller.process_shuttles += shuttle
testing("Exploration shuttle '[shuttle_tag]' at zlevel [z] successfully added.") testing("Exploration shuttle '[shuttle_tag]' at z-level [z] successfully added.")
//Sets destination to new sector. Can be null. //Sets destination to new sector. Can be null.
/obj/machinery/computer/shuttle_control/explore/proc/update_destination(var/obj/effect/map/D) /obj/machinery/computer/shuttle_control/explore/proc/update_destination(var/obj/effect/map/D)
@@ -84,7 +84,7 @@
else else
shuttle_status = "Standing-by at offsite location." shuttle_status = "Standing-by at offsite location."
if(WAIT_LAUNCH, FORCE_LAUNCH) if(WAIT_LAUNCH, FORCE_LAUNCH)
shuttle_status = "Shuttle has recieved command and will depart shortly." shuttle_status = "Shuttle has received command and will depart shortly."
if(WAIT_ARRIVE) if(WAIT_ARRIVE)
shuttle_status = "Proceeding to destination." shuttle_status = "Proceeding to destination."
if(WAIT_FINISH) if(WAIT_FINISH)

View File

@@ -58,7 +58,7 @@
text = "<hr><font size= \"1\">" text = "<hr><font size= \"1\">"
text += "This transmission is intended only for the addressee and may contain confidential information. Any unauthorized disclosure is strictly prohibited. <br><br>" text += "This transmission is intended only for the addressee and may contain confidential information. Any unauthorized disclosure is strictly prohibited. <br><br>"
text += "If this transmission is recieved in error, please notify both the sender and the office of [using_map.boss_name] Internal Affairs immediately so that corrective action may be taken." text += "If this transmission is received in error, please notify both the sender and the office of [using_map.boss_name] Internal Affairs immediately so that corrective action may be taken."
text += "Failure to comply is a breach of regulation and may be prosecuted to the fullest extent of the law, where applicable." text += "Failure to comply is a breach of regulation and may be prosecuted to the fullest extent of the law, where applicable."
text += "</font>" text += "</font>"

View File

@@ -80,7 +80,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
if(copyitem) if(copyitem)
copyitem.loc = usr.loc copyitem.loc = usr.loc
usr.put_in_hands(copyitem) usr.put_in_hands(copyitem)
usr << "<span class='notice'>You take \the [copyitem] out of \the [src].</span>" to_chat(usr, "<span class='notice'>You take \the [copyitem] out of \the [src].</span>")
copyitem = null copyitem = null
if(href_list["scan"]) if(href_list["scan"])
@@ -124,7 +124,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
var/success = 0 var/success = 0
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes) for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
if( F.department == destination ) if( F.department == destination )
success = F.recievefax(copyitem) success = F.receivefax(copyitem)
if (success) if (success)
visible_message("[src] beeps, \"Message transmitted successfully.\"") visible_message("[src] beeps, \"Message transmitted successfully.\"")
@@ -132,7 +132,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
else else
visible_message("[src] beeps, \"Error transmitting message.\"") visible_message("[src] beeps, \"Error transmitting message.\"")
/obj/machinery/photocopier/faxmachine/proc/recievefax(var/obj/item/incoming) /obj/machinery/photocopier/faxmachine/proc/receivefax(var/obj/item/incoming)
if(stat & (BROKEN|NOPOWER)) if(stat & (BROKEN|NOPOWER))
return 0 return 0
@@ -164,7 +164,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
use_power(200) use_power(200)
//recieved copies should not use toner since it's being used by admins only. //received copies should not use toner since it's being used by admins only.
var/obj/item/rcvdcopy var/obj/item/rcvdcopy
if (istype(copyitem, /obj/item/weapon/paper)) if (istype(copyitem, /obj/item/weapon/paper))
rcvdcopy = copy(copyitem, 0) rcvdcopy = copy(copyitem, 0)

View File

@@ -85,7 +85,7 @@
/obj/item/projectile/beam/darkmatter /obj/item/projectile/beam/darkmatter
name = "dark matter bolt" name = "dark matter bolt"
icon_state = "darkb" icon_state = "darkb"
damage = 60 damage = 35
armor_penetration = 35 armor_penetration = 35
damage_type = BRUTE damage_type = BRUTE
check_armour = "energy" check_armour = "energy"

View File

@@ -50,8 +50,8 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) if (istype(user, /obj/machinery/computer/shuttle_control/emergency))
var/obj/machinery/computer/shuttle_control/emergency/C = user var/obj/machinery/computer/shuttle_control/emergency/C = user
//initiating or cancelling a launch ALWAYS requires authorization, but if we are already set to launch anyways than forcing does not. //Initiating or cancelling a launch ALWAYS requires authorization, but if we are already set to launch anyways than forcing does not.
//this is so that people can force launch if the docking controller cannot safely undock without needing X heads to swipe. //This is so that people can force launch if the docking controller cannot safely undock without needing X heads to swipe.
if (!(process_state == WAIT_LAUNCH || C.has_authorization())) if (!(process_state == WAIT_LAUNCH || C.has_authorization()))
return 0 return 0
return ..() return ..()
@@ -69,11 +69,11 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console
if (emergency_shuttle.autopilot) if (emergency_shuttle.autopilot)
emergency_shuttle.autopilot = 0 emergency_shuttle.autopilot = 0
world << "<span class='notice'><b>Alert: The shuttle autopilot has been overridden. Launch sequence initiated!</b></span>" to_chat(world, "<span class='notice'><b>Alert: The shuttle autopilot has been overridden. Launch sequence initiated!</b></span>")
if(usr) if(usr)
log_admin("[key_name(usr)] has overridden the shuttle autopilot and activated launch sequence") log_admin("[key_name(usr)] has overridden the departure shuttle's autopilot and activated the launch sequence.")
message_admins("[key_name_admin(usr)] has overridden the shuttle autopilot and activated launch sequence") message_admins("[key_name_admin(usr)] has overridden the departure shuttle's autopilot and activated the launch sequence.")
..(user) ..(user)
@@ -83,11 +83,11 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console
if (emergency_shuttle.autopilot) if (emergency_shuttle.autopilot)
emergency_shuttle.autopilot = 0 emergency_shuttle.autopilot = 0
world << "<span class='notice'><b>Alert: The shuttle autopilot has been overridden. Bluespace drive engaged!</b></span>" to_chat(world, "<span class='notice'><b>Alert: The shuttle autopilot has been overridden. Bluespace drive engaged!</b></span>")
if(usr) if(usr)
log_admin("[key_name(usr)] has overridden the shuttle autopilot and forced immediate launch") log_admin("[key_name(usr)] has overridden the departure shuttle's autopilot and forced immediate launch.")
message_admins("[key_name_admin(usr)] has overridden the shuttle autopilot and forced immediate launch") message_admins("[key_name_admin(usr)] has overridden the departure shuttle's autopilot and forced immediate launch.")
..(user) ..(user)
@@ -97,11 +97,11 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console
if (emergency_shuttle.autopilot) if (emergency_shuttle.autopilot)
emergency_shuttle.autopilot = 0 emergency_shuttle.autopilot = 0
world << "<span class='notice'><b>Alert: The shuttle autopilot has been overridden. Launch sequence aborted!</b></span>" to_chat(world, "<span class='notice'><b>Alert: The shuttle autopilot has been overridden. Launch sequence aborted!</b></span>")
if(usr) if(usr)
log_admin("[key_name(usr)] has overridden the shuttle autopilot and cancelled launch sequence") log_admin("[key_name(usr)] has overridden the departure shuttle's autopilot and cancelled the launch sequence.")
message_admins("[key_name_admin(usr)] has overridden the shuttle autopilot and cancelled launch sequence") message_admins("[key_name_admin(usr)] has overridden the departure shuttle's autopilot and cancelled the launch sequence.")
..(user) ..(user)
@@ -117,7 +117,7 @@
return (authorized.len >= req_authorizations || emagged) return (authorized.len >= req_authorizations || emagged)
/obj/machinery/computer/shuttle_control/emergency/proc/reset_authorization() /obj/machinery/computer/shuttle_control/emergency/proc/reset_authorization()
//no need to reset emagged status. If they really want to go back to the station they can. //No need to reset emagged status. If they really want to go back to the station they can.
authorized = initial(authorized) authorized = initial(authorized)
//returns 1 if the ID was accepted and a new authorization was added, 0 otherwise //returns 1 if the ID was accepted and a new authorization was added, 0 otherwise
@@ -145,16 +145,19 @@
if (dna_hash in authorized) if (dna_hash in authorized)
src.visible_message("\The [src] buzzes. That ID has already been scanned.") src.visible_message("\The [src] buzzes. That ID has already been scanned.")
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
return 0 return 0
if (!(access_heads in access)) if (!(access_heads in access))
src.visible_message("\The [src] buzzes, rejecting [ident].") src.visible_message("\The [src] buzzes, rejecting [ident].")
playsound(src.loc, 'sound/machines/deniedbeep.ogg', 50, 0)
return 0 return 0
src.visible_message("\The [src] beeps as it scans [ident].") src.visible_message("\The [src] beeps as it scans [ident].")
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
authorized[dna_hash] = auth_name authorized[dna_hash] = auth_name
if (req_authorizations - authorized.len) if (req_authorizations - authorized.len)
world << "<span class='notice'><b>Alert: [req_authorizations - authorized.len] authorization\s needed to override the shuttle autopilot.</b></span>" to_chat(world, "<span class='notice'><b>Alert: [req_authorizations - authorized.len] authorization\s needed to override the shuttle autopilot.</b></span>") //TODO- Belsima, make this an announcement instead of magic.
if(usr) if(usr)
log_admin("[key_name(usr)] has inserted [ID] into the shuttle control computer - [req_authorizations - authorized.len] authorisation\s needed") log_admin("[key_name(usr)] has inserted [ID] into the shuttle control computer - [req_authorizations - authorized.len] authorisation\s needed")
@@ -164,7 +167,7 @@
/obj/machinery/computer/shuttle_control/emergency/emag_act(var/remaining_charges, var/mob/user) /obj/machinery/computer/shuttle_control/emergency/emag_act(var/remaining_charges, var/mob/user)
if (!emagged) if (!emagged)
user << "<span class='notice'>You short out \the [src]'s authorization protocols.</span>" to_chat(user, "<span class='notice'>You short out \the [src]'s authorization protocols.</span>")
emagged = 1 emagged = 1
return 1 return 1
@@ -190,11 +193,11 @@
if (shuttle.in_use) if (shuttle.in_use)
shuttle_status = "Busy." shuttle_status = "Busy."
else if (!shuttle.location) else if (!shuttle.location)
shuttle_status = "Standing-by at [station_name()]." shuttle_status = "Standing by at [station_name()]."
else else
shuttle_status = "Standing-by at [using_map.dock_name]." shuttle_status = "Standing by at [using_map.dock_name]."
if(WAIT_LAUNCH, FORCE_LAUNCH) if(WAIT_LAUNCH, FORCE_LAUNCH)
shuttle_status = "Shuttle has recieved command and will depart shortly." shuttle_status = "Shuttle has received command and will depart shortly."
if(WAIT_ARRIVE) if(WAIT_ARRIVE)
shuttle_status = "Proceeding to destination." shuttle_status = "Proceeding to destination."
if(WAIT_FINISH) if(WAIT_FINISH)

View File

@@ -174,7 +174,7 @@
return return
if (MS.moving_status != SHUTTLE_IDLE) if (MS.moving_status != SHUTTLE_IDLE)
usr << "<font color='blue'>[shuttle_tag] vessel is moving.</font>" to_chat(usr, "<font color='blue'>[shuttle_tag] vessel is moving.</font>")
return return
if(href_list["dock_command"]) if(href_list["dock_command"])
@@ -187,11 +187,11 @@
if(href_list["start"]) if(href_list["start"])
if(MS.at_origin) if(MS.at_origin)
usr << "<font color='red'>You are already at your home base.</font>" to_chat(usr, "<font color='red'>You are already at the home base.</font>")
return return
if((MS.last_move + MS.cooldown*10) > world.time) if((MS.last_move + MS.cooldown*10) > world.time)
usr << "<font color='red'>The ship's drive is inoperable while the engines are charging.</font>" to_chat(usr, "<font color='red'>The ship's drive is inoperable while the engines are charging.</font>")
return return
if(!check_docking(MS)) if(!check_docking(MS))
@@ -214,11 +214,11 @@
if(!MS.can_cloak) if(!MS.can_cloak)
return return
MS.cloaked = !MS.cloaked MS.cloaked = !MS.cloaked
usr << "<font color='red'>Ship stealth systems have been [(MS.cloaked ? "activated. The station will not" : "deactivated. The station will")] be warned of our arrival.</font>" to_chat(usr, "<font color='red'>Ship stealth systems have been [(MS.cloaked ? "activated. The station will not" : "deactivated. The station will")] be warned of our arrival.</font>")
if(href_list["move_multi"]) if(href_list["move_multi"])
if((MS.last_move + MS.cooldown*10) > world.time) if((MS.last_move + MS.cooldown*10) > world.time)
usr << "<font color='red'>The ship's drive is inoperable while the engines are charging.</font>" to_chat(usr, "<font color='red'>The ship's drive is inoperable while the engines are charging.</font>")
return return
if(!check_docking(MS)) if(!check_docking(MS))
@@ -228,7 +228,7 @@
var/choice = input("Select a destination.") as null|anything in MS.destinations var/choice = input("Select a destination.") as null|anything in MS.destinations
if(!choice) return if(!choice) return
usr << "<font color='blue'>[shuttle_tag] main computer recieved message.</font>" to_chat(usr, "<font color='blue'>[shuttle_tag] main computer received message.</font>")
if(MS.at_origin) if(MS.at_origin)
MS.announce_arrival() MS.announce_arrival()

View File

@@ -13,8 +13,8 @@
/area/supply/station, /area/supply/station,
/area/mine, /area/mine,
/area/vacant/vacant_shop, /area/vacant/vacant_shop,
/area/submap /area/turbolift,
) /area/submap )
var/list/exempt_from_atmos = typesof(/area/maintenance, var/list/exempt_from_atmos = typesof(/area/maintenance,
/area/storage, /area/storage,
@@ -34,6 +34,11 @@
/area/vacant/vacant_shop /area/vacant/vacant_shop
) )
// Some maps have areas specific to the map, so include those.
exempt_areas += using_map.unit_test_exempt_areas
exempt_from_atmos += using_map.unit_test_exempt_from_atmos
exempt_from_apc += using_map.unit_test_exempt_from_apc
for(var/area/A in world) for(var/area/A in world)
if(A.z == 1 && !(A.type in exempt_areas)) if(A.z == 1 && !(A.type in exempt_areas))
area_test_count++ area_test_count++

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 321 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Some files were not shown because too many files have changed in this diff Show More