Removes a bunch of sleeps/spawns and makes a few booleans defines

This commit is contained in:
kevinz000
2017-10-14 16:53:17 -07:00
committed by CitadelStationBot
parent b200389630
commit b20e5916ea
24 changed files with 272 additions and 236 deletions

View File

@@ -20,6 +20,7 @@
#define TOXLOSS 4
#define OXYLOSS 8
#define SHAME 16
#define MANUAL_SUICIDE 32 //suicide_act will do the actual killing.
//Citadel code
#define AROUSAL 32

View File

@@ -365,10 +365,13 @@ GLOBAL_LIST_EMPTY(explosions)
else
continue
sleep(100)
for(var/turf/T in wipe_colours)
T.color = null
T.maptext = ""
addtimer(CALLBACK(GLOBAL_PROC, .proc/wipe_color_and_text, wipe_colours), 100)
/proc/wipe_color_and_text(list/atom/wiping)
for(var/i in wiping)
var/atom/A = i
A.color = null
A.maptext = ""
/proc/dyn_explosion(turf/epicenter, power, flash_range, adminlog = 1, ignorecap = 1, flame_range = 0 ,silent = 0, smoke = 1)
if(!power)

View File

@@ -241,11 +241,20 @@
/obj/item/organ/heart/gland/plasma/activate()
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
<<<<<<< HEAD
sleep(150)
if(!owner) return
to_chat(owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>")
sleep(50)
if(!owner) return
=======
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>"), 150)
addtimer(CALLBACK(src, .proc/vomit_plasma), 200)
/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
if(!owner)
return
>>>>>>> b83d777... Removes a bunch of sleeps/spawns and makes a few booleans defines (#31553)
owner.visible_message("<span class='danger'>[owner] vomits a cloud of plasma!</span>")
var/turf/open/T = get_turf(owner)
if(istype(T))

View File

@@ -25,21 +25,24 @@
new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
Warp(target)
/obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target)
new /obj/effect/temp_visual/teleport_abductor(place)
sleep(80)
/obj/machinery/abductor/pad/proc/doMobToLoc(place, atom/movable/target)
flick("alien-pad", src)
target.forceMove(place)
new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
/obj/machinery/abductor/pad/proc/PadToLoc(place)
/obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target)
new /obj/effect/temp_visual/teleport_abductor(place)
sleep(80)
addtimer(CALLBACK(src, .proc/doMobToLoc, place, target), 80)
/obj/machinery/abductor/pad/proc/doPadToLoc(place)
flick("alien-pad", src)
for(var/mob/living/target in get_turf(src))
target.forceMove(place)
new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
/obj/machinery/abductor/pad/proc/PadToLoc(place)
new /obj/effect/temp_visual/teleport_abductor(place)
addtimer(CALLBACK(src, .proc/doPadToLoc, place), 80)
/obj/effect/temp_visual/teleport_abductor
name = "Huh"

View File

@@ -205,20 +205,20 @@
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(4, 0, L)
s.start()
new /obj/effect/temp_visual/revenant(L.loc)
sleep(20)
if(!L.on) //wait, wait, don't shock me
return
flick("[L.base_state]2", L)
for(var/mob/living/carbon/human/M in view(shock_range, L))
if(M == user)
continue
L.Beam(M,icon_state="purple_lightning",time=5)
M.electrocute_act(shock_damage, L, safety=1)
var/datum/effect_system/spark_spread/z = new /datum/effect_system/spark_spread
z.set_up(4, 0, M)
z.start()
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
new /obj/effect/temp_visual/revenant(get_turf(L))
addtimer(CALLBACK(src, .proc/overload_shock, L, user), 20)
/obj/effect/proc_holder/spell/aoe_turf/revenant/overload/proc/overload_shock(obj/machinery/light/L, mob/user)
if(!L.on) //wait, wait, don't shock me
return
flick("[L.base_state]2", L)
for(var/mob/living/carbon/human/M in view(shock_range, L))
if(M == user)
continue
L.Beam(M,icon_state="purple_lightning",time=5)
M.electrocute_act(shock_damage, L, safety=1)
do_sparks(4, FALSE, M)
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
//Defile: Corrupts nearby stuff, unblesses floor tiles.
/obj/effect/proc_holder/spell/aoe_turf/revenant/defile

View File

