mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
Bug fixes
This commit is contained in:
@@ -32,7 +32,7 @@
|
||||
/obj/machinery/computer3/security/mining
|
||||
name = "Outpost Cameras"
|
||||
desc = "Used to access the various cameras on the outpost."
|
||||
spawn_files = list(/datum/file/camnet_key/mining)
|
||||
spawn_files = list(/datum/file/camnet_key/miningoutpost)
|
||||
|
||||
/*
|
||||
Camera monitoring computers, wall-mounted
|
||||
@@ -43,7 +43,7 @@
|
||||
spawn_files = list(/datum/file/camnet_key)
|
||||
|
||||
/obj/machinery/computer3/wall_comp/telescreen/entertainment
|
||||
desc = "Damn, they better have /tg/thechannel on these things."
|
||||
desc = "Damn, they better have Paradise Channel on these things."
|
||||
spawn_files = list(/datum/file/camnet_key/entertainment)
|
||||
|
||||
|
||||
@@ -76,53 +76,96 @@
|
||||
return
|
||||
computer.Crash(MISSING_PROGRAM)
|
||||
|
||||
/datum/file/camnet_key/mining
|
||||
name = "Mining Camera Network Key"
|
||||
title = "mining station"
|
||||
desc = "Connects to mining security cameras."
|
||||
networks = list("MINE")
|
||||
/datum/file/camnet_key/telecomms
|
||||
name = "Telecomms Network Key"
|
||||
title = "telecommunications satellite"
|
||||
desc = "Connects to telecommunications satellite security cameras."
|
||||
networks = list("Telecomms")
|
||||
|
||||
/datum/file/camnet_key/researchoutpost
|
||||
name = "Research Outpost Network Key"
|
||||
title = "research outpost"
|
||||
desc = "Connects to research outpost security cameras."
|
||||
networks = list("Research Outpost")
|
||||
|
||||
/datum/file/camnet_key/miningoutpost
|
||||
name = "Mining Outpost Network Key"
|
||||
title = "mining outpost"
|
||||
desc = "Connects to mining outpost security cameras."
|
||||
networks = list("Mining Outpost")
|
||||
screen = "miningcameras"
|
||||
|
||||
/datum/file/camnet_key/research
|
||||
name = "Research Camera Network Key"
|
||||
name = "Research Network Key"
|
||||
title = "research"
|
||||
networks = list("RD")
|
||||
|
||||
/datum/file/camnet_key/bombrange
|
||||
name = "R&D Bomb Range Camera Network Key"
|
||||
title = "bomb range"
|
||||
desc = "Monitors the bomb range."
|
||||
networks = list("Toxins")
|
||||
|
||||
/datum/file/camnet_key/xeno
|
||||
name = "R&D Misc. Research Camera Network Key"
|
||||
title = "special research"
|
||||
networks = list("Misc")
|
||||
|
||||
/datum/file/camnet_key/singulo
|
||||
name = "Singularity Camera Network Key"
|
||||
title = "singularity"
|
||||
networks = list("Singularity")
|
||||
|
||||
/datum/file/camnet_key/entertainment
|
||||
name = "Entertainment Channel Encryption Key"
|
||||
title = "entertainment"
|
||||
desc = "Damn, I hope they have /tg/thechannel on here."
|
||||
networks = list("thunder")
|
||||
screen = "entertainment"
|
||||
|
||||
/datum/file/camnet_key/creed
|
||||
name = "Special Ops Camera Encryption Key"
|
||||
title = "special ops"
|
||||
desc = "Connects to special ops secure camera feeds."
|
||||
networks = list("CREED")
|
||||
|
||||
desc = "Connects to research security cameras."
|
||||
networks = list("Research")
|
||||
|
||||
/datum/file/camnet_key/prison
|
||||
name = "Prison Camera Network Key"
|
||||
name = "Prison Network Key"
|
||||
title = "prison"
|
||||
desc = "Monitors the prison."
|
||||
desc = "Connects to prison security cameras."
|
||||
networks = list("Prison")
|
||||
|
||||
|
||||
/datum/file/camnet_key/interrogation
|
||||
name = "Interrogation Network Key"
|
||||
title = "interrogation"
|
||||
desc = "Connects to interrogation security cameras."
|
||||
networks = list("Interrogation")
|
||||
|
||||
/datum/file/camnet_key/supermatter
|
||||
name = "Supermatter Network Key"
|
||||
title = "supermatter"
|
||||
desc = "Connects to supermatter security cameras."
|
||||
networks = list("Supermatter")
|
||||
|
||||
/datum/file/camnet_key/singularity
|
||||
name = "Singularity Network Key"
|
||||
title = "singularity"
|
||||
desc = "Connects to singularity security cameras."
|
||||
networks = list("Singularity")
|
||||
|
||||
/datum/file/camnet_key/anomalyisolation
|
||||
name = "Anomaly Isolation Network Key"
|
||||
title = "anomalyisolation"
|
||||
desc = "Connects to interrogation security cameras."
|
||||
networks = list("Anomaly Isolation")
|
||||
|
||||
/datum/file/camnet_key/toxins
|
||||
name = "Toxins Network Key"
|
||||
title = "toxins"
|
||||
desc = "Connects to toxins security cameras."
|
||||
networks = list("Toxins")
|
||||
|
||||
/datum/file/camnet_key/telepad
|
||||
name = "Telepad Network Key"
|
||||
title = "telepad"
|
||||
desc = "Connects to telepad security cameras."
|
||||
networks = list("Telepad")
|
||||
|
||||
/datum/file/camnet_key/ert
|
||||
name = "Emergency Response Team Network Key"
|
||||
title = "emergency response team"
|
||||
desc = "Connects to emergency response team security cameras."
|
||||
networks = list("ERT")
|
||||
|
||||
/datum/file/camnet_key/centcom
|
||||
name = "Central Command Network Key"
|
||||
title = "central command"
|
||||
desc = "Connects to central command security cameras."
|
||||
networks = list("CentCom")
|
||||
|
||||
/datum/file/camnet_key/thunderdome
|
||||
name = "Thunderdome Network Key"
|
||||
title = "thunderdome"
|
||||
desc = "Connects to thunderdome security cameras."
|
||||
networks = list("Thunderdome")
|
||||
|
||||
/datum/file/camnet_key/entertainment
|
||||
name = "Entertainment Network Key"
|
||||
title = "entertainment"
|
||||
desc = "Connects to entertainment security cameras."
|
||||
networks = list("news")
|
||||
|
||||
|
||||
/*
|
||||
@@ -147,7 +190,7 @@
|
||||
if(temp.len)
|
||||
L.Add(C)
|
||||
|
||||
//camera_sort(L)
|
||||
camera_sort(L)
|
||||
|
||||
return L
|
||||
verify_machine(var/obj/machinery/camera/C,var/datum/file/camnet_key/key = null)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
/obj/machinery/computer3/card/hop
|
||||
default_prog = /datum/file/program/card_comp
|
||||
spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot/dual)
|
||||
spawn_files = list(/datum/file/program/arcade, /datum/file/program/security, /datum/file/camnet_key/mining, /datum/file/camnet_key/entertainment,/datum/file/camnet_key/prison)
|
||||
spawn_files = list(/datum/file/program/arcade, /datum/file/program/security, /datum/file/camnet_key/miningoutpost, /datum/file/camnet_key/entertainment,/datum/file/camnet_key/prison)
|
||||
|
||||
|
||||
/obj/machinery/computer3/card/centcom
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
default_prog = /datum/file/program/communications
|
||||
spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/cardslot/dual)
|
||||
spawn_files = list(/datum/file/program/card_comp, /datum/file/program/security, /datum/file/program/crew, /datum/file/program/arcade,
|
||||
/datum/file/camnet_key, /datum/file/camnet_key/entertainment, /datum/file/camnet_key/singulo)
|
||||
/datum/file/camnet_key, /datum/file/camnet_key/entertainment, /datum/file/camnet_key/singularity)
|
||||
|
||||
|
||||
/datum/file/program/communications
|
||||
|
||||
@@ -296,6 +296,9 @@
|
||||
if(access_security in C.access)
|
||||
newlap.spawn_files += (/datum/file/program/secure_data)
|
||||
newlap.spawn_files += (/datum/file/camnet_key)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/researchoutpost)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/miningoutpost)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/telecomms)
|
||||
newlap.spawn_files += (/datum/file/program/security)
|
||||
if(access_armory in C.access)
|
||||
newlap.spawn_files += (/datum/file/program/prisoner)
|
||||
@@ -312,13 +315,17 @@
|
||||
if(access_engine in C.access)
|
||||
newlap.spawn_files += (/datum/file/program/powermon)
|
||||
if(access_research in C.access)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/researchoutpost)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/research)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/bombrange)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/xeno)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/anomalyisolation)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/toxins)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/telepad)
|
||||
if(access_rd in C.access)
|
||||
newlap.spawn_files += (/datum/file/program/borg_control)
|
||||
if(access_cent_specops in C.access)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/creed)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/ert)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/centcom)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/thunderdome)
|
||||
newlap.spawn_files += (/datum/file/program/arcade)
|
||||
newlap.spawn_files += (/datum/file/camnet_key/entertainment)
|
||||
//Atlantis: Each laptop gets "invisible" program/security - REQUIRED for camnetkeys to work.
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
var/mob/living/silicon/ai/calling_ai //Links a bot to the AI calling it.
|
||||
var/obj/item/device/radio/Radio //The bot's radio, for speaking to people.
|
||||
var/radio_frequency //The bot's default radio speaking freqency. Recommended to be on a department frequency.
|
||||
var/radio_name = "Common"
|
||||
//var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots
|
||||
var/auto_patrol = 0// set to make bot automatically patrol
|
||||
var/turf/patrol_target // this is turf to navigate to (location of beacon)
|
||||
@@ -101,6 +102,7 @@
|
||||
set_custom_texts()
|
||||
Radio = new /obj/item/device/radio(src)
|
||||
Radio.listening = 0 //Makes bot radios transmit only so no one hears things while adjacent to one.
|
||||
Radio.config(list("[radio_name]" = 0))
|
||||
|
||||
|
||||
/obj/machinery/bot/proc/add_to_beacons(bot_filter) //Master filter control for bots. Must be placed in the bot's local New() to support map spawned bots.
|
||||
@@ -335,14 +337,13 @@
|
||||
/obj/machinery/bot/attack_ai(mob/user as mob)
|
||||
attack_hand(user)
|
||||
|
||||
/obj/machinery/bot/proc/speak(var/message, freq) //Pass a message to have the bot say() it. Pass a frequency to say it on the radio.
|
||||
/obj/machinery/bot/proc/speak(var/message, freq, var/freqname = null) //Pass a message to have the bot say() it. Pass a frequency to say it on the radio.
|
||||
if((!on) || (!message))
|
||||
return
|
||||
if(freq)
|
||||
return
|
||||
// Commenting out the radio code until our say code's compatible with /tg/'s
|
||||
/* Radio.set_frequency(radio_frequency)
|
||||
Radio.talk_into_atom(src, message, radio_frequency) */
|
||||
Radio.set_frequency(radio_frequency)
|
||||
if(freqname)
|
||||
Radio.autosay(message, src.name, freqname, list(src.z))
|
||||
else
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"</span>",2)
|
||||
@@ -651,7 +652,7 @@ obj/machinery/bot/proc/start_patrol()
|
||||
botcard.access = user_access + prev_access //Adds the user's access, if any.
|
||||
mode = BOT_SUMMON
|
||||
calc_summon_path()
|
||||
speak("Responding."/*, radio_frequency*/)
|
||||
speak("Responding.", radio_frequency, radio_name)
|
||||
return
|
||||
|
||||
// receive response from beacon
|
||||
@@ -738,7 +739,7 @@ obj/machinery/bot/proc/bot_summon()
|
||||
check_bot_access()
|
||||
path = AStar(loc, summon_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 150, id=botcard, exclude=avoid)
|
||||
if(!path || tries >= 5) //Cannot reach target. Give up and announce the issue.
|
||||
speak("Summon command failed, destination unreachable."/*,radio_frequency*/)
|
||||
speak("Summon command failed, destination unreachable.", radio_frequency, radio_name)
|
||||
bot_reset()
|
||||
|
||||
/obj/machinery/bot/proc/summon_step()
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
var/next_dest
|
||||
var/next_dest_loc
|
||||
radio_frequency = SRV_FREQ //Service
|
||||
radio_name = "Service"
|
||||
bot_type = CLEAN_BOT
|
||||
bot_filter = RADIO_CLEANBOT
|
||||
|
||||
@@ -120,6 +121,7 @@ text("<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>"))
|
||||
if(allowed(usr) && !open && !emagged)
|
||||
locked = !locked
|
||||
user << "<span class='notice'>You [ locked ? "lock" : "unlock"] the [src] behaviour controls.</span>"
|
||||
updateUsrDialog()
|
||||
else
|
||||
if(emagged)
|
||||
user << "<span class='warning'>ERROR</span>"
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
var/projectile = /obj/item/projectile/energy/electrode //Holder for projectile type
|
||||
var/shoot_sound = 'sound/weapons/Taser.ogg'
|
||||
radio_frequency = SEC_FREQ
|
||||
radio_name = "Security"
|
||||
bot_type = SEC_BOT
|
||||
bot_filter = RADIO_SECBOT
|
||||
|
||||
@@ -267,8 +268,8 @@ Auto Patrol[]"},
|
||||
M.Stun(5)
|
||||
|
||||
if(declare_arrests)
|
||||
//var/area/location = get_area(src)
|
||||
declare_arrest()
|
||||
var/area/location = get_area(src)
|
||||
speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag <b>[target]</b> in [location].",radio_frequency, radio_name)
|
||||
target.visible_message("<span class='danger'>[target] has been stunned by [src]!</span>",\
|
||||
"<span class='userdanger'>[target] has been stunned by [src]!</span></span>")
|
||||
|
||||
@@ -725,10 +726,4 @@ Auto Patrol[]"},
|
||||
|
||||
/obj/machinery/bot/ed209/redtag/New()
|
||||
new /obj/machinery/bot/ed209(get_turf(src),null,"r")
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/bot/ed209/proc/declare_arrest()
|
||||
var/area/location = get_area(src)
|
||||
for(var/mob/living/carbon/human/human in world)
|
||||
if((human.z == src.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security) || istype(human.glasses, /obj/item/clothing/glasses/sunglasses/sechud) && !human.blinded)
|
||||
human << "<span class='info'>\icon[human.glasses] [src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] threat <b>[target]</b> in <b>[location]</b></span>"
|
||||
qdel(src)
|
||||
@@ -50,6 +50,7 @@
|
||||
req_one_access = list(access_construction, access_robotics)
|
||||
var/targetdirection
|
||||
radio_frequency = ENG_FREQ //Engineering channel
|
||||
radio_name = "Engineering"
|
||||
bot_type = FLOOR_BOT
|
||||
bot_filter = RADIO_FLOORBOT
|
||||
var/process_type //Determines what to do when process_scan() recieves a target. See process_scan() for details.
|
||||
@@ -150,6 +151,7 @@
|
||||
if(allowed(user) && !open && !emagged)
|
||||
locked = !locked
|
||||
user << "<span class='notice'>You [locked ? "lock" : "unlock"] \the [src] behaviour controls.</span>"
|
||||
updateUsrDialog()
|
||||
else
|
||||
if(emagged)
|
||||
user << "<span class='warning'>ERROR</span>"
|
||||
@@ -314,7 +316,8 @@
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/nag() //Annoy everyone on the channel to refill us!
|
||||
if(!nagged)
|
||||
speak("Requesting refill at <b>[get_area(src)]</b>!"/*, radio_frequency*/)
|
||||
var/area/location = get_area(src)
|
||||
speak("Requesting refill at <b>[location]</b>!", radio_frequency, radio_name)
|
||||
nagged = 1
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/is_hull_breach(var/turf/t) //Ignore space tiles not considered part of a structure, also ignores shuttle docking areas.
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
var/declare_cooldown = 0 //Prevents spam of critical patient alerts.
|
||||
var/stationary_mode = 0 //If enabled, the Medibot will not move automatically.
|
||||
radio_frequency = MED_FREQ //Medical frequency
|
||||
radio_name = "Medical"
|
||||
//Setting which reagents to use to treat what by default. By id.
|
||||
var/treatment_brute = "tricordrazine"
|
||||
var/treatment_oxy = "tricordrazine"
|
||||
@@ -522,8 +523,10 @@
|
||||
/obj/machinery/bot/medbot/proc/declare(var/crit_patient)
|
||||
if(declare_cooldown)
|
||||
return
|
||||
//var/area/location = get_area(src)
|
||||
declare_critical(crit_patient)
|
||||
if((skin == "bezerk"))
|
||||
return
|
||||
var/area/location = get_area(src)
|
||||
speak("Medical emergency! [crit_patient ? "<b>[crit_patient]</b>" : "A patient"] is in critical condition at [location]!",radio_frequency, radio_name)
|
||||
declare_cooldown = 1
|
||||
spawn(200) //Twenty seconds
|
||||
declare_cooldown = 0
|
||||
@@ -589,18 +592,4 @@
|
||||
S.skin = skin
|
||||
S.name = created_name
|
||||
user.before_take_item(src, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/bot/medbot/proc/declare_critical(var/crit_patient)
|
||||
var/area/location = get_area(src)
|
||||
for(var/mob/living/carbon/human/human in world)
|
||||
if((human.z == src.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/health) || istype(human.glasses, /obj/item/clothing/glasses/hud/health_advanced) && !human.blinded)
|
||||
if((skin == "bezerk") && (!("syndicate" in human.faction)))
|
||||
continue
|
||||
human << "<span class='info'>\icon[human.glasses] Medical emergency! [crit_patient ? "<b>[crit_patient]</b>" : "A patient"] is in critical condition at [location]!"
|
||||
for(var/mob/living/silicon/robot in world)
|
||||
if((robot.z == src.z) && !robot.blinded)
|
||||
if((skin == "bezerk") && (!("syndicate" in robot.faction)))
|
||||
continue
|
||||
if(robot.sensor_mode == 2)
|
||||
robot << "<span class='info'>Medical emergency! [crit_patient ? "<b>[crit_patient]</b>" : "A patient"] is in critical condition at [location]!"
|
||||
qdel(src)
|
||||
@@ -94,7 +94,7 @@ var/global/mulebot_count = 0
|
||||
else if(istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda))
|
||||
if(toggle_lock(user))
|
||||
user << "<span class='notice'>Controls [(locked ? "locked" : "unlocked")].</span>"
|
||||
|
||||
updateUsrDialog()
|
||||
else if(istype(I,/obj/item/weapon/cell) && open && !cell)
|
||||
var/obj/item/weapon/cell/C = I
|
||||
user.drop_item()
|
||||
@@ -237,7 +237,7 @@ var/global/mulebot_count = 0
|
||||
|
||||
//user << browse("<HEAD><TITLE>M.U.L.E. Mk. III [suffix ? "([suffix])" : ""]</TITLE></HEAD>[dat]", "window=mulebot;size=350x500")
|
||||
//onclose(user, "mulebot")
|
||||
var/datum/browser/popup = new(user, "mulebot", "M.U.L.E. Mk. V [suffix ? "([suffix])" : ""]", 350, 500)
|
||||
var/datum/browser/popup = new(user, "mulebot", "M.U.L.E. Mk. V [suffix ? "([suffix])" : ""]", 350, 535)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
|
||||
popup.open()
|
||||
@@ -683,6 +683,8 @@ var/global/mulebot_count = 0
|
||||
/obj/machinery/bot/mulebot/proc/at_target()
|
||||
if(!reached_target)
|
||||
radio_frequency = SUP_FREQ //Supply channel
|
||||
radio_name = "Supply"
|
||||
Radio.config(list("[radio_name]" = 0))
|
||||
visible_message("[src] makes a chiming sound!", "You hear a chime.")
|
||||
playsound(loc, 'sound/machines/chime.ogg', 50, 0)
|
||||
reached_target = 1
|
||||
@@ -694,9 +696,11 @@ var/global/mulebot_count = 0
|
||||
playsound(calling_ai, 'sound/machines/chime.ogg',40, 0)
|
||||
calling_ai = null
|
||||
radio_frequency = AIPRIV_FREQ //Report on AI Private instead if the AI is controlling us.
|
||||
radio_name = "AI Private"
|
||||
Radio.config(list("[radio_name]" = 0))
|
||||
|
||||
if(load) // if loaded, unload at target
|
||||
speak("Destination <b>[destination]</b> reached. Unloading [load]."/*,radio_frequency*/)
|
||||
speak("Destination <b>[destination]</b> reached. Unloading [load].", radio_frequency, radio_name)
|
||||
unload(loaddir)
|
||||
else
|
||||
// not loaded
|
||||
@@ -712,7 +716,7 @@ var/global/mulebot_count = 0
|
||||
if(AM)
|
||||
load(AM)
|
||||
if(report_delivery)
|
||||
speak("Now loading [load] at <b>[get_area(src)]</b>."/*,radio_frequency*/)
|
||||
speak("Now loading [load] at <b>[get_area(src)]</b>.", radio_frequency, radio_name)
|
||||
// whatever happened, check to see if we return home
|
||||
|
||||
if(auto_return && destination != home_destination)
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
var/check_records = 1 //Does it check security records?
|
||||
var/arrest_type = 0 //If true, don't handcuff
|
||||
radio_frequency = SEC_FREQ //Security channel
|
||||
radio_name = "Security"
|
||||
bot_type = SEC_BOT
|
||||
bot_filter = RADIO_SECBOT
|
||||
|
||||
@@ -41,7 +42,7 @@
|
||||
name = "Officer Beepsky"
|
||||
desc = "It's Officer Beepsky! Powered by a potato and a shot of whiskey."
|
||||
idcheck = 0
|
||||
weaponscheck = 0
|
||||
weaponscheck = 1
|
||||
auto_patrol = 1
|
||||
|
||||
/obj/machinery/bot/secbot/pingsky
|
||||
@@ -230,8 +231,8 @@ Auto Patrol: []"},
|
||||
M.Stun(5)
|
||||
|
||||
if(declare_arrests)
|
||||
//var/area/location = get_area(src)
|
||||
declare_arrest()
|
||||
var/area/location = get_area(src)
|
||||
speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag <b>[target]</b> in [location].",radio_frequency, radio_name)
|
||||
target.visible_message("<span class='danger'>[target] has been stunned by [src]!</span>",\
|
||||
"<span class='userdanger'>[target] has been stunned by [src]!</span>")
|
||||
|
||||
@@ -475,13 +476,4 @@ Auto Patrol: []"},
|
||||
overlays -= "hs_arm"
|
||||
new /obj/item/robot_parts/l_arm(get_turf(src))
|
||||
user << "<span class='notice'>You remove the robot arm from [src].</span>"
|
||||
build_step--
|
||||
|
||||
/obj/machinery/bot/secbot/proc/declare_arrest()
|
||||
var/area/location = get_area(src)
|
||||
for(var/mob/living/carbon/human/human in world)
|
||||
if((human.z == src.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security) || istype(human.glasses, /obj/item/clothing/glasses/sunglasses/sechud) && !human.blinded)
|
||||
human << "<span class='info'>\icon[human.glasses] [src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] threat <b>[target]</b> in <b>[location]</b></span>"
|
||||
for(var/mob/living/silicon/robot in world)
|
||||
if((robot.z == src.z) && !robot.blinded && robot.sensor_mode == 1)
|
||||
robot << "<span class='info'>[src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] threat <b>[target]</b> in <b>[location]</b></span>"
|
||||
build_step--
|
||||
@@ -23,14 +23,13 @@ var/specops_shuttle_timeleft = 0
|
||||
var/specops_shuttle_timereset = 0
|
||||
|
||||
/proc/specops_return()
|
||||
var/area/centcom/control/command = locate()//To find announcer. This area should exist for this proc to work.
|
||||
var/mob/living/silicon/decoy/announcer = locate() in command//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
|
||||
var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
|
||||
announcer.config(list("Response Team" = 0))
|
||||
|
||||
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 TO RETURN\""//Initial message shown.
|
||||
if(announcer)
|
||||
announcer.say(message)
|
||||
announcer.say(message)
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team", list(1,2))
|
||||
|
||||
while(specops_shuttle_time - world.timeofday > 0)
|
||||
var/ticksleft = specops_shuttle_time - world.timeofday
|
||||
@@ -46,7 +45,7 @@ var/specops_shuttle_timeleft = 0
|
||||
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
|
||||
if(rounded_time_left==0)
|
||||
message = "\"ALERT: TAKEOFF\""
|
||||
announcer.say(message)
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
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.
|
||||
|
||||
@@ -94,21 +93,20 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
for(var/obj/machinery/computer/specops_shuttle/S in world)
|
||||
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
|
||||
|
||||
del(announcer)
|
||||
|
||||
/proc/specops_process()
|
||||
var/area/centcom/specops/special_ops = locate()//Where is the specops area located?
|
||||
var/area/centcom/control/command = locate()//To find announcer. This area should exist for this proc to work.
|
||||
var/mob/living/silicon/decoy/announcer = locate() in command//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
|
||||
|
||||
var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
|
||||
announcer.config(list("Response Team" = 0))
|
||||
|
||||
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)
|
||||
announcer.say(message)
|
||||
/*
|
||||
message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
|
||||
announcer.say(message)
|
||||
*/
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
//message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
|
||||
//announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
|
||||
while(specops_shuttle_time - world.timeofday > 0)
|
||||
var/ticksleft = specops_shuttle_time - world.timeofday
|
||||
@@ -124,8 +122,7 @@ var/specops_shuttle_timeleft = 0
|
||||
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
|
||||
if(rounded_time_left==0)
|
||||
message = "\"ALERT: TAKEOFF\""
|
||||
announcer.say(message)
|
||||
announcer.say(message)
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
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.
|
||||
|
||||
@@ -237,6 +234,8 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
for(var/obj/machinery/computer/specops_shuttle/S in world)
|
||||
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
|
||||
|
||||
del(announcer)
|
||||
|
||||
/proc/specops_can_move()
|
||||
if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom)
|
||||
@@ -339,248 +338,4 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/*//Config stuff
|
||||
#define SPECOPS_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves.
|
||||
#define SPECOPS_STATION_AREATYPE "/area/shuttle/specops/station" //Type of the spec ops shuttle area for station
|
||||
#define SPECOPS_DOCK_AREATYPE "/area/shuttle/specops/centcom" //Type of the spec ops shuttle area for dock
|
||||
|
||||
var/specops_shuttle_moving_to_station = 0
|
||||
var/specops_shuttle_moving_to_centcom = 0
|
||||
var/specops_shuttle_at_station = 0
|
||||
var/specops_shuttle_can_send = 1
|
||||
var/specops_shuttle_time = 0
|
||||
var/specops_shuttle_timeleft = 0
|
||||
|
||||
/obj/machinery/computer/specops_shuttle
|
||||
name = "Spec. Ops. Shuttle Console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
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)
|
||||
message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
|
||||
announcer.say(message)
|
||||
|
||||
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
|
||||
|
||||
specops_shuttle_at_station = 1
|
||||
if (specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
if (!specops_can_move())
|
||||
usr << "\red The Special Operations shuttle is unable to leave."
|
||||
return
|
||||
|
||||
//Begin Marauder launchpad.
|
||||
spawn(0)//So it parallel processes it.
|
||||
for(var/obj/machinery/door/poddoor/M in special_ops)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)//1 second delay between each.
|
||||
M.open()
|
||||
if("ASSAULT1")
|
||||
spawn(20)
|
||||
M.open()
|
||||
if("ASSAULT2")
|
||||
spawn(30)
|
||||
M.open()
|
||||
if("ASSAULT3")
|
||||
spawn(40)
|
||||
M.open()
|
||||
|
||||
sleep(10)
|
||||
|
||||
var/spawn_marauder[] = new()
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(L.name == "Marauder Entry")
|
||||
spawn_marauder.Add(L)
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(L.name == "Marauder Exit")
|
||||
var/obj/effect/portal/P = new(L.loc)
|
||||
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 special_ops)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)
|
||||
M.drive()
|
||||
if("ASSAULT1")
|
||||
spawn(20)
|
||||
M.drive()
|
||||
if("ASSAULT2")
|
||||
spawn(30)
|
||||
M.drive()
|
||||
if("ASSAULT3")
|
||||
spawn(40)
|
||||
M.drive()
|
||||
|
||||
sleep(50)//Doors remain open for 5 seconds.
|
||||
|
||||
for(var/obj/machinery/door/poddoor/M in special_ops)
|
||||
switch(M.id)//Doors close at the same time.
|
||||
if("ASSAULT0")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT1")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT2")
|
||||
spawn(0)
|
||||
M.close()
|
||||
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)
|
||||
var/area/end_location = locate(/area/shuttle/specops/station)
|
||||
|
||||
var/list/dstturfs = list()
|
||||
var/throwy = world.maxy
|
||||
|
||||
for(var/turf/T in end_location)
|
||||
dstturfs += T
|
||||
if(T.y < throwy)
|
||||
throwy = T.y
|
||||
|
||||
// hey you, get out of the way!
|
||||
for(var/turf/T in dstturfs)
|
||||
// find the turf to move things to
|
||||
var/turf/D = locate(T.x, throwy - 1, 1)
|
||||
//var/turf/E = get_step(D, SOUTH)
|
||||
for(var/atom/movable/AM as mob|obj in T)
|
||||
AM.Move(D)
|
||||
if(istype(T, /turf/simulated))
|
||||
del(T)
|
||||
|
||||
start_location.move_contents_to(end_location)
|
||||
|
||||
for(var/turf/T in get_area_turfs(end_location) )
|
||||
var/mob/M = locate(/mob) in T
|
||||
M << "\red You have arrived to [station_name]. Commence operation!"
|
||||
|
||||
/proc/specops_can_move()
|
||||
if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return 0
|
||||
else return 1
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_ai(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_paw(var/mob/user as mob)
|
||||
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 attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_hand(var/mob/user as mob)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied."
|
||||
return
|
||||
|
||||
// if (sent_strike_team == 0)
|
||||
// usr << "\red The strike team has not yet deployed."
|
||||
// return
|
||||
|
||||
if(..())
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
var/dat
|
||||
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>
|
||||
[specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "\n*The Special Ops. shuttle is already leaving.*<BR>\n<BR>":specops_shuttle_at_station ? "\n<A href='?src=\ref[src];sendtodock=1'>Shuttle Offline</A><BR>\n<BR>":"\n<A href='?src=\ref[src];sendtostation=1'>Depart to [station_name]</A><BR>\n<BR>"]
|
||||
\n<A href='?src=\ref[user];mach_close=computer'>Close</A>"}
|
||||
|
||||
user << browse(dat, "window=computer;size=575x450")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
|
||||
usr.set_machine(src)
|
||||
|
||||
if (href_list["sendtodock"])
|
||||
if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
usr << "\blue Central Command will not allow the Special Operations shuttle to return."
|
||||
return
|
||||
|
||||
else if (href_list["sendtostation"])
|
||||
if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
if (!specops_can_move())
|
||||
usr << "\red The Special Operations shuttle is unable to leave."
|
||||
return
|
||||
|
||||
usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds."
|
||||
|
||||
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
|
||||
spawn(0)
|
||||
specops_process()
|
||||
|
||||
else if (href_list["mainmenu"])
|
||||
temp = null
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
*/
|
||||
return
|
||||
@@ -107,7 +107,7 @@
|
||||
|
||||
M.Weaken(10)
|
||||
|
||||
if(master && wires & 1)
|
||||
if(master)
|
||||
master.receive_signal()
|
||||
return
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
/obj/item/device/radio/proc/isWireCut(var/index)
|
||||
return wires.IsIndexCut(index)
|
||||
|
||||
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT
|
||||
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/zlevel = list(1)) //BS12 EDIT
|
||||
var/datum/radio_frequency/connection = null
|
||||
if(channel && channels && channels.len > 0)
|
||||
if (channel == "department")
|
||||
@@ -215,7 +215,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
Broadcast_Message(connection, A,
|
||||
0, "*garbled automated announcement*", src,
|
||||
message, from, "Automated Announcement", from, "synthesized voice",
|
||||
4, 0, list(1), 1459)
|
||||
4, 0, zlevel, connection.frequency)
|
||||
del(A)
|
||||
return
|
||||
|
||||
|
||||
@@ -161,15 +161,15 @@
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/stack/proc/use(var/amount)
|
||||
src.amount-=amount
|
||||
if (src.amount<=0)
|
||||
var/oldsrc = src
|
||||
src = null //dont kill proc after del()
|
||||
/obj/item/stack/proc/use(var/used)
|
||||
if (amount < used)
|
||||
return 0
|
||||
amount -= used
|
||||
if (amount <= 0)
|
||||
if(usr)
|
||||
usr.before_take_item(oldsrc)
|
||||
qdel(oldsrc)
|
||||
return
|
||||
usr.before_take_item(src, 1)
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
/obj/item/stack/proc/add_to_stacks(mob/usr as mob)
|
||||
var/obj/item/stack/oldsrc = src
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
else
|
||||
on = 1
|
||||
icon_state = "echair1"
|
||||
shock()
|
||||
usr << "<span class='notice'>You switch [on ? "on" : "off"] [src].</span>"
|
||||
return
|
||||
|
||||
@@ -70,8 +71,10 @@
|
||||
sleep(1)
|
||||
buckled_mob.burn_skin(85)
|
||||
buckled_mob.Stun(600)
|
||||
on = 0
|
||||
visible_message("<span class='danger'>The electric chair went off!</span>", "<span class='danger'>You hear a deep sharp shock!</span>")
|
||||
|
||||
A.power_light = light
|
||||
A.updateicon()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -277,7 +277,7 @@
|
||||
icon_state = "crown"
|
||||
item_state = "crown"
|
||||
desc = "A gliterring bananium crown with spessjewels in it. Swaggy."
|
||||
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
|
||||
/obj/item/clothing/head/fedora
|
||||
|
||||
@@ -1098,7 +1098,6 @@
|
||||
if( (cell_charge/CELLRATE+perapc) >= lastused_total) // can we draw enough from cell+grid to cover last usage?
|
||||
|
||||
cell_charge = min(cell_maxcharge, cell_charge + CELLRATE * perapc) //recharge with what we can
|
||||
cell.charge = cell_charge
|
||||
add_load(perapc) // so draw what we can from the grid
|
||||
charging = 0
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
/datum/shuttle/ferry/multidock/specops/proc/radio_announce(var/message)
|
||||
if(announcer)
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team", list(1,2))
|
||||
|
||||
/datum/shuttle/ferry/multidock/specops/launch(var/user)
|
||||
if (!can_launch())
|
||||
|
||||
@@ -77,7 +77,8 @@
|
||||
|
||||
/obj/vehicle/train/ambulance/update_icon()
|
||||
if(open)
|
||||
icon_state = "mulebot-hatch"
|
||||
//icon_state = "mulebot-hatch"
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
|
||||
@@ -127,7 +127,8 @@
|
||||
|
||||
/obj/vehicle/train/janitor/update_icon()
|
||||
if(open)
|
||||
icon_state = "mulebot-hatch"
|
||||
//icon_state = "mulebot-hatch"
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
|
||||
@@ -56,6 +56,11 @@
|
||||
|
||||
if(mob.stat == 2)
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/MS = mob
|
||||
if(MS && (MS.species.flags & IS_SYNTHETIC))
|
||||
return
|
||||
|
||||
if(stage <= 1 && clicks == 0) // with a certain chance, the mob may become immune to the disease before it starts properly
|
||||
if(prob(5))
|
||||
mob.antibodies |= antigen
|
||||
|
||||
Reference in New Issue
Block a user