Merge branch 'master' of https://github.com/tgstation/-tg-station into listmos

Conflicts:
	code/controllers/subsystem/air.dm
	code/datums/gas_mixture.dm
	code/game/objects/items/devices/scanners.dm
	code/modules/mob/living/carbon/human/species.dm
	code/modules/mob/living/carbon/life.dm
	tgui/assets/tgui.css
	tgui/assets/tgui.js
	tgui/scripts/interfaces/atmos_filter.ract
This commit is contained in:
duncathan
2016-01-13 20:07:21 -06:00
398 changed files with 7356 additions and 6636 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ var/list/admin_ranks = list() //list of all admin_rank datums
name = init_name
switch(name)
if("Removed",null,"")
spawn(-1)
spawn(0)
qdel(src)
throw EXCEPTION("invalid admin-rank name")
return
+4 -2
View File
@@ -322,10 +322,12 @@ var/list/admin_verbs_hideable = list(
if(istype(mob,/mob/dead/observer))
//re-enter
var/mob/dead/observer/ghost = mob
if (!ghost.can_reenter_corpse)
if(!ghost.mind || !ghost.mind.current) //won't do anything if there is no body
return
if(!ghost.can_reenter_corpse)
log_admin("[key_name(usr)] re-entered corpse")
message_admins("[key_name_admin(usr)] re-entered corpse")
ghost.can_reenter_corpse = 1 //just in-case.
ghost.can_reenter_corpse = 1 //force re-entering even when otherwise not possible
ghost.reenter_corpse()
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else if(istype(mob,/mob/new_player))
+2 -2
View File
@@ -16,12 +16,12 @@ var/list/admin_datums = list()
/datum/admins/New(datum/admin_rank/R, ckey)
if(!ckey)
spawn(-1)
spawn(0)
del(src)
throw EXCEPTION("Admin datum created without a ckey")
return
if(!istype(R))
spawn(-1)
spawn(0)
del(src)
throw EXCEPTION("Admin datum created without a rank")
return
+28 -13
View File
@@ -349,7 +349,8 @@
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td></tr>"
else
dat += "<tr><td><i>Nuclear Operative not found!</i></td></tr>"
dat += "<tr><td><i><a href='?_src_=vars;Vars=\ref[N]'>[N.name]([N.key])</a> Nuclear Operative Body destroyed!</i></td>"
dat += "<td><A href='?priv_msg=[N.key]'>PM</A></td></tr>"
dat += "</table><br><table><tr><td><B>Nuclear Disk(s)</B></td></tr>"
for(var/obj/item/weapon/disk/nuclear/N in poi_list)
dat += "<tr><td>[N.name], "
@@ -370,7 +371,8 @@
for(var/datum/mind/N in ticker.mode.head_revolutionaries)
var/mob/M = N.current
if(!M)
dat += "<tr><td><i>Head Revolutionary not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[N]'>[N.name]([N.key])</a><i>Head Revolutionary body destroyed!</i></td>"
dat += "<td><A href='?priv_msg=[N.key]'>PM</A></td></tr>"
else
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a> <b>(Leader)</b>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td></tr>"
@@ -388,7 +390,8 @@
var/turf/mob_loc = get_turf(M)
dat += "<td>[mob_loc.loc]</td></tr>"
else
dat += "<tr><td><i>Head not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[N]'>[N.name]([N.key])</a><i>Head body destroyed!</i></td>"
dat += "<td><A href='?priv_msg=[N.key]'>PM</A></td></tr>"
dat += "</table>"
for(var/datum/gang/G in ticker.mode.gangs)
@@ -396,7 +399,8 @@
for(var/datum/mind/N in G.bosses)
var/mob/M = N.current
if(!M)
dat += "<tr><td><i>Gang Boss not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[N]'>[N.name]([N.key])</a><i>Gang Boss body destroyed!</i></td>"
dat += "<td><A href='?priv_msg=[N.key]'>PM</A></td></tr>"
else
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a> <b>(Boss)</b>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td></tr>"
@@ -416,7 +420,8 @@
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A HREF='?_src_=holder;traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Changeling not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[changeling]'>[changeling.name]([changeling.key])</a><i>Changeling body destroyed!</i></td>"
dat += "<td><A href='?priv_msg=[changeling.key]'>PM</A></td></tr>"
dat += "</table>"
if(ticker.mode.wizards.len > 0)
@@ -428,7 +433,8 @@
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A HREF='?_src_=holder;traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Wizard not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[wizard]'>[wizard.name]([wizard.key])</a><i>Wizard body destroyed!</i></td></tr>"
dat += "<td><A href='?priv_msg=[wizard.key]'>PM</A></td></tr>"
dat += "</table>"
if(ticker.mode.apprentices.len > 0)
@@ -440,7 +446,8 @@
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A HREF='?_src_=holder;traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Apprentice not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[apprentice]'>[apprentice.name]([apprentice.key])</a><i>Apprentice body destroyed!!</i></td></tr>"
dat += "<td><A href='?priv_msg=[apprentice.key]'>PM</A></td></tr>"
dat += "</table>"
if(ticker.mode.cult.len)
@@ -509,7 +516,8 @@
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A HREF='?_src_=holder;traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Traitor not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[traitor]'>[traitor.name]([traitor.key])</a><i>Traitor body destroyed!</i></td>"
dat += "<td><A href='?priv_msg=[traitor.key]'>PM</A></td></tr>"
dat += "</table>"
if(ticker.mode.shadows.len)
@@ -519,6 +527,9 @@
if(M)
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td></tr>"
else
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[N]'>[N.name]([N.key])</a><i>Shadowling body destroyed!</i></td>"
dat += "<td><A href='?priv_msg=[N.key]'>PM</A></td></tr>"
dat += "</table>"
if(ticker.mode.thralls.len)
@@ -539,7 +550,8 @@
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A HREF='?_src_=holder;traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Abductor not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[abductor]'>[abductor.name]([abductor.key])</a><i>Abductor body destroyed!</i></td></tr>"
dat += "<td><A href='?priv_msg=[abductor.key]'>PM</A></td>"
dat += "</table>"
dat += "<br><table cellspacing=5><tr><td><B>Abductees</B></td><td></td><td></td></tr>"
for(var/obj/machinery/abductor/experiment/E in machines)
@@ -550,7 +562,8 @@
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A HREF='?_src_=holder;traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Abductee not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[abductee]'>[abductee.name]([abductee.key])</a><i>Abductee body destroyed!</i></td>"
dat += "<td><A href='?priv_msg=[abductee.key]'>PM</A></td></tr>"
dat += "</table>"
var/list/blob_minds = list()
@@ -568,9 +581,10 @@
var/mob/M = blob.current
if(M)
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td></tr>"
else
dat += "<tr><td><i>Blob not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[blob]'>[blob.name]([blob.key])</a><i>Blob not found!</i></td>"
dat += "<td><A href='?priv_msg=[blob.key]'>PM</A></td></tr>"
dat += "</table>"
@@ -584,7 +598,8 @@
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
else
dat += "<tr><td><i>Monkey not found!</i></td></tr>"
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[eek]'>[eek.name]([eek.key])</a><i>Monkey not found!</i></td>"
dat += "<td><A href='?priv_msg=[eek.key]'>PM</A></td></tr>"
dat += "</table>"
+1 -1
View File
@@ -2039,7 +2039,7 @@
else if(href_list["check_antagonist"])
if(!check_rights(R_ADMIN))
return
check_antagonists()
usr.client.check_antagonists()
else if(href_list["kick_all_from_lobby"])
if(!check_rights(R_ADMIN))
+6 -5
View File
@@ -93,14 +93,11 @@
for(var/datum/d in objs)
for(var/v in call_list)
// To stop any procs which sleep from executing slowly.
if(d)
if(hascall(d, v))
spawn() call(d, v)(arglist(args_list)) // Spawn in case the function sleeps.
SDQL_callproc(d, v, args_list)
if("delete")
for(var/datum/d in objs)
del d
qdel(d)
if("select")
var/text = ""
@@ -147,6 +144,10 @@
/proc/SDQL_callproc(thing, procname, args_list)
set waitfor = 0
if(hascall(thing, procname))
call(thing, procname)(arglist(args_list))
/proc/SDQL_parse(list/query_list)
var/datum/SDQL_parser/parser = new()
+70 -63
View File
@@ -28,72 +28,78 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/callproc()
set category = "Debug"
set name = "Advanced ProcCall"
set waitfor = 0
if(!check_rights(R_DEBUG)) return
spawn(0)
var/target = null
var/targetselected = 0
var/returnval = null
var/class = null
var/target = null
var/targetselected = 0
var/returnval = null
var/class = null
switch(alert("Proc owned by something?",,"Yes","No"))
if("Yes")
targetselected = 1
if(src.holder && src.holder.marked_datum)
class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client","Marked datum ([holder.marked_datum.type])")
if(class == "Marked datum ([holder.marked_datum.type])")
class = "Marked datum"
switch(alert("Proc owned by something?",,"Yes","No"))
if("Yes")
targetselected = 1
if(src.holder && src.holder.marked_datum)
class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client","Marked datum ([holder.marked_datum.type])")
if(class == "Marked datum ([holder.marked_datum.type])")
class = "Marked datum"
else
class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client")
switch(class)
if("Obj")
target = input("Enter target:","Target",usr) as obj in world
if("Mob")
target = input("Enter target:","Target",usr) as mob in world
if("Area or Turf")
target = input("Enter target:","Target",usr.loc) as area|turf in world
if("Client")
var/list/keys = list()
for(var/client/C)
keys += C
target = input("Please, select a player!", "Selection", null, null) as null|anything in keys
if("Marked datum")
target = holder.marked_datum
else
class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client")
switch(class)
if("Obj")
target = input("Enter target:","Target",usr) as obj in world
if("Mob")
target = input("Enter target:","Target",usr) as mob in world
if("Area or Turf")
target = input("Enter target:","Target",usr.loc) as area|turf in world
if("Client")
var/list/keys = list()
for(var/client/C)
keys += C
target = input("Please, select a player!", "Selection", null, null) as null|anything in keys
if("Marked datum")
target = holder.marked_datum
else
return
if("No")
target = null
targetselected = 0
return
if("No")
target = null
targetselected = 0
var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
if(!procname) return
if(targetselected && !hascall(target,procname))
usr << "<font color='red'>Error: callproc(): target has no such call [procname].</font>"
var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
if(!procname) return
if(targetselected && !hascall(target,procname))
usr << "<font color='red'>Error: callproc(): target has no such call [procname].</font>"
return
else
var/procpath = text2path(procname)
if (!procpath)
usr << "<font color='red'>Error: callproc(): proc [procname] does not exist. (Did you forget the /proc/ part?)</font>"
return
var/list/lst = get_callproc_args()
if(!lst)
var/list/lst = get_callproc_args()
if(!lst)
return
if(targetselected)
if(!target)
usr << "<font color='red'>Error: callproc(): owner of proc no longer exists.</font>"
return
log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
message_admins("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
else
//this currently has no hascall protection. wasn't able to get it working.
log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
message_admins("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc
if(targetselected)
if(!target)
usr << "<font color='red'>Error: callproc(): owner of proc no longer exists.</font>"
return
log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
message_admins("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
else
//this currently has no hascall protection. wasn't able to get it working.
log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
message_admins("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc
usr << "<font color='blue'>[procname] returned: [returnval ? returnval : "null"]</font>"
feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
usr << "<font color='blue'>[procname] returned: [returnval ? returnval : "null"]</font>"
feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/callproc_datum(A as null|area|mob|obj|turf)
set category = "Debug"
set name = "Atom ProcCall"
set waitfor = 0
if(!check_rights(R_DEBUG))
return
@@ -113,12 +119,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
message_admins("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
spawn()
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
usr << "<span class='notice'>[procname] returned: [returnval ? returnval : "null"]</span>"
feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
usr << "<span class='notice'>[procname] returned: [returnval ? returnval : "null"]</span>"
/client/proc/get_callproc_args()
var/argnum = input("Number of arguments","Number:",0) as num|null
if(!argnum && (argnum!=0)) return
@@ -194,7 +201,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(id in hardcoded_gases || env_gases[id][MOLES])
t+= "[env_gases[id][GAS_NAME]] : [env_gases[id][MOLES]]\n"
usr.show_message(t, 1)
usr << t
feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_robotize(mob/M in mob_list)
@@ -207,7 +214,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(istype(M, /mob/living/carbon/human))
log_admin("[key_name(src)] has robotized [M.key].")
var/mob/living/carbon/human/H = M
spawn(10)
spawn(0)
H.Robotize()
else
@@ -223,7 +230,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(istype(M, /mob/living/carbon/human))
log_admin("[key_name(src)] has blobized [M.key].")
var/mob/living/carbon/human/H = M
spawn(10)
spawn(0)
H.Blobize()
else
@@ -247,7 +254,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
log_admin("[key_name(src)] has animalized [M.key].")
spawn(10)
spawn(0)
M.Animalize()
@@ -287,7 +294,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
if(ishuman(M))
log_admin("[key_name(src)] has alienized [M.key].")
spawn(10)
spawn(0)
M:Alienize()
feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] made [key_name(M)] into an alien.")
@@ -304,7 +311,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
if(ishuman(M))
log_admin("[key_name(src)] has slimeized [M.key].")
spawn(10)
spawn(0)
M:slimeize()
feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] made [key_name(M)] into a slime.")
+14 -2
View File
@@ -10,8 +10,20 @@
ticker.mode.traitors += H.mind
H.mind.special_role = "traitor"
add_objective(H.mind, /datum/objective/default/steal)
add_objective(H.mind, /datum/objective/escape_obj/hijack, 1)
var/datum/objective/steal/steal_objective = new
steal_objective.owner = H.mind
steal_objective.set_target(new /datum/objective_item/steal/nukedisc)
H.mind.objectives += steal_objective
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = H.mind
H.mind.objectives += hijack_objective
H << "<B>You are the traitor.</B>"
var/obj_count = 1
for(var/datum/objective/OBJ in H.mind.objectives)
H << "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]"
obj_count++
for (var/obj/item/I in H)
if (istype(I, /obj/item/weapon/implant))
-2
View File
@@ -76,7 +76,6 @@
if (M.id == src.id)
spawn( 0 )
M.open()
return
sleep(10)
@@ -90,7 +89,6 @@
if (M.id == src.id)
spawn( 0 )
M.close()
return
sleep(10)
cooldown = 0
+1 -1
View File
@@ -74,7 +74,7 @@
if(!secured)
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
return 0
var/dat = text("<TT><B>Health Sensor</B> <A href='?src=\ref[src];scanning=1'>[scanning?"On":"Off"]</A>")
var/dat = "<TT><B>Health Sensor</B> <A href='?src=\ref[src];scanning=1'>[scanning?"On":"Off"]</A>"
if(scanning && health_scan)
dat += "<BR>Health: [health_scan]"
user << browse(dat, "window=hscan")
+1 -4
View File
@@ -56,7 +56,6 @@
cooldown = 2
spawn(10)
process_cooldown()
return
/obj/item/device/assembly/prox_sensor/process()
@@ -71,15 +70,13 @@
/obj/item/device/assembly/prox_sensor/dropped()
spawn(0)
sense()
return
return
/obj/item/device/assembly/prox_sensor/toggle_scan()
if(!secured) return 0
scanning = !scanning
update_icon()
return
/obj/item/device/assembly/prox_sensor/update_icon()
+1 -1
View File
@@ -17,7 +17,7 @@
..()
spawn(40)
set_frequency(frequency)
return
/obj/item/device/assembly/signaler/Destroy()
if(SSradio)
+9 -9
View File
@@ -132,15 +132,15 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
//okay, here's the good teleporting stuff
/obj/machinery/gateway/centerstation/Bumped(atom/movable/AM)
if(!ready)
if(!ready)
return
if(!active)
if(!active)
return
if(!awaygate || qdeleted(awaygate))
if(!awaygate || qdeleted(awaygate))
return
if(awaygate.calibrated)
AM.loc = get_step(awaygate.loc, SOUTH)
AM.forceMove(get_step(awaygate.loc, SOUTH))
AM.dir = SOUTH
if (ismob(AM))
var/mob/M = AM
@@ -150,7 +150,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
else
var/obj/effect/landmark/dest = pick(awaydestinations)
if(dest)
AM.loc = dest.loc
AM.forceMove(get_turf(dest))
AM.dir = SOUTH
use_power(5000)
return
@@ -240,18 +240,18 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
/obj/machinery/gateway/centeraway/Bumped(atom/movable/AM)
if(!ready)
if(!ready)
return
if(!active)
if(!active)
return
if(!stationgate || qdeleted(stationgate))
if(!stationgate || qdeleted(stationgate))
return
if(istype(AM, /mob/living/carbon))
for(var/obj/item/weapon/implant/exile/E in AM)//Checking that there is an exile implant in the contents
if(E.imp_in == AM)//Checking that it's actually implanted vs just in their pocket
AM << "\black The station gate has detected your exile implant and is blocking your entry."
return
AM.loc = get_step(stationgate.loc, SOUTH)
AM.forceMove(get_step(stationgate.loc, SOUTH))
AM.dir = SOUTH
if (ismob(AM))
var/mob/M = AM
@@ -298,6 +298,10 @@ var/global/dmm_suite/preloader/_preloader = null
else if(copytext(trim_right,1,2) == "'")
trim_right = file(copytext(trim_right,2,length(trim_right)))
//Check for path
else if(ispath(text2path(trim_right)))
trim_right = text2path(trim_right)
to_return[trim_left] = trim_right
else//simple var
@@ -1,31 +1,31 @@
//Academy Areas
/area/awaymission/academy
name = "\improper Academy Asteroids"
name = "Academy Asteroids"
icon_state = "away"
/area/awaymission/academy/headmaster
name = "\improper Academy Fore Block"
name = "Academy Fore Block"
icon_state = "away1"
/area/awaymission/academy/classrooms
name = "\improper Academy Classroom Block"
name = "Academy Classroom Block"
icon_state = "away2"
/area/awaymission/academy/academyaft
name = "\improper Academy Ship Aft Block"
name = "Academy Ship Aft Block"
icon_state = "away3"
/area/awaymission/academy/academygate
name = "\improper Academy Gateway"
name = "Academy Gateway"
icon_state = "away4"
/area/awaymission/academy/academycellar
name = "\improper Academy Cellar"
name = "Academy Cellar"
icon_state = "away4"
/area/awaymission/academy/academyengine
name = "\improper Academy Engine"
name = "Academy Engine"
icon_state = "away4"
//Academy Items
@@ -102,7 +102,7 @@
/obj/structure/academy_wizard_spawner/proc/summon_wizard()
var/turf/T = src.loc
var/mob/living/carbon/human/wizbody = new(T)
wizbody.equipOutfit(/datum/outfit/wizard/academy)
var/obj/item/weapon/implant/exile/Implant = new/obj/item/weapon/implant/exile(wizbody)
@@ -110,7 +110,7 @@
wizbody.faction |= "wizard"
wizbody.real_name = "Academy Teacher"
wizbody.name = "Academy Teacher"
var/datum/mind/wizmind = new /datum/mind()
wizmind.name = "Wizard Defender"
wizmind.special_role = "Academy Defender"
@@ -118,13 +118,13 @@
wizmind.objectives += O
wizmind.transfer_to(wizbody)
ticker.mode.wizards |= wizmind
wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt)
wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile)
wizmind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball)
current_wizard = wizbody
give_control()
/obj/structure/academy_wizard_spawner/proc/update_status()
@@ -1,22 +1,22 @@
//Packer Ship Areas
/area/awaymission/BMPship
name = "\improper BMP Asteroids"
name = "BMP Asteroids"
icon_state = "away"
luminosity = 0
/area/awaymission/BMPship/Aft
name = "\improper Aft Block"
name = "Aft Block"
icon_state = "away1"
requires_power = 1
/area/awaymission/BMPship/Midship
name = "\improper Midship Block"
name = "Midship Block"
icon_state = "away2"
requires_power = 1
/area/awaymission/BMPship/Fore
name = "\improper Fore Block"
name = "Fore Block"
icon_state = "away3"
requires_power = 1
@@ -5,7 +5,7 @@
icon_state = "away"
/area/awaymission/challenge/main
name = "\improper Danger Room"
name = "Danger Room"
icon_state = "away1"
requires_power = 0
@@ -1,37 +1,37 @@
//Snow Valley Areas//--
/area/awaymission/snowdin
name = "\improper Snowdin Tundra Plains"
name = "Snowdin Tundra Plains"
icon_state = "away"
requires_power = 0
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/snowdin/post
name = "\improper Snowdin Outpost"
name = "Snowdin Outpost"
requires_power = 1
/area/awaymission/snowdin/igloo
name = "\improper Snowdin Igloos"
name = "Snowdin Igloos"
icon_state = "away2"
/area/awaymission/snowdin/cave
name = "\improper Snowdin Caves"
name = "Snowdin Caves"
icon_state = "away2"
luminosity = 0
/area/awaymission/snowdin/base
name = "\improper Snowdin Main Base"
name = "Snowdin Main Base"
icon_state = "away3"
requires_power = 1
/area/awaymission/snowdin/dungeon1
name = "\improper Snowdin Depths"
name = "Snowdin Depths"
icon_state = "away2"
luminosity = 0
/area/awaymission/snowdin/sekret
name = "\improper Snowdin Operations"
name = "Snowdin Operations"
icon_state = "away3"
requires_power = 1
@@ -168,7 +168,6 @@ obj/item/weapon/paper/crumpled/snowdin/shovel
/obj/item/weapon/twohanded/dualsaber = 15,
/obj/item/organ/internal/heart/demon = 7,
/obj/item/weapon/gun/projectile/automatic/c20r/unrestricted = 16,
/obj/item/weapon/teleportation_scroll = 5,
/obj/item/weapon/dice/d20/fate = 4,
/obj/item/weapon/gun/magic/wand/resurrection/inert = 15,
/obj/item/weapon/gun/magic/wand/resurrection = 10,
@@ -1,33 +1,33 @@
//Spacebattle Areas
/area/awaymission/spacebattle
name = "\improper Space Battle"
name = "Space Battle"
icon_state = "away"
requires_power = 0
/area/awaymission/spacebattle/cruiser
name = "\improper Nanotrasen Cruiser"
name = "Nanotrasen Cruiser"
/area/awaymission/spacebattle/syndicate1
name = "\improper Syndicate Assault Ship 1"
name = "Syndicate Assault Ship 1"
/area/awaymission/spacebattle/syndicate2
name = "\improper Syndicate Assault Ship 2"
name = "Syndicate Assault Ship 2"
/area/awaymission/spacebattle/syndicate3
name = "\improper Syndicate Assault Ship 3"
name = "Syndicate Assault Ship 3"
/area/awaymission/spacebattle/syndicate4
name = "\improper Syndicate War Sphere 1"
name = "Syndicate War Sphere 1"
/area/awaymission/spacebattle/syndicate5
name = "\improper Syndicate War Sphere 2"
name = "Syndicate War Sphere 2"
/area/awaymission/spacebattle/syndicate6
name = "\improper Syndicate War Sphere 3"
name = "Syndicate War Sphere 3"
/area/awaymission/spacebattle/syndicate7
name = "\improper Syndicate Fighter"
name = "Syndicate Fighter"
/area/awaymission/spacebattle/secret
name = "\improper Hidden Chamber"
name = "Hidden Chamber"
@@ -7,30 +7,30 @@
//Wild West Areas
/area/awaymission/wwmines
name = "\improper Wild West Mines"
name = "Wild West Mines"
icon_state = "away1"
luminosity = 1
requires_power = 0
/area/awaymission/wwgov
name = "\improper Wild West Mansion"
name = "Wild West Mansion"
icon_state = "away2"
luminosity = 1
requires_power = 0
/area/awaymission/wwrefine
name = "\improper Wild West Refinery"
name = "Wild West Refinery"
icon_state = "away3"
luminosity = 1
requires_power = 0
/area/awaymission/wwvault
name = "\improper Wild West Vault"
name = "Wild West Vault"
icon_state = "away3"
luminosity = 0
/area/awaymission/wwvaultdoors
name = "\improper Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power
name = "Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power
icon_state = "away2"
requires_power = 0
luminosity = 0
@@ -96,8 +96,14 @@
user << "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart."
ticker.mode.traitors += user.mind
user.mind.special_role = "traitor"
add_objective(user.mind, /datum/objective/escape_obj/hijack, 1)
var/datum/objective/hijack/hijack = new
hijack.owner = user.mind
user.mind.objectives += hijack
user << "<B>Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!</B>"
var/obj_count = 1
for(var/datum/objective/OBJ in user.mind.objectives)
user << "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]"
obj_count++
user.set_species(/datum/species/shadow)
if("Peace")
user << "<B>Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.</B>"
+1
View File
@@ -34,6 +34,7 @@ var/global/list/potentialSpaceRuins = generateMapList(filename = "config/spaceRu
world << "<span class='boldannounce'>Away mission loaded.</span>"
SortAreas() //To add recently loaded areas
else
world << "<span class='boldannounce'>No away missions found.</span>"
return
+1 -1
View File
@@ -131,7 +131,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
if (register_asset)
register_asset(file,files[file])
send_asset(client,file)
sleep(-1) //queuing calls like this too quickly can cause issues in some client versions
sleep(0) //queuing calls like this too quickly can cause issues in some client versions
//This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up.
//if it's an icon or something be careful, you'll have to copy it before further use.
+1 -5
View File
@@ -35,10 +35,6 @@
return
cmd_admin_pm(href_list["priv_msg"],null)
return
// NanoUI
if(href_list["nano_error"])
src << href_list["nano_error"]
throw EXCEPTION("NanoUI: [href_list["nano_error"]]")
//Logs all hrefs
if(config && config.log_hrefs && href_logfile)
@@ -334,6 +330,6 @@ var/next_external_rsc = 0
'html/browser/scannernew.css',
'html/browser/playeroptions.css',
)
spawn (10)
spawn (10) //removing this spawn causes all clients to not get verbs.
//Precache the client with all other assets slowly, so as to not block other browse() calls
getFilesSlow(src, SSasset.cache, register_asset = FALSE)
+8
View File
@@ -28,6 +28,7 @@ var/list/preferences_datums = list()
var/UI_style = "Midnight"
var/tgui_fancy = TRUE
var/tgui_lock = TRUE
var/toggles = TOGGLES_DEFAULT
var/chat_toggles = TOGGLES_DEFAULT_CHAT
var/ghost_form = "ghost"
@@ -326,6 +327,7 @@ var/list/preferences_datums = list()
dat += "<h2>General Settings</h2>"
dat += "<b>UI Style:</b> <a href='?_src_=prefs;preference=ui'>[UI_style]</a><br>"
dat += "<b>tgui Style:</b> <a href='?_src_=prefs;preference=tgui_fancy'>[(tgui_fancy) ? "Fancy" : "No Frills"]</a><br>"
dat += "<b>tgui Monitors:</b> <a href='?_src_=prefs;preference=tgui_lock'>[(tgui_lock) ? "Primary" : "All"]</a><br>"
dat += "<b>Play admin midis:</b> <a href='?_src_=prefs;preference=hear_midis'>[(toggles & SOUND_MIDI) ? "Yes" : "No"]</a><br>"
dat += "<b>Play lobby music:</b> <a href='?_src_=prefs;preference=lobby_music'>[(toggles & SOUND_LOBBY) ? "Yes" : "No"]</a><br>"
dat += "<b>Ghost ears:</b> <a href='?_src_=prefs;preference=ghost_ears'>[(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</a><br>"
@@ -1008,11 +1010,17 @@ var/list/preferences_datums = list()
UI_style = "Plasmafire"
if("Plasmafire")
UI_style = "Retro"
if("Retro")
UI_style = "Slimecore"
if("Slimecore")
UI_style = "Operative"
else
UI_style = "Midnight"
if("tgui_fancy")
tgui_fancy = !tgui_fancy
if("tgui_lock")
tgui_lock = !tgui_lock
if("hear_adminhelps")
toggles ^= SOUND_ADMINHELP
+4 -1
View File
@@ -165,6 +165,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["lastchangelog"] >> lastchangelog
S["UI_style"] >> UI_style
S["tgui_fancy"] >> tgui_fancy
S["tgui_lock"] >> tgui_lock
if(islist(S["be_special"]))
S["be_special"] >> be_special
@@ -190,8 +191,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Sanitize
ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor)))
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
UI_style = sanitize_inlist(UI_style, list("Midnight", "Plasmafire", "Retro"), initial(UI_style))
UI_style = sanitize_inlist(UI_style, list("Midnight", "Plasmafire", "Retro", "Slimecore", "Operative"), initial(UI_style))
tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy))
tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock))
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
ghost_form = sanitize_inlist(ghost_form, ghost_forms, initial(ghost_form))
@@ -212,6 +214,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["lastchangelog"] << lastchangelog
S["UI_style"] << UI_style
S["tgui_fancy"] << tgui_fancy
S["tgui_lock"] << tgui_lock
S["be_special"] << be_special
S["default_slot"] << default_slot
S["toggles"] << toggles
+12 -3
View File
@@ -13,7 +13,7 @@
var/obj/item/clothing/suit/space/hardsuit/suit
item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite)
action_button_name = "Toggle Helmet Light"
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
@@ -38,6 +38,15 @@
if(on)
user.AddLuminosity(-brightness_on)
SetLuminosity(brightness_on)
if(suit)
suit.RemoveHelmet()
/obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot)
if(slot != slot_head)
if(suit)
suit.RemoveHelmet()
else
qdel(src)
/obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg)
var/mob/wearer = loc
@@ -178,7 +187,7 @@
on = 0
var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null
action_button_name = "Toggle Helmet Mode"
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
@@ -457,7 +466,7 @@
var/datum/effect_system/spark_spread/s = new
s.set_up(2, 1, src)
s.start()
owner.visible_message("The [attack_text] sparks harmlessly off [owner]'s shields!")
owner.visible_message("<span class='danger'>[owner]'s shields deflect [attack_text] in a shower of sparks!</span>")
current_charges--
recharge_cooldown = world.time + recharge_delay
SSobj.processing |= src
+2 -2
View File
@@ -137,6 +137,8 @@
helmet.attack_self(H)
H.unEquip(helmet, 1)
H.update_inv_wear_suit()
H << "<span class='notice'>The helmet on the hardsuit disengages.</span>"
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
helmet.loc = src
/obj/item/clothing/suit/space/hardsuit/dropped()
@@ -163,6 +165,4 @@
H.update_inv_wear_suit()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
else
H << "<span class='notice'>You disengage the helmet on the hardsuit.</span>"
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
RemoveHelmet()
+2 -1
View File
@@ -18,7 +18,7 @@
if(turfs.len) //Pick a turf to spawn at if we can
var/turf/simulated/T = pick(turfs)
spawn(0) new/obj/effect/spacevine_controller(T) //spawn a controller at turf
new/obj/effect/spacevine_controller(T) //spawn a controller at turf
/datum/spacevine_mutation
@@ -437,6 +437,7 @@
/obj/effect/spacevine_controller
invisibility = 101
var/list/obj/effect/spacevine/vines = list()
var/list/growth_queue = list()
var/spread_multiplier = 5
+2 -2
View File
@@ -8,5 +8,5 @@
/datum/round_event/wizard/fake_explosion/start()
for(var/mob/M in player_list)
M << 'sound/machines/Alarm.ogg'
sleep(100)
ticker.station_explosion_cinematic(1,"fake") //:o)
spawn(100)
ticker.station_explosion_cinematic(1,"fake") //:o)
+3 -1
View File
@@ -38,9 +38,11 @@
ticker.mode.apprentices += I.mind
I.mind.special_role = "imposter"
var/datum/objective/protect_objective = add_objective(I.mind, /datum/objective/default/protect)
var/datum/objective/protect/protect_objective = new /datum/objective/protect
protect_objective.owner = I.mind
protect_objective.target = W.mind
protect_objective.explanation_text = "Protect [W.real_name], the wizard."
I.mind.objectives += protect_objective
ticker.mode.update_wiz_icons_added(I.mind)
I.attack_log += "\[[time_stamp()]\] <font color='red'>Is an imposter!</font>"
+11 -11
View File
@@ -1,4 +1,5 @@
/mob/living/carbon/proc/dream()
set waitfor = 0
dreaming = 1
var/list/dreams = list(
"an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the captain",
@@ -8,17 +9,16 @@
"a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect",
"riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying"
)
spawn(0)
for(var/i = rand(1,4),i > 0, i--)
var/dream_image = pick(dreams)
dreams -= dream_image
src << "<span class='notice'><i>... [dream_image] ...</i></span>"
sleep(rand(40,70))
if(paralysis <= 0)
dreaming = 0
return 0
dreaming = 0
return 1
for(var/i = rand(1,4),i > 0, i--)
var/dream_image = pick(dreams)
dreams -= dream_image
src << "<span class='notice'><i>... [dream_image] ...</i></span>"
sleep(rand(40,70))
if(paralysis <= 0)
dreaming = 0
return 0
dreaming = 0
return 1
/mob/living/carbon/proc/handle_dreams()
if(prob(5) && !dreaming) dream()
@@ -125,8 +125,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/SplashReagents(var/mob/M)
if(src.reagents.total_volume)
for(var/mob/O in viewers(M, null))
O.show_message(text("<span class='danger'>The contents of \the [src] splashes all over [M]!</span>"), 1)
M.visible_message("<span class='danger'>The contents of \the [src] splashes all over [M]!</span>")
reagents.reaction(M, TOUCH)
reagents.clear_reagents()
return
+3 -3
View File
@@ -87,7 +87,7 @@
else return ..()
/obj/item/weapon/deck/proc/dealTo(mob/living/target, mob/living/source)
if (!src.cards.len)
if (!cards.len)
source.show_message("There are no cards in the deck.")
return
@@ -185,10 +185,10 @@
. = ..()
if((!concealed || src.loc == usr) && cards.len)
usr.show_message("It contains: ")
usr.show_message("It contains: ", 1)
for (var/datum/playingcard/card in cards)
usr.show_message("The [card.name].")
usr.show_message("The [card.name].", 1)
/obj/item/weapon/hand/proc/update_conceal()
if (src.concealed) src.hi.updateContent("headbar", "You are currently concealing your hand. <a href=\"byond://?src=\ref[hi]&action=toggle_conceal\">Reveal your hand.</a>")
+2 -2
View File
@@ -212,7 +212,7 @@
step(I,direction)
return
/mob/living/simple_animal/shade/howling_ghost/adjustBruteLoss()
/mob/living/simple_animal/shade/howling_ghost/adjustHealth()
return
/mob/living/simple_animal/shade/howling_ghost/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
@@ -272,7 +272,7 @@
/mob/living/simple_animal/hostile/retaliate/clown/insane/AttackTarget()
return
/mob/living/simple_animal/hostile/retaliate/clown/insane/adjustBruteLoss()
/mob/living/simple_animal/hostile/retaliate/clown/insane/adjustHealth()
if(prob(5))
playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1)
+3 -4
View File
@@ -377,7 +377,7 @@
harvest = 0
weedlevel = 0 // Reset
spawn(5) // Wait a while
sleep(5) // Wait a while
update_icon()
visible_message("<span class='warning'>[oldPlantName] suddenly mutated into [myseed.plantname]!</span>")
@@ -397,7 +397,7 @@
harvest = 0
weedlevel = 0 // Reset
spawn(5) // Wait a while
sleep(5) // Wait a while
update_icon()
visible_message("<span class='warning'>The mutated weeds in [src] spawned a [myseed.plantname]!</span>")
else
@@ -798,8 +798,7 @@
user << "<span class='notice'>You reconnect \the [src]'s hoses.</span>"
for(var/obj/machinery/hydroponics/h in range(1,src))
spawn()
h.update_icon()
h.update_icon()
return
+2 -3
View File
@@ -13,8 +13,7 @@
/obj/structure/closet/crate/secure/loot/New()
..()
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "z")
code = ""
for(var/i = 0, i < codelen, i++)
var/dig = pick(digits)
@@ -169,7 +168,7 @@
user << "<span class='notice'>You leave the crate alone.</span>"
else
user << "<span class='warning'>A red light flashes.</span>"
lastattempt = input
lastattempt = replacetext(input, 0, "z")
attempts--
if (attempts == 0)
user << "<span class='danger'>The crate's anti-tamper system activates!</span>"
+4 -3
View File
@@ -655,18 +655,19 @@
wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
/obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron,
/obj/item/weapon/ore/bananium)
healable = 0
/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = I
if(W.welding && !stat)
if(AIStatus == AI_ON)
if(AIStatus != AI_OFF && AIStatus != AI_IDLE)
user << "<span class='info'>[src] is moving around too much to repair!</span>"
return
if(maxHealth == health)
user << "<span class='info'>[src] is at full integrity.</span>"
else
health += 10
adjustBruteLoss(-10)
user << "<span class='info'>You repair some of the armor on [src].</span>"
return
if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner))
@@ -741,7 +742,7 @@
O.loc = src.loc
return
/mob/living/simple_animal/hostile/mining_drone/adjustBruteLoss()
/mob/living/simple_animal/hostile/mining_drone/adjustHealth()
if(search_objects)
SetOffenseBehavior()
..()
+3 -3
View File
@@ -36,9 +36,9 @@
if(M.z == target_z)
M << start_up_message
sleep(start_up_time)
stage = MAIN_STAGE
weather_main()
spawn(start_up_time)
stage = MAIN_STAGE
weather_main()
/datum/weather/proc/weather_main()
@@ -47,12 +47,13 @@
duration_overlay = ""
overlay_layer = 10
/datum/weather/advanced_darkness/advanced_darkness/update_areas()
..()
/datum/weather/advanced_darkness/update_areas()
for(var/area/A in impacted_areas)
if(stage == MAIN_STAGE)
A.invisibility = 0
A.opacity = 1
else
A.invisibility = 100
A.opacity = 0
//Ash storms
+1
View File
@@ -52,6 +52,7 @@
circuit = /obj/item/weapon/circuitboard/mining_shuttle
shuttleId = "mining"
possible_destinations = "mining_home;mining_away"
no_destination_swap = 1
/*********************Pickaxe & Drills**************************/
+11 -12
View File
@@ -16,6 +16,7 @@ var/global/list/rockTurfEdgeCache
opacity = 1
density = 1
blocks_air = 1
layer = TURF_LAYER + 0.05
temperature = TCMB
var/environment_type = "asteroid"
var/turf/simulated/floor/plating/asteroid/turf_type = /turf/simulated/floor/plating/asteroid //For basalt vs normal asteroid
@@ -89,7 +90,7 @@ var/global/list/rockTurfEdgeCache
icon_state = "rock"
return
/turf/simulated/mineral/proc/Spread(turf/T)
/turf/simulated/mineral/Spread(turf/T)
new src.type(T)
/turf/simulated/mineral/random
@@ -284,16 +285,14 @@ var/global/list/rockTurfEdgeCache
countdown(notify_admins)
/turf/simulated/mineral/gibtonite/proc/countdown(notify_admins = 0)
spawn(0)
while(stage == 1 && det_time > 0 && mineralAmt >= 1)
det_time--
sleep(5)
if(stage == 1 && det_time <= 0 && mineralAmt >= 1)
var/turf/bombturf = get_turf(src)
mineralAmt = 0
explosion(bombturf,1,3,5, adminlog = notify_admins)
if(stage == 0 || stage == 2)
return
set waitfor = 0
while(stage == 1 && det_time > 0 && mineralAmt >= 1)
det_time--
sleep(5)
if(stage == 1 && det_time <= 0 && mineralAmt >= 1)
var/turf/bombturf = get_turf(src)
mineralAmt = 0
explosion(bombturf,1,3,5, adminlog = notify_admins)
/turf/simulated/mineral/gibtonite/proc/defuse()
if(stage == 1)
@@ -685,7 +684,7 @@ var/global/list/rockTurfEdgeCache
/turf/simulated/chasm/proc/drop(atom/movable/AM)
visible_message("[AM] falls into [src]!")
AM.Move(locate(drop_x, drop_y, drop_z))
AM.forceMove(locate(drop_x, drop_y, drop_z))
AM.visible_message("[AM] falls from above!")
if(istype(AM, /mob/living))
var/mob/living/L = AM
@@ -182,9 +182,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!istype(usr, /mob/dead/observer))
usr << "Not when you're not dead!"
return
usr.verbs -= /mob/dead/observer/proc/dead_tele
spawn(30)
usr.verbs += /mob/dead/observer/proc/dead_tele
var/A
A = input("Area to jump to", "BOOYEA", A) as null|anything in sortedAreas
var/area/thearea = A
+5 -2
View File
@@ -324,8 +324,8 @@
//proc functions
for(var/Proc in functions)
if(!isnotfunc())
spawn(1)
call(src,Proc)(src)
callfunction(Proc)
//target interaction stays hardcoded
@@ -411,6 +411,9 @@
tryWalk(TARGET)
LAST_TARGET = TARGET
/mob/living/carbon/human/interactive/proc/callfunction(Proc)
set waitfor = 0
call(src,Proc)(src)
/mob/living/carbon/human/interactive/proc/tryWalk(turf/TARGET)
if(!isnotfunc())
if(!walk2derpless(TARGET))
@@ -177,6 +177,12 @@ Des: Removes all infected images from the alien.
/mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0)
return initial(pixel_y)
/mob/living/carbon/alien/proc/alien_evolve(mob/living/carbon/alien/new_xeno)
src << "<span class='noticealien'>You begin to evolve!</span>"
visible_message("<span class='alertalien'>[src] begins to twist and contort!</span>")
if(mind)
mind.transfer_to(new_xeno)
qdel(src)
#undef HEAT_DAMAGE_LEVEL_1
#undef HEAT_DAMAGE_LEVEL_2
@@ -90,8 +90,7 @@ Doesn't work on other aliens/AI.*/
if(locate(/obj/structure/alien/weeds/node) in get_turf(user))
src << "There's already a weed node here."
return 0
for(var/mob/O in viewers(user, null))
O.show_message(text("<span class='alertalien'>[user] has planted some alien weeds!</span>"), 1)
user.visible_message("<span class='alertalien'>[user] has planted some alien weeds!</span>")
new/obj/structure/alien/weeds/node(user.loc)
return 1
@@ -241,7 +240,7 @@ Doesn't work on other aliens/AI.*/
user << "<span class='danger'>There is already a resin structure there.</span>"
return 0
var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in structures
if(!choice)
if(!choice)
return 0
if (!cost_check(check_turf,user))
return 0
@@ -26,12 +26,12 @@
action_icon_state = "alien_evolve_drone"
/obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/user)
if(!alien_type_present(/mob/living/carbon/alien/humanoid/royal/))
user << "<span class='noticealien'>You begin to evolve!</span>"
user.visible_message("<span class='alertalien'>[user] begins to twist and contort!</span>")
if(!isturf(user.loc))
user << "<span class='notice'>You can't evolve here!</span>"
return 0
if(!alien_type_present(/mob/living/carbon/alien/humanoid/royal))
var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new (user.loc)
user.mind.transfer_to(new_xeno)
qdel(user)
user.alien_evolve(new_xeno)
return 1
else
user << "<span class='notice'>We already have a living royal!</span>"
@@ -4,6 +4,7 @@
maxHealth = 125
health = 125
icon_state = "alienh_s"
var/obj/screen/leap_icon = null
/mob/living/carbon/alien/humanoid/hunter/New()
internal_organs += new /obj/item/organ/internal/alien/plasmavessel/small
@@ -37,7 +38,6 @@
//Hunter verbs
/mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(message = 1)
leap_on_click = !leap_on_click
leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]"
@@ -54,11 +54,8 @@
/obj/effect/proc_holder/alien/royal/praetorian/evolve/fire(mob/living/carbon/alien/user)
if(!alien_type_present(/mob/living/carbon/alien/humanoid/royal/queen))
user << "<span class='noticealien'>You begin to evolve!</span>"
user.visible_message("<span class='alertalien'>[user] begins to twist and contort!</span>")
var/mob/living/carbon/alien/humanoid/royal/queen/new_xeno = new (user.loc)
user.mind.transfer_to(new_xeno)
qdel(user)
user.alien_evolve(new_xeno)
return 1
else
user << "<span class='notice'>We already have an alive queen.</span>"
@@ -149,6 +149,15 @@
/mob/living/carbon/alien/humanoid/get_permeability_protection()
return 0.8
/mob/living/carbon/alien/humanoid/alien_evolve(mob/living/carbon/alien/humanoid/new_xeno)
drop_l_hand()
drop_r_hand()
for(var/atom/movable/A in stomach_contents)
stomach_contents.Remove(A)
new_xeno.stomach_contents.Add(A)
A.loc = new_xeno
..()
//For alien evolution/promotion procs. Checks for
proc/alien_type_present(var/alienpath)
for(var/mob/living/carbon/alien/humanoid/A in living_mob_list)
@@ -32,8 +32,6 @@
return
var/mob/living/carbon/alien/larva/L = user
if(L.stat != CONSCIOUS)
return
if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ?
user << "<span class='danger'>You cannot evolve when you are cuffed.</span>"
@@ -45,6 +43,9 @@
L << "<span class='name'>Drones</span> <span class='info'>are the weakest and slowest of the castes, but can grow into the queen if there is none, and are vital to maintaining a hive with their resin secretion abilities.</span>"
var/alien_caste = alert(L, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
if(user.incapacitated()) //something happened to us while we were choosing.
return
var/mob/living/carbon/alien/humanoid/new_xeno
switch(alien_caste)
if("Hunter")
@@ -53,8 +54,8 @@
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(L.loc)
if("Drone")
new_xeno = new /mob/living/carbon/alien/humanoid/drone(L.loc)
if(L.mind) L.mind.transfer_to(new_xeno)
qdel(L)
L.alien_evolve(new_xeno)
return 0
else
user << "<span class='danger'>You are not fully grown.</span>"
+3 -1
View File
@@ -11,8 +11,10 @@
var/message_a = say_quote(message, get_spans())
var/rendered = "<i><span class='alien'>Hivemind, <span class='name'>[shown_name]</span> <span class='message'>[message_a]</span></span></i>"
for(var/mob/S in player_list)
if((!S.stat && S.hivecheck()) || (S in dead_mob_list))
if(!S.stat && S.hivecheck())
S << rendered
if(S in dead_mob_list)
S << "<a href='?src=\ref[S];follow=\ref[src]'>(F)</a> [rendered]"
/mob/living/carbon/alien/humanoid/royal/queen/alien_talk(message, shown_name = name)
shown_name = "<FONT size = 3>[shown_name]</FONT>"
+15 -16
View File
@@ -364,22 +364,21 @@ var/const/GALOSHES_DONT_HELP = 4
adjustBruteLoss(10)
/mob/living/carbon/proc/spin(spintime, speed)
spawn()
var/D = dir
while(spintime >= speed)
sleep(speed)
switch(D)
if(NORTH)
D = EAST
if(SOUTH)
D = WEST
if(EAST)
D = SOUTH
if(WEST)
D = NORTH
dir = D
spintime -= speed
return
set waitfor = 0
var/D = dir
while(spintime >= speed)
sleep(speed)
switch(D)
if(NORTH)
D = EAST
if(SOUTH)
D = WEST
if(EAST)
D = SOUTH
if(WEST)
D = NORTH
dir = D
spintime -= speed
/mob/living/carbon/resist_buckle()
if(restrained())
@@ -46,6 +46,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
/mob/living/carbon/human/handle_blood()
if(NOBLOOD in dna.species.specflags)
blood_max = 0
return
if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood.
@@ -37,8 +37,6 @@
make_blood()
..()
var/mob/M = src
faction |= "\ref[M]"
/mob/living/carbon/human/prepare_data_huds()
//Update med hud images...
@@ -1,7 +1,12 @@
/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user)
if(user.a_intent == "harm")
..(user, 1)
playsound(loc, user.dna.species.attack_sound, 25, 1, -1)
var/hulk_verb = pick("smash","pummel")
visible_message("<span class='danger'>[user] has [hulk_verb]ed [src]!</span>", \
"<span class='userdanger'>[user] has [hulk_verb]ed [src]!</span>")
adjustBruteLoss(15)
return 1
/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M)
if(..()) //to allow surgery to return properly.
@@ -306,6 +306,8 @@
if(head)
if(head.flags & BLOCK_GAS_SMOKE_EFFECT)
. = 1
if(NOBREATH in dna.species.specflags)
. = 1
return .
/mob/living/carbon/human/proc/handle_embedded_objects()
for(var/obj/item/organ/limb/L in organs)
@@ -38,6 +38,7 @@
var/meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing
var/list/no_equip = list() // slots the race can't equip stuff to
var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids
var/blacklisted = 0 //Flag to exclude from green slime core species.
var/dangerous_existence = null //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!"
var/say_mod = "says" // affects the speech message
var/list/default_features = list() // Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have.
@@ -1219,7 +1220,7 @@
H.adjustOxyLoss(8)
H.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2)
if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
spawn(0) H.emote("cough")
H.emote("cough")
else
H.co2overloadtime = 0
@@ -1274,7 +1275,7 @@
//-- TRACES --//
if(breath && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here.
if(breath && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here.
var/SA_pp = breath.get_breath_partial_pressure(breath_gases["n2o"][MOLES])
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
@@ -1282,9 +1283,7 @@
H.sleeping = max(H.sleeping+2, 10)
else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
spawn(0)
H.emote(pick("giggle", "laugh"))
H.emote(pick("giggle", "laugh"))
handle_breath_temperature(breath, H)
breath.garbage_collect()
@@ -1299,8 +1298,7 @@
if(!(NOBREATH in specflags) || (H.health <= config.health_threshold_crit))
if(prob(20))
spawn(0)
H.emote("gasp")
H.emote("gasp")
if(breath_pp > 0)
var/ratio = safe_breath_min/breath_pp
H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!
@@ -168,6 +168,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
darksight = 8
invis_sight = SEE_INVISIBLE_MINIMUM
sexes = 0
blacklisted = 1
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
specflags = list(NOBREATH,NOBLOOD,RADIMMUNE)
@@ -343,6 +344,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
armor = 55
siemens_coeff = 0
punchmod = 5
blacklisted = 1
no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform)
nojumpsuit = 1
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem
@@ -387,6 +389,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
id = "skeleton"
say_mod = "rattles"
need_nutrition = 0
blacklisted = 1
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE)
@@ -412,6 +415,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
id = "zombie"
say_mod = "moans"
sexes = 0
blacklisted = 1
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE)
@@ -453,16 +457,16 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
/datum/species/abductor/handle_speech(message)
//Hacks
var/mob/living/carbon/human/user = usr
var/rendered = "<i><font color=#800080><b>[user.name]:</b> [message]</font></i>"
for(var/mob/living/carbon/human/H in mob_list)
if(H.dna.species.id != "abductor")
continue
else
var/datum/species/abductor/target_spec = H.dna.species
if(target_spec.team == team)
H << "<i><font color=#800080><b>[user.name]:</b> [message]</font></i>"
//return - technically you can add more aliens to a team
H << rendered
for(var/mob/M in dead_mob_list)
M << "<i><font color=#800080><b>[user.name]:</b> [message]</font></i>"
M << "<a href='?src=\ref[M];follow=\ref[user]'>(F)</a>[rendered]"
return ""
@@ -479,6 +483,7 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_
safe_toxins_min = 16 //We breath THIS!
safe_toxins_max = 0
dangerous_existence = 1 //So so much
blacklisted = 1 //See above
need_nutrition = 0 //Hard to eat through a helmet
burnmod = 2
heatmod = 2
@@ -549,6 +554,7 @@ var/global/list/synth_flesh_disguises = list()
SA_para_min = 0
SA_sleep_min = 0
dangerous_existence = 1
blacklisted = 1
need_nutrition = 0 //beep boop robots do not need sustinance
meat = null
var/list/initial_specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE) //for getting these values back for assume_disguise()
+18 -21
View File
@@ -48,7 +48,7 @@
if(losebreath > 0)
losebreath--
if(prob(10))
spawn emote("gasp")
emote("gasp")
if(istype(loc, /obj/))
var/obj/loc_as_obj = loc
loc_as_obj.handle_internal_lifeform(src,0)
@@ -116,8 +116,7 @@
//OXYGEN
if(O2_partialpressure < safe_oxy_min) //Not enough oxygen
if(prob(20))
spawn(0)
emote("gasp")
emote("gasp")
if(O2_partialpressure > 0)
var/ratio = safe_oxy_min/O2_partialpressure
adjustOxyLoss(min(5*ratio, 3))
@@ -147,7 +146,7 @@
if(world.time - co2overloadtime > 300)
adjustOxyLoss(8)
if(prob(20))
spawn(0) emote("cough")
emote("cough")
else
co2overloadtime = 0
@@ -170,8 +169,7 @@
sleeping = max(sleeping+2, 10)
else if(SA_partialpressure > 0.01)
if(prob(20))
spawn(0) emote(pick("giggle","laugh"))
emote(pick("giggle","laugh"))
breath.garbage_collect()
//BREATH TEMPERATURE
@@ -268,21 +266,21 @@
/mob/living/carbon/handle_stomach()
spawn(0)
for(var/mob/living/M in stomach_contents)
if(M.loc != src)
set waitfor = 0
for(var/mob/living/M in stomach_contents)
if(M.loc != src)
stomach_contents.Remove(M)
continue
if(istype(M, /mob/living/carbon) && stat != 2)
if(M.stat == 2)
M.death(1)
stomach_contents.Remove(M)
qdel(M)
continue
if(istype(M, /mob/living/carbon) && stat != 2)
if(M.stat == 2)
M.death(1)
stomach_contents.Remove(M)
qdel(M)
continue
if(SSmob.times_fired%3==1)
if(!(M.status_flags & GODMODE))
M.adjustBruteLoss(5)
nutrition += 10
if(SSmob.times_fired%3==1)
if(!(M.status_flags & GODMODE))
M.adjustBruteLoss(5)
nutrition += 10
//This updates the health and status of the mob (conscious, unconscious, dead)
/mob/living/carbon/handle_regular_status_updates()
@@ -324,8 +322,7 @@
adjustStaminaLoss(-10)
sleeping = max(sleeping-1, 0)
if( prob(10) && health && !hal_crit )
spawn(0)
emote("snore")
emote("snore")
else
clear_alert("asleep")
@@ -139,9 +139,7 @@
/mob/living/carbon/monkey/handle_random_events()
if (prob(1) && prob(2))
spawn(0)
emote("scratch")
return
emote("scratch")
/mob/living/carbon/monkey/has_smoke_protection()
if(wear_mask)
@@ -96,10 +96,8 @@
damage = rand(10, 15)
if ( (paralysis < 5) && (health > 0) )
Paralyse(rand(10, 15))
spawn( 0 )
visible_message("<span class='danger'>[M] has knocked out [name]!</span>", \
visible_message("<span class='danger'>[M] has knocked out [name]!</span>", \
"<span class='userdanger'>[M] has knocked out [name]!</span>")
return
adjustBruteLoss(damage)
add_logs(M, src, "attacked")
updatehealth()
@@ -107,7 +105,6 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] has attempted to punch [name]!</span>", \
"<span class='userdanger'>[M] has attempted to punch [name]!</span>")
if("disarm")
if (!( paralysis ))
M.do_attack_animation(src)
@@ -122,7 +119,6 @@
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
"<span class='userdanger'>[M] has disarmed [src]!</span>")
return
/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M)
if(..()) //if harm or disarm intent.
+1 -1
View File
@@ -167,7 +167,7 @@
if(recursive)
for(var/obj/item/T in I)
give_action_button(I, recursive - 1)
give_action_button(T, recursive - 1)
//this handles hud updates. Calls update_vision() and handle_hud_icons()
+13 -10
View File
@@ -23,6 +23,8 @@ Sorry Giacom. Please don't be mad :(
if(unique_name)
name = "[name] ([rand(1, 1000)])"
real_name = name
faction |= "\ref[src]"
/mob/living/Destroy()
@@ -160,10 +162,10 @@ Sorry Giacom. Please don't be mad :(
set name = "Pull"
set category = "Object"
if(pulling == AM)
if(AM.Adjacent(src))
start_pulling(AM)
else
stop_pulling()
else if(AM.Adjacent(src))
src.start_pulling(AM)
//same as above
/mob/living/pointed(atom/A as mob|obj|turf in view())
@@ -235,7 +237,7 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/adjustBruteLoss(amount)
if(status_flags & GODMODE) return 0
bruteloss = min(max(bruteloss + amount, 0),(maxHealth*2))
bruteloss = Clamp(bruteloss + amount, 0, maxHealth*2)
handle_regular_status_updates() //we update our health right away.
/mob/living/proc/getOxyLoss()
@@ -243,7 +245,7 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/adjustOxyLoss(amount)
if(status_flags & GODMODE) return 0
oxyloss = min(max(oxyloss + amount, 0),(maxHealth*2))
oxyloss = Clamp(oxyloss + amount, 0, maxHealth*2)
handle_regular_status_updates()
/mob/living/proc/setOxyLoss(amount)
@@ -256,7 +258,7 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/adjustToxLoss(amount)
if(status_flags & GODMODE) return 0
toxloss = min(max(toxloss + amount, 0),(maxHealth*2))
toxloss = Clamp(toxloss + amount, 0, maxHealth*2)
handle_regular_status_updates()
/mob/living/proc/setToxLoss(amount)
@@ -269,7 +271,7 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/adjustFireLoss(amount)
if(status_flags & GODMODE) return 0
fireloss = min(max(fireloss + amount, 0),(maxHealth*2))
fireloss = Clamp(fireloss + amount, 0, maxHealth*2)
handle_regular_status_updates() //we update our health right away.
/mob/living/proc/getCloneLoss()
@@ -277,7 +279,7 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/adjustCloneLoss(amount)
if(status_flags & GODMODE) return 0
cloneloss = min(max(cloneloss + amount, 0),(maxHealth*2))
cloneloss = Clamp(cloneloss + amount, 0, maxHealth*2)
handle_regular_status_updates()
/mob/living/proc/setCloneLoss(amount)
@@ -290,7 +292,7 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/adjustBrainLoss(amount)
if(status_flags & GODMODE) return 0
brainloss = min(max(brainloss + amount, 0),(maxHealth*2))
brainloss = Clamp(brainloss + amount, 0, maxHealth*2)
handle_regular_status_updates()
/mob/living/proc/setBrainLoss(amount)
@@ -303,7 +305,7 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/adjustStaminaLoss(amount)
if(status_flags & GODMODE) return 0
staminaloss = min(max(staminaloss + amount, 0),(maxHealth*2))
staminaloss = Clamp(staminaloss + amount, 0, maxHealth*2)
/mob/living/proc/setStaminaLoss(amount)
if(status_flags & GODMODE) return 0
@@ -438,6 +440,7 @@ Sorry Giacom. Please don't be mad :(
eye_blurry = 0
ear_deaf = 0
ear_damage = 0
hallucination = 0
heal_overall_damage(1000, 1000)
ExtinguishMob()
fire_stacks = 0
+1 -1
View File
@@ -208,7 +208,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
log_say("[mind.changeling.changelingID]/[src.key] : [message]")
for(var/mob/M in mob_list)
if(M in dead_mob_list)
M << msg
M << "<a href='?src=\ref[M];follow=\ref[src]'>(F)</a> [msg]"
else
switch(M.lingcheck())
if(2)
@@ -41,7 +41,6 @@
for(var/obj/machinery/ai_status_display/O in world) //change status
if(src.key)
spawn( 0 )
O.mode = 2
if (istype(loc, /obj/item/device/aicard))
loc.icon_state = "aicard-404"
@@ -17,3 +17,10 @@
src.laws_sanity_check()
src.laws.show_laws(who)
if(!everyone)
for(var/mob/living/silicon/robot/R in connected_robots)
if(R.lawupdate)
R.lawsync()
R.show_laws()
R.law_change_counter++
+1 -1
View File
@@ -161,7 +161,7 @@
sleep(2)
//bring up APC dialog
apc_override = 1
theAPC.attack_ai(src)
theAPC.ui_interact(src, state = conscious_state)
apc_override = 0
src:aiRestorePowerRoutine = 3
src << "Here are your current laws:"
@@ -190,6 +190,10 @@
CRASH("pAI without card")
loc = card
/mob/living/silicon/pai/canUseTopic(atom/movable/M)
return 1
//Addition by Mord_Sith to define AI's network change ability
/*
/mob/living/silicon/pai/proc/pai_network_change()
@@ -260,8 +260,7 @@
if(href_list["cable"])
var/turf/T = get_turf(src.loc)
src.cable = new /obj/item/weapon/pai_cable(T)
for (var/mob/M in viewers(T))
M.show_message("<span class='warning'>A port on [src] opens to reveal [src.cable], which promptly falls to the floor.</span>", 3, "<span class='italics'>You hear the soft click of something light and hard falling to the ground.</span>", 2)
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
return
+3 -1
View File
@@ -13,12 +13,14 @@
var/message_a = say_quote(message, get_spans())
var/rendered = "<i><span class='game say'>Robotic Talk, <span class='name'>[name]</span> <span class='message'>[message_a]</span></span></i>"
for(var/mob/M in player_list)
if(M.binarycheck() || (M in dead_mob_list))
if(M.binarycheck())
if(istype(M, /mob/living/silicon/ai))
var/renderedAI = "<i><span class='game say'>Robotic Talk, <a href='?src=\ref[M];track=[html_encode(name)]'><span class='name'>[name] ([desig])</span></a> <span class='message'>[message_a]</span></span></i>"
M << renderedAI
else
M << rendered
if(M in dead_mob_list)
M << "<a href='?src=\ref[M];follow=\ref[src]'>(F)</a> [rendered]"
/mob/living/silicon/binarycheck()
return 1
@@ -105,7 +105,7 @@
Radio = new/obj/item/device/radio(src)
if(radio_key)
Radio.keyslot = new radio_key
Radio.canhear_range = 1 // 0 ?
Radio.canhear_range = 0 // anything greater will have the bot broadcast the channel as if it were saying it out loud.
Radio.recalculateChannels()
bot_core = new bot_core_type(src)
@@ -163,12 +163,7 @@
else
user << "[src] is in pristine condition."
/mob/living/simple_animal/bot/adjustBruteLoss(amount)
if(amount>0 && prob(10))
new /obj/effect/decal/cleanable/oil(loc)
return ..(amount)
/mob/living/simple_animal/bot/adjustFireLoss(amount)
/mob/living/simple_animal/bot/adjustHealth(amount)
if(amount>0 && prob(10))
new /obj/effect/decal/cleanable/oil(loc)
return ..(amount)
@@ -710,12 +705,12 @@ Pass a positive integer as an argument to override a bot's default speed.
if(usr in users)
users.Remove(usr)
return 1
if(topic_denied(usr))
usr << "<span class='warning'>[src]'s interface is not responding!</span>"
return 1
add_fingerprint(usr)
if((href_list["power"]) && (bot_core.allowed(usr) || !locked))
if (on)
turn_off()
@@ -786,3 +781,7 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/Logout()
. = ..()
bot_reset()
/mob/living/simple_animal/bot/revive()
..()
update_icon()
@@ -153,7 +153,7 @@
dat += "Critical Patient Alerts: <a href='?src=\ref[src];critalerts=1'>[declare_crit ? "Yes" : "No"]</a><br>"
dat += "Patrol Station: <a href='?src=\ref[src];operation=patrol'>[auto_patrol ? "Yes" : "No"]</a><br>"
dat += "Stationary Mode: <a href='?src=\ref[src];stationary=1'>[stationary_mode ? "Yes" : "No"]</a><br>"
return dat
/mob/living/simple_animal/bot/medbot/Topic(href, href_list)
@@ -229,8 +229,7 @@
declare_crit = 0
if(user)
user << "<span class='notice'>You short out [src]'s reagent synthesis circuits.</span>"
spawn(0)
audible_message("<span class='danger'>[src] buzzes oddly!</span>")
audible_message("<span class='danger'>[src] buzzes oddly!</span>")
flick("medibot_spark", src)
if(user)
oldpatient = user
@@ -43,7 +43,6 @@ var/global/mulebot_count = 0
var/reached_target = 1 //true if already reached the target
var/refresh = 1 // true to refresh dialogue
var/auto_return = 1 // true if auto return to home beacon after unload
var/auto_pickup = 1 // true if auto-pickup at beacon
var/report_delivery = 1 // true if bot will announce an arrival to a location.
@@ -214,8 +213,6 @@ mob/living/simple_animal/bot/mulebot/bot_reset()
dat += "<A href='byond://?src=\ref[src];op=autoret'>Toggle Auto Return Home</A> ([auto_return ? "On":"Off"])<BR>"
dat += "<A href='byond://?src=\ref[src];op=autopick'>Toggle Auto Pickup Crate</A> ([auto_pickup ? "On":"Off"])<BR>"
dat += "<A href='byond://?src=\ref[src];op=report'>Toggle Delivery Reporting</A> ([report_delivery ? "On" : "Off"])<BR>"
dat += "<A href='byond://?src=\ref[src];op=autorefresh'>Toggle Interface Refreshing</A> ([refresh ? "On" : "Off"])<BR>"
if(load)
dat += "<A href='byond://?src=\ref[src];op=unload'>Unload Now</A><BR>"
dat += "<div class='notice'>The maintenance hatch is closed.</div>"
@@ -297,11 +294,6 @@ mob/living/simple_animal/bot/mulebot/bot_reset()
return
switch(command)
if("autorefresh")
refresh = !refresh
update_controls()
if("stop")
if(mode >= BOT_DELIVER)
bot_reset()
@@ -318,26 +310,21 @@ mob/living/simple_animal/bot/mulebot/bot_reset()
update_controls()
if("destination")
refresh=0
var/new_dest = input(user, "Select M.U.L.E. Destination", "Mulebot [suffix ? "([suffix])" : ""]", destination) as null|anything in deliverybeacontags
refresh=1
if(new_dest)
set_destination(new_dest)
update_controls()
if("setid")
refresh=0
var/new_id = stripped_input(user, "Enter new bot ID", "Mulebot [suffix ? "([suffix])" : ""]", suffix, MAX_NAME_LEN)
refresh=1
if(new_id)
suffix = new_id
name = "\improper Mulebot ([suffix])"
update_controls()
if("sethome")
refresh=0
var/new_home = stripped_input(user, "Enter new home tag", "Mulebot [suffix ? "([suffix])" : ""]", home_destination)
refresh=1
if(new_home)
home_destination = new_home
update_controls()
@@ -512,8 +499,6 @@ mob/living/simple_animal/bot/mulebot/bot_reset()
sleep(2)
process_bot()
if(refresh) update_controls()
/mob/living/simple_animal/bot/mulebot/proc/process_bot()
if(!on)
return
@@ -184,6 +184,16 @@ Auto Patrol: []"},
else
..()
/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
if(istype(AM, /obj/item))
var/obj/item/I = AM
if(I.throwforce < src.health && I.thrownby && (istype(I.thrownby, /mob/living/carbon/human)))
var/mob/living/carbon/human/H = I.thrownby
retaliate(H)
..()
/mob/living/simple_animal/bot/secbot/proc/cuff(mob/living/carbon/C)
mode = BOT_ARREST
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
@@ -57,7 +57,7 @@
/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M)
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
if(health < maxHealth)
adjustBruteLoss(-5)
adjustHealth(-5)
if(src != M)
Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4)
M.visible_message("<span class='danger'>[M] repairs some of \the <b>[src]'s</b> dents.</span>", \
@@ -52,4 +52,4 @@
desc = "One bug squashed. Four more will rise in its place."
icon = 'icons/effects/blood.dmi'
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
@@ -119,16 +119,9 @@
switch(remove_from)
if("head")
if(inventory_head)
name = real_name
desc = initial(desc)
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
speak_emote = list("barks", "woofs")
emote_hear = list("barks", "woofs", "yaps","pants")
emote_see = list("shakes its head", "shivers")
desc = "It's a corgi."
SetLuminosity(0)
inventory_head.loc = src.loc
inventory_head = null
update_corgi_fluff()
regenerate_icons()
else
usr << "<span class='danger'>There is nothing to remove from its [remove_from].</span>"
@@ -137,6 +130,7 @@
if(inventory_back)
inventory_back.loc = src.loc
inventory_back = null
update_corgi_fluff()
regenerate_icons()
else
usr << "<span class='danger'>There is nothing to remove from its [remove_from].</span>"
@@ -198,6 +192,7 @@
usr.drop_item()
item_to_add.loc = src
src.inventory_back = item_to_add
update_corgi_fluff()
regenerate_icons()
show_inv(usr)
@@ -239,7 +234,7 @@
/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard,
/obj/item/clothing/head/cardborg, /obj/item/weapon/bedsheet, /obj/item/clothing/head/helmet/space/santahat,
/obj/item/clothing/head/soft, /obj/item/clothing/head/hardhat/reindeer, /obj/item/clothing/head/sombrero,
/obj/item/clothing/head/hopcap, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad, /obj/item/clothing/mask/gas/clown_hat)
/obj/item/clothing/head/hopcap, /obj/item/clothing/mask/gas/clown_hat)
valid = 1
if(valid)
@@ -271,115 +266,139 @@
return valid
/mob/living/simple_animal/pet/dog/corgi/proc/update_corgi_fluff()
if(!inventory_head)
return
switch(inventory_head.type)
if(/obj/item/clothing/head/helmet)
name = "Sergeant [real_name]"
desc = "The ever-loyal, the ever-vigilant."
var/special_hat = 0
if(inventory_head)
special_hat = 1
switch(inventory_head.type)
if(/obj/item/clothing/head/helmet)
name = "Sergeant [real_name]"
desc = "The ever-loyal, the ever-vigilant."
if(/obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef)
name = "Sous chef [real_name]"
desc = "Your food will be taste-tested. All of it."
if(/obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef)
name = "Sous chef [real_name]"
desc = "Your food will be taste-tested. All of it."
if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain)
name = "Captain [real_name]"
desc = "Probably better than the last captain."
if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain)
name = "Captain [real_name]"
desc = "Probably better than the last captain."
if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty)
name = "Runtime"
emote_see = list("coughs up a furball", "stretches")
emote_hear = list("purrs")
speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW")
desc = "It's a cute little kitty-cat! ... wait ... what the hell?"
if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty)
name = "Runtime"
emote_see = list("coughs up a furball", "stretches")
emote_hear = list("purrs")
speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW")
desc = "It's a cute little kitty-cat! ... wait ... what the hell?"
if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
name = "Hoppy"
emote_see = list("twitches its nose", "hops around a bit")
desc = "This is Hoppy. It's a corgi-...urmm... bunny rabbit"
if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
name = "Hoppy"
emote_see = list("twitches its nose", "hops around a bit")
desc = "This is Hoppy. It's a corgi-...urmm... bunny rabbit"
if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
name = "Yann"
desc = "Mon dieu! C'est un chien!"
speak = list("le woof!", "le bark!", "JAPPE!!")
emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.")
if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
name = "Yann"
desc = "Mon dieu! C'est un chien!"
speak = list("le woof!", "le bark!", "JAPPE!!")
emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.")
if(/obj/item/clothing/head/det_hat)
name = "Detective [real_name]"
desc = "[name] sees through your lies..."
emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.")
if(/obj/item/clothing/head/det_hat)
name = "Detective [real_name]"
desc = "[name] sees through your lies..."
emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.")
if(/obj/item/clothing/head/nursehat)
name = "Nurse [real_name]"
desc = "[name] needs 100cc of beef jerky... STAT!"
if(/obj/item/clothing/head/nursehat)
name = "Nurse [real_name]"
desc = "[name] needs 100cc of beef jerky... STAT!"
if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate)
name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]"
desc = "Yaarghh!! Thar' be a scurvy dog!"
emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth!")
emote_hear = list("growls ferociously!", "snarls.")
speak = list("Arrrrgh!!","Grrrrrr!")
if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate)
name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]"
desc = "Yaarghh!! Thar' be a scurvy dog!"
emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth!")
emote_hear = list("growls ferociously!", "snarls.")
speak = list("Arrrrgh!!","Grrrrrr!")
if(/obj/item/clothing/head/ushanka)
name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]"
desc = "A follower of Karl Barx."
emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vanguardism.")
if(/obj/item/clothing/head/ushanka)
name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]"
desc = "A follower of Karl Barx."
emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vanguardism.")
if(/obj/item/clothing/head/warden, /obj/item/clothing/head/collectable/police)
name = "Officer [real_name]"
emote_see = list("drools.","looks for donuts.")
desc = "Stop right there criminal scum!"
if(/obj/item/clothing/head/warden, /obj/item/clothing/head/collectable/police)
name = "Officer [real_name]"
emote_see = list("drools.","looks for donuts.")
desc = "Stop right there criminal scum!"
if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
name = "Grandwizard [real_name]"
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!")
if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
name = "Grandwizard [real_name]"
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!")
if(/obj/item/clothing/head/cardborg)
name = "Borgi"
speak = list("Ping!","Beep!","Woof!")
emote_see = list("goes rogue.", "sniffs out non-humans.")
desc = "Result of robotics budget cuts."
if(/obj/item/clothing/head/cardborg)
name = "Borgi"
speak = list("Ping!","Beep!","Woof!")
emote_see = list("goes rogue.", "sniffs out non-humans.")
desc = "Result of robotics budget cuts."
if(/obj/item/weapon/bedsheet)
name = "\improper Ghost"
speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU")
emote_see = list("stumbles around.", "shivers.")
emote_hear = list("howls!","groans.")
desc = "Spooky!"
if(/obj/item/weapon/bedsheet)
name = "\improper Ghost"
speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU")
emote_see = list("stumbles around.", "shivers.")
emote_hear = list("howls!","groans.")
desc = "Spooky!"
if(/obj/item/clothing/head/helmet/space/santahat)
name = "Santa's Corgi Helper"
emote_hear = list("barks Christmas songs.", "yaps merrily!")
emote_see = list("looks for presents.", "checks his list.")
desc = "He's very fond of milk and cookies."
if(/obj/item/clothing/head/helmet/space/santahat)
name = "Santa's Corgi Helper"
emote_hear = list("barks Christmas songs.", "yaps merrily!")
emote_see = list("looks for presents.", "checks his list.")
desc = "He's very fond of milk and cookies."
if(/obj/item/clothing/head/soft)
name = "Corgi Tech [real_name]"
desc = "The reason your yellow gloves have chew-marks."
if(/obj/item/clothing/head/soft)
name = "Corgi Tech [real_name]"
desc = "The reason your yellow gloves have chew-marks."
if(/obj/item/clothing/head/hardhat/reindeer)
name = "[real_name] the red-nosed Corgi"
emote_hear = list("lights the way!", "illuminates.", "yaps!")
desc = "He has a very shiny nose."
if(/obj/item/clothing/head/hardhat/reindeer)
name = "[real_name] the red-nosed Corgi"
emote_hear = list("lights the way!", "illuminates.", "yaps!")
desc = "He has a very shiny nose."
if(/obj/item/clothing/head/sombrero)
name = "Segnor [real_name]"
desc = "You must respect elder [real_name]"
if(/obj/item/clothing/head/sombrero)
name = "Segnor [real_name]"
desc = "You must respect elder [real_name]"
if(/obj/item/clothing/head/hopcap)
name = "Lieutenant [real_name]"
desc = "Can actually be trusted to not run off on his own."
if(/obj/item/clothing/head/hopcap)
name = "Lieutenant [real_name]"
desc = "Can actually be trusted to not run off on his own."
if(/obj/item/clothing/head/helmet/space/hardsuit/deathsquad)
name = "Trooper [real_name]"
desc = "That's not red paint. That's real corgi blood."
if(/obj/item/clothing/head/helmet/space/hardsuit/deathsquad)
name = "Trooper [real_name]"
desc = "That's not red paint. That's real corgi blood."
if(/obj/item/clothing/mask/gas/clown_hat)
name = "[real_name] the Clown"
desc = "Honkman's best friend."
speak = list("HONK!", "Honk!")
emote_see = list("plays tricks.", "slips.")
if(/obj/item/clothing/mask/gas/clown_hat)
name = "[real_name] the Clown"
desc = "Honkman's best friend."
speak = list("HONK!", "Honk!")
emote_see = list("plays tricks.", "slips.")
else
special_hat = 0
var/special_back = 0
if(inventory_back)
special_back = 1
switch(inventory_back.type)
if(/obj/item/clothing/suit/space/hardsuit/deathsquad)
name = "Trooper [real_name]"
desc = "That's not red paint. That's real corgi blood."
else
special_back = 0
if(!special_hat && !special_back)
name = real_name
desc = initial(desc)
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
speak_emote = list("barks", "woofs")
emote_hear = list("barks", "woofs", "yaps","pants")
emote_see = list("shakes its head", "shivers")
desc = "It's a corgi."
SetLuminosity(0)
return
//IAN! SQUEEEEEEEEE~
/mob/living/simple_animal/pet/dog/corgi/Ian
@@ -26,21 +26,16 @@
/mob/living/simple_animal/drone/proc/alert_drones(msg, dead_can_hear = 0)
for(var/mob/M in player_list)
var/send_msg = 0
for(var/W in mob_list)
var/mob/M = W
if(istype(M, /mob/living/simple_animal/drone) && M.stat != DEAD)
for(var/F in src.faction)
if(F in M.faction)
send_msg = 1
break
else if(dead_can_hear && (M in dead_mob_list))
send_msg = 1
if(send_msg)
M << msg
M << msg
if(dead_can_hear && (M in dead_mob_list))
M << "<a href='?src=\ref[M];follow=\ref[src]'>(F)</a> [msg]"
/mob/living/simple_animal/drone/proc/drone_chat(msg)
var/rendered = "<i><span class='game say'>DRONE CHAT: <span class='name'>[name]</span>: [msg]</span></i>"
var/rendered = "<i>DRONE CHAT: <span class='name'>[name]</span>: [msg]</i>"
alert_drones(rendered, 1)
@@ -7,9 +7,9 @@
response_disarm = "flails at"
response_harm = "punches"
icon = 'icons/mob/guardian.dmi'
icon_state = "guardianorange"
icon_living = "guardianorange"
icon_dead = "stand"
icon_state = "magicOrange"
icon_living = "magicOrange"
icon_dead = "magicOrange"
speed = 0
a_intent = "harm"
stop_automated_movement = 1
@@ -21,13 +21,13 @@
attacktext = "punches"
maxHealth = INFINITY //The spirit itself is invincible
health = INFINITY
damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) //how much damage from each damage type we transfer to the owner
environment_smash = 0
melee_damage_lower = 15
melee_damage_upper = 15
butcher_results = list(/obj/item/weapon/ectoplasm = 1)
AIStatus = AI_OFF
var/cooldown = 0
var/damage_transfer = 1 //how much damage from each attack we transfer to the owner
var/mob/living/summoner
var/range = 10 //how far from the user the spirit can be
var/playstyle_string = "You are a standard Guardian. You shouldn't exist!"
@@ -70,7 +70,7 @@
visible_message("<span class='danger'>The [src] jumps back to its user.</span>")
loc = get_turf(summoner)
/mob/living/mob/living/simple_animal/hostile/guardian/canSuicide()
/mob/living/simple_animal/hostile/guardian/canSuicide()
return 0
/mob/living/simple_animal/hostile/guardian/death()
@@ -78,27 +78,25 @@
summoner << "<span class='danger'><B>Your [name] died somehow!</span></B>"
summoner.death()
/mob/living/simple_animal/hostile/guardian/adjustBruteLoss(amount) //The spirit is invincible, but passes on damage to the summoner
var/damage = amount * damage_transfer
if (summoner)
/mob/living/simple_animal/hostile/guardian/adjustHealth(amount) //The spirit is invincible, but passes on damage to the summoner
if(summoner)
if(loc == summoner)
return
summoner.adjustBruteLoss(damage)
if(damage)
summoner.adjustBruteLoss(amount)
if(amount)
summoner << "<span class='danger'><B>Your [name] is under attack! You take damage!</span></B>"
summoner.visible_message("<span class='danger'><B>Blood sprays from [summoner] as [src] takes damage!</B></span>")
if(summoner.stat == UNCONSCIOUS)
summoner << "<span class='danger'><B>Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!</span></B>"
summoner.adjustCloneLoss(damage/2)
summoner.adjustCloneLoss(amount*0.5) //dying hosts take 50% bonus damage as cloneloss
/mob/living/simple_animal/hostile/guardian/ex_act(severity, target)
switch (severity)
if (1)
switch(severity)
if(1)
gib()
return
if (2)
if(2)
adjustBruteLoss(60)
if(3)
adjustBruteLoss(30)
@@ -129,10 +127,13 @@
var/input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "")
if(!input) return
var/my_message = "<span class='boldannounce'><i>[src]:</i> [input]</span>"
for(var/mob/M in mob_list)
if(M == summoner || (M in dead_mob_list))
M << "<span class='boldannounce'><i>[src]:</i> [input]</span>"
src << "<span class='boldannounce'><i>[src]:</i> [input]</span>"
if(M == summoner)
M << my_message
if(M in dead_mob_list)
M << "<a href='?src=\ref[M];follow=\ref[src]'>(F)</a> [my_message]"
src << "[my_message]"
log_say("[src.real_name]/[src.key] : [input]")
/mob/living/simple_animal/hostile/guardian/proc/ToggleMode()
@@ -146,13 +147,14 @@
var/input = stripped_input(src, "Please enter a message to tell your guardian.", "Message", "")
if(!input) return
var/my_message = "<span class='boldannounce'><i>[src]:</i> [input]</span>"
for(var/mob/M in mob_list)
if(istype (M, /mob/living/simple_animal/hostile/guardian))
var/mob/living/simple_animal/hostile/guardian/G = M
if(G.summoner == src)
G << "<span class='boldannounce'><i>[src]:</i> [input]</span>"
G << "[my_message]"
else if (M in dead_mob_list)
M << "<span class='boldannounce'><i>[src]:</i> [input]</span>"
M << "<a href='?src=\ref[M];follow=\ref[src]'>(F)</a> [my_message]"
src << "<span class='boldannounce'><i>[src]:</i> [input]</span>"
log_say("[src.real_name]/[src.key] : [text]")
@@ -204,7 +206,7 @@
melee_damage_upper = 10
attack_sound = 'sound/items/Welder.ogg'
attacktext = "sears"
damage_transfer = 0.8
damage_coeff = list(BRUTE = 0.8, BURN = 0.8, TOX = 0.8, CLONE = 0.8, STAMINA = 0, OXY = 0.8)
range = 10
playstyle_string = "As a Chaos type, you have only light damage resistance, but will ignite any enemy you bump into. In addition, your melee attacks will randomly teleport enemies."
environment_smash = 1
@@ -252,7 +254,6 @@
/mob/living/simple_animal/hostile/guardian/punch
melee_damage_lower = 20
melee_damage_upper = 20
damage_transfer = 0.5
playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
environment_smash = 2
magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated."
@@ -285,6 +286,7 @@
a_intent = "harm"
friendly = "heals"
speed = 0
damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
melee_damage_lower = 15
melee_damage_upper = 15
playstyle_string = "As a Support type, you may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent mob will warp them to your bluespace beacon after a short delay."
@@ -317,7 +319,7 @@
if(toggle)
a_intent = "harm"
speed = 0
damage_transfer = 0.7
damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
melee_damage_lower = 15
melee_damage_upper = 15
src << "<span class='danger'><B>You switch to combat mode.</span></B>"
@@ -325,7 +327,7 @@
else
a_intent = "help"
speed = 1
damage_transfer = 1
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
melee_damage_lower = 0
melee_damage_upper = 0
src << "<span class='danger'><B>You switch to healing mode.</span></B>"
@@ -413,7 +415,7 @@
friendly = "quietly assesses"
melee_damage_lower = 10
melee_damage_upper = 10
damage_transfer = 0.9
damage_coeff = list(BRUTE = 0.9, BURN = 0.9, TOX = 0.9, CLONE = 0.9, STAMINA = 0, OXY = 0.9)
projectiletype = /obj/item/projectile/guardian
ranged_cooldown_cap = 0
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
@@ -494,7 +496,7 @@
/mob/living/simple_animal/hostile/guardian/bomb
melee_damage_lower = 15
melee_damage_upper = 15
damage_transfer = 0.6
damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, CLONE = 0.6, STAMINA = 0, OXY = 0.6)
range = 13
playstyle_string = "As an explosive type, you have only moderate close combat abilities, but are capable of converting any adjacent item into a disguised bomb via alt click."
magic_fluff_string = "..And draw the Scientist, master of explosive death."
@@ -634,19 +636,24 @@
user.verbs += /mob/living/proc/guardian_recall
user.verbs += /mob/living/proc/guardian_reset
var/picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
var/colour = pick("orange", "pink", "red", "blue", "green")
G.name = "[picked_name] [capitalize(colour)]"
G.real_name = "[picked_name] [capitalize(colour)]"
G.icon_living = "guardian[colour]"
G.icon_state = "guardian[colour]"
G.icon_dead = "guardian[colour]"
switch (theme)
var/colour
var/picked_name
switch(theme)
if("magic")
user << "[G.magic_fluff_string]."
colour = pick("Pink", "Red", "Orange", "Green", "Blue")
picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
if("tech")
user << "[G.tech_fluff_string]."
colour = pick("Rose", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Orchid") //technically not colors, just flowers that can be specific colors
picked_name = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel")
G.name = "[picked_name] [colour]"
G.real_name = "[picked_name] [colour]"
G.icon_living = "[theme][colour]"
G.icon_state = "[theme][colour]"
G.icon_dead = "[theme][colour]"
G.mind.name = "[G.real_name]"
/obj/item/weapon/guardiancreator/choose
@@ -116,13 +116,11 @@
//second, spin a sticky spiderweb on this tile
var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
if(!W)
spawn()
Web()
Web()
else
//third, lay an egg cluster there
if(fed)
spawn()
LayEggs()
LayEggs()
else
//fourthly, cocoon any nearby items so those pesky pinkskins can't use them
for(var/obj/O in can_see)
@@ -140,8 +138,7 @@
else if(busy == MOVING_TO_TARGET && cocoon_target)
if(get_dist(src, cocoon_target) <= 1)
spawn()
Wrap()
Wrap()
else
busy = 0
@@ -43,6 +43,9 @@
// Changeling egg can survive in aliens!
var/mob/living/carbon/C = target
if(C.stat == DEAD)
if(C.status_flags & XENO_HOST)
src << "<span class='userdanger'>A foreign presence repels us from this body. Perhaps we should try to infest another?</span>"
return
Infect(target)
src << "<span class='userdanger'>With our egg laid, our death approaches rapidly...</span>"
spawn(100)
@@ -24,7 +24,7 @@
speak_emote = list("states")
gold_core_spawnable = 1
del_on_death = 1
loot = (/obj/effect/decal/cleanable/robot_debris)
loot = list(/obj/effect/decal/cleanable/robot_debris)
/mob/living/simple_animal/hostile/hivebot/New()
..()
@@ -116,11 +116,7 @@
return 1
if(isliving(the_target))
var/mob/living/L = the_target
var/faction_check = 0
for(var/F in faction)
if(F in L.faction)
faction_check = 1
break
var/faction_check = faction_check(L)
if(robust_searching)
if(L.stat > stat_attack || L.stat != stat_attack && stat_exclusive == 1)
return 0
@@ -183,7 +179,7 @@
/mob/living/simple_animal/hostile/proc/Goto(target, delay, minimum_distance)
walk_to(src, target, minimum_distance, delay)
/mob/living/simple_animal/hostile/adjustBruteLoss(damage)
/mob/living/simple_animal/hostile/adjustHealth(damage)
..(damage)
if(!ckey && !stat && search_objects < 3 && damage > 0)//Not unconscious, and we don't ignore mobs
if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight
@@ -70,7 +70,7 @@
visible_message("<b>[src]</b> starts to move!")
attempt_open = 1
/mob/living/simple_animal/hostile/mimic/crate/adjustBruteLoss(damage)
/mob/living/simple_animal/hostile/mimic/crate/adjustHealth(damage)
trigger()
..(damage)
@@ -139,7 +139,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
return 1
return 0
/mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(obj/O, mob/living/creator, destroy_original = 0)
/mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(obj/O, mob/living/user, destroy_original = 0)
if(destroy_original || CheckObject(O))
O.loc = src
name = O.name
@@ -164,8 +164,8 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
melee_damage_upper = 2 + I.force
move_to_delay = 2 * I.w_class + 1
maxHealth = health
if(creator)
creator = creator
if(user)
creator = user
faction += "\ref[creator]" // very unique
if(destroy_original)
qdel(O)
@@ -181,7 +181,7 @@
visible_message("<span class='danger'>The [P.name] was repelled by [src.name]'s girth!</span>")
return
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(damage)
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(damage)
idle_vision_range = 9
..()
@@ -374,6 +374,8 @@
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
var/tturf = get_turf(target)
if(!(istype(tturf, /turf/simulated)))
return
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
visible_message("<span class='warning'>The [src.name] digs its tentacles under [target.name]!</span>")
new /obj/effect/goliath_tentacle/original(tturf)
@@ -382,7 +384,7 @@
pre_attack = 0
return
/mob/living/simple_animal/hostile/asteroid/goliath/adjustBruteLoss(damage)
/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage)
ranged_cooldown--
handle_preattack()
..()
@@ -522,7 +524,7 @@
Inflate()
..()
/mob/living/simple_animal/hostile/asteroid/fugu/adjustBruteLoss(var/damage)
/mob/living/simple_animal/hostile/asteroid/fugu/adjustHealth(var/damage)
if(wumbo)
return
..()
@@ -61,7 +61,7 @@
deathmessage = "[src] fainted."
..()
/mob/living/simple_animal/hostile/mushroom/adjustBruteLoss(damage)//Possibility to flee from a fight just to make it more visually interesting
/mob/living/simple_animal/hostile/mushroom/adjustHealth(damage)//Possibility to flee from a fight just to make it more visually interesting
if(!retreat_distance && prob(33))
retreat_distance = 5
spawn(30)
@@ -51,7 +51,7 @@
H.enemies |= enemies
return 0
/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(damage)
/mob/living/simple_animal/hostile/retaliate/adjustHealth(damage)
..(damage)
if(stat == CONSCIOUS)
Retaliate()
@@ -60,8 +60,8 @@
icon_state = "templar"
icon_living = "templar"
icon_dead = "templar_dead"
maxHealth = 125
health = 125
maxHealth = 150
health = 150
speed = 2
gold_core_spawnable = 0
speak_chance = 1
@@ -75,16 +75,6 @@
/obj/item/clothing/head/helmet/knight/templar,
/obj/item/weapon/claymore/hog{name = "holy sword"})
/mob/living/simple_animal/hostile/skeleton/templar/bullet_act(obj/item/projectile/Proj)
if(!Proj)
return
if(prob(50))
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
src.health -= Proj.damage
else
visible_message("<span class='danger'>[src] blocks [Proj] with its sword!</span>")
return 0
/mob/living/simple_animal/hostile/skeleton/ice
name = "ice skeleton"
desc = "A reanimated skeleton protected by a thick sheet of natural ice armor. Looks slow, though."
@@ -117,7 +117,7 @@
// This loop will, at most, loop twice.
for(var/atom/check in check_list)
for(var/mob/living/M in viewers(world.view + 1, check) - src)
if(M.client && CanAttack(M) && !issilicon(M))
if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege)
if(!M.eye_blind)
return M
for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you
@@ -87,7 +87,7 @@
if(grasping.len < max_grasps)
for(var/mob/living/L in range(grasp_range,src))
if(L == src)
if(L == src || faction_check(L))
continue
if(!(L in grasping) && L != target && prob(grasp_chance))
L << "<span class='userdanger'>\the [src] has you entangled!</span>"
@@ -281,25 +281,31 @@
Proj.on_hit(src)
return 0
/mob/living/simple_animal/proc/adjustHealth(amount)
if(status_flags & GODMODE)
return 0
bruteloss = Clamp(bruteloss + amount, 0, maxHealth)
handle_regular_status_updates()
/mob/living/simple_animal/adjustBruteLoss(amount)
if(damage_coeff[BRUTE])
..(amount*damage_coeff[BRUTE])
adjustHealth(amount*damage_coeff[BRUTE])
/mob/living/simple_animal/adjustFireLoss(amount)
if(damage_coeff[BURN])
adjustBruteLoss(amount*damage_coeff[BURN])
adjustHealth(amount*damage_coeff[BURN])
/mob/living/simple_animal/adjustOxyLoss(amount)
if(damage_coeff[OXY])
adjustBruteLoss(amount*damage_coeff[OXY])
adjustHealth(amount*damage_coeff[OXY])
/mob/living/simple_animal/adjustToxLoss(amount)
if(damage_coeff[TOX])
..(amount*damage_coeff[TOX])
adjustHealth(amount*damage_coeff[TOX])
/mob/living/simple_animal/adjustCloneLoss(amount)
if(damage_coeff[CLONE])
..(amount*damage_coeff[CLONE])
adjustHealth(amount*damage_coeff[CLONE])
/mob/living/simple_animal/adjustStaminaLoss(amount)
return
+3 -2
View File
@@ -27,7 +27,7 @@
player_list |= src
update_Login_details()
world.update_status()
client.images = null //remove the images such as AIs being unable to see runes
client.screen = list() //remove hud items just in case
if(hud_used) qdel(hud_used) //remove the hud objects
@@ -37,7 +37,8 @@
sight |= SEE_SELF
..()
if (key != client.key)
key = client.key
if(loc && !isturf(loc))
client.eye = loc
client.perspective = EYE_PERSPECTIVE
+63 -71
View File
@@ -40,108 +40,94 @@ var/next_mob_id = 0
if(gas[MOLES])
t+="<span class='notice'>[gas[GAS_NAME]]: [gas[MOLES]] \n</span>"
usr.show_message(t, 1)
usr << t
/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
/mob/proc/show_message(msg, type, alt_msg, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
if(!client) return
if(!client)
return
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
if (type)
if(type & 1 && (disabilities & BLIND || paralysis) )//Vision related
if (!( alt ))
if(type)
if(type & 1 && eye_blind )//Vision related
if(!alt_msg)
return
else
msg = alt
msg = alt_msg
type = alt_type
if (type & 2 && ear_deaf)//Hearing related
if (!( alt ))
if(type & 2 && ear_deaf)//Hearing related
if(!alt_msg)
return
else
msg = alt
msg = alt_msg
type = alt_type
if ((type & 1 && disabilities & BLIND))
if(type & 1 && eye_blind)
return
// Added voice muffling for Issue 41.
if(stat == UNCONSCIOUS || sleeping > 0)
src << "<I>... You can almost hear someone talking ...</I>"
// voice muffling
if(stat == UNCONSCIOUS)
if(type & 2) //audio
src << "<I>... You can almost hear something ...</I>"
else
src << msg
return
// Show a message to all mobs who sees the src mob and the src mob itself
// Show a message the src mob and to all player mobs who sees the src mob
// This would be for visible actions by the src mob
// message is the message output to anyone who can see e.g. "[src] does something!"
// self_message (optional) is what the src mob sees e.g. "You do something!"
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
/mob/visible_message(message, self_message, blind_message)
var/list/mob_viewers = list()
var/list/possible_viewers = list()
mob_viewers |= src
mob_viewers |= viewers(src)
var/heard = get_hear(7, src)
for(var/atom/movable/A in heard)
possible_viewers |= recursive_hear_check(A)
for(var/mob/B in possible_viewers)
if(B in mob_viewers)
var/turf/T = get_turf(src)
if(!T)
return
for(var/mob/M in get_hearers_in_view(7, src))
if(!M.client)
continue
if(isturf(B.loc))
continue
var/turf/T = get_turf(B)
if(src in view(T))
mob_viewers |= B
for(var/mob/M in mob_viewers)
if(M.see_invisible < invisibility)
continue //can't view the invisible
var/msg = message
if(self_message && M==src)
msg = self_message
M.show_message(msg, 1)
if(M == src) //the src always see the main message or self message
if(self_message)
msg = self_message
else
if(M.see_invisible<invisibility || T != loc) //if src is inside something or invisible to us,
if(blind_message) // then people see blind message if there is one, otherwise nothing.
msg = blind_message
else
continue
else if(T.lighting_object)
if(T.lighting_object.invisibility <= M.see_invisible && !T.lighting_object.luminosity)
if(blind_message) //if the light object is dark and not invisible to us, we see blind_message/nothing
msg = blind_message
else
continue
M.show_message(msg,1,blind_message,2)
if(blind_message)
var/list/mob_hearers = list()
for(var/mob/C in get_hearers_in_view(7, src))
if(C in mob_viewers)
continue
mob_hearers |= C
for(var/mob/MOB in mob_hearers)
MOB.show_message(blind_message, 2)
// Show a message to all mobs who sees this atom
// Show a message to all player mobs who sees this atom
// Use for objects performing visible actions
// message is output to anyone who can see, e.g. "The [src] does something!"
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
/atom/proc/visible_message(message, blind_message)
var/list/mob_viewers = list()
var/list/possible_viewers = list()
mob_viewers |= viewers(src)
var/heard = get_hear(7, src)
for(var/atom/movable/A in heard)
possible_viewers |= recursive_hear_check(A)
for(var/mob/B in possible_viewers)
if(B in mob_viewers)
var/turf/T = get_turf(src)
if(!T)
return
for(var/mob/M in get_hearers_in_view(7, src))
if(!M.client)
continue
if(isturf(B.loc))
continue
var/turf/T = get_turf(B)
if(src in view(T))
mob_viewers |= B
for(var/mob/M in mob_viewers)
M.show_message(message, 1)
if(blind_message)
var/list/mob_hearers = list()
for(var/mob/C in get_hearers_in_view(7, src))
if(C in mob_viewers)
var/msg = message
if(M.see_invisible<invisibility || T != loc)//if src is inside something or invisible to us,
if(blind_message) // then people see blind message if there is one, otherwise nothing.
msg = blind_message
else
continue
mob_hearers |= C
for(var/mob/MOB in mob_hearers)
MOB.show_message(blind_message, 2)
else if(T.lighting_object)
if(T.lighting_object.invisibility <= M.see_invisible && !T.lighting_object.luminosity) //the light object is dark and not invisible to us
if(blind_message)
msg = blind_message
else
continue
M.show_message(msg,1,blind_message,2)
// Show a message to all mobs in earshot of this one
// This would be for audible actions by the src mob
@@ -974,3 +960,9 @@ var/next_mob_id = 0
//Can the mob use Topic to interact with machines
/mob/proc/canUseTopic()
return
/mob/proc/faction_check(mob/target)
for(var/F in faction)
if(F in target.faction)
return 1
return 0
-1
View File
@@ -27,7 +27,6 @@
Changing this around would probably require a good look-over the pre-existing code.
*/
var/obj/screen/zone_sel/zone_sel = null
var/obj/screen/leap_icon = null
var/obj/screen/healthdoll = null
var/damageoverlaytemp = 0
+1 -1
View File
@@ -373,7 +373,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return
/proc/IsAdminGhost(var/mob/user)
if(check_rights(R_ADMIN, 0) && istype(user, /mob/dead/observer) && user.client.AI_Interact)
if(check_rights_for(user.client, R_ADMIN) && istype(user, /mob/dead/observer) && user.client.AI_Interact)
return 1
else
return 0
+27 -30
View File
@@ -160,13 +160,14 @@
if(M)
if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
. = ..()
if (isturf(M.loc))
var/diag = get_dir(mob, M)
if ((diag - 1) & diag)
else
diag = null
if ((get_dist(mob, M) > 1 || diag))
step(M, get_dir(M.loc, mob.loc))
if(M)//Mob may get deleted during parent call
if (isturf(M.loc))
var/diag = get_dir(mob, M)
if ((diag - 1) & diag)
else
diag = null
if ((get_dist(mob, M) > 1 || diag))
step(M, get_dir(M.loc, mob.loc))
else
for(var/mob/M in L)
M.other_mobs = 1
@@ -275,13 +276,12 @@
else
return
L.loc = locate(locx,locy,mobloc.z)
spawn(0)
var/limit = 2//For only two trailing shadows.
for(var/turf/T in getline(mobloc, L.loc))
spawn(0)
anim(T,L,'icons/mob/mob.dmi',,"shadow",,L.dir)
limit--
if(limit<=0) break
var/limit = 2//For only two trailing shadows.
for(var/turf/T in getline(mobloc, L.loc))
spawn(0)
anim(T,L,'icons/mob/mob.dmi',,"shadow",,L.dir)
limit--
if(limit<=0) break
else
spawn(0)
anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,L.dir)
@@ -305,43 +305,40 @@
///For moving in space
///Return 1 for movement 0 for none
/mob/Process_Spacemove(movement_dir = 0)
if(..())
return 1
var/atom/movable/backup = get_spacemove_backup()
if(backup)
if(istype(backup) && movement_dir && !backup.anchored)
if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves
src << "<span class='info'>You push off of [backup] to propel yourself.</span>"
return 1
return 0
/mob/get_spacemove_backup()
var/atom/movable/dense_object_backup
for(var/atom/A in orange(1, get_turf(src)))
for(var/A in orange(1, get_turf(src)))
if(isarea(A))
continue
else if(isturf(A))
var/turf/turf = A
if(istype(turf,/turf/space))
continue
if(!turf.density && !mob_negates_gravity())
continue
return 1
return A
else
var/atom/movable/AM = A
if(AM == buckled) //Kind of unnecessary but let's just be sure
continue
if(!AM.CanPass(src) || AM.density)
if(AM.anchored)
return 1
return AM
if(pulling == AM)
continue
dense_object_backup = AM
if(movement_dir && dense_object_backup)
if(dense_object_backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves
src << "<span class='info'>You push off of [dense_object_backup] to propel yourself.</span>"
return 1
return 0
break
. = dense_object_backup
/mob/proc/mob_has_gravity(turf/T)
return has_gravity(src, T)
+47 -20
View File
@@ -76,37 +76,64 @@ Contents:
else if(M.assigned_role in command_positions)
possible_targets[M] = 1 //good-guy
/*
Alright, so, if I had my way I'd axe all this retarded bullshit entirely, but I know some people would complain because
porting ninja specifics to the random gen system would go horribly. I can at the very least axe 99% of the autism
and make ninja code slightly more bearable.
- Iamgoofball
*/
var/list/objectives = list(1,2,3,4)
while(Mind.objectives.len < 6) //still not enough objectives! // WHY DOES THIS CALL FOR 6 OBJECTIVES
switch(pick_n_take(objectives)) // BUT THEN PREVENT YOU FROM GETTING 4 IN THE END
while(Mind.objectives.len < 6) //still not enough objectives!
switch(pick_n_take(objectives))
if(1) //research
add_objective(Mind, /datum/objective/download)
var/datum/objective/download/O = new /datum/objective/download()
O.owner = Mind
O.gen_amount_goal()
Mind.objectives += O
if(2) //steal
add_objective(Mind, /datum/objective/default/steal/special)
var/datum/objective/steal/special/O = new /datum/objective/steal/special()
O.owner = Mind
Mind.objectives += O
if(3) //protect/kill
if(prob(50))
add_objective(Mind, /datum/objective/default/assassinate)
else
add_objective(Mind, /datum/objective/default/protect)
if(!possible_targets.len) continue
var/selected = rand(1,possible_targets.len)
var/datum/mind/M = possible_targets[selected]
var/is_bad_guy = possible_targets[M]
possible_targets.Cut(selected,selected+1)
if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy)
var/datum/objective/assassinate/O = new /datum/objective/assassinate()
O.owner = Mind
O.target = M
O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]."
Mind.objectives += O
else //protect
var/datum/objective/protect/O = new /datum/objective/protect()
O.owner = Mind
O.target = M
O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm."
Mind.objectives += O
if(4) //debrain/capture
if(prob(50))
add_objective(Mind, /datum/objective/default/debrain)
else
add_objective(Mind, /datum/objective/capture)
if(!possible_targets.len) continue
var/selected = rand(1,possible_targets.len)
var/datum/mind/M = possible_targets[selected]
var/is_bad_guy = possible_targets[M]
possible_targets.Cut(selected,selected+1)
if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy)
var/datum/objective/debrain/O = new /datum/objective/debrain()
O.owner = Mind
O.target = M
O.explanation_text = "Steal the brain of [M.current.real_name]."
Mind.objectives += O
else //capture
var/datum/objective/capture/O = new /datum/objective/capture()
O.owner = Mind
O.gen_amount_goal()
Mind.objectives += O
else
break
//Add a survival objective since it's usually broad enough for any round type.
add_objective(Mind, /datum/objective/escape_obj/survive)
var/datum/objective/O = new /datum/objective/survive()
O.owner = Mind
Mind.objectives += O
//add some RP-fluff
Mind.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A <font color='red'><B>SPACE NINJA</B></font>!")
+6
View File
@@ -131,6 +131,12 @@
desc = "A polaroid camera, some say it can see ghosts!"
see_ghosts = 1
/obj/item/device/camera/detective
name = "Detective's camera"
desc = "A polaroid camera with extra capacity for crime investigations."
pictures_max = 30
pictures_left = 30
/obj/item/device/camera/siliconcam //camera AI can take pictures with
name = "silicon photo camera"
+7 -26
View File
@@ -597,7 +597,9 @@
interact(user)
/obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user)
if(!user) return
if(!user)
return
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
user.visible_message("<span class='danger'>[user.name] slashes at the [src.name]!</span>", "<span class='notice'>You slash at the [src.name]!</span>")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
@@ -626,10 +628,11 @@
else
ui_interact(user)
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/tgui/ui = null, force_open = 0)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open)
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if (!ui)
ui = new(user, src, ui_key, "apc", name, 460, 515)
ui = new(user, src, ui_key, "apc", name, 535, 515, master_ui, state)
ui.open()
/obj/machinery/power/apc/get_ui_data(mob/user)
@@ -878,28 +881,6 @@
point.the_disk = null //the pinpointer will go back to pointing at the nuke disc.
/obj/machinery/power/apc/proc/ion_act()
//intended to be exactly the same as an AI malf attack
if(!src.malfhack && src.z == ZLEVEL_STATION)
if(prob(3))
src.locked = 1
if (src.cell.charge > 0)
// world << "\red blew APC in [src.loc.loc]"
src.cell.charge = 0
cell.corrupt()
src.malfhack = 1
update_icon()
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(1, src.loc)
smoke.attach(src)
smoke.start()
var/datum/effect_system/spark_spread/s = new
s.set_up(3, 1, src)
s.start()
visible_message("<span class='warning'>The [src.name] suddenly lets out a blast of smoke and some sparks!</span>", \
"<span class='italics'>You hear sizzling electronics.</span>")
/obj/machinery/power/apc/surplus()
if(terminal)
return terminal.surplus()
+1
View File
@@ -468,6 +468,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
item_state = "coil_red"
max_amount = MAXCOIL
amount = MAXCOIL
merge_type = /obj/item/stack/cable_coil // This is here to let its children merge between themselves
item_color = "red"
desc = "A coil of power cable."
throwforce = 0

Some files were not shown because too many files have changed in this diff Show More