@@ -434,14 +434,15 @@
sound_to_playing_players('sound/machines/alarm.ogg')
if(SSticker && SSticker.mode)
SSticker.roundend_check_paused = TRUE
sleep(100)
addtimer(CALLBACK(src, .proc/actually_explode), 100)
/obj/machinery/nuclearbomb/proc/actually_explode()
if(!core)
Cinematic(CINEMATIC_NUKE_NO_CORE,world)
SSticker.roundend_check_paused = FALSE
return
GLOB.enter_allowed = 0
GLOB.enter_allowed = FALSE
var/off_station = 0
var/turf/bomb_location = get_turf(src)
@@ -533,9 +534,9 @@ This is here to make the tiles around the station mininuke change when it's arme
H.nuke_disk = null
return
user.visible_message("<span class='warning'>[user] captures [src]!</span>", "<span class='userdanger'>You've got the disk! Defend it with your life!</span>")
loc = H
forceMove(H)
H.nuke_disk = src
return 1
return TRUE
return ..()
/obj/item/disk/nuclear/Destroy(force=FALSE)
@@ -547,20 +548,13 @@ This is here to make the tiles around the station mininuke change when it's arme
/obj/item/disk/nuclear/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is going delta! It looks like [user.p_theyre()] trying to commit suicide!</span>")
playsound(user.loc, 'sound/machines/alarm.ogg', 50, -1, 1)
var/end_time = world.time + 100
var/newcolor = "#00FF00"
while(world.time < end_time)
if(!user)
return
if(newcolor == "#FF0000")
newcolor = "#00FF00"
else
newcolor = "#FF0000"
user.add_atom_colour(newcolor, ADMIN_COLOUR_PRIORITY)
sleep(1)
user.remove_atom_colour(ADMIN_COLOUR_PRIORITY)
user.visible_message("<span class='suicide'>[user] was destroyed by the nuclear blast!</span>")
return OXYLOSS
for(var/i in 1 to 100)
addtimer(CALLBACK(user, /atom/proc/add_atom_colour, (i % 2)? "#00FF00" : "#FF0000", ADMIN_COLOUR_PRIORITY), i)
addtimer(CALLBACK(user, /atom/proc/remove_atom_colour, ADMIN_COLOUR_PRIORITY), 101)
addtimer(CALLBACK(user, /atom/proc/visible_message, "<span class='suicide'>[user] was destroyed by the nuclear blast!</span>"), 101)
addtimer(CALLBACK(user, /mob/living/proc/adjustOxyLoss, 200), 101)
addtimer(CALLBACK(user, /mob/proc/death, 0), 101)
return MANUAL_SUICIDE
/obj/item/disk/fakenucleardisk
name = "cheap plastic imitation of the nuclear authentication disk"

View File

