Merge branch 'Citadel-Station-13:master' into WanderingFox95-TribalOverhaul
This commit is contained in:
@@ -37,7 +37,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/ai_monitored/turret_protected/AIsatextAP
|
||||
name = "AI Sat Ext"
|
||||
icon_state = "storage"
|
||||
|
||||
|
||||
/area/arrival
|
||||
requires_power = FALSE
|
||||
|
||||
@@ -296,6 +296,28 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
icon_state = "xenomaint"
|
||||
area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE | CULT_PERMITTED
|
||||
|
||||
//Maintenance - Prison
|
||||
|
||||
/area/maintenance/prison
|
||||
name = "Prison Maintenance"
|
||||
icon_state = "prison_maintenance"
|
||||
|
||||
/area/maintenance/prison/fore
|
||||
name = "Prison Fore Maintenance"
|
||||
icon_state = "prison_maintenance"
|
||||
|
||||
/area/maintenance/prison/starboard
|
||||
name = "Prison Starboard Maintenance"
|
||||
icon_state = "prison_maintenance"
|
||||
|
||||
/area/maintenance/prison/aft
|
||||
name = "Prison Aft Maintenance"
|
||||
icon_state = "prison_maintenance"
|
||||
|
||||
/area/maintenance/prison/port
|
||||
name = "Prison Port Maintenance"
|
||||
icon_state = "prison_maintenance"
|
||||
|
||||
//Maintenance - Generic
|
||||
|
||||
/area/maintenance/arrivals/north
|
||||
@@ -1393,13 +1415,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Prison Wing"
|
||||
icon_state = "sec_prison"
|
||||
|
||||
/area/security/prison/toilet //radproof
|
||||
name = "Prison Toilet"
|
||||
icon_state = "sec_prison_safe"
|
||||
|
||||
/area/security/prison/safe //radproof
|
||||
/area/security/prison/cells
|
||||
name = "Prison Wing Cells"
|
||||
icon_state = "sec_prison_safe"
|
||||
icon_state = "prison_cells"
|
||||
|
||||
/area/security/prison/upper
|
||||
name = "Upper Prison Wing"
|
||||
|
||||
@@ -553,7 +553,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
A.power_equip = power_equip
|
||||
A.power_environ = power_environ
|
||||
INVOKE_ASYNC(A, .proc/power_change)
|
||||
update_icon()
|
||||
update_appearance()
|
||||
|
||||
/area/proc/usage(chan)
|
||||
switch(chan)
|
||||
|
||||
+53
-12
@@ -103,6 +103,9 @@
|
||||
/// A luminescence-shifted value of the last color calculated for chatmessage overlays
|
||||
var/chat_color_darkened
|
||||
|
||||
///Used for changing icon states for different base sprites.
|
||||
var/base_icon_state
|
||||
|
||||
///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
|
||||
var/list/targeted_by
|
||||
|
||||
@@ -169,7 +172,7 @@
|
||||
* * [/turf/open/space/proc/Initialize]
|
||||
*/
|
||||
/atom/proc/Initialize(mapload, ...)
|
||||
// SHOULD_NOT_SLEEP(TRUE)
|
||||
SHOULD_NOT_SLEEP(TRUE)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
if(flags_1 & INITIALIZED_1)
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
@@ -531,37 +534,75 @@
|
||||
if(!LAZYLEN(.)) // lol ..length
|
||||
return list("<span class='notice'><i>You examine [src] closer, but find nothing of interest...</i></span>")
|
||||
|
||||
/**
|
||||
* Updates the appearence of the icon
|
||||
*
|
||||
* Mostly delegates to update_name, update_desc, and update_icon
|
||||
*
|
||||
* Arguments:
|
||||
* - updates: A set of bitflags dictating what should be updated. Defaults to [ALL]
|
||||
*/
|
||||
/atom/proc/update_appearance(updates=ALL)
|
||||
//SHOULD_NOT_SLEEP(TRUE)
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
|
||||
. = NONE
|
||||
updates &= ~SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_APPEARANCE, updates)
|
||||
if(updates & UPDATE_NAME)
|
||||
. |= update_name(updates)
|
||||
if(updates & UPDATE_DESC)
|
||||
. |= update_desc(updates)
|
||||
if(updates & UPDATE_ICON)
|
||||
. |= update_icon(updates)
|
||||
|
||||
/// Updates the name of the atom
|
||||
/atom/proc/update_name(updates=ALL)
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_NAME, updates)
|
||||
|
||||
/// Updates the description of the atom
|
||||
/atom/proc/update_desc(updates=ALL)
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_DESC, updates)
|
||||
|
||||
/// Updates the icon of the atom
|
||||
/atom/proc/update_icon()
|
||||
// I expect we're going to need more return flags and options in this proc
|
||||
var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON)
|
||||
. = FALSE
|
||||
/atom/proc/update_icon(updates=ALL)
|
||||
SIGNAL_HANDLER
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
|
||||
if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE))
|
||||
. = NONE
|
||||
updates &= ~SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON, updates)
|
||||
if(updates & UPDATE_ICON_STATE)
|
||||
update_icon_state()
|
||||
. = TRUE
|
||||
. |= UPDATE_ICON_STATE
|
||||
|
||||
if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS))
|
||||
var/list/new_overlays = update_overlays()
|
||||
if(updates & UPDATE_OVERLAYS)
|
||||
if(LAZYLEN(managed_vis_overlays))
|
||||
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
|
||||
|
||||
var/list/new_overlays = update_overlays(updates)
|
||||
if(managed_overlays)
|
||||
cut_overlay(managed_overlays)
|
||||
managed_overlays = null
|
||||
if(length(new_overlays))
|
||||
managed_overlays = new_overlays
|
||||
add_overlay(new_overlays)
|
||||
. = TRUE
|
||||
. |= UPDATE_OVERLAYS
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_UPDATED_ICON, signalOut, .)
|
||||
. |= SEND_SIGNAL(src, COMSIG_ATOM_UPDATED_ICON, updates, .)
|
||||
|
||||
/// Updates the icon state of the atom
|
||||
/atom/proc/update_icon_state()
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON_STATE)
|
||||
|
||||
/// Updates the overlays of the atom
|
||||
/atom/proc/update_overlays()
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
. = list()
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .)
|
||||
|
||||
|
||||
/atom/proc/relaymove(mob/living/user)
|
||||
if(!istype(user))
|
||||
return //why are you buckling nonliving mobs to atoms?
|
||||
|
||||
@@ -66,7 +66,11 @@
|
||||
. = ..()
|
||||
switch(blocks_emissive)
|
||||
if(EMISSIVE_BLOCK_GENERIC)
|
||||
update_emissive_block()
|
||||
var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha)
|
||||
gen_emissive_blocker.color = GLOB.em_block_color
|
||||
gen_emissive_blocker.dir = dir
|
||||
gen_emissive_blocker.appearance_flags |= appearance_flags
|
||||
add_overlay(list(gen_emissive_blocker))
|
||||
if(EMISSIVE_BLOCK_UNIQUE)
|
||||
render_target = ref(src)
|
||||
em_block = new(src, render_target)
|
||||
@@ -111,13 +115,23 @@
|
||||
/atom/movable/proc/update_emissive_block()
|
||||
if(blocks_emissive != EMISSIVE_BLOCK_GENERIC)
|
||||
return
|
||||
if(length(managed_vis_overlays))
|
||||
for(var/a in managed_vis_overlays)
|
||||
var/obj/effect/overlay/vis/vs
|
||||
if(vs.plane == EMISSIVE_BLOCKER_PLANE)
|
||||
SSvis_overlays.remove_vis_overlay(src, list(vs))
|
||||
break
|
||||
SSvis_overlays.add_vis_overlay(src, icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE, dir)
|
||||
else if (blocks_emissive == EMISSIVE_BLOCK_GENERIC)
|
||||
var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha)
|
||||
gen_emissive_blocker.color = GLOB.em_block_color
|
||||
gen_emissive_blocker.dir = dir
|
||||
gen_emissive_blocker.appearance_flags |= appearance_flags
|
||||
return gen_emissive_blocker
|
||||
else if(blocks_emissive == EMISSIVE_BLOCK_UNIQUE)
|
||||
if(!em_block)
|
||||
render_target = ref(src)
|
||||
em_block = new(src, render_target)
|
||||
return em_block
|
||||
|
||||
/atom/movable/update_overlays()
|
||||
. = ..()
|
||||
var/emissive_block = update_emissive_block()
|
||||
if(emissive_block)
|
||||
. += emissive_block
|
||||
|
||||
/atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction)
|
||||
if(!direction)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
antag_flag = ROLE_BLOODSUCKER
|
||||
false_report_weight = 1
|
||||
chaos = 4
|
||||
restricted_jobs = list("AI","Cyborg")
|
||||
restricted_jobs = list("Prisoner", "AI","Cyborg")
|
||||
protected_jobs = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 20
|
||||
required_enemies = 2
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
config_tag = "traitorbro"
|
||||
required_players = 25
|
||||
chaos = 5
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
restricted_jobs = list("Prisoner", "AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
|
||||
announce_span = "danger"
|
||||
|
||||
@@ -11,7 +11,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
|
||||
antag_flag = ROLE_CHANGELING
|
||||
false_report_weight = 10
|
||||
chaos = 5
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
restricted_jobs = list("Prisoner", "AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to ling role blacklist
|
||||
required_players = 15
|
||||
required_enemies = 1
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
false_report_weight = 10
|
||||
chaos = 6
|
||||
traitors_possible = 3 //hard limit on traitors if scaling is turned off
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
restricted_jobs = list("Prisoner", "AI", "Cyborg")
|
||||
required_players = 25
|
||||
required_enemies = 1 // how many of each type are required
|
||||
recommended_enemies = 3
|
||||
|
||||
@@ -139,7 +139,7 @@ Credit where due:
|
||||
required_enemies = 3
|
||||
recommended_enemies = 5
|
||||
enemy_minimum_age = 7
|
||||
protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //Silicons can eventually be converted
|
||||
protected_jobs = list("Prisoner", "AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //Silicons can eventually be converted
|
||||
restricted_jobs = list("Chaplain", "Captain")
|
||||
announce_span = "brass"
|
||||
announce_text = "Servants of Ratvar are trying to summon the Justiciar!\n\
|
||||
@@ -151,14 +151,14 @@ Credit where due:
|
||||
var/datum/team/clockcult/main_clockcult
|
||||
|
||||
/datum/game_mode/clockwork_cult/pre_setup() //Gamemode and job code is pain. Have fun codediving all of that stuff, whoever works on this next - Delta
|
||||
/*var/list/errorList = list()
|
||||
var/list/errorList = list()
|
||||
var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
|
||||
if(errorList.len) // reebe failed to load
|
||||
message_admins("Reebe failed to load!")
|
||||
log_game("Reebe failed to load!")
|
||||
return FALSE
|
||||
for(var/datum/parsed_map/PM in reebes) //Temporarily commented because of z-level loading reliably segfaulting the server.
|
||||
PM.initTemplateBounds()*/
|
||||
PM.initTemplateBounds()
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
restricted_jobs += protected_jobs
|
||||
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
|
||||
@@ -275,7 +275,7 @@ Credit where due:
|
||||
ears = /obj/item/radio/headset
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
belt = /obj/item/storage/belt/utility/servant
|
||||
backpack_contents = list(/obj/item/storage/box/engineer = 1, \
|
||||
backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
|
||||
/obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/reagent_containers/food/drinks/bottle/holyoil = 1)
|
||||
id = /obj/item/pda
|
||||
var/plasmaman //We use this to determine if we should activate internals in post_equip()
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
l_pocket = /obj/item/pinpointer/nuke/syndicate
|
||||
r_pocket = /obj/item/bikehorn
|
||||
id = /obj/item/card/id/syndicate
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1,\
|
||||
backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
|
||||
/obj/item/kitchen/knife/combat/survival,
|
||||
/obj/item/reagent_containers/spray/waterflower/lube)
|
||||
implants = list(/obj/item/implant/sad_trombone)
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
antag_flag = ROLE_CULTIST
|
||||
false_report_weight = 10
|
||||
chaos = 8
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
restricted_jobs = list("Prisoner", "AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 30
|
||||
required_enemies = 3
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
antag_flag = ROLE_DEVIL
|
||||
false_report_weight = 1
|
||||
chaos = 3
|
||||
protected_jobs = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI")
|
||||
protected_jobs = list("Prisoner", "Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI")
|
||||
required_players = 0
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
antag_flag = ROLE_HERETIC
|
||||
false_report_weight = 5
|
||||
chaos = 5
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
restricted_jobs = list("Prisoner", "AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to heretic role blacklist
|
||||
required_players = 15
|
||||
required_enemies = 1
|
||||
|
||||
@@ -7,7 +7,7 @@ GLOBAL_LIST_EMPTY(gangs)
|
||||
config_tag = "gang"
|
||||
antag_flag = ROLE_GANG
|
||||
chaos = 9
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
restricted_jobs = list("Prisoner", "AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 15
|
||||
required_enemies = 0
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
l_pocket = /obj/item/pinpointer/nuke/syndicate
|
||||
id = /obj/item/card/id/syndicate
|
||||
belt = /obj/item/gun/ballistic/automatic/pistol
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1,\
|
||||
backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
|
||||
/obj/item/kitchen/knife/combat/survival)
|
||||
|
||||
var/tc = 25
|
||||
@@ -173,7 +173,7 @@
|
||||
internals_slot = SLOT_R_STORE
|
||||
belt = /obj/item/storage/belt/military
|
||||
r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1,\
|
||||
backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
|
||||
/obj/item/tank/jetpack/oxygen/harness=1,\
|
||||
/obj/item/gun/ballistic/automatic/pistol=1,\
|
||||
/obj/item/kitchen/knife/combat/survival)
|
||||
@@ -188,7 +188,7 @@
|
||||
r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
|
||||
internals_slot = SLOT_R_STORE
|
||||
belt = /obj/item/storage/belt/military
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1,\
|
||||
backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
|
||||
/obj/item/tank/jetpack/oxygen/harness=1,\
|
||||
/obj/item/gun/ballistic/automatic/pistol=1,\
|
||||
/obj/item/kitchen/knife/combat/survival)
|
||||
|
||||
@@ -160,12 +160,14 @@ If not set, defaults to check_completion instead. Set it. It's used by cryo.
|
||||
|
||||
/datum/objective/proc/give_special_equipment(special_equipment)
|
||||
var/datum/mind/receiver = pick(get_owners())
|
||||
. = list()
|
||||
if(receiver && receiver.current)
|
||||
if(ishuman(receiver.current))
|
||||
var/mob/living/carbon/human/H = receiver.current
|
||||
var/list/slots = list("backpack" = SLOT_IN_BACKPACK)
|
||||
for(var/eq_path in special_equipment)
|
||||
var/obj/O = new eq_path
|
||||
. += O
|
||||
H.equip_in_one_of_slots(O, slots, critical = TRUE)
|
||||
|
||||
/datum/objective/assassinate
|
||||
@@ -560,6 +562,7 @@ GLOBAL_LIST_EMPTY(possible_items)
|
||||
name = "steal"
|
||||
var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later.
|
||||
var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums).
|
||||
var/list/special_items_given = list()
|
||||
martyr_compatible = 0
|
||||
|
||||
/datum/objective/steal/get_target()
|
||||
@@ -571,6 +574,11 @@ GLOBAL_LIST_EMPTY(possible_items)
|
||||
for(var/I in subtypesof(/datum/objective_item/steal))
|
||||
new I
|
||||
|
||||
/datum/objective/steal/Destroy(force, ...)
|
||||
if(length(special_items_given))
|
||||
QDEL_LIST(special_items_given)
|
||||
. = ..()
|
||||
|
||||
/datum/objective/steal/find_target(dupe_search_range, blacklist)
|
||||
var/list/datum/mind/owners = get_owners()
|
||||
var/approved_targets = list()
|
||||
@@ -589,7 +597,7 @@ GLOBAL_LIST_EMPTY(possible_items)
|
||||
targetinfo = item
|
||||
steal_target = targetinfo.targetitem
|
||||
explanation_text = "Steal [targetinfo.name]"
|
||||
give_special_equipment(targetinfo.special_equipment)
|
||||
special_items_given = give_special_equipment(targetinfo.special_equipment)
|
||||
return steal_target
|
||||
else
|
||||
explanation_text = "Free objective"
|
||||
@@ -1180,6 +1188,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages)
|
||||
/datum/objective/sabotage
|
||||
name = "sabotage"
|
||||
var/datum/sabotage_objective/targetinfo = null //composition > inheritance.
|
||||
var/list/special_items_given = list()
|
||||
|
||||
/datum/objective/sabotage/get_target()
|
||||
return targetinfo.sabotage_type
|
||||
@@ -1190,6 +1199,11 @@ GLOBAL_LIST_EMPTY(possible_sabotages)
|
||||
for(var/I in subtypesof(/datum/sabotage_objective))
|
||||
new I
|
||||
|
||||
/datum/objective/sabotage/Destroy()
|
||||
if(length(special_items_given))
|
||||
QDEL_LIST(special_items_given)
|
||||
. = ..()
|
||||
|
||||
/datum/objective/sabotage/find_target(dupe_search_range, blacklist)
|
||||
var/list/datum/mind/owners = get_owners()
|
||||
var/approved_targets = list()
|
||||
@@ -1207,7 +1221,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages)
|
||||
if(sabo)
|
||||
targetinfo = sabo
|
||||
explanation_text = "[targetinfo.name]"
|
||||
give_special_equipment(targetinfo.special_equipment)
|
||||
special_items_given = give_special_equipment(targetinfo.special_equipment)
|
||||
return sabo
|
||||
else
|
||||
explanation_text = "Free objective"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
antag_flag = ROLE_REV
|
||||
false_report_weight = 10
|
||||
chaos = 8
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
restricted_jobs = list("Prisoner", "AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 20
|
||||
required_enemies = 1
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
config_tag = "traitor"
|
||||
antag_flag = ROLE_TRAITOR
|
||||
false_report_weight = 20 //Reports of traitors are pretty common.
|
||||
restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances
|
||||
restricted_jobs = list("Prisoner", "Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to ling role blacklist
|
||||
required_players = 0
|
||||
required_enemies = 1
|
||||
|
||||
@@ -148,11 +148,15 @@ Class Procs:
|
||||
START_PROCESSING(SSmachines, src)
|
||||
else
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
power_change()
|
||||
RegisterSignal(src, COMSIG_ENTER_AREA, .proc/power_change)
|
||||
|
||||
if (occupant_typecache)
|
||||
occupant_typecache = typecacheof(occupant_typecache)
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/machinery/LateInitialize()
|
||||
. = ..()
|
||||
power_change()
|
||||
|
||||
/obj/machinery/Destroy()
|
||||
GLOB.machines.Remove(src)
|
||||
@@ -176,6 +180,17 @@ Class Procs:
|
||||
/obj/machinery/proc/process_atmos()//If you dont use process why are you here
|
||||
return PROCESS_KILL
|
||||
|
||||
///Called when we want to change the value of the stat variable. Holds bitflags.
|
||||
/obj/machinery/proc/set_machine_stat(new_value)
|
||||
if(new_value == stat)
|
||||
return
|
||||
. = stat
|
||||
stat = new_value
|
||||
on_machine_stat_update(stat)
|
||||
|
||||
/obj/machinery/proc/on_machine_stat_update(stat)
|
||||
return
|
||||
|
||||
/obj/machinery/emp_act(severity)
|
||||
. = ..()
|
||||
if(use_power && !stat && !(. & EMP_PROTECT_SELF))
|
||||
@@ -383,8 +398,11 @@ Class Procs:
|
||||
M.icon_state = "box_1"
|
||||
|
||||
/obj/machinery/obj_break(damage_flag)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
. = ..()
|
||||
if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
|
||||
stat |= BROKEN
|
||||
SEND_SIGNAL(src, COMSIG_MACHINERY_BROKEN, damage_flag)
|
||||
update_appearance()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/contents_explosion(severity, target)
|
||||
|
||||
@@ -407,7 +407,7 @@
|
||||
|
||||
/obj/machinery/camera/get_remote_view_fullscreens(mob/user)
|
||||
if(view_range == short_range) //unfocused
|
||||
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2)
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2)
|
||||
|
||||
/obj/machinery/camera/update_remote_sight(mob/living/user)
|
||||
user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras
|
||||
|
||||
@@ -388,7 +388,7 @@
|
||||
to_chat(occupant, "<span class='notice'><b>There is a bright flash!</b><br><i>You feel like a new being.</i></span>")
|
||||
mob_occupant.flash_act()
|
||||
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/policy = policies[POLICYCONFIG_ON_CLONE]
|
||||
if(policy)
|
||||
to_chat(occupant, policy)
|
||||
|
||||
@@ -57,8 +57,8 @@
|
||||
var/overlay_state = icon_screen
|
||||
if(stat & BROKEN)
|
||||
overlay_state = "[icon_state]_broken"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir)
|
||||
SSvis_overlays.add_vis_overlay(src, icon, overlay_state, EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha=128)
|
||||
. += mutable_appearance(icon, overlay_state)
|
||||
. += emissive_appearance(icon, overlay_state)
|
||||
|
||||
/obj/machinery/computer/power_change()
|
||||
..()
|
||||
|
||||
@@ -191,6 +191,7 @@
|
||||
var/x2 = x1
|
||||
work_squares(y2, x2) //Work squares while in this loop so there's less load
|
||||
reset_board = FALSE
|
||||
CHECK_TICK
|
||||
|
||||
web += "<table>" //Start setting up the html table
|
||||
web += "<tbody>"
|
||||
@@ -235,6 +236,7 @@
|
||||
web += "<td>[MINESWEEPERIMG(7)]</td>"
|
||||
if(19)
|
||||
web += "<td>[MINESWEEPERIMG(8)]</td>"
|
||||
CHECK_TICK
|
||||
web += "</tr>"
|
||||
web += "</table>"
|
||||
web += "</tbody>"
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
|
||||
// Stuff needed to render the map
|
||||
var/map_name
|
||||
var/obj/screen/map_view/cam_screen
|
||||
var/atom/movable/screen/map_view/cam_screen
|
||||
/// All the plane masters that need to be applied.
|
||||
var/list/cam_plane_masters
|
||||
var/obj/screen/background/cam_background
|
||||
var/atom/movable/screen/background/cam_background
|
||||
|
||||
interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_SET_MACHINE //| INTERACT_MACHINE_REQUIRES_SIGHT
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
cam_screen.del_on_map_removal = FALSE
|
||||
cam_screen.screen_loc = "[map_name]:1,1"
|
||||
cam_plane_masters = list()
|
||||
for(var/plane in subtypesof(/obj/screen/plane_master))
|
||||
var/obj/screen/instance = new plane()
|
||||
for(var/plane in subtypesof(/atom/movable/screen/plane_master))
|
||||
var/atom/movable/screen/instance = new plane()
|
||||
instance.assigned_map = map_name
|
||||
instance.del_on_map_removal = FALSE
|
||||
instance.screen_loc = "[map_name]:CENTER"
|
||||
|
||||
@@ -275,7 +275,7 @@
|
||||
if(final)
|
||||
playsound(origin, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0)
|
||||
remote_eye.setLoc(get_turf(final))
|
||||
C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static)
|
||||
C.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static)
|
||||
C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console!
|
||||
else
|
||||
playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0)
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
var/list/this_pad = list()
|
||||
this_pad["name"] = pad.display_name
|
||||
this_pad["id"] = i
|
||||
if(pad.machine_stat & NOPOWER)
|
||||
if(pad.stat & NOPOWER)
|
||||
this_pad["inactive"] = TRUE
|
||||
pad_list += list(this_pad)
|
||||
else
|
||||
@@ -135,7 +135,7 @@
|
||||
var/obj/machinery/mechpad/current_pad = mechpads[selected_id]
|
||||
data["pad_name"] = current_pad.display_name
|
||||
data["selected_pad"] = current_pad
|
||||
if(QDELETED(current_pad) || (current_pad.machine_stat & NOPOWER))
|
||||
if(QDELETED(current_pad) || (current_pad.stat & NOPOWER))
|
||||
data["pad_active"] = FALSE
|
||||
return data
|
||||
data["pad_active"] = TRUE
|
||||
|
||||
@@ -102,6 +102,9 @@
|
||||
rad_insulation = RAD_MEDIUM_INSULATION
|
||||
|
||||
var/static/list/airlock_overlays = list()
|
||||
|
||||
/// sigh
|
||||
var/unelectrify_timerid
|
||||
|
||||
/obj/machinery/door/airlock/Initialize()
|
||||
. = ..()
|
||||
@@ -791,21 +794,6 @@
|
||||
return WIRE_INTERACTION_FAIL
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/airlock/proc/electrified_loop()
|
||||
while (secondsElectrified > NOT_ELECTRIFIED)
|
||||
sleep(10)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
|
||||
secondsElectrified--
|
||||
updateDialog()
|
||||
// This is to protect against changing to permanent, mid loop.
|
||||
if(secondsElectrified == NOT_ELECTRIFIED)
|
||||
set_electrified(NOT_ELECTRIFIED)
|
||||
else
|
||||
set_electrified(ELECTRIFIED_PERMANENT)
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/door/airlock/Topic(href, href_list, var/nowindow = 0)
|
||||
// If you add an if(..()) check you must first remove the var/nowindow parameter.
|
||||
// Otherwise it will runtime with this kind of error: null.Topic()
|
||||
@@ -1365,11 +1353,18 @@
|
||||
wires.cut_all()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/door/airlock/proc/remove_electrify()
|
||||
secondsElectrified = NOT_ELECTRIFIED
|
||||
unelectrify_timerid = null
|
||||
|
||||
/obj/machinery/door/airlock/proc/set_electrified(seconds, mob/user)
|
||||
secondsElectrified = seconds
|
||||
if(unelectrify_timerid)
|
||||
deltimer(unelectrify_timerid)
|
||||
unelectrify_timerid = null
|
||||
if(secondsElectrified != ELECTRIFIED_PERMANENT)
|
||||
unelectrify_timerid = addtimer(CALLBACK(src, .proc/remove_electrify), secondsElectrified SECONDS, TIMER_STOPPABLE)
|
||||
diag_hud_set_electrified()
|
||||
if(secondsElectrified > NOT_ELECTRIFIED)
|
||||
INVOKE_ASYNC(src, .proc/electrified_loop)
|
||||
|
||||
if(user)
|
||||
var/message
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
layer = OPEN_DOOR_LAYER
|
||||
power_channel = ENVIRON
|
||||
max_integrity = 350
|
||||
damage_deflection = 10
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70)
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
flags_1 = PREVENT_CLICK_UNDER_1|DEFAULT_RICOCHET_1
|
||||
@@ -38,7 +39,7 @@
|
||||
var/locked = FALSE //whether the door is bolted or not.
|
||||
var/assemblytype //the type of door frame to drop during deconstruction
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
var/damage_deflection = 10
|
||||
|
||||
var/real_explosion_block //ignore this, just use explosion_block
|
||||
var/red_alert_access = FALSE //if TRUE, this door will always open on red alert
|
||||
var/poddoor = FALSE
|
||||
@@ -223,11 +224,6 @@
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
|
||||
if(damage_flag == "melee" && damage_amount < damage_deflection)
|
||||
return 0
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
. = ..()
|
||||
if(. && obj_integrity > 0)
|
||||
|
||||
@@ -197,10 +197,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
|
||||
if(orig_light < 10)
|
||||
say("Explosion not large enough for research calculations.")
|
||||
return
|
||||
else if(orig_light < 4500)
|
||||
point_gain = (83300 * orig_light) / (orig_light + 3000)
|
||||
else
|
||||
point_gain = TECHWEB_BOMB_POINTCAP
|
||||
point_gain = (100000 * orig_light) / (orig_light + 5000)
|
||||
|
||||
/*****The Point Capper*****/
|
||||
if(point_gain > linked_techweb.largest_bomb_value)
|
||||
|
||||
@@ -79,23 +79,33 @@
|
||||
|
||||
if(is_station_level(z))
|
||||
. += "fire_[GLOB.security_level]"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_[GLOB.security_level]")
|
||||
. += emissive_appearance(icon, "fire_[GLOB.security_level]")
|
||||
else
|
||||
. += "fire_[SEC_LEVEL_GREEN]"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_[SEC_LEVEL_GREEN]")
|
||||
. += emissive_appearance(icon, "fire_[SEC_LEVEL_GREEN]")
|
||||
|
||||
var/area/A = src.loc
|
||||
A = A.loc
|
||||
|
||||
if(!detecting || !A.fire)
|
||||
. += "fire_off"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_off", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_off")
|
||||
. += emissive_appearance(icon, "fire_off")
|
||||
else if(obj_flags & EMAGGED)
|
||||
. += "fire_emagged"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_emagged")
|
||||
. += emissive_appearance(icon, "fire_emagged")
|
||||
else
|
||||
. += "fire_on"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_on", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_on")
|
||||
. += emissive_appearance(icon, "fire_on")
|
||||
|
||||
if(!panel_open && detecting) //It just looks horrible with the panel open
|
||||
. += "fire_detected"
|
||||
. += mutable_appearance(icon, "fire_detected")
|
||||
. += emissive_appearance(icon, "fire_detected") //Pain
|
||||
|
||||
/obj/machinery/firealarm/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -1,52 +1,70 @@
|
||||
// the light switch
|
||||
// can have multiple per area
|
||||
// can also operate on non-loc area through "otherarea" var
|
||||
/// The light switch. Can have multiple per area.
|
||||
/obj/machinery/light_switch
|
||||
name = "light switch"
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "light1"
|
||||
plane = ABOVE_WALL_PLANE
|
||||
base_icon_state = "light"
|
||||
desc = "Make dark."
|
||||
var/on = TRUE
|
||||
var/area/area = null
|
||||
var/otherarea = null
|
||||
|
||||
/obj/machinery/light_switch/directional/north
|
||||
dir = SOUTH
|
||||
pixel_y = 26
|
||||
|
||||
/obj/machinery/light_switch/directional/south
|
||||
dir = NORTH
|
||||
pixel_y = -26
|
||||
|
||||
/obj/machinery/light_switch/directional/east
|
||||
dir = WEST
|
||||
pixel_x = 26
|
||||
|
||||
/obj/machinery/light_switch/directional/west
|
||||
dir = EAST
|
||||
pixel_x = -26
|
||||
|
||||
/obj/machinery/light_switch/Initialize()
|
||||
. = ..()
|
||||
area = get_area(src)
|
||||
|
||||
if(istext(area))
|
||||
area = text2path(area)
|
||||
if(ispath(area))
|
||||
area = GLOB.areas_by_type[area]
|
||||
if(otherarea)
|
||||
area = locate(text2path("/area/[otherarea]"))
|
||||
if(!area)
|
||||
area = get_area(src)
|
||||
|
||||
if(!name)
|
||||
name = "light switch ([area.name])"
|
||||
|
||||
on = area.lightswitch
|
||||
update_icon()
|
||||
/obj/machinery/light_switch/update_appearance(updates=ALL)
|
||||
. = ..()
|
||||
luminosity = (stat & NOPOWER) ? 0 : 1
|
||||
|
||||
/obj/machinery/light_switch/update_icon_state()
|
||||
if(stat & NOPOWER)
|
||||
icon_state = "light-p"
|
||||
else
|
||||
if(on)
|
||||
icon_state = "light1"
|
||||
else
|
||||
icon_state = "light0"
|
||||
icon_state = "[base_icon_state]-p"
|
||||
return ..()
|
||||
icon_state = "[base_icon_state][area.lightswitch ? 1 : 0]"
|
||||
return ..()
|
||||
|
||||
/obj/machinery/light_switch/update_overlays()
|
||||
. = ..()
|
||||
if(!(stat & NOPOWER))
|
||||
. += emissive_appearance(icon, "[base_icon_state]-glow", alpha = src.alpha)
|
||||
|
||||
/obj/machinery/light_switch/examine(mob/user)
|
||||
. = ..()
|
||||
. += "It is [on? "on" : "off"]."
|
||||
|
||||
. += "It is [area.lightswitch ? "on" : "off"]."
|
||||
/obj/machinery/light_switch/interact(mob/user)
|
||||
. = ..()
|
||||
on = !on
|
||||
|
||||
area.lightswitch = on
|
||||
area.update_icon()
|
||||
area.lightswitch = !area.lightswitch
|
||||
area.update_appearance()
|
||||
|
||||
for(var/obj/machinery/light_switch/L in area)
|
||||
L.on = on
|
||||
L.update_icon()
|
||||
L.update_appearance()
|
||||
|
||||
area.power_change()
|
||||
|
||||
@@ -58,7 +76,7 @@
|
||||
else
|
||||
stat |= NOPOWER
|
||||
|
||||
update_icon()
|
||||
update_appearance()
|
||||
|
||||
/obj/machinery/light_switch/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
integrity_failure = 0.5
|
||||
armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
/// Base turret icon state
|
||||
var/base_icon_state = "standard"
|
||||
base_icon_state = "standard"
|
||||
/// Scan range of the turret for locating targets
|
||||
var/scan_range = 7
|
||||
/// For turrets inside other objects
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
/obj/machinery/plate_press
|
||||
name = "license plate press"
|
||||
desc = "You know, we're making a lot of license plates for a station with literaly no cars in it."
|
||||
icon = 'icons/obj/machines/prison.dmi'
|
||||
icon_state = "offline"
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 2
|
||||
active_power_usage = 50
|
||||
var/obj/item/stack/license_plates/empty/current_plate
|
||||
var/pressing = FALSE
|
||||
|
||||
/obj/machinery/plate_press/update_icon()
|
||||
. = ..()
|
||||
if(!is_operational())
|
||||
icon_state = "offline"
|
||||
else if(pressing)
|
||||
icon_state = "loop"
|
||||
else if(current_plate)
|
||||
icon_state = "online_loaded"
|
||||
else
|
||||
icon_state = "online"
|
||||
|
||||
/obj/machinery/plate_press/Destroy()
|
||||
QDEL_NULL(current_plate)
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/plate_press/attackby(obj/item/I, mob/living/user, params)
|
||||
if(!is_operational())
|
||||
to_chat(user, "<span class='warning'>[src] has to be on to do this!</span>")
|
||||
return FALSE
|
||||
if(pressing)
|
||||
to_chat(user, "<span class='warning'>[src] already has a plate in it!</span>")
|
||||
return FALSE
|
||||
if(istype(I, /obj/item/stack/license_plates/empty))
|
||||
var/obj/item/stack/license_plates/empty/plate = I
|
||||
plate.use(1)
|
||||
current_plate = new plate.type(src, 1) //Spawn a new single sheet in the machine
|
||||
update_icon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/plate_press/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(!pressing && current_plate)
|
||||
work_press(user)
|
||||
|
||||
///This proc attempts to create a plate. User cannot move during this process.
|
||||
/obj/machinery/plate_press/proc/work_press(mob/living/user)
|
||||
|
||||
pressing = TRUE
|
||||
update_icon()
|
||||
to_chat(user, "<span class='notice'>You start pressing a new license plate!</span>")
|
||||
|
||||
if(!do_after(user, 40, target = src))
|
||||
pressing = FALSE
|
||||
update_icon()
|
||||
return FALSE
|
||||
|
||||
use_power(100)
|
||||
to_chat(user, "<span class='notice'>You finish pressing a new license plate!</span>")
|
||||
|
||||
pressing = FALSE
|
||||
QDEL_NULL(current_plate)
|
||||
update_icon()
|
||||
|
||||
new /obj/item/stack/license_plates/filled(drop_location(), 1)
|
||||
@@ -1,7 +1,8 @@
|
||||
/obj/machinery/recharger
|
||||
name = "recharger"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "recharger0"
|
||||
icon_state = "recharger"
|
||||
base_icon_state = "recharger"
|
||||
desc = "A charging dock for energy based weaponry."
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 4
|
||||
@@ -11,6 +12,8 @@
|
||||
var/obj/item/charging = null
|
||||
var/recharge_coeff = 1
|
||||
var/using_power = FALSE //Did we put power into "charging" last process()?
|
||||
///Did we finish recharging the currently inserted item?
|
||||
var/finished_recharging = FALSE
|
||||
|
||||
var/static/list/allowed_devices = typecacheof(list(
|
||||
/obj/item/gun/energy,
|
||||
@@ -47,13 +50,14 @@
|
||||
charging = new_charging
|
||||
if (new_charging)
|
||||
START_PROCESSING(SSmachines, src)
|
||||
finished_recharging = FALSE
|
||||
use_power = ACTIVE_POWER_USE
|
||||
using_power = TRUE
|
||||
update_icon()
|
||||
update_appearance()
|
||||
else
|
||||
use_power = IDLE_POWER_USE
|
||||
using_power = FALSE
|
||||
update_icon()
|
||||
update_appearance()
|
||||
|
||||
/obj/machinery/recharger/Exited(atom/movable/M, atom/newloc)
|
||||
. = ..()
|
||||
@@ -99,7 +103,8 @@
|
||||
return 1
|
||||
|
||||
if(anchored && !charging)
|
||||
if(default_deconstruction_screwdriver(user, "rechargeropen", "recharger0", G))
|
||||
if(default_deconstruction_screwdriver(user, "recharger", "recharger", G))
|
||||
update_appearance()
|
||||
return
|
||||
|
||||
if(panel_open && G.tool_behaviour == TOOL_CROWBAR)
|
||||
@@ -132,7 +137,7 @@
|
||||
C.give(C.chargerate * recharge_coeff)
|
||||
use_power(250 * recharge_coeff)
|
||||
using_power = TRUE
|
||||
update_icon()
|
||||
update_appearance()
|
||||
|
||||
if(istype(charging, /obj/item/ammo_box/magazine/recharge))
|
||||
var/obj/item/ammo_box/magazine/recharge/R = charging
|
||||
@@ -140,7 +145,7 @@
|
||||
R.stored_ammo += new R.ammo_type(R)
|
||||
use_power(200 * recharge_coeff)
|
||||
using_power = TRUE
|
||||
update_icon()
|
||||
update_appearance()
|
||||
return
|
||||
|
||||
if(istype(charging, /obj/item/ammo_casing/mws_batt))
|
||||
@@ -151,7 +156,7 @@
|
||||
using_power = 1
|
||||
if(R.BB == null)
|
||||
R.chargeshot()
|
||||
update_icon(using_power)
|
||||
update_appearance()
|
||||
|
||||
if(istype(charging, /obj/item/ammo_box/magazine/mws_mag))
|
||||
var/obj/item/ammo_box/magazine/mws_mag/R = charging
|
||||
@@ -163,14 +168,19 @@
|
||||
using_power = 1
|
||||
if(batt.BB == null)
|
||||
batt.chargeshot()
|
||||
update_icon(using_power)
|
||||
update_appearance()
|
||||
|
||||
if(!using_power && !finished_recharging) //Inserted thing is at max charge/ammo, notify those around us
|
||||
finished_recharging = TRUE
|
||||
playsound(src, 'sound/machines/ping.ogg', 30, TRUE)
|
||||
say("[charging] has finished recharging!")
|
||||
|
||||
else
|
||||
return PROCESS_KILL
|
||||
|
||||
/obj/machinery/recharger/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
update_appearance()
|
||||
|
||||
/obj/machinery/recharger/emp_act(severity)
|
||||
. = ..()
|
||||
@@ -187,16 +197,29 @@
|
||||
if(B.cell)
|
||||
B.cell.charge = 0
|
||||
|
||||
/obj/machinery/recharger/update_appearance(updates)
|
||||
. = ..()
|
||||
if((stat & (NOPOWER|BROKEN)) || panel_open || !anchored)
|
||||
luminosity = 0
|
||||
return
|
||||
luminosity = 1
|
||||
|
||||
/obj/machinery/recharger/update_icon_state()
|
||||
/obj/machinery/recharger/update_overlays()
|
||||
. = ..()
|
||||
if(stat & (NOPOWER|BROKEN) || !anchored)
|
||||
icon_state = "rechargeroff"
|
||||
else if(panel_open)
|
||||
icon_state = "rechargeropen"
|
||||
else if(charging)
|
||||
if(using_power)
|
||||
icon_state = "recharger1"
|
||||
else
|
||||
icon_state = "recharger2"
|
||||
else
|
||||
icon_state = "recharger0"
|
||||
return
|
||||
if(panel_open)
|
||||
. += mutable_appearance(icon, "[base_icon_state]-open", alpha = src.alpha)
|
||||
return
|
||||
|
||||
if(!charging)
|
||||
. += mutable_appearance(icon, "[base_icon_state]-empty", alpha = src.alpha)
|
||||
. += emissive_appearance(icon, "[base_icon_state]-empty", alpha = src.alpha)
|
||||
return
|
||||
if(using_power)
|
||||
. += mutable_appearance(icon, "[base_icon_state]-charging", alpha = src.alpha)
|
||||
. += emissive_appearance(icon, "[base_icon_state]-charging", alpha = src.alpha)
|
||||
return
|
||||
|
||||
. += mutable_appearance(icon, "[base_icon_state]-full", alpha = src.alpha)
|
||||
. += emissive_appearance(icon, "[base_icon_state]-full", alpha = src.alpha)
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
|
||||
var/list/to_eat = AM0.GetAllContents()
|
||||
|
||||
var/living_detected = FALSE //technically includes silicons as well but eh
|
||||
var/mob/living/living_detected //technically includes silicons as well but eh
|
||||
var/list/nom = list()
|
||||
var/list/crunchy_nom = list() //Mobs have to be handled differently so they get a different list instead of checking them multiple times.
|
||||
|
||||
@@ -120,10 +120,10 @@
|
||||
var/obj/item/bodypart/head/as_head = AM
|
||||
var/obj/item/mmi/as_mmi = AM
|
||||
if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay))
|
||||
living_detected = TRUE
|
||||
living_detected = living_detected || AM
|
||||
nom += AM
|
||||
else if(isliving(AM))
|
||||
living_detected = TRUE
|
||||
living_detected = living_detected || TRUE
|
||||
crunchy_nom += AM
|
||||
var/not_eaten = to_eat.len - nom.len - crunchy_nom.len
|
||||
if(living_detected) // First, check if we have any living beings detected.
|
||||
@@ -132,7 +132,7 @@
|
||||
if(isliving(CRUNCH)) // MMIs and brains will get eaten like normal items
|
||||
crush_living(CRUNCH)
|
||||
else // Stop processing right now without eating anything.
|
||||
emergency_stop()
|
||||
emergency_stop(living_detected)
|
||||
return
|
||||
for(var/nommed in nom)
|
||||
recycle_item(nommed)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
anchored = FALSE
|
||||
density = TRUE
|
||||
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN
|
||||
use_power = NO_POWER_USE
|
||||
icon = 'icons/obj/atmos.dmi'
|
||||
icon_state = "sheater-off"
|
||||
name = "space heater"
|
||||
@@ -72,7 +73,7 @@
|
||||
on = FALSE
|
||||
return PROCESS_KILL
|
||||
|
||||
if(cell && cell.charge > 0)
|
||||
if(cell && cell.charge > 1 / efficiency)
|
||||
var/turf/L = loc
|
||||
PerformHeating(L)
|
||||
|
||||
@@ -112,7 +113,9 @@
|
||||
var/requiredPower = abs(env.return_temperature() - targetTemperature) * heat_capacity
|
||||
requiredPower = min(requiredPower, heatingPower)
|
||||
|
||||
if(requiredPower < 1)
|
||||
if(requiredPower < 1 || !cell.use(requiredPower / efficiency))
|
||||
on = FALSE
|
||||
update_icon()
|
||||
return
|
||||
|
||||
var/deltaTemperature = requiredPower / heat_capacity
|
||||
@@ -121,7 +124,6 @@
|
||||
if(deltaTemperature)
|
||||
env.set_temperature(env.return_temperature() + deltaTemperature)
|
||||
air_update_turf()
|
||||
cell.use(requiredPower / efficiency)
|
||||
|
||||
/obj/machinery/space_heater/RefreshParts()
|
||||
var/laser = 2
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/load_audio = "sound/weapons/gun_magazine_insert_empty_1.ogg"
|
||||
var/ammo_type
|
||||
|
||||
/obj/item/mecha_ammo/proc/update_name()
|
||||
/obj/item/mecha_ammo/update_name()
|
||||
if(!rounds)
|
||||
name = "empty ammo box"
|
||||
desc = "An exosuit ammuniton box that has since been emptied. Please recycle."
|
||||
|
||||
@@ -357,22 +357,22 @@
|
||||
if(0.75 to INFINITY)
|
||||
occupant.clear_alert("charge")
|
||||
if(0.5 to 0.75)
|
||||
occupant.throw_alert("charge", /obj/screen/alert/lowcell, 1)
|
||||
occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 1)
|
||||
if(0.25 to 0.5)
|
||||
occupant.throw_alert("charge", /obj/screen/alert/lowcell, 2)
|
||||
occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 2)
|
||||
if(0.01 to 0.25)
|
||||
occupant.throw_alert("charge", /obj/screen/alert/lowcell, 3)
|
||||
occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 3)
|
||||
else
|
||||
occupant.throw_alert("charge", /obj/screen/alert/emptycell)
|
||||
occupant.throw_alert("charge", /atom/movable/screen/alert/emptycell)
|
||||
|
||||
var/integrity = obj_integrity/max_integrity*100
|
||||
switch(integrity)
|
||||
if(30 to 45)
|
||||
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 1)
|
||||
occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 1)
|
||||
if(15 to 35)
|
||||
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 2)
|
||||
occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 2)
|
||||
if(-INFINITY to 15)
|
||||
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3)
|
||||
occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 3)
|
||||
else
|
||||
occupant.clear_alert("mech damage")
|
||||
var/atom/checking = occupant.loc
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
M.setDir(dir)
|
||||
buckled_mobs |= M
|
||||
M.update_mobility()
|
||||
M.throw_alert("buckled", /obj/screen/alert/restrained/buckled)
|
||||
M.throw_alert("buckled", /atom/movable/screen/alert/restrained/buckled)
|
||||
post_buckle_mob(M)
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force)
|
||||
|
||||
@@ -296,7 +296,7 @@
|
||||
var/mob/C = pick(candidates)
|
||||
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(S)])")
|
||||
C.transfer_ckey(S, FALSE)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/policy = policies[POLICYCONFIG_ON_PYROCLASTIC_SENTIENT]
|
||||
if(policy)
|
||||
to_chat(S,policy)
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
bloodiness = 0
|
||||
|
||||
/obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases)
|
||||
..()
|
||||
. = ..()
|
||||
icon_state += "-old"
|
||||
add_blood_DNA(list("Non-human DNA" = "A+"))
|
||||
|
||||
|
||||
@@ -64,6 +64,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
|
||||
name = "Assistant"
|
||||
icon_state = "Assistant"
|
||||
|
||||
/obj/effect/landmark/start/prisoner
|
||||
name = "Prisoner"
|
||||
icon_state = "Prisoner"
|
||||
|
||||
/obj/effect/landmark/start/assistant/override
|
||||
jobspawn_override = TRUE
|
||||
delete_after_roundstart = FALSE
|
||||
|
||||
@@ -60,6 +60,48 @@
|
||||
/obj/item/gun/ballistic/automatic/pistol/deagle,
|
||||
/obj/item/storage/box/syndie_kit/throwing_weapons = 3)
|
||||
|
||||
/obj/effect/spawner/lootdrop/prison_contraband
|
||||
name = "prison contraband loot spawner"
|
||||
loot = list(/obj/item/clothing/mask/cigarette/space_cigarette = 4,
|
||||
/obj/item/clothing/mask/cigarette/robust = 2,
|
||||
/obj/item/clothing/mask/cigarette/carp = 3,
|
||||
/obj/item/clothing/mask/cigarette/uplift = 2,
|
||||
/obj/item/clothing/mask/cigarette/dromedary = 3,
|
||||
/obj/item/clothing/mask/cigarette/robustgold = 1,
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_uplift = 3,
|
||||
/obj/item/storage/fancy/cigarettes = 3,
|
||||
/obj/item/clothing/mask/cigarette/rollie/cannabis = 4,
|
||||
/obj/item/toy/crayon/spraycan = 2,
|
||||
/obj/item/crowbar = 1,
|
||||
/obj/item/assembly/flash/handheld = 1,
|
||||
/obj/item/restraints/handcuffs/cable/zipties = 1,
|
||||
/obj/item/restraints/handcuffs = 1,
|
||||
/obj/item/radio/off = 1,
|
||||
/obj/item/lighter = 3,
|
||||
/obj/item/storage/box/matches = 3,
|
||||
/obj/item/reagent_containers/syringe/contraband/space_drugs = 1,
|
||||
/obj/item/reagent_containers/syringe/contraband/krokodil = 1,
|
||||
/obj/item/reagent_containers/syringe/contraband/crank = 1,
|
||||
/obj/item/reagent_containers/syringe/contraband/methamphetamine = 1,
|
||||
/obj/item/reagent_containers/syringe/contraband/bath_salts = 1,
|
||||
/obj/item/reagent_containers/syringe/contraband/fentanyl = 1,
|
||||
/obj/item/reagent_containers/syringe/contraband/morphine = 1,
|
||||
/obj/item/storage/pill_bottle/happy = 1,
|
||||
/obj/item/storage/pill_bottle/lsd = 1,
|
||||
/obj/item/storage/pill_bottle/psicodine = 1,
|
||||
/obj/item/reagent_containers/food/drinks/beer = 4,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/whiskey = 1,
|
||||
/obj/item/paper/fluff/jobs/prisoner/letter = 1,
|
||||
/obj/item/grenade/smokebomb = 1,
|
||||
/obj/item/flashlight/seclite = 1,
|
||||
/obj/item/tailclub = 1, //want to buy makeshift wooden club sprite
|
||||
/obj/item/kitchen/knife/shiv = 4,
|
||||
/obj/item/kitchen/knife/shiv/carrot = 1,
|
||||
/obj/item/kitchen/knife = 1,
|
||||
/obj/item/storage/wallet/random = 1,
|
||||
/obj/item/pda = 1
|
||||
)
|
||||
|
||||
/obj/effect/spawner/lootdrop/gambling
|
||||
name = "gambling valuables spawner"
|
||||
loot = list(
|
||||
|
||||
@@ -146,6 +146,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
var/list/grind_results //A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only
|
||||
var/list/juice_results //A reagent list containing blah blah... but when JUICED in a grinder!
|
||||
|
||||
//the outline filter on hover
|
||||
var/outline_filter
|
||||
|
||||
/* Our block parry data. Should be set in init, or something if you are using it.
|
||||
* This won't be accessed without ITEM_CAN_BLOCK or ITEM_CAN_PARRY so do not set it unless you have to to save memory.
|
||||
* If you decide it's a good idea to leave this unset while turning the flags on, you will runtime. Enjoy.
|
||||
@@ -175,6 +178,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
if(force_string)
|
||||
item_flags |= FORCE_STRING_OVERRIDE
|
||||
|
||||
if(istype(loc, /obj/item/storage))
|
||||
item_flags |= IN_STORAGE
|
||||
|
||||
if(istype(loc, /obj/item/robot_module))
|
||||
item_flags |= IN_INVENTORY
|
||||
|
||||
if(!hitsound)
|
||||
if(damtype == "fire")
|
||||
hitsound = 'sound/items/welder.ogg'
|
||||
@@ -373,6 +382,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src))
|
||||
return
|
||||
|
||||
remove_outline()
|
||||
pickup(user)
|
||||
add_fingerprint(user)
|
||||
if(!user.put_in_active_hand(src, FALSE, FALSE))
|
||||
@@ -443,6 +453,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
qdel(src)
|
||||
item_flags &= ~IN_INVENTORY
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user)
|
||||
remove_outline()
|
||||
// if(!silent)
|
||||
// playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE)
|
||||
user?.update_equipment_speed_mods()
|
||||
@@ -557,6 +568,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
if(usr.incapacitated() || !Adjacent(usr) || usr.lying)
|
||||
return
|
||||
|
||||
if(iscyborg(usr))
|
||||
var/obj/item/gripper/gripper = usr.get_active_held_item(TRUE)
|
||||
if(istype(gripper))
|
||||
gripper.pre_attack(src, usr, get_dist(src, usr))
|
||||
return
|
||||
|
||||
if(usr.get_active_held_item() == null) // Let me know if this has any problems -Yota
|
||||
usr.UnarmedAttack(src)
|
||||
|
||||
@@ -867,18 +884,49 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
openToolTip(user,src,params,title = name,content = "[desc]<br><b>Force:</b> [force_string]",theme = "")
|
||||
|
||||
/obj/item/MouseEntered(location, control, params)
|
||||
if((item_flags & IN_INVENTORY) && usr.client.prefs.enable_tips && !QDELETED(src))
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_ENTER, location, control, params)
|
||||
if((item_flags & IN_INVENTORY || item_flags & IN_STORAGE) && usr.client.prefs.enable_tips && !QDELETED(src))
|
||||
var/timedelay = usr.client.prefs.tip_delay/100
|
||||
var/user = usr
|
||||
tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE)//timer takes delay in deciseconds, but the pref is in milliseconds. dividing by 100 converts it.
|
||||
var/mob/living/L = usr
|
||||
if(istype(L) && (L.incapacitated() || (current_equipped_slot in L.check_obscured_slots()) || !L.canUnEquip(src)))
|
||||
apply_outline(_size = 3)
|
||||
else
|
||||
apply_outline()
|
||||
|
||||
/obj/item/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params)
|
||||
. = ..()
|
||||
remove_outline()
|
||||
|
||||
/obj/item/MouseExited(location,control,params)
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_EXIT, location, control, params)
|
||||
deltimer(tip_timer)//delete any in-progress timer if the mouse is moved off the item before it finishes
|
||||
closeToolTip(usr)
|
||||
remove_outline()
|
||||
|
||||
/obj/item/MouseEntered(location,control,params)
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_ENTER, location, control, params)
|
||||
/obj/item/proc/apply_outline(colour = null, _size=1)
|
||||
if(!(item_flags & IN_INVENTORY || item_flags & IN_STORAGE) || QDELETED(src) || isobserver(usr))
|
||||
return
|
||||
if(usr.client)
|
||||
if(!usr.client.prefs.outline_enabled)
|
||||
return
|
||||
if(!colour)
|
||||
if(usr.client)
|
||||
colour = usr.client.prefs.outline_color
|
||||
if(!colour)
|
||||
colour = COLOR_BLUE_GRAY
|
||||
else
|
||||
colour = COLOR_BLUE_GRAY
|
||||
if(outline_filter)
|
||||
filters -= outline_filter
|
||||
outline_filter = filter(type="outline", size=_size, color=colour)
|
||||
filters += outline_filter
|
||||
|
||||
/obj/item/proc/remove_outline()
|
||||
if(outline_filter)
|
||||
filters -= outline_filter
|
||||
outline_filter = null
|
||||
|
||||
// Called when a mob tries to use the item as a tool.
|
||||
// Handles most checks.
|
||||
|
||||
@@ -99,8 +99,8 @@
|
||||
. = ..()
|
||||
if(!. && ismob(loc) && loc == usr)
|
||||
var/mob/M = loc
|
||||
if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand))
|
||||
var/atom/movable/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
|
||||
|
||||
/obj/item/defibrillator/attackby(obj/item/W, mob/user, params)
|
||||
@@ -283,7 +283,7 @@
|
||||
var/combat = FALSE //If it penetrates armor and gives additional functionality
|
||||
var/grab_ghost = FALSE
|
||||
var/tlimit = DEFIB_TIME_LIMIT * 10
|
||||
var/base_icon_state = "defibpaddles"
|
||||
base_icon_state = "defibpaddles"
|
||||
var/disarm_shock_time = 10
|
||||
var/wielded = FALSE // track wielded status on item
|
||||
|
||||
@@ -620,7 +620,7 @@
|
||||
if(req_defib)
|
||||
if(defib.healdisk)
|
||||
H.heal_overall_damage(25, 25)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
|
||||
var/late = timelimit && (tplus > timelimit)
|
||||
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
/obj/item/dogborg/sleeper/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "dogborg_sleeper", name, 375, 550) //UI DOES NOT EXIST
|
||||
ui = new(user, src, "Sleeper", name)
|
||||
ui.open()
|
||||
|
||||
/obj/item/dogborg/sleeper/ui_data()
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
|
||||
/obj/item/multitool/ai_detect/proc/show_hud(mob/user)
|
||||
if(user && hud_type)
|
||||
var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"]
|
||||
var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"]
|
||||
PM.alpha = 150
|
||||
var/datum/atom_hud/H = GLOB.huds[hud_type]
|
||||
if(!H.hudusers[user])
|
||||
@@ -194,7 +194,7 @@
|
||||
|
||||
/obj/item/multitool/ai_detect/proc/remove_hud(mob/user)
|
||||
if(user && hud_type)
|
||||
var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"]
|
||||
var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"]
|
||||
PM.alpha = 255
|
||||
var/datum/atom_hud/H = GLOB.huds[hud_type]
|
||||
H.remove_hud_from(user)
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
/obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
|
||||
src.pai = personality
|
||||
src.add_overlay("pai-null")
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/policy = policies[POLICYCONFIG_PAI]
|
||||
if(policy)
|
||||
to_chat(personality, policy)
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
. = ..()
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand))
|
||||
var/atom/movable/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/ui_interact(mob/user, datum/tgui/ui)
|
||||
|
||||
@@ -105,6 +105,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
keyslot = new /obj/item/encryptionkey/binary
|
||||
recalculateChannels()
|
||||
|
||||
/obj/item/radio/headset/headset_prisoner
|
||||
name = "prison radio headset"
|
||||
desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."
|
||||
icon_state = "prisoner_headset"
|
||||
prison_radio = TRUE
|
||||
|
||||
/obj/item/radio/headset/headset_sec
|
||||
name = "security radio headset"
|
||||
desc = "This is used by your elite security force."
|
||||
|
||||
@@ -426,18 +426,21 @@ GENETICS SCANNER
|
||||
if(ishuman(C))
|
||||
if(H.is_bleeding())
|
||||
msg += "<span class='danger'>Subject is bleeding!</span>\n"
|
||||
var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
|
||||
var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
|
||||
var/integrated_blood_percent = round((C.integrating_blood / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
|
||||
var/blood_type = C.dna.blood_type
|
||||
if(!(blood_typepath in GLOB.blood_reagent_types))
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[blood_typepath]
|
||||
if(R)
|
||||
blood_type = R.name
|
||||
if(C.scan_blood_volume() <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.scan_blood_volume() > (BLOOD_VOLUME_OKAY*C.blood_ratio))
|
||||
msg += "<span class='danger'>LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl,</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else if(C.scan_blood_volume() <= (BLOOD_VOLUME_OKAY*C.blood_ratio))
|
||||
msg += "<span class='danger'>CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl,</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
|
||||
if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_SAFE * C.blood_ratio) && (C.scan_blood_volume() + C.integrating_blood) > (BLOOD_VOLUME_OKAY*C.blood_ratio))
|
||||
msg += "<span class='danger'>LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""].</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_OKAY * C.blood_ratio))
|
||||
msg += "<span class='danger'>CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""].</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else
|
||||
msg += "<span class='info'>Blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]</span>\n"
|
||||
msg += "<span class='info'>Blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]</span>\n"
|
||||
|
||||
|
||||
var/cyberimp_detect
|
||||
for(var/obj/item/organ/cyberimp/CI in C.internal_organs)
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/obj/item/dyespray
|
||||
name = "hair dye spray"
|
||||
desc = "A spray to dye your hair any gradients you'd like."
|
||||
icon = 'icons/obj/dyespray.dmi'
|
||||
icon_state = "dyespray"
|
||||
|
||||
/obj/item/dyespray/attack_self(mob/user)
|
||||
dye(user)
|
||||
|
||||
/obj/item/dyespray/pre_attack(atom/target, mob/living/user, params)
|
||||
dye(target)
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Applies a gradient and a gradient color to a mob.
|
||||
*
|
||||
* Arguments:
|
||||
* * target - The mob who we will apply the gradient and gradient color to.
|
||||
*/
|
||||
|
||||
/obj/item/dyespray/proc/dye(mob/target)
|
||||
if(!ishuman(target))
|
||||
return
|
||||
var/mob/living/carbon/human/human_target = target
|
||||
|
||||
var/new_grad_style = input(usr, "Choose a color pattern:", "Character Preference") as null|anything in GLOB.hair_gradients_list
|
||||
if(!new_grad_style)
|
||||
return
|
||||
|
||||
var/new_grad_color = input(usr, "Choose a secondary hair color:", "Character Preference","#"+human_target.grad_color) as color|null
|
||||
if(!new_grad_color)
|
||||
return
|
||||
|
||||
human_target.grad_style = new_grad_style
|
||||
human_target.grad_color = sanitize_hexcolor(new_grad_color)
|
||||
to_chat(human_target, "<span class='notice'>You start applying the hair dye...</span>")
|
||||
if(!do_after(usr, 30, target = human_target))
|
||||
return
|
||||
playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5)
|
||||
human_target.update_hair()
|
||||
@@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(gift_item_blacklist, typecacheof(list(
|
||||
/obj/mafia_game_board,
|
||||
/obj/docking_port,
|
||||
/obj/shapeshift_holder,
|
||||
/obj/screen
|
||||
/atom/movable/screen
|
||||
)))
|
||||
|
||||
GLOBAL_LIST_EMPTY(possible_gifts)
|
||||
|
||||
@@ -255,18 +255,31 @@
|
||||
icon_state = "knife"
|
||||
desc = "A cyborg-mounted plasteel knife. Extremely sharp and durable."
|
||||
|
||||
/obj/item/kitchen/knife/carrotshiv
|
||||
/obj/item/kitchen/knife/shiv
|
||||
name = "glass shiv"
|
||||
icon = 'icons/obj/shards.dmi'
|
||||
icon_state = "shiv"
|
||||
item_state = "shiv"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
desc = "A makeshift glass shiv."
|
||||
force = 8
|
||||
throwforce = 12//fuck git
|
||||
attack_verb = list("shanked", "shivved")
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
custom_materials = list(/datum/material/glass=400)
|
||||
|
||||
/obj/item/kitchen/knife/shiv/carrot
|
||||
name = "carrot shiv"
|
||||
icon_state = "carrotshiv"
|
||||
item_state = "carrotshiv"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
desc = "Unlike other carrots, you should probably keep this far away from your eyes."
|
||||
force = 8
|
||||
throwforce = 12//fuck git
|
||||
custom_materials = null
|
||||
attack_verb = list("shanked", "shivved")
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/kitchen/knife/shiv/carrot/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] forcefully drives \the [src] into [user.p_their()] eye! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/kitchen/rollingpin
|
||||
name = "rolling pin"
|
||||
|
||||
@@ -337,7 +337,7 @@
|
||||
page_link = "Guide_to_chemistry"
|
||||
|
||||
/obj/item/book/manual/wiki/chemistry/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
new /obj/item/book/manual/wiki/cit/chemistry(loc)
|
||||
new /obj/item/book/manual/wiki/cit/chem_recipies(loc)
|
||||
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
hitcost = 75 //Costs more than a standard cyborg esword
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
sharpness = SHARP_EDGED
|
||||
light_color = "#40ceff"
|
||||
light_color = LIGHT_COLOR_RED
|
||||
tool_behaviour = TOOL_SAW
|
||||
toolspeed = 0.7
|
||||
|
||||
|
||||
@@ -73,14 +73,14 @@
|
||||
|
||||
/datum/block_parry_data/captain_saber
|
||||
parry_time_windup = 0
|
||||
parry_time_active = 6
|
||||
parry_time_active = 10
|
||||
parry_time_spindown = 0
|
||||
parry_time_perfect = 0.75
|
||||
parry_time_perfect_leeway = 0.75
|
||||
parry_time_perfect_leeway = 1.5
|
||||
parry_imperfect_falloff_percent = 30
|
||||
parry_efficiency_perfect = 100
|
||||
parry_failed_stagger_duration = 3 SECONDS
|
||||
parry_failed_clickcd_duration = 1 SECONDS
|
||||
parry_failed_clickcd_duration = 0
|
||||
parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK
|
||||
parry_automatic_enabled = TRUE
|
||||
|
||||
@@ -179,19 +179,23 @@
|
||||
// Fast, efficient parry.
|
||||
/datum/block_parry_data/traitor_rapier
|
||||
parry_time_windup = 0
|
||||
parry_time_active = 6
|
||||
parry_time_active = 10
|
||||
parry_time_spindown = 0
|
||||
parry_time_active_visual_override = 3
|
||||
parry_time_spindown_visual_override = 2
|
||||
parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING
|
||||
parry_time_perfect = 1
|
||||
parry_time_perfect_leeway = 1
|
||||
parry_time_perfect = 2
|
||||
parry_time_perfect_leeway = 2
|
||||
parry_time_perfect_leeway_override = list(
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 1
|
||||
)
|
||||
parry_imperfect_falloff_percent = 30
|
||||
parry_efficiency_to_counterattack = INFINITY
|
||||
parry_efficiency_to_counterattack = 100
|
||||
parry_efficiency_considered_successful = 1
|
||||
parry_data = list(
|
||||
PARRY_KNOCKDOWN_ATTACKER = 10,
|
||||
PARRY_DISARM_ATTACKER = TRUE
|
||||
)
|
||||
parry_efficiency_perfect = 100
|
||||
parry_stamina_cost = 5
|
||||
parry_failed_stagger_duration = 2 SECONDS
|
||||
|
||||
@@ -446,7 +446,7 @@
|
||||
mood_message = null
|
||||
cheer_up()
|
||||
|
||||
/obj/item/toy/plush/proc/update_desc()
|
||||
/obj/item/toy/plush/update_desc()
|
||||
desc = normal_desc
|
||||
if(mood_message)
|
||||
desc += mood_message
|
||||
@@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/random/Initialize()
|
||||
SHOULD_CALL_PARENT(FALSE)
|
||||
..()
|
||||
var/newtype
|
||||
var/list/snowflake_list = CONFIG_GET(keyed_list/snowflake_plushies)
|
||||
|
||||
|
||||
@@ -745,9 +745,9 @@
|
||||
Grippers oh god oh fuck
|
||||
***********************************************************************/
|
||||
|
||||
/obj/item/weapon/gripper
|
||||
/obj/item/gripper
|
||||
name = "engineering gripper"
|
||||
desc = "A simple grasping tool for interacting with various engineering related items, such as circuits, gas tanks, conveyer belts and more. Alt click to drop instead of use."
|
||||
desc = "A simple grasping tool for interacting with various engineering related items, such as circuits, gas tanks, conveyer belts and more."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "gripper"
|
||||
|
||||
@@ -776,18 +776,29 @@
|
||||
|
||||
var/obj/item/wrapped = null // Item currently being held.
|
||||
|
||||
//Used to interact with UI's of held items, such as gas tanks and airlock electronics.
|
||||
/obj/item/weapon/gripper/AltClick(mob/user)
|
||||
// Used to drop whatever's in the gripper.
|
||||
/obj/item/gripper/proc/drop_held(silent = FALSE)
|
||||
if(wrapped)
|
||||
wrapped.forceMove(get_turf(wrapped))
|
||||
to_chat(user, "<span class='notice'>You drop the [wrapped].</span>")
|
||||
if(!silent)
|
||||
to_chat(usr, "<span class='notice'>You drop the [wrapped].</span>")
|
||||
modify_appearance(wrapped, FALSE)
|
||||
wrapped = null
|
||||
return ..()
|
||||
update_appearance()
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/weapon/gripper/pre_attack(var/atom/target, var/mob/living/silicon/robot/user, proximity, params)
|
||||
/obj/item/gripper/proc/takeitem(obj/item/item, silent = FALSE)
|
||||
if(!silent)
|
||||
to_chat(usr, "<span class='notice'>You collect \the [item].</span>")
|
||||
item.loc = src
|
||||
wrapped = item
|
||||
update_appearance()
|
||||
|
||||
if(!proximity)
|
||||
return
|
||||
/obj/item/gripper/pre_attack(atom/target, mob/living/silicon/robot/user, params)
|
||||
var/proximity = get_dist(user, target)
|
||||
if(proximity > 1)
|
||||
return STOP_ATTACK_PROC_CHAIN
|
||||
|
||||
if(!wrapped)
|
||||
for(var/obj/item/thing in src.contents)
|
||||
@@ -795,21 +806,24 @@
|
||||
break
|
||||
|
||||
if(wrapped) //Already have an item.
|
||||
var/obj/item/item = wrapped
|
||||
drop_held(TRUE)
|
||||
//Temporary put wrapped into user so target's attackby() checks pass.
|
||||
wrapped.loc = user
|
||||
item.loc = user
|
||||
|
||||
//Pass the attack on to the target. This might delete/relocate wrapped.
|
||||
var/resolved = target.attackby(wrapped,user)
|
||||
if(!resolved && wrapped && target)
|
||||
wrapped.afterattack(target,user,1)
|
||||
var/resolved = target.attackby(item, user, params)
|
||||
if(!resolved && item && target)
|
||||
item.afterattack(target, user, proximity, params)
|
||||
//If wrapped was neither deleted nor put into target, put it back into the gripper.
|
||||
if(wrapped && user && (wrapped.loc == user))
|
||||
wrapped.loc = src
|
||||
else
|
||||
wrapped = null
|
||||
if(item && user && (item.loc == user))
|
||||
takeitem(item, TRUE)
|
||||
return
|
||||
else
|
||||
item = null
|
||||
return STOP_ATTACK_PROC_CHAIN
|
||||
|
||||
else if(istype(target,/obj/item))
|
||||
else if(isitem(target))
|
||||
var/obj/item/I = target
|
||||
var/grab = 0
|
||||
|
||||
@@ -824,24 +838,94 @@
|
||||
|
||||
//We can grab the item, finally.
|
||||
if(grab)
|
||||
to_chat(user, "<span class='notice'>You collect \the [I].</span>")
|
||||
I.loc = src
|
||||
wrapped = I
|
||||
takeitem(I)
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='danger'>Your gripper cannot hold \the [target].</span>")
|
||||
|
||||
/obj/item/weapon/gripper/mining
|
||||
// Rare cases - meant to be handled by code\modules\mob\living\silicon\robot\robot.dm:584 and the weirdness of get_active_held_item() of borgs.
|
||||
/obj/item/gripper/attack_self(mob/user)
|
||||
if(wrapped)
|
||||
wrapped.attack_self(user)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
// Splitable items
|
||||
/obj/item/gripper/AltClick(mob/user)
|
||||
if(wrapped)
|
||||
wrapped.AltClick(user)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
// Even rarer cases
|
||||
/obj/item/gripper/CtrlClick(mob/user)
|
||||
if(wrapped)
|
||||
wrapped.CtrlClick(user)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
// At this point you're just kidding me, but have this one as well.
|
||||
/obj/item/gripper/CtrlShiftClick(mob/user)
|
||||
if(wrapped)
|
||||
wrapped.CtrlShiftClick(user)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
// Make it clear what we can do with it.
|
||||
/obj/item/gripper/examine(mob/user)
|
||||
. = ..()
|
||||
if(wrapped)
|
||||
. += "<span class='notice'>It is holding [icon2html(wrapped, user)] [wrapped].</span>"
|
||||
. += "<span class='notice'>Examine the little preview to examine it.</span>"
|
||||
. += "<span class='notice'>Attempting to drop the gripper will only drop [wrapped].</span>"
|
||||
|
||||
// Resets vis_contents and if holding something, add it to vis_contents.
|
||||
/obj/item/gripper/update_appearance(updates)
|
||||
. = ..()
|
||||
vis_contents = list()
|
||||
if(wrapped)
|
||||
modify_appearance(wrapped, TRUE)
|
||||
vis_contents += wrapped
|
||||
|
||||
// Generates the "minified" version of the item being held and adjust it's position.
|
||||
/obj/item/gripper/proc/modify_appearance(obj/item, minify = FALSE)
|
||||
if(minify)
|
||||
var/matrix/new_transform = new
|
||||
new_transform.Scale(0.5, 0.5)
|
||||
item.transform = new_transform
|
||||
item.pixel_x = 8
|
||||
item.pixel_y = -8
|
||||
else
|
||||
item.pixel_x = initial(pixel_x)
|
||||
item.pixel_y = initial(pixel_y)
|
||||
item.transform = new
|
||||
|
||||
// I kind of wanted the item to be held in the gripper when stored as well, but i realized "store" is just drop as well, so i'll do this for now.
|
||||
// This will handle cases where the borg runs out of power or is damaged enough so the module is forcefully stored.
|
||||
/obj/item/gripper/cyborg_unequip(mob/user)
|
||||
. = ..()
|
||||
if(wrapped)
|
||||
drop_held()
|
||||
|
||||
// Clear references on being destroyed
|
||||
/obj/item/Destroy()
|
||||
for(var/obj/item/gripper/gripper in vis_locs)
|
||||
if(gripper.wrapped == src)
|
||||
gripper.wrapped = null
|
||||
gripper.update_appearance()
|
||||
. = ..()
|
||||
|
||||
/obj/item/gripper/mining
|
||||
name = "shelter capsule deployer"
|
||||
desc = "A simple grasping tool for carrying and deploying shelter capsules. Alt click to drop instead of use."
|
||||
desc = "A simple grasping tool for carrying and deploying shelter capsules."
|
||||
icon_state = "gripper_mining"
|
||||
can_hold = list(
|
||||
/obj/item/survivalcapsule
|
||||
)
|
||||
|
||||
/obj/item/weapon/gripper/medical
|
||||
/obj/item/gripper/medical
|
||||
name = "medical gripper"
|
||||
desc = "A simple grasping tool for interacting with medical equipment, such as beakers, blood bags, chem bags and more. Alt click to drop instead of use."
|
||||
desc = "A simple grasping tool for interacting with medical equipment, such as beakers, blood bags, chem bags and more."
|
||||
icon_state = "gripper_medical"
|
||||
can_hold = list(
|
||||
/obj/item/storage/bag/bio,
|
||||
|
||||
@@ -90,7 +90,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst
|
||||
to_chat(user, "<span class='notice'>There's no room for another VTEC unit!</span>")
|
||||
return FALSE
|
||||
|
||||
//R.speed = -2 // Gotta go fast.
|
||||
//R.vtec = -2 // Gotta go fast.
|
||||
//Citadel change - makes vtecs give an ability rather than reducing the borg's speed instantly
|
||||
VC = new /obj/effect/proc_holder/silicon/cyborg/vtecControl
|
||||
R.AddAbility(VC)
|
||||
@@ -100,7 +100,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst
|
||||
. = ..()
|
||||
if (.)
|
||||
R.RemoveAbility(VC)
|
||||
R.speed = initial(R.speed)
|
||||
R.vtec = initial(R.vtec)
|
||||
R.cansprint = 1
|
||||
|
||||
/obj/item/borg/upgrade/disablercooler
|
||||
@@ -690,11 +690,11 @@ as performing this in action() will cause the upgrade to end up in the borg inst
|
||||
if(istype(user))
|
||||
switch(currentState)
|
||||
if (0)
|
||||
user.speed = initial(user.speed)
|
||||
user.vtec = initial(user.vtec)
|
||||
if (1)
|
||||
user.speed = initial(user.speed) - maxReduction * 0.5
|
||||
user.vtec = initial(user.vtec) - maxReduction * 0.5
|
||||
if (2)
|
||||
user.speed = initial(user.speed) - maxReduction * 1
|
||||
user.vtec = initial(user.vtec) - maxReduction * 1
|
||||
|
||||
action.button_icon_state = "Chevron_State_[currentState]"
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
@@ -548,7 +548,7 @@
|
||||
force = 3
|
||||
throwforce = 3
|
||||
throw_speed = 3
|
||||
var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted
|
||||
base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted
|
||||
var/on_force = 10
|
||||
var/on_throwforce = 8
|
||||
var/on_throw_speed = 2
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
. = ..()
|
||||
update_desc()
|
||||
|
||||
/obj/item/stack/spacecash/proc/update_desc()
|
||||
/obj/item/stack/spacecash/update_desc()
|
||||
var/total_worth = get_item_credit_value()
|
||||
desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""]"
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/obj/item/stack/license_plates
|
||||
name = "invalid plate"
|
||||
desc = "someone fucked up"
|
||||
icon = 'icons/obj/machines/prison.dmi'
|
||||
icon_state = "empty_plate"
|
||||
novariants = FALSE
|
||||
max_amount = 50
|
||||
|
||||
/obj/item/stack/license_plates/empty
|
||||
name = "empty license plate"
|
||||
desc = "Instead of a license plate number, this could contain a quote like \"Live laugh love\"."
|
||||
|
||||
/obj/item/stack/license_plates/empty/fifty
|
||||
amount = 50
|
||||
|
||||
/obj/item/stack/license_plates/filled
|
||||
name = "license plate"
|
||||
desc = "Prison labor paying off."
|
||||
icon_state = "filled_plate_1_1"
|
||||
|
||||
///Override to allow for variations
|
||||
/obj/item/stack/license_plates/filled/update_icon_state()
|
||||
if(novariants)
|
||||
return
|
||||
if(amount <= (max_amount * (1/3)))
|
||||
icon_state = "filled_plate_[rand(1,6)]_1"
|
||||
else if (amount <= (max_amount * (2/3)))
|
||||
icon_state = "filled_plate_[rand(1,6)]_2"
|
||||
else
|
||||
icon_state = "filled_plate_[rand(1,6)]_3"
|
||||
@@ -3,6 +3,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
|
||||
new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 25, one_per_turf = 0), \
|
||||
new/datum/stack_recipe("railing", /obj/structure/railing, 3, time = 18, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("catwalk tile", /obj/item/stack/tile/catwalk, 1, 4, 20), \
|
||||
))
|
||||
|
||||
/obj/item/stack/rods
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
* Glass sheets
|
||||
*/
|
||||
GLOBAL_LIST_INIT(glass_recipes, list ( \
|
||||
new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fulltile window", /obj/structure/window/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 10, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fulltile window", /obj/structure/window/fulltile/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE), \
|
||||
null, \
|
||||
new/datum/stack_recipe_list("glass working bases", list( \
|
||||
new/datum/stack_recipe("chem dish", /obj/item/glasswork/glass_base/dish, 10), \
|
||||
@@ -95,8 +95,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(pglass_recipes, list ( \
|
||||
new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
|
||||
new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 10, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE) \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/plasmaglass
|
||||
@@ -147,10 +147,10 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
|
||||
* Reinforced glass sheets
|
||||
*/
|
||||
GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
|
||||
new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 20, on_floor = TRUE, window_checks = TRUE), \
|
||||
null, \
|
||||
new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
|
||||
new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 10, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE) \
|
||||
))
|
||||
|
||||
|
||||
@@ -198,8 +198,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
|
||||
. += GLOB.reinforced_glass_recipes
|
||||
|
||||
GLOBAL_LIST_INIT(prglass_recipes, list ( \
|
||||
new/datum/stack_recipe("directional reinforced window", /obj/structure/window/plasma/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/plasma/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
|
||||
new/datum/stack_recipe("directional reinforced window", /obj/structure/window/plasma/reinforced/unanchored, time = 10, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/plasma/reinforced/fulltile/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE) \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/plasmarglass
|
||||
@@ -226,7 +226,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
|
||||
S.efficiency *= 1.2
|
||||
|
||||
GLOBAL_LIST_INIT(titaniumglass_recipes, list(
|
||||
new/datum/stack_recipe("shuttle window", /obj/structure/window/shuttle/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE)
|
||||
new/datum/stack_recipe("shuttle window", /obj/structure/window/shuttle/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE)
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/titaniumglass
|
||||
@@ -250,7 +250,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list(
|
||||
S.efficiency *= 1.5
|
||||
|
||||
GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
|
||||
new/datum/stack_recipe("plastitanium window", /obj/structure/window/plastitanium/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE)
|
||||
new/datum/stack_recipe("plastitanium window", /obj/structure/window/plastitanium/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE)
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/plastitaniumglass
|
||||
@@ -355,7 +355,19 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
|
||||
|
||||
/obj/item/shard/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/lightreplacer))
|
||||
I.attackby(src, user)
|
||||
var/obj/item/lightreplacer/L = I
|
||||
L.attackby(src, user)
|
||||
else if(istype(I, /obj/item/stack/sheet/cloth))
|
||||
var/obj/item/stack/sheet/cloth/C = I
|
||||
to_chat(user, "<span class='notice'>You begin to wrap the [C] around the [src]...</span>")
|
||||
if(do_after(user, 35, target = src))
|
||||
var/obj/item/kitchen/knife/shiv/S = new /obj/item/kitchen/knife/shiv
|
||||
C.use(1)
|
||||
to_chat(user, "<span class='notice'>You wrap the [C] around the [src] forming a makeshift weapon.</span>")
|
||||
remove_item_from_storage(src)
|
||||
qdel(src)
|
||||
user.put_in_hands(S)
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -502,6 +502,8 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
|
||||
new /datum/stack_recipe("sterile masks box", /obj/item/storage/box/masks), \
|
||||
new /datum/stack_recipe("body bag box", /obj/item/storage/box/bodybags), \
|
||||
new /datum/stack_recipe("prescription glasses box", /obj/item/storage/box/rxglasses), \
|
||||
new /datum/stack_recipe("oxygen tank box", /obj/item/storage/box/emergencytank), \
|
||||
new /datum/stack_recipe("extended oxygen tank box", /obj/item/storage/box/engitank), \
|
||||
null, \
|
||||
new /datum/stack_recipe("disk box", /obj/item/storage/box/disks), \
|
||||
new /datum/stack_recipe("light tubes box", /obj/item/storage/box/lights/tubes), \
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
amount -= max_amount
|
||||
new type(loc, max_amount, FALSE)
|
||||
if(!merge_type)
|
||||
merge_type = type
|
||||
merge_type = src.type
|
||||
|
||||
if(LAZYLEN(mats_per_unit))
|
||||
set_mats_per_unit(mats_per_unit, 1)
|
||||
|
||||
@@ -555,3 +555,10 @@
|
||||
color = "#92661A"
|
||||
turf_type = /turf/open/floor/bronze
|
||||
custom_materials = list(/datum/material/bronze = 250)
|
||||
|
||||
/obj/item/stack/tile/catwalk
|
||||
name = "catwalk tile"
|
||||
singular_name = "catwalk floor tile"
|
||||
desc = "Flooring that shows its contents underneath. Engineers love it!"
|
||||
icon_state = "catwalk_tile"
|
||||
turf_type = /turf/open/floor/plating/catwalk_floor
|
||||
|
||||
@@ -259,8 +259,8 @@
|
||||
/obj/item/storage/backpack/satchel/bone
|
||||
name = "bone satchel"
|
||||
desc = "A grotesque satchel made of sinews and bones."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "goliath_saddle"
|
||||
icon_state = "satchel-bone"
|
||||
item_state = "satchel-bone"
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
|
||||
/obj/item/storage/backpack/satchel/bone/ComponentInitialize()
|
||||
|
||||
@@ -317,7 +317,7 @@
|
||||
* Trays - Agouri
|
||||
*/
|
||||
/obj/item/storage/bag/tray
|
||||
name = "tray"
|
||||
name = "serving tray"
|
||||
icon = 'icons/obj/food/containers.dmi'
|
||||
icon_state = "tray"
|
||||
desc = "A metal tray to lay food on."
|
||||
@@ -377,6 +377,12 @@
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/bag/tray/cafeteria
|
||||
name = "cafeteria tray"
|
||||
icon = 'icons/obj/food/containers.dmi'
|
||||
icon_state = "foodtray"
|
||||
desc = "A cheap metal tray to pile today's meal onto."
|
||||
|
||||
//bluespace tray, holds more items
|
||||
/obj/item/storage/bag/tray/bluespace
|
||||
name = "bluespace tray"
|
||||
|
||||
@@ -102,12 +102,22 @@
|
||||
new /obj/item/disk/nanite_program(src)
|
||||
|
||||
// Ordinary survival box
|
||||
/obj/item/storage/box/survival
|
||||
name = "survival box"
|
||||
desc = "A box with the bare essentials of ensuring the survival of you and others."
|
||||
icon_state = "internals"
|
||||
illustration = "emergencytank"
|
||||
var/mask_type = /obj/item/clothing/mask/breath
|
||||
var/internal_type = /obj/item/tank/internals/emergency_oxygen
|
||||
var/medipen_type = /obj/item/reagent_containers/hypospray/medipen
|
||||
|
||||
/obj/item/storage/box/survival/PopulateContents()
|
||||
new /obj/item/clothing/mask/breath(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen(src)
|
||||
new mask_type(src)
|
||||
if(!isnull(medipen_type))
|
||||
new medipen_type(src)
|
||||
|
||||
if(!isplasmaman(loc))
|
||||
new /obj/item/tank/internals/emergency_oxygen(src)
|
||||
new internal_type(src)
|
||||
else
|
||||
new /obj/item/tank/internals/plasmaman/belt(src)
|
||||
|
||||
@@ -115,10 +125,13 @@
|
||||
..() // we want the survival stuff too.
|
||||
new /obj/item/radio/off(src)
|
||||
|
||||
/obj/item/storage/box/survival_mining/PopulateContents()
|
||||
new /obj/item/clothing/mask/gas/explorer(src)
|
||||
// Mining survival box
|
||||
/obj/item/storage/box/survival/mining
|
||||
mask_type = /obj/item/clothing/mask/gas/explorer
|
||||
|
||||
/obj/item/storage/box/survival/mining/PopulateContents()
|
||||
..()
|
||||
new /obj/item/crowbar/red(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen(src)
|
||||
|
||||
if(!isplasmaman(loc))
|
||||
new /obj/item/tank/internals/emergency_oxygen(src)
|
||||
@@ -126,39 +139,30 @@
|
||||
new /obj/item/tank/internals/plasmaman/belt(src)
|
||||
|
||||
// Engineer survival box
|
||||
/obj/item/storage/box/engineer/PopulateContents()
|
||||
new /obj/item/clothing/mask/breath(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen(src)
|
||||
/obj/item/storage/box/survival/engineer
|
||||
name = "extended-capacity survival box"
|
||||
desc = "A box with the bare essentials of ensuring the survival of you and others. This one is labelled to contain an extended-capacity tank."
|
||||
illustration = "extendedtank"
|
||||
internal_type = /obj/item/tank/internals/emergency_oxygen/engi
|
||||
|
||||
if(!isplasmaman(loc))
|
||||
new /obj/item/tank/internals/emergency_oxygen/engi(src)
|
||||
else
|
||||
new /obj/item/tank/internals/plasmaman/belt(src)
|
||||
|
||||
/obj/item/storage/box/engineer/radio/PopulateContents()
|
||||
/obj/item/storage/box/survival/engineer/radio/PopulateContents()
|
||||
..() // we want the regular items too.
|
||||
new /obj/item/radio/off(src)
|
||||
|
||||
// Syndie survival box
|
||||
/obj/item/storage/box/syndie/PopulateContents()
|
||||
new /obj/item/clothing/mask/gas/syndicate(src)
|
||||
|
||||
if(!isplasmaman(loc))
|
||||
new /obj/item/tank/internals/emergency_oxygen/engi(src)
|
||||
else
|
||||
new /obj/item/tank/internals/plasmaman/belt(src)
|
||||
/obj/item/storage/box/survival/syndie //why is this its own thing if it's just the engi box with a syndie mask and medipen?
|
||||
name = "extended-capacity survival box"
|
||||
desc = "A box with the bare essentials of ensuring the survival of you and others. This one is labelled to contain an extended-capacity tank."
|
||||
illustration = "extendedtank"
|
||||
mask_type = /obj/item/clothing/mask/gas/syndicate
|
||||
internal_type = /obj/item/tank/internals/emergency_oxygen/engi
|
||||
medipen_type = null
|
||||
|
||||
// Security survival box
|
||||
/obj/item/storage/box/security/PopulateContents()
|
||||
new /obj/item/clothing/mask/gas/sechailer(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen(src)
|
||||
/obj/item/storage/box/survival/security
|
||||
mask_type = /obj/item/clothing/mask/gas/sechailer
|
||||
|
||||
if(!isplasmaman(loc))
|
||||
new /obj/item/tank/internals/emergency_oxygen(src)
|
||||
else
|
||||
new /obj/item/tank/internals/plasmaman/belt(src)
|
||||
|
||||
/obj/item/storage/box/security/radio/PopulateContents()
|
||||
/obj/item/storage/box/survival/security/radio/PopulateContents()
|
||||
..() // we want the regular stuff too
|
||||
new /obj/item/radio/off(src)
|
||||
|
||||
@@ -1244,6 +1248,26 @@
|
||||
icon_state = "box_pink"
|
||||
illustration = null
|
||||
|
||||
/obj/item/storage/box/emergencytank
|
||||
name = "emergency oxygen tank box"
|
||||
desc = "A box of emergency oxygen tanks."
|
||||
illustration = "emergencytank"
|
||||
|
||||
/obj/item/storage/box/emergencytank/PopulateContents()
|
||||
..()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/tank/internals/emergency_oxygen(src) //in case anyone ever wants to do anything with spawning them, apart from crafting the box
|
||||
|
||||
/obj/item/storage/box/engitank
|
||||
name = "extended-capacity emergency oxygen tank box"
|
||||
desc = "A box of extended-capacity emergency oxygen tanks."
|
||||
illustration = "extendedtank"
|
||||
|
||||
/obj/item/storage/box/engitank/PopulateContents()
|
||||
..()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/tank/internals/emergency_oxygen/engi(src) //in case anyone ever wants to do anything with spawning them, apart from crafting the box
|
||||
|
||||
/obj/item/storage/box/mre //base MRE type.
|
||||
name = "Nanotrasen MRE Ration Kit Menu 0"
|
||||
desc = "A package containing food suspended in an outdated bluespace pocket which lasts for centuries. If you're lucky you may even be able to enjoy the meal without getting food poisoning."
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
|
||||
attack_speed = CLICK_CD_MELEE
|
||||
|
||||
var/stamina_loss_amount = 35
|
||||
var/stamina_loss_amount = 40
|
||||
var/turned_on = FALSE
|
||||
var/knockdown = TRUE
|
||||
/// block percent needed to prevent knockdown/disarm
|
||||
@@ -25,7 +25,7 @@
|
||||
var/hitcost = 750
|
||||
var/throw_hit_chance = 35
|
||||
var/preload_cell_type //if not empty the baton starts with this type of cell
|
||||
var/cooldown_duration = 5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown
|
||||
var/cooldown_duration = 3.5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown
|
||||
var/status_duration = 5 SECONDS //how long our status effects last for otherwise
|
||||
COOLDOWN_DECLARE(shove_cooldown)
|
||||
|
||||
|
||||
@@ -80,8 +80,8 @@
|
||||
|
||||
/obj/item/watertank/MouseDrop(obj/over_object)
|
||||
var/mob/M = loc
|
||||
if(istype(M) && istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
if(istype(M) && istype(over_object, /atom/movable/screen/inventory/hand))
|
||||
var/atom/movable/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -889,8 +889,8 @@
|
||||
M.put_in_hands(src)
|
||||
to_chat(usr, "<span class='notice'>You pick up the deck.</span>")
|
||||
|
||||
else if(istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
else if(istype(over_object, /atom/movable/screen/inventory/hand))
|
||||
var/atom/movable/screen/inventory/hand/H = over_object
|
||||
if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
|
||||
to_chat(usr, "<span class='notice'>You pick up the deck.</span>")
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
//returns the damage value of the attack after processing the obj's various armor protections
|
||||
/obj/proc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0)
|
||||
if(damage_flag == MELEE && damage_amount < damage_deflection)
|
||||
return 0
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(BURN)
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
var/max_integrity = 500
|
||||
var/integrity_failure = 0 //0 if we have no special broken behavior, otherwise is a percentage of at what point the obj breaks. 0.5 being 50%
|
||||
|
||||
///Damage under this value will be completely ignored
|
||||
var/damage_deflection = 0
|
||||
|
||||
var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
|
||||
|
||||
var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset.
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
. += "off"
|
||||
. += "sparking"
|
||||
//Overlay is similar enough for both that we can use the same mask for both
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "locked", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha)
|
||||
. += emissive_appearance(icon, "locked", alpha = src.alpha)
|
||||
. += locked ? "locked" : "unlocked"
|
||||
|
||||
|
||||
@@ -356,7 +356,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user)
|
||||
if(!istype(O) || O.anchored || istype(O, /obj/screen))
|
||||
if(!istype(O) || O.anchored || istype(O, /atom/movable/screen))
|
||||
return
|
||||
if(!istype(user) || user.incapacitated() || user.lying)
|
||||
return
|
||||
@@ -531,7 +531,7 @@
|
||||
|
||||
/obj/structure/closet/get_remote_view_fullscreens(mob/user)
|
||||
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
|
||||
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1)
|
||||
|
||||
/obj/structure/closet/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
new /obj/item/clothing/neck/petcollar(src) //I considered removing the pet stuff too but eh, who knows. We might get Renault back. Plus I guess you could use that collar for... other means. Aren't you supposed to be guarding the disk?
|
||||
new /obj/item/pet_carrier(src)
|
||||
new /obj/item/clothing/suit/armor/vest/capcarapace(src)
|
||||
new /obj/item/clothing/suit/armor/vest/capcarapace/alt(src)
|
||||
new /obj/item/clothing/suit/toggle/captains_parade(src)
|
||||
new /obj/item/clothing/head/crown/fancy(src)
|
||||
new /obj/item/cartridge/captain(src)
|
||||
new /obj/item/storage/box/silver_ids(src)
|
||||
@@ -56,6 +56,7 @@
|
||||
/obj/structure/closet/secure_closet/hos/PopulateContents()
|
||||
..()
|
||||
new /obj/item/clothing/neck/cloak/hos(src)
|
||||
new /obj/item/clothing/suit/toggle/armor/hos/hos_formal(src)
|
||||
new /obj/item/cartridge/hos(src)
|
||||
new /obj/item/radio/headset/heads/hos(src)
|
||||
new /obj/item/clothing/under/rank/security/head_of_security/parade/female(src)
|
||||
@@ -191,6 +192,7 @@
|
||||
new /obj/item/clothing/under/rank/prisoner( src )
|
||||
new /obj/item/clothing/under/rank/prisoner/skirt( src )
|
||||
new /obj/item/clothing/shoes/sneakers/orange( src )
|
||||
new /obj/item/radio/headset/headset_prisoner( src )
|
||||
|
||||
/obj/structure/closet/secure_closet/courtroom
|
||||
name = "courtroom locker"
|
||||
|
||||
@@ -106,6 +106,16 @@
|
||||
name = "trash cart"
|
||||
icon_state = "trashcart"
|
||||
|
||||
/obj/structure/closet/crate/trashcart/Moved()
|
||||
. = ..()
|
||||
if(has_gravity())
|
||||
playsound(src, 'sound/effects/roll.ogg', 100, TRUE)
|
||||
|
||||
/obj/structure/closet/crate/trashcart/laundry
|
||||
name = "laundry cart"
|
||||
desc = "A large cart for hauling around large amounts of laundry."
|
||||
icon_state = "laundry"
|
||||
|
||||
/obj/structure/closet/crate/medical
|
||||
desc = "A medical crate."
|
||||
name = "medical crate"
|
||||
|
||||
@@ -269,7 +269,7 @@
|
||||
. += get_airlock_overlay("glass_construction", overlays_file)
|
||||
. += get_airlock_overlay("panel_c[state+1]", overlays_file)
|
||||
|
||||
/obj/structure/door_assembly/proc/update_name()
|
||||
/obj/structure/door_assembly/update_name()
|
||||
name = ""
|
||||
switch(state)
|
||||
if(AIRLOCK_ASSEMBLY_NEEDS_WIRES)
|
||||
|
||||
@@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
|
||||
|
||||
/obj/structure/bodycontainer/get_remote_view_fullscreens(mob/user)
|
||||
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
|
||||
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2)
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2)
|
||||
/*
|
||||
* Morgue
|
||||
*/
|
||||
|
||||
@@ -243,6 +243,32 @@
|
||||
new framestack(T, framestackamount)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/**
|
||||
* Gets all connected tables
|
||||
* Cardinals only
|
||||
*/
|
||||
/obj/structure/table/proc/connected_floodfill(max = 25)
|
||||
. = list()
|
||||
connected_floodfill_internal(., list())
|
||||
|
||||
/obj/structure/table/proc/connected_floodfill_internal(list/out = list(), list/processed = list())
|
||||
if(processed[src])
|
||||
return
|
||||
processed[src] = TRUE
|
||||
out += src
|
||||
var/obj/structure/table/other
|
||||
#define RUN_TABLE(dir) \
|
||||
other = locate(/obj/structure/table) in get_step(src, dir); \
|
||||
if(other) { \
|
||||
other.connected_floodfill_internal(out, processed); \
|
||||
}
|
||||
RUN_TABLE(NORTH)
|
||||
RUN_TABLE(SOUTH)
|
||||
RUN_TABLE(EAST)
|
||||
RUN_TABLE(WEST)
|
||||
#undef RUN_TABLE
|
||||
|
||||
/obj/structure/table/greyscale
|
||||
icon = 'icons/obj/smooth_structures/table_greyscale.dmi'
|
||||
icon_state = "table"
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* ## catwalk flooring
|
||||
*
|
||||
* They show what's underneath their catwalk flooring (pipes and the like)
|
||||
* you can crowbar it to interact with the underneath stuff without destroying the tile...
|
||||
* unless you want to!
|
||||
*/
|
||||
/turf/open/floor/plating/catwalk_floor
|
||||
icon = 'icons/turf/floors/catwalk_plating.dmi'
|
||||
icon_state = "catwalk_below"
|
||||
floor_tile = /obj/item/stack/tile/catwalk
|
||||
name = "catwalk floor"
|
||||
desc = "Flooring that shows its contents underneath. Engineers love it!"
|
||||
baseturfs = /turf/open/floor/plating
|
||||
footstep = FOOTSTEP_CATWALK
|
||||
barefootstep = FOOTSTEP_CATWALK
|
||||
clawfootstep = FOOTSTEP_CATWALK
|
||||
heavyfootstep = FOOTSTEP_CATWALK
|
||||
var/covered = TRUE
|
||||
|
||||
/turf/open/floor/plating/catwalk_floor/Initialize()
|
||||
. = ..()
|
||||
layer = CATWALK_LAYER
|
||||
update_icon(UPDATE_OVERLAYS)
|
||||
|
||||
/turf/open/floor/plating/catwalk_floor/update_overlays()
|
||||
. = ..()
|
||||
var/static/catwalk_overlay
|
||||
if(isnull(catwalk_overlay))
|
||||
catwalk_overlay = iconstate2appearance(icon, "catwalk_above")
|
||||
if(covered)
|
||||
. += catwalk_overlay
|
||||
|
||||
/turf/open/floor/plating/catwalk_floor/screwdriver_act(mob/living/user, obj/item/tool)
|
||||
. = ..()
|
||||
covered = !covered
|
||||
to_chat(user, span_notice("[!covered ? "You removed the cover!" : "You added the cover!"]"))
|
||||
update_icon(UPDATE_OVERLAYS)
|
||||
|
||||
/turf/open/floor/plating/catwalk_floor/pry_tile(obj/item/crowbar, mob/user, silent)
|
||||
if(covered)
|
||||
to_chat(user, span_notice("You need to remove the cover first!"))
|
||||
return FALSE
|
||||
. = ..()
|
||||
@@ -263,7 +263,7 @@
|
||||
|
||||
/turf/open/floor/padded
|
||||
name = "padded floor"
|
||||
desc = "Keeps crazy people from hurting themselves. It's soft, plush, and very nice to get shoved agaisnt."
|
||||
desc = "Keeps crazy people from hurting themselves. It's soft, plush, and very nice to get shoved against."
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "floor_padded"
|
||||
floor_tile = /obj/item/stack/tile/padded
|
||||
|
||||
@@ -15,3 +15,7 @@
|
||||
barefootstep = FOOTSTEP_WATER
|
||||
clawfootstep = FOOTSTEP_WATER
|
||||
heavyfootstep = FOOTSTEP_WATER
|
||||
|
||||
/turf/open/water/decorative
|
||||
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
|
||||
planetary_atmos = FALSE
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ GLOBAL_LIST(topic_status_cache)
|
||||
call(debug_server, "auxtools_init")()
|
||||
enable_debugging()
|
||||
AUXTOOLS_CHECK(AUXMOS)
|
||||
#ifdef REFERENCE_TRACKING
|
||||
#ifdef EXTOOLS_REFERENCE_TRACKING
|
||||
enable_reference_tracking()
|
||||
#endif
|
||||
world.Profile(PROFILE_START)
|
||||
|
||||
Reference in New Issue
Block a user