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:
Neerti
2015-08-23 01:30:46 -04:00
792 changed files with 19715 additions and 17049 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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")

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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++)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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)

View File

@@ -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)

View File

@@ -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>)")

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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 : ""

View File

@@ -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

View File

@@ -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")

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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")

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -18,7 +18,7 @@
Beacon.invisibility = INVISIBILITY_MAXIMUM
Beacon.loc = T
hide(T.intact)
hide(!T.is_plating())
Destroy()
if(Beacon)

View File

@@ -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)

View File

@@ -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: []&deg;C ([]&deg;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]."

View File

@@ -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

View File

@@ -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

View File

@@ -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 = ""

View File

@@ -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)]&deg;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()

View File

@@ -102,6 +102,7 @@
//ran out of charge
if (!cell.charge)
power_change()
update_icon()
src.updateDialog()

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -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>
"}

View File

@@ -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..()

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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(..())

View File

@@ -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)

View File

@@ -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

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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()
..()

View File

@@ -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)

View File

@@ -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"

View File

@@ -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

View File

@@ -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()

View File

@@ -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"

View File

@@ -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)

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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( )

View File

@@ -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")

View File

@@ -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()

View File

@@ -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

View File

@@ -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"

View File

@@ -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