@@ -12,7 +12,7 @@
if(!canSuicide())
return
if(confirm == "Yes")
suiciding = 1
suiciding = TRUE
log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].")
message_admins("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].")
var/obj/item/held_item = get_active_held_item()
@@ -21,7 +21,7 @@
if(damagetype)
if(damagetype & SHAME)
adjustStaminaLoss(200)
suiciding = 0
suiciding = FALSE
return
var/damage_mod = 0
for(var/T in list(BRUTELOSS, FIRELOSS, TOXLOSS, OXYLOSS))
@@ -41,11 +41,14 @@
if(damagetype & OXYLOSS)
adjustOxyLoss(200/damage_mod)
if(damagetype & MANUAL_SUICIDE) //Assume the object will handle the death.
return
//If something went wrong, just do normal oxyloss
if(!(damagetype & (BRUTELOSS | FIRELOSS | TOXLOSS | OXYLOSS) ))
adjustOxyLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
death(0)
death(FALSE)
return
var/suicide_message = pick("[src] is attempting to bite [p_their()] tongue off! It looks like [p_theyre()] trying to commit suicide.", \

View File

@@ -19,6 +19,7 @@
var/list/software = list()
var/userDNA // The DNA string of our assigned user
var/obj/item/device/paicard/card // The card we inhabit
var/hacking = FALSE //Are we hacking a door?
var/speakStatement = "states"
var/speakExclamation = "declares"
@@ -121,6 +122,29 @@
emittersemicd = TRUE
addtimer(CALLBACK(src, .proc/emittercool), 600)
/mob/living/silicon/pai/Life()
if(hacking)
process_hack()
return ..()
/mob/living/silicon/pai/proc/process_hack()
if(cable && cable.machine && istype(cable.machine, /obj/machinery/door) && cable.machine == hackdoor && get_dist(src, hackdoor) <= 1)
hackprogress = Clamp(hackprogress + 4, 0, 100)
else
temp = "Door Jack: Connection to airlock has been lost. Hack aborted."
hackprogress = 0
hacking = FALSE
hackdoor = null
return
if(screen == "doorjack" && subscreen == 0) // Update our view, if appropriate
paiInterface()
if(hackprogress >= 100)
hackprogress = 0
var/obj/machinery/door/D = cable.machine
D.open()
hacking = FALSE
/mob/living/silicon/pai/make_laws()
laws = new /datum/ai_laws/pai()
return TRUE

View File

@@ -28,44 +28,44 @@
var/dat = ""
var/left_part = ""
var/right_part = softwareMenu()
src.set_machine(src)
set_machine(src)
if(temp)
left_part = temp
else if(src.stat == DEAD) // Show some flavor text if the pAI is dead
else if(stat == DEAD) // Show some flavor text if the pAI is dead
left_part = "<b><font color=red><3E>Rr<52>R <20>a<EFBFBD><61> <20><>Rr<52><72><EFBFBD><EFBFBD>o<EFBFBD></font></b>"
right_part = "<pre>Program index hash not found</pre>"
else
switch(src.screen) // Determine which interface to show here
switch(screen) // Determine which interface to show here
if("main")
left_part = ""
if("directives")
left_part = src.directives()
left_part = directives()
if("pdamessage")
left_part = src.pdamessage()
left_part = pdamessage()
if("buy")
left_part = downloadSoftware()
if("manifest")
left_part = src.softwareManifest()
left_part = softwareManifest()
if("medicalrecord")
left_part = src.softwareMedicalRecord()
left_part = softwareMedicalRecord()
if("securityrecord")
left_part = src.softwareSecurityRecord()
left_part = softwareSecurityRecord()
if("translator")
left_part = src.softwareTranslator()
left_part = softwareTranslator()
if("atmosensor")
left_part = src.softwareAtmo()
left_part = softwareAtmo()
if("securityhud")
left_part = src.facialRecognition()
left_part = facialRecognition()
if("medicalhud")
left_part = src.medicalAnalysis()
left_part = medicalAnalysis()
if("doorjack")
left_part = src.softwareDoor()
left_part = softwareDoor()
if("camerajack")
left_part = src.softwareCamera()
left_part = softwareCamera()
if("signaller")
left_part = src.softwareSignal()
left_part = softwareSignal()
//usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc
@@ -119,16 +119,16 @@
var/soft = href_list["software"]
var/sub = href_list["sub"]
if(soft)
src.screen = soft
screen = soft
if(sub)
src.subscreen = text2num(sub)
subscreen = text2num(sub)
switch(soft)
// Purchasing new software
if("buy")
if(subscreen == 1)
var/target = href_list["buy"]
if(available_software.Find(target) && !software.Find(target))
var/cost = src.available_software[target]
var/cost = available_software[target]
if(ram >= cost)
software.Add(target)
ram -= cost
@@ -259,17 +259,17 @@
// this is PERMAMENT.
if("doorjack")
if(href_list["jack"])
if(src.cable && src.cable.machine)
src.hackdoor = src.cable.machine
src.hackloop()
if(cable && cable.machine)
hackdoor = cable.machine
hackloop()
if(href_list["cancel"])
src.hackdoor = null
hackdoor = null
if(href_list["cable"])
var/turf/T = get_turf(src.loc)
var/turf/T = get_turf(loc)
cable = new /obj/item/pai_cable(T)
T.visible_message("<span class='warning'>A port on [src] opens to reveal [src.cable], which promptly falls to the floor.</span>", "<span class='italics'>You hear the soft click of something light and hard falling to the ground.</span>")
//src.updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window
src.paiInterface() // So we'll just call the update directly rather than doing some default checks
T.visible_message("<span class='warning'>A port on [src] opens to reveal [cable], which promptly falls to the floor.</span>", "<span class='italics'>You hear the soft click of something light and hard falling to the ground.</span>")
//updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window
paiInterface() // So we'll just call the update directly rather than doing some default checks
return
// MENUS
@@ -287,7 +287,7 @@
// Basic
dat += "<b>Basic</b> <br>"
for(var/s in src.software)
for(var/s in software)
if(s == "digital messenger")
dat += "<a href='byond://?src=\ref[src];software=pdamessage;sub=0'>Digital Messenger</a> <br>"
if(s == "crew manifest")
@@ -304,15 +304,15 @@
// Advanced
dat += "<b>Advanced</b> <br>"
for(var/s in src.software)
for(var/s in software)
if(s == "atmosphere sensor")
dat += "<a href='byond://?src=\ref[src];software=atmosensor;sub=0'>Atmospheric Sensor</a> <br>"
if(s == "heartbeat sensor")
dat += "<a href='byond://?src=\ref[src];software=[s]'>Heartbeat Sensor</a> <br>"
if(s == "security HUD")
dat += "<a href='byond://?src=\ref[src];software=securityhud;sub=0'>Facial Recognition Suite</a>[(src.secHUD) ? "<font color=#55FF55> On</font>" : "<font color=#FF5555> Off</font>"] <br>"
dat += "<a href='byond://?src=\ref[src];software=securityhud;sub=0'>Facial Recognition Suite</a>[(secHUD) ? "<font color=#55FF55> On</font>" : "<font color=#FF5555> Off</font>"] <br>"
if(s == "medical HUD")
dat += "<a href='byond://?src=\ref[src];software=medicalhud;sub=0'>Medical Analysis Suite</a>[(src.medHUD) ? "<font color=#55FF55> On</font>" : "<font color=#FF5555> Off</font>"] <br>"
dat += "<a href='byond://?src=\ref[src];software=medicalhud;sub=0'>Medical Analysis Suite</a>[(medHUD) ? "<font color=#55FF55> On</font>" : "<font color=#FF5555> Off</font>"] <br>"
if(s == "universal translator")
var/translator_on = (flags_2 & OMNITONGUE_2)
dat += "<a href='byond://?src=\ref[src];software=translator;sub=0'>Universal Translator</a>[translator_on ? "<font color=#55FF55> On</font>" : "<font color=#FF5555> Off</font>"] <br>"
@@ -333,12 +333,12 @@
var/dat = ""
dat += "<h2>CentCom pAI Module Subversion Network</h2><br>"
dat += "<pre>Remaining Available Memory: [src.ram]</pre><br>"
dat += "<pre>Remaining Available Memory: [ram]</pre><br>"
dat += "<p style=\"text-align:center\"><b>Trunks available for checkout</b><br>"
for(var/s in available_software)
if(!software.Find(s))
var/cost = src.available_software[s]
var/cost = available_software[s]
var/displayName = uppertext(s)
dat += "<a href='byond://?src=\ref[src];software=buy;sub=1;buy=[s]'>[displayName]</a> ([cost]) <br>"
else
@@ -351,12 +351,12 @@
/mob/living/silicon/pai/proc/directives()
var/dat = ""
dat += "[(src.master) ? "Your master: [src.master] ([src.master_dna])" : "You are bound to no one."]"
dat += "[(master) ? "Your master: [master] ([master_dna])" : "You are bound to no one."]"
dat += "<br><br>"
dat += "<a href='byond://?src=\ref[src];software=directive;getdna=1'>Request carrier DNA sample</a><br>"
dat += "<h2>Directives</h2><br>"
dat += "<b>Prime Directive</b><br>"
dat += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[src.laws.zeroth]<br>"
dat += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[laws.zeroth]<br>"
dat += "<b>Supplemental Directives</b><br>"
for(var/slaws in laws.supplied)
dat += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[slaws]<br>"
@@ -398,14 +398,14 @@
Frequency:
<A href='byond://?src=\ref[src];software=signaller;freq=-10;'>-</A>
<A href='byond://?src=\ref[src];software=signaller;freq=-2'>-</A>
[format_frequency(src.sradio.frequency)]
[format_frequency(sradio.frequency)]
<A href='byond://?src=\ref[src];software=signaller;freq=2'>+</A>
<A href='byond://?src=\ref[src];software=signaller;freq=10'>+</A><BR>
Code:
<A href='byond://?src=\ref[src];software=signaller;code=-5'>-</A>
<A href='byond://?src=\ref[src];software=signaller;code=-1'>-</A>
[src.sradio.code]
[sradio.code]
<A href='byond://?src=\ref[src];software=signaller;code=1'>+</A>
<A href='byond://?src=\ref[src];software=signaller;code=5'>+</A><BR>
@@ -476,7 +476,7 @@
/mob/living/silicon/pai/proc/facialRecognition()
var/dat = {"<h3>Facial Recognition Suite</h3><br>
When enabled, this package will scan all viewable faces and compare them against the known criminal database, providing real-time graphical data about any detected persons of interest.<br><br>
The package is currently [ (src.secHUD) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled.</font><br>
The package is currently [ (secHUD) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled.</font><br>
<a href='byond://?src=\ref[src];software=securityhud;sub=0;toggle=1'>Toggle Package</a><br>
"}
return dat
@@ -484,16 +484,16 @@
// Medical HUD
/mob/living/silicon/pai/proc/medicalAnalysis()
var/dat = ""
if(src.subscreen == 0)
if(subscreen == 0)
dat += {"<h3>Medical Analysis Suite</h3><br>
<h4>Visual Status Overlay</h4><br>
When enabled, this package will scan all nearby crewmembers' vitals and provide real-time graphical data about their state of health.<br><br>
The suite is currently [ (src.medHUD) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled.</font><br>
The suite is currently [ (medHUD) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled.</font><br>
<a href='byond://?src=\ref[src];software=medicalhud;sub=0;toggle=1'>Toggle Suite</a><br>
<br>
<a href='byond://?src=\ref[src];software=medicalhud;sub=1'>Host Bioscan</a><br>
"}
if(src.subscreen == 1)
if(subscreen == 1)
dat += {"<h3>Medical Analysis Suite</h3><br>
<h4>Host Bioscan</h4><br>
"}
@@ -501,8 +501,8 @@
if(!isliving(M))
while(!isliving(M))
if(isturf(M))
src.temp = "Error: No biological host found. <br>"
src.subscreen = 0
temp = "Error: No biological host found. <br>"
subscreen = 0
return dat
M = M.loc
dat += {"Bioscan Results for [M]: <br>"
@@ -529,7 +529,7 @@
/mob/living/silicon/pai/proc/softwareAtmo()
var/dat = "<h3>Atmospheric Sensor</h4>"
var/turf/T = get_turf(src.loc)
var/turf/T = get_turf(loc)
if (isnull(T))
dat += "Unable to obtain a reading.<br>"
else
@@ -556,14 +556,14 @@
var/dat = "<h3>Camera Jack</h3>"
dat += "Cable status : "
if(!src.cable)
if(!cable)
dat += "<font color=#FF5555>Retracted</font> <br>"
return dat
if(!src.cable.machine)
if(!cable.machine)
dat += "<font color=#FFFF55>Extended</font> <br>"
return dat
var/obj/machinery/machine = src.cable.machine
var/obj/machinery/machine = cable.machine
dat += "<font color=#55FF55>Connected</font> <br>"
if(!istype(machine, /obj/machinery/camera))
@@ -574,55 +574,37 @@
/mob/living/silicon/pai/proc/softwareDoor()
var/dat = "<h3>Airlock Jack</h3>"
dat += "Cable status : "
if(!src.cable)
if(!cable)
dat += "<font color=#FF5555>Retracted</font> <br>"
dat += "<a href='byond://?src=\ref[src];software=doorjack;cable=1;sub=0'>Extend Cable</a> <br>"
return dat
if(!src.cable.machine)
if(!cable.machine)
dat += "<font color=#FFFF55>Extended</font> <br>"
return dat
var/obj/machinery/machine = src.cable.machine
var/obj/machinery/machine = cable.machine
dat += "<font color=#55FF55>Connected</font> <br>"
if(!istype(machine, /obj/machinery/door))
dat += "Connected device's firmware does not appear to be compatible with Airlock Jack protocols.<br>"
return dat
// var/obj/machinery/airlock/door = machine
if(!src.hackdoor)
if(!hackdoor)
dat += "<a href='byond://?src=\ref[src];software=doorjack;jack=1;sub=0'>Begin Airlock Jacking</a> <br>"
else
dat += "Jack in progress... [src.hackprogress]% complete.<br>"
dat += "Jack in progress... [hackprogress]% complete.<br>"
dat += "<a href='byond://?src=\ref[src];software=doorjack;cancel=1;sub=0'>Cancel Airlock Jack</a> <br>"
//src.hackdoor = machine
//src.hackloop()
return dat
// Door Jack - supporting proc
/mob/living/silicon/pai/proc/hackloop()
var/turf/T = get_turf(src.loc)
var/turf/T = get_turf(src)
for(var/mob/living/silicon/ai/AI in GLOB.player_list)
if(T.loc)
to_chat(AI, "<font color = red><b>Network Alert: Brute-force encryption crack in progress in [T.loc].</b></font>")
else
to_chat(AI, "<font color = red><b>Network Alert: Brute-force encryption crack in progress. Unable to pinpoint location.</b></font>")
while(src.hackprogress < 100)
if(src.cable && src.cable.machine && istype(src.cable.machine, /obj/machinery/door) && src.cable.machine == src.hackdoor && get_dist(src, src.hackdoor) <= 1)
hackprogress += rand(1, 10)
else
src.temp = "Door Jack: Connection to airlock has been lost. Hack aborted."
hackprogress = 0
src.hackdoor = null
return
if(hackprogress >= 100) // This is clunky, but works. We need to make sure we don't ever display a progress greater than 100,
hackprogress = 100 // but we also need to reset the progress AFTER it's been displayed
if(src.screen == "doorjack" && src.subscreen == 0) // Update our view, if appropriate
src.paiInterface()
if(hackprogress >= 100)
src.hackprogress = 0
var/obj/machinery/door/D = cable.machine
D.open()
sleep(50) // Update every 5 seconds
hacking = TRUE
// Digital Messenger
/mob/living/silicon/pai/proc/pdamessage()
@@ -635,7 +617,7 @@
dat += "<ul>"
if(!pda.toff)
for (var/obj/item/device/pda/P in sortNames(get_viewable_pdas()))
if (P == src.pda)
if (P == pda)
continue
dat += "<li><a href='byond://?src=\ref[src];software=pdamessage;target=\ref[P]'>[P]</a>"
dat += "</li>"

View File

@@ -114,6 +114,11 @@ They *could* go in their appropriate files, but this is supposed to be modular
corrupt()
update_icon()
/obj/machinery/proc/AI_notify_hack()
var/turf/location = get_turf(src)
var/alertstr = "<span class='userdanger'>Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]</span>."
for(var/mob/living/silicon/ai/AI in GLOB.player_list)
to_chat(AI, alertstr)
//RDCONSOLE//
/obj/machinery/computer/rdconsole/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
@@ -123,10 +128,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
. = DRAIN_RD_HACK_FAILED
to_chat(H, "<span class='notice'>Hacking \the [src]...</span>")
spawn(0)
var/turf/location = get_turf(H)
for(var/mob/living/silicon/ai/AI in GLOB.player_list)
to_chat(AI, "<span class='userdanger'>Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]</span>.")
AI_notify_hack()
if(files && files.known_tech.len)
for(var/datum/tech/current_data in S.stored_research)
@@ -145,7 +147,6 @@ They *could* go in their appropriate files, but this is supposed to be modular
to_chat(H, "<span class='notice'>Data analyzed. Process finished.</span>")
//RD SERVER//
//Shamelessly copypasted from above, since these two used to be the same proc, but with MANY colon operators
/obj/machinery/r_n_d/server/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
@@ -155,10 +156,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
. = DRAIN_RD_HACK_FAILED
to_chat(H, "<span class='notice'>Hacking \the [src]...</span>")
spawn(0)
var/turf/location = get_turf(H)
for(var/mob/living/silicon/ai/AI in GLOB.player_list)
to_chat(AI, "<span class='userdanger'>Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]</span>.")
AI_notify_hack()
if(files && files.known_tech.len)
for(var/datum/tech/current_data in S.stored_research)

View File

@@ -108,15 +108,16 @@
user.visible_message("<span class='suicide'>[user] scratches a grid on [user.p_their()] wrist with the paper! It looks like [user.p_theyre()] trying to commit sudoku...</span>")
return (BRUTELOSS)
/obj/item/paper/proc/reset_spamflag()
spam_flag = FALSE
/obj/item/paper/attack_self(mob/user)
user.examinate(src)
if(rigged && (SSevents.holidays && SSevents.holidays[APRIL_FOOLS]))
if(spam_flag == 0)
spam_flag = 1
if(!spam_flag)
spam_flag = TRUE
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
spawn(20)
spam_flag = 0
addtimer(CALLBACK(src, .proc/reset_spamflag), 20)
/obj/item/paper/attack_ai(mob/living/silicon/ai/user)

View File

@@ -443,9 +443,12 @@
to_chat(user, "<span class='notice'>[pictures_left] photos left.</span>")
icon_state = "camera_off"
on = FALSE
spawn(64)
icon_state = "camera"
on = TRUE
addtimer(CALLBACK(src, .proc/cooldown), 64)
/obj/item/device/camera/proc/cooldown()
set waitfor = FALSE
icon_state = "camera"
on = TRUE
/obj/item/device/camera/siliconcam/proc/toggle_camera_mode()
if(in_camera_mode)

View File

@@ -260,17 +260,15 @@
if(AMS.processing)
AMS.shutdown_core()
AMS.control_unit = null
spawn(10)
AMS.controllerscan()
addtimer(CALLBACK(AMS, /obj/machinery/am_shielding.proc/controllerscan), 10)
linked_shielding = list()
else
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
AMS.update_icon()
spawn(20)
shield_icon_delay = 0
return
addtimer(CALLBACK(src, .proc/reset_shield_icon_delay), 20)
/obj/machinery/power/am_control_unit/proc/reset_shield_icon_delay()
shield_icon_delay = 0
/obj/machinery/power/am_control_unit/proc/check_core_stability()
if(stored_core_stability_delay || linked_cores.len <= 0)
@@ -280,10 +278,10 @@
for(var/obj/machinery/am_shielding/AMS in linked_cores)
stored_core_stability += AMS.stability
stored_core_stability/=linked_cores.len
spawn(40)
stored_core_stability_delay = 0
return
addtimer(CALLBACK(src, .proc/reset_stored_core_stability_delay), 40)
/obj/machinery/power/am_control_unit/proc/reset_stored_core_stability_delay()
stored_core_stability_delay = 0
/obj/machinery/power/am_control_unit/interact(mob/user)
if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))

View File

@@ -399,6 +399,11 @@ By design, d1 is the smallest direction and d2 is the highest
if(PN.is_empty()) //can happen with machines made nodeless when smoothing cables
qdel(PN)
/obj/structure/cable/proc/auto_propogate_cut_cable(obj/O)
if(O && !QDELETED(O))
var/datum/powernet/newPN = new()// creates a new powernet...
propagate_network(O, newPN)//... and propagates it to the other side of the cable
// cut the cable's powernet at this cable and updates the powergrid
/obj/structure/cable/proc/cut_cable_from_powernet(remove=TRUE)
var/turf/T1 = loc
@@ -426,10 +431,7 @@ By design, d1 is the smallest direction and d2 is the highest
loc = null
powernet.remove_cable(src) //remove the cut cable from its powernet
spawn(0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
if(O && !QDELETED(O))
var/datum/powernet/newPN = new()// creates a new powernet...
propagate_network(O, newPN)//... and propagates it to the other side of the cable
addtimer(CALLBACK(src, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
// Disconnect machines connected to nodes
if(d1 == 0) // if we cut a node (O-X) cable

View File

@@ -207,7 +207,38 @@
/obj/item/gun/proc/recharge_newshot()
return
/obj/item/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override, bonus_spread = 0)
/obj/item/gun/proc/process_burst(mob/living/user, atom/target, message = TRUE, params, zone_override, sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0)
if(!user || !firing_burst)
firing_burst = FALSE
return FALSE
if(!issilicon(user))
if( iteration > 1 && !(user.is_holding(src))) //for burst firing
firing_burst = FALSE
return FALSE
if(chambered && chambered.BB)
if(randomspread)
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
else //Smart spread
sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread))
if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd))
shoot_with_empty_chamber(user)
firing_burst = FALSE
return FALSE
else
if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot
shoot_live_shot(user, 1, target, message)
else
shoot_live_shot(user, 0, target, message)
else
shoot_with_empty_chamber(user)
firing_burst = FALSE
return FALSE
process_chamber()
update_icon()
return TRUE
/obj/item/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = TRUE, params, zone_override, bonus_spread = 0)
add_fingerprint(user)
if(semicd)
@@ -221,34 +252,10 @@
var/randomized_bonus_spread = rand(0, bonus_spread)
if(burst_size > 1)
firing_burst = 1
firing_burst = TRUE
for(var/i = 1 to burst_size)
if(!user)
break
if(!issilicon(user))
if( i>1 && !(user.is_holding(src))) //for burst firing
break
if(chambered && chambered.BB)
if(randomspread)
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
else //Smart spread
sprd = round((((rand_spr/burst_size) * i) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread))
if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd))
shoot_with_empty_chamber(user)
break
else
if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot
shoot_live_shot(user, 1, target, message)
else
shoot_live_shot(user, 0, target, message)
else
shoot_with_empty_chamber(user)
break
process_chamber()
update_icon()
sleep(fire_delay)
firing_burst = 0
addtimer(CALLBACK(src, .proc/process_burst, user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), min(fire_delay * (i - 1), 0))
firing_burst = FALSE
else
if(chambered)
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
@@ -265,14 +272,16 @@
return
process_chamber()
update_icon()
semicd = 1
spawn(fire_delay)
semicd = 0
semicd = TRUE
addtimer(CALLBACK(src, .proc/reset_semicd), fire_delay)
if(user)
user.update_inv_hands()
SSblackbox.add_details("gun_fired","[src.type]")
return 1
return TRUE
/obj/item/gun/proc/reset_semicd()
semicd = FALSE
/obj/item/gun/update_icon()
..()

View File

@@ -150,7 +150,7 @@
toggle_gunlight()
/obj/item/gun/energy/suicide_act(mob/user)
if (src.can_shoot() && can_trigger_gun(user))
if (can_shoot() && can_trigger_gun(user))
user.visible_message("<span class='suicide'>[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!</span>")
sleep(25)
if(user.is_holding(src))

View File

@@ -469,7 +469,9 @@
layer = ABOVE_MOB_LAYER
hal_target.client.images += blood
animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5)
sleep(5)
addtimer(CALLBACK(src, .proc/cleanup_blood), 5)
/obj/item/projectile/hallucination/proc/cleanup_blood(image/blood)
hal_target.client.images -= blood
qdel(blood)

View File

@@ -57,8 +57,7 @@
if(powered())
stat &= ~NOPOWER
else
spawn(rand(0, 15))
stat |= NOPOWER
stat |= NOPOWER
/obj/machinery/chem_master/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I))

