mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 02:16:05 +00:00
Reduced deathsquad marauder number to 3 (previously 4). Added some fluff to their launch sequence.
Revisions to CentCom. CentCom now has its own access levels set, and a unique ID changing computer. Added nasa void suit and captain armor to item steal list. Fixed some run time errors for hand-tele from my previous commit. Removed the remove poo and urine button from secrets. Decoy AIs can now say stuff like regular AIs. This is useful if you need a non-player announcer for something, while taking into account talk_understand and the like. I use it for deathsquad shuttle announcements. I've placed A.L.I.C.E. on CentCom for such reasons. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1704 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
invocation = "GIN'YU CAPAN"
|
||||
invocation_type = "whisper"
|
||||
range = 7
|
||||
var/list/protected_roles = list("Wizard","Fake Wizard","Changeling","Cultist") //which roles are immune to the spell
|
||||
var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell
|
||||
var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) //which types of mobs are affected by the spell. NOTE: change at your own risk
|
||||
var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process
|
||||
var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included)
|
||||
|
||||
@@ -230,9 +230,12 @@ proc/process_ghost_teleport_locs()
|
||||
|
||||
/area/centcom
|
||||
name = "Centcom"
|
||||
icon_state = "purple"
|
||||
icon_state = "centcom"
|
||||
requires_power = 0
|
||||
|
||||
/area/centcom/control
|
||||
name = "Centcom Control"
|
||||
|
||||
/area/centcom/evac
|
||||
name = "Centcom Emergency Shuttle"
|
||||
|
||||
@@ -279,7 +282,7 @@ proc/process_ghost_teleport_locs()
|
||||
|
||||
/area/tdome
|
||||
name = "Thunderdome"
|
||||
icon_state = "medbay"
|
||||
icon_state = "thunder"
|
||||
requires_power = 0
|
||||
|
||||
/area/tdome/tdome1
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/living/silicon/ai
|
||||
name = "AI"
|
||||
voice_name = "synthesized voice"
|
||||
icon = 'mob.dmi'//
|
||||
icon_state = "ai"
|
||||
anchored = 1 // -- TLE
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/living/silicon/decoy
|
||||
name = "AI"
|
||||
voice_name = "synthesized voice"
|
||||
icon = 'mob.dmi'//
|
||||
icon_state = "ai"
|
||||
anchored = 1 // -- TLE
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/living/silicon/hivebot
|
||||
name = "Robot"
|
||||
voice_name = "synthesized voice"
|
||||
icon = 'hivebot.dmi'
|
||||
icon_state = "basic"
|
||||
health = 80
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/living/silicon/pai
|
||||
name = "pAI"
|
||||
voice_name = "synthesized voice"
|
||||
icon = 'mob.dmi'//
|
||||
icon_state = "shadow"
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/living/silicon/robot
|
||||
name = "Robot"
|
||||
voice_name = "synthesized voice"
|
||||
icon = 'robots.dmi'//
|
||||
icon_state = "robot"
|
||||
health = 300
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/mob/living/silicon
|
||||
gender = NEUTER
|
||||
robot_talk_understand = 1
|
||||
voice_name = "synthesized voice"
|
||||
var/syndicate = 0
|
||||
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
|
||||
@@ -85,6 +85,11 @@
|
||||
var/printing = null
|
||||
req_access = list(access_change_ids)
|
||||
|
||||
//ID changing computer for CentCom.
|
||||
/obj/machinery/computer/card/centcom
|
||||
name = "CentCom Identification Computer"
|
||||
req_access = list(access_cent_captain)
|
||||
|
||||
/obj/machinery/computer/communications
|
||||
name = "Communications Console"
|
||||
icon_state = "comm"
|
||||
|
||||
@@ -414,6 +414,15 @@
|
||||
access = get_access("Captain")
|
||||
..()
|
||||
|
||||
/obj/item/weapon/card/id/centcom
|
||||
name = "CentCom ID"
|
||||
icon_state = "centcom"
|
||||
registered = "Central Command"
|
||||
assignment = "General"
|
||||
New()
|
||||
access = get_all_centcom_access()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/cleaner
|
||||
desc = "Space Cleaner!"
|
||||
icon = 'janitor.dmi'
|
||||
|
||||
@@ -149,6 +149,20 @@
|
||||
a.cancelAlarm("Fire", src, src)
|
||||
return
|
||||
|
||||
/area/proc/readyalert()
|
||||
if(name == "Space")
|
||||
return
|
||||
if(!eject)
|
||||
eject = 1
|
||||
updateicon()
|
||||
return
|
||||
|
||||
/area/proc/readyreset()
|
||||
if(eject)
|
||||
eject = 0
|
||||
updateicon()
|
||||
return
|
||||
|
||||
/area/proc/partyalert()
|
||||
if(src.name == "Space") //no parties in space!!!
|
||||
return
|
||||
@@ -173,7 +187,7 @@
|
||||
return
|
||||
|
||||
/area/proc/updateicon()
|
||||
if ((fire || eject || party) && power_environ)
|
||||
if ((fire || eject || party) && ((!requires_power)?(!requires_power):power_environ))//If it doesn't require power, can still activate this proc.
|
||||
if(fire && !eject && !party)
|
||||
icon_state = "blue"
|
||||
/*else if(atmosalm && !fire && !eject && !party)
|
||||
|
||||
@@ -88,7 +88,7 @@ ________________________________________________________________________________
|
||||
/*
|
||||
Also a dynamic ninja mission generator.
|
||||
I decided to scrap round-specific objectives since keeping track of them would require some form of tracking.
|
||||
When I already created about 4 new objectives, this doesn't terribly important or needed.
|
||||
When I already created about 4 new objectives, this doesn't seem terribly important or needed.
|
||||
*/
|
||||
|
||||
/var/global/toggle_space_ninja = 1//If ninjas can spawn or not.
|
||||
@@ -156,7 +156,8 @@ Not to mention that Malfunction does not use declare_completion (at least, not i
|
||||
With that said, a ninja on the side of the station would murder the AI very quickly--and the rounds usually
|
||||
last long enough for the ninja to appear, too.
|
||||
|
||||
if ("malfunction")//Only one malf AI. //not only one anymore. --rastaf0
|
||||
//not only one anymore. --rastaf0
|
||||
if ("malfunction")
|
||||
if(current_mode:malf_ai)
|
||||
antagonist_list += current_mode:malf_ai
|
||||
*/
|
||||
@@ -331,17 +332,13 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob
|
||||
|
||||
if(!ninja_mind.objectives.len||!mission_set)//If they somehow did not get an objective at this point, time to destroy the station.
|
||||
var/nuke_code
|
||||
if(current_mode.config_tag == "nuclear"||sent_strike_team)//If it's nuclear, there is a nuke with a code already set. Or if commandos were sent in.
|
||||
var/temp_code
|
||||
for(var/obj/machinery/nuclearbomb/N in world)
|
||||
temp_code = text2num(N.r_code)
|
||||
if(temp_code)//if it's actually a number. It won't convert any non-numericals.
|
||||
nuke_code = N.r_code
|
||||
break
|
||||
if(!nuke_code)//If there is still no code.
|
||||
nuke_code = "[rand(10000, 99999.0)]"
|
||||
for(var/obj/machinery/nuclearbomb/N in world)
|
||||
N.r_code = nuke_code
|
||||
if(nuke_code)//If there is a nuke device in world and we got the code.
|
||||
var/datum/objective/nuclear/ninja_objective = new//Fun.
|
||||
ninja_objective.owner = ninja_mind
|
||||
ninja_objective.explanation_text = "Destroy the station with a nuclear device. The code is [nuke_code]." //Let them know what the code is.
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
/obj/machinery/nuclearbomb/New()
|
||||
..()
|
||||
r_code = "[rand(10000, 99999.0)]"//Creates a random code upon object spawn.
|
||||
|
||||
/obj/machinery/nuclearbomb/process()
|
||||
if (src.timing)
|
||||
src.timeleft--
|
||||
@@ -172,8 +176,13 @@
|
||||
else
|
||||
world << "<B>The station was destoyed by the nuclear blast!</B>"
|
||||
ticker.mode.station_was_nuked = 1
|
||||
//TODO: derped blast should partially damage nearest objects
|
||||
// and do not reboot the game. Also make it work properly on other z-levels --rastaf0
|
||||
/*
|
||||
TODO: derped blast should partially damage nearest objects
|
||||
and do not reboot the game. Also make it work properly on other z-levels --rastaf0
|
||||
Further TODO: make nuke detonation work with objectives. Right now, you can't track player
|
||||
location because they are viewing the cinematic (can't get_turf on them to determine z_level
|
||||
as it will return null). Leaving this for you since you apparently plan to work this further. /N
|
||||
*/
|
||||
|
||||
ticker.mode.check_win()
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ datum
|
||||
check_completion()
|
||||
if(!target)//If it's a free objective.
|
||||
return 1
|
||||
if(!owner.current||owner.current.stat==2)//If they're dead.
|
||||
if(!owner.current||owner.current.stat==2)//If you're otherwise dead.
|
||||
return 0
|
||||
var/list/all_items = owner.current.get_contents()
|
||||
for(var/obj/item/device/mmi/mmi in all_items)
|
||||
@@ -172,14 +172,13 @@ datum
|
||||
return 0
|
||||
|
||||
survive
|
||||
explanation_text = "Stay alive until the end"
|
||||
explanation_text = "Stay alive until the end."
|
||||
|
||||
check_completion()
|
||||
if(issilicon(owner.current) && owner.current != owner.original)
|
||||
return 0
|
||||
if(!owner.current || owner.current.stat == 2)
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
nuclear
|
||||
@@ -195,11 +194,13 @@ datum
|
||||
"an RCD" = /obj/item/weapon/rcd,
|
||||
"a jetpack" = /obj/item/weapon/tank/jetpack,
|
||||
"a captains jumpsuit" = /obj/item/clothing/under/rank/captain,
|
||||
"the captain's armor" = /obj/item/clothing/suit/armor/captain,
|
||||
"functional ai" = /obj/item/device/aicard,
|
||||
"a pair of magboots" = /obj/item/clothing/shoes/magboots,
|
||||
"the station blueprints" = /obj/item/blueprints,
|
||||
"thermal optics" = /obj/item/clothing/glasses/thermal,
|
||||
"the engineers rig suit" = /obj/item/clothing/suit/space/rig,
|
||||
"a engineers rig suit" = /obj/item/clothing/suit/space/rig,
|
||||
"a nasa voidsuit" = /obj/item/clothing/suit/space/nasavoid,
|
||||
"28 moles of plasma (full tank)" = /obj/item/weapon/tank,
|
||||
)
|
||||
|
||||
|
||||
@@ -58,6 +58,19 @@
|
||||
access_hop = 57
|
||||
access_hos = 58
|
||||
|
||||
//BEGIN CENTCOM ACCESS
|
||||
/*Should leave plenty of room if we need to add more access levels.
|
||||
Mostly for admin fun times.*/
|
||||
access_cent_general = 101//General facilities.
|
||||
access_cent_thunder = 102//Thunderdome.
|
||||
access_cent_specops = 103//Special Ops.
|
||||
access_cent_medical = 104//Medical/Research
|
||||
access_cent_living = 105//Living quarters.
|
||||
access_cent_storage = 106//Generic storage areas.
|
||||
access_cent_teleporter = 107//Teleporter.
|
||||
access_cent_creed = 108//Creed's office.
|
||||
access_cent_captain = 109//Captain's office/ID comp/AI.
|
||||
|
||||
/obj/var/list/req_access = null
|
||||
/obj/var/req_access_txt = "0"
|
||||
/obj/New()
|
||||
@@ -191,6 +204,27 @@
|
||||
else
|
||||
return list()
|
||||
|
||||
/proc/get_centcom_access(job)
|
||||
switch(job)
|
||||
if("VIP Guest")
|
||||
return list(access_cent_general)
|
||||
if("Custodian")
|
||||
return list(access_cent_general, access_cent_living, access_cent_storage)
|
||||
if("Thunderdome Overseer")
|
||||
return list(access_cent_general, access_cent_thunder)
|
||||
if("Intel Officer")
|
||||
return list(access_cent_general, access_cent_living)
|
||||
if("Medical Officer")
|
||||
return list(access_cent_general, access_cent_living, access_cent_medical)
|
||||
if("Death Commando")
|
||||
return list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
|
||||
if("Research Officer")
|
||||
return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_teleporter, access_cent_storage)
|
||||
if("BlackOps Commander")
|
||||
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage, access_cent_creed)
|
||||
if("Supreme Commander")
|
||||
return get_all_centcom_access()
|
||||
|
||||
/proc/get_all_accesses()
|
||||
return list(access_security, access_brig, access_armory, access_forensics_lockers, access_court,
|
||||
access_medical, access_medlab, access_morgue, access_rd,
|
||||
@@ -203,6 +237,9 @@
|
||||
access_theatre, access_research, access_mining, access_mining_office, access_mailsorting, access_mint_vault, access_mint,
|
||||
access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos)
|
||||
|
||||
/proc/get_all_centcom_access()
|
||||
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain)
|
||||
|
||||
/proc/get_region_accesses(var/code)
|
||||
switch(code)
|
||||
if(0)
|
||||
@@ -359,6 +396,26 @@
|
||||
if(access_ce)
|
||||
return "CE Private"
|
||||
|
||||
/proc/get_centcom_access_desc(A)
|
||||
switch(A)
|
||||
if(access_cent_general)
|
||||
return "Code Grey"
|
||||
if(access_cent_thunder)
|
||||
return "Code Yellow"
|
||||
if(access_cent_storage)
|
||||
return "Code Orange"
|
||||
if(access_cent_living)
|
||||
return "Code Green"
|
||||
if(access_cent_medical)
|
||||
return "Code White"
|
||||
if(access_cent_teleporter)
|
||||
return "Code Blue"
|
||||
if(access_cent_specops)
|
||||
return "Code Black"
|
||||
if(access_cent_creed)
|
||||
return "Code Silver"
|
||||
if(access_cent_captain)
|
||||
return "Code Gold"
|
||||
|
||||
/proc/get_all_jobs()
|
||||
return list("Assistant", "Station Engineer", "Shaft Miner", "Detective", "Medical Doctor", "Captain", "Security Officer", "Warden",
|
||||
@@ -366,6 +423,9 @@
|
||||
"Chaplain", "Bartender", "Chemist", "Janitor", "Clown", "Mime", "Chef", "Roboticist", "Quartermaster",
|
||||
"Chief Engineer", "Research Director", "Botanist", "Librarian", "Lawyer", "Virologist", "Cargo Technician", "Chief Medical Officer")
|
||||
|
||||
/proc/get_all_centcom_jobs()
|
||||
return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander")
|
||||
|
||||
/obj/proc/GetJobName()
|
||||
if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id))
|
||||
return
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
/obj/item/weapon/circuitboard/card
|
||||
name = "Circuit board (ID Computer)"
|
||||
build_path = "/obj/machinery/computer/card"
|
||||
/obj/item/weapon/circuitboard/card/centcom
|
||||
name = "Circuit board (CentCom ID Computer)"
|
||||
build_path = "/obj/machinery/computer/card/centcom"
|
||||
//obj/item/weapon/circuitboard/shield
|
||||
// name = "Circuit board (Shield Control)"
|
||||
// build_path = "/obj/machinery/computer/stationshield"
|
||||
|
||||
@@ -12,8 +12,8 @@ Pod/Blast Doors computer
|
||||
power_change()
|
||||
|
||||
/obj/machinery/computer/meteorhit(var/obj/O as obj)
|
||||
for(var/x in src.verbs)
|
||||
src.verbs -= x
|
||||
for(var/x in verbs)
|
||||
verbs -= x
|
||||
set_broken()
|
||||
var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread()
|
||||
smoke.set_up(5, 0, src)
|
||||
@@ -34,31 +34,31 @@ Pod/Blast Doors computer
|
||||
del(src)
|
||||
return
|
||||
if (prob(50))
|
||||
for(var/x in src.verbs)
|
||||
src.verbs -= x
|
||||
for(var/x in verbs)
|
||||
verbs -= x
|
||||
set_broken()
|
||||
if(3.0)
|
||||
if (prob(25))
|
||||
for(var/x in src.verbs)
|
||||
src.verbs -= x
|
||||
for(var/x in verbs)
|
||||
verbs -= x
|
||||
set_broken()
|
||||
else
|
||||
return
|
||||
|
||||
/obj/machinery/computer/blob_act()
|
||||
if (prob(75))
|
||||
for(var/x in src.verbs)
|
||||
src.verbs -= x
|
||||
for(var/x in verbs)
|
||||
verbs -= x
|
||||
set_broken()
|
||||
src.density = 0
|
||||
density = 0
|
||||
|
||||
/obj/machinery/computer/power_change()
|
||||
if(!istype(src,/obj/machinery/computer/security/telescreen))
|
||||
if(stat & BROKEN)
|
||||
icon_state = initial(icon_state)
|
||||
src.icon_state += "b"
|
||||
icon_state += "b"
|
||||
if (istype(src,/obj/machinery/computer/aifixer))
|
||||
src.overlays = null
|
||||
overlays = null
|
||||
|
||||
else if(powered())
|
||||
icon_state = initial(icon_state)
|
||||
@@ -68,19 +68,19 @@ Pod/Blast Doors computer
|
||||
if (O.occupant)
|
||||
switch (O.occupant.stat)
|
||||
if (0)
|
||||
src.overlays += image('computer.dmi', "ai-fixer-full")
|
||||
overlays += image('computer.dmi', "ai-fixer-full")
|
||||
if (2)
|
||||
src.overlays += image('computer.dmi', "ai-fixer-404")
|
||||
overlays += image('computer.dmi', "ai-fixer-404")
|
||||
else
|
||||
src.overlays += image('computer.dmi', "ai-fixer-empty")
|
||||
overlays += image('computer.dmi', "ai-fixer-empty")
|
||||
else
|
||||
spawn(rand(0, 15))
|
||||
//src.icon_state = "c_unpowered"
|
||||
//icon_state = "c_unpowered"
|
||||
icon_state = initial(icon_state)
|
||||
src.icon_state += "0"
|
||||
icon_state += "0"
|
||||
stat |= NOPOWER
|
||||
if (istype(src,/obj/machinery/computer/aifixer))
|
||||
src.overlays = null
|
||||
overlays = null
|
||||
|
||||
/obj/machinery/computer/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
@@ -94,19 +94,19 @@ Pod/Blast Doors computer
|
||||
|
||||
/obj/machinery/computer/security/New()
|
||||
..()
|
||||
src.verbs -= /obj/machinery/computer/security/verb/station_map
|
||||
verbs -= /obj/machinery/computer/security/verb/station_map
|
||||
|
||||
/obj/machinery/computer/security/attackby(I as obj, user as mob)
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
|
||||
playsound(loc, 'Screwdriver.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
if (src.stat & BROKEN)
|
||||
if (stat & BROKEN)
|
||||
user << "\blue The broken glass falls out."
|
||||
var/obj/computerframe/A = new /obj/computerframe( src.loc )
|
||||
new /obj/item/weapon/shard( src.loc )
|
||||
var/obj/computerframe/A = new /obj/computerframe( loc )
|
||||
new /obj/item/weapon/shard( loc )
|
||||
var/obj/item/weapon/circuitboard/security/M = new /obj/item/weapon/circuitboard/security( A )
|
||||
for (var/obj/C in src)
|
||||
C.loc = src.loc
|
||||
C.loc = loc
|
||||
A.circuit = M
|
||||
A.state = 3
|
||||
A.icon_state = "3"
|
||||
@@ -114,38 +114,38 @@ Pod/Blast Doors computer
|
||||
del(src)
|
||||
else
|
||||
user << "\blue You disconnect the monitor."
|
||||
var/obj/computerframe/A = new /obj/computerframe( src.loc )
|
||||
var/obj/computerframe/A = new /obj/computerframe( loc )
|
||||
var/obj/item/weapon/circuitboard/security/M = new /obj/item/weapon/circuitboard/security( A )
|
||||
for (var/obj/C in src)
|
||||
C.loc = src.loc
|
||||
C.loc = loc
|
||||
A.circuit = M
|
||||
A.state = 4
|
||||
A.icon_state = "4"
|
||||
A.anchored = 1
|
||||
del(src)
|
||||
else
|
||||
src.attack_hand(user)
|
||||
attack_hand(user)
|
||||
return
|
||||
|
||||
/obj/machinery/computer/security/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/security/attack_paw(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/security/check_eye(var/mob/user as mob)
|
||||
if ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded || !( src.current ) || !( src.current.status )) && (!istype(user, /mob/living/silicon)))
|
||||
if ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded || !( current ) || !( current.status )) && (!istype(user, /mob/living/silicon)))
|
||||
return null
|
||||
user.reset_view(src.current)
|
||||
user.reset_view(current)
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
/obj/machinery/computer/card/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/card/attack_paw(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/card/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
@@ -155,59 +155,66 @@ Pod/Blast Doors computer
|
||||
var/dat
|
||||
if (!( ticker ))
|
||||
return
|
||||
if (src.mode) // accessing crew manifest
|
||||
if (mode) // accessing crew manifest
|
||||
var/crew = ""
|
||||
for(var/datum/data/record/t in data_core.general)
|
||||
crew += "[t.fields["name"]] - [t.fields["rank"]]<br>"
|
||||
dat = "<tt><b>Crew Manifest:</b><br>Please use security record computer to modify entries.<br>[crew]<a href='?src=\ref[src];print=1'>Print</a><br><br><a href='?src=\ref[src];mode=0'>Access ID modification console.</a><br></tt>"
|
||||
dat = "<tt><b>Crew Manifest:</b><br>Please use security record computer to modify entries.<br>[crew]<a href='?src=\ref[src];choice=print'>Print</a><br><br><a href='?src=\ref[src];choice=mode;mode_target=0'>Access ID modification console.</a><br></tt>"
|
||||
else
|
||||
var/header = "<b>Identification Card Modifier</b><br><i>Please insert the cards into the slots</i><br>"
|
||||
|
||||
var/target_name
|
||||
var/target_owner
|
||||
var/target_rank
|
||||
if(src.modify)
|
||||
target_name = src.modify.name
|
||||
if(modify)
|
||||
target_name = modify.name
|
||||
else
|
||||
target_name = "--------"
|
||||
if(src.modify && src.modify.registered)
|
||||
target_owner = src.modify.registered
|
||||
if(modify && modify.registered)
|
||||
target_owner = modify.registered
|
||||
else
|
||||
target_owner = "--------"
|
||||
if(src.modify && src.modify.assignment)
|
||||
target_rank = src.modify.assignment
|
||||
if(modify && modify.assignment)
|
||||
target_rank = modify.assignment
|
||||
else
|
||||
target_rank = "Unassigned"
|
||||
header += "Target: <a href='?src=\ref[src];modify=1'>[target_name]</a><br>"
|
||||
header += "Target: <a href='?src=\ref[src];choice=modify'>[target_name]</a><br>"
|
||||
|
||||
var/scan_name
|
||||
if(src.scan)
|
||||
scan_name = src.scan.name
|
||||
if(scan)
|
||||
scan_name = scan.name
|
||||
else
|
||||
scan_name = "--------"
|
||||
header += "Confirm Identity: <a href='?src=\ref[src];scan=1'>[scan_name]</a><br>"
|
||||
header += "Confirm Identity: <a href='?src=\ref[src];choice=scan'>[scan_name]</a><br>"
|
||||
header += "<hr>"
|
||||
var/body
|
||||
if (src.authenticated && src.modify)
|
||||
var/carddesc = "Registered: <a href='?src=\ref[src];reg=1'>[target_owner]</a><br>Assignment: [target_rank]"
|
||||
var/list/alljobs = get_all_jobs() + "Custom"
|
||||
if (authenticated && modify)
|
||||
var/carddesc = "Registered: <a href='?src=\ref[src];choice=reg'>[target_owner]</a><br>Assignment: [target_rank]"
|
||||
var/jobs = ""
|
||||
var/list/alljobs = (istype(src,/obj/machinery/computer/card/centcom)? get_all_centcom_jobs() : get_all_jobs()) + "Custom"
|
||||
for(var/job in alljobs)
|
||||
jobs += "<a href='?src=\ref[src];assign=[job]'>[dd_replacetext(job, " ", " ")]</a> " //make sure there isn't a line break in the middle of a job
|
||||
jobs += "<a href='?src=\ref[src];choice=assign;assign_target=[job]'>[dd_replacetext(job, " ", " ")]</a> " //make sure there isn't a line break in the middle of a job
|
||||
var/accesses = ""
|
||||
var/i
|
||||
for(i = 1; i <= 7; i++)
|
||||
if(istype(src,/obj/machinery/computer/card/centcom))
|
||||
accesses += "<h5>Central Command:</h5>"
|
||||
for(var/A in get_all_centcom_access())
|
||||
if(A in modify.access)
|
||||
accesses += "<a href='?src=\ref[src];choice=access;access_target=[A];allowed=0'><font color=\"red\">[dd_replacetext(get_centcom_access_desc(A), " ", " ")]</font></a> "
|
||||
else
|
||||
accesses += "<a href='?src=\ref[src];choice=access;access_target=[A];allowed=1'>[dd_replacetext(get_centcom_access_desc(A), " ", " ")]</a> "
|
||||
else
|
||||
for(var/i = 1; i <= 7; i++)
|
||||
accesses += "<b>[get_region_accesses_name(i)]:</b> "
|
||||
for(var/A in get_region_accesses(i))
|
||||
if(A in src.modify.access)
|
||||
accesses += "<a href='?src=\ref[src];access=[A];allowed=0'><font color=\"red\">[dd_replacetext(get_access_desc(A), " ", " ")]</font></a> "
|
||||
if(A in modify.access)
|
||||
accesses += "<a href='?src=\ref[src];choice=access;access_target=[A];allowed=0'><font color=\"red\">[dd_replacetext(get_access_desc(A), " ", " ")]</font></a> "
|
||||
else
|
||||
accesses += "<a href='?src=\ref[src];access=[A];allowed=1'>[dd_replacetext(get_access_desc(A), " ", " ")]</a> "
|
||||
accesses += "<a href='?src=\ref[src];choice=access;access_target=[A];allowed=1'>[dd_replacetext(get_access_desc(A), " ", " ")]</a> "
|
||||
accesses += "<br>"
|
||||
body = "[carddesc]<br>[jobs]<br><br>[accesses]"
|
||||
else
|
||||
body = "<a href='?src=\ref[src];auth=1'>{Log in}</a>"
|
||||
dat = "<tt>[header][body]<hr><a href='?src=\ref[src];mode=1'>Access Crew Manifest</a><br></tt>"
|
||||
body = "<a href='?src=\ref[src];choice=auth'>{Log in}</a>"
|
||||
dat = "<tt>[header][body]<hr><a href='?src=\ref[src];choice=mode;mode_target=1'>Access Crew Manifest</a><br></tt>"
|
||||
user << browse(dat, "window=id_com;size=700x520")
|
||||
onclose(user, "id_com")
|
||||
return
|
||||
@@ -216,90 +223,90 @@ Pod/Blast Doors computer
|
||||
if(..())
|
||||
return
|
||||
usr.machine = src
|
||||
if (href_list["modify"])
|
||||
if (src.modify)
|
||||
src.modify.name = text("[]'s ID Card ([])", src.modify.registered, src.modify.assignment)
|
||||
src.modify.loc = src.loc
|
||||
src.modify = null
|
||||
switch(href_list["choice"])
|
||||
if ("modify")
|
||||
if (modify)
|
||||
modify.name = text("[]'s ID Card ([])", modify.registered, modify.assignment)
|
||||
modify.loc = loc
|
||||
modify = null
|
||||
else
|
||||
var/obj/item/I = usr.equipped()
|
||||
if (istype(I, /obj/item/weapon/card/id))
|
||||
usr.drop_item()
|
||||
I.loc = src
|
||||
src.modify = I
|
||||
src.authenticated = 0
|
||||
if (href_list["scan"])
|
||||
if (src.scan)
|
||||
src.scan.loc = src.loc
|
||||
src.scan = null
|
||||
modify = I
|
||||
authenticated = 0
|
||||
if ("scan")
|
||||
if (scan)
|
||||
scan.loc = loc
|
||||
scan = null
|
||||
else
|
||||
var/obj/item/I = usr.equipped()
|
||||
if (istype(I, /obj/item/weapon/card/id))
|
||||
usr.drop_item()
|
||||
I.loc = src
|
||||
src.scan = I
|
||||
src.authenticated = 0
|
||||
if (href_list["auth"])
|
||||
if ((!( src.authenticated ) && (src.scan || (istype(usr, /mob/living/silicon))) && (src.modify || src.mode)))
|
||||
if (src.check_access(src.scan))
|
||||
src.authenticated = 1
|
||||
else if ((!( src.authenticated ) && (istype(usr, /mob/living/silicon))) && (!src.modify))
|
||||
scan = I
|
||||
authenticated = 0
|
||||
if ("auth")
|
||||
if ((!( authenticated ) && (scan || (istype(usr, /mob/living/silicon))) && (modify || mode)))
|
||||
if (check_access(scan))
|
||||
authenticated = 1
|
||||
else if ((!( authenticated ) && (istype(usr, /mob/living/silicon))) && (!modify))
|
||||
usr << "You can't modify an ID without an ID inserted to modify. Once one is in the modify slot on the computer, you can log in."
|
||||
if(href_list["access"] && href_list["allowed"])
|
||||
if(src.authenticated)
|
||||
var/access_type = text2num(href_list["access"])
|
||||
if("access")
|
||||
if(href_list["allowed"])
|
||||
if(authenticated)
|
||||
var/access_type = text2num(href_list["access_target"])
|
||||
var/access_allowed = text2num(href_list["allowed"])
|
||||
if(access_type in get_all_accesses())
|
||||
src.modify.access -= access_type
|
||||
if(access_type in (istype(src,/obj/machinery/computer/card/centcom)?get_all_centcom_access() : get_all_accesses()))
|
||||
modify.access -= access_type
|
||||
if(access_allowed == 1)
|
||||
src.modify.access += access_type
|
||||
if (href_list["assign"])
|
||||
if (src.authenticated)
|
||||
var/t1 = href_list["assign"]
|
||||
modify.access += access_type
|
||||
if ("assign")
|
||||
if (authenticated)
|
||||
var/t1 = href_list["assign_target"]
|
||||
if(t1 == "Custom")
|
||||
t1 = input("Enter a custom job assignment.","Assignment")
|
||||
else
|
||||
src.modify.access = get_access(t1)
|
||||
if (src.modify)
|
||||
src.modify.assignment = t1
|
||||
if (href_list["reg"])
|
||||
if (src.authenticated)
|
||||
var/t2 = src.modify
|
||||
modify.access = ( istype(src,/obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : get_access(t1) )
|
||||
if (modify)
|
||||
modify.assignment = t1
|
||||
if ("reg")
|
||||
if (authenticated)
|
||||
var/t2 = modify
|
||||
var/t1 = input(usr, "What name?", "ID computer", null) as text
|
||||
if ((src.authenticated && src.modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(src.loc, /turf)))
|
||||
src.modify.registered = t1
|
||||
if (href_list["mode"])
|
||||
src.mode = text2num(href_list["mode"])
|
||||
if (href_list["print"])
|
||||
if (!( src.printing ))
|
||||
src.printing = 1
|
||||
if ((authenticated && modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
|
||||
modify.registered = t1
|
||||
if ("mode")
|
||||
mode = text2num(href_list["mode_target"])
|
||||
if ("print")
|
||||
if (!( printing ))
|
||||
printing = 1
|
||||
sleep(50)
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
|
||||
var/t1 = "<B>Crew Manifest:</B><BR>"
|
||||
for(var/datum/data/record/t in data_core.general)
|
||||
t1 += "<B>[t.fields["name"]]</B> - [t.fields["rank"]]<BR>"
|
||||
P.info = t1
|
||||
P.name = "paper- 'Crew Manifest'"
|
||||
src.printing = null
|
||||
if (href_list["mode"])
|
||||
src.authenticated = 0
|
||||
src.mode = text2num(href_list["mode"])
|
||||
if (src.modify)
|
||||
src.modify.name = text("[]'s ID Card ([])", src.modify.registered, src.modify.assignment)
|
||||
src.updateUsrDialog()
|
||||
printing = null
|
||||
if (modify)
|
||||
modify.name = text("[]'s ID Card ([])", modify.registered, modify.assignment)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/card/attackby(I as obj, user as mob)
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
|
||||
playsound(loc, 'Screwdriver.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
if (src.stat & BROKEN)
|
||||
var/card_path = text2path("/obj/item/weapon/circuitboard/card[istype(src,/obj/machinery/computer/card/centcom)?"/centcom":""]")
|
||||
if (stat & BROKEN)
|
||||
user << "\blue The broken glass falls out."
|
||||
var/obj/computerframe/A = new /obj/computerframe( src.loc )
|
||||
new /obj/item/weapon/shard( src.loc )
|
||||
var/obj/item/weapon/circuitboard/card/M = new /obj/item/weapon/circuitboard/card( A )
|
||||
var/obj/computerframe/A = new /obj/computerframe( loc )
|
||||
new /obj/item/weapon/shard( loc )
|
||||
var/obj/item/weapon/circuitboard/card/M = new card_path( A )
|
||||
for (var/obj/C in src)
|
||||
C.loc = src.loc
|
||||
C.loc = loc
|
||||
A.circuit = M
|
||||
A.state = 3
|
||||
A.icon_state = "3"
|
||||
@@ -307,17 +314,17 @@ Pod/Blast Doors computer
|
||||
del(src)
|
||||
else
|
||||
user << "\blue You disconnect the monitor."
|
||||
var/obj/computerframe/A = new /obj/computerframe( src.loc )
|
||||
var/obj/item/weapon/circuitboard/card/M = new /obj/item/weapon/circuitboard/card( A )
|
||||
var/obj/computerframe/A = new /obj/computerframe( loc )
|
||||
var/obj/item/weapon/circuitboard/card/M = new card_path( A )
|
||||
for (var/obj/C in src)
|
||||
C.loc = src.loc
|
||||
C.loc = loc
|
||||
A.circuit = M
|
||||
A.state = 4
|
||||
A.icon_state = "4"
|
||||
A.anchored = 1
|
||||
del(src)
|
||||
else
|
||||
src.attack_hand(user)
|
||||
attack_hand(user)
|
||||
return
|
||||
|
||||
/obj/datacore/proc/manifest()
|
||||
@@ -386,26 +393,26 @@ Pod/Blast Doors computer
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
if (!( src.connected ))
|
||||
if (!( connected ))
|
||||
viewers(null, null) << "Cannot locate mass driver connector. Cancelling firing sequence!"
|
||||
return
|
||||
|
||||
for(var/obj/machinery/door/poddoor/M in machines)
|
||||
if (M.id == src.id)
|
||||
if (M.id == id)
|
||||
spawn( 0 )
|
||||
M.open()
|
||||
return
|
||||
sleep(20)
|
||||
|
||||
//src.connected.drive() *****RM from 40.93.3S
|
||||
//connected.drive() *****RM from 40.93.3S
|
||||
for(var/obj/machinery/mass_driver/M in machines)
|
||||
if(M.id == src.id)
|
||||
M.power = src.connected.power
|
||||
if(M.id == id)
|
||||
M.power = connected.power
|
||||
M.drive()
|
||||
|
||||
sleep(50)
|
||||
for(var/obj/machinery/door/poddoor/M in machines)
|
||||
if (M.id == src.id)
|
||||
if (M.id == id)
|
||||
spawn( 0 )
|
||||
M.close()
|
||||
return
|
||||
@@ -415,20 +422,20 @@ Pod/Blast Doors computer
|
||||
..()
|
||||
spawn( 5 )
|
||||
for(var/obj/machinery/mass_driver/M in machines)
|
||||
if (M.id == src.id)
|
||||
src.connected = M
|
||||
if (M.id == id)
|
||||
connected = M
|
||||
else
|
||||
return
|
||||
return
|
||||
|
||||
/obj/machinery/computer/pod/attackby(I as obj, user as mob)
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
|
||||
playsound(loc, 'Screwdriver.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
if (src.stat & BROKEN)
|
||||
if (stat & BROKEN)
|
||||
user << "\blue The broken glass falls out."
|
||||
var/obj/computerframe/A = new /obj/computerframe( src.loc )
|
||||
new /obj/item/weapon/shard( src.loc )
|
||||
var/obj/computerframe/A = new /obj/computerframe( loc )
|
||||
new /obj/item/weapon/shard( loc )
|
||||
|
||||
//generate appropriate circuitboard. Accounts for /pod/old computer types
|
||||
var/obj/item/weapon/circuitboard/pod/M = null
|
||||
@@ -442,8 +449,8 @@ Pod/Blast Doors computer
|
||||
M = new /obj/item/weapon/circuitboard/pod( A )
|
||||
|
||||
for (var/obj/C in src)
|
||||
C.loc = src.loc
|
||||
M.id = src.id
|
||||
C.loc = loc
|
||||
M.id = id
|
||||
A.circuit = M
|
||||
A.state = 3
|
||||
A.icon_state = "3"
|
||||
@@ -451,7 +458,7 @@ Pod/Blast Doors computer
|
||||
del(src)
|
||||
else
|
||||
user << "\blue You disconnect the monitor."
|
||||
var/obj/computerframe/A = new /obj/computerframe( src.loc )
|
||||
var/obj/computerframe/A = new /obj/computerframe( loc )
|
||||
|
||||
//generate appropriate circuitboard. Accounts for /pod/old computer types
|
||||
var/obj/item/weapon/circuitboard/pod/M = null
|
||||
@@ -465,22 +472,22 @@ Pod/Blast Doors computer
|
||||
M = new /obj/item/weapon/circuitboard/pod( A )
|
||||
|
||||
for (var/obj/C in src)
|
||||
C.loc = src.loc
|
||||
M.id = src.id
|
||||
C.loc = loc
|
||||
M.id = id
|
||||
A.circuit = M
|
||||
A.state = 4
|
||||
A.icon_state = "4"
|
||||
A.anchored = 1
|
||||
del(src)
|
||||
else
|
||||
src.attack_hand(user)
|
||||
attack_hand(user)
|
||||
return
|
||||
|
||||
/obj/machinery/computer/pod/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/pod/attack_paw(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/pod/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
@@ -489,18 +496,18 @@ Pod/Blast Doors computer
|
||||
var/dat = "<HTML><BODY><TT><B>Mass Driver Controls</B>"
|
||||
user.machine = src
|
||||
var/d2
|
||||
if (src.timing)
|
||||
if (timing)
|
||||
d2 = text("<A href='?src=\ref[];time=0'>Stop Time Launch</A>", src)
|
||||
else
|
||||
d2 = text("<A href='?src=\ref[];time=1'>Initiate Time Launch</A>", src)
|
||||
var/second = src.time % 60
|
||||
var/minute = (src.time - second) / 60
|
||||
var/second = time % 60
|
||||
var/minute = (time - second) / 60
|
||||
dat += text("<HR>\nTimer System: []\nTime Left: [][] <A href='?src=\ref[];tp=-30'>-</A> <A href='?src=\ref[];tp=-1'>-</A> <A href='?src=\ref[];tp=1'>+</A> <A href='?src=\ref[];tp=30'>+</A>", d2, (minute ? text("[]:", minute) : null), second, src, src, src, src)
|
||||
if (src.connected)
|
||||
if (connected)
|
||||
var/temp = ""
|
||||
var/list/L = list( 0.25, 0.5, 1, 2, 4, 8, 16 )
|
||||
for(var/t in L)
|
||||
if (t == src.connected.power)
|
||||
if (t == connected.power)
|
||||
temp += text("[] ", t)
|
||||
else
|
||||
temp += text("<A href = '?src=\ref[];power=[]'>[]</A> ", src, t, t)
|
||||
@@ -517,37 +524,37 @@ Pod/Blast Doors computer
|
||||
|
||||
/obj/machinery/computer/pod/process()
|
||||
..()
|
||||
if (src.timing)
|
||||
if (src.time > 0)
|
||||
src.time = round(src.time) - 1
|
||||
if (timing)
|
||||
if (time > 0)
|
||||
time = round(time) - 1
|
||||
else
|
||||
alarm()
|
||||
src.time = 0
|
||||
src.timing = 0
|
||||
src.updateDialog()
|
||||
time = 0
|
||||
timing = 0
|
||||
updateDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/pod/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
|
||||
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
|
||||
usr.machine = src
|
||||
if (href_list["power"])
|
||||
var/t = text2num(href_list["power"])
|
||||
t = min(max(0.25, t), 16)
|
||||
if (src.connected)
|
||||
src.connected.power = t
|
||||
if (connected)
|
||||
connected.power = t
|
||||
else
|
||||
if (href_list["alarm"])
|
||||
src.alarm()
|
||||
alarm()
|
||||
else
|
||||
if (href_list["time"])
|
||||
src.timing = text2num(href_list["time"])
|
||||
timing = text2num(href_list["time"])
|
||||
else
|
||||
if (href_list["tp"])
|
||||
var/tp = text2num(href_list["tp"])
|
||||
src.time += tp
|
||||
src.time = min(max(round(src.time), 0), 120)
|
||||
time += tp
|
||||
time = min(max(round(time), 0), 120)
|
||||
else
|
||||
if (href_list["door"])
|
||||
if(istype(src, /obj/machinery/computer/pod/old/syndicate))//Added here so Nuke ops don't go running naked into space before moving the shuttle.
|
||||
@@ -555,7 +562,7 @@ Pod/Blast Doors computer
|
||||
usr << "\red You need to launch the Syndicate Shuttle via the computer terminal at the head of the ship before departing."
|
||||
return
|
||||
for(var/obj/machinery/door/poddoor/M in machines)
|
||||
if (M.id == src.id)
|
||||
if (M.id == id)
|
||||
if (M.density)
|
||||
spawn( 0 )
|
||||
M.open()
|
||||
@@ -565,8 +572,8 @@ Pod/Blast Doors computer
|
||||
M.close()
|
||||
return
|
||||
//Foreach goto(298)
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -28,8 +28,8 @@ Frequency:
|
||||
..()
|
||||
if (usr.stat || usr.restrained())
|
||||
return
|
||||
var/turf/current_location = locate(usr.x,usr.y,usr.z)//Can't teleport on clown-planet z-level.
|
||||
if(current_location.z==6)
|
||||
var/turf/current_location = get_turf(usr)//What turf is the user on?
|
||||
if(!current_location||current_location.z==6)//If turf was not found or they're on z level 6.
|
||||
usr << "The [src] is malfunctioning."
|
||||
return
|
||||
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
|
||||
@@ -103,8 +103,8 @@ Frequency:
|
||||
/// HAND TELE
|
||||
|
||||
/obj/item/weapon/hand_tele/attack_self(mob/user as mob)
|
||||
var/turf/current_location = locate(usr.x,user.y,usr.z)//Can't teleport on clown-planet z-level.
|
||||
if(current_location.z==6)
|
||||
var/turf/current_location = get_turf(user)//What turf is the user on?
|
||||
if(!current_location||current_location.z==6)//If turf was not found or they're on z level 6.
|
||||
user << "The [src] is malfunctioning."
|
||||
return
|
||||
var/list/L = list( )
|
||||
|
||||
@@ -14,19 +14,42 @@ var/specops_shuttle_timeleft = 0
|
||||
name = "Spec. Ops. Shuttle Console"
|
||||
icon = 'computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
req_access = list()
|
||||
req_access = list(access_cent_specops)
|
||||
var/temp = null
|
||||
var/hacked = 0
|
||||
var/allowedtocall = 0
|
||||
|
||||
/proc/specops_process()
|
||||
var/area/centcom/control/cent_com = locate()//To find announcer. This area should exist for this proc to work.
|
||||
var/area/centcom/specops/special_ops = locate()//Where is the specops area located?
|
||||
var/mob/living/silicon/decoy/announcer = locate() in cent_com//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
|
||||
|
||||
var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
|
||||
var/message = "THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH"//Initial message shown.
|
||||
if(announcer)
|
||||
announcer.say(message)
|
||||
//world << "Should be hearing a message here."
|
||||
|
||||
while(specops_shuttle_time - world.timeofday > 0)
|
||||
var/ticksleft = specops_shuttle_time - world.timeofday
|
||||
|
||||
if(ticksleft > 1e5)
|
||||
specops_shuttle_time = world.timeofday + 10 // midnight rollover
|
||||
specops_shuttle_timeleft = (ticksleft / 10)
|
||||
|
||||
//All this does is announce the time before launch.
|
||||
if(announcer)
|
||||
var/rounded_time_left = round(specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
|
||||
if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
|
||||
message = "ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN"
|
||||
if(rounded_time_left==0)
|
||||
message = "ALERT: TAKEOFF"
|
||||
announcer.say(message)
|
||||
message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
|
||||
//Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
|
||||
|
||||
sleep(5)
|
||||
|
||||
specops_shuttle_moving_to_station = 0
|
||||
specops_shuttle_moving_to_centcom = 0
|
||||
|
||||
@@ -39,7 +62,7 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
//Begin Marauder launchpad.
|
||||
spawn(0)//So it parallel processes it.
|
||||
for(var/obj/machinery/door/poddoor/M in machines)
|
||||
for(var/obj/machinery/door/poddoor/M in special_ops)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)//1 second delay between each.
|
||||
@@ -63,14 +86,14 @@ var/specops_shuttle_timeleft = 0
|
||||
for(var/obj/landmark/L in world)
|
||||
if(L.name == "Marauder Exit")
|
||||
var/obj/portal/P = new(L.loc)
|
||||
P.invisibility = 101
|
||||
P.failchance = 0
|
||||
P.target = pick(spawn_marauder)
|
||||
P.invisibility = 101//So it is not seen by anyone.
|
||||
P.failchance = 0//So it has no fail chance when teleporting.
|
||||
P.target = pick(spawn_marauder)//Where the marauder will arrive.
|
||||
spawn_marauder.Remove(P.target)
|
||||
|
||||
sleep(10)
|
||||
|
||||
for(var/obj/machinery/mass_driver/M in machines)
|
||||
for(var/obj/machinery/mass_driver/M in special_ops)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)
|
||||
@@ -87,7 +110,7 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
sleep(50)//Doors remain open for 5 seconds.
|
||||
|
||||
for(var/obj/machinery/door/poddoor/M in machines)
|
||||
for(var/obj/machinery/door/poddoor/M in special_ops)
|
||||
switch(M.id)//Doors close at the same time.
|
||||
if("ASSAULT0")
|
||||
spawn(0)
|
||||
@@ -101,6 +124,7 @@ var/specops_shuttle_timeleft = 0
|
||||
if("ASSAULT3")
|
||||
spawn(0)
|
||||
M.close()
|
||||
special_ops.readyreset()//Reset firealarm after the team launched.
|
||||
//End Marauder launchpad.
|
||||
|
||||
var/area/start_location = locate(/area/shuttle/specops/centcom)
|
||||
@@ -135,22 +159,22 @@ var/specops_shuttle_timeleft = 0
|
||||
else return 1
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_paw(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob)
|
||||
if(istype(I,/obj/item/weapon/card/emag))
|
||||
user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals."
|
||||
else
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_hand(var/mob/user as mob)
|
||||
if(!src.allowed(user))
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied."
|
||||
return
|
||||
|
||||
@@ -163,8 +187,8 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
user.machine = src
|
||||
var/dat
|
||||
if (src.temp)
|
||||
dat = src.temp
|
||||
if (temp)
|
||||
dat = temp
|
||||
else
|
||||
dat += {"<BR><B>Special Operations Shuttle</B><HR>
|
||||
\nLocation: [specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "Departing for [station_name] in ([specops_shuttle_timeleft] seconds.)":specops_shuttle_at_station ? "Station":"Dock"]<BR>
|
||||
@@ -179,7 +203,7 @@ var/specops_shuttle_timeleft = 0
|
||||
if(..())
|
||||
return
|
||||
|
||||
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
|
||||
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
|
||||
usr.machine = src
|
||||
|
||||
if (href_list["sendtodock"])
|
||||
@@ -197,9 +221,12 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds."
|
||||
|
||||
src.temp += "Shuttle departing.<BR><BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
|
||||
src.updateUsrDialog()
|
||||
temp += "Shuttle departing.<BR><BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
|
||||
updateUsrDialog()
|
||||
|
||||
var/area/centcom/specops/special_ops = locate()
|
||||
if(special_ops)
|
||||
special_ops.readyalert()//Trigger alarm for the spec ops area.
|
||||
specops_shuttle_moving_to_station = 1
|
||||
|
||||
specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME
|
||||
@@ -207,8 +234,8 @@ var/specops_shuttle_timeleft = 0
|
||||
specops_process()
|
||||
|
||||
else if (href_list["mainmenu"])
|
||||
src.temp = null
|
||||
temp = null
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
@@ -1608,7 +1608,6 @@ var/showadminmessages = 1
|
||||
<A href='?src=\ref[src];secretsfun=prisonwarp'>Warp all Players to Prison</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=traitor_all'>Everyone is the traitor</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=flicklights'>Ghost Mode</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=cleanexcrement'>Remove all urine/poo from station</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=retardify'>Make all players retarded</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=fakeguns'>Make all items look like guns</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=schoolgirl'>Japanese Animes Mode</A><BR>
|
||||
|
||||
@@ -318,7 +318,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
id = pda.id
|
||||
log_admin("[key_name(src)] has granted [M.key] full access.")
|
||||
id.icon_state = "gold"
|
||||
id:access = get_all_accesses()
|
||||
id:access = get_all_accesses()+get_all_centcom_access()
|
||||
else
|
||||
alert("Invalid ID card")
|
||||
else
|
||||
|
||||
@@ -498,7 +498,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if("traitor")
|
||||
new_character.Equip_Rank(new_character.mind.assigned_role, joined_late=1)
|
||||
ticker.mode.equip_traitor(new_character)
|
||||
if("Wizard","Fake Wizard")
|
||||
if("Wizard")
|
||||
new_character.loc = pick(wizardstart)
|
||||
ticker.mode.learn_basic_spells(new_character)
|
||||
ticker.mode.equip_wizard(new_character)
|
||||
|
||||
@@ -43,7 +43,13 @@ var/global/sent_strike_team = 0
|
||||
var/leader_selected = 0 //when the leader is chosen. The last person spawned.
|
||||
|
||||
//Code for spawning a nuke auth code.
|
||||
var/nuke_code = "[rand(10000, 99999.0)]"
|
||||
var/nuke_code
|
||||
var/temp_code
|
||||
for(var/obj/machinery/nuclearbomb/N in world)
|
||||
temp_code = text2num(N.r_code)
|
||||
if(temp_code)//if it's actually a number. It won't convert any non-numericals.
|
||||
nuke_code = N.r_code
|
||||
break
|
||||
|
||||
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
|
||||
var/mob/dead/observer/G//Basic variable to search for later.
|
||||
@@ -77,23 +83,21 @@ var/global/sent_strike_team = 0
|
||||
commandos_list -= G
|
||||
del(G)
|
||||
|
||||
new_commando.mind.store_memory("<B>Nuke Code:</B> \red [nuke_code].")//So they don't forget their code or mission.
|
||||
//So they don't forget their code or mission.
|
||||
if(nuke_code)
|
||||
new_commando.mind.store_memory("<B>Nuke Code:</B> \red [nuke_code].")
|
||||
new_commando.mind.store_memory("<B>Mission:</B> \red [input].")
|
||||
|
||||
new_commando << "\blue You are a Special Ops. [!leader_selected?"commando":"<B>LEADER</B>"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: \red<B>[input]</B>"
|
||||
|
||||
commando_number--
|
||||
|
||||
//Targets any nukes in the world and changes their auth code as needed.
|
||||
//Bad news for Nuke operatives--or great news.
|
||||
for(var/obj/machinery/nuclearbomb/N in world)
|
||||
N.r_code = nuke_code
|
||||
|
||||
//Spawns the rest of the commando gear.
|
||||
for (var/obj/landmark/L)
|
||||
if (L.name == "Commando_Manual")
|
||||
new /obj/item/weapon/gun/energy/pulse_rifle(L.loc)
|
||||
var/obj/item/weapon/paper/P = new(L.loc)
|
||||
P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code]</b></p><p><b>Good luck, soldier!</b></p>"
|
||||
P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
|
||||
P.name = "Spec. Ops. Manual"
|
||||
|
||||
for (var/obj/landmark/L in world)
|
||||
@@ -176,7 +180,9 @@ var/global/sent_strike_team = 0
|
||||
|
||||
var/obj/item/weapon/card/id/W = new(src)
|
||||
W.name = "[real_name]'s ID Card"
|
||||
W.access = get_all_accesses()
|
||||
W.icon = "centcom"
|
||||
W.access = get_all_accesses()//They get full station access.
|
||||
W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)//Let's add their alloted CentCom access.
|
||||
W.assignment = "Death Commando"
|
||||
W.registered = real_name
|
||||
equip_if_possible(W, slot_wear_id)
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
say_understands(var/other)
|
||||
if (istype(other, /mob/living/silicon/ai))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/decoy))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/robot))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/human))
|
||||
|
||||
@@ -76,6 +76,8 @@
|
||||
/mob/living/carbon/human/say_understands(var/other)
|
||||
if (istype(other, /mob/living/silicon/ai))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/decoy))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/pai))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/robot))
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/robot))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/decoy))
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/ai/say_quote(var/text)
|
||||
|
||||
@@ -3,3 +3,22 @@
|
||||
src.icon_state = "ai"
|
||||
src.anchored = 1
|
||||
src.canmove = 0
|
||||
|
||||
/mob/living/silicon/decoy/say_understands(var/other)
|
||||
if (istype(other, /mob/living/carbon/human))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/robot))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/ai))
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/decoy/say_quote(var/text)
|
||||
var/ending = copytext(text, length(text))
|
||||
|
||||
if (ending == "?")
|
||||
return "queries, \"[text]\"";
|
||||
else if (ending == "!")
|
||||
return "declares, \"[copytext(text, 1, length(text))]\"";
|
||||
|
||||
return "states, \"[text]\"";
|
||||
@@ -7,6 +7,8 @@
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/ai))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/decoy))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/brain))
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/mob/living/silicon/robot/say_understands(var/other)
|
||||
if (istype(other, /mob/living/silicon/ai))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/decoy))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/human))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/hivebot))
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
File diff suppressed because it is too large
Load Diff
@@ -41,7 +41,6 @@
|
||||
#define FILE_DIR "code/game/gamemodes/revolution"
|
||||
#define FILE_DIR "code/game/gamemodes/sandbox"
|
||||
#define FILE_DIR "code/game/gamemodes/traitor"
|
||||
#define FILE_DIR "code/game/gamemodes/traitor_pair"
|
||||
#define FILE_DIR "code/game/gamemodes/wizard"
|
||||
#define FILE_DIR "code/game/jobs"
|
||||
#define FILE_DIR "code/game/machinery"
|
||||
@@ -347,7 +346,6 @@
|
||||
#include "code\game\gamemodes\sandbox\h_sandbox.dm"
|
||||
#include "code\game\gamemodes\sandbox\sandbox.dm"
|
||||
#include "code\game\gamemodes\traitor\traitor.dm"
|
||||
#include "code\game\gamemodes\traitor_pair\traitor_pair.dm"
|
||||
#include "code\game\gamemodes\wizard\spells.dm"
|
||||
#include "code\game\gamemodes\wizard\wizard.dm"
|
||||
#include "code\game\jobs\access.dm"
|
||||
|
||||
Reference in New Issue
Block a user