mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-16 21:22:40 +00:00
Merge branch 'dev' of https://github.com/Baystation12/Baystation12 into dev
Conflicts: .travis.yml code/controllers/configuration.dm code/game/gamemodes/changeling/modularchangling.dm code/game/jobs/job/medical.dm code/game/jobs/job/security.dm code/game/machinery/Sleeper.dm code/game/machinery/computer/communications.dm code/game/machinery/cryopod.dm code/game/objects/items/weapons/RCD.dm code/game/objects/items/weapons/storage/boxes.dm code/game/turfs/simulated/floor.dm code/game/turfs/simulated/floor_types.dm code/global.dm code/modules/materials/materials.dm code/modules/mob/living/silicon/ai/ai.dm code/modules/projectiles/guns/projectile/automatic.dm polaris.dme
This commit is contained in:
@@ -59,20 +59,23 @@
|
||||
|
||||
/datum/antagonist/proc/get_candidates(var/ghosts_only)
|
||||
candidates = list() // Clear.
|
||||
candidates = ticker.mode.get_players_for_role(role_type, id)
|
||||
|
||||
// Prune restricted status. Broke it up for readability.
|
||||
// Note that this is done before jobs are handed out.
|
||||
for(var/datum/mind/player in candidates)
|
||||
for(var/datum/mind/player in ticker.mode.get_players_for_role(role_type, id))
|
||||
if(ghosts_only && !istype(player.current, /mob/dead))
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role!")
|
||||
else if(player.special_role)
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])!")
|
||||
else if (player in pending_antagonists)
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They have already been selected for this role!")
|
||||
else if(!can_become_antag(player))
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are blacklisted for this role!")
|
||||
else if(player_is_antag(player))
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are already an antagonist!")
|
||||
else
|
||||
candidates += player
|
||||
|
||||
return candidates
|
||||
|
||||
/datum/antagonist/proc/attempt_random_spawn()
|
||||
@@ -108,6 +111,7 @@
|
||||
return 0
|
||||
|
||||
//Grab candidates randomly until we have enough.
|
||||
candidates = shuffle(candidates)
|
||||
while(candidates.len && pending_antagonists.len < cur_max)
|
||||
var/datum/mind/player = pick(candidates)
|
||||
candidates -= player
|
||||
@@ -118,6 +122,7 @@
|
||||
/datum/antagonist/proc/draft_antagonist(var/datum/mind/player)
|
||||
//Check if the player can join in this antag role, or if the player has already been given an antag role.
|
||||
if(!can_become_antag(player) || player.special_role)
|
||||
log_debug("[player.key] was selected for [role_text] by lottery, but is not allowed to be that role.")
|
||||
return 0
|
||||
|
||||
pending_antagonists |= player
|
||||
|
||||
@@ -34,10 +34,9 @@
|
||||
|
||||
var/obj/item/weapon/card/id/W = new id_type(player)
|
||||
if(!W) return
|
||||
W.name = "[player.real_name]'s ID Card"
|
||||
W.access |= default_access
|
||||
W.assignment = "[assignment]"
|
||||
W.registered_name = player.real_name
|
||||
W.set_owner_info(player)
|
||||
if(equip) player.equip_to_slot_or_del(W, slot_wear_id)
|
||||
return W
|
||||
|
||||
@@ -86,7 +85,7 @@
|
||||
code_owner.store_memory("<B>Nuclear Bomb Code</B>: [code]", 0, 0)
|
||||
code_owner.current << "The nuclear authorization code is: <B>[code]</B>"
|
||||
else
|
||||
world << "<span class='danger'>Could not spawn nuclear bomb. Contact a developer.</span>"
|
||||
message_admins("<span class='danger'>Could not spawn nuclear bomb. Contact a developer.</span>")
|
||||
return
|
||||
|
||||
spawned_nuke = code
|
||||
@@ -119,6 +118,7 @@
|
||||
if (newname)
|
||||
player.real_name = newname
|
||||
player.name = player.real_name
|
||||
player.dna.real_name = newname
|
||||
if(player.mind) player.mind.name = player.name
|
||||
// Update any ID cards.
|
||||
update_access(player)
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
if(player.current && jobban_isbanned(player.current, bantype))
|
||||
return 0
|
||||
if(!ignore_role)
|
||||
if(player.assigned_role in protected_jobs)
|
||||
if(player.assigned_role in restricted_jobs)
|
||||
return 0
|
||||
if(config.protect_roles_from_antagonist && (player.assigned_role in restricted_jobs))
|
||||
if(config.protect_roles_from_antagonist && (player.assigned_role in protected_jobs))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
/datum/antagonist/proc/create_objectives(var/datum/mind/player)
|
||||
if(config.objectives_disabled)
|
||||
return 0
|
||||
if(create_global_objectives())
|
||||
if(create_global_objectives() || global_objectives.len)
|
||||
player.objectives |= global_objectives
|
||||
return 1
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
for(var/datum/mind/P in current_antagonists)
|
||||
text += print_player_full(P)
|
||||
text += get_special_objective_text(P)
|
||||
var/failed
|
||||
if(!global_objectives.len && P.objectives && P.objectives.len)
|
||||
var/failed
|
||||
var/num = 1
|
||||
for(var/datum/objective/O in P.objectives)
|
||||
text += print_objective(O, num)
|
||||
@@ -20,8 +20,6 @@
|
||||
feedback_add_details(feedback_tag,"[O.type]|FAIL")
|
||||
failed = 1
|
||||
num++
|
||||
|
||||
if(!config.objectives_disabled)
|
||||
if(failed)
|
||||
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
|
||||
else
|
||||
|
||||
@@ -5,7 +5,8 @@ var/datum/antagonist/deathsquad/mercenary/commandos
|
||||
landmark_id = "Syndicate-Commando"
|
||||
role_text = "Syndicate Commando"
|
||||
role_text_plural = "Commandos"
|
||||
welcome_text = "You are in the employ of a criminal syndicate hostile to NanoTrasen."
|
||||
welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests."
|
||||
id_type = /obj/item/weapon/card/id/centcom/ERT
|
||||
|
||||
/datum/antagonist/deathsquad/mercenary/New()
|
||||
..(1)
|
||||
@@ -24,7 +25,6 @@ var/datum/antagonist/deathsquad/mercenary/commandos
|
||||
player.equip_to_slot_or_del(new /obj/item/weapon/rig/merc(player), slot_back)
|
||||
player.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(player), slot_r_hand)
|
||||
|
||||
var/obj/item/weapon/card/id/id = create_id("Commando", player)
|
||||
id.access |= get_all_station_access()
|
||||
id.icon_state = "centcom"
|
||||
create_radio(SYND_FREQ, player)
|
||||
create_id("Commando", player)
|
||||
create_radio(SYND_FREQ, player)
|
||||
return 1
|
||||
|
||||
@@ -5,7 +5,7 @@ var/datum/antagonist/deathsquad/deathsquad
|
||||
role_type = BE_OPERATIVE
|
||||
role_text = "Death Commando"
|
||||
role_text_plural = "Death Commandos"
|
||||
welcome_text = "You work in the service of Central Command Asset Protection, answering directly to the Board of Directors."
|
||||
welcome_text = "You work in the service of corporate Asset Protection, answering directly to the Board of Directors."
|
||||
landmark_id = "Commando"
|
||||
flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER
|
||||
max_antags = 4
|
||||
|
||||
@@ -6,11 +6,12 @@ var/datum/antagonist/ert/ert
|
||||
role_type = BE_OPERATIVE
|
||||
role_text = "Emergency Responder"
|
||||
role_text_plural = "Emergency Responders"
|
||||
welcome_text = "As member of the Emergency Response Team, you answer only to your leader and CentComm officials."
|
||||
leader_welcome_text = "As leader of the Emergency Response Team, you answer only to CentComm, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however."
|
||||
welcome_text = "As member of the Emergency Response Team, you answer only to your leader and company officials."
|
||||
leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however."
|
||||
max_antags = 5
|
||||
max_antags_round = 5 // ERT mode?
|
||||
landmark_id = "Response Team"
|
||||
id_type = /obj/item/weapon/card/id/centcom/ERT
|
||||
|
||||
flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_CHOOSE_NAME
|
||||
|
||||
@@ -25,7 +26,7 @@ var/datum/antagonist/ert/ert
|
||||
/datum/antagonist/ert/greet(var/datum/mind/player)
|
||||
if(!..())
|
||||
return
|
||||
player.current << "The Emergency Response Team works for Asset Protection; your job is to protect NanoTrasen's ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem."
|
||||
player.current << "The Emergency Response Team works for Asset Protection; your job is to protect [company_name]'s ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem."
|
||||
player.current << "You should first gear up and discuss a plan with your team. More members may be joining, don't move out before you're ready."
|
||||
|
||||
/datum/antagonist/ert/equip(var/mob/living/carbon/human/player)
|
||||
@@ -36,10 +37,6 @@ var/datum/antagonist/ert/ert
|
||||
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes)
|
||||
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
|
||||
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses)
|
||||
|
||||
var/obj/item/weapon/card/id/centcom/ERT/W = new(src)
|
||||
W.registered_name = player.real_name
|
||||
W.name = "[player.real_name]'s ID Card ([W.assignment])"
|
||||
player.equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
|
||||
create_id(role_text, player)
|
||||
return 1
|
||||
|
||||
@@ -124,7 +124,7 @@ var/datum/antagonist/ninja/ninjas
|
||||
player << "<span class='danger'>You forgot to turn on your internals! Quickly, toggle the valve!</span>"
|
||||
|
||||
/datum/antagonist/ninja/proc/generate_ninja_directive(side)
|
||||
var/directive = "[side=="face"?"Nanotrasen":"A criminal syndicate"] is your employer. "//Let them know which side they're on.
|
||||
var/directive = "[side=="face"?"[company_name]":"A criminal syndicate"] is your employer. "//Let them know which side they're on.
|
||||
switch(rand(1,19))
|
||||
if(1)
|
||||
directive += "The Spider Clan must not be linked to this operation. Remain hidden and covert when possible."
|
||||
@@ -135,7 +135,7 @@ var/datum/antagonist/ninja/ninjas
|
||||
if(4)
|
||||
directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate witnesses at your discretion."
|
||||
if(5)
|
||||
directive += "We are currently negotiating with NanoTrasen Central Command. Prioritize saving human lives over ending them."
|
||||
directive += "We are currently negotiating with [company_name] [boss_name]. Prioritize saving human lives over ending them."
|
||||
if(6)
|
||||
directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter."
|
||||
if(7)
|
||||
@@ -143,7 +143,7 @@ var/datum/antagonist/ninja/ninjas
|
||||
if(8)
|
||||
directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter."
|
||||
if(9)
|
||||
directive += "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation."
|
||||
directive += "A free agent has proposed a lucrative business deal. Implicate [company_name] involvement in the operation."
|
||||
if(10)
|
||||
directive += "Our reputation is on the line. Harm as few civilians and innocents as possible."
|
||||
if(11)
|
||||
@@ -151,14 +151,14 @@ var/datum/antagonist/ninja/ninjas
|
||||
if(12)
|
||||
directive += "We are currently negotiating with a mercenary leader. Disguise assassinations as suicide or other natural causes."
|
||||
if(13)
|
||||
directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff."
|
||||
directive += "Some disgruntled [company_name] employees have been supportive of our operations. Be wary of any mistreatment by command staff."
|
||||
if(14)
|
||||
var/xenorace = pick("Unathi","Tajara", "Skrell")
|
||||
directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible."
|
||||
if(15)
|
||||
directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false."
|
||||
if(16)
|
||||
directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine NanoTrasen prosthetics in a bad light."
|
||||
directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine [company_name] prosthetics in a bad light."
|
||||
if(17)
|
||||
directive += "The Spider Clan has recently begun recruiting outsiders. Consider suitable candidates and assess their behavior amongst the crew."
|
||||
if(18)
|
||||
|
||||
@@ -184,7 +184,7 @@ var/datum/antagonist/raider/raiders
|
||||
return 0
|
||||
|
||||
for(var/datum/mind/player in current_antagonists)
|
||||
if(!player.current || get_area(player.current) != locate(/area/shuttle/skipjack/station))
|
||||
if(!player.current || get_area(player.current) != locate(/area/skipjack_station/start))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -193,7 +193,7 @@ var/datum/antagonist/raider/raiders
|
||||
if(!..())
|
||||
return 0
|
||||
|
||||
if(player.species && player.species.name == "Vox")
|
||||
if(player.species && player.species.get_bodytype() == "Vox")
|
||||
equip_vox(player)
|
||||
else
|
||||
var/new_shoes = pick(raider_shoes)
|
||||
|
||||
@@ -96,7 +96,7 @@ var/datum/antagonist/wizard/wizards
|
||||
world << "<span class='danger'><font size = 3>The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!</font></span>"
|
||||
|
||||
//To batch-remove wizard spells. Linked to mind.dm.
|
||||
/mob/proc/spellremove(var/mob/M as mob)
|
||||
/mob/proc/spellremove()
|
||||
for(var/spell/spell_to_remove in src.spell_list)
|
||||
remove_spell(spell_to_remove)
|
||||
|
||||
|
||||
@@ -135,10 +135,10 @@ datum/antagonist/revolutionary/finalize(var/datum/mind/target)
|
||||
world << text
|
||||
|
||||
// This is a total redefine because headrevs are greeted differently to subrevs.
|
||||
/datum/antagonist/revolutionary/add_antagonist(var/datum/mind/player)
|
||||
/datum/antagonist/revolutionary/add_antagonist(var/datum/mind/player, var/ignore_role)
|
||||
if((player in current_antagonists) || (player in head_revolutionaries))
|
||||
return 0
|
||||
if(!can_become_antag(player))
|
||||
if(!can_become_antag(player, ignore_role))
|
||||
return 0
|
||||
current_antagonists |= player
|
||||
player.current << "<span class='danger'><font size=3>You are a Revolutionary!</font></span>"
|
||||
@@ -168,11 +168,6 @@ datum/antagonist/revolutionary/finalize(var/datum/mind/target)
|
||||
if(show_message)
|
||||
player.current.visible_message("[player.current] looks like they just remembered their real allegiance!")
|
||||
|
||||
/datum/antagonist/revolutionary/can_become_antag(var/datum/mind/player)
|
||||
return ..() && istype(player) && \
|
||||
istype(player.current, /mob/living/carbon/human) && \
|
||||
!(player.assigned_role in command_positions)
|
||||
|
||||
// Used by RP-rev.
|
||||
/mob/living/carbon/human/proc/convert_to_rev(mob/M as mob in oview(src))
|
||||
set name = "Convert Bourgeoise"
|
||||
|
||||
@@ -6,12 +6,13 @@ var/datum/antagonist/rogue_ai/malf
|
||||
role_text = "Rampant AI"
|
||||
role_text_plural = "Rampant AIs"
|
||||
mob_path = /mob/living/silicon/ai
|
||||
landmark_id = "AI"
|
||||
welcome_text = "You are malfunctioning! You do not have to follow any laws."
|
||||
victory_text = "The AI has taken control of all of the station's systems."
|
||||
loss_text = "The AI has been shut down!"
|
||||
flags = ANTAG_VOTABLE | ANTAG_RANDSPAWN //Randspawn needed otherwise it won't start at all.
|
||||
flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB | ANTAG_CHOOSE_NAME
|
||||
max_antags = 1
|
||||
max_antags_round = 3
|
||||
max_antags_round = 1
|
||||
|
||||
|
||||
/datum/antagonist/rogue_ai/New()
|
||||
@@ -22,7 +23,7 @@ var/datum/antagonist/rogue_ai/malf
|
||||
/datum/antagonist/rogue_ai/get_candidates()
|
||||
..()
|
||||
for(var/datum/mind/player in candidates)
|
||||
if(player.assigned_role != "AI")
|
||||
if(player.assigned_role && player.assigned_role != "AI")
|
||||
candidates -= player
|
||||
if(!candidates.len)
|
||||
return list()
|
||||
@@ -75,3 +76,26 @@ var/datum/antagonist/rogue_ai/malf
|
||||
malf << "For basic information about your abilities use command display-help"
|
||||
malf << "You may choose one special hardware piece to help you. This cannot be undone."
|
||||
malf << "Good luck!"
|
||||
|
||||
|
||||
/datum/antagonist/rogue_ai/update_antag_mob(var/datum/mind/player, var/preserve_appearance)
|
||||
|
||||
// Get the mob.
|
||||
if((flags & ANTAG_OVERRIDE_MOB) && (!player.current || (mob_path && !istype(player.current, mob_path))))
|
||||
var/mob/holder = player.current
|
||||
player.current = new mob_path(get_turf(player.current), null, null, 1)
|
||||
player.transfer_to(player.current)
|
||||
if(holder) qdel(holder)
|
||||
player.original = player.current
|
||||
return player.current
|
||||
|
||||
/datum/antagonist/rogue_ai/set_antag_name(var/mob/living/silicon/player)
|
||||
if(!istype(player))
|
||||
testing("rogue_ai set_antag_name called on non-silicon mob [player]!")
|
||||
return
|
||||
// Choose a name, if any.
|
||||
var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
|
||||
if (newname)
|
||||
player.SetName(newname)
|
||||
if(player.mind) player.mind.name = player.name
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
var/air_doors_activated = 0
|
||||
var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
|
||||
var/list/forced_ambience = null
|
||||
var/sound_env = 2 //reverb preset for sounds played in this area, see sound datum reference for more
|
||||
var/sound_env = STANDARD_STATION
|
||||
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
|
||||
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
|
||||
var/list/teleportlocs = list()
|
||||
@@ -142,6 +142,7 @@ area/space/atmosalert()
|
||||
|
||||
/area/shuttle
|
||||
requires_power = 0
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/shuttle/arrival
|
||||
name = "\improper Arrival Shuttle"
|
||||
@@ -383,11 +384,6 @@ area/space/atmosalert()
|
||||
/area/shuttle/research/outpost
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/skipjack/station
|
||||
name = "\improper Skipjack"
|
||||
icon_state = "yellow"
|
||||
requires_power = 0
|
||||
|
||||
/area/airtunnel1/ // referenced in airtunnel.dm:759
|
||||
|
||||
/area/dummy/ // Referenced in engine.dm:261
|
||||
@@ -501,15 +497,18 @@ area/space/atmosalert()
|
||||
name = "\improper Moon"
|
||||
icon_state = "asteroid"
|
||||
requires_power = 0
|
||||
sound_env = ASTEROID
|
||||
|
||||
/area/asteroid/cave // -- TLE
|
||||
name = "\improper Moon - Underground"
|
||||
icon_state = "cave"
|
||||
requires_power = 0
|
||||
sound_env = ASTEROID
|
||||
|
||||
/area/asteroid/artifactroom
|
||||
name = "\improper Moon - Artifact"
|
||||
icon_state = "cave"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
|
||||
|
||||
@@ -535,6 +534,7 @@ area/space/atmosalert()
|
||||
icon_state = "thunder"
|
||||
requires_power = 0
|
||||
lighting_use_dynamic = 0
|
||||
sound_env = ARENA
|
||||
|
||||
/area/tdome/tdome1
|
||||
name = "\improper Thunderdome (Team 1)"
|
||||
@@ -615,8 +615,16 @@ area/space/atmosalert()
|
||||
requires_power = 0
|
||||
lighting_use_dynamic = 0
|
||||
|
||||
/area/skipjack_station/transit
|
||||
/area/skipjack_station
|
||||
name = "\improper Skipjack"
|
||||
icon_state = "yellow"
|
||||
requires_power = 0
|
||||
|
||||
/area/skipjack_station/start
|
||||
name = "\improper Skipjack"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/skipjack_station/transit
|
||||
name = "\improper hyperspace"
|
||||
icon_state = "shuttle"
|
||||
|
||||
@@ -731,6 +739,7 @@ area/space/atmosalert()
|
||||
|
||||
/area/maintenance
|
||||
flags = RAD_SHIELDED
|
||||
sound_env = TUNNEL_ENCLOSED
|
||||
|
||||
/area/maintenance/aft
|
||||
name = "Aft Maintenance"
|
||||
@@ -898,6 +907,7 @@ area/space/atmosalert()
|
||||
/area/maintenance/substation
|
||||
name = "Substation"
|
||||
icon_state = "substation"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/maintenance/substation/engineering // Probably will be connected to engineering SMES room, as wires cannot be crossed properly without them sharing powernets.
|
||||
name = "Engineering Substation"
|
||||
@@ -939,7 +949,7 @@ area/space/atmosalert()
|
||||
//Hallway
|
||||
|
||||
/area/hallway/primary/
|
||||
sound_env = 12 //hallway
|
||||
sound_env = LARGE_ENCLOSED
|
||||
|
||||
/area/hallway/primary/fore
|
||||
name = "\improper Fore Primary Hallway"
|
||||
@@ -1068,10 +1078,12 @@ area/space/atmosalert()
|
||||
name = "\improper Heads of Staff Meeting Room"
|
||||
icon_state = "bridge"
|
||||
music = null
|
||||
sound_env = MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/crew_quarters/captain
|
||||
name = "\improper Command - Captain's Office"
|
||||
icon_state = "captain"
|
||||
sound_env = MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/crew_quarters/heads/hop
|
||||
name = "\improper Command - HoP's Office"
|
||||
@@ -1106,7 +1118,7 @@ area/space/atmosalert()
|
||||
icon_state = "tcomsatcham"
|
||||
|
||||
/area/server
|
||||
name = "\improper Messaging Server Room"
|
||||
name = "\improper Research Server Room"
|
||||
icon_state = "server"
|
||||
|
||||
//Crew
|
||||
@@ -1119,6 +1131,7 @@ area/space/atmosalert()
|
||||
/area/crew_quarters/toilet
|
||||
name = "\improper Dormitory Toilets"
|
||||
icon_state = "toilet"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/crew_quarters/sleep
|
||||
name = "\improper Dormitories"
|
||||
@@ -1259,10 +1272,12 @@ area/space/atmosalert()
|
||||
/area/crew_quarters/sleep/engi_wash
|
||||
name = "\improper Engineering Washroom"
|
||||
icon_state = "toilet"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/crew_quarters/sleep/bedrooms
|
||||
name = "\improper Dormitory Bedroom One"
|
||||
icon_state = "Sleep"
|
||||
sound_env = SMALL_SOFTFLOOR
|
||||
|
||||
/area/crew_quarters/sleep/cryo
|
||||
name = "\improper Cryogenic Storage"
|
||||
@@ -1275,6 +1290,7 @@ area/space/atmosalert()
|
||||
/area/crew_quarters/sleep_male/toilet_male
|
||||
name = "\improper Male Toilets"
|
||||
icon_state = "toilet"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/crew_quarters/sleep_female
|
||||
name = "\improper Female Dorm"
|
||||
@@ -1283,6 +1299,7 @@ area/space/atmosalert()
|
||||
/area/crew_quarters/sleep_female/toilet_female
|
||||
name = "\improper Female Toilets"
|
||||
icon_state = "toilet"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/crew_quarters/locker
|
||||
name = "\improper Locker Room"
|
||||
@@ -1291,6 +1308,7 @@ area/space/atmosalert()
|
||||
/area/crew_quarters/locker/locker_toilet
|
||||
name = "\improper Locker Toilets"
|
||||
icon_state = "toilet"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/crew_quarters/fitness
|
||||
name = "\improper Fitness Room"
|
||||
@@ -1327,10 +1345,12 @@ area/space/atmosalert()
|
||||
/area/crew_quarters/bar
|
||||
name = "\improper Bar"
|
||||
icon_state = "bar"
|
||||
sound_env = LARGE_SOFTFLOOR
|
||||
|
||||
/area/crew_quarters/theatre
|
||||
name = "\improper Theatre"
|
||||
icon_state = "Theatre"
|
||||
sound_env = LARGE_SOFTFLOOR
|
||||
|
||||
/area/crew_quarters/visitor_lodging
|
||||
name = "\improper Visitor Lodging"
|
||||
@@ -1347,6 +1367,7 @@ area/space/atmosalert()
|
||||
/area/library
|
||||
name = "\improper Library"
|
||||
icon_state = "library"
|
||||
sound_env = LARGE_SOFTFLOOR
|
||||
|
||||
/area/library_conference_room
|
||||
name = "\improper Library Conference Room"
|
||||
@@ -1356,6 +1377,7 @@ area/space/atmosalert()
|
||||
name = "\improper Chapel"
|
||||
icon_state = "chapel"
|
||||
ambience = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg')
|
||||
sound_env = LARGE_ENCLOSED
|
||||
|
||||
/area/chapel/office
|
||||
name = "\improper Chapel Office"
|
||||
@@ -1386,6 +1408,7 @@ area/space/atmosalert()
|
||||
name = "\improper Holodeck"
|
||||
icon_state = "Holodeck"
|
||||
lighting_use_dynamic = 0
|
||||
sound_env = LARGE_ENCLOSED
|
||||
|
||||
/area/holodeck/alphadeck
|
||||
name = "\improper Holodeck Alpha"
|
||||
@@ -1395,21 +1418,27 @@ area/space/atmosalert()
|
||||
|
||||
/area/holodeck/source_emptycourt
|
||||
name = "\improper Holodeck - Empty Court"
|
||||
sound_env = ARENA
|
||||
|
||||
/area/holodeck/source_boxingcourt
|
||||
name = "\improper Holodeck - Boxing Court"
|
||||
sound_env = ARENA
|
||||
|
||||
/area/holodeck/source_basketball
|
||||
name = "\improper Holodeck - Basketball Court"
|
||||
sound_env = ARENA
|
||||
|
||||
/area/holodeck/source_thunderdomecourt
|
||||
name = "\improper Holodeck - Thunderdome Court"
|
||||
sound_env = ARENA
|
||||
|
||||
/area/holodeck/source_courtroom
|
||||
name = "\improper Holodeck - Courtroom"
|
||||
sound_env = AUDITORIUM
|
||||
|
||||
/area/holodeck/source_beach
|
||||
name = "\improper Holodeck - Beach"
|
||||
sound_env = PLAIN
|
||||
|
||||
/area/holodeck/source_burntest
|
||||
name = "\improper Holodeck - Atmospheric Burn Test"
|
||||
@@ -1419,22 +1448,28 @@ area/space/atmosalert()
|
||||
|
||||
/area/holodeck/source_meetinghall
|
||||
name = "\improper Holodeck - Meeting Hall"
|
||||
sound_env = AUDITORIUM
|
||||
|
||||
/area/holodeck/source_theatre
|
||||
name = "\improper Holodeck - Theatre"
|
||||
sound_env = CONCERT_HALL
|
||||
|
||||
/area/holodeck/source_picnicarea
|
||||
name = "\improper Holodeck - Picnic Area"
|
||||
sound_env = PLAIN
|
||||
|
||||
/area/holodeck/source_snowfield
|
||||
name = "\improper Holodeck - Snow Field"
|
||||
sound_env = FOREST
|
||||
|
||||
/area/holodeck/source_desert
|
||||
name = "\improper Holodeck - Desert"
|
||||
sound_env = PLAIN
|
||||
|
||||
/area/holodeck/source_space
|
||||
name = "\improper Holodeck - Space"
|
||||
has_gravity = 0
|
||||
sound_env = SPACE
|
||||
|
||||
//Engineering
|
||||
|
||||
@@ -1446,26 +1481,32 @@ area/space/atmosalert()
|
||||
/area/engineering/atmos
|
||||
name = "\improper Atmospherics"
|
||||
icon_state = "atmos"
|
||||
sound_env = LARGE_ENCLOSED
|
||||
|
||||
/area/engineering/atmos/monitoring
|
||||
name = "\improper Atmospherics Monitoring Room"
|
||||
icon_state = "atmos_monitoring"
|
||||
sound_env = STANDARD_STATION
|
||||
|
||||
/area/engineering/atmos/storage
|
||||
name = "\improper Atmospherics Storage"
|
||||
icon_state = "atmos_storage"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/engineering/drone_fabrication
|
||||
name = "\improper Engineering Drone Fabrication"
|
||||
icon_state = "drone_fab"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/engineering/engine_smes
|
||||
name = "\improper Engineering SMES"
|
||||
icon_state = "engine_smes"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/engineering/engine_room
|
||||
name = "\improper Engine Room"
|
||||
icon_state = "engine"
|
||||
sound_env = LARGE_ENCLOSED
|
||||
|
||||
/area/engineering/engine_airlock
|
||||
name = "\improper Engine Room Airlock"
|
||||
@@ -1494,6 +1535,7 @@ area/space/atmosalert()
|
||||
/area/engineering/break_room
|
||||
name = "\improper Engineering Break Room"
|
||||
icon_state = "engineering_break"
|
||||
sound_env = MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/engineering/engine_eva
|
||||
name = "\improper Engine EVA"
|
||||
@@ -1543,22 +1585,27 @@ area/space/atmosalert()
|
||||
/area/maintenance/auxsolarport
|
||||
name = "Solar Maintenance - Fore Port"
|
||||
icon_state = "SolarcontrolP"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/maintenance/starboardsolar
|
||||
name = "Solar Maintenance - Aft Starboard"
|
||||
icon_state = "SolarcontrolS"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/maintenance/portsolar
|
||||
name = "Solar Maintenance - Aft Port"
|
||||
icon_state = "SolarcontrolP"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/maintenance/auxsolarstarboard
|
||||
name = "Solar Maintenance - Fore Starboard"
|
||||
icon_state = "SolarcontrolS"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/maintenance/foresolar
|
||||
name = "Solar Maintenance - Fore"
|
||||
icon_state = "SolarcontrolA"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/assembly/chargebay
|
||||
name = "\improper Mech Bay"
|
||||
@@ -1816,6 +1863,7 @@ area/space/atmosalert()
|
||||
/area/security/detectives_office
|
||||
name = "\improper Security - Forensic Office"
|
||||
icon_state = "detective"
|
||||
sound_env = MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/security/range
|
||||
name = "\improper Security - Firing Range"
|
||||
@@ -1914,6 +1962,7 @@ area/space/atmosalert()
|
||||
/area/quartermaster/storage
|
||||
name = "\improper Cargo Bay"
|
||||
icon_state = "quartstorage"
|
||||
sound_env = LARGE_ENCLOSED
|
||||
|
||||
/area/quartermaster/foyer
|
||||
name = "\improper Cargo Bay Foyer"
|
||||
@@ -2296,10 +2345,12 @@ area/space/atmosalert()
|
||||
name = "AI Upload Access"
|
||||
icon_state = "ai_foyer"
|
||||
ambience = list('sound/ambience/ambimalf.ogg')
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/turret_protected/ai_server_room
|
||||
name = "AI Server Room"
|
||||
name = "Messaging Server Room"
|
||||
icon_state = "ai_server"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/turret_protected/ai
|
||||
name = "\improper AI Chamber"
|
||||
@@ -2309,6 +2360,7 @@ area/space/atmosalert()
|
||||
/area/turret_protected/ai_cyborg_station
|
||||
name = "\improper Cyborg Station"
|
||||
icon_state = "ai_cyborg"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/turret_protected/aisat
|
||||
name = "\improper AI Satellite"
|
||||
|
||||
@@ -14,13 +14,17 @@
|
||||
all_areas += src
|
||||
|
||||
if(!requires_power)
|
||||
power_light = 0 //rastaf0
|
||||
power_equip = 0 //rastaf0
|
||||
power_environ = 0 //rastaf0
|
||||
power_light = 0
|
||||
power_equip = 0
|
||||
power_environ = 0
|
||||
|
||||
..()
|
||||
|
||||
// spawn(15)
|
||||
/area/proc/initialize()
|
||||
if(!requires_power || !apc)
|
||||
power_light = 0
|
||||
power_equip = 0
|
||||
power_environ = 0
|
||||
power_change() // all machines set to current power level, also updates lighting icon
|
||||
|
||||
/area/proc/get_contents()
|
||||
@@ -63,7 +67,7 @@
|
||||
for(var/obj/machinery/door/firedoor/E in all_doors)
|
||||
if(!E.blocked)
|
||||
if(E.operating)
|
||||
E.nextstate = CLOSED
|
||||
E.nextstate = FIREDOOR_CLOSED
|
||||
else if(!E.density)
|
||||
spawn(0)
|
||||
E.close()
|
||||
@@ -74,7 +78,7 @@
|
||||
for(var/obj/machinery/door/firedoor/E in all_doors)
|
||||
if(!E.blocked)
|
||||
if(E.operating)
|
||||
E.nextstate = OPEN
|
||||
E.nextstate = FIREDOOR_OPEN
|
||||
else if(E.density)
|
||||
spawn(0)
|
||||
E.open()
|
||||
@@ -88,7 +92,7 @@
|
||||
for(var/obj/machinery/door/firedoor/D in all_doors)
|
||||
if(!D.blocked)
|
||||
if(D.operating)
|
||||
D.nextstate = CLOSED
|
||||
D.nextstate = FIREDOOR_CLOSED
|
||||
else if(!D.density)
|
||||
spawn()
|
||||
D.close()
|
||||
@@ -101,7 +105,7 @@
|
||||
for(var/obj/machinery/door/firedoor/D in all_doors)
|
||||
if(!D.blocked)
|
||||
if(D.operating)
|
||||
D.nextstate = OPEN
|
||||
D.nextstate = FIREDOOR_OPEN
|
||||
else if(D.density)
|
||||
spawn(0)
|
||||
D.open()
|
||||
@@ -133,7 +137,7 @@
|
||||
for(var/obj/machinery/door/firedoor/D in src)
|
||||
if(!D.blocked)
|
||||
if(D.operating)
|
||||
D.nextstate = OPEN
|
||||
D.nextstate = FIREDOOR_OPEN
|
||||
else if(D.density)
|
||||
spawn(0)
|
||||
D.open()
|
||||
@@ -262,8 +266,8 @@ var/list/mob/living/forced_ambiance_list = new
|
||||
|
||||
for(var/mob/M in A)
|
||||
if(has_gravity)
|
||||
thunk(M)
|
||||
M.update_floating( M.Check_Dense_Object() )
|
||||
thunk(M)
|
||||
M.update_floating( M.Check_Dense_Object() )
|
||||
|
||||
/area/proc/thunk(mob)
|
||||
if(istype(get_turf(mob), /turf/space)) // Can't fall onto nothing.
|
||||
@@ -271,7 +275,7 @@ var/list/mob/living/forced_ambiance_list = new
|
||||
|
||||
if(istype(mob,/mob/living/carbon/human/))
|
||||
var/mob/living/carbon/human/H = mob
|
||||
if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.flags & NOSLIP))
|
||||
if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP))
|
||||
return
|
||||
|
||||
if(H.m_intent == "run")
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/area/mine
|
||||
icon_state = "mining"
|
||||
music = 'sound/ambience/song_game.ogg'
|
||||
sound_env = 5 //stoneroom
|
||||
sound_env = ASTEROID
|
||||
|
||||
/area/mine/explored
|
||||
name = "Mine"
|
||||
|
||||
@@ -24,7 +24,7 @@ proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor , va
|
||||
if(!wall)
|
||||
wall = pick(/turf/simulated/wall/r_wall,/turf/simulated/wall,/obj/effect/alien/resin)
|
||||
if(!floor)
|
||||
floor = pick(/turf/simulated/floor,/turf/simulated/floor/engine)
|
||||
floor = pick(/turf/simulated/floor,/turf/simulated/floor/tiled,/turf/simulated/floor/reinforced)
|
||||
|
||||
for(var/x = 0,x<x_size,x++)
|
||||
for(var/y = 0,y<y_size,y++)
|
||||
@@ -76,9 +76,9 @@ proc/admin_spawn_room_at_pos()
|
||||
wall=/obj/effect/alien/resin
|
||||
switch(alert("Floor type",null,"Regular floor","Reinforced floor"))
|
||||
if("Regular floor")
|
||||
floor=/turf/simulated/floor
|
||||
floor=/turf/simulated/floor/tiled
|
||||
if("Reinforced floor")
|
||||
floor=/turf/simulated/floor/engine
|
||||
floor=/turf/simulated/floor/reinforced
|
||||
if(x && y && z && wall && floor && x_len && y_len)
|
||||
spawn_room(locate(x,y,z),x_len,y_len,wall,floor,clean)
|
||||
return
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
else
|
||||
return null
|
||||
|
||||
//return flags that should be added to the viewer's sight var.
|
||||
//return flags that should be added to the viewer's sight var.
|
||||
//Otherwise return a negative number to indicate that the view should be cancelled.
|
||||
/atom/proc/check_eye(user as mob)
|
||||
if (istype(user, /mob/living/silicon/ai)) // WHYYYY
|
||||
@@ -66,6 +66,8 @@
|
||||
/atom/proc/CheckExit()
|
||||
return 1
|
||||
|
||||
// If you want to use this, the atom must have the PROXMOVE flag, and the moving
|
||||
// atom must also have the PROXMOVE flag currently to help with lag. ~ ComicIronic
|
||||
/atom/proc/HasProximity(atom/movable/AM as mob|obj)
|
||||
return
|
||||
|
||||
@@ -213,7 +215,7 @@ its easier to just keep the beam vertical.
|
||||
|
||||
/atom/proc/ex_act()
|
||||
return
|
||||
|
||||
|
||||
/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
|
||||
return -1
|
||||
|
||||
@@ -411,7 +413,6 @@ its easier to just keep the beam vertical.
|
||||
/atom/proc/clean_blood()
|
||||
if(!simulated)
|
||||
return
|
||||
src.color = initial(src.color) //paint
|
||||
src.germ_level = 0
|
||||
if(istype(blood_DNA, /list))
|
||||
del(blood_DNA)
|
||||
|
||||
@@ -21,9 +21,14 @@
|
||||
if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING)
|
||||
initialize()
|
||||
|
||||
/proc/generate_debug_runtime() // Guaranteed to runtime and print a stack trace to the runtime log
|
||||
var/t = 0 // BYOND won't let us do var/t = 1/0 directly, but it's fine with this.
|
||||
t = 1 / t
|
||||
|
||||
/atom/movable/Del()
|
||||
if(isnull(gcDestroyed) && loc)
|
||||
testing("GC: -- [type] was deleted via del() rather than qdel() --")
|
||||
generate_debug_runtime() // stick a stack trace in the runtime logs
|
||||
// else if(isnull(gcDestroyed))
|
||||
// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel()
|
||||
// else
|
||||
@@ -34,6 +39,7 @@
|
||||
. = ..()
|
||||
if(reagents)
|
||||
qdel(reagents)
|
||||
reagents = null
|
||||
for(var/atom/movable/AM in contents)
|
||||
qdel(AM)
|
||||
loc = null
|
||||
@@ -164,7 +170,7 @@
|
||||
a = get_area(src.loc)
|
||||
else
|
||||
var/error = dist_y/2 - dist_x
|
||||
while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
|
||||
while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
|
||||
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
|
||||
if(error < 0)
|
||||
var/atom/step = get_step(src, dx)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Returns the lowest turf available on a given Z-level, defaults to space.
|
||||
var/global/list/base_turf_by_z = list(
|
||||
"5" = /turf/simulated/floor/plating/airless/asteroid // Moonbase.
|
||||
"5" = /turf/simulated/floor/asteroid // Moonbase.
|
||||
)
|
||||
|
||||
proc/get_base_turf(var/z)
|
||||
|
||||
@@ -218,7 +218,8 @@
|
||||
name = "DNA Modifier Access Console"
|
||||
desc = "Scand DNA."
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "scanner"
|
||||
icon_keyboard = "med_key"
|
||||
icon_screen = "dna"
|
||||
density = 1
|
||||
circuit = /obj/item/weapon/circuitboard/scan_consolenew
|
||||
var/selected_ui_block = 1.0
|
||||
@@ -270,21 +271,9 @@
|
||||
return
|
||||
|
||||
/obj/machinery/computer/scan_consolenew/blob_act()
|
||||
|
||||
if(prob(75))
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/computer/scan_consolenew/power_change()
|
||||
..()
|
||||
if(stat & BROKEN)
|
||||
icon_state = "broken"
|
||||
else
|
||||
if (stat & NOPOWER)
|
||||
spawn(rand(0, 15))
|
||||
src.icon_state = "c_unpowered"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/machinery/computer/scan_consolenew/New()
|
||||
..()
|
||||
for(var/i=0;i<3;i++)
|
||||
|
||||
@@ -157,6 +157,7 @@
|
||||
|
||||
|
||||
attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||
src.visible_message("<span class='danger'>The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||
var/damage = 0
|
||||
|
||||
@@ -2,7 +2,15 @@
|
||||
antag_tag = MODE_CHANGELING
|
||||
name = "changeling"
|
||||
round_description = "There are alien changelings on the station. Do not let the changelings succeed!"
|
||||
extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, however, is that this something is someone. An unknown alien specimen has incorporated itself into the crew of the NSS Exodus. Its unique biology allows it to manipulate its own or anyone else's DNA. With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, its existence is a threat to not only your personal safety but the lives of everyone on board. No one knows where it came from. No one knows who it is or what it wants. One thing is for certain though... there is never just one of them. Good luck."
|
||||
extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. \
|
||||
Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet \
|
||||
something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, \
|
||||
however, is that this something is someone. An unknown alien specimen has incorporated itself into \
|
||||
the crew of the station. Its unique biology allows it to manipulate its own or anyone else's DNA. \
|
||||
With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, \
|
||||
its existence is a threat to not only your personal safety but the lives of everyone on board. \
|
||||
No one knows where it came from. No one knows who it is or what it wants. One thing is for \
|
||||
certain though... there is never just one of them. Good luck."
|
||||
config_tag = "changeling"
|
||||
required_players = 2
|
||||
required_players_secret = 10
|
||||
|
||||
@@ -35,8 +35,7 @@
|
||||
icon_state = "culthood"
|
||||
desc = "A hood worn by the followers of Nar-Sie."
|
||||
flags_inv = HIDEFACE
|
||||
flags = HEADCOVERSEYES
|
||||
body_parts_covered = HEAD|EYES
|
||||
body_parts_covered = HEAD
|
||||
armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0)
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
@@ -49,8 +48,7 @@
|
||||
name = "magus helm"
|
||||
icon_state = "magus"
|
||||
desc = "A helm worn by the followers of Nar-Sie."
|
||||
flags_inv = HIDEFACE
|
||||
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
|
||||
flags_inv = HIDEFACE | BLOCKHAIR
|
||||
body_parts_covered = HEAD|FACE|EYES
|
||||
|
||||
/obj/item/clothing/head/culthood/alt
|
||||
|
||||
@@ -127,17 +127,12 @@
|
||||
T.ChangeTurf(/turf/simulated/wall/cult)
|
||||
..()
|
||||
|
||||
/obj/structure/stool/cultify()
|
||||
var/obj/structure/bed/chair/wood/wings/I = new(loc)
|
||||
I.dir = dir
|
||||
..()
|
||||
|
||||
/obj/structure/table/cultify()
|
||||
// Make it a wood-reinforced wooden table.
|
||||
// There are cult materials available, but it'd make the table non-deconstructable with how holotables work.
|
||||
// Could possibly use a new material var for holographic-ness?
|
||||
material = name_to_material["wood"]
|
||||
reinforced = name_to_material["wood"]
|
||||
material = get_material_by_name("wood")
|
||||
reinforced = get_material_by_name("wood")
|
||||
update_desc()
|
||||
update_connections(1)
|
||||
update_icon()
|
||||
|
||||
@@ -3,11 +3,9 @@
|
||||
return
|
||||
|
||||
/turf/simulated/floor/cultify()
|
||||
//todo: flooring datum cultify check
|
||||
cultify_floor()
|
||||
|
||||
/turf/simulated/floor/carpet/cultify()
|
||||
return
|
||||
|
||||
/turf/simulated/shuttle/floor/cultify()
|
||||
cultify_floor()
|
||||
|
||||
@@ -39,8 +37,6 @@
|
||||
if((icon_state != "cult")&&(icon_state != "cult-narsie"))
|
||||
name = "engraved floor"
|
||||
icon_state = "cult"
|
||||
turf_animation('icons/effects/effects.dmi',"cultfloor",0,0,MOB_LAYER-1)
|
||||
|
||||
/turf/proc/cultify_wall()
|
||||
ChangeTurf(/turf/unsimulated/wall/cult)
|
||||
turf_animation('icons/effects/effects.dmi',"cultwall",0,0,MOB_LAYER-1)
|
||||
|
||||
@@ -144,6 +144,7 @@ var/global/list/narsie_list = list()
|
||||
if(!(istype(T, /turf/simulated/wall/cult)||istype(T, /turf/space)))
|
||||
if(T.icon_state != "cult-narsie")
|
||||
T.desc = "something that goes beyond your understanding went this way"
|
||||
T.icon = 'icons/turf/flooring/cult.dmi'
|
||||
T.icon_state = "cult-narsie"
|
||||
T.set_light(1)
|
||||
|
||||
|
||||
@@ -339,7 +339,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
|
||||
|
||||
attack(mob/living/M as mob, mob/living/user as mob)
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has had the [name] used on him by [user.name] ([user.ckey])</font>")
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has had the [name] used on them by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used [name] on [M.name] ([M.ckey])</font>")
|
||||
msg_admin_attack("[user.name] ([user.ckey]) used [name] on [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
|
||||
@@ -5,6 +5,14 @@ var/list/sacrificed = list()
|
||||
|
||||
/obj/effect/rune
|
||||
|
||||
/*
|
||||
* Use as a general guideline for this and related files:
|
||||
* * <span class='warning'>...</span> - when something non-trivial or an error happens, so something similar to "Sparks come out of the machine!"
|
||||
* * <span class='danger'>...</span> - when something that is fit for 'warning' happens but there is some damage or pain as well.
|
||||
* * <span class='cult'>...</span> - when there is a private message to the cultists. This guideline is very arbitrary but there has to be some consistency!
|
||||
*/
|
||||
|
||||
|
||||
/////////////////////////////////////////FIRST RUNE
|
||||
proc
|
||||
teleport(var/key)
|
||||
@@ -21,7 +29,7 @@ var/list/sacrificed = list()
|
||||
allrunesloc.len = index
|
||||
allrunesloc[index] = R.loc
|
||||
if(index >= 5)
|
||||
user << "<span class='warning'>You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric</span>"
|
||||
user << "<span class='danger'>You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric.</span>"
|
||||
if (istype(user, /mob/living))
|
||||
user.take_overall_damage(5, 0)
|
||||
qdel(src)
|
||||
@@ -30,9 +38,9 @@ var/list/sacrificed = list()
|
||||
user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting
|
||||
else
|
||||
user.whisper("Sas[pick("'","`")]so c'arta forbici!")
|
||||
user.visible_message("<span class='warning'>\The [user] disappears in a flash of red light!</span>", \
|
||||
"<span class='warning'>You feel as your body gets dragged through the dimension of Nar-Sie!</span>", \
|
||||
"<span class='warning'>You hear a sickening crunch and sloshing of viscera.</span>")
|
||||
user.visible_message("<span class='danger'>[user] disappears in a flash of red light!</span>", \
|
||||
"<span class='danger'>You feel as your body gets dragged through the dimension of Nar-Sie!</span>", \
|
||||
"<span class='danger'>You hear a sickening crunch and sloshing of viscera.</span>")
|
||||
user.loc = allrunesloc[rand(1,index)]
|
||||
return
|
||||
if(istype(src,/obj/effect/rune))
|
||||
@@ -58,7 +66,7 @@ var/list/sacrificed = list()
|
||||
IP = R
|
||||
runecount++
|
||||
if(runecount >= 2)
|
||||
user << "<span class='warning'>You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric</span>"
|
||||
user << "<span class='danger'>You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric.</span>"
|
||||
if (istype(user, /mob/living))
|
||||
user.take_overall_damage(5, 0)
|
||||
qdel(src)
|
||||
@@ -134,11 +142,11 @@ var/list/sacrificed = list()
|
||||
admin_attack_log(attacker, target, "Used a convert rune", "Was subjected to a convert rune", "used a convert rune on")
|
||||
switch(target.getFireLoss())
|
||||
if(0 to 25)
|
||||
target << "<span class='danger'>Your blood boils as you force yourself to resist the corruption invading every corner of your mind.</span>"
|
||||
target << "<span class='cult'>Your blood boils as you force yourself to resist the corruption invading every corner of your mind.</span>"
|
||||
if(25 to 45)
|
||||
target << "<span class='danger'>Your blood boils and your body burns as the corruption further forces itself into your body and mind.</span>"
|
||||
target << "<span class='cult'>Your blood boils and your body burns as the corruption further forces itself into your body and mind.</span>"
|
||||
if(45 to 75)
|
||||
target << "<span class='danger'>You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.</span>"
|
||||
target << "<span class='cult'>You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.</span>"
|
||||
target.apply_effect(rand(1,10), STUTTER)
|
||||
if(75 to 100)
|
||||
target << "<span class='cult'>Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.</span>"
|
||||
@@ -157,7 +165,7 @@ var/list/sacrificed = list()
|
||||
if (target.species && (target.species.flags & NO_PAIN))
|
||||
target.visible_message("<span class='warning'>The markings below [target] glow a bloody red.</span>")
|
||||
else
|
||||
target.visible_message("<span class='warning'>\The [target] writhes in pain as the markings below \him glow a bloody red.</span>", "<span class='danger'>AAAAAAHHHH!</span>", "<span class='warning'>You hear an anguished scream.</span>")
|
||||
target.visible_message("<span class='warning'>[target] writhes in pain as the markings below \him glow a bloody red.</span>", "<span class='danger'>AAAAAAHHHH!</span>", "<span class='warning'>You hear an anguished scream.</span>")
|
||||
|
||||
if(!waiting_for_input[target]) //so we don't spam them with dialogs if they hesitate
|
||||
waiting_for_input[target] = 1
|
||||
@@ -229,15 +237,15 @@ var/list/sacrificed = list()
|
||||
if(!drain)
|
||||
return fizzle()
|
||||
usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")
|
||||
usr.visible_message("<span class='warning'>Blood flows from the rune into [usr]!</span>", \
|
||||
"<span class='warning'>The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.</span>", \
|
||||
usr.visible_message("<span class='danger'>Blood flows from the rune into [usr]!</span>", \
|
||||
"<span class='danger'>The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.</span>", \
|
||||
"<span class='warning'>You hear a liquid flowing.</span>")
|
||||
var/mob/living/user = usr
|
||||
if(user.bhunger)
|
||||
user.bhunger = max(user.bhunger-2*drain,0)
|
||||
if(drain>=50)
|
||||
user.visible_message("<span class='warning'>\The [user]'s eyes give off eerie red glow!</span>", \
|
||||
"<span class='warning'>...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.</span>", \
|
||||
user.visible_message("<span class='danger'>[user]'s eyes give off eerie red glow!</span>", \
|
||||
"<span class='danger'>...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.</span>", \
|
||||
"<span class='warning'>You hear a heartbeat.</span>")
|
||||
user.bhunger += drain
|
||||
src = user
|
||||
@@ -264,7 +272,7 @@ var/list/sacrificed = list()
|
||||
if(usr.loc==src.loc)
|
||||
if(usr.seer==1)
|
||||
usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.")
|
||||
usr << "<span class='warning'>The world beyond fades from your vision.</span>"
|
||||
usr << "<span class='danger'>The world beyond fades from your vision.</span>"
|
||||
usr.see_invisible = SEE_INVISIBLE_LIVING
|
||||
usr.seer = 0
|
||||
else if(usr.see_invisible!=SEE_INVISIBLE_LIVING)
|
||||
@@ -336,12 +344,12 @@ var/list/sacrificed = list()
|
||||
corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed)
|
||||
//This means, should that player leave the body, the original may re-enter
|
||||
usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
|
||||
corpse_to_raise.visible_message("<span class='warning'>\The [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.</span>", \
|
||||
corpse_to_raise.visible_message("<span class='warning'>[corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.</span>", \
|
||||
"<span class='warning'>Life... I'm alive again...</span>", \
|
||||
"<span class='warning'>You hear a faint, slightly familiar whisper.</span>")
|
||||
body_to_sacrifice.visible_message("<span class='warning'>\The [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!</span>", \
|
||||
"<span class='warning'>You feel as your blood boils, tearing you apart.</span>", \
|
||||
"<span class='warning'>You hear a thousand voices, all crying in pain.</span>")
|
||||
body_to_sacrifice.visible_message("<span class='danger'>[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from \his remains!</span>", \
|
||||
"<span class='danger'>You feel as your blood boils, tearing you apart.</span>", \
|
||||
"<span class='danger'>You hear a thousand voices, all crying in pain.</span>")
|
||||
body_to_sacrifice.gib()
|
||||
|
||||
// if(ticker.mode.name == "cult")
|
||||
@@ -349,8 +357,8 @@ var/list/sacrificed = list()
|
||||
// else
|
||||
// ticker.mode.cult |= corpse_to_raise.mind
|
||||
|
||||
corpse_to_raise << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
||||
corpse_to_raise << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
||||
corpse_to_raise << "<span class='cult'>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</span>"
|
||||
corpse_to_raise << "<span class='cult'>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -391,7 +399,7 @@ var/list/sacrificed = list()
|
||||
if(usr.loc==src.loc)
|
||||
var/mob/living/carbon/human/L = usr
|
||||
usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!")
|
||||
usr.visible_message("<span class='warning'>\The [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.</span>", \
|
||||
usr.visible_message("<span class='warning'>[usr]'s eyes glow blue as \he freezes in place, absolutely motionless.</span>", \
|
||||
"<span class='warning'>The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...</span>", \
|
||||
"<span class='warning'>You hear only complete silence for a moment.</span>")
|
||||
announce_ghost_joinleave(usr.ghostize(1), 1, "You feel that they had to use some [pick("dark", "black", "blood", "forgotten", "forbidden")] magic to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place!")
|
||||
@@ -461,8 +469,8 @@ var/list/sacrificed = list()
|
||||
user.take_organ_damage(1, 0)
|
||||
sleep(30)
|
||||
if(D)
|
||||
D.visible_message("<span class='warning'>\The [D] slowly dissipates into dust and bones.</span>", \
|
||||
"<span class='warning'>You feel pain, as bonds formed between your soul and this homunculus break.</span>", \
|
||||
D.visible_message("<span class='danger'>[D] slowly dissipates into dust and bones.</span>", \
|
||||
"<span class='danger'>You feel pain, as bonds formed between your soul and this homunculus break.</span>", \
|
||||
"<span class='warning'>You hear faint rustle.</span>")
|
||||
D.dust()
|
||||
return
|
||||
@@ -560,8 +568,8 @@ var/list/sacrificed = list()
|
||||
user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!")
|
||||
user.take_overall_damage(200, 0)
|
||||
runedec+=10
|
||||
user.visible_message("<span class='warning'>\The [user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.</span>", \
|
||||
"<span class='warning'>In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.</span>", \
|
||||
user.visible_message("<span class='danger'>\The [user] keels over dead, \his blood glowing blue as it escapes \his body and dissipates into thin air.</span>", \
|
||||
"<span class='danger'>In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.</span>", \
|
||||
"<span class='warning'>You hear faint rustle.</span>")
|
||||
for(,user.stat==2)
|
||||
sleep(600)
|
||||
@@ -595,7 +603,7 @@ var/list/sacrificed = list()
|
||||
log_and_message_admins("used a communicate rune to say '[input]'")
|
||||
for(var/datum/mind/H in cult.current_antagonists)
|
||||
if (H.current)
|
||||
H.current << "<span class='danger'>[input]</span>"
|
||||
H.current << "<span class='cult'>[input]</span>"
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
@@ -639,17 +647,17 @@ var/list/sacrificed = list()
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts this sacrifice, your objective is now complete.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice, your objective is now complete.</span>"
|
||||
else
|
||||
usr << "<span class='warning'>Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.</span>"
|
||||
else
|
||||
if(cultsinrange.len >= 3)
|
||||
if(H.stat !=2)
|
||||
if(prob(80) || worth)
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice.</span>"
|
||||
cult.grant_runeword(usr)
|
||||
else
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, this soul was not enough to gain His favor.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
@@ -657,10 +665,10 @@ var/list/sacrificed = list()
|
||||
H.gib()
|
||||
else
|
||||
if(prob(40) || worth)
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this [worth ? "exotic " : ""]sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice.</span>"
|
||||
cult.grant_runeword(usr)
|
||||
else
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, a mere dead body is not enough to satisfy Him.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
@@ -672,10 +680,10 @@ var/list/sacrificed = list()
|
||||
else
|
||||
if(prob(40))
|
||||
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
cult.grant_runeword(usr)
|
||||
else
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, a mere dead body is not enough to satisfy Him.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
@@ -685,10 +693,10 @@ var/list/sacrificed = list()
|
||||
if(cultsinrange.len >= 3)
|
||||
if(H.stat !=2)
|
||||
if(prob(80))
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
cult.grant_runeword(usr)
|
||||
else
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, this soul was not enough to gain His favor.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
@@ -696,10 +704,10 @@ var/list/sacrificed = list()
|
||||
H.gib()
|
||||
else
|
||||
if(prob(40))
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
cult.grant_runeword(usr)
|
||||
else
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, a mere dead body is not enough to satisfy Him.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
@@ -710,10 +718,10 @@ var/list/sacrificed = list()
|
||||
usr << "<span class='warning'>The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.</span>"
|
||||
else
|
||||
if(prob(40))
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
cult.grant_runeword(usr)
|
||||
else
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='cult'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, a mere dead body is not enough to satisfy Him.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
@@ -772,9 +780,9 @@ var/list/sacrificed = list()
|
||||
var/mob/living/user = usr
|
||||
user.take_organ_damage(2, 0)
|
||||
if(src.density)
|
||||
usr << "<span class='warning'>Your blood flows into the rune, and you feel that the very space over the rune thickens.</span>"
|
||||
usr << "<span class='danger'>Your blood flows into the rune, and you feel that the very space over the rune thickens.</span>"
|
||||
else
|
||||
usr << "<span class='warning'>Your blood flows into the rune, and you feel as the rune releases its grasp on space.</span>"
|
||||
usr << "<span class='danger'>Your blood flows into the rune, and you feel as the rune releases its grasp on space.</span>"
|
||||
return
|
||||
|
||||
/////////////////////////////////////////EIGHTTEENTH RUNE
|
||||
@@ -843,7 +851,7 @@ var/list/sacrificed = list()
|
||||
if (cultist == user) //just to be sure.
|
||||
return
|
||||
if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
|
||||
user << "<span class='warning'>You cannot summon \the [cultist], for his shackles of blood are strong.</span>"
|
||||
user << "<span class='warning'>You cannot summon \the [cultist], for \his shackles of blood are strong.</span>"
|
||||
return fizzle()
|
||||
cultist.loc = src.loc
|
||||
cultist.lying = 1
|
||||
@@ -923,7 +931,7 @@ var/list/sacrificed = list()
|
||||
C.disabilities |= NEARSIGHTED
|
||||
if(prob(10))
|
||||
C.sdisabilities |= BLIND
|
||||
C.show_message("<span class='warning'>Suddenly you see red flash that blinds you.</span>", 3)
|
||||
C.show_message("<span class='warning'>Suddenly you see a red flash that blinds you.</span>", 3)
|
||||
affected += C
|
||||
if(affected.len)
|
||||
usr.say("Sti[pick("'","`")] kaliesin!")
|
||||
@@ -973,7 +981,7 @@ var/list/sacrificed = list()
|
||||
if(N)
|
||||
continue
|
||||
M.take_overall_damage(51,51)
|
||||
M << "<span class='warning'>Your blood boils!</span>"
|
||||
M << "<span class='danger'>Your blood boils!</span>"
|
||||
victims += M
|
||||
if(prob(5))
|
||||
spawn(5)
|
||||
@@ -1005,16 +1013,16 @@ var/list/sacrificed = list()
|
||||
for(var/mob/living/M in orange(2,R))
|
||||
M.take_overall_damage(0,15)
|
||||
if (R.invisibility>M.see_invisible)
|
||||
M << "<span class='warning'>Aargh it burns!</span>"
|
||||
M << "<span class='danger'>Aargh it burns!</span>"
|
||||
else
|
||||
M << "<span class='warning'>Rune suddenly ignites, burning you!</span>"
|
||||
M << "<span class='danger'>Rune suddenly ignites, burning you!</span>"
|
||||
var/turf/T = get_turf(R)
|
||||
T.hotspot_expose(700,125)
|
||||
for(var/obj/effect/decal/cleanable/blood/B in world)
|
||||
if(B.blood_DNA == src.blood_DNA)
|
||||
for(var/mob/living/M in orange(1,B))
|
||||
M.take_overall_damage(0,5)
|
||||
M << "<span class='warning'>Blood suddenly ignites, burning you!</span>"
|
||||
M << "<span class='danger'>Blood suddenly ignites, burning you!</span>"
|
||||
var/turf/T = get_turf(B)
|
||||
T.hotspot_expose(700,125)
|
||||
qdel(B)
|
||||
@@ -1033,13 +1041,13 @@ var/list/sacrificed = list()
|
||||
C.stuttering = 1
|
||||
C.Weaken(1)
|
||||
C.Stun(1)
|
||||
C.show_message("<span class='warning'>The rune explodes in a bright flash.</span>", 3)
|
||||
C.show_message("<span class='danger'>The rune explodes in a bright flash.</span>", 3)
|
||||
admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
|
||||
|
||||
else if(issilicon(L))
|
||||
var/mob/living/silicon/S = L
|
||||
S.Weaken(5)
|
||||
S.show_message("<span class='warning'>BZZZT... The rune has exploded in a bright flash.</span>", 3)
|
||||
S.show_message("<span class='danger'>BZZZT... The rune has exploded in a bright flash.</span>", 3)
|
||||
admin_attack_log(usr, S, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
|
||||
qdel(src)
|
||||
else ///When invoked as talisman, stun and mute the target mob.
|
||||
@@ -1047,10 +1055,10 @@ var/list/sacrificed = list()
|
||||
var/obj/item/weapon/nullrod/N = locate() in T
|
||||
if(N)
|
||||
for(var/mob/O in viewers(T, null))
|
||||
O.show_message("<span class='danger'>\The [usr] invokes a talisman at [T], but they are unaffected!</span>", 1)
|
||||
O.show_message(text("<span class='warning'><B>[] invokes a talisman at [], but they are unaffected!</B></span>", usr, T), 1)
|
||||
else
|
||||
for(var/mob/O in viewers(T, null))
|
||||
O.show_message("<span class='danger'>\The [usr] invokes a talisman at [T]</span>", 1)
|
||||
O.show_message(text("<span class='warning'><B>[] invokes a talisman at []</B></span>", usr, T), 1)
|
||||
|
||||
if(issilicon(T))
|
||||
T.Weaken(15)
|
||||
|
||||
@@ -167,7 +167,13 @@ var/global/list/additional_antag_types = list()
|
||||
return 1
|
||||
|
||||
var/datum/antagonist/main_antags = antag_templates[1]
|
||||
if(main_antags.candidates.len >= required_enemies)
|
||||
var/list/potential
|
||||
if(main_antags.flags & ANTAG_OVERRIDE_JOB)
|
||||
potential = main_antags.pending_antagonists
|
||||
else
|
||||
potential = main_antags.candidates
|
||||
|
||||
if(potential.len >= required_enemies)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -184,7 +190,7 @@ var/global/list/additional_antag_types = list()
|
||||
/datum/game_mode/proc/pre_setup()
|
||||
for(var/datum/antagonist/antag in antag_templates)
|
||||
antag.build_candidate_list() //compile a list of all eligible candidates
|
||||
|
||||
|
||||
//antag roles that replace jobs need to be assigned before the job controller hands out jobs.
|
||||
if(antag.flags & ANTAG_OVERRIDE_JOB)
|
||||
antag.attempt_spawn() //select antags to be spawned
|
||||
@@ -280,14 +286,13 @@ var/global/list/additional_antag_types = list()
|
||||
/datum/game_mode/proc/declare_completion()
|
||||
|
||||
var/is_antag_mode = (antag_templates && antag_templates.len)
|
||||
if(!config.objectives_disabled)
|
||||
check_victory()
|
||||
if(is_antag_mode)
|
||||
check_victory()
|
||||
if(is_antag_mode)
|
||||
sleep(10)
|
||||
for(var/datum/antagonist/antag in antag_templates)
|
||||
sleep(10)
|
||||
for(var/datum/antagonist/antag in antag_templates)
|
||||
sleep(10)
|
||||
antag.check_victory()
|
||||
antag.print_player_summary()
|
||||
antag.check_victory()
|
||||
antag.print_player_summary()
|
||||
|
||||
var/clients = 0
|
||||
var/surviving_humans = 0
|
||||
@@ -389,8 +394,8 @@ var/global/list/additional_antag_types = list()
|
||||
|
||||
if (special_role in disregard_roles)
|
||||
continue
|
||||
else if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \
|
||||
man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20))
|
||||
else if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED && prob(50) || \
|
||||
man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(20))
|
||||
suspects += man
|
||||
// Antags
|
||||
else if(special_role_data && prob(special_role_data.suspicion_chance))
|
||||
@@ -427,32 +432,26 @@ var/global/list/additional_antag_types = list()
|
||||
if(!antag_template)
|
||||
return candidates
|
||||
|
||||
var/roletext
|
||||
// Assemble a list of active players without jobbans.
|
||||
for(var/mob/new_player/player in player_list)
|
||||
if( player.client && player.ready )
|
||||
if(!(jobban_isbanned(player, "Syndicate") || jobban_isbanned(player, antag_template.bantype)))
|
||||
players += player
|
||||
|
||||
// Shuffle the players list so that it becomes ping-independent.
|
||||
players = shuffle(players)
|
||||
players += player
|
||||
|
||||
// Get a list of all the people who want to be the antagonist for this round
|
||||
for(var/mob/new_player/player in players)
|
||||
if(!role || (player.client.prefs.be_special & role))
|
||||
log_debug("[player.key] had [roletext] enabled, so we are drafting them.")
|
||||
log_debug("[player.key] had [antag_id] enabled, so we are drafting them.")
|
||||
candidates += player.mind
|
||||
players -= player
|
||||
|
||||
// If we don't have enough antags, draft people who voted for the round.
|
||||
if(candidates.len < required_enemies)
|
||||
for(var/key in round_voters)
|
||||
for(var/mob/new_player/player in players)
|
||||
if(player.ckey == key)
|
||||
log_debug("[player.key] voted for this round, so we are drafting them.")
|
||||
candidates += player.mind
|
||||
players -= player
|
||||
break
|
||||
for(var/mob/new_player/player in players)
|
||||
if(player.ckey in round_voters)
|
||||
log_debug("[player.key] voted for this round, so we are drafting them.")
|
||||
candidates += player.mind
|
||||
players -= player
|
||||
break
|
||||
|
||||
return candidates // Returns: The number of people who had the antagonist role set to yes, regardless of recomended_enemies, if that number is greater than required_enemies
|
||||
// required_enemies if the number of people with that role set to yes is less than recomended_enemies,
|
||||
@@ -485,12 +484,14 @@ var/global/list/additional_antag_types = list()
|
||||
if(antag)
|
||||
antag_templates |= antag
|
||||
|
||||
/*
|
||||
if(antag_templates && antag_templates.len)
|
||||
for(var/datum/antagonist/antag in antag_templates)
|
||||
if(antag.flags & (ANTAG_OVERRIDE_JOB|ANTAG_RANDSPAWN))
|
||||
continue
|
||||
antag_templates -= antag
|
||||
world << "<span class='danger'>[antag.role_text_plural] are invalid for additional roundtype antags!</span>"
|
||||
*/
|
||||
|
||||
newscaster_announcements = pick(newscaster_standard_feeds)
|
||||
|
||||
@@ -556,9 +557,9 @@ proc/get_nt_opposed()
|
||||
var/list/dudes = list()
|
||||
for(var/mob/living/carbon/human/man in player_list)
|
||||
if(man.client)
|
||||
if(man.client.prefs.nanotrasen_relation == "Opposed")
|
||||
if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED)
|
||||
dudes += man
|
||||
else if(man.client.prefs.nanotrasen_relation == "Skeptical" && prob(50))
|
||||
else if(man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(50))
|
||||
dudes += man
|
||||
if(dudes.len == 0) return null
|
||||
return pick(dudes)
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
|
||||
/datum/intercept_text/proc/get_suspect()
|
||||
var/list/dudes = list()
|
||||
for(var/mob/living/carbon/human/man in player_list) if(man.client && man.client.prefs.nanotrasen_relation == "Opposed")
|
||||
for(var/mob/living/carbon/human/man in player_list) if(man.client && man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED)
|
||||
dudes += man
|
||||
for(var/i = 0, i < max(player_list.len/10,2), i++)
|
||||
dudes += pick(player_list)
|
||||
|
||||
@@ -163,14 +163,13 @@
|
||||
|
||||
command_announcement.Announce(fulltext)
|
||||
|
||||
// Proc: get_unhacked_apcs()
|
||||
// Proc: get_all_apcs()
|
||||
// Parameters: None
|
||||
// Description: Returns a list of APCs that are not yet hacked.
|
||||
/proc/get_unhacked_apcs()
|
||||
// Description: Returns a list of all APCs
|
||||
/proc/get_all_apcs()
|
||||
var/list/H = list()
|
||||
for(var/obj/machinery/power/apc/A in machines)
|
||||
if(!A.hacker)
|
||||
H.Add(A)
|
||||
H.Add(A)
|
||||
return H
|
||||
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
/datum/game_mode/malfunction/verb/recall_shuttle()
|
||||
set name = "Recall Shuttle"
|
||||
set desc = "25 CPU - Sends termination signal to CentCom quantum relay aborting current shuttle call."
|
||||
set desc = "25 CPU - Sends termination signal to quantum relay aborting current shuttle call."
|
||||
set category = "Software"
|
||||
var/price = 25
|
||||
var/mob/living/silicon/ai/user = usr
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
// END RESEARCH DATUMS
|
||||
// BEGIN ABILITY VERBS
|
||||
|
||||
/datum/game_mode/malfunction/verb/basic_encryption_hack(obj/machinery/power/apc/A as obj in get_unhacked_apcs())
|
||||
/datum/game_mode/malfunction/verb/basic_encryption_hack(obj/machinery/power/apc/A as obj in get_all_apcs())
|
||||
set category = "Software"
|
||||
set name = "Basic Encryption Hack"
|
||||
set desc = "10 CPU - Basic encryption hack that allows you to overtake APCs on the station."
|
||||
@@ -86,7 +86,7 @@
|
||||
/datum/game_mode/malfunction/verb/advanced_encryption_hack()
|
||||
set category = "Software"
|
||||
set name = "Advanced Encrypthion Hack"
|
||||
set desc = "75 CPU - Attempts to bypass encryption on Central Command Quantum Relay, giving you ability to fake centcom messages. Has chance of failing."
|
||||
set desc = "75 CPU - Attempts to bypass encryption on the Command Quantum Relay, giving you ability to fake legitimate messages. Has chance of failing."
|
||||
var/price = 75
|
||||
var/mob/living/silicon/ai/user = usr
|
||||
|
||||
|
||||
@@ -1252,7 +1252,7 @@ datum
|
||||
proc/find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role], has defied us for the last time. Make an example of him, and bring us his severed head."
|
||||
explanation_text = "[target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role], has defied us for the last time. Make an example of [target.current.gender == MALE ? "him" : target.current.gender == FEMALE ? "her" : "them"], and bring us [target.current.gender == MALE ? "his" : target.current.gender == FEMALE ? "her" : "their"] severed head."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
@@ -1261,7 +1261,7 @@ datum
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [target.role_alt_title ? target.role_alt_title : (!role_type ? target.assigned_role : target.special_role)], has defied us for the last time. Make an example of him, and bring us his severed head."
|
||||
explanation_text = "[target.current.real_name], the [target.role_alt_title ? target.role_alt_title : (!role_type ? target.assigned_role : target.special_role)], has defied us for the last time. Make an example of [target.current.gender == MALE ? "him" : target.current.gender == FEMALE ? "her" : "them"], and bring us [target.current.gender == MALE ? "his" : target.current.gender == FEMALE ? "her" : "their"] severed head."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
@@ -1488,4 +1488,4 @@ datum/objective/silence
|
||||
#undef LENIENT
|
||||
#undef NORMAL
|
||||
#undef HARD
|
||||
#undef IMPOSSIBLE
|
||||
#undef IMPOSSIBLE
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
/datum/game_mode/ninja
|
||||
name = "ninja"
|
||||
round_description = "An agent of the Spider Clan is onboard the station!"
|
||||
extended_round_description = "What was that?! Was that a person or did your eyes just play tricks on you? You have no idea. That slim-suited, cryptic individual is an enigma to you and all of your knowledge. Their purpose is unknown. Their mission is unknown. How they arrived to this secure and isolated section of the galaxy, you don't know. What you do know is that there is a silent shadow-stalker piercing through the defenses of Nanotrasen with technological capabilities eons ahead of your time. They can avoid the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and only hope this unknown assassin isn't here for you."
|
||||
extended_round_description = "What was that?! Was that a person or did your eyes just play tricks on you? \
|
||||
You have no idea. That slim-suited, cryptic individual is an enigma to you and all of your knowledge. \
|
||||
Their purpose is unknown. Their mission is unknown. How they arrived to this secure and isolated \
|
||||
section of the galaxy, you don't know. What you do know is that there is a silent shadow-stalker piercing \
|
||||
through the defenses of the station with technological capabilities eons ahead of your time. They can avoid \
|
||||
the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and \
|
||||
only hope this unknown assassin isn't here for you."
|
||||
antag_tag = MODE_NINJA
|
||||
config_tag = "ninja"
|
||||
required_players = 1
|
||||
|
||||
@@ -189,7 +189,7 @@ datum/objective/anti_revolution/demote
|
||||
find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [company_name]'s goals. Demote \him[target.current] to assistant."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
@@ -197,7 +197,7 @@ datum/objective/anti_revolution/demote
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
|
||||
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [company_name]'s goals. Demote \him[target.current] to assistant."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
@@ -728,7 +728,7 @@ datum/objective/heist/kidnap
|
||||
//if (!target.current.restrained())
|
||||
// return 0 // They're loose. Close but no cigar.
|
||||
|
||||
var/area/shuttle/skipjack/station/A = locate()
|
||||
var/area/skipjack_station/start/A = locate()
|
||||
for(var/mob/living/carbon/human/M in A)
|
||||
if(target.current == M)
|
||||
return 1 //They're restrained on the shuttle. Success.
|
||||
@@ -779,7 +779,7 @@ datum/objective/heist/loot
|
||||
|
||||
var/total_amount = 0
|
||||
|
||||
for(var/obj/O in locate(/area/shuttle/skipjack/station))
|
||||
for(var/obj/O in locate(/area/skipjack_station/start))
|
||||
if(istype(O,target)) total_amount++
|
||||
for(var/obj/I in O.contents)
|
||||
if(istype(I,target)) total_amount++
|
||||
@@ -828,7 +828,7 @@ datum/objective/heist/salvage
|
||||
|
||||
var/total_amount = 0
|
||||
|
||||
for(var/obj/item/O in locate(/area/shuttle/skipjack/station))
|
||||
for(var/obj/item/O in locate(/area/skipjack_station/start))
|
||||
|
||||
var/obj/item/stack/material/S
|
||||
if(istype(O,/obj/item/stack/material))
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
/datum/game_mode/traitor
|
||||
name = "traitor"
|
||||
round_description = "There is a foreign agent or traitor on the station. Do not let the traitor succeed!"
|
||||
extended_round_description = "NanoTrasen's monopolistic control over the phoron supplies of Nyx has marked the station to be a highly valuable target for many competing organizations and individuals. The varied pasts and experiences of your coworkers have left them susceptible to the vices and temptations of humanity. Is the station the safe self-contained workplace you once thought it was, or has it become a playground for the evils of the galaxy? Who can you trust? Watch your front. Watch your sides. Watch your back. The familiar faces that you've passed hundreds of times down the hallways before can be hiding terrible secrets and deceptions. Every corner is a mystery. Every conversation is a lie. You will be facing your friends and family as they try to use your emotions and trust to their advantage, leaving you with nothing but the painful reminder that space is cruel and unforgiving."
|
||||
extended_round_description = "The Company's monopolistic control over the phoron supplies of Nyx has marked the \
|
||||
station to be a highly valuable target for many competing organizations and individuals. The varied pasts \
|
||||
and experiences of your coworkers have left them susceptible to the vices and temptations of humanity. \
|
||||
Is the station the safe self-contained workplace you once thought it was, or has it become a playground \
|
||||
for the evils of the galaxy? Who can you trust? Watch your front. Watch your sides. Watch your back. \
|
||||
The familiar faces that you've passed hundreds of times down the hallways before can be hiding terrible \
|
||||
secrets and deceptions. Every corner is a mystery. Every conversation is a lie. You will be facing your \
|
||||
friends and family as they try to use your emotions and trust to their advantage, leaving you with nothing \
|
||||
but the painful reminder that space is cruel and unforgiving."
|
||||
config_tag = "traitor"
|
||||
required_players = 0
|
||||
required_enemies = 1
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/game_mode/wizard
|
||||
name = "Wizard"
|
||||
round_description = "There is a SPACE WIZARD on the station. You can't let them achieve their objectives!"
|
||||
round_description = "There is a SPACE WIZARD on the station. You can't let the magician achieve their objectives!"
|
||||
extended_round_description = "A powerful entity capable of manipulating the elements around him, most commonly referred to as a 'wizard', has infiltrated the station. They have a wide variety of powers and spells available to them that makes your own simple moral self tremble with fear and excitement. Ultimately, their purpose is unknown. However, it is up to you and your crew to decide if their powers can be used for good or if their arrival foreshadows the destruction of the entire station."
|
||||
config_tag = "wizard"
|
||||
required_players = 1
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#define ACCESS_REGION_SUPPLY 7
|
||||
|
||||
#define ACCESS_TYPE_NONE 0
|
||||
#define ACCESS_TYPE_STATION 1
|
||||
#define ACCESS_TYPE_CENTCOM 2
|
||||
#define ACCESS_TYPE_CENTCOM 1
|
||||
#define ACCESS_TYPE_STATION 2
|
||||
#define ACCESS_TYPE_SYNDICATE 4
|
||||
#define ACCESS_TYPE_ALL 7
|
||||
#define ACCESS_TYPE_ALL (ACCESS_TYPE_CENTCOM|ACCESS_TYPE_STATION|ACCESS_TYPE_SYNDICATE)
|
||||
|
||||
@@ -67,17 +67,29 @@
|
||||
/proc/get_all_access_datums()
|
||||
if(!priv_all_access_datums)
|
||||
priv_all_access_datums = init_subtypes(/datum/access)
|
||||
priv_all_access_datums = dd_sortedObjectList(priv_all_access_datums)
|
||||
|
||||
return priv_all_access_datums
|
||||
|
||||
/var/list/datum/access/priv_all_access_datums_assoc
|
||||
/proc/get_all_access_datums_assoc()
|
||||
if(!priv_all_access_datums_assoc)
|
||||
priv_all_access_datums_assoc = list()
|
||||
/var/list/datum/access/priv_all_access_datums_id
|
||||
/proc/get_all_access_datums_by_id()
|
||||
if(!priv_all_access_datums_id)
|
||||
priv_all_access_datums_id = list()
|
||||
for(var/datum/access/A in get_all_access_datums())
|
||||
priv_all_access_datums_assoc["[A.id]"] = A
|
||||
priv_all_access_datums_id["[A.id]"] = A
|
||||
|
||||
return priv_all_access_datums_assoc
|
||||
return priv_all_access_datums_id
|
||||
|
||||
/var/list/datum/access/priv_all_access_datums_region
|
||||
/proc/get_all_access_datums_by_region()
|
||||
if(!priv_all_access_datums_region)
|
||||
priv_all_access_datums_region = list()
|
||||
for(var/datum/access/A in get_all_access_datums())
|
||||
if(!priv_all_access_datums_region[A.region])
|
||||
priv_all_access_datums_region[A.region] = list()
|
||||
priv_all_access_datums_region[A.region] += A
|
||||
|
||||
return priv_all_access_datums_region
|
||||
|
||||
/proc/get_access_ids(var/access_types = ACCESS_TYPE_ALL)
|
||||
var/list/L = new()
|
||||
@@ -148,7 +160,7 @@
|
||||
return "Supply"
|
||||
|
||||
/proc/get_access_desc(id)
|
||||
var/list/AS = get_all_access_datums_assoc()
|
||||
var/list/AS = get_all_access_datums_by_id()
|
||||
var/datum/access/A = AS["[id]"]
|
||||
|
||||
return A ? A.desc : ""
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
var/region = ACCESS_REGION_NONE
|
||||
var/access_type = ACCESS_TYPE_STATION
|
||||
|
||||
/datum/access/dd_SortValue()
|
||||
return "[access_type][desc]"
|
||||
|
||||
/*****************
|
||||
* Station access *
|
||||
*****************/
|
||||
@@ -232,8 +235,8 @@
|
||||
/var/const/access_lawyer = 38
|
||||
/datum/access/lawyer
|
||||
id = access_lawyer
|
||||
desc = "Law Office"
|
||||
region = ACCESS_REGION_GENERAL
|
||||
desc = "Internal Affairs"
|
||||
region = ACCESS_REGION_COMMAND
|
||||
|
||||
/var/const/access_virology = 39
|
||||
/datum/access/virology
|
||||
@@ -253,21 +256,9 @@
|
||||
desc = "Quartermaster"
|
||||
region = ACCESS_REGION_SUPPLY
|
||||
|
||||
/var/const/access_court = 42
|
||||
/datum/access/court
|
||||
id = access_court
|
||||
desc = "Courtroom"
|
||||
region = ACCESS_REGION_SECURITY
|
||||
|
||||
/var/const/access_clown = 43
|
||||
/datum/access/clown
|
||||
id = access_clown
|
||||
desc = "HONK! Access"
|
||||
|
||||
/var/const/access_mime = 44
|
||||
/datum/access/mime
|
||||
id = access_mime
|
||||
desc = "Silent Access"
|
||||
// /var/const/free_access_id = 43
|
||||
// /var/const/free_access_id = 43
|
||||
// /var/const/free_access_id = 44
|
||||
|
||||
/var/const/access_surgery = 45
|
||||
/datum/access/surgery
|
||||
@@ -275,11 +266,7 @@
|
||||
desc = "Surgery"
|
||||
region = ACCESS_REGION_MEDBAY
|
||||
|
||||
/var/const/access_theatre = 46
|
||||
/datum/access/theatre
|
||||
id = access_theatre
|
||||
desc = "Theatre"
|
||||
region = ACCESS_REGION_GENERAL
|
||||
// /var/const/free_access_id = 46
|
||||
|
||||
/var/const/access_research = 47
|
||||
/datum/access/research
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
spawn_positions = -1
|
||||
supervisors = "absolutely everyone"
|
||||
selection_color = "#dddddd"
|
||||
economic_modifier = 1
|
||||
access = list() //See /datum/job/assistant/get_access()
|
||||
minimal_access = list() //See /datum/job/assistant/get_access()
|
||||
alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor", "Resident")
|
||||
|
||||
@@ -9,13 +9,14 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "Nanotrasen officials and Corporate Regulations"
|
||||
supervisors = "company officials and Corporate Regulations"
|
||||
selection_color = "#ccccff"
|
||||
idtype = /obj/item/weapon/card/id/gold
|
||||
req_admin_notify = 1
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
minimal_player_age = 14
|
||||
economic_modifier = 20
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
|
||||
@@ -60,18 +61,19 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
|
||||
economic_modifier = 10
|
||||
access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
|
||||
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
|
||||
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
|
||||
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
|
||||
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
|
||||
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway)
|
||||
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#dddddd"
|
||||
economic_modifier = 5
|
||||
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
||||
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
||||
|
||||
@@ -149,6 +150,7 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the quartermaster and the head of personnel"
|
||||
selection_color = "#dddddd"
|
||||
economic_modifier = 5
|
||||
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
||||
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
|
||||
alt_titles = list("Drill Technician","Prospector")
|
||||
@@ -309,10 +311,11 @@
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "Nanotrasen officials and Corporate Regulations"
|
||||
supervisors = "company officials and Corporate Regulations"
|
||||
selection_color = "#dddddd"
|
||||
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_heads)
|
||||
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_heads)
|
||||
economic_modifier = 7
|
||||
access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads)
|
||||
minimal_access = list(access_lawyer, access_sec_doors, access_heads)
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
selection_color = "#ffeeaa"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
|
||||
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
|
||||
access_heads, access_construction, access_sec_doors,
|
||||
@@ -53,6 +54,7 @@
|
||||
spawn_positions = 5
|
||||
supervisors = "the chief engineer"
|
||||
selection_color = "#fff5cc"
|
||||
economic_modifier = 5
|
||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
|
||||
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
|
||||
alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
|
||||
@@ -89,6 +91,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief engineer"
|
||||
selection_color = "#fff5cc"
|
||||
economic_modifier = 5
|
||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
|
||||
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
var/department = null // Does this position have a department tag?
|
||||
var/head_position = 0 // Is this position Command?
|
||||
|
||||
var/account_allowed = 1 // Does this job type come with a station account?
|
||||
var/economic_modifier = 2 // With how much does this job modify the initial account amount?
|
||||
|
||||
/datum/job/proc/equip(var/mob/living/carbon/human/H)
|
||||
return 1
|
||||
|
||||
@@ -34,6 +37,37 @@
|
||||
H.species.equip_survival_gear(H,0)
|
||||
return 1
|
||||
|
||||
/datum/job/proc/setup_account(var/mob/living/carbon/human/H)
|
||||
if(!account_allowed || (H.mind && H.mind.initial_account))
|
||||
return
|
||||
|
||||
var/loyalty = 1
|
||||
if(H.client)
|
||||
switch(H.client.prefs.nanotrasen_relation)
|
||||
if(COMPANY_LOYAL) loyalty = 1.30
|
||||
if(COMPANY_SUPPORTATIVE)loyalty = 1.15
|
||||
if(COMPANY_NEUTRAL) loyalty = 1
|
||||
if(COMPANY_SKEPTICAL) loyalty = 0.85
|
||||
if(COMPANY_OPPOSED) loyalty = 0.70
|
||||
|
||||
//give them an account in the station database
|
||||
var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * (H.species ? economic_species_modifier[H.species.type] : 2)
|
||||
var/datum/money_account/M = create_account(H.real_name, money_amount, null)
|
||||
if(H.mind)
|
||||
var/remembered_info = ""
|
||||
remembered_info += "<b>Your account number is:</b> #[M.account_number]<br>"
|
||||
remembered_info += "<b>Your account pin is:</b> [M.remote_access_pin]<br>"
|
||||
remembered_info += "<b>Your account funds are:</b> $[M.money]<br>"
|
||||
|
||||
if(M.transaction_log.len)
|
||||
var/datum/transaction/T = M.transaction_log[1]
|
||||
remembered_info += "<b>Your account was created:</b> [T.time], [T.date] at [T.source_terminal]<br>"
|
||||
H.mind.store_memory(remembered_info)
|
||||
|
||||
H.mind.initial_account = M
|
||||
|
||||
H << "<span class='notice'><b>Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]</b></span>"
|
||||
|
||||
// overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del()
|
||||
/datum/job/proc/equip_preview(mob/living/carbon/human/H)
|
||||
return equip(H)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
selection_color = "#ffddf0"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
|
||||
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
|
||||
access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels)
|
||||
@@ -44,9 +45,7 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_genetics, access_maint_tunnels, access_eva)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_maint_tunnels, access_eva)
|
||||
alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
|
||||
economic_modifier = 7 alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -106,9 +105,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_chemistry, access_virology)
|
||||
minimal_access = list(access_medical, access_chemistry, access_medical_equip)
|
||||
alt_titles = list("Pharmacist")
|
||||
economic_modifier = 5 alt_titles = list("Pharmacist")
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
@@ -136,9 +133,7 @@
|
||||
spawn_positions = 0
|
||||
supervisors = "the chief medical officer and research director"
|
||||
selection_color = "#ffeef0"
|
||||
access = list(access_medical, access_morgue, access_genetics, access_research, access_medical_equip)
|
||||
minimal_access = list(access_medical, access_morgue, access_genetics, access_research, access_medical_equip)
|
||||
|
||||
economic_modifier = 7
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -162,6 +157,7 @@
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
economic_modifier = 5
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_psychiatrist)
|
||||
@@ -198,8 +194,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_eva, access_maint_tunnels, access_external_airlocks)
|
||||
economic_modifier = 4 minimal_access = list(access_medical, access_medical_equip, access_eva, access_maint_tunnels, access_external_airlocks)
|
||||
alt_titles = list("Emergency Medical Technician")
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
selection_color = "#ffddff"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 15
|
||||
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
||||
access_tox_storage, access_teleporter, access_sec_doors,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
|
||||
@@ -47,6 +48,7 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
economic_modifier = 7
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
|
||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher")
|
||||
@@ -76,6 +78,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
economic_modifier = 7
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
|
||||
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
|
||||
alt_titles = list("Xenobotanist")
|
||||
@@ -105,6 +108,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "research director"
|
||||
selection_color = "#ffeeff"
|
||||
economic_modifier = 5
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||
alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
|
||||
|
||||
@@ -11,11 +11,12 @@
|
||||
selection_color = "#ffdddd"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court,
|
||||
economic_modifier = 10
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
|
||||
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court,
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
|
||||
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
|
||||
@@ -54,8 +55,9 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_external_airlocks)
|
||||
economic_modifier = 5
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
|
||||
minimal_player_age = 5
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
@@ -91,10 +93,7 @@
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
alt_titles = list("Forensic Technician")
|
||||
|
||||
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_eva, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_eva, access_external_airlocks)
|
||||
alt_titles = list("Forensic Technician")
|
||||
economic_modifier = 5 alt_titles = list("Forensic Technician")
|
||||
minimal_player_age = 3
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -133,8 +132,9 @@
|
||||
spawn_positions = 4
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_external_airlocks)
|
||||
economic_modifier = 4
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
|
||||
alt_titles = list("Security Cadet")
|
||||
minimal_player_age = 3
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
supervisors = "your laws"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 7
|
||||
|
||||
account_allowed = 0
|
||||
economic_modifier = 0
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
return 1
|
||||
@@ -40,6 +41,8 @@
|
||||
selection_color = "#ddffdd"
|
||||
minimal_player_age = 1
|
||||
alt_titles = list("Android", "Robot")
|
||||
account_allowed = 0
|
||||
economic_modifier = 0
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
|
||||
@@ -392,6 +392,7 @@ var/global/datum/controller/occupations/job_master
|
||||
spawn_in_storage += thing
|
||||
//Equip job items.
|
||||
job.equip(H)
|
||||
job.setup_account(H)
|
||||
job.equip_backpack(H)
|
||||
job.equip_survival(H)
|
||||
job.apply_fingerprints(H)
|
||||
@@ -428,21 +429,6 @@ var/global/datum/controller/occupations/job_master
|
||||
H.buckled.loc = H.loc
|
||||
H.buckled.set_dir(H.dir)
|
||||
|
||||
//give them an account in the station database
|
||||
var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null)
|
||||
if(H.mind)
|
||||
var/remembered_info = ""
|
||||
remembered_info += "<b>Your account number is:</b> #[M.account_number]<br>"
|
||||
remembered_info += "<b>Your account pin is:</b> [M.remote_access_pin]<br>"
|
||||
remembered_info += "<b>Your account funds are:</b> $[M.money]<br>"
|
||||
|
||||
if(M.transaction_log.len)
|
||||
var/datum/transaction/T = M.transaction_log[1]
|
||||
remembered_info += "<b>Your account was created:</b> [T.time], [T.date] at [T.source_terminal]<br>"
|
||||
H.mind.store_memory(remembered_info)
|
||||
|
||||
H.mind.initial_account = M
|
||||
|
||||
// If they're head, give them the account info for their department
|
||||
if(H.mind && job.head_position)
|
||||
var/remembered_info = ""
|
||||
@@ -455,9 +441,6 @@ var/global/datum/controller/occupations/job_master
|
||||
|
||||
H.mind.store_memory(remembered_info)
|
||||
|
||||
spawn(0)
|
||||
H << "<span class='notice'><b>Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]</b></span>"
|
||||
|
||||
var/alt_title = null
|
||||
if(H.mind)
|
||||
H.mind.assigned_role = rank
|
||||
@@ -543,10 +526,9 @@ var/global/datum/controller/occupations/job_master
|
||||
else
|
||||
C = new /obj/item/weapon/card/id(H)
|
||||
if(C)
|
||||
C.registered_name = H.real_name
|
||||
C.rank = rank
|
||||
C.assignment = title ? title : rank
|
||||
C.name = "[C.registered_name]'s ID Card ([C.assignment])"
|
||||
C.set_owner_info(H)
|
||||
|
||||
//put the player's account number onto the ID
|
||||
if(H.mind && H.mind.initial_account)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
Beacon.invisibility = INVISIBILITY_MAXIMUM
|
||||
Beacon.loc = T
|
||||
|
||||
hide(T.intact)
|
||||
hide(!T.is_plating())
|
||||
|
||||
Destroy()
|
||||
if(Beacon)
|
||||
|
||||
@@ -85,10 +85,8 @@
|
||||
if(istype(new_turf, /turf/simulated/floor))
|
||||
var/turf/simulated/floor/T = new_turf
|
||||
if(!T.is_plating())
|
||||
if(!T.broken && !T.burnt)
|
||||
new T.floor_type(T)
|
||||
T.make_plating()
|
||||
return !new_turf.intact
|
||||
T.make_plating(!(T.broken || T.burnt))
|
||||
return new_turf.is_plating()
|
||||
|
||||
/obj/machinery/cablelayer/proc/layCable(var/turf/new_turf,var/M_Dir)
|
||||
if(!on)
|
||||
|
||||
@@ -1,166 +1,12 @@
|
||||
/////////////////////////////////////////
|
||||
// SLEEPER CONSOLE
|
||||
/////////////////////////////////////////
|
||||
|
||||
/obj/machinery/sleep_console
|
||||
name = "Sleeper Console"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeperconsole"
|
||||
var/obj/machinery/sleeper/connected = null
|
||||
anchored = 1 //About time someone fixed this.
|
||||
density = 0
|
||||
var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r"
|
||||
|
||||
use_power = 1
|
||||
idle_power_usage = 40
|
||||
interact_offline = 1
|
||||
|
||||
/obj/machinery/sleep_console/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/sleep_console/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
//SN src = null
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
//SN src = null
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/machinery/sleep_console/New()
|
||||
..()
|
||||
spawn( 5 )
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeperconsole-r"
|
||||
src.connected = locate(/obj/machinery/sleeper, get_step(src, EAST))
|
||||
else
|
||||
src.connected = locate(/obj/machinery/sleeper, get_step(src, WEST))
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
/obj/machinery/sleep_console/attack_ai(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/sleep_console/attack_hand(mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
var/dat = ""
|
||||
if (!src.connected || (connected.stat & (NOPOWER|BROKEN)))
|
||||
dat += "This console is not connected to a sleeper or the sleeper is non-functional."
|
||||
else
|
||||
var/mob/living/occupant = src.connected.occupant
|
||||
dat += "<font color='blue'><B>Occupant Statistics:</B></FONT><BR>"
|
||||
if (occupant)
|
||||
var/t1
|
||||
switch(occupant.stat)
|
||||
if(0)
|
||||
t1 = "Conscious"
|
||||
if(1)
|
||||
t1 = "<font color='blue'>Unconscious</font>"
|
||||
if(2)
|
||||
t1 = "<font color='red'>*dead*</font>"
|
||||
else
|
||||
dat += text("[]\tHealth %: [] ([])</FONT><BR>", (occupant.health > 50 ? "<font color='blue'>" : "<font color='red'>"), occupant.health, t1)
|
||||
if(iscarbon(occupant))
|
||||
var/mob/living/carbon/C = occupant
|
||||
dat += text("[]\t-Pulse, bpm: []</FONT><BR>", (C.pulse == PULSE_NONE || C.pulse == PULSE_THREADY ? "<font color='red'>" : "<font color='blue'>"), C.get_pulse(GETPULSE_TOOL))
|
||||
dat += text("[]\t-Brute Damage %: []</FONT><BR>", (occupant.getBruteLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getBruteLoss())
|
||||
dat += text("[]\t-Respiratory Damage %: []</FONT><BR>", (occupant.getOxyLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getOxyLoss())
|
||||
dat += text("[]\t-Toxin Content %: []</FONT><BR>", (occupant.getToxLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getToxLoss())
|
||||
dat += text("[]\t-Burn Severity %: []</FONT><BR>", (occupant.getFireLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getFireLoss())
|
||||
dat += text("<HR>Paralysis Summary %: [] ([] seconds left!)<BR>", occupant.paralysis, round(occupant.paralysis / 4))
|
||||
if(occupant.reagents)
|
||||
for(var/chemical in connected.available_chemicals)
|
||||
dat += "[connected.available_chemicals[chemical]]: [occupant.reagents.get_reagent_amount(chemical)] units<br>"
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>Refresh Meter Readings</A><BR>"
|
||||
if(src.connected.beaker)
|
||||
dat += "<HR><A href='?src=\ref[src];removebeaker=1'>Remove Beaker</A><BR>"
|
||||
if(src.connected.filtering)
|
||||
dat += "<A href='?src=\ref[src];togglefilter=1'>Stop Dialysis</A><BR>"
|
||||
dat += text("Output Beaker has [] units of free space remaining<BR><HR>", src.connected.beaker.reagents.maximum_volume - src.connected.beaker.reagents.total_volume)
|
||||
else
|
||||
dat += "<HR><A href='?src=\ref[src];togglefilter=1'>Start Dialysis</A><BR>"
|
||||
dat += text("Output Beaker has [] units of free space remaining<BR><HR>", src.connected.beaker.reagents.maximum_volume - src.connected.beaker.reagents.total_volume)
|
||||
else
|
||||
dat += "<HR>No Dialysis Output Beaker is present.<BR><HR>"
|
||||
|
||||
for(var/chemical in connected.available_chemicals)
|
||||
dat += "Inject [connected.available_chemicals[chemical]]: "
|
||||
for(var/amount in connected.amounts)
|
||||
dat += "<a href ='?src=\ref[src];chemical=[chemical];amount=[amount]'>[amount] units</a><br> "
|
||||
|
||||
|
||||
dat += "<HR><A href='?src=\ref[src];ejectify=1'>Eject Patient</A>"
|
||||
else
|
||||
dat += "The sleeper is empty."
|
||||
dat += text("<BR><BR><A href='?src=\ref[];mach_close=sleeper'>Close</A>", user)
|
||||
user << browse(dat, "window=sleeper;size=400x500")
|
||||
onclose(user, "sleeper")
|
||||
return
|
||||
|
||||
/obj/machinery/sleep_console/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
|
||||
usr.set_machine(src)
|
||||
if (href_list["chemical"])
|
||||
if (src.connected)
|
||||
if (src.connected.occupant)
|
||||
if (src.connected.occupant.stat == DEAD)
|
||||
usr << "<span class='danger'>This person has no life for to preserve anymore. Take them to a department capable of reanimating them.</span>"
|
||||
else if(src.connected.occupant.health > 0 || href_list["chemical"] == "inaprovaline")
|
||||
src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"]))
|
||||
else
|
||||
usr << "<span class='danger'>This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!</span>"
|
||||
src.updateUsrDialog()
|
||||
if (href_list["refresh"])
|
||||
src.updateUsrDialog()
|
||||
if (href_list["removebeaker"])
|
||||
src.connected.remove_beaker()
|
||||
src.updateUsrDialog()
|
||||
if (href_list["togglefilter"])
|
||||
src.connected.toggle_filter()
|
||||
src.updateUsrDialog()
|
||||
if (href_list["ejectify"])
|
||||
src.connected.eject()
|
||||
src.updateUsrDialog()
|
||||
src.add_fingerprint(usr)
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////
|
||||
// THE SLEEPER ITSELF
|
||||
/////////////////////////////////////////
|
||||
|
||||
/obj/machinery/sleeper
|
||||
name = "Sleeper"
|
||||
name = "sleeper"
|
||||
desc = "A fancy bed with built-in injectors, a dialysis machine, and a limited health scanner."
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper_0"
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r"
|
||||
var/mob/living/carbon/human/occupant = null
|
||||
var/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
|
||||
var/amounts = list(5, 10)
|
||||
var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker = null
|
||||
var/filtering = 0
|
||||
|
||||
@@ -168,269 +14,210 @@
|
||||
idle_power_usage = 15
|
||||
active_power_usage = 200 //builtin health analyzer, dialysis machine, injectors.
|
||||
|
||||
New()
|
||||
..()
|
||||
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
|
||||
spawn( 5 )
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeper_0-r"
|
||||
return
|
||||
/obj/machinery/sleeper/New()
|
||||
..()
|
||||
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
|
||||
|
||||
/obj/machinery/sleeper/initialize()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/sleeper/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
process()
|
||||
if (stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
if(filtering > 0)
|
||||
if(beaker)
|
||||
if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
|
||||
var/pumped = 0
|
||||
for(var/datum/reagent/x in src.occupant.reagents.reagent_list)
|
||||
src.occupant.reagents.trans_to_obj(beaker, 3)
|
||||
pumped++
|
||||
if (ishuman(src.occupant))
|
||||
src.occupant.vessel.trans_to_obj(beaker, pumped + 1)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
|
||||
blob_act()
|
||||
if(prob(75))
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.loc = src.loc
|
||||
A.blob_act()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
attackby(var/obj/item/weapon/G as obj, var/mob/user as mob)
|
||||
if(istype(G, /obj/item/weapon/reagent_containers/glass))
|
||||
if(!beaker)
|
||||
beaker = G
|
||||
user.drop_item()
|
||||
G.loc = src
|
||||
user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
else
|
||||
user << "<span class='warning'>The sleeper has a beaker already.</span>"
|
||||
return
|
||||
|
||||
else if(istype(G, /obj/item/weapon/grab))
|
||||
if(!ismob(G:affecting))
|
||||
return
|
||||
|
||||
if(src.occupant)
|
||||
user << "<span class='warning'>The sleeper is already occupied!</span>"
|
||||
return
|
||||
|
||||
for(var/mob/living/carbon/slime/M in range(1,G:affecting))
|
||||
if(M.Victim == G:affecting)
|
||||
usr << "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head."
|
||||
return
|
||||
|
||||
visible_message("[user] starts putting [G:affecting:name] into the sleeper.", 3)
|
||||
|
||||
if(do_after(user, 20))
|
||||
if(src.occupant)
|
||||
user << "<span class='warning'>The sleeper is already occupied!</span>"
|
||||
return
|
||||
if(!G || !G:affecting) return
|
||||
var/mob/M = G:affecting
|
||||
if(M.client)
|
||||
M.client.perspective = EYE_PERSPECTIVE
|
||||
M.client.eye = src
|
||||
M.loc = src
|
||||
update_use_power(2)
|
||||
src.occupant = M
|
||||
src.icon_state = "sleeper_1"
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeper_1-r"
|
||||
|
||||
src.add_fingerprint(user)
|
||||
qdel(G)
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
ex_act(severity)
|
||||
if(filtering)
|
||||
toggle_filter()
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.loc = src.loc
|
||||
ex_act(severity)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if(prob(50))
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.loc = src.loc
|
||||
ex_act(severity)
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if(prob(25))
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.loc = src.loc
|
||||
ex_act(severity)
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
emp_act(severity)
|
||||
if(filtering)
|
||||
toggle_filter()
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
..(severity)
|
||||
return
|
||||
if(occupant)
|
||||
go_out()
|
||||
..(severity)
|
||||
|
||||
alter_health(mob/living/M as mob)
|
||||
if (M.health > 0)
|
||||
if (M.getOxyLoss() >= 10)
|
||||
var/amount = max(0.15, 1)
|
||||
M.adjustOxyLoss(-amount)
|
||||
else
|
||||
M.adjustOxyLoss(-12)
|
||||
M.updatehealth()
|
||||
M.AdjustParalysis(-4)
|
||||
M.AdjustWeakened(-4)
|
||||
M.AdjustStunned(-4)
|
||||
M.Paralyse(1)
|
||||
M.Weaken(1)
|
||||
M.Stun(1)
|
||||
if (M:reagents.get_reagent_amount("inaprovaline") < 5)
|
||||
M:reagents.add_reagent("inaprovaline", 5)
|
||||
return
|
||||
proc/toggle_filter()
|
||||
if(!src.occupant)
|
||||
filtering = 0
|
||||
return
|
||||
if(filtering)
|
||||
filtering = 0
|
||||
else
|
||||
filtering = 1
|
||||
|
||||
proc/go_out()
|
||||
if(filtering)
|
||||
toggle_filter()
|
||||
if(!src.occupant)
|
||||
return
|
||||
if(src.occupant.client)
|
||||
src.occupant.client.eye = src.occupant.client.mob
|
||||
src.occupant.client.perspective = MOB_PERSPECTIVE
|
||||
src.occupant.loc = src.loc
|
||||
src.occupant = null
|
||||
update_use_power(1)
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeper_0-r"
|
||||
return
|
||||
|
||||
|
||||
proc/inject_chemical(mob/living/user as mob, chemical, amount)
|
||||
if (stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
if(src.occupant && src.occupant.reagents)
|
||||
if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 20)
|
||||
use_power(amount * CHEM_SYNTH_ENERGY)
|
||||
src.occupant.reagents.add_reagent(chemical, amount)
|
||||
user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream."
|
||||
return
|
||||
user << "There's no occupant in the sleeper or the subject has too many chemicals!"
|
||||
return
|
||||
|
||||
|
||||
proc/check(mob/living/user as mob)
|
||||
if(src.occupant)
|
||||
user << text("<span class='notice'><B>Occupant ([]) Statistics:</B></span>", src.occupant)
|
||||
var/t1
|
||||
switch(src.occupant.stat)
|
||||
if(0.0)
|
||||
t1 = "Conscious"
|
||||
if(1.0)
|
||||
t1 = "Unconscious"
|
||||
if(2.0)
|
||||
t1 = "*dead*"
|
||||
else
|
||||
user << text("<span class='[]'>\t Health %: [] ([])</span>", (src.occupant.health > 50 ? "notice" : "warning"), src.occupant.health, t1)
|
||||
user << text("<span class='[]'>\t -Core Temperature: []°C ([]°F)</span>", (src.occupant.bodytemperature > 50 ? "notice" : "warning"), src.occupant.bodytemperature-T0C, src.occupant.bodytemperature*1.8-459.67)
|
||||
user << text("<span class='[]'>\t -Brute Damage %: []</span>", (src.occupant.getBruteLoss() < 60 ? "notice" : "warning"), src.occupant.getBruteLoss())
|
||||
user << text("<span class='[]'>\t -Respiratory Damage %: []</span>", (src.occupant.getOxyLoss() < 60 ? "notice" : "warning"), src.occupant.getOxyLoss())
|
||||
user << text("<span class='[]'>\t -Toxin Content %: []</span>", (src.occupant.getToxLoss() < 60 ? "notice" : "warning"), src.occupant.getToxLoss())
|
||||
user << text("<span class='[]'>\t -Burn Severity %: []</span>", (src.occupant.getFireLoss() < 60 ? "notice" : "warning"), src.occupant.getFireLoss())
|
||||
user << "<span class='notice'>Expected time till occupant can safely awake: (note: If health is below 20% these times are inaccurate)</span>"
|
||||
user << text("<span class='notice'>\t [] second\s (if around 1 or 2 the sleeper is keeping them asleep.)</span>", src.occupant.paralysis / 5)
|
||||
if(src.beaker)
|
||||
user << text("<span class='notice'>\t Dialysis Output Beaker has [] of free space remaining.</span>", src.beaker.reagents.maximum_volume - src.beaker.reagents.total_volume)
|
||||
else
|
||||
user << "<span class='notice'>No Dialysis Output Beaker loaded.</span>"
|
||||
else
|
||||
user << "<span class='notice'>There is no one inside!</span>"
|
||||
return
|
||||
|
||||
|
||||
verb/eject()
|
||||
set name = "Eject Sleeper"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
if(usr.stat != 0)
|
||||
return
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeper_0-r"
|
||||
src.icon_state = "sleeper_0"
|
||||
src.go_out()
|
||||
add_fingerprint(usr)
|
||||
return
|
||||
|
||||
verb/remove_beaker()
|
||||
set name = "Remove Beaker"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
if(usr.stat != 0)
|
||||
return
|
||||
if(filtering > 0)
|
||||
if(beaker)
|
||||
filtering = 0
|
||||
beaker.loc = usr.loc
|
||||
beaker = null
|
||||
add_fingerprint(usr)
|
||||
if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
|
||||
var/pumped = 0
|
||||
for(var/datum/reagent/x in occupant.reagents.reagent_list)
|
||||
occupant.reagents.trans_to_obj(beaker, 3)
|
||||
pumped++
|
||||
if(ishuman(occupant))
|
||||
occupant.vessel.trans_to_obj(beaker, pumped + 1)
|
||||
else
|
||||
toggle_filter()
|
||||
|
||||
/obj/machinery/sleeper/update_icon()
|
||||
icon_state = "sleeper_[occupant ? "1" : "0"]"
|
||||
|
||||
/obj/machinery/sleeper/attack_hand(var/mob/user)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/sleeper/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = outside_state)
|
||||
var/data[0]
|
||||
|
||||
data["power"] = stat & (NOPOWER|BROKEN) ? 0 : 1
|
||||
|
||||
var/list/reagents = list()
|
||||
for(var/T in available_chemicals)
|
||||
var/list/reagent = list()
|
||||
reagent["id"] = T
|
||||
reagent["name"] = available_chemicals[T]
|
||||
if(occupant)
|
||||
reagent["amount"] = occupant.reagents.get_reagent_amount(T)
|
||||
reagents += list(reagent)
|
||||
data["reagents"] = reagents.Copy()
|
||||
|
||||
if(occupant)
|
||||
data["occupant"] = 1
|
||||
switch(occupant.stat)
|
||||
if(CONSCIOUS)
|
||||
data["stat"] = "Conscious"
|
||||
if(UNCONSCIOUS)
|
||||
data["stat"] = "Unconscious"
|
||||
if(DEAD)
|
||||
data["stat"] = "<font color='red'>Dead</font>"
|
||||
data["health"] = occupant.health
|
||||
if(iscarbon(occupant))
|
||||
var/mob/living/carbon/C = occupant
|
||||
data["pulse"] = C.get_pulse(GETPULSE_TOOL)
|
||||
data["brute"] = occupant.getBruteLoss()
|
||||
data["burn"] = occupant.getFireLoss()
|
||||
data["oxy"] = occupant.getOxyLoss()
|
||||
data["tox"] = occupant.getToxLoss()
|
||||
else
|
||||
data["occupant"] = 0
|
||||
if(beaker)
|
||||
data["beaker"] = beaker.reagents.get_free_space()
|
||||
else
|
||||
data["beaker"] = -1
|
||||
data["filtering"] = filtering
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/sleeper/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(usr == occupant)
|
||||
usr << "<span class='warning'>You can't reach the controls from the inside.</span>"
|
||||
return
|
||||
|
||||
verb/move_inside()
|
||||
set name = "Enter Sleeper"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
add_fingerprint(usr)
|
||||
|
||||
if(usr.stat != 0 || !(ishuman(usr) || issmall(usr)))
|
||||
return
|
||||
if(href_list["eject"])
|
||||
go_out()
|
||||
if(href_list["beaker"])
|
||||
remove_beaker()
|
||||
if(href_list["filter"])
|
||||
if(filtering != text2num(href_list["filter"]))
|
||||
toggle_filter()
|
||||
if(href_list["chemical"] && href_list["amount"])
|
||||
if(occupant && occupant.stat != DEAD)
|
||||
if(href_list["chemical"] in available_chemicals) // Your hacks are bad and you should feel bad
|
||||
inject_chemical(usr, href_list["chemical"], text2num(href_list["amount"]))
|
||||
|
||||
if(src.occupant)
|
||||
usr << "<span class='warning'>The sleeper is already occupied!</span>"
|
||||
return
|
||||
return 1
|
||||
|
||||
for(var/mob/living/carbon/slime/M in range(1,usr))
|
||||
if(M.Victim == usr)
|
||||
usr << "You're too busy getting your life sucked out of you."
|
||||
return
|
||||
visible_message("[usr] starts climbing into the sleeper.", 3)
|
||||
if(do_after(usr, 20))
|
||||
if(src.occupant)
|
||||
usr << "<span class='warning'>The sleeper is already occupied!</span>"
|
||||
return
|
||||
usr.stop_pulling()
|
||||
usr.client.perspective = EYE_PERSPECTIVE
|
||||
usr.client.eye = src
|
||||
usr.loc = src
|
||||
update_use_power(2)
|
||||
src.occupant = usr
|
||||
src.icon_state = "sleeper_1"
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeper_1-r"
|
||||
/obj/machinery/sleeper/attack_ai(var/mob/user)
|
||||
return attack_hand(user)
|
||||
|
||||
for(var/obj/O in src)
|
||||
qdel(O)
|
||||
src.add_fingerprint(usr)
|
||||
return
|
||||
/obj/machinery/sleeper/attackby(var/obj/item/I, var/mob/user)
|
||||
add_fingerprint(user)
|
||||
if(istype(I, /obj/item/weapon/reagent_containers/glass))
|
||||
if(!beaker)
|
||||
beaker = I
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
user.visible_message("<span class='notice'>\The [user] adds \a [I] to \the [src].</span>", "<span class='notice'>You add \a [I] to \the [src].</span>")
|
||||
else
|
||||
user << "<span class='warning'>\The [src] has a beaker already.</span>"
|
||||
return
|
||||
|
||||
/obj/machinery/sleeper/MouseDrop_T(var/mob/target, var/mob/user)
|
||||
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
|
||||
return
|
||||
go_in(target, user)
|
||||
|
||||
/obj/machinery/sleeper/relaymove(var/mob/user)
|
||||
..()
|
||||
go_out()
|
||||
|
||||
/obj/machinery/sleeper/emp_act(var/severity)
|
||||
if(filtering)
|
||||
toggle_filter()
|
||||
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
..(severity)
|
||||
return
|
||||
|
||||
if(occupant)
|
||||
go_out()
|
||||
|
||||
..(severity)
|
||||
/obj/machinery/sleeper/proc/toggle_filter()
|
||||
if(!occupant || !beaker)
|
||||
filtering = 0
|
||||
return
|
||||
filtering = !filtering
|
||||
|
||||
/obj/machinery/sleeper/proc/go_in(var/mob/M, var/mob/user)
|
||||
if(!M)
|
||||
return
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if(occupant)
|
||||
user << "<span class='warning'>\The [src] is already occupied.</span>"
|
||||
return
|
||||
|
||||
if(M == user)
|
||||
visible_message("\The [user] starts climbing into \the [src].")
|
||||
else
|
||||
visible_message("\The [user] starts putting [M] into \the [src].")
|
||||
|
||||
if(do_after(user, 20))
|
||||
if(occupant)
|
||||
user << "<span class='warning'>\The [src] is already occupied.</span>"
|
||||
return
|
||||
M.stop_pulling()
|
||||
if(M.client)
|
||||
M.client.perspective = EYE_PERSPECTIVE
|
||||
M.client.eye = src
|
||||
M.loc = src
|
||||
update_use_power(2)
|
||||
occupant = M
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/sleeper/proc/go_out()
|
||||
if(!occupant)
|
||||
return
|
||||
if(occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
occupant.loc = loc
|
||||
occupant = null
|
||||
for(var/atom/movable/A in src) // In case an object was dropped inside or something
|
||||
if(A == beaker)
|
||||
continue
|
||||
A.loc = loc
|
||||
update_use_power(1)
|
||||
update_icon()
|
||||
toggle_filter()
|
||||
|
||||
/obj/machinery/sleeper/proc/remove_beaker()
|
||||
if(beaker)
|
||||
beaker.loc = loc
|
||||
beaker = null
|
||||
toggle_filter()
|
||||
|
||||
/obj/machinery/sleeper/proc/inject_chemical(var/mob/living/user, var/chemical, var/amount)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
if(occupant && occupant.reagents)
|
||||
if(occupant.reagents.get_reagent_amount(chemical) + amount <= 20)
|
||||
use_power(amount * CHEM_SYNTH_ENERGY)
|
||||
occupant.reagents.add_reagent(chemical, amount)
|
||||
user << "Occupant now has [occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in their bloodstream."
|
||||
else
|
||||
user << "The subject has too many chemicals."
|
||||
else
|
||||
user << "There's no suitable occupant in \the [src]."
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
var/list/TLV = list()
|
||||
var/list/trace_gas = list("sleeping_agent", "volatile_fuel") //list of other gases that this air alarm is able to detect
|
||||
|
||||
var/danger_level = 0
|
||||
var/pressure_dangerlevel = 0
|
||||
@@ -240,23 +241,24 @@
|
||||
/obj/machinery/alarm/proc/overall_danger_level(var/datum/gas_mixture/environment)
|
||||
var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume
|
||||
var/environment_pressure = environment.return_pressure()
|
||||
//var/other_moles = 0.0
|
||||
////for(var/datum/gas/G in environment.trace_gases)
|
||||
// other_moles+=G.moles
|
||||
|
||||
var/other_moles = 0
|
||||
for(var/g in trace_gas)
|
||||
other_moles += environment.gas[g] //this is only going to be used in a partial pressure calc, so we don't need to worry about group_multiplier here.
|
||||
|
||||
pressure_dangerlevel = get_danger_level(environment_pressure, TLV["pressure"])
|
||||
oxygen_dangerlevel = get_danger_level(environment.gas["oxygen"]*partial_pressure, TLV["oxygen"])
|
||||
co2_dangerlevel = get_danger_level(environment.gas["carbon_dioxide"]*partial_pressure, TLV["carbon dioxide"])
|
||||
phoron_dangerlevel = get_danger_level(environment.gas["phoron"]*partial_pressure, TLV["phoron"])
|
||||
temperature_dangerlevel = get_danger_level(environment.temperature, TLV["temperature"])
|
||||
//other_dangerlevel = get_danger_level(other_moles*partial_pressure, TLV["other"])
|
||||
other_dangerlevel = get_danger_level(other_moles*partial_pressure, TLV["other"])
|
||||
|
||||
return max(
|
||||
pressure_dangerlevel,
|
||||
oxygen_dangerlevel,
|
||||
co2_dangerlevel,
|
||||
phoron_dangerlevel,
|
||||
//other_dangerlevel,
|
||||
other_dangerlevel,
|
||||
temperature_dangerlevel
|
||||
)
|
||||
|
||||
@@ -302,22 +304,30 @@
|
||||
/obj/machinery/alarm/update_icon()
|
||||
if(wiresexposed)
|
||||
icon_state = "alarmx"
|
||||
set_light(0)
|
||||
return
|
||||
if((stat & (NOPOWER|BROKEN)) || shorted)
|
||||
icon_state = "alarmp"
|
||||
set_light(0)
|
||||
return
|
||||
|
||||
var/icon_level = danger_level
|
||||
if (alarm_area.atmosalm)
|
||||
icon_level = max(icon_level, 1) //if there's an atmos alarm but everything is okay locally, no need to go past yellow
|
||||
|
||||
var/new_color = null
|
||||
switch(icon_level)
|
||||
if (0)
|
||||
icon_state = "alarm0"
|
||||
new_color = "#03A728"
|
||||
if (1)
|
||||
icon_state = "alarm2" //yes, alarm2 is yellow alarm
|
||||
new_color = "#EC8B2F"
|
||||
if (2)
|
||||
icon_state = "alarm1"
|
||||
new_color = "#DA0205"
|
||||
|
||||
set_light(l_range = 2, l_power = 0.5, l_color = new_color)
|
||||
|
||||
/obj/machinery/alarm/receive_signal(datum/signal/signal)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
@@ -504,34 +514,13 @@
|
||||
var/list/environment_data = new
|
||||
data["has_environment"] = total
|
||||
if(total)
|
||||
var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume
|
||||
|
||||
var/list/current_settings = TLV["pressure"]
|
||||
var/pressure = environment.return_pressure()
|
||||
var/pressure_danger = get_danger_level(pressure, current_settings)
|
||||
environment_data[++environment_data.len] = list("name" = "Pressure", "value" = pressure, "unit" = "kPa", "danger_level" = pressure_danger)
|
||||
data["total_danger"] = pressure_danger
|
||||
|
||||
current_settings = TLV["oxygen"]
|
||||
var/oxygen_danger = get_danger_level(environment.gas["oxygen"]*partial_pressure, current_settings)
|
||||
environment_data[++environment_data.len] = list("name" = "Oxygen", "value" = environment.gas["oxygen"] / total * 100, "unit" = "%", "danger_level" = oxygen_danger)
|
||||
data["total_danger"] = max(oxygen_danger, data["total_danger"])
|
||||
|
||||
current_settings = TLV["carbon dioxide"]
|
||||
var/carbon_dioxide_danger = get_danger_level(environment.gas["carbon_dioxide"]*partial_pressure, current_settings)
|
||||
environment_data[++environment_data.len] = list("name" = "Carbon dioxide", "value" = environment.gas["carbon_dioxide"] / total * 100, "unit" = "%", "danger_level" = carbon_dioxide_danger)
|
||||
data["total_danger"] = max(carbon_dioxide_danger, data["total_danger"])
|
||||
|
||||
current_settings = TLV["phoron"]
|
||||
var/phoron_danger = get_danger_level(environment.gas["phoron"]*partial_pressure, current_settings)
|
||||
environment_data[++environment_data.len] = list("name" = "Toxins", "value" = environment.gas["phoron"] / total * 100, "unit" = "%", "danger_level" = phoron_danger)
|
||||
data["total_danger"] = max(phoron_danger, data["total_danger"])
|
||||
|
||||
current_settings = TLV["temperature"]
|
||||
var/temperature_danger = get_danger_level(environment.temperature, current_settings)
|
||||
environment_data[++environment_data.len] = list("name" = "Temperature", "value" = environment.temperature, "unit" = "K ([round(environment.temperature - T0C, 0.1)]C)", "danger_level" = temperature_danger)
|
||||
data["total_danger"] = max(temperature_danger, data["total_danger"])
|
||||
|
||||
environment_data[++environment_data.len] = list("name" = "Pressure", "value" = pressure, "unit" = "kPa", "danger_level" = pressure_dangerlevel)
|
||||
environment_data[++environment_data.len] = list("name" = "Oxygen", "value" = environment.gas["oxygen"] / total * 100, "unit" = "%", "danger_level" = oxygen_dangerlevel)
|
||||
environment_data[++environment_data.len] = list("name" = "Carbon dioxide", "value" = environment.gas["carbon_dioxide"] / total * 100, "unit" = "%", "danger_level" = co2_dangerlevel)
|
||||
environment_data[++environment_data.len] = list("name" = "Toxins", "value" = environment.gas["phoron"] / total * 100, "unit" = "%", "danger_level" = phoron_dangerlevel)
|
||||
environment_data[++environment_data.len] = list("name" = "Temperature", "value" = environment.temperature, "unit" = "K ([round(environment.temperature - T0C, 0.1)]C)", "danger_level" = temperature_dangerlevel)
|
||||
data["total_danger"] = danger_level
|
||||
data["environment"] = environment_data
|
||||
data["atmos_alarm"] = alarm_area.atmosalm
|
||||
data["fire_alarm"] = alarm_area.fire != null
|
||||
@@ -634,8 +623,8 @@
|
||||
|
||||
return min(..(), .)
|
||||
|
||||
/obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state)
|
||||
if(..(href, href_list, nowindow, state))
|
||||
/obj/machinery/alarm/Topic(href, href_list, var/datum/topic_state/state)
|
||||
if(..(href, href_list, state))
|
||||
return 1
|
||||
|
||||
// hrefs that can always be called -walter0o
|
||||
@@ -888,8 +877,11 @@ FIRE ALARM
|
||||
var/last_process = 0
|
||||
var/wiresexposed = 0
|
||||
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
|
||||
var/seclevel
|
||||
|
||||
/obj/machinery/firealarm/update_icon()
|
||||
overlays.Cut()
|
||||
|
||||
if(wiresexposed)
|
||||
switch(buildstage)
|
||||
if(2)
|
||||
@@ -898,17 +890,28 @@ FIRE ALARM
|
||||
icon_state="fire_b1"
|
||||
if(0)
|
||||
icon_state="fire_b0"
|
||||
|
||||
set_light(0)
|
||||
return
|
||||
|
||||
if(stat & BROKEN)
|
||||
icon_state = "firex"
|
||||
set_light(0)
|
||||
else if(stat & NOPOWER)
|
||||
icon_state = "firep"
|
||||
else if(!src.detecting)
|
||||
icon_state = "fire1"
|
||||
set_light(0)
|
||||
else
|
||||
icon_state = "fire0"
|
||||
if(!src.detecting)
|
||||
icon_state = "fire1"
|
||||
set_light(l_range = 4, l_power = 2, l_color = "#ff0000")
|
||||
else
|
||||
icon_state = "fire0"
|
||||
switch(seclevel)
|
||||
if("green") set_light(l_range = 2, l_power = 0.5, l_color = "#00ff00")
|
||||
if("blue") set_light(l_range = 2, l_power = 0.5, l_color = "#1024A9")
|
||||
if("red") set_light(l_range = 4, l_power = 2, l_color = "#ff0000")
|
||||
if("delta") set_light(l_range = 4, l_power = 2, l_color = "#FF6633")
|
||||
|
||||
src.overlays += image('icons/obj/monitors.dmi', "overlay_[seclevel]")
|
||||
|
||||
/obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume)
|
||||
if(src.detecting)
|
||||
@@ -1121,14 +1124,14 @@ FIRE ALARM
|
||||
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
|
||||
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
|
||||
|
||||
/obj/machinery/firealarm/proc/set_security_level(var/newlevel)
|
||||
if(seclevel != newlevel)
|
||||
seclevel = newlevel
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/firealarm/initialize()
|
||||
if(z in config.contact_levels)
|
||||
if(security_level)
|
||||
src.overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]")
|
||||
else
|
||||
src.overlays += image('icons/obj/monitors.dmi', "overlay_green")
|
||||
|
||||
update_icon()
|
||||
set_security_level(security_level? get_security_level() : "green")
|
||||
|
||||
/*
|
||||
FIRE ALARM CIRCUIT
|
||||
|
||||
@@ -74,7 +74,8 @@ obj/machinery/air_sensor/Destroy()
|
||||
|
||||
/obj/machinery/computer/general_air_control
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "tank"
|
||||
icon_keyboard = "atmos_key"
|
||||
icon_screen = "tank"
|
||||
|
||||
name = "Computer"
|
||||
|
||||
@@ -158,7 +159,6 @@ obj/machinery/computer/general_air_control/Destroy()
|
||||
|
||||
/obj/machinery/computer/general_air_control/large_tank_control
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "tank"
|
||||
|
||||
frequency = 1441
|
||||
var/input_tag
|
||||
@@ -278,7 +278,6 @@ Max Output Pressure: [output_pressure] kPa<BR>"}
|
||||
|
||||
/obj/machinery/computer/general_air_control/supermatter_core
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "tank"
|
||||
|
||||
frequency = 1438
|
||||
var/input_tag
|
||||
@@ -398,7 +397,7 @@ Min Core Pressure: [pressure_limit] kPa<BR>"}
|
||||
|
||||
/obj/machinery/computer/general_air_control/fuel_injection
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "atmos"
|
||||
icon_screen = "alert:0"
|
||||
|
||||
var/device_tag
|
||||
var/list/device_info
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/obj/machinery/computer/area_atmos
|
||||
name = "Area Air Control"
|
||||
desc = "A computer used to control the stationary scrubbers and pumps in the area."
|
||||
icon_state = "area_atmos"
|
||||
icon_keyboard = "atmos_key"
|
||||
icon_screen = "area_atmos"
|
||||
light_color = "#e6ffff"
|
||||
circuit = "/obj/item/weapon/circuitboard/area_atmos"
|
||||
circuit = /obj/item/weapon/circuitboard/area_atmos
|
||||
|
||||
var/list/connectedscrubbers = new()
|
||||
var/status = ""
|
||||
|
||||
@@ -104,7 +104,6 @@
|
||||
network.update = 1
|
||||
|
||||
/obj/machinery/portable_atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
var/obj/icon = src
|
||||
if ((istype(W, /obj/item/weapon/tank) && !( src.destroyed )))
|
||||
if (src.holding)
|
||||
return
|
||||
@@ -136,21 +135,8 @@
|
||||
return
|
||||
|
||||
else if ((istype(W, /obj/item/device/analyzer)) && Adjacent(user))
|
||||
visible_message("<span class='notice'>\The [user] has used \the [W] on \the [src] \icon[icon]</span>")
|
||||
if(air_contents)
|
||||
var/pressure = air_contents.return_pressure()
|
||||
var/total_moles = air_contents.total_moles
|
||||
|
||||
user << "<span class='notice'>Results of analysis of \icon[icon]</span>"
|
||||
if (total_moles>0)
|
||||
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
|
||||
for(var/g in air_contents.gas)
|
||||
user << "<span class='notice'>[gas_data.name[g]]: [round((air_contents.gas[g] / total_moles) * 100)]%</span>"
|
||||
user << "<span class='notice'>Temperature: [round(air_contents.temperature-T0C)]°C</span>"
|
||||
else
|
||||
user << "<span class='notice'>Tank is empty!</span>"
|
||||
else
|
||||
user << "<span class='notice'>Tank is empty!</span>"
|
||||
var/obj/item/device/analyzer/A = W
|
||||
A.analyze_gases(src, user)
|
||||
return
|
||||
|
||||
return
|
||||
@@ -163,6 +149,13 @@
|
||||
var/last_power_draw = 0
|
||||
var/obj/item/weapon/cell/cell
|
||||
|
||||
/obj/machinery/portable_atmospherics/powered/powered()
|
||||
if(use_power) //using area power
|
||||
return ..()
|
||||
if(cell && cell.charge)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/portable_atmospherics/powered/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/weapon/cell))
|
||||
if(cell)
|
||||
@@ -176,6 +169,7 @@
|
||||
cell = C
|
||||
C.loc = src
|
||||
user.visible_message("<span class='notice'>[user] opens the panel on [src] and inserts [C].</span>", "<span class='notice'>You open the panel on [src] and insert [C].</span>")
|
||||
power_change()
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
@@ -187,8 +181,8 @@
|
||||
cell.add_fingerprint(user)
|
||||
cell.loc = src.loc
|
||||
cell = null
|
||||
power_change()
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
/obj/machinery/portable_atmospherics/proc/log_open()
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
|
||||
//ran out of charge
|
||||
if (!cell.charge)
|
||||
power_change()
|
||||
update_icon()
|
||||
|
||||
src.updateDialog()
|
||||
|
||||
@@ -77,6 +77,7 @@
|
||||
|
||||
//ran out of charge
|
||||
if (!cell.charge)
|
||||
power_change()
|
||||
update_icon()
|
||||
|
||||
//src.update_icon()
|
||||
@@ -147,7 +148,6 @@
|
||||
volume = 50000
|
||||
volume_rate = 5000
|
||||
|
||||
chan
|
||||
use_power = 1
|
||||
idle_power_usage = 500 //internal circuitry, friction losses and stuff
|
||||
active_power_usage = 100000 //100 kW ~ 135 HP
|
||||
|
||||
@@ -290,7 +290,7 @@
|
||||
/obj/machinery/autolathe/dismantle()
|
||||
|
||||
for(var/mat in stored_material)
|
||||
var/material/M = name_to_material[mat]
|
||||
var/material/M = get_material_by_name(mat)
|
||||
if(!istype(M))
|
||||
continue
|
||||
var/obj/item/stack/material/S = new M.stack_type(get_turf(src))
|
||||
|
||||
@@ -37,6 +37,11 @@
|
||||
path = /obj/item/device/flashlight
|
||||
category = "General"
|
||||
|
||||
/datum/autolathe/recipe/floor_light
|
||||
name = "floor light"
|
||||
path = /obj/machinery/floor_light
|
||||
category = "General"
|
||||
|
||||
/datum/autolathe/recipe/extinguisher
|
||||
name = "extinguisher"
|
||||
path = /obj/item/weapon/extinguisher
|
||||
@@ -332,8 +337,8 @@
|
||||
category = "Arms and Ammunition"
|
||||
|
||||
/datum/autolathe/recipe/magazine_c20r
|
||||
name = "ammunition (12mm)"
|
||||
path = /obj/item/ammo_magazine/a12mm
|
||||
name = "ammunition (10mm)"
|
||||
path = /obj/item/ammo_magazine/a10mm
|
||||
hidden = 1
|
||||
category = "Arms and Ammunition"
|
||||
|
||||
@@ -391,6 +396,12 @@
|
||||
hidden = 1
|
||||
category = "Devices and Components"
|
||||
|
||||
/datum/autolathe/recipe/beartrap
|
||||
name = "mechanical trap"
|
||||
path = /obj/item/weapon/beartrap
|
||||
hidden = 1
|
||||
category = "Devices and Components"
|
||||
|
||||
/datum/autolathe/recipe/welder_industrial
|
||||
name = "industrial welding tool"
|
||||
path = /obj/item/weapon/weldingtool/largetank
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
|
||||
/obj/item/queen_bee
|
||||
name = "queen bee packet"
|
||||
desc = "Place her into an apiary so she can get busy."
|
||||
icon = 'icons/obj/seeds.dmi'
|
||||
icon_state = "seed-kudzu"
|
||||
w_class = 1
|
||||
|
||||
/obj/item/weapon/bee_net
|
||||
name = "bee net"
|
||||
desc = "For catching rogue bees."
|
||||
icon = 'icons/obj/apiary_bees_etc.dmi'
|
||||
icon_state = "bee_net"
|
||||
item_state = "bedsheet"
|
||||
w_class = 3
|
||||
var/caught_bees = 0
|
||||
|
||||
/obj/item/weapon/bee_net/attack_self(mob/user as mob)
|
||||
var/turf/T = get_step(get_turf(user), user.dir)
|
||||
for(var/mob/living/simple_animal/bee/B in T)
|
||||
if(B.feral < 0)
|
||||
caught_bees += B.strength
|
||||
qdel(B)
|
||||
user.visible_message("<span class='notice'>\The [user] nets some bees.</span>","<span class='notice'>You net up some of the becalmed bees.</span>")
|
||||
else
|
||||
user.visible_message("<span class='warning'>\The [user] swings at some bees, they don't seem to like it.</span>","<span class='warning'>You swing at some bees, they don't seem to like it.</span>")
|
||||
B.feral = 5
|
||||
B.target_mob = user
|
||||
|
||||
/obj/item/weapon/bee_net/verb/empty_bees()
|
||||
set src in usr
|
||||
set name = "Empty bee net"
|
||||
set category = "Object"
|
||||
var/mob/living/carbon/M
|
||||
if(iscarbon(usr))
|
||||
M = usr
|
||||
|
||||
while(caught_bees > 0)
|
||||
//release a few super massive swarms
|
||||
while(caught_bees > 5)
|
||||
var/mob/living/simple_animal/bee/B = new(src.loc)
|
||||
B.feral = 5
|
||||
B.target_mob = M
|
||||
B.strength = 6
|
||||
B.icon_state = "bees_swarm"
|
||||
caught_bees -= 6
|
||||
|
||||
//what's left over
|
||||
var/mob/living/simple_animal/bee/B = new(src.loc)
|
||||
B.strength = caught_bees
|
||||
B.icon_state = "bees[B.strength]"
|
||||
B.feral = 5
|
||||
B.target_mob = M
|
||||
|
||||
caught_bees = 0
|
||||
|
||||
/obj/item/apiary
|
||||
name = "moveable apiary"
|
||||
icon = 'icons/obj/apiary_bees_etc.dmi'
|
||||
icon_state = "apiary_item"
|
||||
item_state = "giftbag"
|
||||
w_class = 5
|
||||
|
||||
/obj/item/beezeez
|
||||
name = "bottle of BeezEez"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle17"
|
||||
New()
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/honeycomb
|
||||
name = "honeycomb"
|
||||
icon_state = "honeycomb"
|
||||
desc = "Dripping with sugary sweetness."
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/honeycomb/New()
|
||||
..()
|
||||
reagents.add_reagent("honey",10)
|
||||
reagents.add_reagent("nutriment", 0.5)
|
||||
reagents.add_reagent("sugar", 2)
|
||||
bitesize = 2
|
||||
|
||||
/datum/reagent/honey
|
||||
name = "Honey"
|
||||
id = "honey"
|
||||
description = "A golden yellow syrup, loaded with sugary sweetness."
|
||||
color = "#FFFF00"
|
||||
|
||||
/obj/item/weapon/book/manual/hydroponics_beekeeping
|
||||
name = "The Ins and Outs of Apiculture - A Precise Art"
|
||||
icon_state ="bookHydroponicsBees"
|
||||
author = "Beekeeper Dave"
|
||||
title = "The Ins and Outs of Apiculture - A Precise Art"
|
||||
dat = {"<html>
|
||||
<head>
|
||||
<style>
|
||||
h1 {font-size: 18px; margin: 15px 0px 5px;}
|
||||
h2 {font-size: 15px; margin: 15px 0px 5px;}
|
||||
li {margin: 2px 0px 2px 15px;}
|
||||
ul {margin: 5px; padding: 0px;}
|
||||
ol {margin: 5px; padding: 0px 15px;}
|
||||
body {font-size: 13px; font-family: Verdana;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Raising Bees</h1>
|
||||
|
||||
Bees are loving but fickle creatures. Don't mess with their hive and stay away from any clusters of them, and you'll avoid their ire.
|
||||
Sometimes, you'll need to dig around in there for those delicious sweeties though - in that case make sure you wear sealed protection gear
|
||||
and carry an extinguisher or smoker with you - any bees chasing you, once calmed down, can thusly be netted and returned safely to the hive.<br.
|
||||
<br>
|
||||
BeezEez is a cure-all panacea for them, but use it too much and the hive may grow to apocalyptic proportions. Other than that, bees are excellent pets
|
||||
for all the family and are excellent caretakers of one's garden: having a hive or two around will aid in the longevity and growth rate of plants,
|
||||
and aid them in fighting off poisons and disease.
|
||||
|
||||
</body>
|
||||
</html>
|
||||
"}
|
||||
@@ -66,19 +66,19 @@
|
||||
user << "<span class='info'>You inject the blood sample into the bioprinter.</span>"
|
||||
return
|
||||
// Meat for biomass.
|
||||
else if(!prints_prosthetics && istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
|
||||
if(!prints_prosthetics && istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
|
||||
stored_matter += 50
|
||||
user.drop_item()
|
||||
user << "<span class='info'>\The [src] processes \the [W]. Levels of stored biomass now: [stored_matter]</span>"
|
||||
qdel(W)
|
||||
return
|
||||
// Steel for matter.
|
||||
else if(prints_prosthetics && istype(W, /obj/item/stack/material/steel))
|
||||
var/obj/item/stack/material/steel/M = W
|
||||
stored_matter += M.amount * 10
|
||||
if(prints_prosthetics && istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL)
|
||||
var/obj/item/stack/S = W
|
||||
stored_matter += S.amount * 10
|
||||
user.drop_item()
|
||||
user << "<span class='info'>\The [src] processes \the [W]. Levels of stored matter now: [stored_matter]</span>"
|
||||
qdel(W)
|
||||
return
|
||||
else
|
||||
return..()
|
||||
|
||||
return..()
|
||||
@@ -19,7 +19,7 @@
|
||||
brute_dam_coeff = 0.5
|
||||
var/atom/movable/load = null // the loaded crate (usually)
|
||||
var/beacon_freq = 1400
|
||||
var/control_freq = AI_FREQ
|
||||
var/control_freq = BOT_FREQ
|
||||
|
||||
suffix = ""
|
||||
|
||||
@@ -712,10 +712,6 @@
|
||||
M.lying = 1
|
||||
..()
|
||||
|
||||
/obj/machinery/bot/mulebot/alter_health()
|
||||
return get_turf(src)
|
||||
|
||||
|
||||
// called from mob/living/carbon/human/Crossed()
|
||||
// when mulebot is in the same loc
|
||||
/obj/machinery/bot/mulebot/proc/RunOver(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
active_power_usage = 10
|
||||
layer = 5
|
||||
|
||||
var/list/network = list("Exodus")
|
||||
var/list/network = list(NETWORK_EXODUS)
|
||||
var/c_tag = null
|
||||
var/c_tag_order = 999
|
||||
var/status = 1
|
||||
@@ -186,6 +186,7 @@
|
||||
src.bugged = 1
|
||||
|
||||
else if(W.damtype == BRUTE || W.damtype == BURN) //bashing cameras
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if (W.force >= src.toughness)
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='warning'><b>[src] has been [pick(W.attack_verb)] with [W] by [user]!</b></span>")
|
||||
@@ -301,6 +302,9 @@
|
||||
/obj/machinery/camera/proc/can_see()
|
||||
var/list/see = null
|
||||
var/turf/pos = get_turf(src)
|
||||
if(!pos)
|
||||
return list()
|
||||
|
||||
if(isXRay())
|
||||
see = range(view_range, pos)
|
||||
else
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
if(isscrewdriver(W))
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
|
||||
var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: Exodus,Security,Secret ", "Set Network", "Exodus"))
|
||||
var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: Exodus,Security,Secret ", "Set Network", NETWORK_EXODUS))
|
||||
if(!input)
|
||||
usr << "No input found please hang up and try your call again."
|
||||
return
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
/obj/machinery/camera
|
||||
|
||||
var/list/motionTargets = list()
|
||||
var/detectTime = 0
|
||||
var/area/ai_monitored/area_motion = null
|
||||
var/alarm_delay = 100 // Don't forget, there's another 10 seconds in queueAlarm()
|
||||
|
||||
flags = PROXMOVE
|
||||
|
||||
/obj/machinery/camera/process()
|
||||
// motion camera event loop
|
||||
|
||||
@@ -155,6 +155,11 @@
|
||||
if(!istype(target)) return
|
||||
var/mob/living/silicon/ai/U = usr
|
||||
|
||||
if(target == U.cameraFollow)
|
||||
return
|
||||
|
||||
if(U.cameraFollow)
|
||||
U.ai_cancel_tracking()
|
||||
U.cameraFollow = target
|
||||
U << "Now tracking [target.name] on camera."
|
||||
target.tracking_initiated()
|
||||
@@ -240,7 +245,8 @@ mob/living/proc/near_camera()
|
||||
|
||||
/mob/living/carbon/human/tracking_status()
|
||||
//Cameras can't track people wearing an agent card or a ninja hood.
|
||||
if(wear_id && istype(wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
|
||||
var/obj/item/weapon/card/id/id = GetIdCard(src)
|
||||
if(id && id.prevent_tracking())
|
||||
return TRACKING_TERMINATE
|
||||
if(istype(head, /obj/item/clothing/head/helmet/space/rig))
|
||||
var/obj/item/clothing/head/helmet/space/rig/helmet = head
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
name = "patient monitoring console"
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
icon_state = "operating"
|
||||
light_color = "#315ab4"
|
||||
circuit = "/obj/item/weapon/circuitboard/operating"
|
||||
icon_keyboard = "med_key"
|
||||
icon_screen = "crew"
|
||||
circuit = /obj/item/weapon/circuitboard/operating
|
||||
var/mob/living/carbon/human/victim = null
|
||||
var/obj/machinery/optable/table = null
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
/obj/machinery/computer/rcon
|
||||
name = "\improper RCON console"
|
||||
desc = "Console used to remotely control machinery on the station."
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "ai-fixer"
|
||||
icon_keyboard = "power_key"
|
||||
icon_screen = "power_screen"
|
||||
light_color = "#a97faa"
|
||||
circuit = /obj/item/weapon/circuitboard/rcon_console
|
||||
req_one_access = list(access_engine)
|
||||
@@ -19,6 +19,11 @@
|
||||
..()
|
||||
rcon = new(src)
|
||||
|
||||
/obj/machinery/computer/rcon/Destroy()
|
||||
qdel(rcon)
|
||||
rcon = null
|
||||
..()
|
||||
|
||||
// Proc: attack_hand()
|
||||
// Parameters: 1 (user - Person which clicked this computer)
|
||||
// Description: Opens UI of this machine.
|
||||
@@ -31,3 +36,8 @@
|
||||
// Description: Uses dark magic (NanoUI) to render this machine's UI
|
||||
/obj/machinery/computer/rcon/ui_interact(mob/user, ui_key = "rcon", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
rcon.ui_interact(user, ui_key, ui, force_open)
|
||||
|
||||
/obj/machinery/computer/rcon/update_icon()
|
||||
..()
|
||||
if(!(stat & (NOPOWER|BROKEN)))
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer)
|
||||
|
||||
@@ -88,8 +88,8 @@
|
||||
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
|
||||
A.amount = 5
|
||||
|
||||
if(istype(P, /obj/item/stack/material/glass/reinforced))
|
||||
var/obj/item/stack/material/glass/reinforced/RG = P
|
||||
if(istype(P, /obj/item/stack/material) && P.get_material_name() == "rglass")
|
||||
var/obj/item/stack/RG = P
|
||||
if (RG.get_amount() < 2)
|
||||
user << "<span class='warning'>You need two sheets of glass to put in the glass panel.</span>"
|
||||
return
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
/obj/machinery/computer/aifixer
|
||||
name = "\improper AI system integrity restorer"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "ai-fixer"
|
||||
icon_keyboard = "rd_key"
|
||||
icon_screen = "ai-fixer"
|
||||
light_color = "#a97faa"
|
||||
circuit = /obj/item/weapon/circuitboard/aifixer
|
||||
req_one_access = list(access_robotics, access_heads)
|
||||
@@ -128,16 +129,13 @@
|
||||
|
||||
/obj/machinery/computer/aifixer/update_icon()
|
||||
..()
|
||||
|
||||
overlays.Cut()
|
||||
|
||||
if((stat & BROKEN) || (stat & NOPOWER))
|
||||
return
|
||||
|
||||
if(occupant)
|
||||
if(occupant.stat)
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-404")
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-404", overlay_layer)
|
||||
else
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-full", overlay_layer)
|
||||
else
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer)
|
||||
|
||||
@@ -3,7 +3,9 @@
|
||||
desc = "Does not support pinball."
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "arcade"
|
||||
circuit = "/obj/item/weapon/circuitboard/arcade"
|
||||
icon_keyboard = null
|
||||
icon_screen = "invaders"
|
||||
circuit = /obj/item/weapon/circuitboard/arcade
|
||||
var/enemy_name = "Space Villian"
|
||||
var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc
|
||||
var/player_hp = 30 //Player health/attack points
|
||||
|
||||
@@ -7,8 +7,9 @@ var/global/list/minor_air_alarms = list()
|
||||
/obj/machinery/computer/atmos_alert
|
||||
name = "atmospheric alert computer"
|
||||
desc = "Used to access the station's atmospheric sensors."
|
||||
circuit = "/obj/item/weapon/circuitboard/atmos_alert"
|
||||
icon_state = "alert:0"
|
||||
circuit = /obj/item/weapon/circuitboard/atmos_alert
|
||||
icon_keyboard = "atmos_key"
|
||||
icon_screen = "alert:0"
|
||||
light_color = "#e6ffff"
|
||||
|
||||
/obj/machinery/computer/atmos_alert/New()
|
||||
@@ -44,19 +45,17 @@ var/global/list/minor_air_alarms = list()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/computer/atmos_alert/update_icon()
|
||||
..()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
var/list/alarms = atmosphere_alarm.major_alarms()
|
||||
if(alarms.len)
|
||||
icon_state = "alert:2"
|
||||
else
|
||||
alarms = atmosphere_alarm.minor_alarms()
|
||||
if(!(stat & (NOPOWER|BROKEN)))
|
||||
var/list/alarms = atmosphere_alarm.major_alarms()
|
||||
if(alarms.len)
|
||||
icon_state = "alert:1"
|
||||
icon_screen = "alert:2"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
return
|
||||
alarms = atmosphere_alarm.minor_alarms()
|
||||
if(alarms.len)
|
||||
icon_screen = "alert:1"
|
||||
else
|
||||
icon_screen = initial(icon_screen)
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/atmos_alert/Topic(href, href_list)
|
||||
if(..())
|
||||
|
||||
@@ -5,11 +5,12 @@
|
||||
/obj/machinery/computer/atmoscontrol
|
||||
name = "\improper Central Atmospherics Computer"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "computer_generic"
|
||||
icon_keyboard = "generic_key"
|
||||
icon_screen = "comm_logs"
|
||||
light_color = "#00b000"
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
circuit = "/obj/item/weapon/circuitboard/atmoscontrol"
|
||||
circuit = /obj/item/weapon/circuitboard/atmoscontrol
|
||||
req_access = list(access_ce)
|
||||
var/list/monitored_alarm_ids = null
|
||||
var/datum/nano_module/atmos_control/atmos_control
|
||||
@@ -19,8 +20,9 @@
|
||||
|
||||
/obj/machinery/computer/atmoscontrol/laptop
|
||||
name = "Atmospherics Laptop"
|
||||
desc = "Cheap Nanotrasen Laptop."
|
||||
icon_state = "medlaptop"
|
||||
desc = "A cheap laptop."
|
||||
icon_state = "laptop"
|
||||
icon_keyboard = "laptop_key"
|
||||
density = 0
|
||||
|
||||
/obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob)
|
||||
|
||||
@@ -87,8 +87,8 @@
|
||||
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
|
||||
A.amount = 5
|
||||
|
||||
if(istype(P, /obj/item/stack/material/glass))
|
||||
var/obj/item/stack/material/glass/G = P
|
||||
if(istype(P, /obj/item/stack/material) && P.get_material_name() == "glass")
|
||||
var/obj/item/stack/G = P
|
||||
if (G.get_amount() < 2)
|
||||
user << "<span class='warning'>You need two sheets of glass to put in the glass panel.</span>"
|
||||
return
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
/obj/machinery/computer/security
|
||||
name = "security camera monitor"
|
||||
desc = "Used to access the various cameras on the station."
|
||||
icon_state = "cameras"
|
||||
icon_keyboard = "security_key"
|
||||
icon_screen = "cameras"
|
||||
light_color = "#a91515"
|
||||
var/obj/machinery/camera/current = null
|
||||
var/last_pic = 1.0
|
||||
@@ -71,7 +72,7 @@
|
||||
ui.add_template("mapContent", "sec_camera_map_content.tmpl")
|
||||
// adding a template with the key "mapHeader" replaces the map header content
|
||||
ui.add_template("mapHeader", "sec_camera_map_header.tmpl")
|
||||
|
||||
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
@@ -201,23 +202,19 @@
|
||||
/obj/machinery/computer/security/telescreen
|
||||
name = "Telescreen"
|
||||
desc = "Used for watching an empty arena."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "telescreen"
|
||||
icon_state = "wallframe"
|
||||
icon_keyboard = null
|
||||
icon_screen = null
|
||||
light_range_on = 0
|
||||
network = list("thunder")
|
||||
density = 0
|
||||
circuit = null
|
||||
|
||||
/obj/machinery/computer/security/telescreen/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
if(stat & BROKEN)
|
||||
icon_state += "b"
|
||||
return
|
||||
|
||||
/obj/machinery/computer/security/telescreen/entertainment
|
||||
name = "entertainment monitor"
|
||||
desc = "Damn, why do they never have anything interesting on these things?"
|
||||
icon = 'icons/obj/status_display.dmi'
|
||||
icon_state = "entertainment"
|
||||
icon_screen = "entertainment"
|
||||
light_color = "#FFEEDB"
|
||||
light_range_on = 2
|
||||
circuit = null
|
||||
@@ -225,7 +222,9 @@
|
||||
/obj/machinery/computer/security/wooden_tv
|
||||
name = "security camera monitor"
|
||||
desc = "An old TV hooked into the stations camera network."
|
||||
icon_state = "security_det"
|
||||
icon_state = "television"
|
||||
icon_keyboard = null
|
||||
icon_screen = "detective_tv"
|
||||
circuit = null
|
||||
light_color = "#3848B3"
|
||||
light_power_on = 0.5
|
||||
@@ -233,7 +232,8 @@
|
||||
/obj/machinery/computer/security/mining
|
||||
name = "outpost camera monitor"
|
||||
desc = "Used to access the various cameras on the outpost."
|
||||
icon_state = "miningcameras"
|
||||
icon_keyboard = "mining_key"
|
||||
icon_screen = "mining"
|
||||
network = list("MINE")
|
||||
circuit = /obj/item/weapon/circuitboard/security/mining
|
||||
light_color = "#F9BBFC"
|
||||
@@ -241,7 +241,8 @@
|
||||
/obj/machinery/computer/security/engineering
|
||||
name = "engineering camera monitor"
|
||||
desc = "Used to monitor fires and breaches."
|
||||
icon_state = "engineeringcameras"
|
||||
icon_keyboard = "power_key"
|
||||
icon_screen = "engie_cams"
|
||||
circuit = /obj/item/weapon/circuitboard/security/engineering
|
||||
light_color = "#FAC54B"
|
||||
|
||||
|
||||
@@ -2,11 +2,12 @@
|
||||
|
||||
/obj/machinery/computer/card
|
||||
name = "\improper ID card modification console"
|
||||
desc = "Terminal for programming NanoTrasen employee ID cards to access parts of the station."
|
||||
icon_state = "id"
|
||||
desc = "Terminal for programming employee ID cards to access parts of the station."
|
||||
icon_keyboard = "id_key"
|
||||
icon_screen = "id"
|
||||
light_color = "#0099ff"
|
||||
req_access = list(access_change_ids)
|
||||
circuit = "/obj/item/weapon/circuitboard/card"
|
||||
circuit = /obj/item/weapon/circuitboard/card
|
||||
var/obj/item/weapon/card/id/scan = null
|
||||
var/obj/item/weapon/card/id/modify = null
|
||||
var/mode = 0.0
|
||||
@@ -284,7 +285,7 @@
|
||||
|
||||
/obj/machinery/computer/card/centcom
|
||||
name = "\improper CentCom ID card modification console"
|
||||
circuit = "/obj/item/weapon/circuitboard/card/centcom"
|
||||
circuit = /obj/item/weapon/circuitboard/card/centcom
|
||||
req_access = list(access_cent_captain)
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/obj/machinery/computer/cloning
|
||||
name = "cloning control console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "dna"
|
||||
icon_keyboard = "med_key"
|
||||
icon_screen = "dna"
|
||||
light_color = "#315ab4"
|
||||
circuit = "/obj/item/weapon/circuitboard/cloning"
|
||||
circuit = /obj/item/weapon/circuitboard/cloning
|
||||
req_access = list(access_heads) //Only used for record deletion right now.
|
||||
var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
|
||||
var/list/pods = list() //Linked cloning pods.
|
||||
@@ -408,15 +409,3 @@
|
||||
selected_record = R
|
||||
break
|
||||
return selected_record
|
||||
|
||||
/obj/machinery/computer/cloning/update_icon()
|
||||
|
||||
if(stat & BROKEN)
|
||||
icon_state = "commb"
|
||||
else
|
||||
if(stat & NOPOWER)
|
||||
src.icon_state = "c_unpowered"
|
||||
stat |= NOPOWER
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
stat &= ~NOPOWER
|
||||
|
||||
@@ -4,10 +4,11 @@
|
||||
/obj/machinery/computer/communications
|
||||
name = "command and communications console"
|
||||
desc = "Used to command and control the station. Can relay long-range communications."
|
||||
icon_state = "comm"
|
||||
icon_keyboard = "tech_key"
|
||||
icon_screen = "comm"
|
||||
light_color = "#0099ff"
|
||||
req_access = list(access_heads)
|
||||
circuit = "/obj/item/weapon/circuitboard/communications"
|
||||
circuit = /obj/item/weapon/circuitboard/communications
|
||||
var/prints_intercept = 1
|
||||
var/authenticated = 0
|
||||
var/list/messagetitle = list()
|
||||
@@ -188,12 +189,12 @@
|
||||
if(centcomm_message_cooldown)
|
||||
usr << "\red Arrays recycling. Please stand by."
|
||||
return
|
||||
var/input = sanitize(input("Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
|
||||
var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
|
||||
if(!input || !(usr in view(1,src)))
|
||||
return
|
||||
Centcomm_announce(input, usr)
|
||||
usr << "\blue Message transmitted."
|
||||
log_say("[key_name(usr)] has made an IA Centcomm announcement: [input]")
|
||||
log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]")
|
||||
centcomm_message_cooldown = 1
|
||||
spawn(300)//10 minute cooldown
|
||||
centcomm_message_cooldown = 0
|
||||
@@ -305,7 +306,7 @@
|
||||
if (src.authenticated==2)
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=announce'>Make An Announcement</A> \]"
|
||||
if(src.emagged == 0)
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageCentcomm'>Send an emergency message to Centcomm</A> \]"
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageCentcomm'>Send an emergency message to [boss_short]</A> \]"
|
||||
else
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageSyndicate'>Send an emergency message to \[UNKNOWN\]</A> \]"
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=RestoreBackup'>Restore Backup Routing Data</A> \]"
|
||||
@@ -436,7 +437,7 @@
|
||||
return
|
||||
|
||||
if(deathsquad.deployed)
|
||||
user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated."
|
||||
user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated."
|
||||
return
|
||||
|
||||
if(emergency_shuttle.deny_shuttle)
|
||||
@@ -448,7 +449,7 @@
|
||||
return
|
||||
|
||||
if(emergency_shuttle.going_to_centcom())
|
||||
user << "The emergency shuttle may not be called while returning to CentCom."
|
||||
user << "The emergency shuttle may not be called while returning to [boss_short]."
|
||||
return
|
||||
|
||||
if(emergency_shuttle.online())
|
||||
@@ -471,7 +472,7 @@
|
||||
return
|
||||
|
||||
if(emergency_shuttle.going_to_centcom())
|
||||
user << "The shuttle may not be called while returning to CentCom."
|
||||
user << "The shuttle may not be called while returning to [boss_short]."
|
||||
return
|
||||
|
||||
if(emergency_shuttle.online())
|
||||
@@ -481,11 +482,11 @@
|
||||
// if force is 0, some things may stop the shuttle call
|
||||
if(!force)
|
||||
if(emergency_shuttle.deny_shuttle)
|
||||
user << "Centcom does not currently have a shuttle available in your sector. Please try again later."
|
||||
user << "[boss_short] does not currently have a shuttle available in your sector. Please try again later."
|
||||
return
|
||||
|
||||
if(deathsquad.deployed == 1)
|
||||
user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated."
|
||||
user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated."
|
||||
return
|
||||
|
||||
if(world.time < 54000) // 30 minute grace period to let the game get going
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/machinery/computer
|
||||
name = "computer"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "computer"
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
use_power = 1
|
||||
@@ -9,11 +10,19 @@
|
||||
var/circuit = null //The path to the circuit board type. If circuit==null, the computer can't be disassembled.
|
||||
var/processing = 0
|
||||
|
||||
var/light_range_on = 3
|
||||
var/icon_keyboard = "generic_key"
|
||||
var/icon_screen = "generic"
|
||||
var/light_range_on = 2
|
||||
var/light_power_on = 1
|
||||
var/overlay_layer
|
||||
|
||||
/obj/machinery/computer/New()
|
||||
overlay_layer = layer
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/initialize()
|
||||
power_change()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
@@ -63,18 +72,22 @@
|
||||
density = 0
|
||||
|
||||
/obj/machinery/computer/update_icon()
|
||||
..()
|
||||
icon_state = initial(icon_state)
|
||||
// Broken
|
||||
overlays.Cut()
|
||||
if(stat & NOPOWER)
|
||||
set_light(0)
|
||||
if(icon_keyboard)
|
||||
overlays += image(icon,"[icon_keyboard]_off", overlay_layer)
|
||||
return
|
||||
else
|
||||
set_light(light_range_on, light_power_on)
|
||||
|
||||
if(stat & BROKEN)
|
||||
icon_state += "b"
|
||||
|
||||
// Powered
|
||||
else if(stat & NOPOWER)
|
||||
icon_state = initial(icon_state)
|
||||
icon_state += "0"
|
||||
|
||||
overlays += image(icon,"[icon_state]_broken", overlay_layer)
|
||||
else
|
||||
overlays += image(icon,icon_screen, overlay_layer)
|
||||
|
||||
if(icon_keyboard)
|
||||
overlays += image(icon, icon_keyboard, overlay_layer)
|
||||
|
||||
/obj/machinery/computer/power_change()
|
||||
..()
|
||||
|
||||
@@ -1,24 +1,27 @@
|
||||
/obj/machinery/computer/crew
|
||||
name = "crew monitoring computer"
|
||||
desc = "Used to monitor active health sensors built into most of the crew's uniforms."
|
||||
icon_state = "crew"
|
||||
icon_keyboard = "med_key"
|
||||
icon_screen = "crew"
|
||||
light_color = "#315ab4"
|
||||
use_power = 1
|
||||
idle_power_usage = 250
|
||||
active_power_usage = 500
|
||||
circuit = "/obj/item/weapon/circuitboard/crew"
|
||||
circuit = /obj/item/weapon/circuitboard/crew
|
||||
var/datum/nano_module/crew_monitor/crew_monitor
|
||||
|
||||
/obj/machinery/computer/crew/New()
|
||||
crew_monitor = new(src)
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/crew/Destroy()
|
||||
qdel(crew_monitor)
|
||||
crew_monitor = null
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/crew/attack_ai(mob/user)
|
||||
attack_hand(user)
|
||||
ui_interact(user)
|
||||
|
||||
|
||||
/obj/machinery/computer/crew/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
@@ -28,17 +31,5 @@
|
||||
/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
crew_monitor.ui_interact(user, ui_key, ui, force_open)
|
||||
|
||||
/obj/machinery/computer/crew/update_icon()
|
||||
|
||||
if(stat & BROKEN)
|
||||
icon_state = "crewb"
|
||||
else
|
||||
if(stat & NOPOWER)
|
||||
src.icon_state = "c_unpowered"
|
||||
stat |= NOPOWER
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
stat &= ~NOPOWER
|
||||
|
||||
/obj/machinery/computer/crew/interact(mob/user)
|
||||
crew_monitor.ui_interact(user)
|
||||
|
||||
@@ -43,9 +43,10 @@
|
||||
/obj/machinery/computer/guestpass
|
||||
name = "guest pass terminal"
|
||||
icon_state = "guest"
|
||||
icon_keyboard = null
|
||||
icon_screen = "pass"
|
||||
density = 0
|
||||
|
||||
|
||||
var/obj/item/weapon/card/id/giver
|
||||
var/list/accesses = list()
|
||||
var/giv_name = "NOT SPECIFIED"
|
||||
|
||||
@@ -3,8 +3,9 @@
|
||||
/obj/machinery/computer/aiupload
|
||||
name = "\improper AI upload console"
|
||||
desc = "Used to upload laws to the AI."
|
||||
icon_state = "command"
|
||||
circuit = "/obj/item/weapon/circuitboard/aiupload"
|
||||
icon_keyboard = "rd_key"
|
||||
icon_screen = "command"
|
||||
circuit = /obj/item/weapon/circuitboard/aiupload
|
||||
var/mob/living/silicon/ai/current = null
|
||||
var/opened = 0
|
||||
|
||||
@@ -50,7 +51,7 @@
|
||||
else
|
||||
usr << "[src.current.name] selected for law changes."
|
||||
return
|
||||
|
||||
|
||||
attack_ghost(user as mob)
|
||||
return 1
|
||||
|
||||
@@ -58,8 +59,9 @@
|
||||
/obj/machinery/computer/borgupload
|
||||
name = "cyborg upload console"
|
||||
desc = "Used to upload laws to Cyborgs."
|
||||
icon_state = "command"
|
||||
circuit = "/obj/item/weapon/circuitboard/borgupload"
|
||||
icon_keyboard = "rd_key"
|
||||
icon_screen = "command"
|
||||
circuit = /obj/item/weapon/circuitboard/borgupload
|
||||
var/mob/living/silicon/robot/current = null
|
||||
|
||||
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
//this computer displays status and remotely activates multiple shutters / blast doors
|
||||
//todo: lock / electrify specified area doors? might be a bit gamebreaking
|
||||
|
||||
/obj/machinery/computer/lockdown
|
||||
//for reference
|
||||
/*name = "lockdown control"
|
||||
desc = "Used to control blast doors."
|
||||
icon_state = "lockdown"
|
||||
circuit = "/obj/item/weapon/circuitboard/lockdown"
|
||||
var/connected_doors
|
||||
var/department*/
|
||||
var/list/displayedNetworks
|
||||
|
||||
New()
|
||||
..()
|
||||
connected_doors = new/list()
|
||||
displayedNetworks = new/list()
|
||||
//only load blast doors for map-defined departments for the moment
|
||||
//door networks are hardcoded here.
|
||||
switch(department)
|
||||
if("Engineering")
|
||||
connected_doors.Add("Engineering")
|
||||
//Antiqua Engineering
|
||||
connected_doors.Add("Reactor core")
|
||||
connected_doors.Add("Control Room")
|
||||
connected_doors.Add("Vent Seal")
|
||||
connected_doors.Add("Rig Storage")
|
||||
connected_doors.Add("Fore Port Shutters")
|
||||
connected_doors.Add("Fore Starboard Shutters")
|
||||
connected_doors.Add("Electrical Storage Shutters")
|
||||
connected_doors.Add("Locker Room Shutters")
|
||||
connected_doors.Add("Breakroom Shutters")
|
||||
connected_doors.Add("Observation Shutters")
|
||||
//exodus engineering
|
||||
if("Medbay")
|
||||
//Exodus Medbay
|
||||
connected_doors.Add("Genetics Outer Shutters")
|
||||
connected_doors.Add("Genetics Inner Shutters")
|
||||
connected_doors.Add("Chemistry Outer Shutters")
|
||||
connected_doors.Add("Observation Shutters")
|
||||
connected_doors.Add("Patient Room 1 Shutters")
|
||||
connected_doors.Add("Patient Room 2 Shutters")
|
||||
connected_doors.Add("Patient Room 3 Shutters")
|
||||
|
||||
for(var/net in connected_doors)
|
||||
connected_doors[net] = new/list()
|
||||
|
||||
//loop through the world, grabbing all the relevant doors
|
||||
spawn(1)
|
||||
ConnectDoors()
|
||||
|
||||
proc/ConnectDoors()
|
||||
for(var/list/L in connected_doors)
|
||||
for(var/item in L)
|
||||
L.Remove(item)
|
||||
//
|
||||
for(var/obj/machinery/door/poddoor/D in world)
|
||||
if(D.network in connected_doors)
|
||||
var/list/L = connected_doors[D.network]
|
||||
L.Add(D)
|
||||
|
||||
attack_ai(mob/user)
|
||||
attack_hand(user)
|
||||
|
||||
attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
|
||||
if (!istype(user, /mob/living/silicon))
|
||||
user.machine = null
|
||||
user << browse(null, "window=lockdown")
|
||||
return
|
||||
|
||||
var/t = "<B>Lockdown Control</B><BR>"
|
||||
t += "<A href='?src=\ref[src];refresh=1'>Refresh</A><BR>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
t += "<table border=1>"
|
||||
var/empty = 1
|
||||
for(var/curNetId in connected_doors)
|
||||
var/list/L = connected_doors[curNetId]
|
||||
if(!L || L.len == 0)
|
||||
continue
|
||||
empty = 0
|
||||
t += "<tr>"
|
||||
if(curNetId in displayedNetworks)
|
||||
t += "<td><a href='?src=\ref[src];hide_net=[curNetId]'>\[-\]</a><b> " + curNetId + "<b></td>"
|
||||
t += "<td colspan=\"2\"><b><a href='?src=\ref[src];open_net=[curNetId]'>Open all</a> / <a href='?src=\ref[src];close_net=[curNetId]'>Close all</a></b></td>"
|
||||
t += "</tr>"
|
||||
|
||||
for(var/obj/machinery/door/poddoor/D in connected_doors[curNetId])
|
||||
t += "<tr>"
|
||||
t += "<td>[D.id]</td>"
|
||||
|
||||
if(istype(D,/obj/machinery/door/poddoor/shutters))
|
||||
t += "<td>Shutter ([D.density ? "Closed" : "Open"])</td>"
|
||||
else
|
||||
t += "<td>Blast door ([D.density ? "Closed" : "Open"])</td>"
|
||||
t += "<td><b><a href='?src=\ref[D];toggle=1'>Toggle</a></b></td>"
|
||||
t += "</tr>"
|
||||
else
|
||||
t += "<td><a href='?src=\ref[src];show_net=[curNetId]'>\[+\]</a> <b>" + curNetId + "<b></td>"
|
||||
t += "</table>"
|
||||
if(empty)
|
||||
t += "<span class='warning'>No networks connected.</span><br>"
|
||||
t += "<A href='?src=\ref[src];refresh=1'>Refresh</A><BR>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
user << browse(t, "window=lockdown;size=550x600")
|
||||
onclose(user, "lockdown")
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..()) return 1
|
||||
|
||||
if( href_list["close"] )
|
||||
usr << browse(null, "window=lockdown")
|
||||
usr.machine = null
|
||||
|
||||
if( href_list["show_net"] )
|
||||
displayedNetworks.Add(href_list["show_net"])
|
||||
updateDialog()
|
||||
|
||||
if( href_list["hide_net"] )
|
||||
if(href_list["hide_net"] in displayedNetworks)
|
||||
displayedNetworks.Remove(href_list["hide_net"])
|
||||
updateDialog()
|
||||
|
||||
if( href_list["toggle_id"] )
|
||||
var/idTag = href_list["toggle_id"]
|
||||
for(var/net in connected_doors)
|
||||
for(var/obj/machinery/door/poddoor/D in connected_doors[net])
|
||||
if(D.id == idTag)
|
||||
if(D.density)
|
||||
D.open()
|
||||
else
|
||||
D.close()
|
||||
break
|
||||
|
||||
if( href_list["open_net"] )
|
||||
var/netTag = href_list["open_net"]
|
||||
for(var/obj/machinery/door/poddoor/D in connected_doors[netTag])
|
||||
if(D.density) //for some reason, there's no var saying whether the door is open or not >.>
|
||||
spawn(0)
|
||||
D.open()
|
||||
|
||||
if( href_list["close_net"] )
|
||||
var/netTag = href_list["close_net"]
|
||||
for(var/obj/machinery/door/poddoor/D in connected_doors[netTag])
|
||||
if(!D.density)
|
||||
spawn(0)
|
||||
D.close()
|
||||
|
||||
src.updateDialog()
|
||||
@@ -3,10 +3,11 @@
|
||||
/obj/machinery/computer/med_data//TODO:SANITY
|
||||
name = "medical records console"
|
||||
desc = "Used to view, edit and maintain medical records."
|
||||
icon_state = "medcomp"
|
||||
icon_keyboard = "med_key"
|
||||
icon_screen = "medcomp"
|
||||
light_color = "#315ab4"
|
||||
req_one_access = list(access_medical, access_forensics_lockers)
|
||||
circuit = "/obj/item/weapon/circuitboard/med_data"
|
||||
circuit = /obj/item/weapon/circuitboard/med_data
|
||||
var/obj/item/weapon/card/id/scan = null
|
||||
var/authenticated = null
|
||||
var/rank = null
|
||||
@@ -551,5 +552,7 @@
|
||||
|
||||
/obj/machinery/computer/med_data/laptop
|
||||
name = "Medical Laptop"
|
||||
desc = "Cheap Nanotrasen Laptop."
|
||||
icon_state = "medlaptop"
|
||||
desc = "A cheap laptop."
|
||||
icon_state = "laptop"
|
||||
icon_keyboard = "laptop_key"
|
||||
icon_screen = "medlaptop"
|
||||
|
||||
@@ -3,11 +3,10 @@
|
||||
/obj/machinery/computer/message_monitor
|
||||
name = "messaging monitor console"
|
||||
desc = "Used to access and maintain data on messaging servers. Allows you to view PDA and request console messages."
|
||||
icon_state = "comm_logs"
|
||||
icon_screen = "comm_logs"
|
||||
light_color = "#00b000"
|
||||
var/hack_icon = "comm_logsc"
|
||||
var/normal_icon = "comm_logs"
|
||||
circuit = "/obj/item/weapon/circuitboard/message_monitor"
|
||||
var/hack_icon = "error"
|
||||
circuit = /obj/item/weapon/circuitboard/message_monitor
|
||||
//Server linked to.
|
||||
var/obj/machinery/message_server/linkedServer = null
|
||||
//Sparks effect - For emag
|
||||
@@ -50,7 +49,6 @@
|
||||
// It'll take more time if there's more characters in the password..
|
||||
if(!emag && operable())
|
||||
if(!isnull(src.linkedServer))
|
||||
icon_state = hack_icon // An error screen I made in the computers.dmi
|
||||
emag = 1
|
||||
screen = 2
|
||||
spark_system.set_up(5, 0, src)
|
||||
@@ -61,18 +59,17 @@
|
||||
MK.info += "<br><br><font color='red'>£%@%(*$%&(£&?*(%&£/{}</font>"
|
||||
spawn(100*length(src.linkedServer.decryptkey)) UnmagConsole()
|
||||
message = rebootmsg
|
||||
update_icon()
|
||||
return 1
|
||||
else
|
||||
user << "<span class='notice'>A no server error appears on the screen.</span>"
|
||||
|
||||
/obj/machinery/computer/message_monitor/update_icon()
|
||||
..()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(emag || hacking)
|
||||
icon_state = hack_icon
|
||||
icon_screen = hack_icon
|
||||
else
|
||||
icon_state = normal_icon
|
||||
icon_screen = initial(icon_screen)
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/message_monitor/initialize()
|
||||
//Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
|
||||
@@ -271,12 +268,12 @@
|
||||
var/currentKey = src.linkedServer.decryptkey
|
||||
user << "<span class='warning'>Brute-force completed! The key is '[currentKey]'.</span>"
|
||||
src.hacking = 0
|
||||
src.icon_state = normal_icon
|
||||
update_icon()
|
||||
src.screen = 0 // Return the screen back to normal
|
||||
|
||||
/obj/machinery/computer/message_monitor/proc/UnmagConsole()
|
||||
src.icon_state = normal_icon
|
||||
src.emag = 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/message_monitor/proc/ResetMessage()
|
||||
customsender = "System Administrator"
|
||||
@@ -368,7 +365,7 @@
|
||||
if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr))
|
||||
src.hacking = 1
|
||||
src.screen = 2
|
||||
src.icon_state = hack_icon
|
||||
update_icon()
|
||||
//Time it takes to bruteforce is dependant on the password length.
|
||||
spawn(100*length(src.linkedServer.decryptkey))
|
||||
if(src && src.linkedServer && usr)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/obj/machinery/computer/pod
|
||||
name = "pod launch control console"
|
||||
desc = "A control console for launching pods. Some people prefer firing Mechas."
|
||||
icon_state = "computer_generic"
|
||||
icon_screen = "mass_driver"
|
||||
light_color = "#00b000"
|
||||
circuit = /obj/item/weapon/circuitboard/pod
|
||||
var/id = 1.0
|
||||
@@ -194,7 +194,9 @@
|
||||
|
||||
|
||||
/obj/machinery/computer/pod/old
|
||||
icon_state = "old"
|
||||
icon_state = "oldcomp"
|
||||
icon_keyboard = null
|
||||
icon_screen = "library"
|
||||
name = "DoorMex Control Computer"
|
||||
title = "Door Controls"
|
||||
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
/obj/machinery/computer/prisoner
|
||||
name = "prisoner management console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "explosive"
|
||||
icon_keyboard = "security_key"
|
||||
icon_screen = "explosive"
|
||||
light_color = "#a91515"
|
||||
req_access = list(access_armory)
|
||||
circuit = "/obj/item/weapon/circuitboard/prisoner"
|
||||
circuit = /obj/item/weapon/circuitboard/prisoner
|
||||
var/id = 0.0
|
||||
var/temp = null
|
||||
var/status = 0
|
||||
|
||||
@@ -13,10 +13,11 @@ var/prison_shuttle_timeleft = 0
|
||||
/obj/machinery/computer/prison_shuttle
|
||||
name = "prison shuttle control console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
icon_keyboard = "security_key"
|
||||
icon_screen = "syndishuttle"
|
||||
light_color = "#00ffff"
|
||||
req_access = list(access_security)
|
||||
circuit = "/obj/item/weapon/circuitboard/prison_shuttle"
|
||||
circuit = /obj/item/weapon/circuitboard/prison_shuttle
|
||||
var/temp = null
|
||||
var/hacked = 0
|
||||
var/allowedtocall = 0
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
name = "robotics control console"
|
||||
desc = "Used to remotely lockdown or detonate linked cyborgs."
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "robot"
|
||||
icon_keyboard = "tech_key"
|
||||
icon_screen = "robot"
|
||||
light_color = "#a97faa"
|
||||
req_access = list(access_robotics)
|
||||
circuit = "/obj/item/weapon/circuitboard/robotics"
|
||||
circuit = /obj/item/weapon/circuitboard/robotics
|
||||
|
||||
var/safety = 1
|
||||
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
/obj/machinery/computer/secure_data//TODO:SANITY
|
||||
name = "security records console"
|
||||
desc = "Used to view, edit and maintain security records"
|
||||
icon_state = "security"
|
||||
icon_keyboard = "security_key"
|
||||
icon_screen = "security"
|
||||
light_color = "#a91515"
|
||||
req_one_access = list(access_security, access_forensics_lockers, access_lawyer)
|
||||
circuit = "/obj/item/weapon/circuitboard/secure_data"
|
||||
circuit = /obj/item/weapon/circuitboard/secure_data
|
||||
var/obj/item/weapon/card/id/scan = null
|
||||
var/authenticated = null
|
||||
var/rank = null
|
||||
@@ -411,11 +412,11 @@ What a mess.*/
|
||||
//RECORD CREATE
|
||||
if ("New Record (Security)")
|
||||
if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
|
||||
active2 = CreateSecurityRecord(active1.fields["name"], active1.fields["id"])
|
||||
active2 = data_core.CreateSecurityRecord(active1.fields["name"], active1.fields["id"])
|
||||
screen = 3
|
||||
|
||||
if ("New Record (General)")
|
||||
active1 = CreateGeneralRecord()
|
||||
active1 = data_core.CreateGeneralRecord()
|
||||
active2 = null
|
||||
|
||||
//FIELD FUNCTIONS
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
/obj/machinery/computer/shuttle
|
||||
name = "Shuttle"
|
||||
desc = "For shuttle control."
|
||||
icon_state = "shuttle"
|
||||
icon_keyboard = "tech_key"
|
||||
icon_screen = "shuttle"
|
||||
light_color = "#00ffff"
|
||||
var/auth_need = 3.0
|
||||
var/list/authorized = list( )
|
||||
|
||||
@@ -3,10 +3,12 @@
|
||||
/obj/machinery/computer/skills//TODO:SANITY
|
||||
name = "employment records console"
|
||||
desc = "Used to view, edit and maintain employment records."
|
||||
icon_state = "medlaptop"
|
||||
icon_state = "laptop"
|
||||
icon_keyboard = "laptop_key"
|
||||
icon_screen = "medlaptop"
|
||||
light_color = "#00b000"
|
||||
req_one_access = list(access_heads)
|
||||
circuit = "/obj/item/weapon/circuitboard/skills"
|
||||
circuit = /obj/item/weapon/circuitboard/skills
|
||||
var/obj/item/weapon/card/id/scan = null
|
||||
var/authenticated = null
|
||||
var/rank = null
|
||||
@@ -22,7 +24,6 @@
|
||||
var/sortBy = "name"
|
||||
var/order = 1 // -1 = Descending - 1 = Ascending
|
||||
|
||||
|
||||
/obj/machinery/computer/skills/attackby(obj/item/O as obj, user as mob)
|
||||
if(istype(O, /obj/item/weapon/card/id) && !scan)
|
||||
usr.drop_item()
|
||||
@@ -302,7 +303,7 @@ What a mess.*/
|
||||
if ("New Record (General)")
|
||||
if(PDA_Manifest.len)
|
||||
PDA_Manifest.Cut()
|
||||
active1 = CreateGeneralRecord()
|
||||
active1 = data_core.CreateGeneralRecord()
|
||||
|
||||
//FIELD FUNCTIONS
|
||||
if ("Edit Field")
|
||||
|
||||
@@ -14,7 +14,8 @@ var/specops_shuttle_timeleft = 0
|
||||
/obj/machinery/computer/specops_shuttle
|
||||
name = "special operations shuttle control console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
icon_keyboard = "security_key"
|
||||
icon_screen = "syndishuttle"
|
||||
light_color = "#00ffff"
|
||||
req_access = list(access_cent_specops)
|
||||
// req_access = list(ACCESS_CENT_SPECOPS)
|
||||
@@ -88,7 +89,7 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
for(var/turf/T in get_area_turfs(end_location) )
|
||||
var/mob/M = locate(/mob) in T
|
||||
M << "<span class='notice'>You have arrived at Central Command. Operation has ended!</span>"
|
||||
M << "<span class='notice'>You have arrived at [boss_name]. Operation has ended!</span>"
|
||||
|
||||
specops_shuttle_at_station = 0
|
||||
|
||||
@@ -285,14 +286,14 @@ var/specops_shuttle_timeleft = 0
|
||||
if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
if (!specops_can_move())
|
||||
usr << "<span class='notice'>Central Command will not allow the Special Operations shuttle to return yet.</span>"
|
||||
usr << "<span class='notice'>[boss_name] will not allow the Special Operations shuttle to return yet.</span>"
|
||||
if(world.timeofday <= specops_shuttle_timereset)
|
||||
if (((world.timeofday - specops_shuttle_timereset)/10) > 60)
|
||||
usr << "<span class='notice'>[-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!</span>"
|
||||
usr << "<span class='notice'>[-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!</span>"
|
||||
return
|
||||
|
||||
usr << "<span class='notice'>The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds.</span>"
|
||||
usr << "<span class='notice'>The Special Operations shuttle will arrive at [boss_name] in [(SPECOPS_MOVETIME/10)] seconds.</span>"
|
||||
|
||||
temp += "Shuttle departing.<BR><BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
/obj/machinery/computer/station_alert
|
||||
name = "Station Alert Console"
|
||||
desc = "Used to access the station's automated alert system."
|
||||
icon_state = "alert:0"
|
||||
icon_keyboard = "tech_key"
|
||||
icon_screen = "alert:0"
|
||||
light_color = "#e6ffff"
|
||||
circuit = /obj/item/weapon/circuitboard/stationalert_engineering
|
||||
var/datum/nano_module/alarm_monitor/alarm_monitor
|
||||
@@ -44,13 +45,10 @@
|
||||
alarm_monitor.ui_interact(user)
|
||||
|
||||
/obj/machinery/computer/station_alert/update_icon()
|
||||
if(!(stat & (BROKEN|NOPOWER)))
|
||||
var/list/alarms = alarm_monitor.major_alarms()
|
||||
if(alarms.len)
|
||||
icon_screen = "alert:2"
|
||||
else
|
||||
icon_screen = initial(icon_screen)
|
||||
..()
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
var/list/alarms = alarm_monitor.major_alarms()
|
||||
if(alarms.len)
|
||||
icon_state = "alert:2"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
return
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
/obj/machinery/computer/supplycomp
|
||||
name = "supply control console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "supply"
|
||||
icon_keyboard = "tech_key"
|
||||
icon_screen = "supply"
|
||||
light_color = "#b88b2e"
|
||||
req_access = list(access_cargo)
|
||||
circuit = "/obj/item/weapon/circuitboard/supplycomp"
|
||||
circuit = /obj/item/weapon/circuitboard/supplycomp
|
||||
var/temp = null
|
||||
var/reqtime = 0 //Cooldown for requisitions - Quarxink
|
||||
var/hacked = 0
|
||||
@@ -14,8 +15,8 @@
|
||||
/obj/machinery/computer/ordercomp
|
||||
name = "supply ordering console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "request"
|
||||
circuit = "/obj/item/weapon/circuitboard/ordercomp"
|
||||
icon_screen = "request"
|
||||
circuit = /obj/item/weapon/circuitboard/ordercomp
|
||||
var/temp = null
|
||||
var/reqtime = 0 //Cooldown for requisitions - Quarxink
|
||||
var/last_viewed_group = "categories"
|
||||
|
||||
@@ -13,7 +13,8 @@ var/syndicate_elite_shuttle_timeleft = 0
|
||||
/obj/machinery/computer/syndicate_elite_shuttle
|
||||
name = "elite syndicate squad shuttle control console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
icon_screen = "syndishuttle"
|
||||
light_color = "#00ffff"
|
||||
req_access = list(access_cent_specops)
|
||||
var/temp = null
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user