View File

@@ -49,8 +49,7 @@
to_chat(user, "<span class='notice'>You swallow a gulp of [src].</span>")
var/fraction = min(5/reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
spawn(5)
reagents.trans_to(M, 5)
addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)

View File

@@ -101,13 +101,14 @@
reagents.maximum_volume = 0 //Makes them useless afterwards
container_type = NONE
update_icon()
spawn(80)
if(iscyborg(user) && !reagents.total_volume)
var/mob/living/silicon/robot/R = user
if(R.cell.use(100))
reagents.add_reagent_list(list_reagents)
update_icon()
return
addtimer(CALLBACK(src, .proc/cyborg_recharge, user), 80)
/obj/item/reagent_containers/hypospray/medipen/proc/cyborg_recharge(mob/living/silicon/robot/user)
if(!reagents.total_volume && iscyborg(user))
var/mob/living/silicon/robot/R = user
if(R.cell.use(100))
reagents.add_reagent_list(list_reagents)
update_icon()
/obj/item/reagent_containers/hypospray/medipen/update_icon()
if(reagents.total_volume > 0)

View File

@@ -24,7 +24,9 @@
know it'll be worth it.</span>")
icon_state = "slots2"
playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, 0)
sleep(50)
addtimer(CALLBACK(src, .proc/determine_victor, user), 50)
/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user)
icon_state = "slots1"
in_use = FALSE
if(prob(win_prob))
@@ -37,6 +39,7 @@
if(user)
to_chat(user, "<span class='boldwarning'>Fucking machine! Must be rigged. Still... one more try couldn't hurt, right?</span>")
/obj/structure/cursed_money
name = "bag of money"
desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!"
@@ -65,8 +68,6 @@
user.put_in_hands(critical_fail)
qdel(src)
/obj/effect/gluttony //Gluttony's wall: Used in the Gluttony ruin. Only lets the overweight through.
name = "gluttony's wall"
desc = "Only those who truly indulge may pass."

View File

@@ -11,15 +11,15 @@
charge_counter = charge_max
attached_hand = null
to_chat(user, "<span class='notice'>You draw the power out of your hand.</span>")
return 0
return FALSE
..()
/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets,mob/user = usr)
for(var/mob/living/carbon/C in targets)
if(!attached_hand)
if(!ChargeHand(C))
return 0
while(attached_hand) //hibernate untill the spell is actually used
return FALSE
while(attached_hand)
charge_counter = 0
stoplag(1)
@@ -30,9 +30,9 @@
charge_counter = charge_max
attached_hand = null
to_chat(user, "<span class='warning'>Your hands are full!</span>")
return 0
return FALSE
to_chat(user, "<span class='notice'>You channel the power of the spell to your hand.</span>")
return 1
return TRUE
/obj/effect/proc_holder/spell/targeted/touch/disintegrate
@@ -58,4 +58,4 @@
cooldown_min = 200 //100 deciseconds reduction per rank
action_icon_state = "statue"
sound = 'sound/magic/fleshtostone.ogg'
sound = 'sound/magic/fleshtostone.ogg'

View File

@@ -24,8 +24,10 @@
synthesizing = TRUE
to_chat(owner, "<span class='notice'>You feel less hungry...</span>")
owner.nutrition += 50
sleep(50)
synthesizing = FALSE
addtimer(CALLBACK(src, .proc/synth_cool), 50)
/obj/item/organ/cyberimp/chest/nutriment/proc/synth_cool()
synthesizing = FALSE
/obj/item/organ/cyberimp/chest/nutriment/emp_act(severity)
if(!owner)

View File

@@ -253,6 +253,7 @@
var/static/regex/honk_words = regex("ho+nk") //hooooooonk
var/static/regex/multispin_words = regex("like a record baby|right round")
var/i = 0
//STUN
if(findtext(message, stun_words))
cooldown = COOLDOWN_STUN
@@ -362,28 +363,30 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
var/text = ""
if(is_devil(L))
var/datum/antagonist/devil/devilinfo = is_devil(L)
L.say("[devilinfo.truename]")
text = devilinfo.truename
else
L.say("[L.real_name]")
sleep(5) //So the chat flows more naturally
text = L.real_name
addtimer(CALLBACK(L, /atom/movable/proc/say, text), 5 * i)
i++
//SAY MY NAME
else if((findtext(message, saymyname_words)))
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
L.say("[user.name]!") //"Unknown!"
sleep(5) //So the chat flows more naturally
addtimer(CALLBACK(L, /atom/movable/proc/say, user.name), 5 * i)
i++
//KNOCK KNOCK
else if((findtext(message, knockknock_words)))
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
L.say("Who's there?")
sleep(5) //So the chat flows more naturally
addtimer(CALLBACK(L, /atom/movable/proc/say, "Who's there?"), 5 * i)
i++
//STATE LAWS
else if((findtext(message, statelaws_words)))
@@ -403,11 +406,10 @@
direction = WEST
else if(findtext(message, right_words))
direction = EAST
for(var/i=1, i<=(5*power_multiplier), i++)
for(var/iter in 1 to 5 * power_multiplier)
for(var/V in listeners)
var/mob/living/L = V
step(L, direction ? direction : pick(GLOB.cardinals))
sleep(10)
addtimer(CALLBACK(GLOBAL_PROC, .proc/_step, L, direction? direction : pick(GLOB.cardinals)), 10 * (iter - 1))
//WALK
else if((findtext(message, walk_words)))
@@ -429,33 +431,33 @@
else if((findtext(message, helpintent_words)))
cooldown = COOLDOWN_MEME
for(var/mob/living/carbon/human/H in listeners)
H.a_intent_change(INTENT_HELP)
H.click_random_mob()
sleep(2) //delay to make it feel more natural
addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HELP), i * 2)
addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2)
i++
//DISARM INTENT
else if((findtext(message, disarmintent_words)))
cooldown = COOLDOWN_MEME
for(var/mob/living/carbon/human/H in listeners)
H.a_intent_change(INTENT_DISARM)
H.click_random_mob()
sleep(2) //delay to make it feel more natural
addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_DISARM), i * 2)
addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2)
i++
//GRAB INTENT
else if((findtext(message, grabintent_words)))
cooldown = COOLDOWN_MEME
for(var/mob/living/carbon/human/H in listeners)
H.a_intent_change(INTENT_GRAB)
H.click_random_mob()
sleep(2) //delay to make it feel more natural
addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_GRAB), i * 2)
addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2)
i++
//HARM INTENT
else if((findtext(message, harmintent_words)))
cooldown = COOLDOWN_MEME
for(var/mob/living/carbon/human/H in listeners)
H.a_intent_change(INTENT_HARM)
H.click_random_mob()
sleep(2) //delay to make it feel more natural
addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HARM), i * 2)
addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2)
i++
//THROW/CATCH
else if((findtext(message, throwmode_words)))
@@ -475,8 +477,8 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
L.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"))
sleep(5) //So the chat flows more naturally
addtimer(CALLBACK(L, /atom/movable/proc/say, pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")), 5 * i)
i++
//GET UP
else if((findtext(message, getup_words)))
@@ -511,8 +513,8 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
L.emote("dance")
sleep(5) //So the chat flows more naturally
addtimer(CALLBACK(L, /mob/living/.proc/emote, "dance"), 5 * i)
i++
//JUMP
else if((findtext(message, jump_words)))
@@ -520,33 +522,33 @@
for(var/V in listeners)
var/mob/living/L = V
if(prob(25))
L.say("HOW HIGH?!!")
L.emote("jump")
sleep(5) //So the chat flows more naturally
addtimer(CALLBACK(L, /atom/movable/proc/say, "HOW HIGH?!!"), 5 * i)
addtimer(CALLBACK(L, /mob/living/.proc/emote, "jump"), 5 * i)
i++
//SALUTE
else if((findtext(message, salute_words)))
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
L.emote("salute")
sleep(5) //So the chat flows more naturally
addtimer(CALLBACK(L, /mob/living/.proc/emote, "salute"), 5 * i)
i++
//PLAY DEAD
else if((findtext(message, deathgasp_words)))
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
L.emote("deathgasp")
sleep(5) //So the chat flows more naturally
addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i)
i++
//PLEASE CLAP
else if((findtext(message, clap_words)))
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
L.emote("clap")
sleep(5) //So the chat flows more naturally
addtimer(CALLBACK(L, /mob/living/.proc/emote, "clap"), 5 * i)
i++
//HONK
else if((findtext(message, honk_words)))