mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 08:34:16 +01:00
Merge remote-tracking branch 'upstream/master' into SPIN_ME_RIGHT_ROUND
This commit is contained in:
+2
-2
@@ -18,8 +18,8 @@ addons:
|
||||
|
||||
env:
|
||||
global:
|
||||
- BYOND_MAJOR="511"
|
||||
- BYOND_MINOR="1385"
|
||||
- BYOND_MAJOR="512"
|
||||
- BYOND_MINOR="1454"
|
||||
- BYOND_MACRO_COUNT=4
|
||||
matrix:
|
||||
- DM_MAPFILE="cyberiad"
|
||||
|
||||
+71
-72
@@ -215,81 +215,80 @@ world
|
||||
|
||||
#define TO_HEX_DIGIT(n) ascii2text((n&15) + ((n&15)<10 ? 48 : 87))
|
||||
|
||||
icon
|
||||
proc/MakeLying()
|
||||
var/icon/I = new(src,dir=SOUTH)
|
||||
I.BecomeLying()
|
||||
return I
|
||||
/icon/proc/MakeLying()
|
||||
var/icon/I = new(src,dir=SOUTH)
|
||||
I.BecomeLying()
|
||||
return I
|
||||
|
||||
proc/BecomeLying()
|
||||
Turn(90)
|
||||
Shift(SOUTH,6)
|
||||
Shift(EAST,1)
|
||||
/icon/proc/BecomeLying()
|
||||
Turn(90)
|
||||
Shift(SOUTH,6)
|
||||
Shift(EAST,1)
|
||||
|
||||
// Multiply all alpha values by this float
|
||||
proc/ChangeOpacity(opacity = 1.0)
|
||||
MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,opacity, 0,0,0,0)
|
||||
/icon/proc/ChangeOpacity(opacity = 1.0)
|
||||
MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,opacity, 0,0,0,0)
|
||||
|
||||
// Convert to grayscale
|
||||
proc/GrayScale()
|
||||
MapColors(0.3,0.3,0.3, 0.59,0.59,0.59, 0.11,0.11,0.11, 0,0,0)
|
||||
/icon/proc/GrayScale()
|
||||
MapColors(0.3,0.3,0.3, 0.59,0.59,0.59, 0.11,0.11,0.11, 0,0,0)
|
||||
|
||||
proc/ColorTone(tone)
|
||||
GrayScale()
|
||||
/icon/proc/ColorTone(tone)
|
||||
GrayScale()
|
||||
|
||||
var/list/TONE = ReadRGB(tone)
|
||||
var/gray = round(TONE[1]*0.3 + TONE[2]*0.59 + TONE[3]*0.11, 1)
|
||||
var/list/TONE = ReadRGB(tone)
|
||||
var/gray = round(TONE[1]*0.3 + TONE[2]*0.59 + TONE[3]*0.11, 1)
|
||||
|
||||
var/icon/upper = (255-gray) ? new(src) : null
|
||||
var/icon/upper = (255-gray) ? new(src) : null
|
||||
|
||||
if(gray)
|
||||
MapColors(255/gray,0,0, 0,255/gray,0, 0,0,255/gray, 0,0,0)
|
||||
Blend(tone, ICON_MULTIPLY)
|
||||
else SetIntensity(0)
|
||||
if(255-gray)
|
||||
upper.Blend(rgb(gray,gray,gray), ICON_SUBTRACT)
|
||||
upper.MapColors((255-TONE[1])/(255-gray),0,0,0, 0,(255-TONE[2])/(255-gray),0,0, 0,0,(255-TONE[3])/(255-gray),0, 0,0,0,0, 0,0,0,1)
|
||||
Blend(upper, ICON_ADD)
|
||||
if(gray)
|
||||
MapColors(255/gray,0,0, 0,255/gray,0, 0,0,255/gray, 0,0,0)
|
||||
Blend(tone, ICON_MULTIPLY)
|
||||
else SetIntensity(0)
|
||||
if(255-gray)
|
||||
upper.Blend(rgb(gray,gray,gray), ICON_SUBTRACT)
|
||||
upper.MapColors((255-TONE[1])/(255-gray),0,0,0, 0,(255-TONE[2])/(255-gray),0,0, 0,0,(255-TONE[3])/(255-gray),0, 0,0,0,0, 0,0,0,1)
|
||||
Blend(upper, ICON_ADD)
|
||||
|
||||
// Take the minimum color of two icons; combine transparency as if blending with ICON_ADD
|
||||
proc/MinColors(icon)
|
||||
var/icon/I = new(src)
|
||||
I.Opaque()
|
||||
I.Blend(icon, ICON_SUBTRACT)
|
||||
Blend(I, ICON_SUBTRACT)
|
||||
/icon/proc/MinColors(icon)
|
||||
var/icon/I = new(src)
|
||||
I.Opaque()
|
||||
I.Blend(icon, ICON_SUBTRACT)
|
||||
Blend(I, ICON_SUBTRACT)
|
||||
|
||||
// Take the maximum color of two icons; combine opacity as if blending with ICON_OR
|
||||
proc/MaxColors(icon)
|
||||
var/icon/I
|
||||
if(isicon(icon))
|
||||
I = new(icon)
|
||||
else
|
||||
// solid color
|
||||
I = new(src)
|
||||
I.Blend("#000000", ICON_OVERLAY)
|
||||
I.SwapColor("#000000", null)
|
||||
I.Blend(icon, ICON_OVERLAY)
|
||||
var/icon/J = new(src)
|
||||
J.Opaque()
|
||||
I.Blend(J, ICON_SUBTRACT)
|
||||
Blend(I, ICON_OR)
|
||||
/icon/proc/MaxColors(icon)
|
||||
var/icon/I
|
||||
if(isicon(icon))
|
||||
I = new(icon)
|
||||
else
|
||||
// solid color
|
||||
I = new(src)
|
||||
I.Blend("#000000", ICON_OVERLAY)
|
||||
I.SwapColor("#000000", null)
|
||||
I.Blend(icon, ICON_OVERLAY)
|
||||
var/icon/J = new(src)
|
||||
J.Opaque()
|
||||
I.Blend(J, ICON_SUBTRACT)
|
||||
Blend(I, ICON_OR)
|
||||
|
||||
// make this icon fully opaque--transparent pixels become black
|
||||
proc/Opaque(background = "#000000")
|
||||
SwapColor(null, background)
|
||||
MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,0, 0,0,0,1)
|
||||
/icon/proc/Opaque(background = "#000000")
|
||||
SwapColor(null, background)
|
||||
MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,0, 0,0,0,1)
|
||||
|
||||
// Change a grayscale icon into a white icon where the original color becomes the alpha
|
||||
// I.e., black -> transparent, gray -> translucent white, white -> solid white
|
||||
proc/BecomeAlphaMask()
|
||||
SwapColor(null, "#000000ff") // don't let transparent become gray
|
||||
MapColors(0,0,0,0.3, 0,0,0,0.59, 0,0,0,0.11, 0,0,0,0, 1,1,1,0)
|
||||
/icon/proc/BecomeAlphaMask()
|
||||
SwapColor(null, "#000000ff") // don't let transparent become gray
|
||||
MapColors(0,0,0,0.3, 0,0,0,0.59, 0,0,0,0.11, 0,0,0,0, 1,1,1,0)
|
||||
|
||||
proc/UseAlphaMask(mask)
|
||||
Opaque()
|
||||
AddAlphaMask(mask)
|
||||
/icon/proc/UseAlphaMask(mask)
|
||||
Opaque()
|
||||
AddAlphaMask(mask)
|
||||
|
||||
proc/AddAlphaMask(mask)
|
||||
/icon/proc/AddAlphaMask(mask)
|
||||
var/icon/M = new(mask)
|
||||
M.Blend("#ffffff", ICON_SUBTRACT)
|
||||
// apply mask
|
||||
@@ -317,7 +316,7 @@ icon
|
||||
Higher value means brighter color
|
||||
*/
|
||||
|
||||
proc/ReadRGB(rgb)
|
||||
/proc/ReadRGB(rgb)
|
||||
if(!rgb) return
|
||||
|
||||
// interpret the HSV or HSVA value
|
||||
@@ -367,7 +366,7 @@ proc/ReadRGB(rgb)
|
||||
. = list(r, g, b)
|
||||
if(usealpha) . += alpha
|
||||
|
||||
proc/ReadHSV(hsv)
|
||||
/proc/ReadHSV(hsv)
|
||||
if(!hsv) return
|
||||
|
||||
// interpret the HSV or HSVA value
|
||||
@@ -406,7 +405,7 @@ proc/ReadHSV(hsv)
|
||||
. = list(hue, sat, val)
|
||||
if(usealpha) . += alpha
|
||||
|
||||
proc/HSVtoRGB(hsv)
|
||||
/proc/HSVtoRGB(hsv)
|
||||
if(!hsv) return "#000000"
|
||||
var/list/HSV = ReadHSV(hsv)
|
||||
if(!HSV) return "#000000"
|
||||
@@ -434,7 +433,7 @@ proc/HSVtoRGB(hsv)
|
||||
|
||||
return (HSV.len > 3) ? rgb(r,g,b,HSV[4]) : rgb(r,g,b)
|
||||
|
||||
proc/RGBtoHSV(rgb)
|
||||
/proc/RGBtoHSV(rgb)
|
||||
if(!rgb) return "#0000000"
|
||||
var/list/RGB = ReadRGB(rgb)
|
||||
if(!RGB) return "#0000000"
|
||||
@@ -465,7 +464,7 @@ proc/RGBtoHSV(rgb)
|
||||
|
||||
return hsv(hue, sat, val, (RGB.len>3 ? RGB[4] : null))
|
||||
|
||||
proc/hsv(hue, sat, val, alpha)
|
||||
/proc/hsv(hue, sat, val, alpha)
|
||||
if(hue < 0 || hue >= 1536) hue %= 1536
|
||||
if(hue < 0) hue += 1536
|
||||
if((hue & 0xFF) == 0xFF)
|
||||
@@ -498,7 +497,7 @@ proc/hsv(hue, sat, val, alpha)
|
||||
|
||||
amount<0 or amount>1 are allowed
|
||||
*/
|
||||
proc/BlendHSV(hsv1, hsv2, amount)
|
||||
/proc/BlendHSV(hsv1, hsv2, amount)
|
||||
var/list/HSV1 = ReadHSV(hsv1)
|
||||
var/list/HSV2 = ReadHSV(hsv2)
|
||||
|
||||
@@ -552,7 +551,7 @@ proc/BlendHSV(hsv1, hsv2, amount)
|
||||
|
||||
amount<0 or amount>1 are allowed
|
||||
*/
|
||||
proc/BlendRGB(rgb1, rgb2, amount)
|
||||
/proc/BlendRGB(rgb1, rgb2, amount)
|
||||
var/list/RGB1 = ReadRGB(rgb1)
|
||||
var/list/RGB2 = ReadRGB(rgb2)
|
||||
|
||||
@@ -568,10 +567,10 @@ proc/BlendRGB(rgb1, rgb2, amount)
|
||||
|
||||
return isnull(alpha) ? rgb(r, g, b) : rgb(r, g, b, alpha)
|
||||
|
||||
proc/BlendRGBasHSV(rgb1, rgb2, amount)
|
||||
/proc/BlendRGBasHSV(rgb1, rgb2, amount)
|
||||
return HSVtoRGB(RGBtoHSV(rgb1), RGBtoHSV(rgb2), amount)
|
||||
|
||||
proc/HueToAngle(hue)
|
||||
/proc/HueToAngle(hue)
|
||||
// normalize hsv in case anything is screwy
|
||||
if(hue < 0 || hue >= 1536) hue %= 1536
|
||||
if(hue < 0) hue += 1536
|
||||
@@ -579,7 +578,7 @@ proc/HueToAngle(hue)
|
||||
hue -= hue >> 8
|
||||
return hue / (1530/360)
|
||||
|
||||
proc/AngleToHue(angle)
|
||||
/proc/AngleToHue(angle)
|
||||
// normalize hsv in case anything is screwy
|
||||
if(angle < 0 || angle >= 360) angle -= 360 * round(angle / 360)
|
||||
var/hue = angle * (1530/360)
|
||||
@@ -589,7 +588,7 @@ proc/AngleToHue(angle)
|
||||
|
||||
|
||||
// positive angle rotates forward through red->green->blue
|
||||
proc/RotateHue(hsv, angle)
|
||||
/proc/RotateHue(hsv, angle)
|
||||
var/list/HSV = ReadHSV(hsv)
|
||||
|
||||
// normalize hsv in case anything is screwy
|
||||
@@ -611,13 +610,13 @@ proc/RotateHue(hsv, angle)
|
||||
return hsv(HSV[1], HSV[2], HSV[3], (HSV.len > 3 ? HSV[4] : null))
|
||||
|
||||
// Convert an rgb color to grayscale
|
||||
proc/GrayScale(rgb)
|
||||
/proc/GrayScale(rgb)
|
||||
var/list/RGB = ReadRGB(rgb)
|
||||
var/gray = RGB[1]*0.3 + RGB[2]*0.59 + RGB[3]*0.11
|
||||
return (RGB.len > 3) ? rgb(gray, gray, gray, RGB[4]) : rgb(gray, gray, gray)
|
||||
|
||||
// Change grayscale color to black->tone->white range
|
||||
proc/ColorTone(rgb, tone)
|
||||
/proc/ColorTone(rgb, tone)
|
||||
var/list/RGB = ReadRGB(rgb)
|
||||
var/list/TONE = ReadRGB(tone)
|
||||
|
||||
@@ -833,7 +832,7 @@ The _flatIcons list is a cache for generated icon files.
|
||||
composite.Blend(icon(I.icon, I.icon_state, I.dir, 1), ICON_OVERLAY)
|
||||
return composite
|
||||
|
||||
proc/adjust_brightness(var/color, var/value)
|
||||
/proc/adjust_brightness(var/color, var/value)
|
||||
if(!color) return "#FFFFFF"
|
||||
if(!value) return color
|
||||
|
||||
@@ -843,7 +842,7 @@ proc/adjust_brightness(var/color, var/value)
|
||||
RGB[3] = Clamp(RGB[3]+value,0,255)
|
||||
return rgb(RGB[1],RGB[2],RGB[3])
|
||||
|
||||
proc/sort_atoms_by_layer(var/list/atoms)
|
||||
/proc/sort_atoms_by_layer(var/list/atoms)
|
||||
// Comb sort icons based on levels
|
||||
var/list/result = atoms.Copy()
|
||||
var/gap = result.len
|
||||
@@ -891,7 +890,7 @@ proc/sort_atoms_by_layer(var/list/atoms)
|
||||
/image/proc/setDir(newdir)
|
||||
dir = newdir
|
||||
|
||||
proc/rand_hex_color()
|
||||
/proc/rand_hex_color()
|
||||
var/list/colors = list("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f")
|
||||
var/color=""
|
||||
for(var/i=0;i<6;i++)
|
||||
@@ -899,7 +898,7 @@ proc/rand_hex_color()
|
||||
return "#[color]"
|
||||
|
||||
//Imagine removing pixels from the main icon that are covered by pixels from the mask icon.
|
||||
proc/get_icon_difference(var/icon/main, var/icon/mask)
|
||||
/proc/get_icon_difference(var/icon/main, var/icon/mask)
|
||||
if(istype(main) && istype(mask))
|
||||
mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible.
|
||||
mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white.
|
||||
|
||||
@@ -191,27 +191,3 @@ var/const/tk_maxrange = 15
|
||||
overlays.Cut()
|
||||
if(focus && focus.icon && focus.icon_state)
|
||||
overlays += icon(focus.icon,focus.icon_state)
|
||||
|
||||
/*Not quite done likely needs to use something thats not get_step_to
|
||||
proc/check_path()
|
||||
var/turf/ref = get_turf(src.loc)
|
||||
var/turf/target = get_turf(focus.loc)
|
||||
if(!ref || !target) return 0
|
||||
var/distance = get_dist(ref, target)
|
||||
if(distance >= 10) return 0
|
||||
for(var/i = 1 to distance)
|
||||
ref = get_step_to(ref, target, 0)
|
||||
if(ref != target) return 0
|
||||
return 1
|
||||
*/
|
||||
|
||||
//equip_to_slot_or_del(obj/item/W, slot, del_on_fail = 1)
|
||||
/*
|
||||
if(istype(user, /mob/living/carbon))
|
||||
if(user:mutations & TK && get_dist(source, user) <= 7)
|
||||
if(user:get_active_hand()) return 0
|
||||
var/X = source:x
|
||||
var/Y = source:y
|
||||
var/Z = source:z
|
||||
|
||||
*/
|
||||
|
||||
@@ -11,7 +11,6 @@ SUBSYSTEM_DEF(atoms)
|
||||
var/old_initialized
|
||||
|
||||
var/list/late_loaders
|
||||
var/list/created_atoms
|
||||
|
||||
var/list/BadInitializeCalls = list()
|
||||
|
||||
@@ -39,13 +38,11 @@ SUBSYSTEM_DEF(atoms)
|
||||
var/count
|
||||
var/list/mapload_arg = list(TRUE)
|
||||
if(atoms)
|
||||
created_atoms = list()
|
||||
count = atoms.len
|
||||
for(var/I in atoms)
|
||||
var/atom/A = I
|
||||
if(A && !A.initialized)
|
||||
if(InitAtom(I, mapload_arg))
|
||||
atoms -= I
|
||||
InitAtom(I, mapload_arg)
|
||||
CHECK_TICK
|
||||
else
|
||||
count = 0
|
||||
@@ -78,10 +75,6 @@ SUBSYSTEM_DEF(atoms)
|
||||
log_debug(" Late initialized [late_loaders.len] atoms in [stop_watch(watch)]s")
|
||||
late_loaders.Cut()
|
||||
|
||||
if(atoms)
|
||||
. = created_atoms + atoms
|
||||
created_atoms = null
|
||||
|
||||
/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments)
|
||||
var/the_type = A.type
|
||||
if(QDELING(A))
|
||||
|
||||
@@ -8,168 +8,168 @@
|
||||
var/list/steps_desc
|
||||
var/taskpath = null // Path of job objective completed.
|
||||
|
||||
New(atom)
|
||||
..()
|
||||
holder = atom
|
||||
if(!holder) //don't want this without a holder
|
||||
spawn
|
||||
qdel(src)
|
||||
/datum/construction/New(atom)
|
||||
..()
|
||||
holder = atom
|
||||
if(!holder) //don't want this without a holder
|
||||
spawn
|
||||
qdel(src)
|
||||
set_desc(steps.len)
|
||||
return
|
||||
|
||||
/datum/construction/proc/next_step(mob/user as mob)
|
||||
steps.len--
|
||||
if(!steps.len)
|
||||
spawn_result(user)
|
||||
else
|
||||
set_desc(steps.len)
|
||||
return
|
||||
return
|
||||
|
||||
proc/next_step(mob/user as mob)
|
||||
steps.len--
|
||||
if(!steps.len)
|
||||
spawn_result(user)
|
||||
/datum/construction/proc/action(atom/used_atom,mob/user as mob)
|
||||
return
|
||||
|
||||
/datum/construction/proc/check_step(atom/used_atom,mob/user as mob) //check last step only
|
||||
var/valid_step = is_right_key(used_atom)
|
||||
if(valid_step)
|
||||
if(custom_action(valid_step, used_atom, user))
|
||||
next_step(user)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type.
|
||||
var/list/L = steps[steps.len]
|
||||
if(istype(used_atom, L["key"]))
|
||||
return steps.len
|
||||
return 0
|
||||
|
||||
/datum/construction/proc/custom_action(step, used_atom, user)
|
||||
if(istype(used_atom, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/W = used_atom
|
||||
if(W.remove_fuel(0, user))
|
||||
playsound(holder, W.usesound, 50, 1)
|
||||
else
|
||||
set_desc(steps.len)
|
||||
return
|
||||
return 0
|
||||
else if(istype(used_atom, /obj/item/wrench))
|
||||
var/obj/item/wrench/W = used_atom
|
||||
playsound(holder, W.usesound, 50, 1)
|
||||
|
||||
proc/action(atom/used_atom,mob/user as mob)
|
||||
return
|
||||
else if(istype(used_atom, /obj/item/screwdriver))
|
||||
var/obj/item/screwdriver/S = used_atom
|
||||
playsound(holder, S.usesound, 50, 1)
|
||||
|
||||
proc/check_step(atom/used_atom,mob/user as mob) //check last step only
|
||||
var/valid_step = is_right_key(used_atom)
|
||||
if(valid_step)
|
||||
if(custom_action(valid_step, used_atom, user))
|
||||
next_step(user)
|
||||
return 1
|
||||
return 0
|
||||
else if(istype(used_atom, /obj/item/wirecutters))
|
||||
var/obj/item/wirecutters/W = used_atom
|
||||
playsound(holder, W.usesound, 50, 1)
|
||||
|
||||
proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type.
|
||||
var/list/L = steps[steps.len]
|
||||
else if(istype(used_atom, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = used_atom
|
||||
if(C.amount<4)
|
||||
to_chat(user, ("<span class='warning'>There's not enough cable to finish the task.</span>"))
|
||||
return 0
|
||||
else
|
||||
C.use(4)
|
||||
playsound(holder, C.usesound, 50, 1)
|
||||
else if(istype(used_atom, /obj/item/stack))
|
||||
var/obj/item/stack/S = used_atom
|
||||
if(S.amount < 5)
|
||||
to_chat(user, ("<span class='warning'>There's not enough material in this stack.</span>"))
|
||||
return 0
|
||||
else
|
||||
S.use(5)
|
||||
return 1
|
||||
|
||||
/datum/construction/proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one.
|
||||
for(var/i=1;i<=steps.len;i++)
|
||||
var/list/L = steps[i];
|
||||
if(istype(used_atom, L["key"]))
|
||||
return steps.len
|
||||
return 0
|
||||
if(custom_action(i, used_atom, user))
|
||||
steps[i]=null;//stupid byond list from list removal...
|
||||
listclearnulls(steps);
|
||||
if(!steps.len)
|
||||
spawn_result(user)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/custom_action(step, used_atom, user)
|
||||
if(istype(used_atom, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/W = used_atom
|
||||
if(W.remove_fuel(0, user))
|
||||
playsound(holder, W.usesound, 50, 1)
|
||||
else
|
||||
|
||||
/datum/construction/proc/spawn_result(mob/user as mob)
|
||||
if(result)
|
||||
if(taskpath)
|
||||
var/datum/job_objective/task = user.mind.findJobTask(taskpath)
|
||||
if(istype(task))
|
||||
task.unit_completed()
|
||||
|
||||
new result(get_turf(holder))
|
||||
spawn()
|
||||
qdel(holder)
|
||||
return
|
||||
|
||||
/datum/construction/proc/set_desc(index as num)
|
||||
var/list/step = steps[index]
|
||||
holder.desc = step["desc"]
|
||||
return
|
||||
|
||||
/datum/construction/proc/try_consume(mob/user as mob, atom/used_atom, amount)
|
||||
if(amount > 0)
|
||||
// CABLES
|
||||
if(istype(used_atom,/obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/coil=used_atom
|
||||
if(!coil.use(amount))
|
||||
to_chat(user, "<span class='warning'>You don't have enough cable! You need at least [amount] coils.</span>")
|
||||
return 0
|
||||
else if(istype(used_atom, /obj/item/wrench))
|
||||
var/obj/item/wrench/W = used_atom
|
||||
playsound(holder, W.usesound, 50, 1)
|
||||
|
||||
else if(istype(used_atom, /obj/item/screwdriver))
|
||||
var/obj/item/screwdriver/S = used_atom
|
||||
playsound(holder, S.usesound, 50, 1)
|
||||
|
||||
else if(istype(used_atom, /obj/item/wirecutters))
|
||||
var/obj/item/wirecutters/W = used_atom
|
||||
playsound(holder, W.usesound, 50, 1)
|
||||
|
||||
else if(istype(used_atom, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = used_atom
|
||||
if(C.amount<4)
|
||||
to_chat(user, ("<span class='warning'>There's not enough cable to finish the task.</span>"))
|
||||
// WELDER
|
||||
if(istype(used_atom,/obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/welder=used_atom
|
||||
if(!welder.isOn())
|
||||
to_chat(user, "<span class='notice'>You tap the [src] with your unlit welder. [pick("Ding","Dong")].</span>")
|
||||
return 0
|
||||
else
|
||||
C.use(4)
|
||||
playsound(holder, C.usesound, 50, 1)
|
||||
else if(istype(used_atom, /obj/item/stack))
|
||||
var/obj/item/stack/S = used_atom
|
||||
if(S.amount < 5)
|
||||
to_chat(user, ("<span class='warning'>There's not enough material in this stack.</span>"))
|
||||
if(!welder.remove_fuel(amount,user))
|
||||
to_chat(user, "<span class='warning'>You don't have enough fuel!</span>")
|
||||
return 0
|
||||
else
|
||||
S.use(5)
|
||||
return 1
|
||||
|
||||
proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one.
|
||||
for(var/i=1;i<=steps.len;i++)
|
||||
var/list/L = steps[i];
|
||||
if(istype(used_atom, L["key"]))
|
||||
if(custom_action(i, used_atom, user))
|
||||
steps[i]=null;//stupid byond list from list removal...
|
||||
listclearnulls(steps);
|
||||
if(!steps.len)
|
||||
spawn_result(user)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
proc/spawn_result(mob/user as mob)
|
||||
if(result)
|
||||
if(taskpath)
|
||||
var/datum/job_objective/task = user.mind.findJobTask(taskpath)
|
||||
if(istype(task))
|
||||
task.unit_completed()
|
||||
|
||||
new result(get_turf(holder))
|
||||
spawn()
|
||||
qdel(holder)
|
||||
return
|
||||
|
||||
proc/set_desc(index as num)
|
||||
var/list/step = steps[index]
|
||||
holder.desc = step["desc"]
|
||||
return
|
||||
|
||||
proc/try_consume(mob/user as mob, atom/used_atom, amount)
|
||||
if(amount > 0)
|
||||
// CABLES
|
||||
if(istype(used_atom,/obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/coil=used_atom
|
||||
if(!coil.use(amount))
|
||||
to_chat(user, "<span class='warning'>You don't have enough cable! You need at least [amount] coils.</span>")
|
||||
return 0
|
||||
// WELDER
|
||||
if(istype(used_atom,/obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/welder=used_atom
|
||||
if(!welder.isOn())
|
||||
to_chat(user, "<span class='notice'>You tap the [src] with your unlit welder. [pick("Ding","Dong")].</span>")
|
||||
return 0
|
||||
if(!welder.remove_fuel(amount,user))
|
||||
to_chat(user, "<span class='warning'>You don't have enough fuel!</span>")
|
||||
return 0
|
||||
// STACKS
|
||||
if(istype(used_atom,/obj/item/stack))
|
||||
var/obj/item/stack/stack=used_atom
|
||||
if(stack.amount < amount)
|
||||
to_chat(user, "<span class='warning'>You don't have enough [stack]! You need at least [amount].</span>")
|
||||
return 0
|
||||
stack.use(amount)
|
||||
return 1
|
||||
// STACKS
|
||||
if(istype(used_atom,/obj/item/stack))
|
||||
var/obj/item/stack/stack=used_atom
|
||||
if(stack.amount < amount)
|
||||
to_chat(user, "<span class='warning'>You don't have enough [stack]! You need at least [amount].</span>")
|
||||
return 0
|
||||
stack.use(amount)
|
||||
return 1
|
||||
|
||||
/datum/construction/reversible
|
||||
var/index
|
||||
|
||||
New(atom)
|
||||
..()
|
||||
index = steps.len
|
||||
return
|
||||
/datum/construction/reversible/New(atom)
|
||||
..()
|
||||
index = steps.len
|
||||
return
|
||||
|
||||
proc/update_index(diff as num, mob/user as mob)
|
||||
index+=diff
|
||||
if(index==0)
|
||||
spawn_result(user)
|
||||
else
|
||||
set_desc(index)
|
||||
return
|
||||
/datum/construction/reversible/proc/update_index(diff as num, mob/user as mob)
|
||||
index+=diff
|
||||
if(index==0)
|
||||
spawn_result(user)
|
||||
else
|
||||
set_desc(index)
|
||||
return
|
||||
|
||||
is_right_key(atom/used_atom) // returns index step
|
||||
var/list/L = steps[index]
|
||||
if(istype(used_atom, L["key"]))
|
||||
return FORWARD //to the first step -> forward
|
||||
else if(L["backkey"] && istype(used_atom, L["backkey"]))
|
||||
return BACKWARD //to the last step -> backwards
|
||||
/datum/construction/reversible/is_right_key(atom/used_atom) // returns index step
|
||||
var/list/L = steps[index]
|
||||
if(istype(used_atom, L["key"]))
|
||||
return FORWARD //to the first step -> forward
|
||||
else if(L["backkey"] && istype(used_atom, L["backkey"]))
|
||||
return BACKWARD //to the last step -> backwards
|
||||
return 0
|
||||
|
||||
/datum/construction/reversible/check_step(atom/used_atom,mob/user as mob)
|
||||
var/diff = is_right_key(used_atom)
|
||||
if(diff)
|
||||
if(custom_action(index, diff, used_atom, user))
|
||||
update_index(diff, user)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/construction/reversible/custom_action(index, diff, used_atom, user)
|
||||
if(!..(index,used_atom,user))
|
||||
return 0
|
||||
|
||||
check_step(atom/used_atom,mob/user as mob)
|
||||
var/diff = is_right_key(used_atom)
|
||||
if(diff)
|
||||
if(custom_action(index, diff, used_atom, user))
|
||||
update_index(diff, user)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
custom_action(index, diff, used_atom, user)
|
||||
if(!..(index,used_atom,user))
|
||||
return 0
|
||||
return 1
|
||||
return 1
|
||||
|
||||
#define state_next "next"
|
||||
#define state_prev "prev"
|
||||
@@ -178,73 +178,74 @@
|
||||
var/index
|
||||
var/base_icon = "durand"
|
||||
|
||||
New(atom)
|
||||
..()
|
||||
index = 1
|
||||
return
|
||||
/datum/construction/reversible2/New(atom)
|
||||
..()
|
||||
index = 1
|
||||
return
|
||||
|
||||
proc/update_index(diff as num, mob/user as mob)
|
||||
index-=diff
|
||||
if(index==steps.len+1)
|
||||
spawn_result(user)
|
||||
else
|
||||
set_desc(index)
|
||||
return
|
||||
/datum/construction/reversible2/proc/update_index(diff as num, mob/user as mob)
|
||||
index-=diff
|
||||
if(index==steps.len+1)
|
||||
spawn_result(user)
|
||||
else
|
||||
set_desc(index)
|
||||
return
|
||||
|
||||
proc/update_icon()
|
||||
holder.icon_state="[base_icon]_[index]"
|
||||
/datum/construction/reversible2/proc/update_icon()
|
||||
holder.icon_state="[base_icon]_[index]"
|
||||
|
||||
is_right_key(mob/user as mob,atom/used_atom) // returns index step
|
||||
var/list/state = steps[index]
|
||||
if(state_next in state)
|
||||
var/list/step = state[state_next]
|
||||
if(istype(used_atom, step["key"]))
|
||||
//if(L["consume"] && !try_consume(used_atom,L["consume"]))
|
||||
// return 0
|
||||
return FORWARD //to the first step -> forward
|
||||
else if(state_prev in state)
|
||||
var/list/step = state[state_prev]
|
||||
if(istype(used_atom, step["key"]))
|
||||
//if(L["consume"] && !try_consume(used_atom,L["consume"]))
|
||||
// return 0
|
||||
return BACKWARD //to the first step -> forward
|
||||
/datum/construction/reversible2/is_right_key(mob/user as mob,atom/used_atom) // returns index step
|
||||
var/list/state = steps[index]
|
||||
if(state_next in state)
|
||||
var/list/step = state[state_next]
|
||||
if(istype(used_atom, step["key"]))
|
||||
//if(L["consume"] && !try_consume(used_atom,L["consume"]))
|
||||
// return 0
|
||||
return FORWARD //to the first step -> forward
|
||||
else if(state_prev in state)
|
||||
var/list/step = state[state_prev]
|
||||
if(istype(used_atom, step["key"]))
|
||||
//if(L["consume"] && !try_consume(used_atom,L["consume"]))
|
||||
// return 0
|
||||
return BACKWARD //to the first step -> forward
|
||||
return 0
|
||||
|
||||
/datum/construction/reversible2/check_step(atom/used_atom,mob/user as mob)
|
||||
var/diff = is_right_key(user,used_atom)
|
||||
if(diff)
|
||||
if(custom_action(index, diff, used_atom, user))
|
||||
update_index(diff,user)
|
||||
update_icon()
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/construction/reversible2/proc/fixText(text,user)
|
||||
text = replacetext(text,"{USER}","[user]")
|
||||
text = replacetext(text,"{HOLDER}","[holder]")
|
||||
return text
|
||||
|
||||
/datum/construction/reversible2/custom_action(index, diff, used_atom, var/mob/user)
|
||||
if(!..(index,used_atom,user))
|
||||
return 0
|
||||
|
||||
check_step(atom/used_atom,mob/user as mob)
|
||||
var/diff = is_right_key(user,used_atom)
|
||||
if(diff)
|
||||
if(custom_action(index, diff, used_atom, user))
|
||||
update_index(diff,user)
|
||||
update_icon()
|
||||
return 1
|
||||
return 0
|
||||
var/list/step = steps[index]
|
||||
var/list/state = step[diff==FORWARD ? state_next : state_prev]
|
||||
user.visible_message(fixText(state["vis_msg"],user),fixText(state["self_msg"],user))
|
||||
|
||||
proc/fixText(text,user)
|
||||
text = replacetext(text,"{USER}","[user]")
|
||||
text = replacetext(text,"{HOLDER}","[holder]")
|
||||
return text
|
||||
if("delete" in state)
|
||||
qdel(used_atom)
|
||||
else if("spawn" in state)
|
||||
var/spawntype=state["spawn"]
|
||||
var/atom/A = new spawntype(holder.loc)
|
||||
if("amount" in state)
|
||||
if(istype(A,/obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C=A
|
||||
C.amount=state["amount"]
|
||||
if(istype(A,/obj/item/stack))
|
||||
var/obj/item/stack/S=A
|
||||
S.amount=state["amount"]
|
||||
|
||||
custom_action(index, diff, used_atom, var/mob/user)
|
||||
if(!..(index,used_atom,user))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
var/list/step = steps[index]
|
||||
var/list/state = step[diff==FORWARD ? state_next : state_prev]
|
||||
user.visible_message(fixText(state["vis_msg"],user),fixText(state["self_msg"],user))
|
||||
|
||||
if("delete" in state)
|
||||
qdel(used_atom)
|
||||
else if("spawn" in state)
|
||||
var/spawntype=state["spawn"]
|
||||
var/atom/A = new spawntype(holder.loc)
|
||||
if("amount" in state)
|
||||
if(istype(A,/obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C=A
|
||||
C.amount=state["amount"]
|
||||
if(istype(A,/obj/item/stack))
|
||||
var/obj/item/stack/S=A
|
||||
S.amount=state["amount"]
|
||||
|
||||
return 1
|
||||
action(used_atom,user)
|
||||
return check_step(used_atom,user)
|
||||
/datum/construction/reversible2/action(used_atom,user)
|
||||
return check_step(used_atom,user)
|
||||
|
||||
@@ -57,98 +57,96 @@ Data storage vars:
|
||||
var/result
|
||||
var/state = 0
|
||||
|
||||
New(list/arguments=null,autostart=1)
|
||||
delay = delay>0?(delay):1
|
||||
if(forbid_garbage) //prevents garbage collection with tag != null
|
||||
tag = "\ref[src]"
|
||||
set_process_args(arguments)
|
||||
if(autostart)
|
||||
start()
|
||||
return
|
||||
/datum/global_iterator/New(list/arguments=null,autostart=1)
|
||||
delay = delay>0?(delay):1
|
||||
if(forbid_garbage) //prevents garbage collection with tag != null
|
||||
tag = "\ref[src]"
|
||||
set_process_args(arguments)
|
||||
if(autostart)
|
||||
start()
|
||||
return
|
||||
|
||||
proc/main()
|
||||
state = 1
|
||||
while(src && control_switch)
|
||||
last_exec = world.timeofday
|
||||
if(check_for_null && has_null_args())
|
||||
stop()
|
||||
/datum/global_iterator/proc/main()
|
||||
state = 1
|
||||
while(src && control_switch)
|
||||
last_exec = world.timeofday
|
||||
if(check_for_null && has_null_args())
|
||||
stop()
|
||||
return 0
|
||||
result = process(arglist(arg_list))
|
||||
for(var/sleep_time=delay;sleep_time>0;sleep_time--) //uhh, this is ugly. But I see no other way to terminate sleeping proc. Such disgrace.
|
||||
if(!control_switch)
|
||||
return 0
|
||||
result = process(arglist(arg_list))
|
||||
for(var/sleep_time=delay;sleep_time>0;sleep_time--) //uhh, this is ugly. But I see no other way to terminate sleeping proc. Such disgrace.
|
||||
if(!control_switch)
|
||||
return 0
|
||||
sleep(1)
|
||||
return 0
|
||||
|
||||
proc/start(list/arguments=null)
|
||||
if(active())
|
||||
return
|
||||
if(arguments)
|
||||
if(!set_process_args(arguments))
|
||||
return 0
|
||||
if(!state_check()) //the main loop is sleeping, wait for it to terminate.
|
||||
return
|
||||
control_switch = 1
|
||||
spawn()
|
||||
state = main()
|
||||
return 1
|
||||
|
||||
proc/stop()
|
||||
if(!active())
|
||||
return
|
||||
control_switch = 0
|
||||
spawn(-1) //report termination error but don't wait for state_check().
|
||||
state_check()
|
||||
return 1
|
||||
|
||||
proc/state_check()
|
||||
var/lag = 0
|
||||
while(state)
|
||||
sleep(1)
|
||||
if(++lag>10)
|
||||
CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. This may be caused by server lagging.")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/process()
|
||||
/datum/global_iterator/proc/start(list/arguments=null)
|
||||
if(active())
|
||||
return
|
||||
if(arguments)
|
||||
if(!set_process_args(arguments))
|
||||
return 0
|
||||
if(!state_check()) //the main loop is sleeping, wait for it to terminate.
|
||||
return
|
||||
control_switch = 1
|
||||
spawn()
|
||||
state = main()
|
||||
return 1
|
||||
|
||||
proc/active()
|
||||
return control_switch
|
||||
/datum/global_iterator/proc/stop()
|
||||
if(!active())
|
||||
return
|
||||
control_switch = 0
|
||||
spawn(-1) //report termination error but don't wait for state_check().
|
||||
state_check()
|
||||
return 1
|
||||
|
||||
proc/has_null_args()
|
||||
if(null in arg_list)
|
||||
return 1
|
||||
/datum/global_iterator/proc/state_check()
|
||||
var/lag = 0
|
||||
while(state)
|
||||
sleep(1)
|
||||
if(++lag>10)
|
||||
CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. This may be caused by server lagging.")
|
||||
return 1
|
||||
|
||||
/datum/global_iterator/proc/process()
|
||||
return
|
||||
|
||||
/datum/global_iterator/proc/active()
|
||||
return control_switch
|
||||
|
||||
/datum/global_iterator/proc/has_null_args()
|
||||
if(null in arg_list)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/datum/global_iterator/proc/set_delay(new_delay)
|
||||
if(isnum(new_delay))
|
||||
delay = max(1, round(new_delay))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/datum/global_iterator/proc/get_last_exec_time()
|
||||
return (last_exec||0)
|
||||
|
||||
proc/set_delay(new_delay)
|
||||
if(isnum(new_delay))
|
||||
delay = max(1, round(new_delay))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
/datum/global_iterator/proc/get_last_exec_time_as_text()
|
||||
return (time2text(last_exec)||"Wasn't executed yet")
|
||||
|
||||
proc/get_last_exec_time()
|
||||
return (last_exec||0)
|
||||
|
||||
proc/get_last_exec_time_as_text()
|
||||
return (time2text(last_exec)||"Wasn't executed yet")
|
||||
|
||||
proc/set_process_args(list/arguments)
|
||||
if(arguments && istype(arguments, /list) && arguments.len)
|
||||
arg_list = arguments
|
||||
return 1
|
||||
else
|
||||
/datum/global_iterator/proc/set_process_args(list/arguments)
|
||||
if(arguments && istype(arguments, /list) && arguments.len)
|
||||
arg_list = arguments
|
||||
return 1
|
||||
else
|
||||
// to_chat(world, "<span class='warning'>Invalid arguments supplied for [src.type], ref = \ref[src]</span>")
|
||||
return 0
|
||||
|
||||
proc/toggle_null_checks()
|
||||
check_for_null = !check_for_null
|
||||
return check_for_null
|
||||
|
||||
proc/toggle()
|
||||
if(!stop())
|
||||
start()
|
||||
return active()
|
||||
return 0
|
||||
|
||||
/datum/global_iterator/proc/toggle_null_checks()
|
||||
check_for_null = !check_for_null
|
||||
return check_for_null
|
||||
|
||||
/datum/global_iterator/proc/toggle()
|
||||
if(!stop())
|
||||
start()
|
||||
return active()
|
||||
|
||||
@@ -2,59 +2,59 @@
|
||||
var/href
|
||||
var/list/href_list
|
||||
|
||||
New(thref,list/thref_list)
|
||||
href = thref
|
||||
href_list = thref_list.Copy()
|
||||
return
|
||||
/datum/topic_input/New(thref,list/thref_list)
|
||||
href = thref
|
||||
href_list = thref_list.Copy()
|
||||
return
|
||||
|
||||
proc/get(i)
|
||||
return listgetindex(href_list,i)
|
||||
/datum/topic_input/proc/get(i)
|
||||
return listgetindex(href_list,i)
|
||||
|
||||
proc/getAndLocate(i)
|
||||
var/t = get(i)
|
||||
if(t)
|
||||
t = locate(t)
|
||||
return t || null
|
||||
/datum/topic_input/proc/getAndLocate(i)
|
||||
var/t = get(i)
|
||||
if(t)
|
||||
t = locate(t)
|
||||
return t || null
|
||||
|
||||
proc/getNum(i)
|
||||
var/t = get(i)
|
||||
if(t)
|
||||
t = text2num(t)
|
||||
return isnum(t) ? t : null
|
||||
/datum/topic_input/proc/getNum(i)
|
||||
var/t = get(i)
|
||||
if(t)
|
||||
t = text2num(t)
|
||||
return isnum(t) ? t : null
|
||||
|
||||
proc/getObj(i)
|
||||
var/t = getAndLocate(i)
|
||||
return isobj(t) ? t : null
|
||||
/datum/topic_input/proc/getObj(i)
|
||||
var/t = getAndLocate(i)
|
||||
return isobj(t) ? t : null
|
||||
|
||||
proc/getMob(i)
|
||||
var/t = getAndLocate(i)
|
||||
return ismob(t) ? t : null
|
||||
/datum/topic_input/proc/getMob(i)
|
||||
var/t = getAndLocate(i)
|
||||
return ismob(t) ? t : null
|
||||
|
||||
proc/getTurf(i)
|
||||
var/t = getAndLocate(i)
|
||||
return isturf(t) ? t : null
|
||||
/datum/topic_input/proc/getTurf(i)
|
||||
var/t = getAndLocate(i)
|
||||
return isturf(t) ? t : null
|
||||
|
||||
proc/getAtom(i)
|
||||
return getType(i,/atom)
|
||||
/datum/topic_input/proc/getAtom(i)
|
||||
return getType(i,/atom)
|
||||
|
||||
proc/getArea(i)
|
||||
var/t = getAndLocate(i)
|
||||
return isarea(t) ? t : null
|
||||
/datum/topic_input/proc/getArea(i)
|
||||
var/t = getAndLocate(i)
|
||||
return isarea(t) ? t : null
|
||||
|
||||
proc/getStr(i)//params should always be text, but...
|
||||
var/t = get(i)
|
||||
return istext(t) ? t : null
|
||||
/datum/topic_input/proc/getStr(i)//params should always be text, but...
|
||||
var/t = get(i)
|
||||
return istext(t) ? t : null
|
||||
|
||||
proc/getType(i,type)
|
||||
var/t = getAndLocate(i)
|
||||
return istype(t,type) ? t : null
|
||||
/datum/topic_input/proc/getType(i,type)
|
||||
var/t = getAndLocate(i)
|
||||
return istype(t,type) ? t : null
|
||||
|
||||
proc/getPath(i)
|
||||
var/t = get(i)
|
||||
if(t)
|
||||
t = text2path(t)
|
||||
return ispath(t) ? t : null
|
||||
/datum/topic_input/proc/getPath(i)
|
||||
var/t = get(i)
|
||||
if(t)
|
||||
t = text2path(t)
|
||||
return ispath(t) ? t : null
|
||||
|
||||
proc/getList(i)
|
||||
var/t = getAndLocate(i)
|
||||
return islist(t) ? t : null
|
||||
/datum/topic_input/proc/getList(i)
|
||||
var/t = getAndLocate(i)
|
||||
return islist(t) ? t : null
|
||||
|
||||
@@ -220,6 +220,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 5
|
||||
job = list("Chief Medical Officer", "Medical Doctor", "Geneticist", "Psychiatrist", "Chemist", "Paramedic", "Coroner", "Virologist")
|
||||
|
||||
//Virology
|
||||
|
||||
/datum/uplink_item/jobspecific/viral_injector
|
||||
name = "Viral Injector"
|
||||
desc = "A modified hypospray disguised as a functional pipette. The pipette can infect victims with viruses upon injection."
|
||||
reference = "VI"
|
||||
item = /obj/item/reagent_containers/dropper/precision/viral_injector
|
||||
cost = 3
|
||||
job = list("Virologist")
|
||||
|
||||
/datum/uplink_item/jobspecific/cat_grenade
|
||||
name = "Feral Cat Delivery Grenade"
|
||||
desc = "The feral cat delivery grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight."
|
||||
|
||||
@@ -1760,23 +1760,6 @@ area/security/podbay
|
||||
name = "\improper Firing Range"
|
||||
icon_state = "firingrange"
|
||||
|
||||
/*
|
||||
New()
|
||||
..()
|
||||
|
||||
spawn(10) //let objects set up first
|
||||
for(var/turf/turfToGrayscale in src)
|
||||
if(turfToGrayscale.icon)
|
||||
var/icon/newIcon = icon(turfToGrayscale.icon)
|
||||
newIcon.GrayScale()
|
||||
turfToGrayscale.icon = newIcon
|
||||
for(var/obj/objectToGrayscale in turfToGrayscale) //1 level deep, means tables, apcs, locker, etc, but not locker contents
|
||||
if(objectToGrayscale.icon)
|
||||
var/icon/newIcon = icon(objectToGrayscale.icon)
|
||||
newIcon.GrayScale()
|
||||
objectToGrayscale.icon = newIcon
|
||||
*/
|
||||
|
||||
/area/security/nuke_storage
|
||||
name = "\improper Vault"
|
||||
icon_state = "nuke_storage"
|
||||
|
||||
+1
-1
@@ -733,4 +733,4 @@ var/list/blood_splatter_icons = list()
|
||||
var/atom/L = loc
|
||||
if(!L)
|
||||
return null
|
||||
return L.AllowDrop() ? L : get_turf(L)
|
||||
return L.AllowDrop() ? L : get_turf(L)
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
|
||||
var/uplink_contents // the contents of the uplink
|
||||
|
||||
proc/assign_objectives(var/datum/mind/traitor)
|
||||
..()
|
||||
/datum/faction/syndicate/proc/assign_objectives(var/datum/mind/traitor)
|
||||
..()
|
||||
|
||||
|
||||
/* ----- Begin defining syndicate factions ------ */
|
||||
@@ -94,4 +94,4 @@
|
||||
desc = "The <b>Exolitics</b> are an ancient alien race with an energy-based anatomy. Their culture, communication, morales and knowledge is unknown. They are so radically different to humans that their \
|
||||
attempts of communication with other life forms is completely incomprehensible. Members of this alien race are capable of broadcasting subspace transmissions from their bodies. \
|
||||
The religious leaders of the Tiger Cooperative claim to have the technology to decypher and interpret their messages, which have been confirmed as religious propaganda. Their motives are unknown \
|
||||
but they are otherwise not considered much of a threat to anyone. They are virtually indestructable because of their nonphysical composition, and have the frighetning ability to make anything stop existing in a second."
|
||||
but they are otherwise not considered much of a threat to anyone. They are virtually indestructable because of their nonphysical composition, and have the frighetning ability to make anything stop existing in a second."
|
||||
|
||||
+555
-561
File diff suppressed because it is too large
Load Diff
@@ -15,165 +15,165 @@
|
||||
//Simple variable to prevent me from doing attack_hand in both this and the child computer
|
||||
var/zone = "This computer is working on a wireless range, the range is currently limited to 25 meters."
|
||||
|
||||
New()
|
||||
..()
|
||||
//So the scrubbers have time to spawn
|
||||
spawn(10)
|
||||
scanscrubbers()
|
||||
/obj/machinery/computer/area_atmos/New()
|
||||
..()
|
||||
//So the scrubbers have time to spawn
|
||||
spawn(10)
|
||||
scanscrubbers()
|
||||
|
||||
attack_ai(var/mob/user as mob)
|
||||
src.add_hiddenprint(user)
|
||||
return src.attack_hand(user)
|
||||
/obj/machinery/computer/area_atmos/attack_ai(mob/user as mob)
|
||||
src.add_hiddenprint(user)
|
||||
return src.attack_hand(user)
|
||||
|
||||
|
||||
attack_hand(var/mob/user as mob)
|
||||
if(..(user))
|
||||
return
|
||||
src.add_fingerprint(usr)
|
||||
var/dat = {"
|
||||
<html>
|
||||
<head>
|
||||
<style type="text/css">
|
||||
a.green:link
|
||||
{
|
||||
color:#00CC00;
|
||||
}
|
||||
a.green:visited
|
||||
{
|
||||
color:#00CC00;
|
||||
}
|
||||
a.green:hover
|
||||
{
|
||||
color:#00CC00;
|
||||
}
|
||||
a.green:active
|
||||
{
|
||||
color:#00CC00;
|
||||
}
|
||||
a.red:link
|
||||
{
|
||||
color:#FF0000;
|
||||
}
|
||||
a.red:visited
|
||||
{
|
||||
color:#FF0000;
|
||||
}
|
||||
a.red:hover
|
||||
{
|
||||
color:#FF0000;
|
||||
}
|
||||
a.red:active
|
||||
{
|
||||
color:#FF0000;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<center><h1>Area Air Control</h1></center>
|
||||
<font color="red">[status]</font><br>
|
||||
<a href="?src=[UID()];scan=1">Scan</a>
|
||||
<table border="1" width="90%">"}
|
||||
for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in connectedscrubbers)
|
||||
dat += {"
|
||||
<tr>
|
||||
<td>[scrubber.name]</td>
|
||||
<td width="150"><a class="green" href="?src=[UID()];scrub=\ref[scrubber];toggle=1">Turn On</a> <a class="red" href="?src=[UID()];scrub=\ref[scrubber];toggle=0">Turn Off</a></td>
|
||||
</tr>"}
|
||||
|
||||
/obj/machinery/computer/area_atmos/attack_hand(mob/user as mob)
|
||||
if(..(user))
|
||||
return
|
||||
src.add_fingerprint(usr)
|
||||
var/dat = {"
|
||||
<html>
|
||||
<head>
|
||||
<style type="text/css">
|
||||
a.green:link
|
||||
{
|
||||
color:#00CC00;
|
||||
}
|
||||
a.green:visited
|
||||
{
|
||||
color:#00CC00;
|
||||
}
|
||||
a.green:hover
|
||||
{
|
||||
color:#00CC00;
|
||||
}
|
||||
a.green:active
|
||||
{
|
||||
color:#00CC00;
|
||||
}
|
||||
a.red:link
|
||||
{
|
||||
color:#FF0000;
|
||||
}
|
||||
a.red:visited
|
||||
{
|
||||
color:#FF0000;
|
||||
}
|
||||
a.red:hover
|
||||
{
|
||||
color:#FF0000;
|
||||
}
|
||||
a.red:active
|
||||
{
|
||||
color:#FF0000;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<center><h1>Area Air Control</h1></center>
|
||||
<font color="red">[status]</font><br>
|
||||
<a href="?src=[UID()];scan=1">Scan</a>
|
||||
<table border="1" width="90%">"}
|
||||
for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in connectedscrubbers)
|
||||
dat += {"
|
||||
</table><br>
|
||||
<i>[zone]</i>
|
||||
</body>
|
||||
</html>"}
|
||||
var/datum/browser/popup = new(user, "area_atmos", name, 400, 400)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
status = ""
|
||||
<tr>
|
||||
<td>[scrubber.name]</td>
|
||||
<td width="150"><a class="green" href="?src=[UID()];scrub=\ref[scrubber];toggle=1">Turn On</a> <a class="red" href="?src=[UID()];scrub=\ref[scrubber];toggle=0">Turn Off</a></td>
|
||||
</tr>"}
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
dat += {"
|
||||
</table><br>
|
||||
<i>[zone]</i>
|
||||
</body>
|
||||
</html>"}
|
||||
var/datum/browser/popup = new(user, "area_atmos", name, 400, 400)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
status = ""
|
||||
|
||||
/obj/machinery/computer/area_atmos/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
|
||||
if(href_list["scan"])
|
||||
scanscrubbers()
|
||||
else if(href_list["toggle"])
|
||||
var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber = locate(href_list["scrub"])
|
||||
|
||||
if(!validscrubber(scrubber))
|
||||
spawn(20)
|
||||
status = "ERROR: Couldn't connect to scrubber! (timeout)"
|
||||
connectedscrubbers -= scrubber
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
scrubber.on = text2num(href_list["toggle"])
|
||||
scrubber.update_icon()
|
||||
|
||||
if(href_list["scan"])
|
||||
scanscrubbers()
|
||||
else if(href_list["toggle"])
|
||||
var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber = locate(href_list["scrub"])
|
||||
/obj/machinery/computer/area_atmos/proc/validscrubber( var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj )
|
||||
if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z)
|
||||
return 0
|
||||
|
||||
if(!validscrubber(scrubber))
|
||||
spawn(20)
|
||||
status = "ERROR: Couldn't connect to scrubber! (timeout)"
|
||||
connectedscrubbers -= scrubber
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
return 1
|
||||
|
||||
scrubber.on = text2num(href_list["toggle"])
|
||||
scrubber.update_icon()
|
||||
/obj/machinery/computer/area_atmos/proc/scanscrubbers()
|
||||
connectedscrubbers = new()
|
||||
|
||||
proc/validscrubber( var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj )
|
||||
if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z)
|
||||
return 0
|
||||
var/found = 0
|
||||
for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in range(range, src.loc))
|
||||
if(istype(scrubber))
|
||||
found = 1
|
||||
connectedscrubbers += scrubber
|
||||
|
||||
return 1
|
||||
if(!found)
|
||||
status = "ERROR: No scrubber found!"
|
||||
|
||||
proc/scanscrubbers()
|
||||
connectedscrubbers = new()
|
||||
|
||||
var/found = 0
|
||||
for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in range(range, src.loc))
|
||||
if(istype(scrubber))
|
||||
found = 1
|
||||
connectedscrubbers += scrubber
|
||||
|
||||
if(!found)
|
||||
status = "ERROR: No scrubber found!"
|
||||
|
||||
src.updateUsrDialog()
|
||||
src.updateUsrDialog()
|
||||
|
||||
|
||||
/obj/machinery/computer/area_atmos/area
|
||||
zone = "This computer is working in a wired network limited to this area."
|
||||
|
||||
validscrubber( var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj )
|
||||
if(!isobj(scrubber))
|
||||
return 0
|
||||
/obj/machinery/computer/area_atmos/area/validscrubber(obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj )
|
||||
if(!isobj(scrubber))
|
||||
return 0
|
||||
|
||||
/*
|
||||
wow this is stupid, someone help me
|
||||
*/
|
||||
var/turf/T_src = get_turf(src)
|
||||
if(!T_src.loc) return 0
|
||||
var/area/A_src = T_src.loc
|
||||
/*
|
||||
wow this is stupid, someone help me
|
||||
*/
|
||||
var/turf/T_src = get_turf(src)
|
||||
if(!T_src.loc) return 0
|
||||
var/area/A_src = T_src.loc
|
||||
|
||||
var/turf/T_scrub = get_turf(scrubber)
|
||||
if(!T_scrub.loc) return 0
|
||||
var/area/A_scrub = T_scrub.loc
|
||||
var/turf/T_scrub = get_turf(scrubber)
|
||||
if(!T_scrub.loc) return 0
|
||||
var/area/A_scrub = T_scrub.loc
|
||||
|
||||
if(A_scrub != A_src)
|
||||
return 0
|
||||
if(A_scrub != A_src)
|
||||
return 0
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
scanscrubbers()
|
||||
connectedscrubbers = new()
|
||||
/obj/machinery/computer/area_atmos/area/scanscrubbers()
|
||||
connectedscrubbers = new()
|
||||
|
||||
var/found = 0
|
||||
var/found = 0
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T.loc) return
|
||||
var/area/A = get_area(T)
|
||||
for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in world )
|
||||
var/turf/T2 = get_turf(scrubber)
|
||||
if(T2 && T2.loc)
|
||||
var/area/A2 = T2.loc
|
||||
if(istype(A2) && A2 == A )
|
||||
connectedscrubbers += scrubber
|
||||
found = 1
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T.loc) return
|
||||
var/area/A = get_area(T)
|
||||
for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in world )
|
||||
var/turf/T2 = get_turf(scrubber)
|
||||
if(T2 && T2.loc)
|
||||
var/area/A2 = T2.loc
|
||||
if(istype(A2) && A2 == A )
|
||||
connectedscrubbers += scrubber
|
||||
found = 1
|
||||
|
||||
|
||||
if(!found)
|
||||
status = "ERROR: No scrubber found!"
|
||||
if(!found)
|
||||
status = "ERROR: No scrubber found!"
|
||||
|
||||
src.updateUsrDialog()
|
||||
src.updateUsrDialog()
|
||||
|
||||
@@ -80,18 +80,18 @@ var/datum/canister_icons/canister_icon_container = new()
|
||||
var/busy = 0
|
||||
var/update_flag = 0
|
||||
|
||||
New()
|
||||
..()
|
||||
canister_color = list(
|
||||
"prim" = "yellow",
|
||||
"sec" = "none",
|
||||
"ter" = "none",
|
||||
"quart" = "none")
|
||||
oldcolor = new /list()
|
||||
decals = list("cold" = 0, "hot" = 0, "plasma" = 0)
|
||||
colorcontainer = list()
|
||||
possibledecals = list()
|
||||
update_icon()
|
||||
/obj/machinery/portable_atmospherics/canister/New()
|
||||
..()
|
||||
canister_color = list(
|
||||
"prim" = "yellow",
|
||||
"sec" = "none",
|
||||
"ter" = "none",
|
||||
"quart" = "none")
|
||||
oldcolor = new /list()
|
||||
decals = list("cold" = 0, "hot" = 0, "plasma" = 0)
|
||||
colorcontainer = list()
|
||||
possibledecals = list()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/proc/init_data_vars()
|
||||
//passed to the ui to render the color lists
|
||||
|
||||
@@ -138,7 +138,6 @@ var/syndicate_elite_shuttle_timeleft = 0
|
||||
explosion(L.loc,4,6,8,10,0)
|
||||
|
||||
sleep(40)
|
||||
// proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1)
|
||||
|
||||
|
||||
var/area/start_location = locate(/area/shuttle/syndicate_elite/mothership)
|
||||
|
||||
@@ -169,108 +169,108 @@ for reference:
|
||||
var/locked = 0.0
|
||||
// req_access = list(access_maint_tunnels)
|
||||
|
||||
New()
|
||||
..()
|
||||
/obj/machinery/deployable/barrier/New()
|
||||
..()
|
||||
|
||||
src.icon_state = "barrier[src.locked]"
|
||||
src.icon_state = "barrier[src.locked]"
|
||||
|
||||
attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/card/id))
|
||||
if(src.allowed(user))
|
||||
if(src.emagged < 2.0)
|
||||
src.locked = !src.locked
|
||||
src.anchored = !src.anchored
|
||||
src.icon_state = "barrier[src.locked]"
|
||||
if((src.locked == 1.0) && (src.emagged < 2.0))
|
||||
to_chat(user, "Barrier lock toggled on.")
|
||||
return
|
||||
else if((src.locked == 0.0) && (src.emagged < 2.0))
|
||||
to_chat(user, "Barrier lock toggled off.")
|
||||
return
|
||||
else
|
||||
do_sparks(2, 1, src)
|
||||
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
|
||||
/obj/machinery/deployable/barrier/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/card/id))
|
||||
if(src.allowed(user))
|
||||
if(src.emagged < 2.0)
|
||||
src.locked = !src.locked
|
||||
src.anchored = !src.anchored
|
||||
src.icon_state = "barrier[src.locked]"
|
||||
if((src.locked == 1.0) && (src.emagged < 2.0))
|
||||
to_chat(user, "Barrier lock toggled on.")
|
||||
return
|
||||
else if((src.locked == 0.0) && (src.emagged < 2.0))
|
||||
to_chat(user, "Barrier lock toggled off.")
|
||||
return
|
||||
else
|
||||
do_sparks(2, 1, src)
|
||||
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
|
||||
return
|
||||
return
|
||||
else if(istype(W, /obj/item/wrench))
|
||||
if(src.health < src.maxhealth)
|
||||
src.health = src.maxhealth
|
||||
src.emagged = 0
|
||||
src.req_access = list(access_security)
|
||||
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
|
||||
return
|
||||
else if(istype(W, /obj/item/wrench))
|
||||
if(src.health < src.maxhealth)
|
||||
src.health = src.maxhealth
|
||||
src.emagged = 0
|
||||
src.req_access = list(access_security)
|
||||
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
|
||||
return
|
||||
else if(src.emagged > 0)
|
||||
src.emagged = 0
|
||||
src.req_access = list(access_security)
|
||||
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
|
||||
return
|
||||
else if(src.emagged > 0)
|
||||
src.emagged = 0
|
||||
src.req_access = list(access_security)
|
||||
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
|
||||
return
|
||||
else
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
src.health -= W.force * 0.75
|
||||
if("brute")
|
||||
src.health -= W.force * 0.5
|
||||
else
|
||||
if(src.health <= 0)
|
||||
src.explode()
|
||||
..()
|
||||
|
||||
emag_act(user as mob)
|
||||
if(!emagged)
|
||||
emagged = 1
|
||||
req_access = null
|
||||
to_chat(user, "You break the ID authentication lock on the [src].")
|
||||
do_sparks(2, 1, src)
|
||||
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
|
||||
else if(src.emagged == 1)
|
||||
src.emagged = 2
|
||||
to_chat(user, "You short out the anchoring mechanism on the [src].")
|
||||
do_sparks(2, 1, src)
|
||||
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
src.explode()
|
||||
return
|
||||
if(2.0)
|
||||
src.health -= 25
|
||||
if(src.health <= 0)
|
||||
src.explode()
|
||||
return
|
||||
emp_act(severity)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if(prob(50/severity))
|
||||
locked = !locked
|
||||
anchored = !anchored
|
||||
icon_state = "barrier[src.locked]"
|
||||
|
||||
blob_act()
|
||||
src.health -= 25
|
||||
return
|
||||
else
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
src.health -= W.force * 0.75
|
||||
if("brute")
|
||||
src.health -= W.force * 0.5
|
||||
else
|
||||
if(src.health <= 0)
|
||||
src.explode()
|
||||
..()
|
||||
|
||||
/obj/machinery/deployable/barrier/emag_act(user as mob)
|
||||
if(!emagged)
|
||||
emagged = 1
|
||||
req_access = null
|
||||
to_chat(user, "You break the ID authentication lock on the [src].")
|
||||
do_sparks(2, 1, src)
|
||||
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
|
||||
else if(src.emagged == 1)
|
||||
src.emagged = 2
|
||||
to_chat(user, "You short out the anchoring mechanism on the [src].")
|
||||
do_sparks(2, 1, src)
|
||||
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
|
||||
|
||||
/obj/machinery/deployable/barrier/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
src.explode()
|
||||
return
|
||||
if(2.0)
|
||||
src.health -= 25
|
||||
if(src.health <= 0)
|
||||
src.explode()
|
||||
return
|
||||
|
||||
/obj/machinery/deployable/barrier/emp_act(severity)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if(prob(50/severity))
|
||||
locked = !locked
|
||||
anchored = !anchored
|
||||
icon_state = "barrier[src.locked]"
|
||||
|
||||
CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
|
||||
if(height==0)
|
||||
return 1
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
/obj/machinery/deployable/barrier/blob_act()
|
||||
src.health -= 25
|
||||
if(src.health <= 0)
|
||||
src.explode()
|
||||
return
|
||||
|
||||
proc/explode()
|
||||
/obj/machinery/deployable/barrier/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
|
||||
if(height==0)
|
||||
return 1
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
visible_message("<span class='danger'>[src] blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
/obj/machinery/deployable/barrier/proc/explode()
|
||||
visible_message("<span class='danger'>[src] blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
|
||||
/* var/obj/item/stack/rods/ =*/
|
||||
new /obj/item/stack/rods(Tsec)
|
||||
/* var/obj/item/stack/rods/ =*/
|
||||
new /obj/item/stack/rods(Tsec)
|
||||
|
||||
do_sparks(3, 1, src)
|
||||
do_sparks(3, 1, src)
|
||||
|
||||
explosion(src.loc,-1,-1,0)
|
||||
if(src)
|
||||
qdel(src)
|
||||
explosion(src.loc,-1,-1,0)
|
||||
if(src)
|
||||
qdel(src)
|
||||
|
||||
@@ -10,22 +10,22 @@
|
||||
var/id = null
|
||||
var/on_icon = "sign_on"
|
||||
|
||||
proc/toggle()
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
lit = !lit
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/holosign/proc/toggle()
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
lit = !lit
|
||||
update_icon()
|
||||
if(!lit)
|
||||
icon_state = "sign_off"
|
||||
else
|
||||
icon_state = on_icon
|
||||
|
||||
power_change()
|
||||
if(stat & NOPOWER)
|
||||
lit = 0
|
||||
update_icon()
|
||||
/obj/machinery/holosign/update_icon()
|
||||
if(!lit)
|
||||
icon_state = "sign_off"
|
||||
else
|
||||
icon_state = on_icon
|
||||
|
||||
/obj/machinery/holosign/power_change()
|
||||
if(stat & NOPOWER)
|
||||
lit = 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/holosign/surgery
|
||||
name = "surgery holosign"
|
||||
|
||||
+279
-299
@@ -29,169 +29,149 @@
|
||||
var/center_y = 0
|
||||
var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer
|
||||
|
||||
New()
|
||||
..()
|
||||
var/turf/T = loc
|
||||
hide(T.intact)
|
||||
center = T
|
||||
/obj/machinery/magnetic_module/New()
|
||||
..()
|
||||
var/turf/T = loc
|
||||
hide(T.intact)
|
||||
center = T
|
||||
|
||||
spawn(10) // must wait for map loading to finish
|
||||
if(radio_controller)
|
||||
radio_controller.add_object(src, freq, RADIO_MAGNETS)
|
||||
spawn(10) // must wait for map loading to finish
|
||||
if(radio_controller)
|
||||
radio_controller.add_object(src, freq, RADIO_MAGNETS)
|
||||
|
||||
spawn()
|
||||
magnetic_process()
|
||||
spawn()
|
||||
magnetic_process()
|
||||
|
||||
// update the invisibility and icon
|
||||
hide(var/intact)
|
||||
invisibility = intact ? 101 : 0
|
||||
updateicon()
|
||||
/obj/machinery/magnetic_module/hide(intact)
|
||||
invisibility = intact ? 101 : 0
|
||||
updateicon()
|
||||
|
||||
// update the icon_state
|
||||
proc/updateicon()
|
||||
var/state="floor_magnet"
|
||||
var/onstate=""
|
||||
if(!on)
|
||||
onstate="0"
|
||||
/obj/machinery/magnetic_module/proc/updateicon()
|
||||
var/state="floor_magnet"
|
||||
var/onstate=""
|
||||
if(!on)
|
||||
onstate="0"
|
||||
|
||||
if(invisibility)
|
||||
icon_state = "[state][onstate]-f" // if invisible, set icon to faded version
|
||||
// in case of being revealed by T-scanner
|
||||
else
|
||||
icon_state = "[state][onstate]"
|
||||
if(invisibility)
|
||||
icon_state = "[state][onstate]-f" // if invisible, set icon to faded version
|
||||
// in case of being revealed by T-scanner
|
||||
else
|
||||
icon_state = "[state][onstate]"
|
||||
|
||||
receive_signal(datum/signal/signal)
|
||||
|
||||
var/command = signal.data["command"]
|
||||
var/modifier = signal.data["modifier"]
|
||||
var/signal_code = signal.data["code"]
|
||||
if(command && (signal_code == code))
|
||||
|
||||
Cmd(command, modifier)
|
||||
/obj/machinery/magnetic_module/receive_signal(datum/signal/signal)
|
||||
var/command = signal.data["command"]
|
||||
var/modifier = signal.data["modifier"]
|
||||
var/signal_code = signal.data["code"]
|
||||
if(command && (signal_code == code))
|
||||
Cmd(command, modifier)
|
||||
|
||||
|
||||
|
||||
proc/Cmd(var/command, var/modifier)
|
||||
/obj/machinery/magnetic_module/proc/Cmd(var/command, var/modifier)
|
||||
if(command)
|
||||
switch(command)
|
||||
if("set-electriclevel")
|
||||
if(modifier) electricity_level = modifier
|
||||
if("set-magneticfield")
|
||||
if(modifier) magnetic_field = modifier
|
||||
|
||||
if(command)
|
||||
switch(command)
|
||||
if("set-electriclevel")
|
||||
if(modifier) electricity_level = modifier
|
||||
if("set-magneticfield")
|
||||
if(modifier) magnetic_field = modifier
|
||||
if("add-elec")
|
||||
electricity_level++
|
||||
if(electricity_level > 12)
|
||||
electricity_level = 12
|
||||
if("sub-elec")
|
||||
electricity_level--
|
||||
if(electricity_level <= 0)
|
||||
electricity_level = 1
|
||||
if("add-mag")
|
||||
magnetic_field++
|
||||
if(magnetic_field > 4)
|
||||
magnetic_field = 4
|
||||
if("sub-mag")
|
||||
magnetic_field--
|
||||
if(magnetic_field <= 0)
|
||||
magnetic_field = 1
|
||||
|
||||
if("add-elec")
|
||||
electricity_level++
|
||||
if(electricity_level > 12)
|
||||
electricity_level = 12
|
||||
if("sub-elec")
|
||||
electricity_level--
|
||||
if(electricity_level <= 0)
|
||||
electricity_level = 1
|
||||
if("add-mag")
|
||||
magnetic_field++
|
||||
if(magnetic_field > 4)
|
||||
magnetic_field = 4
|
||||
if("sub-mag")
|
||||
magnetic_field--
|
||||
if(magnetic_field <= 0)
|
||||
magnetic_field = 1
|
||||
if("set-x")
|
||||
if(modifier) center_x = modifier
|
||||
if("set-y")
|
||||
if(modifier) center_y = modifier
|
||||
|
||||
if("set-x")
|
||||
if(modifier) center_x = modifier
|
||||
if("set-y")
|
||||
if(modifier) center_y = modifier
|
||||
if("N") // NORTH
|
||||
center_y++
|
||||
if("S") // SOUTH
|
||||
center_y--
|
||||
if("E") // EAST
|
||||
center_x++
|
||||
if("W") // WEST
|
||||
center_x--
|
||||
if("C") // CENTER
|
||||
center_x = 0
|
||||
center_y = 0
|
||||
if("R") // RANDOM
|
||||
center_x = rand(-max_dist, max_dist)
|
||||
center_y = rand(-max_dist, max_dist)
|
||||
|
||||
if("N") // NORTH
|
||||
center_y++
|
||||
if("S") // SOUTH
|
||||
center_y--
|
||||
if("E") // EAST
|
||||
center_x++
|
||||
if("W") // WEST
|
||||
center_x--
|
||||
if("C") // CENTER
|
||||
center_x = 0
|
||||
center_y = 0
|
||||
if("R") // RANDOM
|
||||
center_x = rand(-max_dist, max_dist)
|
||||
center_y = rand(-max_dist, max_dist)
|
||||
if("set-code")
|
||||
if(modifier) code = modifier
|
||||
if("toggle-power")
|
||||
on = !on
|
||||
|
||||
if("set-code")
|
||||
if(modifier) code = modifier
|
||||
if("toggle-power")
|
||||
on = !on
|
||||
if(on)
|
||||
spawn()
|
||||
magnetic_process()
|
||||
|
||||
if(on)
|
||||
spawn()
|
||||
magnetic_process()
|
||||
/obj/machinery/magnetic_module/process()
|
||||
if(stat & NOPOWER)
|
||||
on = 0
|
||||
|
||||
// Sanity checks:
|
||||
if(electricity_level <= 0)
|
||||
electricity_level = 1
|
||||
if(magnetic_field <= 0)
|
||||
magnetic_field = 1
|
||||
|
||||
|
||||
// Limitations:
|
||||
if(abs(center_x) > max_dist)
|
||||
center_x = max_dist
|
||||
if(abs(center_y) > max_dist)
|
||||
center_y = max_dist
|
||||
if(magnetic_field > 4)
|
||||
magnetic_field = 4
|
||||
if(electricity_level > 12)
|
||||
electricity_level = 12
|
||||
|
||||
process()
|
||||
if(stat & NOPOWER)
|
||||
on = 0
|
||||
|
||||
// Sanity checks:
|
||||
if(electricity_level <= 0)
|
||||
electricity_level = 1
|
||||
if(magnetic_field <= 0)
|
||||
magnetic_field = 1
|
||||
|
||||
|
||||
// Limitations:
|
||||
if(abs(center_x) > max_dist)
|
||||
center_x = max_dist
|
||||
if(abs(center_y) > max_dist)
|
||||
center_y = max_dist
|
||||
if(magnetic_field > 4)
|
||||
magnetic_field = 4
|
||||
if(electricity_level > 12)
|
||||
electricity_level = 12
|
||||
|
||||
// Update power usage:
|
||||
if(on)
|
||||
use_power = ACTIVE_POWER_USE
|
||||
active_power_usage = electricity_level*15
|
||||
else
|
||||
use_power = NO_POWER_USE
|
||||
|
||||
|
||||
// Overload conditions:
|
||||
/* // Eeeehhh kinda stupid
|
||||
if(on)
|
||||
if(electricity_level > 11)
|
||||
if(prob(electricity_level))
|
||||
explosion(loc, 0, 1, 2, 3) // ooo dat shit EXPLODES son
|
||||
spawn(2)
|
||||
qdel(src)
|
||||
*/
|
||||
|
||||
// Update power usage:
|
||||
if(on)
|
||||
use_power = 2
|
||||
active_power_usage = electricity_level*15
|
||||
else
|
||||
use_power = 0
|
||||
updateicon()
|
||||
|
||||
|
||||
proc/magnetic_process() // proc that actually does the pulling
|
||||
if(pulling) return
|
||||
while(on)
|
||||
/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the pulling
|
||||
if(pulling) return
|
||||
while(on)
|
||||
|
||||
pulling = 1
|
||||
center = locate(x+center_x, y+center_y, z)
|
||||
if(center)
|
||||
for(var/obj/M in orange(magnetic_field, center))
|
||||
if(!M.anchored && (M.flags & CONDUCT))
|
||||
step_towards(M, center)
|
||||
|
||||
for(var/mob/living/silicon/S in orange(magnetic_field, center))
|
||||
if(istype(S, /mob/living/silicon/ai)) continue
|
||||
step_towards(S, center)
|
||||
|
||||
use_power(electricity_level * 5)
|
||||
sleep(13 - electricity_level)
|
||||
|
||||
pulling = 0
|
||||
pulling = 1
|
||||
center = locate(x+center_x, y+center_y, z)
|
||||
if(center)
|
||||
for(var/obj/M in orange(magnetic_field, center))
|
||||
if(!M.anchored && (M.flags & CONDUCT))
|
||||
step_towards(M, center)
|
||||
|
||||
for(var/mob/living/silicon/S in orange(magnetic_field, center))
|
||||
if(istype(S, /mob/living/silicon/ai)) continue
|
||||
step_towards(S, center)
|
||||
|
||||
use_power(electricity_level * 5)
|
||||
sleep(13 - electricity_level)
|
||||
|
||||
pulling = 0
|
||||
|
||||
/obj/machinery/magnetic_controller
|
||||
name = "Magnetic Control Console"
|
||||
@@ -218,189 +198,189 @@
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
/obj/machinery/magnetic_controller/New()
|
||||
..()
|
||||
|
||||
if(autolink)
|
||||
for(var/obj/machinery/magnetic_module/M in world)
|
||||
if(M.freq == frequency && M.code == code)
|
||||
magnets.Add(M)
|
||||
if(autolink)
|
||||
for(var/obj/machinery/magnetic_module/M in world)
|
||||
if(M.freq == frequency && M.code == code)
|
||||
magnets.Add(M)
|
||||
|
||||
|
||||
spawn(45) // must wait for map loading to finish
|
||||
if(radio_controller)
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS)
|
||||
|
||||
|
||||
if(path) // check for default path
|
||||
filter_path() // renders rpath
|
||||
|
||||
|
||||
Destroy()
|
||||
spawn(45) // must wait for map loading to finish
|
||||
if(radio_controller)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
radio_connection = null
|
||||
return ..()
|
||||
|
||||
process()
|
||||
if(magnets.len == 0 && autolink)
|
||||
for(var/obj/machinery/magnetic_module/M in world)
|
||||
if(M.freq == frequency && M.code == code)
|
||||
magnets.Add(M)
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS)
|
||||
|
||||
|
||||
attack_ai(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
if(path) // check for default path
|
||||
filter_path() // renders rpath
|
||||
|
||||
|
||||
/obj/machinery/magnetic_controller/Destroy()
|
||||
if(radio_controller)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
radio_connection = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/magnetic_controller/process()
|
||||
if(magnets.len == 0 && autolink)
|
||||
for(var/obj/machinery/magnetic_module/M in world)
|
||||
if(M.freq == frequency && M.code == code)
|
||||
magnets.Add(M)
|
||||
|
||||
|
||||
/obj/machinery/magnetic_controller/attack_ai(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/magnetic_controller/attack_hand(mob/user as mob)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<B>Magnetic Control Console</B><BR><BR>"
|
||||
if(!autolink)
|
||||
dat += {"
|
||||
Frequency: <a href='?src=[UID()];operation=setfreq'>[frequency]</a><br>
|
||||
Code: <a href='?src=[UID()];operation=setfreq'>[code]</a><br>
|
||||
<a href='?src=[UID()];operation=probe'>Probe Generators</a><br>
|
||||
"}
|
||||
|
||||
if(magnets.len >= 1)
|
||||
|
||||
dat += "Magnets confirmed: <br>"
|
||||
var/i = 0
|
||||
for(var/obj/machinery/magnetic_module/M in magnets)
|
||||
i++
|
||||
dat += " < \[[i]\] (<a href='?src=[UID()];radio-op=togglepower'>[M.on ? "On":"Off"]</a>) | Electricity level: <a href='?src=[UID()];radio-op=minuselec'>-</a> [M.electricity_level] <a href='?src=[UID()];radio-op=pluselec'>+</a>; Magnetic field: <a href='?src=[UID()];radio-op=minusmag'>-</a> [M.magnetic_field] <a href='?src=[UID()];radio-op=plusmag'>+</a><br>"
|
||||
|
||||
dat += "<br>Speed: <a href='?src=[UID()];operation=minusspeed'>-</a> [speed] <a href='?src=[UID()];operation=plusspeed'>+</a><br>"
|
||||
dat += "Path: {<a href='?src=[UID()];operation=setpath'>[path]</a>}<br>"
|
||||
dat += "Moving: <a href='?src=[UID()];operation=togglemoving'>[moving ? "Enabled":"Disabled"]</a>"
|
||||
|
||||
|
||||
user << browse(dat, "window=magnet;size=400x500")
|
||||
onclose(user, "magnet")
|
||||
|
||||
/obj/machinery/magnetic_controller/Topic(href, href_list)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
if(href_list["radio-op"])
|
||||
|
||||
// Prepare signal beforehand, because this is a radio operation
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 // radio transmission
|
||||
signal.source = src
|
||||
signal.frequency = frequency
|
||||
signal.data["code"] = code
|
||||
|
||||
// Apply any necessary commands
|
||||
switch(href_list["radio-op"])
|
||||
if("togglepower")
|
||||
signal.data["command"] = "toggle-power"
|
||||
|
||||
if("minuselec")
|
||||
signal.data["command"] = "sub-elec"
|
||||
if("pluselec")
|
||||
signal.data["command"] = "add-elec"
|
||||
|
||||
if("minusmag")
|
||||
signal.data["command"] = "sub-mag"
|
||||
if("plusmag")
|
||||
signal.data["command"] = "add-mag"
|
||||
|
||||
|
||||
// Broadcast the signal
|
||||
|
||||
radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
|
||||
|
||||
spawn(1)
|
||||
updateUsrDialog() // pretty sure this increases responsiveness
|
||||
|
||||
if(href_list["operation"])
|
||||
switch(href_list["operation"])
|
||||
if("plusspeed")
|
||||
speed++
|
||||
if(speed > 10)
|
||||
speed = 10
|
||||
if("minusspeed")
|
||||
speed --
|
||||
if(speed <= 0)
|
||||
speed = 1
|
||||
if("setpath")
|
||||
var/newpath = sanitize(copytext(input(usr, "Please define a new path!",,path) as text|null,1,MAX_MESSAGE_LEN))
|
||||
if(newpath && newpath != "")
|
||||
moving = 0 // stop moving
|
||||
path = newpath
|
||||
pathpos = 1 // reset position
|
||||
filter_path() // renders rpath
|
||||
|
||||
if("togglemoving")
|
||||
moving = !moving
|
||||
if(moving)
|
||||
spawn() MagnetMove()
|
||||
|
||||
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/magnetic_controller/proc/MagnetMove()
|
||||
if(looping) return
|
||||
|
||||
while(moving && rpath.len >= 1)
|
||||
|
||||
attack_hand(mob/user as mob)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<B>Magnetic Control Console</B><BR><BR>"
|
||||
if(!autolink)
|
||||
dat += {"
|
||||
Frequency: <a href='?src=[UID()];operation=setfreq'>[frequency]</a><br>
|
||||
Code: <a href='?src=[UID()];operation=setfreq'>[code]</a><br>
|
||||
<a href='?src=[UID()];operation=probe'>Probe Generators</a><br>
|
||||
"}
|
||||
break
|
||||
|
||||
if(magnets.len >= 1)
|
||||
looping = 1
|
||||
|
||||
dat += "Magnets confirmed: <br>"
|
||||
var/i = 0
|
||||
for(var/obj/machinery/magnetic_module/M in magnets)
|
||||
i++
|
||||
dat += " < \[[i]\] (<a href='?src=[UID()];radio-op=togglepower'>[M.on ? "On":"Off"]</a>) | Electricity level: <a href='?src=[UID()];radio-op=minuselec'>-</a> [M.electricity_level] <a href='?src=[UID()];radio-op=pluselec'>+</a>; Magnetic field: <a href='?src=[UID()];radio-op=minusmag'>-</a> [M.magnetic_field] <a href='?src=[UID()];radio-op=plusmag'>+</a><br>"
|
||||
// Prepare the radio signal
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 // radio transmission
|
||||
signal.source = src
|
||||
signal.frequency = frequency
|
||||
signal.data["code"] = code
|
||||
|
||||
dat += "<br>Speed: <a href='?src=[UID()];operation=minusspeed'>-</a> [speed] <a href='?src=[UID()];operation=plusspeed'>+</a><br>"
|
||||
dat += "Path: {<a href='?src=[UID()];operation=setpath'>[path]</a>}<br>"
|
||||
dat += "Moving: <a href='?src=[UID()];operation=togglemoving'>[moving ? "Enabled":"Disabled"]</a>"
|
||||
if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list!
|
||||
pathpos = 1
|
||||
|
||||
var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive
|
||||
|
||||
if(!(nextmove in list("N","S","E","W","C","R")))
|
||||
// N, S, E, W are directional
|
||||
// C is center
|
||||
// R is random (in magnetic field's bounds)
|
||||
qdel(signal)
|
||||
break // break the loop if the character located is invalid
|
||||
|
||||
signal.data["command"] = nextmove
|
||||
|
||||
|
||||
user << browse(dat, "window=magnet;size=400x500")
|
||||
onclose(user, "magnet")
|
||||
|
||||
Topic(href, href_list)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
if(href_list["radio-op"])
|
||||
|
||||
// Prepare signal beforehand, because this is a radio operation
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 // radio transmission
|
||||
signal.source = src
|
||||
signal.frequency = frequency
|
||||
signal.data["code"] = code
|
||||
|
||||
// Apply any necessary commands
|
||||
switch(href_list["radio-op"])
|
||||
if("togglepower")
|
||||
signal.data["command"] = "toggle-power"
|
||||
|
||||
if("minuselec")
|
||||
signal.data["command"] = "sub-elec"
|
||||
if("pluselec")
|
||||
signal.data["command"] = "add-elec"
|
||||
|
||||
if("minusmag")
|
||||
signal.data["command"] = "sub-mag"
|
||||
if("plusmag")
|
||||
signal.data["command"] = "add-mag"
|
||||
|
||||
|
||||
// Broadcast the signal
|
||||
pathpos++ // increase iterator
|
||||
|
||||
// Broadcast the signal
|
||||
spawn()
|
||||
radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
|
||||
|
||||
spawn(1)
|
||||
updateUsrDialog() // pretty sure this increases responsiveness
|
||||
if(speed == 10)
|
||||
sleep(1)
|
||||
else
|
||||
sleep(12-speed)
|
||||
|
||||
if(href_list["operation"])
|
||||
switch(href_list["operation"])
|
||||
if("plusspeed")
|
||||
speed++
|
||||
if(speed > 10)
|
||||
speed = 10
|
||||
if("minusspeed")
|
||||
speed --
|
||||
if(speed <= 0)
|
||||
speed = 1
|
||||
if("setpath")
|
||||
var/newpath = sanitize(copytext(input(usr, "Please define a new path!",,path) as text|null,1,MAX_MESSAGE_LEN))
|
||||
if(newpath && newpath != "")
|
||||
moving = 0 // stop moving
|
||||
path = newpath
|
||||
pathpos = 1 // reset position
|
||||
filter_path() // renders rpath
|
||||
|
||||
if("togglemoving")
|
||||
moving = !moving
|
||||
if(moving)
|
||||
spawn() MagnetMove()
|
||||
looping = 0
|
||||
|
||||
|
||||
updateUsrDialog()
|
||||
/obj/machinery/magnetic_controller/proc/filter_path()
|
||||
// Generates the rpath variable using the path string, think of this as "string2list"
|
||||
// Doesn't use params2list() because of the akward way it stacks entities
|
||||
rpath = list() // clear rpath
|
||||
var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length
|
||||
|
||||
proc/MagnetMove()
|
||||
if(looping) return
|
||||
for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path
|
||||
|
||||
while(moving && rpath.len >= 1)
|
||||
var/nextchar = copytext(path, i, i+1) // find next character
|
||||
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
break
|
||||
if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore
|
||||
rpath += copytext(path, i, i+1) // else, add to list
|
||||
|
||||
looping = 1
|
||||
|
||||
// Prepare the radio signal
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 // radio transmission
|
||||
signal.source = src
|
||||
signal.frequency = frequency
|
||||
signal.data["code"] = code
|
||||
|
||||
if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list!
|
||||
pathpos = 1
|
||||
|
||||
var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive
|
||||
|
||||
if(!(nextmove in list("N","S","E","W","C","R")))
|
||||
// N, S, E, W are directional
|
||||
// C is center
|
||||
// R is random (in magnetic field's bounds)
|
||||
qdel(signal)
|
||||
break // break the loop if the character located is invalid
|
||||
|
||||
signal.data["command"] = nextmove
|
||||
|
||||
|
||||
pathpos++ // increase iterator
|
||||
|
||||
// Broadcast the signal
|
||||
spawn()
|
||||
radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
|
||||
|
||||
if(speed == 10)
|
||||
sleep(1)
|
||||
else
|
||||
sleep(12-speed)
|
||||
|
||||
looping = 0
|
||||
|
||||
|
||||
proc/filter_path()
|
||||
// Generates the rpath variable using the path string, think of this as "string2list"
|
||||
// Doesn't use params2list() because of the akward way it stacks entities
|
||||
rpath = list() // clear rpath
|
||||
var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length
|
||||
|
||||
for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path
|
||||
|
||||
var/nextchar = copytext(path, i, i+1) // find next character
|
||||
|
||||
if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore
|
||||
rpath += copytext(path, i, i+1) // else, add to list
|
||||
|
||||
// there doesn't HAVE to be separators but it makes paths syntatically visible
|
||||
// there doesn't HAVE to be separators but it makes paths syntatically visible
|
||||
|
||||
@@ -361,7 +361,7 @@
|
||||
dat+= "<HEAD><TITLE>Suit storage unit: Maintenance panel</TITLE></HEAD>"
|
||||
dat+= "<B>Maintenance panel controls</B><HR>"
|
||||
dat+= "<font color ='grey'>The panel is ridden with controls, button and meters, labeled in strange signs and symbols that <BR>you cannot understand. Probably the manufactoring world's language.<BR> Among other things, a few controls catch your eye.<BR><BR>"
|
||||
dat+= text("A small dial with a arrow embroidered on it. It's pointing towards a gauge that reads [].<BR> <font color='blue'><A href='?src=[UID()];toggleUV=1'> Turn towards []</A><BR>",(uv_super ? "15nm" : "185nm"),(uv_super ? "185nm" : "15nm") )
|
||||
dat+= text("A small dial with an arrow embroidered on it. It's pointing towards a gauge that reads [].<BR> <font color='blue'><A href='?src=[UID()];toggleUV=1'> Turn towards []</A><BR>",(uv_super ? "15nm" : "185nm"),(uv_super ? "185nm" : "15nm") )
|
||||
dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.<BR><font color ='blue'><A href='?src=[UID()];togglesafeties=1'>Press button</a></font>",(safeties ? "<font color='green'><B>GREEN</B></font>" : "<font color='red'><B>RED</B></font>"))
|
||||
dat+= "<HR><BR><A href='?src=[user.UID()];mach_close=suit_storage_unit'>Close panel</A>"
|
||||
else if(uv) //The thing is running its cauterisation cycle. You have to wait.
|
||||
|
||||
@@ -17,89 +17,89 @@
|
||||
var/selfdestructing = 0
|
||||
var/charges = 1
|
||||
|
||||
attack_hand(var/mob/user as mob)
|
||||
usr.set_machine(src)
|
||||
var/dat = "<font color=#005500><i>Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...<br>Identity confirmed,<br></i></font>"
|
||||
if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
|
||||
if(is_special_character(user))
|
||||
dat += "<font color=#07700><i>Operative record found. Greetings, Agent [user.name].</i></font><br>"
|
||||
else if(charges < 1)
|
||||
dat += "<TT>Connection severed.</TT><BR>"
|
||||
else
|
||||
var/honorific = "Mr."
|
||||
if(user.gender == FEMALE)
|
||||
honorific = "Ms."
|
||||
dat += "<font color=red><i>Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]?</i></font><br>"
|
||||
if(!selfdestructing)
|
||||
dat += "<br><br><A href='?src=[UID()];betraitor=1;traitormob=\ref[user]'>\"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\"</A><BR>"
|
||||
dat += temptext
|
||||
user << browse(dat, "window=syndbeacon")
|
||||
onclose(user, "syndbeacon")
|
||||
/obj/machinery/syndicate_beacon/attack_hand(var/mob/user as mob)
|
||||
usr.set_machine(src)
|
||||
var/dat = "<font color=#005500><i>Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...<br>Identity confirmed,<br></i></font>"
|
||||
if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
|
||||
if(is_special_character(user))
|
||||
dat += "<font color=#07700><i>Operative record found. Greetings, Agent [user.name].</i></font><br>"
|
||||
else if(charges < 1)
|
||||
dat += "<TT>Connection severed.</TT><BR>"
|
||||
else
|
||||
var/honorific = "Mr."
|
||||
if(user.gender == FEMALE)
|
||||
honorific = "Ms."
|
||||
dat += "<font color=red><i>Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]?</i></font><br>"
|
||||
if(!selfdestructing)
|
||||
dat += "<br><br><A href='?src=[UID()];betraitor=1;traitormob=\ref[user]'>\"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\"</A><BR>"
|
||||
dat += temptext
|
||||
user << browse(dat, "window=syndbeacon")
|
||||
onclose(user, "syndbeacon")
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["betraitor"])
|
||||
if(charges < 1)
|
||||
/obj/machinery/syndicate_beacon/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["betraitor"])
|
||||
if(charges < 1)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
var/mob/M = locate(href_list["traitormob"])
|
||||
if(M.mind.special_role)
|
||||
temptext = "<i>We have no need for you at this time. Have a pleasant day.</i><br>"
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
charges -= 1
|
||||
switch(rand(1,2))
|
||||
if(1)
|
||||
temptext = "<font color=red><i><b>Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind.</b></i></font>"
|
||||
src.updateUsrDialog()
|
||||
spawn(rand(50,200)) selfdestruct()
|
||||
return
|
||||
var/mob/M = locate(href_list["traitormob"])
|
||||
if(M.mind.special_role)
|
||||
temptext = "<i>We have no need for you at this time. Have a pleasant day.</i><br>"
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
charges -= 1
|
||||
switch(rand(1,2))
|
||||
if(1)
|
||||
temptext = "<font color=red><i><b>Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind.</b></i></font>"
|
||||
src.updateUsrDialog()
|
||||
spawn(rand(50,200)) selfdestruct()
|
||||
return
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/N = M
|
||||
ticker.mode.equip_traitor(N)
|
||||
ticker.mode.traitors += N.mind
|
||||
N.mind.special_role = SPECIAL_ROLE_TRAITOR
|
||||
var/objective = "Free Objective"
|
||||
switch(rand(1,100))
|
||||
if(1 to 50)
|
||||
objective = "Steal [pick("a hand teleporter", "the Captain's antique laser gun", "a jetpack", "the Captain's ID", "the Captain's jumpsuit")]."
|
||||
if(51 to 60)
|
||||
objective = "Destroy 70% or more of the station's plasma tanks."
|
||||
if(61 to 70)
|
||||
objective = "Cut power to 80% or more of the station's tiles."
|
||||
if(71 to 80)
|
||||
objective = "Destroy the AI."
|
||||
if(81 to 90)
|
||||
objective = "Kill all monkeys aboard the station."
|
||||
else
|
||||
objective = "Make certain at least 80% of the station evacuates on the shuttle."
|
||||
var/datum/objective/custom_objective = new(objective)
|
||||
custom_objective.owner = N.mind
|
||||
N.mind.objectives += custom_objective
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/N = M
|
||||
ticker.mode.equip_traitor(N)
|
||||
ticker.mode.traitors += N.mind
|
||||
N.mind.special_role = SPECIAL_ROLE_TRAITOR
|
||||
var/objective = "Free Objective"
|
||||
switch(rand(1,100))
|
||||
if(1 to 50)
|
||||
objective = "Steal [pick("a hand teleporter", "the Captain's antique laser gun", "a jetpack", "the Captain's ID", "the Captain's jumpsuit")]."
|
||||
if(51 to 60)
|
||||
objective = "Destroy 70% or more of the station's plasma tanks."
|
||||
if(61 to 70)
|
||||
objective = "Cut power to 80% or more of the station's tiles."
|
||||
if(71 to 80)
|
||||
objective = "Destroy the AI."
|
||||
if(81 to 90)
|
||||
objective = "Kill all monkeys aboard the station."
|
||||
else
|
||||
objective = "Make certain at least 80% of the station evacuates on the shuttle."
|
||||
var/datum/objective/custom_objective = new(objective)
|
||||
custom_objective.owner = N.mind
|
||||
N.mind.objectives += custom_objective
|
||||
|
||||
var/datum/objective/escape/escape_objective = new
|
||||
escape_objective.owner = N.mind
|
||||
N.mind.objectives += escape_objective
|
||||
var/datum/objective/escape/escape_objective = new
|
||||
escape_objective.owner = N.mind
|
||||
N.mind.objectives += escape_objective
|
||||
|
||||
|
||||
to_chat(M, "<B>You have joined the ranks of the Syndicate and become a traitor to the station!</B>")
|
||||
to_chat(M, "<B>You have joined the ranks of the Syndicate and become a traitor to the station!</B>")
|
||||
|
||||
message_admins("[key_name_admin(N)] has accepted a traitor objective from a syndicate beacon.")
|
||||
message_admins("[key_name_admin(N)] has accepted a traitor objective from a syndicate beacon.")
|
||||
|
||||
var/obj_count = 1
|
||||
for(var/datum/objective/OBJ in M.mind.objectives)
|
||||
to_chat(M, "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]")
|
||||
obj_count++
|
||||
var/obj_count = 1
|
||||
for(var/datum/objective/OBJ in M.mind.objectives)
|
||||
to_chat(M, "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]")
|
||||
obj_count++
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
|
||||
proc/selfdestruct()
|
||||
selfdestructing = 1
|
||||
spawn() explosion(src.loc, rand(3,8), rand(1,3), 1, 10)
|
||||
/obj/machinery/syndicate_beacon/proc/selfdestruct()
|
||||
selfdestructing = 1
|
||||
spawn() explosion(src.loc, rand(3,8), rand(1,3), 1, 10)
|
||||
|
||||
|
||||
|
||||
@@ -196,4 +196,4 @@
|
||||
|
||||
/obj/machinery/power/singularity_beacon/syndicate
|
||||
icontype = "beaconsynd"
|
||||
icon_state = "beaconsynd0"
|
||||
icon_state = "beaconsynd0"
|
||||
|
||||
@@ -75,10 +75,10 @@
|
||||
freq_listening = list(AI_FREQ, COMM_FREQ, ENG_FREQ, SEC_FREQ)
|
||||
|
||||
//Common and other radio frequencies for people to freely use
|
||||
New()
|
||||
for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
|
||||
freq_listening |= i
|
||||
..()
|
||||
/obj/machinery/telecomms/receiver/preset_right/New()
|
||||
for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
|
||||
freq_listening |= i
|
||||
..()
|
||||
|
||||
/obj/machinery/telecomms/receiver/preset_cent
|
||||
id = "CentComm Receiver"
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
/obj/item/mecha_parts/chassis/ripley
|
||||
name = "Ripley Chassis"
|
||||
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/ripley_chassis(src)
|
||||
/obj/item/mecha_parts/chassis/ripley/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/ripley_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/part/ripley_torso
|
||||
name="Ripley Torso"
|
||||
@@ -68,9 +68,9 @@
|
||||
/obj/item/mecha_parts/chassis/gygax
|
||||
name = "Gygax Chassis"
|
||||
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/gygax_chassis(src)
|
||||
/obj/item/mecha_parts/chassis/gygax/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/gygax_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/part/gygax_torso
|
||||
name="Gygax Torso"
|
||||
@@ -117,9 +117,9 @@
|
||||
/obj/item/mecha_parts/chassis/durand
|
||||
name = "Durand Chassis"
|
||||
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/durand_chassis(src)
|
||||
/obj/item/mecha_parts/chassis/durand/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/durand_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/part/durand_torso
|
||||
name="Durand Torso"
|
||||
@@ -163,39 +163,18 @@
|
||||
/obj/item/mecha_parts/chassis/firefighter
|
||||
name = "Firefighter Chassis"
|
||||
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/firefighter_chassis(src)
|
||||
/*
|
||||
/obj/item/mecha_parts/part/firefighter_torso
|
||||
name="Ripley-on-Fire Torso"
|
||||
icon_state = "ripley_harness"
|
||||
|
||||
/obj/item/mecha_parts/part/firefighter_left_arm
|
||||
name="Ripley-on-Fire Left Arm"
|
||||
icon_state = "ripley_l_arm"
|
||||
|
||||
/obj/item/mecha_parts/part/firefighter_right_arm
|
||||
name="Ripley-on-Fire Right Arm"
|
||||
icon_state = "ripley_r_arm"
|
||||
|
||||
/obj/item/mecha_parts/part/firefighter_left_leg
|
||||
name="Ripley-on-Fire Left Leg"
|
||||
icon_state = "ripley_l_leg"
|
||||
|
||||
/obj/item/mecha_parts/part/firefighter_right_leg
|
||||
name="Ripley-on-Fire Right Leg"
|
||||
icon_state = "ripley_r_leg"
|
||||
*/
|
||||
/obj/item/mecha_parts/chassis/firefighter/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/firefighter_chassis(src)
|
||||
|
||||
////////// HONK
|
||||
|
||||
/obj/item/mecha_parts/chassis/honker
|
||||
name = "H.O.N.K Chassis"
|
||||
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/honker_chassis(src)
|
||||
/obj/item/mecha_parts/chassis/honker/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/honker_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/part/honker_torso
|
||||
name="H.O.N.K Torso"
|
||||
@@ -275,9 +254,9 @@
|
||||
/obj/item/mecha_parts/chassis/phazon
|
||||
name = "Phazon Chassis"
|
||||
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/phazon_chassis(src)
|
||||
/obj/item/mecha_parts/chassis/phazon/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/phazon_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/part/phazon_torso
|
||||
name="Phazon Torso"
|
||||
@@ -319,9 +298,9 @@
|
||||
/obj/item/mecha_parts/chassis/odysseus
|
||||
name = "Odysseus Chassis"
|
||||
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/odysseus_chassis(src)
|
||||
/obj/item/mecha_parts/chassis/odysseus/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/odysseus_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_head
|
||||
name="Odysseus Head"
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
var/list/crowbar_salvage
|
||||
var/salvage_num = 5
|
||||
|
||||
New()
|
||||
..()
|
||||
crowbar_salvage = new
|
||||
return
|
||||
/obj/effect/decal/mecha_wreckage/New()
|
||||
..()
|
||||
crowbar_salvage = new
|
||||
return
|
||||
|
||||
/obj/effect/decal/mecha_wreckage/ex_act(severity)
|
||||
if(severity < 2)
|
||||
@@ -86,20 +86,20 @@
|
||||
name = "Gygax wreckage"
|
||||
icon_state = "gygax-broken"
|
||||
|
||||
New()
|
||||
..()
|
||||
var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso,
|
||||
/obj/item/mecha_parts/part/gygax_head,
|
||||
/obj/item/mecha_parts/part/gygax_left_arm,
|
||||
/obj/item/mecha_parts/part/gygax_right_arm,
|
||||
/obj/item/mecha_parts/part/gygax_left_leg,
|
||||
/obj/item/mecha_parts/part/gygax_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
/obj/effect/decal/mecha_wreckage/gygax/New()
|
||||
..()
|
||||
var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso,
|
||||
/obj/item/mecha_parts/part/gygax_head,
|
||||
/obj/item/mecha_parts/part/gygax_left_arm,
|
||||
/obj/item/mecha_parts/part/gygax_right_arm,
|
||||
/obj/item/mecha_parts/part/gygax_left_leg,
|
||||
/obj/item/mecha_parts/part/gygax_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
|
||||
/obj/effect/decal/mecha_wreckage/gygax/dark
|
||||
name = "Dark Gygax wreckage"
|
||||
@@ -126,38 +126,38 @@
|
||||
name = "Ripley wreckage"
|
||||
icon_state = "ripley-broken"
|
||||
|
||||
New()
|
||||
..()
|
||||
var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
|
||||
/obj/item/mecha_parts/part/ripley_left_arm,
|
||||
/obj/item/mecha_parts/part/ripley_right_arm,
|
||||
/obj/item/mecha_parts/part/ripley_left_leg,
|
||||
/obj/item/mecha_parts/part/ripley_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
/obj/effect/decal/mecha_wreckage/ripley/New()
|
||||
..()
|
||||
var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
|
||||
/obj/item/mecha_parts/part/ripley_left_arm,
|
||||
/obj/item/mecha_parts/part/ripley_right_arm,
|
||||
/obj/item/mecha_parts/part/ripley_left_leg,
|
||||
/obj/item/mecha_parts/part/ripley_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
|
||||
/obj/effect/decal/mecha_wreckage/ripley/firefighter
|
||||
name = "Firefighter wreckage"
|
||||
icon_state = "firefighter-broken"
|
||||
|
||||
New()
|
||||
..()
|
||||
var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
|
||||
/obj/item/mecha_parts/part/ripley_left_arm,
|
||||
/obj/item/mecha_parts/part/ripley_right_arm,
|
||||
/obj/item/mecha_parts/part/ripley_left_leg,
|
||||
/obj/item/mecha_parts/part/ripley_right_leg,
|
||||
/obj/item/clothing/suit/fire)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
/obj/effect/decal/mecha_wreckage/ripley/firefighter/New()
|
||||
..()
|
||||
var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
|
||||
/obj/item/mecha_parts/part/ripley_left_arm,
|
||||
/obj/item/mecha_parts/part/ripley_right_arm,
|
||||
/obj/item/mecha_parts/part/ripley_left_leg,
|
||||
/obj/item/mecha_parts/part/ripley_right_leg,
|
||||
/obj/item/clothing/suit/fire)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
|
||||
/obj/effect/decal/mecha_wreckage/ripley/deathripley
|
||||
name = "Death-Ripley wreckage"
|
||||
@@ -167,42 +167,42 @@
|
||||
name = "Honker wreckage"
|
||||
icon_state = "honker-broken"
|
||||
|
||||
New()
|
||||
..()
|
||||
var/list/parts = list(
|
||||
/obj/item/mecha_parts/chassis/honker,
|
||||
/obj/item/mecha_parts/part/honker_torso,
|
||||
/obj/item/mecha_parts/part/honker_head,
|
||||
/obj/item/mecha_parts/part/honker_left_arm,
|
||||
/obj/item/mecha_parts/part/honker_right_arm,
|
||||
/obj/item/mecha_parts/part/honker_left_leg,
|
||||
/obj/item/mecha_parts/part/honker_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
/obj/effect/decal/mecha_wreckage/honker/New()
|
||||
..()
|
||||
var/list/parts = list(
|
||||
/obj/item/mecha_parts/chassis/honker,
|
||||
/obj/item/mecha_parts/part/honker_torso,
|
||||
/obj/item/mecha_parts/part/honker_head,
|
||||
/obj/item/mecha_parts/part/honker_left_arm,
|
||||
/obj/item/mecha_parts/part/honker_right_arm,
|
||||
/obj/item/mecha_parts/part/honker_left_leg,
|
||||
/obj/item/mecha_parts/part/honker_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
|
||||
/obj/effect/decal/mecha_wreckage/durand
|
||||
name = "Durand wreckage"
|
||||
icon_state = "durand-broken"
|
||||
|
||||
New()
|
||||
..()
|
||||
var/list/parts = list(
|
||||
/obj/item/mecha_parts/part/durand_torso,
|
||||
/obj/item/mecha_parts/part/durand_head,
|
||||
/obj/item/mecha_parts/part/durand_left_arm,
|
||||
/obj/item/mecha_parts/part/durand_right_arm,
|
||||
/obj/item/mecha_parts/part/durand_left_leg,
|
||||
/obj/item/mecha_parts/part/durand_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
/obj/effect/decal/mecha_wreckage/durand/New()
|
||||
..()
|
||||
var/list/parts = list(
|
||||
/obj/item/mecha_parts/part/durand_torso,
|
||||
/obj/item/mecha_parts/part/durand_head,
|
||||
/obj/item/mecha_parts/part/durand_left_arm,
|
||||
/obj/item/mecha_parts/part/durand_right_arm,
|
||||
/obj/item/mecha_parts/part/durand_left_leg,
|
||||
/obj/item/mecha_parts/part/durand_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/decal/mecha_wreckage/durand/old
|
||||
@@ -218,18 +218,18 @@
|
||||
name = "Odysseus wreckage"
|
||||
icon_state = "odysseus-broken"
|
||||
|
||||
New()
|
||||
..()
|
||||
var/list/parts = list(
|
||||
/obj/item/mecha_parts/part/odysseus_torso,
|
||||
/obj/item/mecha_parts/part/odysseus_head,
|
||||
/obj/item/mecha_parts/part/odysseus_left_arm,
|
||||
/obj/item/mecha_parts/part/odysseus_right_arm,
|
||||
/obj/item/mecha_parts/part/odysseus_left_leg,
|
||||
/obj/item/mecha_parts/part/odysseus_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
/obj/effect/decal/mecha_wreckage/odysseus/New()
|
||||
..()
|
||||
var/list/parts = list(
|
||||
/obj/item/mecha_parts/part/odysseus_torso,
|
||||
/obj/item/mecha_parts/part/odysseus_head,
|
||||
/obj/item/mecha_parts/part/odysseus_left_arm,
|
||||
/obj/item/mecha_parts/part/odysseus_right_arm,
|
||||
/obj/item/mecha_parts/part/odysseus_left_leg,
|
||||
/obj/item/mecha_parts/part/odysseus_right_leg)
|
||||
for(var/i=0;i<2;i++)
|
||||
if(!isemptylist(parts) && prob(40))
|
||||
var/part = pick(parts)
|
||||
welder_salvage += part
|
||||
parts -= part
|
||||
return
|
||||
|
||||
@@ -16,38 +16,38 @@
|
||||
var/list/gibamounts = list()
|
||||
var/list/gibdirections = list() //of lists
|
||||
|
||||
New(location, datum/dna/MobDNA)
|
||||
..()
|
||||
/obj/effect/gibspawner/New(location, datum/dna/MobDNA)
|
||||
..()
|
||||
|
||||
if(istype(loc,/turf)) //basically if a badmin spawns it
|
||||
Gib(loc, MobDNA)
|
||||
if(istype(loc,/turf)) //basically if a badmin spawns it
|
||||
Gib(loc, MobDNA)
|
||||
|
||||
proc/Gib(atom/location, datum/dna/MobDNA = null)
|
||||
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
|
||||
to_chat(world, "<span class='warning'>Gib list length mismatch!</span>")
|
||||
return
|
||||
/obj/effect/gibspawner/proc/Gib(atom/location, datum/dna/MobDNA = null)
|
||||
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
|
||||
to_chat(world, "<span class='warning'>Gib list length mismatch!</span>")
|
||||
return
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gib = null
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gib = null
|
||||
|
||||
if(sparks)
|
||||
do_sparks(2, 1, location)
|
||||
if(sparks)
|
||||
do_sparks(2, 1, location)
|
||||
|
||||
for(var/i = 1, i<= gibtypes.len, i++)
|
||||
if(gibamounts[i])
|
||||
for(var/j = 1, j<= gibamounts[i], j++)
|
||||
var/gibType = gibtypes[i]
|
||||
gib = new gibType(location)
|
||||
for(var/i = 1, i<= gibtypes.len, i++)
|
||||
if(gibamounts[i])
|
||||
for(var/j = 1, j<= gibamounts[i], j++)
|
||||
var/gibType = gibtypes[i]
|
||||
gib = new gibType(location)
|
||||
|
||||
|
||||
gib.blood_DNA = list()
|
||||
if(MobDNA)
|
||||
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
|
||||
else if(istype(src, /obj/effect/gibspawner/xeno))
|
||||
gib.blood_DNA["UNKNOWN DNA"] = "X*"
|
||||
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
|
||||
gib.blood_DNA["Non-human DNA"] = "A+"
|
||||
var/list/directions = gibdirections[i]
|
||||
if(directions.len)
|
||||
gib.streak(directions)
|
||||
gib.blood_DNA = list()
|
||||
if(MobDNA)
|
||||
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
|
||||
else if(istype(src, /obj/effect/gibspawner/xeno))
|
||||
gib.blood_DNA["UNKNOWN DNA"] = "X*"
|
||||
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
|
||||
gib.blood_DNA["Non-human DNA"] = "A+"
|
||||
var/list/directions = gibdirections[i]
|
||||
if(directions.len)
|
||||
gib.streak(directions)
|
||||
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
@@ -1,36 +1,35 @@
|
||||
/obj/effect/gibspawner
|
||||
generic
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
||||
gibamounts = list(2,2,1)
|
||||
/obj/effect/gibspawner/generic
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
||||
gibamounts = list(2,2,1)
|
||||
|
||||
New()
|
||||
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
|
||||
..()
|
||||
/obj/effect/gibspawner/generic/New()
|
||||
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
|
||||
..()
|
||||
|
||||
human
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
||||
gibamounts = list(1,1,1,1,1,1,1)
|
||||
/obj/effect/gibspawner/human
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
||||
gibamounts = list(1,1,1,1,1,1,1)
|
||||
|
||||
New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
/obj/effect/gibspawner/human/New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
|
||||
xeno
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up,/obj/effect/decal/cleanable/blood/gibs/xeno/down,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno/body,/obj/effect/decal/cleanable/blood/gibs/xeno/limb,/obj/effect/decal/cleanable/blood/gibs/xeno/core)
|
||||
gibamounts = list(1,1,1,1,1,1,1)
|
||||
/obj/effect/gibspawner/xeno
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up,/obj/effect/decal/cleanable/blood/gibs/xeno/down,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno/body,/obj/effect/decal/cleanable/blood/gibs/xeno/limb,/obj/effect/decal/cleanable/blood/gibs/xeno/core)
|
||||
gibamounts = list(1,1,1,1,1,1,1)
|
||||
|
||||
New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
/obj/effect/gibspawner/xeno/New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
|
||||
robot
|
||||
sparks = 1
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
|
||||
gibamounts = list(1,1,1,1,1,1)
|
||||
/obj/effect/gibspawner/robot
|
||||
sparks = 1
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
|
||||
gibamounts = list(1,1,1,1,1,1)
|
||||
|
||||
New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
/obj/effect/gibspawner/robot/New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
|
||||
@@ -17,15 +17,16 @@
|
||||
name = "body bags"
|
||||
desc = "This box contains body bags."
|
||||
icon_state = "bodybags"
|
||||
New()
|
||||
..()
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
|
||||
/obj/item/storage/box/bodybags/New()
|
||||
..()
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
|
||||
|
||||
/obj/structure/closet/body_bag
|
||||
@@ -40,47 +41,47 @@
|
||||
density = 0
|
||||
|
||||
|
||||
attackby(W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/pen))
|
||||
var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
|
||||
if(user.get_active_hand() != W)
|
||||
return
|
||||
if(!in_range(src, user) && src.loc != user)
|
||||
return
|
||||
t = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
if(t)
|
||||
src.name = "body bag - "
|
||||
src.name += t
|
||||
src.overlays += image(src.icon, "bodybag_label")
|
||||
else
|
||||
src.name = "body bag"
|
||||
//..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri
|
||||
/obj/structure/closet/body_bag/attackby(W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/pen))
|
||||
var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
|
||||
if(user.get_active_hand() != W)
|
||||
return
|
||||
else if(istype(W, /obj/item/wirecutters))
|
||||
to_chat(user, "You cut the tag off the bodybag")
|
||||
if(!in_range(src, user) && src.loc != user)
|
||||
return
|
||||
t = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
if(t)
|
||||
src.name = "body bag - "
|
||||
src.name += t
|
||||
src.overlays += image(src.icon, "bodybag_label")
|
||||
else
|
||||
src.name = "body bag"
|
||||
src.overlays.Cut()
|
||||
return
|
||||
//..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri
|
||||
return
|
||||
else if(istype(W, /obj/item/wirecutters))
|
||||
to_chat(user, "You cut the tag off the bodybag")
|
||||
src.name = "body bag"
|
||||
src.overlays.Cut()
|
||||
return
|
||||
|
||||
|
||||
close()
|
||||
if(..())
|
||||
density = 0
|
||||
return 1
|
||||
return 0
|
||||
/obj/structure/closet/body_bag/close()
|
||||
if(..())
|
||||
density = 0
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
MouseDrop(over_object, src_location, over_location)
|
||||
..()
|
||||
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
|
||||
if(!ishuman(usr)) return
|
||||
if(opened) return 0
|
||||
if(contents.len) return 0
|
||||
visible_message("[usr] folds up the [src.name]")
|
||||
new item_path(get_turf(src))
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
return
|
||||
/obj/structure/closet/body_bag/MouseDrop(over_object, src_location, over_location)
|
||||
..()
|
||||
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
|
||||
if(!ishuman(usr)) return
|
||||
if(opened) return 0
|
||||
if(contents.len) return 0
|
||||
visible_message("[usr] folds up the [src.name]")
|
||||
new item_path(get_turf(src))
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/body_bag/relaymove(mob/user as mob)
|
||||
if(user.stat)
|
||||
@@ -89,4 +90,4 @@
|
||||
// Make it possible to escape from bodybags in morgues and crematoriums
|
||||
if(loc && (isturf(loc) || istype(loc, /obj/structure/morgue) || istype(loc, /obj/structure/crematorium)))
|
||||
if(!open())
|
||||
to_chat(user, "<span class='notice'>It won't budge!</span>")
|
||||
to_chat(user, "<span class='notice'>It won't budge!</span>")
|
||||
|
||||
@@ -46,9 +46,10 @@
|
||||
return
|
||||
|
||||
/obj/item/radio/beacon/bacon //Probably a better way of doing this, I'm lazy.
|
||||
proc/digest_delay()
|
||||
|
||||
/obj/item/radio/beacon/bacon/proc/digest_delay()
|
||||
spawn(600)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
// SINGULO BEACON SPAWNER
|
||||
/obj/item/radio/beacon/syndicate
|
||||
@@ -82,4 +83,4 @@
|
||||
new /obj/machinery/syndicatebomb( user.loc )
|
||||
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -159,21 +159,21 @@
|
||||
var/b2y1 = 0
|
||||
var/b2y2 = 0
|
||||
|
||||
New(var/obj/item/target/Target, var/pixel_x = 0, var/pixel_y = 0)
|
||||
if(!Target) return
|
||||
/datum/bullethole/New(obj/item/target/Target, pixel_x = 0, pixel_y = 0)
|
||||
if(!Target) return
|
||||
|
||||
// Randomize the first box
|
||||
b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4)
|
||||
b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4)
|
||||
b1y = pixel_y
|
||||
if(prob(35))
|
||||
b1y += rand(-4,4)
|
||||
// Randomize the first box
|
||||
b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4)
|
||||
b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4)
|
||||
b1y = pixel_y
|
||||
if(prob(35))
|
||||
b1y += rand(-4,4)
|
||||
|
||||
// Randomize the second box
|
||||
b2x = pixel_x
|
||||
if(prob(35))
|
||||
b2x += rand(-4,4)
|
||||
b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4)
|
||||
b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4)
|
||||
// Randomize the second box
|
||||
b2x = pixel_x
|
||||
if(prob(35))
|
||||
b2x += rand(-4,4)
|
||||
b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4)
|
||||
b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4)
|
||||
|
||||
Target.bulletholes.Add(src)
|
||||
Target.bulletholes.Add(src)
|
||||
|
||||
@@ -10,53 +10,52 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("warned", "cautioned", "smashed")
|
||||
|
||||
proximity_sign
|
||||
var/timing = 0
|
||||
var/armed = 0
|
||||
var/timepassed = 0
|
||||
/obj/item/caution/proximity_sign
|
||||
var/timing = 0
|
||||
var/armed = 0
|
||||
var/timepassed = 0
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.mind.assigned_role != "Janitor")
|
||||
return
|
||||
if(armed)
|
||||
armed = 0
|
||||
to_chat(user, "<span class='notice'>You disarm \the [src].</span>")
|
||||
return
|
||||
timing = !timing
|
||||
if(timing)
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
armed = 0
|
||||
timepassed = 0
|
||||
to_chat(H, "<span class='notice'>You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]</span>")
|
||||
/obj/item/caution/proximity_sign/attack_self(mob/user as mob)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.mind.assigned_role != "Janitor")
|
||||
return
|
||||
if(armed)
|
||||
armed = 0
|
||||
to_chat(user, "<span class='notice'>You disarm \the [src].</span>")
|
||||
return
|
||||
timing = !timing
|
||||
if(timing)
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
armed = 0
|
||||
timepassed = 0
|
||||
to_chat(H, "<span class='notice'>You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]</span>")
|
||||
|
||||
process()
|
||||
if(!timing)
|
||||
processing_objects.Remove(src)
|
||||
timepassed++
|
||||
if(timepassed >= 15 && !armed)
|
||||
armed = 1
|
||||
timing = 0
|
||||
/obj/item/caution/proximity_sign/process()
|
||||
if(!timing)
|
||||
processing_objects.Remove(src)
|
||||
timepassed++
|
||||
if(timepassed >= 15 && !armed)
|
||||
armed = 1
|
||||
timing = 0
|
||||
|
||||
HasProximity(atom/movable/AM as mob|obj)
|
||||
if(armed)
|
||||
if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain))
|
||||
var/mob/living/carbon/C = AM
|
||||
if(C.m_intent != MOVE_INTENT_WALK)
|
||||
src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"")
|
||||
explosion(src.loc,-1,0,2)
|
||||
if(ishuman(C))
|
||||
dead_legs(C)
|
||||
if(src)
|
||||
qdel(src)
|
||||
|
||||
proc/dead_legs(mob/living/carbon/human/H as mob)
|
||||
var/obj/item/organ/external/l = H.get_organ("l_leg")
|
||||
var/obj/item/organ/external/r = H.get_organ("r_leg")
|
||||
if(l)
|
||||
l.droplimb(0, DROPLIMB_SHARP)
|
||||
if(r)
|
||||
r.droplimb(0, DROPLIMB_SHARP)
|
||||
/obj/item/caution/proximity_sign/HasProximity(atom/movable/AM as mob|obj)
|
||||
if(armed)
|
||||
if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain))
|
||||
var/mob/living/carbon/C = AM
|
||||
if(C.m_intent != MOVE_INTENT_WALK)
|
||||
src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"")
|
||||
explosion(src.loc,-1,0,2)
|
||||
if(ishuman(C))
|
||||
dead_legs(C)
|
||||
if(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/caution/proximity_sign/proc/dead_legs(mob/living/carbon/human/H as mob)
|
||||
var/obj/item/organ/external/l = H.get_organ("l_leg")
|
||||
var/obj/item/organ/external/r = H.get_organ("r_leg")
|
||||
if(l)
|
||||
l.droplimb(0, DROPLIMB_SHARP)
|
||||
if(r)
|
||||
r.droplimb(0, DROPLIMB_SHARP)
|
||||
|
||||
@@ -159,9 +159,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = HULKBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/hulkmut/New()
|
||||
block = HULKBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antihulk
|
||||
name = "DNA-Injector (Anti-Hulk)"
|
||||
@@ -169,9 +170,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = HULKBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antihulk/New()
|
||||
block = HULKBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/xraymut
|
||||
name = "DNA-Injector (Xray)"
|
||||
@@ -179,9 +181,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 8
|
||||
New()
|
||||
block = XRAYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/xraymut/New()
|
||||
block = XRAYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antixray
|
||||
name = "DNA-Injector (Anti-Xray)"
|
||||
@@ -189,10 +192,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 8
|
||||
New()
|
||||
block = XRAYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antixray/New()
|
||||
block = XRAYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/firemut
|
||||
name = "DNA-Injector (Fire)"
|
||||
@@ -200,9 +203,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 10
|
||||
New()
|
||||
block = FIREBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/firemut/New()
|
||||
block = FIREBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antifire
|
||||
name = "DNA-Injector (Anti-Fire)"
|
||||
@@ -210,9 +214,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 10
|
||||
New()
|
||||
block = FIREBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antifire/New()
|
||||
block = FIREBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/telemut
|
||||
name = "DNA-Injector (Tele.)"
|
||||
@@ -220,9 +225,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 12
|
||||
New()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/telemut/New()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/telemut/darkbundle
|
||||
name = "DNA injector"
|
||||
@@ -235,9 +241,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 12
|
||||
New()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antitele/New()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/nobreath
|
||||
name = "DNA-Injector (Breathless)"
|
||||
@@ -245,9 +252,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = BREATHLESSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/nobreath/New()
|
||||
block = BREATHLESSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antinobreath
|
||||
name = "DNA-Injector (Anti-Breathless)"
|
||||
@@ -255,9 +263,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = BREATHLESSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antinobreath/New()
|
||||
block = BREATHLESSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/remoteview
|
||||
name = "DNA-Injector (Remote View)"
|
||||
@@ -265,9 +274,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = REMOTEVIEWBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/remoteview/New()
|
||||
block = REMOTEVIEWBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiremoteview
|
||||
name = "DNA-Injector (Anti-Remote View)"
|
||||
@@ -275,9 +285,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = REMOTEVIEWBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiremoteview/New()
|
||||
block = REMOTEVIEWBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/regenerate
|
||||
name = "DNA-Injector (Regeneration)"
|
||||
@@ -285,9 +296,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = REGENERATEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/regenerate/New()
|
||||
block = REGENERATEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiregenerate
|
||||
name = "DNA-Injector (Anti-Regeneration)"
|
||||
@@ -295,9 +307,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = REGENERATEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiregenerate/New()
|
||||
block = REGENERATEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/runfast
|
||||
name = "DNA-Injector (Increase Run)"
|
||||
@@ -305,9 +318,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = INCREASERUNBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/runfast/New()
|
||||
block = INCREASERUNBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antirunfast
|
||||
name = "DNA-Injector (Anti-Increase Run)"
|
||||
@@ -315,9 +329,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = INCREASERUNBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antirunfast/New()
|
||||
block = INCREASERUNBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/morph
|
||||
name = "DNA-Injector (Morph)"
|
||||
@@ -325,9 +340,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = MORPHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/morph/New()
|
||||
block = MORPHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antimorph
|
||||
name = "DNA-Injector (Anti-Morph)"
|
||||
@@ -335,9 +351,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = MORPHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antimorph/New()
|
||||
block = MORPHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/noprints
|
||||
name = "DNA-Injector (No Prints)"
|
||||
@@ -345,9 +362,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = NOPRINTSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/noprints/New()
|
||||
block = NOPRINTSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antinoprints
|
||||
name = "DNA-Injector (Anti-No Prints)"
|
||||
@@ -355,9 +373,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = NOPRINTSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antinoprints/New()
|
||||
block = NOPRINTSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/insulation
|
||||
name = "DNA-Injector (Shock Immunity)"
|
||||
@@ -365,9 +384,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = SHOCKIMMUNITYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/insulation/New()
|
||||
block = SHOCKIMMUNITYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiinsulation
|
||||
name = "DNA-Injector (Anti-Shock Immunity)"
|
||||
@@ -375,9 +395,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = SHOCKIMMUNITYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiinsulation/New()
|
||||
block = SHOCKIMMUNITYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/midgit
|
||||
name = "DNA-Injector (Small Size)"
|
||||
@@ -385,9 +406,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = SMALLSIZEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/midgit/New()
|
||||
block = SMALLSIZEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antimidgit
|
||||
name = "DNA-Injector (Anti-Small Size)"
|
||||
@@ -395,9 +417,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = SMALLSIZEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antimidgit/New()
|
||||
block = SMALLSIZEBLOCK
|
||||
..()
|
||||
|
||||
/////////////////////////////////////
|
||||
/obj/item/dnainjector/antiglasses
|
||||
@@ -406,9 +429,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 1
|
||||
New()
|
||||
block = GLASSESBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiglasses/New()
|
||||
block = GLASSESBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/glassesmut
|
||||
name = "DNA-Injector (Glasses)"
|
||||
@@ -416,9 +440,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 1
|
||||
New()
|
||||
block = GLASSESBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/glassesmut/New()
|
||||
block = GLASSESBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/epimut
|
||||
name = "DNA-Injector (Epi.)"
|
||||
@@ -426,9 +451,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 3
|
||||
New()
|
||||
block = EPILEPSYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/epimut/New()
|
||||
block = EPILEPSYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiepi
|
||||
name = "DNA-Injector (Anti-Epi.)"
|
||||
@@ -436,9 +462,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 3
|
||||
New()
|
||||
block = EPILEPSYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiepi/New()
|
||||
block = EPILEPSYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/anticough
|
||||
name = "DNA-Injector (Anti-Cough)"
|
||||
@@ -446,9 +473,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 5
|
||||
New()
|
||||
block = COUGHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/anticough/New()
|
||||
block = COUGHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/coughmut
|
||||
name = "DNA-Injector (Cough)"
|
||||
@@ -456,9 +484,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 5
|
||||
New()
|
||||
block = COUGHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/coughmut/New()
|
||||
block = COUGHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/clumsymut
|
||||
name = "DNA-Injector (Clumsy)"
|
||||
@@ -466,9 +495,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 6
|
||||
New()
|
||||
block = CLUMSYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/clumsymut/New()
|
||||
block = CLUMSYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/anticlumsy
|
||||
name = "DNA-Injector (Anti-Clumy)"
|
||||
@@ -476,9 +506,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 6
|
||||
New()
|
||||
block = CLUMSYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/anticlumsy/New()
|
||||
block = CLUMSYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antitour
|
||||
name = "DNA-Injector (Anti-Tour.)"
|
||||
@@ -486,9 +517,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 7
|
||||
New()
|
||||
block = TWITCHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antitour/New()
|
||||
block = TWITCHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/tourmut
|
||||
name = "DNA-Injector (Tour.)"
|
||||
@@ -496,9 +528,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 7
|
||||
New()
|
||||
block = TWITCHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/tourmut/New()
|
||||
block = TWITCHBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/stuttmut
|
||||
name = "DNA-Injector (Stutt.)"
|
||||
@@ -506,9 +539,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 9
|
||||
New()
|
||||
block = NERVOUSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/stuttmut/New()
|
||||
block = NERVOUSBLOCK
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/dnainjector/antistutt
|
||||
@@ -517,9 +551,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 9
|
||||
New()
|
||||
block = NERVOUSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antistutt/New()
|
||||
block = NERVOUSBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/blindmut
|
||||
name = "DNA-Injector (Blind)"
|
||||
@@ -527,9 +562,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 11
|
||||
New()
|
||||
block = BLINDBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/blindmut/New()
|
||||
block = BLINDBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiblind
|
||||
name = "DNA-Injector (Anti-Blind)"
|
||||
@@ -537,9 +573,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 11
|
||||
New()
|
||||
block = BLINDBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antiblind/New()
|
||||
block = BLINDBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/telemut
|
||||
name = "DNA-Injector (Tele.)"
|
||||
@@ -547,9 +584,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 12
|
||||
New()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/telemut/New()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antitele
|
||||
name = "DNA-Injector (Anti-Tele.)"
|
||||
@@ -557,9 +595,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 12
|
||||
New()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antitele/New()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/deafmut
|
||||
name = "DNA-Injector (Deaf)"
|
||||
@@ -567,9 +606,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 13
|
||||
New()
|
||||
block = DEAFBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/deafmut/New()
|
||||
block = DEAFBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antideaf
|
||||
name = "DNA-Injector (Anti-Deaf)"
|
||||
@@ -577,9 +617,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 13
|
||||
New()
|
||||
block = DEAFBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antideaf/New()
|
||||
block = DEAFBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/hallucination
|
||||
name = "DNA-Injector (Halluctination)"
|
||||
@@ -587,9 +628,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
New()
|
||||
block = HALLUCINATIONBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/hallucination/New()
|
||||
block = HALLUCINATIONBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antihallucination
|
||||
name = "DNA-Injector (Anti-Hallucination)"
|
||||
@@ -597,9 +639,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
New()
|
||||
block = HALLUCINATIONBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/antihallucination/New()
|
||||
block = HALLUCINATIONBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/h2m
|
||||
name = "DNA-Injector (Human > Monkey)"
|
||||
@@ -607,9 +650,10 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 14
|
||||
New()
|
||||
block = MONKEYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/h2m/New()
|
||||
block = MONKEYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/m2h
|
||||
name = "DNA-Injector (Monkey > Human)"
|
||||
@@ -617,6 +661,7 @@
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 14
|
||||
New()
|
||||
block = MONKEYBLOCK
|
||||
..()
|
||||
|
||||
/obj/item/dnainjector/m2h/New()
|
||||
block = MONKEYBLOCK
|
||||
..()
|
||||
|
||||
@@ -6,52 +6,52 @@
|
||||
icon_state = "lepopen"
|
||||
var/used = null
|
||||
|
||||
/obj/item/dnascrambler/update_icon()
|
||||
if(used)
|
||||
icon_state = "lepopen0"
|
||||
else
|
||||
icon_state = "lepopen"
|
||||
|
||||
/obj/item/dnascrambler/attack(mob/M as mob, mob/user as mob)
|
||||
if(!M || !user)
|
||||
return
|
||||
|
||||
if(!ishuman(M) || !ishuman(user))
|
||||
return
|
||||
|
||||
if(used)
|
||||
return
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(NO_DNA in H.dna.species.species_traits)
|
||||
to_chat(user, "<span class='warning'>You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.</span>")
|
||||
return
|
||||
|
||||
if(M == user)
|
||||
user.visible_message("<span class='danger'>[user] injects [user.p_them()]self with [src]!</span>")
|
||||
injected(user, user)
|
||||
else
|
||||
user.visible_message("<span class='danger'>[user] is trying to inject [M] with [src]!</span>")
|
||||
if(do_mob(user,M,30))
|
||||
user.visible_message("<span class='danger'>[user] injects [M] with [src].</span>")
|
||||
injected(M, user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You failed to inject [M].</span>")
|
||||
|
||||
/obj/item/dnascrambler/proc/injected(var/mob/living/carbon/human/target, var/mob/living/carbon/user)
|
||||
if(istype(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
scramble(1, H, 100)
|
||||
H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
|
||||
H.sync_organ_dna(assimilate = 1)
|
||||
H.update_body(0)
|
||||
H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
|
||||
H.reset_markings() //...Or markings.
|
||||
H.dna.ResetUIFrom(H)
|
||||
target.update_icons()
|
||||
|
||||
add_attack_logs(user, target, "injected with [src]")
|
||||
used = 1
|
||||
update_icon()
|
||||
if(used)
|
||||
icon_state = "lepopen0"
|
||||
else
|
||||
icon_state = "lepopen"
|
||||
|
||||
attack(mob/M as mob, mob/user as mob)
|
||||
if(!M || !user)
|
||||
return
|
||||
|
||||
if(!ishuman(M) || !ishuman(user))
|
||||
return
|
||||
|
||||
if(used)
|
||||
return
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(NO_DNA in H.dna.species.species_traits)
|
||||
to_chat(user, "<span class='warning'>You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.</span>")
|
||||
return
|
||||
|
||||
if(M == user)
|
||||
user.visible_message("<span class='danger'>[user] injects [user.p_them()]self with [src]!</span>")
|
||||
injected(user, user)
|
||||
else
|
||||
user.visible_message("<span class='danger'>[user] is trying to inject [M] with [src]!</span>")
|
||||
if(do_mob(user,M,30))
|
||||
user.visible_message("<span class='danger'>[user] injects [M] with [src].</span>")
|
||||
injected(M, user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You failed to inject [M].</span>")
|
||||
|
||||
proc/injected(var/mob/living/carbon/human/target, var/mob/living/carbon/user)
|
||||
if(istype(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
scramble(1, H, 100)
|
||||
H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
|
||||
H.sync_organ_dna(assimilate = 1)
|
||||
H.update_body(0)
|
||||
H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
|
||||
H.reset_markings() //...Or markings.
|
||||
H.dna.ResetUIFrom(H)
|
||||
target.update_icons()
|
||||
|
||||
add_attack_logs(user, target, "injected with [src]")
|
||||
used = 1
|
||||
update_icon()
|
||||
name = "used " + name
|
||||
name = "used " + name
|
||||
|
||||
@@ -432,18 +432,18 @@
|
||||
desc = "Used for emergency sealing of air breaches."
|
||||
stage = READY
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
/obj/item/grenade/chem_grenade/metalfoam/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("aluminum", 30)
|
||||
B2.reagents.add_reagent("fluorosurfactant", 10)
|
||||
B2.reagents.add_reagent("sacid", 10)
|
||||
B1.reagents.add_reagent("aluminum", 30)
|
||||
B2.reagents.add_reagent("fluorosurfactant", 10)
|
||||
B2.reagents.add_reagent("sacid", 10)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/grenade/chem_grenade/incendiary
|
||||
@@ -451,19 +451,19 @@
|
||||
desc = "Used for clearing rooms of living things."
|
||||
stage = READY
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
/obj/item/grenade/chem_grenade/incendiary/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("plasma", 25)
|
||||
B2.reagents.add_reagent("sacid", 25)
|
||||
B1.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("plasma", 25)
|
||||
B2.reagents.add_reagent("sacid", 25)
|
||||
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/grenade/chem_grenade/antiweed
|
||||
@@ -471,20 +471,20 @@
|
||||
desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents."
|
||||
stage = READY
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
/obj/item/grenade/chem_grenade/antiweed/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("atrazine", 30)
|
||||
B1.reagents.add_reagent("potassium", 20)
|
||||
B2.reagents.add_reagent("phosphorus", 20)
|
||||
B2.reagents.add_reagent("sugar", 20)
|
||||
B2.reagents.add_reagent("atrazine", 10)
|
||||
B1.reagents.add_reagent("atrazine", 30)
|
||||
B1.reagents.add_reagent("potassium", 20)
|
||||
B2.reagents.add_reagent("phosphorus", 20)
|
||||
B2.reagents.add_reagent("sugar", 20)
|
||||
B2.reagents.add_reagent("atrazine", 10)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/grenade/chem_grenade/cleaner
|
||||
@@ -492,18 +492,18 @@
|
||||
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
|
||||
stage = READY
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
/obj/item/grenade/chem_grenade/cleaner/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("fluorosurfactant", 40)
|
||||
B2.reagents.add_reagent("cleaner", 10)
|
||||
B2.reagents.add_reagent("water", 40) //when you make pre-designed foam reactions that carry the reagents, always add water last
|
||||
B1.reagents.add_reagent("fluorosurfactant", 40)
|
||||
B2.reagents.add_reagent("cleaner", 10)
|
||||
B2.reagents.add_reagent("water", 40) //when you make pre-designed foam reactions that carry the reagents, always add water last
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/grenade/chem_grenade/teargas
|
||||
@@ -511,19 +511,19 @@
|
||||
desc = "Used for nonlethal riot control. Contents under pressure. Do not directly inhale contents."
|
||||
stage = READY
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
/obj/item/grenade/chem_grenade/teargas/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("condensedcapsaicin", 25)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
B1.reagents.add_reagent("condensedcapsaicin", 25)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
/obj/item/grenade/chem_grenade/facid
|
||||
name = "acid grenade"
|
||||
@@ -550,19 +550,19 @@
|
||||
desc = "Contains sarin gas; extremely deadly and fast acting; use with extreme caution."
|
||||
stage = READY
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
/obj/item/grenade/chem_grenade/saringas/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("sarin", 25)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
B1.reagents.add_reagent("sarin", 25)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
#undef EMPTY
|
||||
#undef WIRED
|
||||
|
||||
@@ -10,44 +10,34 @@
|
||||
var/path = 0
|
||||
var/affected_area = 2
|
||||
|
||||
prime()
|
||||
..()
|
||||
playsound(src.loc, 'sound/items/bikehorn.ogg', 25, -3)
|
||||
/*
|
||||
for(var/turf/simulated/floor/T in view(affected_area, src.loc))
|
||||
if(prob(75))
|
||||
banana(T)
|
||||
*/
|
||||
var/i = 0
|
||||
var/number = 0
|
||||
for(var/direction in alldirs)
|
||||
for(i = 0; i < 2; i++)
|
||||
number++
|
||||
var/obj/item/grown/bananapeel/traitorpeel/peel = new /obj/item/grown/bananapeel/traitorpeel(get_turf(src.loc))
|
||||
/* var/direction = pick(alldirs)
|
||||
var/spaces = pick(1;150, 2)
|
||||
var/a = 0
|
||||
for(a = 0; a < spaces; a++)
|
||||
step(peel,direction)*/
|
||||
var/a = 1
|
||||
if(number & 2)
|
||||
for(a = 1; a <= 2; a++)
|
||||
step(peel,direction)
|
||||
else
|
||||
/obj/item/grenade/clown_grenade/prime()
|
||||
..()
|
||||
playsound(src.loc, 'sound/items/bikehorn.ogg', 25, -3)
|
||||
/*
|
||||
for(var/turf/simulated/floor/T in view(affected_area, src.loc))
|
||||
if(prob(75))
|
||||
banana(T)
|
||||
*/
|
||||
var/i = 0
|
||||
var/number = 0
|
||||
for(var/direction in alldirs)
|
||||
for(i = 0; i < 2; i++)
|
||||
number++
|
||||
var/obj/item/grown/bananapeel/traitorpeel/peel = new /obj/item/grown/bananapeel/traitorpeel(get_turf(src.loc))
|
||||
/* var/direction = pick(alldirs)
|
||||
var/spaces = pick(1;150, 2)
|
||||
var/a = 0
|
||||
for(a = 0; a < spaces; a++)
|
||||
step(peel,direction)*/
|
||||
var/a = 1
|
||||
if(number & 2)
|
||||
for(a = 1; a <= 2; a++)
|
||||
step(peel,direction)
|
||||
new /obj/item/grown/bananapeel/traitorpeel(get_turf(src.loc))
|
||||
qdel(src)
|
||||
return
|
||||
/*
|
||||
proc/banana(turf/T as turf)
|
||||
if(!T || !istype(T))
|
||||
return
|
||||
if(locate(/obj/structure/grille) in T)
|
||||
return
|
||||
if(locate(/obj/structure/window) in T)
|
||||
return
|
||||
new /obj/item/grown/bananapeel/traitorpeel(T)
|
||||
*/
|
||||
else
|
||||
step(peel,direction)
|
||||
new /obj/item/grown/bananapeel/traitorpeel(get_turf(src.loc))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/grown/bananapeel/traitorpeel
|
||||
trip_stun = 0
|
||||
|
||||
@@ -3,17 +3,17 @@
|
||||
desc = "From the makers of BLAM! brand foaming space cleaner, this bomb guarantees steady work for any janitor."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/list/muck = list("blood","carbon","flour","radium")
|
||||
var/filth = pick(muck - "radium") // not usually radioactive
|
||||
/obj/item/grenade/chem_grenade/dirt/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/list/muck = list("blood","carbon","flour","radium")
|
||||
var/filth = pick(muck - "radium") // not usually radioactive
|
||||
|
||||
B1.reagents.add_reagent(filth,25)
|
||||
if(prob(25))
|
||||
B1.reagents.add_reagent(pick(muck - filth,25)) // but sometimes...
|
||||
B1.reagents.add_reagent(filth,25)
|
||||
if(prob(25))
|
||||
B1.reagents.add_reagent(pick(muck - filth,25)) // but sometimes...
|
||||
|
||||
beakers += B1
|
||||
beakers += B1
|
||||
|
||||
|
||||
/obj/item/grenade/chem_grenade/meat
|
||||
@@ -22,18 +22,18 @@
|
||||
stage = 2
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
/obj/item/grenade/chem_grenade/meat/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("blood",60)
|
||||
if(prob(5))
|
||||
B1.reagents.add_reagent("blood",1) // Quality control problems, causes a mess
|
||||
B2.reagents.add_reagent("cryoxadone",30)
|
||||
B1.reagents.add_reagent("blood",60)
|
||||
if(prob(5))
|
||||
B1.reagents.add_reagent("blood",1) // Quality control problems, causes a mess
|
||||
B2.reagents.add_reagent("cryoxadone",30)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
/obj/item/grenade/chem_grenade/holywater
|
||||
payload_name = "holy water"
|
||||
@@ -41,11 +41,11 @@
|
||||
stage = 2
|
||||
det_time = 30
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B = new(src)
|
||||
B.reagents.add_reagent("holywater",100)
|
||||
beakers += B
|
||||
/obj/item/grenade/chem_grenade/holywater/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B = new(src)
|
||||
B.reagents.add_reagent("holywater",100)
|
||||
beakers += B
|
||||
|
||||
/obj/item/grenade/chem_grenade/hellwater
|
||||
payload_name = "hell water"
|
||||
@@ -53,15 +53,15 @@
|
||||
stage = 2
|
||||
det_time = 30
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
B1.reagents.add_reagent("hell_water",80)
|
||||
B1.reagents.add_reagent("sugar",20)
|
||||
B2.reagents.add_reagent("hell_water", 60)
|
||||
B2.reagents.add_reagent("potassium", 20)
|
||||
B2.reagents.add_reagent("phosphorus", 20)
|
||||
/obj/item/grenade/chem_grenade/hellwater/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
B1.reagents.add_reagent("hell_water",80)
|
||||
B1.reagents.add_reagent("sugar",20)
|
||||
B2.reagents.add_reagent("hell_water", 60)
|
||||
B2.reagents.add_reagent("potassium", 20)
|
||||
B2.reagents.add_reagent("phosphorus", 20)
|
||||
|
||||
|
||||
/obj/item/grenade/chem_grenade/drugs
|
||||
@@ -69,40 +69,40 @@
|
||||
desc = "How does it work?"
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
/obj/item/grenade/chem_grenade/drugs/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("space_drugs", 25)
|
||||
B1.reagents.add_reagent("lsd", 25)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
B1.reagents.add_reagent("space_drugs", 25)
|
||||
B1.reagents.add_reagent("lsd", 25)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
/obj/item/grenade/chem_grenade/ethanol
|
||||
payload_name = "ethanol"
|
||||
desc = "Ach, that hits the spot."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
/obj/item/grenade/chem_grenade/ethanol/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("ethanol", 75)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
B2.reagents.add_reagent("ethanol", 25)
|
||||
B1.reagents.add_reagent("ethanol", 75)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
B2.reagents.add_reagent("ethanol", 25)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
// -------------------------------------
|
||||
// Grenades using new grenade assemblies
|
||||
@@ -208,107 +208,67 @@
|
||||
payload_name = "EMP"
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B1.reagents.add_reagent("uranium",50)
|
||||
B2.reagents.add_reagent("iron",50)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
/obj/item/grenade/chem_grenade/emp/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B1.reagents.add_reagent("uranium",50)
|
||||
B2.reagents.add_reagent("iron",50)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
// Assembly Variants
|
||||
/obj/item/grenade/chem_grenade/emp/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/signaler)
|
||||
/obj/item/grenade/chem_grenade/emp/remote/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/signaler)
|
||||
|
||||
/obj/item/grenade/chem_grenade/emp/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
|
||||
/obj/item/grenade/chem_grenade/emp/prox/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
|
||||
|
||||
/obj/item/grenade/chem_grenade/emp/mine
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/mousetrap)
|
||||
|
||||
// --------------------------------------
|
||||
// Dangerous slime core grenades
|
||||
// --------------------------------------
|
||||
/*
|
||||
/obj/item/grenade/chem_grenade/large/bluespace
|
||||
payload_name = "bluespace slime"
|
||||
desc = "A standard grenade casing containing weaponized slime extract."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/slime_extract/bluespace/B1 = new(src)
|
||||
B1.Uses = rand(1,3)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B2.reagents.add_reagent("plasma",5 * B1.Uses)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
/obj/item/grenade/chem_grenade/large/bluespace/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
|
||||
|
||||
/obj/item/grenade/chem_grenade/large/bluespace/mine
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/mousetrap)
|
||||
|
||||
/obj/item/grenade/chem_grenade/large/bluespace/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/signaler)
|
||||
*/
|
||||
/obj/item/grenade/chem_grenade/emp/mine/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/mousetrap)
|
||||
|
||||
/obj/item/grenade/chem_grenade/large/monster
|
||||
payload_name = "gold slime"
|
||||
desc = "A standard grenade containing weaponized slime extract."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/slime_extract/gold/B1 = new(src)
|
||||
B1.Uses = rand(1,3)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B2.reagents.add_reagent("plasma",5 * B1.Uses)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
/obj/item/grenade/chem_grenade/large/monster/New()
|
||||
..()
|
||||
var/obj/item/slime_extract/gold/B1 = new(src)
|
||||
B1.Uses = rand(1,3)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B2.reagents.add_reagent("plasma",5 * B1.Uses)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
/obj/item/grenade/chem_grenade/large/monster/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
|
||||
/obj/item/grenade/chem_grenade/large/monster/prox/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
|
||||
|
||||
/obj/item/grenade/chem_grenade/large/monster/mine
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/mousetrap)
|
||||
/obj/item/grenade/chem_grenade/large/monster/mine/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/mousetrap)
|
||||
|
||||
/obj/item/grenade/chem_grenade/large/monster/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/signaler)
|
||||
/obj/item/grenade/chem_grenade/large/monster/remote/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/signaler)
|
||||
|
||||
/obj/item/grenade/chem_grenade/large/feast
|
||||
payload_name = "silver slime"
|
||||
desc = "A standard grenade containing weaponized slime extract."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/slime_extract/silver/B1 = new(src)
|
||||
B1.Uses = rand(1,3)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B2.reagents.add_reagent("plasma",5 * B1.Uses)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
/obj/item/grenade/chem_grenade/large/feast/New()
|
||||
..()
|
||||
var/obj/item/slime_extract/silver/B1 = new(src)
|
||||
B1.Uses = rand(1,3)
|
||||
var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B2.reagents.add_reagent("plasma",5 * B1.Uses)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
// --------------------------------------
|
||||
// Syndie Kits
|
||||
@@ -316,25 +276,30 @@
|
||||
|
||||
/obj/item/storage/box/syndie_kit/remotegrenade
|
||||
name = "Remote Grenade Kit"
|
||||
New()
|
||||
..()
|
||||
new /obj/item/grenade/chem_grenade/explosion/remote(src)
|
||||
new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
|
||||
new /obj/item/assembly/signaler(src)
|
||||
return
|
||||
|
||||
/obj/item/storage/box/syndie_kit/remotegrenade/New()
|
||||
..()
|
||||
new /obj/item/grenade/chem_grenade/explosion/remote(src)
|
||||
new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
|
||||
new /obj/item/assembly/signaler(src)
|
||||
return
|
||||
|
||||
/obj/item/storage/box/syndie_kit/remoteemp
|
||||
name = "Remote EMP Kit"
|
||||
New()
|
||||
..()
|
||||
new /obj/item/grenade/chem_grenade/emp/remote(src)
|
||||
new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
|
||||
new /obj/item/assembly/signaler(src)
|
||||
return
|
||||
|
||||
/obj/item/storage/box/syndie_kit/remoteemp/New()
|
||||
..()
|
||||
new /obj/item/grenade/chem_grenade/emp/remote(src)
|
||||
new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
|
||||
new /obj/item/assembly/signaler(src)
|
||||
return
|
||||
|
||||
/obj/item/storage/box/syndie_kit/remotelube
|
||||
name = "Remote Lube Kit"
|
||||
New()
|
||||
..()
|
||||
new /obj/item/grenade/chem_grenade/lube(src)
|
||||
new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
|
||||
new /obj/item/assembly/signaler(src)
|
||||
return
|
||||
|
||||
/obj/item/storage/box/syndie_kit/remotelube/New()
|
||||
..()
|
||||
new /obj/item/grenade/chem_grenade/lube(src)
|
||||
new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
|
||||
new /obj/item/assembly/signaler(src)
|
||||
return
|
||||
|
||||
@@ -8,31 +8,31 @@
|
||||
slot_flags = SLOT_BELT
|
||||
var/datum/effect_system/smoke_spread/bad/smoke
|
||||
|
||||
New()
|
||||
..()
|
||||
src.smoke = new /datum/effect_system/smoke_spread/bad
|
||||
src.smoke.attach(src)
|
||||
/obj/item/grenade/smokebomb/New()
|
||||
..()
|
||||
src.smoke = new /datum/effect_system/smoke_spread/bad
|
||||
src.smoke.attach(src)
|
||||
|
||||
Destroy()
|
||||
QDEL_NULL(smoke)
|
||||
return ..()
|
||||
/obj/item/grenade/smokebomb/Destroy()
|
||||
QDEL_NULL(smoke)
|
||||
return ..()
|
||||
|
||||
prime()
|
||||
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
|
||||
src.smoke.set_up(10, 0, usr.loc)
|
||||
spawn(0)
|
||||
src.smoke.start()
|
||||
sleep(10)
|
||||
src.smoke.start()
|
||||
sleep(10)
|
||||
src.smoke.start()
|
||||
sleep(10)
|
||||
src.smoke.start()
|
||||
/obj/item/grenade/smokebomb/prime()
|
||||
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
|
||||
src.smoke.set_up(10, 0, usr.loc)
|
||||
spawn(0)
|
||||
src.smoke.start()
|
||||
sleep(10)
|
||||
src.smoke.start()
|
||||
sleep(10)
|
||||
src.smoke.start()
|
||||
sleep(10)
|
||||
src.smoke.start()
|
||||
|
||||
for(var/obj/structure/blob/B in view(8,src))
|
||||
var/damage = round(30/(get_dist(B,src)+1))
|
||||
B.health -= damage
|
||||
B.update_icon()
|
||||
sleep(80)
|
||||
qdel(src)
|
||||
return
|
||||
for(var/obj/structure/blob/B in view(8,src))
|
||||
var/damage = round(30/(get_dist(B,src)+1))
|
||||
B.health -= damage
|
||||
B.update_icon()
|
||||
sleep(80)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -24,8 +24,7 @@
|
||||
icon_on = "zippoon"
|
||||
icon_off = "zippo"
|
||||
|
||||
/obj/item/lighter/random
|
||||
New()
|
||||
/obj/item/lighter/random/New()
|
||||
var/color = pick("r","c","y","g")
|
||||
icon_on = "lighter-[color]-on"
|
||||
icon_off = "lighter-[color]"
|
||||
|
||||
@@ -89,25 +89,25 @@
|
||||
icon_state = "lightning"
|
||||
desc = "test lightning"
|
||||
|
||||
New()
|
||||
/obj/item/lightning/New()
|
||||
icon = midicon
|
||||
icon_state = "1"
|
||||
|
||||
afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
|
||||
var/angle = get_angle(A, user)
|
||||
// to_chat(world, angle)
|
||||
angle = round(angle) + 45
|
||||
if(angle > 180)
|
||||
angle -= 180
|
||||
else
|
||||
angle += 180
|
||||
/obj/item/lightning/afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
|
||||
var/angle = get_angle(A, user)
|
||||
//to_chat(world, angle)
|
||||
angle = round(angle) + 45
|
||||
if(angle > 180)
|
||||
angle -= 180
|
||||
else
|
||||
angle += 180
|
||||
|
||||
if(!angle)
|
||||
angle = 1
|
||||
// to_chat(world, "adjusted [angle]")
|
||||
icon_state = "[angle]"
|
||||
// to_chat(world, "[angle] [(get_dist(user, A) - 1)]")
|
||||
user.Beam(A, "lightning", 'icons/obj/zap.dmi', 50, 15)
|
||||
if(!angle)
|
||||
angle = 1
|
||||
//to_chat(world, "adjusted [angle]")
|
||||
icon_state = "[angle]"
|
||||
//to_chat(world, "[angle] [(get_dist(user, A) - 1)]")
|
||||
user.Beam(A, "lightning", 'icons/obj/zap.dmi', 50, 15)
|
||||
|
||||
/obj/item/newton
|
||||
name = "newton cradle"
|
||||
|
||||
@@ -185,10 +185,9 @@
|
||||
desc = "An NT Deluxe satchel, with the finest quality leather and the company logo in a thin gold stitch"
|
||||
icon_state = "nt_deluxe"
|
||||
|
||||
/obj/item/storage/backpack/satchel/withwallet
|
||||
New()
|
||||
..()
|
||||
new /obj/item/storage/wallet/random( src )
|
||||
/obj/item/storage/backpack/satchel/withwallet/New()
|
||||
..()
|
||||
new /obj/item/storage/wallet/random(src)
|
||||
|
||||
/obj/item/storage/backpack/satchel_norm
|
||||
name = "satchel"
|
||||
|
||||
@@ -207,122 +207,122 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
allow_quick_empty = 1 // this function is superceded
|
||||
New()
|
||||
..()
|
||||
//verbs -= /obj/item/storage/verb/quick_empty
|
||||
//verbs += /obj/item/storage/bag/sheetsnatcher/quick_empty
|
||||
/obj/item/storage/bag/sheetsnatcher/New()
|
||||
..()
|
||||
//verbs -= /obj/item/storage/verb/quick_empty
|
||||
//verbs += /obj/item/storage/bag/sheetsnatcher/quick_empty
|
||||
|
||||
can_be_inserted(obj/item/W as obj, stop_messages = 0)
|
||||
if(!istype(W,/obj/item/stack/sheet) || istype(W,/obj/item/stack/sheet/mineral/sandstone) || istype(W,/obj/item/stack/sheet/wood))
|
||||
if(!stop_messages)
|
||||
to_chat(usr, "The snatcher does not accept [W].")
|
||||
return 0 //I don't care, but the existing code rejects them for not being "sheets" *shrug* -Sayu
|
||||
var/current = 0
|
||||
for(var/obj/item/stack/sheet/S in contents)
|
||||
current += S.amount
|
||||
if(capacity == current)//If it's full, you're done
|
||||
if(!stop_messages)
|
||||
to_chat(usr, "<span class='warning'>The snatcher is full.</span>")
|
||||
return 0
|
||||
return 1
|
||||
/obj/item/storage/bag/sheetsnatcher/can_be_inserted(obj/item/W as obj, stop_messages = 0)
|
||||
if(!istype(W,/obj/item/stack/sheet) || istype(W,/obj/item/stack/sheet/mineral/sandstone) || istype(W,/obj/item/stack/sheet/wood))
|
||||
if(!stop_messages)
|
||||
to_chat(usr, "The snatcher does not accept [W].")
|
||||
return 0 //I don't care, but the existing code rejects them for not being "sheets" *shrug* -Sayu
|
||||
var/current = 0
|
||||
for(var/obj/item/stack/sheet/S in contents)
|
||||
current += S.amount
|
||||
if(capacity == current)//If it's full, you're done
|
||||
if(!stop_messages)
|
||||
to_chat(usr, "<span class='warning'>The snatcher is full.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
// Modified handle_item_insertion. Would prefer not to, but...
|
||||
handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
|
||||
var/obj/item/stack/sheet/S = W
|
||||
if(!istype(S)) return 0
|
||||
/obj/item/storage/bag/sheetsnatcher/handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
|
||||
var/obj/item/stack/sheet/S = W
|
||||
if(!istype(S)) return 0
|
||||
|
||||
var/amount
|
||||
var/inserted = 0
|
||||
var/current = 0
|
||||
for(var/obj/item/stack/sheet/S2 in contents)
|
||||
current += S2.amount
|
||||
if(capacity < current + S.amount)//If the stack will fill it up
|
||||
amount = capacity - current
|
||||
var/amount
|
||||
var/inserted = 0
|
||||
var/current = 0
|
||||
for(var/obj/item/stack/sheet/S2 in contents)
|
||||
current += S2.amount
|
||||
if(capacity < current + S.amount)//If the stack will fill it up
|
||||
amount = capacity - current
|
||||
else
|
||||
amount = S.amount
|
||||
|
||||
for(var/obj/item/stack/sheet/sheet in contents)
|
||||
if(S.type == sheet.type) // we are violating the amount limitation because these are not sane objects
|
||||
sheet.amount += amount // they should only be removed through procs in this file, which split them up.
|
||||
S.amount -= amount
|
||||
inserted = 1
|
||||
break
|
||||
|
||||
if(!inserted || !S.amount)
|
||||
usr.unEquip(S)
|
||||
usr.update_icons() //update our overlays
|
||||
if(usr.client && usr.s_active != src)
|
||||
usr.client.screen -= S
|
||||
S.dropped(usr)
|
||||
if(!S.amount)
|
||||
qdel(S)
|
||||
else
|
||||
amount = S.amount
|
||||
S.loc = src
|
||||
|
||||
for(var/obj/item/stack/sheet/sheet in contents)
|
||||
if(S.type == sheet.type) // we are violating the amount limitation because these are not sane objects
|
||||
sheet.amount += amount // they should only be removed through procs in this file, which split them up.
|
||||
S.amount -= amount
|
||||
inserted = 1
|
||||
break
|
||||
|
||||
if(!inserted || !S.amount)
|
||||
usr.unEquip(S)
|
||||
usr.update_icons() //update our overlays
|
||||
if(usr.client && usr.s_active != src)
|
||||
usr.client.screen -= S
|
||||
S.dropped(usr)
|
||||
if(!S.amount)
|
||||
qdel(S)
|
||||
else
|
||||
S.loc = src
|
||||
|
||||
orient2hud(usr)
|
||||
if(usr.s_active)
|
||||
usr.s_active.show_to(usr)
|
||||
update_icon()
|
||||
return 1
|
||||
orient2hud(usr)
|
||||
if(usr.s_active)
|
||||
usr.s_active.show_to(usr)
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
|
||||
// Sets up numbered display to show the stack size of each stored mineral
|
||||
// NOTE: numbered display is turned off currently because it's broken
|
||||
orient2hud(mob/user as mob)
|
||||
var/adjusted_contents = contents.len
|
||||
/obj/item/storage/bag/sheetsnatcher/orient2hud(mob/user as mob)
|
||||
var/adjusted_contents = contents.len
|
||||
|
||||
//Numbered contents display
|
||||
var/list/datum/numbered_display/numbered_contents
|
||||
if(display_contents_with_number)
|
||||
numbered_contents = list()
|
||||
adjusted_contents = 0
|
||||
for(var/obj/item/stack/sheet/I in contents)
|
||||
adjusted_contents++
|
||||
var/datum/numbered_display/D = new/datum/numbered_display(I)
|
||||
D.number = I.amount
|
||||
numbered_contents.Add( D )
|
||||
//Numbered contents display
|
||||
var/list/datum/numbered_display/numbered_contents
|
||||
if(display_contents_with_number)
|
||||
numbered_contents = list()
|
||||
adjusted_contents = 0
|
||||
for(var/obj/item/stack/sheet/I in contents)
|
||||
adjusted_contents++
|
||||
var/datum/numbered_display/D = new/datum/numbered_display(I)
|
||||
D.number = I.amount
|
||||
numbered_contents.Add( D )
|
||||
|
||||
var/row_num = 0
|
||||
var/col_count = min(7,storage_slots) -1
|
||||
if(adjusted_contents > 7)
|
||||
row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width.
|
||||
src.standard_orient_objs(row_num, col_count, numbered_contents)
|
||||
return
|
||||
var/row_num = 0
|
||||
var/col_count = min(7,storage_slots) -1
|
||||
if(adjusted_contents > 7)
|
||||
row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width.
|
||||
src.standard_orient_objs(row_num, col_count, numbered_contents)
|
||||
return
|
||||
|
||||
|
||||
// Modified quick_empty verb drops appropriate sized stacks
|
||||
quick_empty()
|
||||
var/location = get_turf(src)
|
||||
for(var/obj/item/stack/sheet/S in contents)
|
||||
while(S.amount)
|
||||
var/obj/item/stack/sheet/N = new S.type(location)
|
||||
var/stacksize = min(S.amount,N.max_amount)
|
||||
N.amount = stacksize
|
||||
S.amount -= stacksize
|
||||
if(!S.amount)
|
||||
qdel(S) // todo: there's probably something missing here
|
||||
orient2hud(usr)
|
||||
if(usr.s_active)
|
||||
usr.s_active.show_to(usr)
|
||||
update_icon()
|
||||
/obj/item/storage/bag/sheetsnatcher/quick_empty()
|
||||
var/location = get_turf(src)
|
||||
for(var/obj/item/stack/sheet/S in contents)
|
||||
while(S.amount)
|
||||
var/obj/item/stack/sheet/N = new S.type(location)
|
||||
var/stacksize = min(S.amount,N.max_amount)
|
||||
N.amount = stacksize
|
||||
S.amount -= stacksize
|
||||
if(!S.amount)
|
||||
qdel(S) // todo: there's probably something missing here
|
||||
orient2hud(usr)
|
||||
if(usr.s_active)
|
||||
usr.s_active.show_to(usr)
|
||||
update_icon()
|
||||
|
||||
// Instead of removing
|
||||
remove_from_storage(obj/item/W as obj, atom/new_location)
|
||||
var/obj/item/stack/sheet/S = W
|
||||
if(!istype(S)) return 0
|
||||
/obj/item/storage/bag/sheetsnatcher/remove_from_storage(obj/item/W as obj, atom/new_location)
|
||||
var/obj/item/stack/sheet/S = W
|
||||
if(!istype(S)) return 0
|
||||
|
||||
//I would prefer to drop a new stack, but the item/attack_hand code
|
||||
// that calls this can't recieve a different object than you clicked on.
|
||||
//Therefore, make a new stack internally that has the remainder.
|
||||
// -Sayu
|
||||
//I would prefer to drop a new stack, but the item/attack_hand code
|
||||
// that calls this can't recieve a different object than you clicked on.
|
||||
//Therefore, make a new stack internally that has the remainder.
|
||||
// -Sayu
|
||||
|
||||
if(S.amount > S.max_amount)
|
||||
var/obj/item/stack/sheet/temp = new S.type(src)
|
||||
temp.amount = S.amount - S.max_amount
|
||||
S.amount = S.max_amount
|
||||
if(S.amount > S.max_amount)
|
||||
var/obj/item/stack/sheet/temp = new S.type(src)
|
||||
temp.amount = S.amount - S.max_amount
|
||||
S.amount = S.max_amount
|
||||
|
||||
return ..(S,new_location)
|
||||
return ..(S,new_location)
|
||||
|
||||
// -----------------------------
|
||||
// Sheet Snatcher (Cyborg)
|
||||
|
||||
@@ -631,21 +631,21 @@
|
||||
max_combined_w_class = 280
|
||||
can_hold = list()
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/screwdriver(src)
|
||||
new /obj/item/weldingtool/hugetank(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/wrench(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src)
|
||||
/obj/item/storage/belt/bluespace/admin/New()
|
||||
..()
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/screwdriver(src)
|
||||
new /obj/item/weldingtool/hugetank(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/wrench(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src)
|
||||
|
||||
new /obj/item/restraints/handcuffs(src)
|
||||
new /obj/item/dnainjector/xraymut(src)
|
||||
new /obj/item/dnainjector/firemut(src)
|
||||
new /obj/item/dnainjector/telemut(src)
|
||||
new /obj/item/dnainjector/hulkmut(src)
|
||||
new /obj/item/restraints/handcuffs(src)
|
||||
new /obj/item/dnainjector/xraymut(src)
|
||||
new /obj/item/dnainjector/firemut(src)
|
||||
new /obj/item/dnainjector/telemut(src)
|
||||
new /obj/item/dnainjector/hulkmut(src)
|
||||
// new /obj/item/spellbook(src) // for smoke effects, door openings, etc
|
||||
// new /obj/item/magic/spellbook(src)
|
||||
|
||||
@@ -660,15 +660,15 @@
|
||||
max_combined_w_class = 280
|
||||
can_hold = list()
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/screwdriver(src)
|
||||
new /obj/item/weldingtool/hugetank(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/wrench(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src)
|
||||
/obj/item/storage/belt/bluespace/sandbox/New()
|
||||
..()
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/screwdriver(src)
|
||||
new /obj/item/weldingtool/hugetank(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/wrench(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src)
|
||||
|
||||
new /obj/item/analyzer(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
new /obj/item/analyzer(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
|
||||
@@ -13,216 +13,216 @@
|
||||
|
||||
var/list/datum/automation/automations = list()
|
||||
|
||||
receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption) return
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption) return
|
||||
|
||||
var/id_tag = signal.data["tag"]
|
||||
if(!id_tag)
|
||||
return
|
||||
var/id_tag = signal.data["tag"]
|
||||
if(!id_tag)
|
||||
return
|
||||
|
||||
sensor_information[id_tag] = signal.data
|
||||
sensor_information[id_tag] = signal.data
|
||||
|
||||
process()
|
||||
if(on)
|
||||
for(var/datum/automation/A in automations)
|
||||
A.process()
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/process()
|
||||
if(on)
|
||||
for(var/datum/automation/A in automations)
|
||||
A.process()
|
||||
|
||||
update_icon()
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
// Broken
|
||||
if(stat & BROKEN)
|
||||
icon_state += "b"
|
||||
|
||||
// Powered
|
||||
else if(stat & NOPOWER)
|
||||
icon_state = initial(icon_state)
|
||||
// Broken
|
||||
if(stat & BROKEN)
|
||||
icon_state += "b"
|
||||
icon_state += "0"
|
||||
else if(on)
|
||||
icon_state += "_active"
|
||||
|
||||
// Powered
|
||||
else if(stat & NOPOWER)
|
||||
icon_state = initial(icon_state)
|
||||
icon_state += "0"
|
||||
else if(on)
|
||||
icon_state += "_active"
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/request_device_refresh(device)
|
||||
send_signal(list("tag"=device, "status"))
|
||||
|
||||
proc/request_device_refresh(var/device)
|
||||
send_signal(list("tag"=device, "status"))
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/send_signal(list/data, filter = RADIO_ATMOSIA)//filter's here so the AAC can cross communicate to things like vents, which have a different filter
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.source = src
|
||||
signal.data=data
|
||||
signal.data["sigtype"]="command"
|
||||
signal.data["advcontrol"]=1//AAC balancing, you need to manually get up to the machine to make it listen to this
|
||||
radio_connection.post_signal(src, signal, range = 8, filter = filter)
|
||||
|
||||
proc/send_signal(var/list/data, var/filter = RADIO_ATMOSIA)//filter's here so the AAC can cross communicate to things like vents, which have a different filter
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.source = src
|
||||
signal.data=data
|
||||
signal.data["sigtype"]="command"
|
||||
signal.data["advcontrol"]=1//AAC balancing, you need to manually get up to the machine to make it listen to this
|
||||
radio_connection.post_signal(src, signal, range = 8, filter = filter)
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/selectValidChildFor(datum/automation/parent, mob/user, list/valid_returntypes)
|
||||
var/list/choices=list()
|
||||
for(var/childtype in automation_types)
|
||||
var/datum/automation/A = new childtype(src)
|
||||
if(A.returntype == null)
|
||||
continue
|
||||
if(!(A.returntype in valid_returntypes))
|
||||
continue
|
||||
choices[A.name]=A
|
||||
if(choices.len==0)
|
||||
testing("Unable to find automations with returntype in [english_list(valid_returntypes)]!")
|
||||
return 0
|
||||
var/label=input(user, "Select new automation:", "Automations", "Cancel") as null|anything in choices
|
||||
if(!label)
|
||||
return 0
|
||||
return choices[label]
|
||||
|
||||
proc/selectValidChildFor(var/datum/automation/parent, var/mob/user, var/list/valid_returntypes)
|
||||
var/list/choices=list()
|
||||
for(var/childtype in automation_types)
|
||||
var/datum/automation/A = new childtype(src)
|
||||
if(A.returntype == null)
|
||||
continue
|
||||
if(!(A.returntype in valid_returntypes))
|
||||
continue
|
||||
choices[A.name]=A
|
||||
if(choices.len==0)
|
||||
testing("Unable to find automations with returntype in [english_list(valid_returntypes)]!")
|
||||
return 0
|
||||
var/label=input(user, "Select new automation:", "Automations", "Cancel") as null|anything in choices
|
||||
if(!label)
|
||||
return 0
|
||||
return choices[label]
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/return_text()
|
||||
var/out=..()
|
||||
|
||||
return_text()
|
||||
var/out=..()
|
||||
if(on)
|
||||
out += "<a href=\"?src=[UID()];on=1\" style=\"font-size:large;font-weight:bold;color:red;\">RUNNING</a>"
|
||||
else
|
||||
out += "<a href=\"?src=[UID()];on=1\" style=\"font-size:large;font-weight:bold;color:green;\">STOPPED</a>"
|
||||
|
||||
if(on)
|
||||
out += "<a href=\"?src=[UID()];on=1\" style=\"font-size:large;font-weight:bold;color:red;\">RUNNING</a>"
|
||||
else
|
||||
out += "<a href=\"?src=[UID()];on=1\" style=\"font-size:large;font-weight:bold;color:green;\">STOPPED</a>"
|
||||
out += {"
|
||||
<h2>Automations</h2>
|
||||
<p>\[
|
||||
<a href="?src=[UID()];add=1">
|
||||
Add
|
||||
</a>
|
||||
|
|
||||
<a href="?src=[UID()];reset=*">
|
||||
Reset All
|
||||
</a>
|
||||
|
|
||||
<a href="?src=[UID()];remove=*">
|
||||
Clear
|
||||
</a>
|
||||
\]</p>
|
||||
<p>\[
|
||||
<a href="?src=[UID()];dump=1">
|
||||
Export
|
||||
</a>
|
||||
|
|
||||
<a href="?src=[UID()];read=1">
|
||||
Import
|
||||
</a>
|
||||
\]</p>"}
|
||||
if(automations.len==0)
|
||||
out += "<i>No automations present.</i>"
|
||||
else
|
||||
for(var/datum/automation/A in automations)
|
||||
out += {"
|
||||
<fieldset>
|
||||
<legend>
|
||||
<a href="?src=[UID()];label=\ref[A]">[A.label]</a>
|
||||
(<a href="?src=[UID()];reset=\ref[A]">Reset</a> |
|
||||
<a href="?src=[UID()];remove=\ref[A]">×</a>)
|
||||
</legend>
|
||||
[A.GetText()]
|
||||
</fieldset>
|
||||
"}
|
||||
return out
|
||||
|
||||
out += {"
|
||||
<h2>Automations</h2>
|
||||
<p>\[
|
||||
<a href="?src=[UID()];add=1">
|
||||
Add
|
||||
</a>
|
||||
|
|
||||
<a href="?src=[UID()];reset=*">
|
||||
Reset All
|
||||
</a>
|
||||
|
|
||||
<a href="?src=[UID()];remove=*">
|
||||
Clear
|
||||
</a>
|
||||
\]</p>
|
||||
<p>\[
|
||||
<a href="?src=[UID()];dump=1">
|
||||
Export
|
||||
</a>
|
||||
|
|
||||
<a href="?src=[UID()];read=1">
|
||||
Import
|
||||
</a>
|
||||
\]</p>"}
|
||||
if(automations.len==0)
|
||||
out += "<i>No automations present.</i>"
|
||||
else
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["on"])
|
||||
on = !on
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
if(href_list["add"])
|
||||
var/new_child=selectValidChildFor(null,usr,list(0))
|
||||
if(!new_child)
|
||||
return 1
|
||||
automations += new_child
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["label"])
|
||||
var/datum/automation/A=locate(href_list["label"])
|
||||
if(!A) return 1
|
||||
var/nl=input(usr, "Please enter a label for this automation task.") as text|null
|
||||
if(!nl) return 1
|
||||
nl = copytext(sanitize(nl), 1, 50)
|
||||
A.label=nl
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["reset"])
|
||||
if(href_list["reset"]=="*")
|
||||
for(var/datum/automation/A in automations)
|
||||
out += {"
|
||||
<fieldset>
|
||||
<legend>
|
||||
<a href="?src=[UID()];label=\ref[A]">[A.label]</a>
|
||||
(<a href="?src=[UID()];reset=\ref[A]">Reset</a> |
|
||||
<a href="?src=[UID()];remove=\ref[A]">×</a>)
|
||||
</legend>
|
||||
[A.GetText()]
|
||||
</fieldset>
|
||||
"}
|
||||
return out
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["on"])
|
||||
on = !on
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
if(href_list["add"])
|
||||
var/new_child=selectValidChildFor(null,usr,list(0))
|
||||
if(!new_child)
|
||||
return 1
|
||||
automations += new_child
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["label"])
|
||||
var/datum/automation/A=locate(href_list["label"])
|
||||
if(!A) return 1
|
||||
var/nl=input(usr, "Please enter a label for this automation task.") as text|null
|
||||
if(!nl) return 1
|
||||
nl = copytext(sanitize(nl), 1, 50)
|
||||
A.label=nl
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["reset"])
|
||||
if(href_list["reset"]=="*")
|
||||
for(var/datum/automation/A in automations)
|
||||
if(!A) continue
|
||||
A.OnReset()
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["reset"])
|
||||
if(!A) return 1
|
||||
if(!A) continue
|
||||
A.OnReset()
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["reset"])
|
||||
if(!A) return 1
|
||||
A.OnReset()
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["remove"])
|
||||
if(href_list["remove"]=="*")
|
||||
var/confirm=alert("Are you sure you want to remove ALL automations?","Automations","Yes","No")
|
||||
if(confirm == "No") return 0
|
||||
for(var/datum/automation/A in automations)
|
||||
if(!A) continue
|
||||
A.OnRemove()
|
||||
automations.Remove(A)
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["remove"])
|
||||
if(!A) return 1
|
||||
if(href_list["remove"])
|
||||
if(href_list["remove"]=="*")
|
||||
var/confirm=alert("Are you sure you want to remove ALL automations?","Automations","Yes","No")
|
||||
if(confirm == "No") return 0
|
||||
for(var/datum/automation/A in automations)
|
||||
if(!A) continue
|
||||
A.OnRemove()
|
||||
automations.Remove(A)
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["remove"])
|
||||
if(!A) return 1
|
||||
A.OnRemove()
|
||||
automations.Remove(A)
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["read"])
|
||||
var/code = input("Input exported AAC code.","Automations","") as message|null
|
||||
if(!code) return 0
|
||||
ReadCode(code)
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["read"])
|
||||
var/code = input("Input exported AAC code.","Automations","") as message|null
|
||||
if(!code) return 0
|
||||
ReadCode(code)
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["dump"])
|
||||
input("Exported AAC code:","Automations",DumpCode()) as message|null
|
||||
return 0
|
||||
if(href_list["dump"])
|
||||
input("Exported AAC code:","Automations",DumpCode()) as message|null
|
||||
return 0
|
||||
|
||||
proc/MakeCompare(var/datum/automation/a, var/datum/automation/b, var/comparetype)
|
||||
var/datum/automation/compare/compare=new(src)
|
||||
compare.comparator = comparetype
|
||||
compare.children[1] = a
|
||||
compare.children[2] = b
|
||||
return compare
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/MakeCompare(datum/automation/a, datum/automation/b, comparetype)
|
||||
var/datum/automation/compare/compare=new(src)
|
||||
compare.comparator = comparetype
|
||||
compare.children[1] = a
|
||||
compare.children[2] = b
|
||||
return compare
|
||||
|
||||
proc/MakeNumber(var/value)
|
||||
var/datum/automation/static_value/val = new(src)
|
||||
val.value=value
|
||||
return val
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/MakeNumber(value)
|
||||
var/datum/automation/static_value/val = new(src)
|
||||
val.value=value
|
||||
return val
|
||||
|
||||
proc/MakeGetSensorData(var/sns_tag,var/field)
|
||||
var/datum/automation/get_sensor_data/sensor=new(src)
|
||||
sensor.sensor=sns_tag
|
||||
sensor.field=field
|
||||
return sensor
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/MakeGetSensorData(sns_tag,field)
|
||||
var/datum/automation/get_sensor_data/sensor=new(src)
|
||||
sensor.sensor=sns_tag
|
||||
sensor.field=field
|
||||
return sensor
|
||||
|
||||
proc/DumpCode()
|
||||
var/list/json[0]
|
||||
for(var/datum/automation/A in automations)
|
||||
json += list(A.Export())
|
||||
return json_encode(json)
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/DumpCode()
|
||||
var/list/json[0]
|
||||
for(var/datum/automation/A in automations)
|
||||
json += list(A.Export())
|
||||
return json_encode(json)
|
||||
|
||||
proc/ReadCode(var/jsonStr)
|
||||
automations.Cut()
|
||||
var/list/json = json_decode(jsonStr)
|
||||
if(json.len>0)
|
||||
for(var/list/cData in json)
|
||||
if(isnull(cData) || !("type" in cData))
|
||||
testing("AAC: Null cData in root JS array.")
|
||||
continue
|
||||
var/Atype=text2path(cData["type"])
|
||||
if(!(Atype in automation_types))
|
||||
testing("AAC: Unrecognized Atype [Atype].")
|
||||
continue
|
||||
var/datum/automation/A = new Atype(src)
|
||||
A.Import(cData)
|
||||
automations += A
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/ReadCode(jsonStr)
|
||||
automations.Cut()
|
||||
var/list/json = json_decode(jsonStr)
|
||||
if(json.len>0)
|
||||
for(var/list/cData in json)
|
||||
if(isnull(cData) || !("type" in cData))
|
||||
testing("AAC: Null cData in root JS array.")
|
||||
continue
|
||||
var/Atype=text2path(cData["type"])
|
||||
if(!(Atype in automation_types))
|
||||
testing("AAC: Unrecognized Atype [Atype].")
|
||||
continue
|
||||
var/datum/automation/A = new Atype(src)
|
||||
A.Import(cData)
|
||||
automations += A
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/burnchamber
|
||||
var/injector_tag="inc_in"
|
||||
@@ -230,79 +230,80 @@
|
||||
var/sensor_tag="inc_sensor"
|
||||
frequency=1449
|
||||
var/temperature=1000
|
||||
New()
|
||||
..()
|
||||
|
||||
// On State
|
||||
// Pretty much this:
|
||||
/*
|
||||
if(get_sensor("inc_sensor","temperature") < 200)
|
||||
set_injector_state("inc_in",1)
|
||||
set_vent_pump_power("inc_out",0)
|
||||
else
|
||||
set_vent_pump_power("inc_out",1
|
||||
*/
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/burnchamber/New()
|
||||
..()
|
||||
|
||||
var/datum/automation/get_sensor_data/sensor=new(src)
|
||||
sensor.sensor=sensor_tag
|
||||
sensor.field="temperature"
|
||||
// On State
|
||||
// Pretty much this:
|
||||
/*
|
||||
if(get_sensor("inc_sensor","temperature") < 200)
|
||||
set_injector_state("inc_in",1)
|
||||
set_vent_pump_power("inc_out",0)
|
||||
else
|
||||
set_vent_pump_power("inc_out",1
|
||||
*/
|
||||
|
||||
var/datum/automation/static_value/val = new(src)
|
||||
val.value=temperature - 800
|
||||
var/datum/automation/get_sensor_data/sensor=new(src)
|
||||
sensor.sensor=sensor_tag
|
||||
sensor.field="temperature"
|
||||
|
||||
var/datum/automation/compare/compare=new(src)
|
||||
compare.comparator = "Less Than"
|
||||
compare.children[1] = sensor
|
||||
compare.children[2] = val
|
||||
var/datum/automation/static_value/val = new(src)
|
||||
val.value=temperature - 800
|
||||
|
||||
var/datum/automation/set_injector_power/inj_on=new(src)
|
||||
inj_on.injector=injector_tag
|
||||
inj_on.state=1
|
||||
var/datum/automation/compare/compare=new(src)
|
||||
compare.comparator = "Less Than"
|
||||
compare.children[1] = sensor
|
||||
compare.children[2] = val
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_on=new(src)
|
||||
vp_on.vent_pump=output_tag
|
||||
vp_on.state=1
|
||||
var/datum/automation/set_injector_power/inj_on=new(src)
|
||||
inj_on.injector=injector_tag
|
||||
inj_on.state=1
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_off=new(src)
|
||||
vp_off.vent_pump=output_tag
|
||||
vp_off.state=0
|
||||
var/datum/automation/set_vent_pump_power/vp_on=new(src)
|
||||
vp_on.vent_pump=output_tag
|
||||
vp_on.state=1
|
||||
|
||||
var/datum/automation/if_statement/i = new (src)
|
||||
i.label = "Fuel Injector On"
|
||||
i.condition = compare
|
||||
i.children_then.Add(inj_on)
|
||||
i.children_then.Add(vp_off)
|
||||
i.children_else.Add(vp_on)
|
||||
var/datum/automation/set_vent_pump_power/vp_off=new(src)
|
||||
vp_off.vent_pump=output_tag
|
||||
vp_off.state=0
|
||||
|
||||
automations += i
|
||||
var/datum/automation/if_statement/i = new (src)
|
||||
i.label = "Fuel Injector On"
|
||||
i.condition = compare
|
||||
i.children_then.Add(inj_on)
|
||||
i.children_then.Add(vp_off)
|
||||
i.children_else.Add(vp_on)
|
||||
|
||||
// Off state
|
||||
/*
|
||||
if(get_sensor("inc_sensor","temperature") > 1000)
|
||||
set_injector_state("inc_in",0)
|
||||
*/
|
||||
sensor=new(src)
|
||||
sensor.sensor=sensor_tag
|
||||
sensor.field="temperature"
|
||||
automations += i
|
||||
|
||||
val = new(src)
|
||||
val.value=temperature
|
||||
// Off state
|
||||
/*
|
||||
if(get_sensor("inc_sensor","temperature") > 1000)
|
||||
set_injector_state("inc_in",0)
|
||||
*/
|
||||
sensor=new(src)
|
||||
sensor.sensor=sensor_tag
|
||||
sensor.field="temperature"
|
||||
|
||||
compare=new(src)
|
||||
compare.comparator = "Greater Than"
|
||||
compare.children[1] = sensor
|
||||
compare.children[2] = val
|
||||
val = new(src)
|
||||
val.value=temperature
|
||||
|
||||
var/datum/automation/set_injector_power/inj_off=new(src)
|
||||
inj_off.injector=injector_tag
|
||||
inj_off.state=0
|
||||
compare=new(src)
|
||||
compare.comparator = "Greater Than"
|
||||
compare.children[1] = sensor
|
||||
compare.children[2] = val
|
||||
|
||||
i = new (src)
|
||||
i.label = "Fuel Injector Off"
|
||||
i.condition = compare
|
||||
i.children_then.Add(inj_off)
|
||||
var/datum/automation/set_injector_power/inj_off=new(src)
|
||||
inj_off.injector=injector_tag
|
||||
inj_off.state=0
|
||||
|
||||
automations += i
|
||||
i = new (src)
|
||||
i.label = "Fuel Injector Off"
|
||||
i.condition = compare
|
||||
i.children_then.Add(inj_off)
|
||||
|
||||
automations += i
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing
|
||||
var/n2_injector_tag="air_n2_in"
|
||||
@@ -311,142 +312,143 @@
|
||||
var/sensor_tag="air_sensor"
|
||||
frequency=1443
|
||||
var/temperature=1000
|
||||
New()
|
||||
..()
|
||||
buildO2()
|
||||
buildN2()
|
||||
buildOutletVent()
|
||||
|
||||
proc/buildO2()
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Oxygen Injection
|
||||
///////////////////////////////////////////////////////////////
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing/New()
|
||||
..()
|
||||
buildO2()
|
||||
buildN2()
|
||||
buildOutletVent()
|
||||
|
||||
var/datum/automation/set_injector_power/inj_on=new(src)
|
||||
inj_on.injector=o2_injector_tag
|
||||
inj_on.state=1
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing/proc/buildO2()
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Oxygen Injection
|
||||
///////////////////////////////////////////////////////////////
|
||||
|
||||
var/datum/automation/set_injector_power/inj_off=new(src)
|
||||
inj_off.injector=o2_injector_tag
|
||||
inj_off.state=0
|
||||
var/datum/automation/set_injector_power/inj_on=new(src)
|
||||
inj_on.injector=o2_injector_tag
|
||||
inj_on.state=1
|
||||
|
||||
var/datum/automation/if_statement/i = new (src)
|
||||
i.label = "Oxygen Injection"
|
||||
i.condition = MakeCompare(
|
||||
var/datum/automation/set_injector_power/inj_off=new(src)
|
||||
inj_off.injector=o2_injector_tag
|
||||
inj_off.state=0
|
||||
|
||||
var/datum/automation/if_statement/i = new (src)
|
||||
i.label = "Oxygen Injection"
|
||||
i.condition = MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"oxygen"),
|
||||
MakeNumber(20),
|
||||
"Less Than or Equal to"
|
||||
)
|
||||
i.children_then.Add(inj_on)
|
||||
i.children_else.Add(inj_off)
|
||||
|
||||
automations += i
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing/proc/buildN2()
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Nitrogen Injection
|
||||
///////////////////////////////////////////////////////////////
|
||||
/*
|
||||
if(get_sensor_data("pressure") < 100)
|
||||
injector_on()
|
||||
else
|
||||
if(get_sensor_data("pressure") > 5000)
|
||||
injector_off()
|
||||
*/
|
||||
|
||||
var/datum/automation/set_injector_power/inj_on=new(src)
|
||||
inj_on.injector=n2_injector_tag
|
||||
inj_on.state=1
|
||||
|
||||
var/datum/automation/set_injector_power/inj_off=new(src)
|
||||
inj_off.injector=n2_injector_tag
|
||||
inj_off.state=0
|
||||
|
||||
var/datum/automation/if_statement/if_on = new (src)
|
||||
if_on.label = "Nitrogen Injection"
|
||||
if_on.condition = MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(100),
|
||||
"Less Than"
|
||||
)
|
||||
if_on.children_then.Add(inj_on)
|
||||
|
||||
|
||||
var/datum/automation/if_statement/if_off=new(src)
|
||||
if_off.condition=MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(5000),
|
||||
"Greater Than"
|
||||
)
|
||||
if_off.children_then.Add(inj_off)
|
||||
|
||||
if_on.children_else.Add(if_off)
|
||||
|
||||
automations += if_on
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing/proc/buildOutletVent()
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Outlet Management
|
||||
///////////////////////////////////////////////////////////////
|
||||
/*
|
||||
if(get_sensor_data("pressure") >= 5000 && get_sensor_data("oxygen") >= 20)
|
||||
vent_on()
|
||||
else
|
||||
if(get_sensor_data("oxygen") < 20 || get_sensor_data("pressure") < 100)
|
||||
vent_off()
|
||||
*/
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_on=new(src)
|
||||
vp_on.vent_pump=output_tag
|
||||
vp_on.state=1
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_off=new(src)
|
||||
vp_off.vent_pump=output_tag
|
||||
vp_off.state=0
|
||||
|
||||
var/datum/automation/if_statement/if_on=new(src)
|
||||
if_on.label="Air Output"
|
||||
|
||||
var/datum/automation/and/and_on=new(src)
|
||||
and_on.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(5000),
|
||||
"Greater Than or Equal to"
|
||||
)
|
||||
)
|
||||
and_on.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"oxygen"),
|
||||
MakeNumber(20),
|
||||
"Less Than or Equal to"
|
||||
"Greater Than or Equal to"
|
||||
)
|
||||
i.children_then.Add(inj_on)
|
||||
i.children_else.Add(inj_off)
|
||||
)
|
||||
if_on.condition=and_on
|
||||
if_on.children_then.Add(vp_on)
|
||||
|
||||
automations += i
|
||||
//////////////////////////////
|
||||
|
||||
proc/buildN2()
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Nitrogen Injection
|
||||
///////////////////////////////////////////////////////////////
|
||||
/*
|
||||
if(get_sensor_data("pressure") < 100)
|
||||
injector_on()
|
||||
else
|
||||
if(get_sensor_data("pressure") > 5000)
|
||||
injector_off()
|
||||
*/
|
||||
var/datum/automation/if_statement/if_off=new(src)
|
||||
|
||||
var/datum/automation/set_injector_power/inj_on=new(src)
|
||||
inj_on.injector=n2_injector_tag
|
||||
inj_on.state=1
|
||||
|
||||
var/datum/automation/set_injector_power/inj_off=new(src)
|
||||
inj_off.injector=n2_injector_tag
|
||||
inj_off.state=0
|
||||
|
||||
var/datum/automation/if_statement/if_on = new (src)
|
||||
if_on.label = "Nitrogen Injection"
|
||||
if_on.condition = MakeCompare(
|
||||
var/datum/automation/or/or_off=new(src)
|
||||
or_off.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(100),
|
||||
"Less Than"
|
||||
)
|
||||
if_on.children_then.Add(inj_on)
|
||||
|
||||
|
||||
var/datum/automation/if_statement/if_off=new(src)
|
||||
if_off.condition=MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(5000),
|
||||
"Greater Than"
|
||||
)
|
||||
or_off.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"oxygen"),
|
||||
MakeNumber(20),
|
||||
"Less Than"
|
||||
)
|
||||
if_off.children_then.Add(inj_off)
|
||||
)
|
||||
if_off.condition=or_off
|
||||
if_off.children_then.Add(vp_off)
|
||||
|
||||
if_on.children_else.Add(if_off)
|
||||
if_on.children_else.Add(if_off)
|
||||
|
||||
automations += if_on
|
||||
|
||||
proc/buildOutletVent()
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Outlet Management
|
||||
///////////////////////////////////////////////////////////////
|
||||
/*
|
||||
if(get_sensor_data("pressure") >= 5000 && get_sensor_data("oxygen") >= 20)
|
||||
vent_on()
|
||||
else
|
||||
if(get_sensor_data("oxygen") < 20 || get_sensor_data("pressure") < 100)
|
||||
vent_off()
|
||||
*/
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_on=new(src)
|
||||
vp_on.vent_pump=output_tag
|
||||
vp_on.state=1
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_off=new(src)
|
||||
vp_off.vent_pump=output_tag
|
||||
vp_off.state=0
|
||||
|
||||
var/datum/automation/if_statement/if_on=new(src)
|
||||
if_on.label="Air Output"
|
||||
|
||||
var/datum/automation/and/and_on=new(src)
|
||||
and_on.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(5000),
|
||||
"Greater Than or Equal to"
|
||||
)
|
||||
)
|
||||
and_on.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"oxygen"),
|
||||
MakeNumber(20),
|
||||
"Greater Than or Equal to"
|
||||
)
|
||||
)
|
||||
if_on.condition=and_on
|
||||
if_on.children_then.Add(vp_on)
|
||||
|
||||
//////////////////////////////
|
||||
|
||||
var/datum/automation/if_statement/if_off=new(src)
|
||||
|
||||
var/datum/automation/or/or_off=new(src)
|
||||
or_off.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(100),
|
||||
"Less Than"
|
||||
)
|
||||
)
|
||||
or_off.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"oxygen"),
|
||||
MakeNumber(20),
|
||||
"Less Than"
|
||||
)
|
||||
)
|
||||
if_off.condition=or_off
|
||||
if_off.children_then.Add(vp_off)
|
||||
|
||||
if_on.children_else.Add(if_off)
|
||||
|
||||
automations += if_on
|
||||
automations += if_on
|
||||
|
||||
@@ -13,14 +13,14 @@ var/list/spawntypes = list()
|
||||
var/list/restrict_job = null
|
||||
var/list/disallow_job = null
|
||||
|
||||
proc/check_job_spawning(job)
|
||||
if(restrict_job && !(job in restrict_job))
|
||||
return 0
|
||||
/datum/spawnpoint/proc/check_job_spawning(job)
|
||||
if(restrict_job && !(job in restrict_job))
|
||||
return 0
|
||||
|
||||
if(disallow_job && (job in disallow_job))
|
||||
return 0
|
||||
if(disallow_job && (job in disallow_job))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
/datum/spawnpoint/arrivals
|
||||
display_name = "Arrivals Shuttle"
|
||||
@@ -54,4 +54,4 @@ var/list/spawntypes = list()
|
||||
|
||||
/datum/spawnpoint/cyborg/New()
|
||||
..()
|
||||
turfs = latejoin_cyborg
|
||||
turfs = latejoin_cyborg
|
||||
|
||||
@@ -22,104 +22,235 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
|
||||
var/askDelay = 10 * 60 * 1 // One minute [ms * sec * min]
|
||||
|
||||
Topic(href, href_list[])
|
||||
if("signup" in href_list)
|
||||
var/mob/dead/observer/O = locate(href_list["signup"])
|
||||
if(!O) return
|
||||
if(!(O in GLOB.respawnable_list))
|
||||
to_chat(O, "You've given up your ability to respawn!")
|
||||
return
|
||||
if(!check_recruit(O)) return
|
||||
recruitWindow(O)
|
||||
/datum/paiController/Topic(href, href_list[])
|
||||
if("signup" in href_list)
|
||||
var/mob/dead/observer/O = locate(href_list["signup"])
|
||||
if(!O) return
|
||||
if(!(O in GLOB.respawnable_list))
|
||||
to_chat(O, "You've given up your ability to respawn!")
|
||||
return
|
||||
if(!check_recruit(O)) return
|
||||
recruitWindow(O)
|
||||
return
|
||||
|
||||
if(href_list["download"])
|
||||
var/datum/paiCandidate/candidate = locate(href_list["candidate"])
|
||||
var/obj/item/paicard/card = locate(href_list["device"])
|
||||
if(card.pai)
|
||||
if(href_list["download"])
|
||||
var/datum/paiCandidate/candidate = locate(href_list["candidate"])
|
||||
var/obj/item/paicard/card = locate(href_list["device"])
|
||||
if(card.pai)
|
||||
return
|
||||
if(usr.incapacitated() || isobserver(usr) || !card.Adjacent(usr))
|
||||
return
|
||||
if(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate))
|
||||
var/mob/living/silicon/pai/pai = new(card)
|
||||
if(!candidate.name)
|
||||
pai.name = pick(GLOB.ninja_names)
|
||||
else
|
||||
pai.name = candidate.name
|
||||
pai.real_name = pai.name
|
||||
pai.key = candidate.key
|
||||
|
||||
card.setPersonality(pai)
|
||||
card.looking_for_personality = 0
|
||||
|
||||
ticker.mode.update_cult_icons_removed(card.pai.mind)
|
||||
ticker.mode.update_rev_icons_removed(card.pai.mind)
|
||||
|
||||
pai_candidates -= candidate
|
||||
usr << browse(null, "window=findPai")
|
||||
|
||||
if(href_list["new"])
|
||||
var/datum/paiCandidate/candidate = locate(href_list["candidate"])
|
||||
var/option = href_list["option"]
|
||||
var/t = ""
|
||||
|
||||
switch(option)
|
||||
if("name")
|
||||
t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text
|
||||
if(t)
|
||||
candidate.name = sanitize(copytext(t,1,MAX_NAME_LEN))
|
||||
if("desc")
|
||||
t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message
|
||||
if(t)
|
||||
candidate.description = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
if("role")
|
||||
t = input("Enter a role for your pAI", "pAI Role", candidate.role) as text
|
||||
if(t)
|
||||
candidate.role = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
if("ooc")
|
||||
t = input("Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message
|
||||
if(t)
|
||||
candidate.comments = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
if("save")
|
||||
candidate.savefile_save(usr)
|
||||
if("load")
|
||||
candidate.savefile_load(usr)
|
||||
//In case people have saved unsanitized stuff.
|
||||
if(candidate.name)
|
||||
candidate.name = sanitize(copytext(candidate.name,1,MAX_NAME_LEN))
|
||||
if(candidate.description)
|
||||
candidate.description = sanitize(copytext(candidate.description,1,MAX_MESSAGE_LEN))
|
||||
if(candidate.role)
|
||||
candidate.role = sanitize(copytext(candidate.role,1,MAX_MESSAGE_LEN))
|
||||
if(candidate.comments)
|
||||
candidate.comments = sanitize(copytext(candidate.comments,1,MAX_MESSAGE_LEN))
|
||||
|
||||
if("submit")
|
||||
if(candidate)
|
||||
candidate.ready = 1
|
||||
for(var/obj/item/paicard/p in world)
|
||||
if(p.looking_for_personality == 1)
|
||||
p.alertUpdate()
|
||||
usr << browse(null, "window=paiRecruit")
|
||||
return
|
||||
if(usr.incapacitated() || isobserver(usr) || !card.Adjacent(usr))
|
||||
return
|
||||
if(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate))
|
||||
var/mob/living/silicon/pai/pai = new(card)
|
||||
if(!candidate.name)
|
||||
pai.name = pick(GLOB.ninja_names)
|
||||
else
|
||||
pai.name = candidate.name
|
||||
pai.real_name = pai.name
|
||||
pai.key = candidate.key
|
||||
recruitWindow(usr)
|
||||
|
||||
card.setPersonality(pai)
|
||||
card.looking_for_personality = 0
|
||||
|
||||
ticker.mode.update_cult_icons_removed(card.pai.mind)
|
||||
ticker.mode.update_rev_icons_removed(card.pai.mind)
|
||||
|
||||
pai_candidates -= candidate
|
||||
usr << browse(null, "window=findPai")
|
||||
|
||||
if(href_list["new"])
|
||||
var/datum/paiCandidate/candidate = locate(href_list["candidate"])
|
||||
var/option = href_list["option"]
|
||||
var/t = ""
|
||||
|
||||
switch(option)
|
||||
if("name")
|
||||
t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text
|
||||
if(t)
|
||||
candidate.name = reject_bad_name(sanitize(copytext(t,1,MAX_NAME_LEN)))
|
||||
if("desc")
|
||||
t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message
|
||||
if(t)
|
||||
candidate.description = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
if("role")
|
||||
t = input("Enter a role for your pAI", "pAI Role", candidate.role) as text
|
||||
if(t)
|
||||
candidate.role = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
if("ooc")
|
||||
t = input("Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message
|
||||
if(t)
|
||||
candidate.comments = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
if("save")
|
||||
candidate.savefile_save(usr)
|
||||
if("load")
|
||||
candidate.savefile_load(usr)
|
||||
//In case people have saved unsanitized stuff.
|
||||
if(candidate.name)
|
||||
candidate.name = reject_bad_name(sanitize(copytext(candidate.name,1,MAX_NAME_LEN)))
|
||||
if(candidate.description)
|
||||
candidate.description = sanitize(copytext(candidate.description,1,MAX_MESSAGE_LEN))
|
||||
if(candidate.role)
|
||||
candidate.role = sanitize(copytext(candidate.role,1,MAX_MESSAGE_LEN))
|
||||
if(candidate.comments)
|
||||
candidate.comments = sanitize(copytext(candidate.comments,1,MAX_MESSAGE_LEN))
|
||||
|
||||
if("submit")
|
||||
if(candidate)
|
||||
candidate.ready = 1
|
||||
for(var/obj/item/paicard/p in world)
|
||||
if(p.looking_for_personality == 1)
|
||||
p.alertUpdate()
|
||||
usr << browse(null, "window=paiRecruit")
|
||||
return
|
||||
recruitWindow(usr)
|
||||
|
||||
proc/recruitWindow(var/mob/M as mob)
|
||||
var/datum/paiCandidate/candidate
|
||||
for(var/datum/paiCandidate/c in pai_candidates)
|
||||
if(!istype(c) || !istype(M))
|
||||
break
|
||||
if(c.key == M.key)
|
||||
candidate = c
|
||||
if(!candidate)
|
||||
candidate = new /datum/paiCandidate()
|
||||
candidate.key = M.key
|
||||
pai_candidates.Add(candidate)
|
||||
/datum/paiController/proc/recruitWindow(var/mob/M as mob)
|
||||
var/datum/paiCandidate/candidate
|
||||
for(var/datum/paiCandidate/c in pai_candidates)
|
||||
if(!istype(c) || !istype(M))
|
||||
break
|
||||
if(c.key == M.key)
|
||||
candidate = c
|
||||
if(!candidate)
|
||||
candidate = new /datum/paiCandidate()
|
||||
candidate.key = M.key
|
||||
pai_candidates.Add(candidate)
|
||||
|
||||
|
||||
var/dat = ""
|
||||
dat += {"
|
||||
<style type="text/css">
|
||||
var/dat = ""
|
||||
dat += {"
|
||||
<style type="text/css">
|
||||
body {
|
||||
margin-top:5px;
|
||||
font-family:Verdana;
|
||||
color:white;
|
||||
font-size:13px;
|
||||
background-image:url('uiBackground.png');
|
||||
background-repeat:repeat-x;
|
||||
background-color:#272727;
|
||||
background-position:center top;
|
||||
}
|
||||
table {
|
||||
border-collapse:collapse;
|
||||
font-size:13px;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid #333333;
|
||||
}
|
||||
p.top {
|
||||
background-color: none;
|
||||
color: white;
|
||||
}
|
||||
tr.d0 td {
|
||||
background-color: #c0c0c0;
|
||||
color: black;
|
||||
border:0px;
|
||||
border: 1px solid #333333;
|
||||
}
|
||||
tr.d0 th {
|
||||
background-color: none;
|
||||
color: #4477E0;
|
||||
text-align:right;
|
||||
vertical-align:top;
|
||||
width:120px;
|
||||
border:0px;
|
||||
}
|
||||
tr.d1 td {
|
||||
background-color: #555555;
|
||||
color: white;
|
||||
}
|
||||
td.button {
|
||||
border: 1px solid #161616;
|
||||
background-color: #40628a;
|
||||
}
|
||||
td.desc {
|
||||
font-weight:bold;
|
||||
}
|
||||
a {
|
||||
color:#4477E0;
|
||||
}
|
||||
a.button {
|
||||
color:white;
|
||||
text-decoration: none;
|
||||
}
|
||||
</style>
|
||||
"}
|
||||
|
||||
dat += {"
|
||||
<body>
|
||||
<b><font size="3px">pAI Personality Configuration</font></b>
|
||||
<p class="top">Please configure your pAI personality's options. Remember, what you enter here could determine whether or not the user requesting a personality chooses you!</p>
|
||||
|
||||
<table>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=name;new=1;candidate=\ref[candidate]'>Name</a>:</th>
|
||||
<td class="desc">[candidate.name] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=desc;new=1;candidate=\ref[candidate]'>Description</a>:</th>
|
||||
<td class="desc">[candidate.description] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>What sort of pAI you typically play; your mannerisms, your quirks, etc. This can be as sparse or as detailed as you like.</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=role;new=1;candidate=\ref[candidate]'>Preferred Role</a>:</th>
|
||||
<td class="desc">[candidate.role] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here.</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=ooc;new=1;candidate=\ref[candidate]'>OOC Comments</a>:</th>
|
||||
<td class="desc">[candidate.comments] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>Anything you'd like to address specifically to the player reading this in an OOC manner. \"I prefer more serious RP.\", \"I'm still learning the interface!\", etc. Feel free to leave this blank if you want.</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<table>
|
||||
<tr>
|
||||
<td class="button">
|
||||
<a href='byond://?src=[UID()];option=save;new=1;candidate=\ref[candidate]' class="button">Save Personality</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="button">
|
||||
<a href='byond://?src=[UID()];option=load;new=1;candidate=\ref[candidate]' class="button">Load Personality</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table><br>
|
||||
<table>
|
||||
<td class="button"><a href='byond://?src=[UID()];option=submit;new=1;candidate=\ref[candidate]' class="button"><b><font size="4px">Submit Personality</font></b></a></td>
|
||||
</table><br>
|
||||
|
||||
</body>
|
||||
"}
|
||||
|
||||
M << browse(dat, "window=paiRecruit;size=580x580;")
|
||||
|
||||
/datum/paiController/proc/findPAI(var/obj/item/paicard/p, var/mob/user)
|
||||
requestRecruits(p, user)
|
||||
var/list/available = list()
|
||||
for(var/datum/paiCandidate/c in paiController.pai_candidates)
|
||||
if(c.ready)
|
||||
var/found = 0
|
||||
for(var/mob/o in GLOB.respawnable_list)
|
||||
if(o.key == c.key)
|
||||
found = 1
|
||||
if(found)
|
||||
available.Add(c)
|
||||
var/dat = ""
|
||||
|
||||
dat += {"
|
||||
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
margin-top:5px;
|
||||
font-family:Verdana;
|
||||
@@ -131,257 +262,126 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
background-position:center top;
|
||||
}
|
||||
table {
|
||||
border-collapse:collapse;
|
||||
font-size:13px;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid #333333;
|
||||
table.desc {
|
||||
border-collapse:collapse;
|
||||
font-size:13px;
|
||||
border: 1px solid #161616;
|
||||
width:100%;
|
||||
}
|
||||
p.top {
|
||||
background-color: none;
|
||||
table.download {
|
||||
border-collapse:collapse;
|
||||
font-size:13px;
|
||||
border: 1px solid #161616;
|
||||
width:100%;
|
||||
}
|
||||
tr.d0 td, tr.d0 th {
|
||||
background-color: #506070;
|
||||
color: white;
|
||||
}
|
||||
tr.d0 td {
|
||||
background-color: #c0c0c0;
|
||||
color: black;
|
||||
border:0px;
|
||||
border: 1px solid #333333;
|
||||
}
|
||||
tr.d0 th {
|
||||
background-color: none;
|
||||
color: #4477E0;
|
||||
text-align:right;
|
||||
vertical-align:top;
|
||||
width:120px;
|
||||
border:0px;
|
||||
}
|
||||
tr.d1 td {
|
||||
background-color: #555555;
|
||||
tr.d1 td, tr.d1 th {
|
||||
background-color: #708090;
|
||||
color: white;
|
||||
}
|
||||
tr.d2 td {
|
||||
background-color: #00FF00;
|
||||
color: white;
|
||||
text-align:center;
|
||||
}
|
||||
td.button {
|
||||
border: 1px solid #161616;
|
||||
background-color: #40628a;
|
||||
text-align: center;
|
||||
}
|
||||
td.desc {
|
||||
font-weight:bold;
|
||||
td.download {
|
||||
border: 1px solid #161616;
|
||||
background-color: #40628a;
|
||||
text-align: center;
|
||||
}
|
||||
a {
|
||||
color:#4477E0;
|
||||
th {
|
||||
text-align:left;
|
||||
width:125px;
|
||||
vertical-align:top;
|
||||
}
|
||||
a.button {
|
||||
color:white;
|
||||
text-decoration: none;
|
||||
}
|
||||
</style>
|
||||
"}
|
||||
</head>
|
||||
<body>
|
||||
<b><font size='3px'>pAI Availability List</font></b><br><br>
|
||||
"}
|
||||
dat += "<p>Displaying available AI personalities from central database... If there are no entries, or if a suitable entry is not listed, check again later as more personalities may be added.</p>"
|
||||
|
||||
for(var/datum/paiCandidate/c in available)
|
||||
dat += {"
|
||||
<body>
|
||||
<b><font size="3px">pAI Personality Configuration</font></b>
|
||||
<p class="top">Please configure your pAI personality's options. Remember, what you enter here could determine whether or not the user requesting a personality chooses you!</p>
|
||||
|
||||
<table>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=name;new=1;candidate=\ref[candidate]'>Name</a>:</th>
|
||||
<td class="desc">[candidate.name] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=desc;new=1;candidate=\ref[candidate]'>Description</a>:</th>
|
||||
<td class="desc">[candidate.description] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>What sort of pAI you typically play; your mannerisms, your quirks, etc. This can be as sparse or as detailed as you like.</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=role;new=1;candidate=\ref[candidate]'>Preferred Role</a>:</th>
|
||||
<td class="desc">[candidate.role] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here.</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th rowspan="2"><a href='byond://?src=[UID()];option=ooc;new=1;candidate=\ref[candidate]'>OOC Comments</a>:</th>
|
||||
<td class="desc">[candidate.comments] </td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<td>Anything you'd like to address specifically to the player reading this in an OOC manner. \"I prefer more serious RP.\", \"I'm still learning the interface!\", etc. Feel free to leave this blank if you want.</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<table>
|
||||
<tr>
|
||||
<td class="button">
|
||||
<a href='byond://?src=[UID()];option=save;new=1;candidate=\ref[candidate]' class="button">Save Personality</a>
|
||||
<table class="desc">
|
||||
<tr class="d0">
|
||||
<th>Name:</th>
|
||||
<td>[c.name]</td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<th>Description:</th>
|
||||
<td>[c.description]</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th>Preferred Role:</th>
|
||||
<td>[c.role]</td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<th>OOC Comments:</th>
|
||||
<td>[c.comments]</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table class="download">
|
||||
<td class="download"><a href='byond://?src=[UID()];download=1;candidate=\ref[c];device=\ref[p]' class="button"><b>Download [c.name]</b></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="button">
|
||||
<a href='byond://?src=[UID()];option=load;new=1;candidate=\ref[candidate]' class="button">Load Personality</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table><br>
|
||||
<table>
|
||||
<td class="button"><a href='byond://?src=[UID()];option=submit;new=1;candidate=\ref[candidate]' class="button"><b><font size="4px">Submit Personality</font></b></a></td>
|
||||
</table><br>
|
||||
|
||||
</body>
|
||||
</table>
|
||||
<br>
|
||||
"}
|
||||
|
||||
M << browse(dat, "window=paiRecruit;size=580x580;")
|
||||
dat += {"
|
||||
</body>
|
||||
</html>
|
||||
"}
|
||||
|
||||
proc/findPAI(var/obj/item/paicard/p, var/mob/user)
|
||||
requestRecruits(p, user)
|
||||
var/list/available = list()
|
||||
for(var/datum/paiCandidate/c in paiController.pai_candidates)
|
||||
if(c.ready)
|
||||
var/found = 0
|
||||
for(var/mob/o in GLOB.respawnable_list)
|
||||
if(o.key == c.key)
|
||||
found = 1
|
||||
if(found)
|
||||
available.Add(c)
|
||||
var/dat = ""
|
||||
user << browse(dat, "window=findPai")
|
||||
|
||||
dat += {"
|
||||
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
margin-top:5px;
|
||||
font-family:Verdana;
|
||||
color:white;
|
||||
font-size:13px;
|
||||
background-image:url('uiBackground.png');
|
||||
background-repeat:repeat-x;
|
||||
background-color:#272727;
|
||||
background-position:center top;
|
||||
}
|
||||
table {
|
||||
font-size:13px;
|
||||
}
|
||||
table.desc {
|
||||
border-collapse:collapse;
|
||||
font-size:13px;
|
||||
border: 1px solid #161616;
|
||||
width:100%;
|
||||
}
|
||||
table.download {
|
||||
border-collapse:collapse;
|
||||
font-size:13px;
|
||||
border: 1px solid #161616;
|
||||
width:100%;
|
||||
}
|
||||
tr.d0 td, tr.d0 th {
|
||||
background-color: #506070;
|
||||
color: white;
|
||||
}
|
||||
tr.d1 td, tr.d1 th {
|
||||
background-color: #708090;
|
||||
color: white;
|
||||
}
|
||||
tr.d2 td {
|
||||
background-color: #00FF00;
|
||||
color: white;
|
||||
text-align:center;
|
||||
}
|
||||
td.button {
|
||||
border: 1px solid #161616;
|
||||
background-color: #40628a;
|
||||
text-align: center;
|
||||
}
|
||||
td.download {
|
||||
border: 1px solid #161616;
|
||||
background-color: #40628a;
|
||||
text-align: center;
|
||||
}
|
||||
th {
|
||||
text-align:left;
|
||||
width:125px;
|
||||
vertical-align:top;
|
||||
}
|
||||
a.button {
|
||||
color:white;
|
||||
text-decoration: none;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<b><font size='3px'>pAI Availability List</font></b><br><br>
|
||||
"}
|
||||
dat += "<p>Displaying available AI personalities from central database... If there are no entries, or if a suitable entry is not listed, check again later as more personalities may be added.</p>"
|
||||
/datum/paiController/proc/requestRecruits(var/obj/item/paicard/P, mob/user)
|
||||
for(var/mob/dead/observer/O in GLOB.player_list)
|
||||
if(O.client && (ROLE_PAI in O.client.prefs.be_special))
|
||||
if(player_old_enough_antag(O.client,ROLE_PAI))
|
||||
if(check_recruit(O))
|
||||
to_chat(O, "<span class='boldnotice'>A pAI card activated by [user.real_name] is looking for personalities. (<a href='?src=[O.UID()];jump=\ref[P]'>Teleport</a> | <a href='?src=[UID()];signup=\ref[O]'>Sign Up</a>)</span>")
|
||||
//question(O.client)
|
||||
|
||||
for(var/datum/paiCandidate/c in available)
|
||||
dat += {"
|
||||
<table class="desc">
|
||||
<tr class="d0">
|
||||
<th>Name:</th>
|
||||
<td>[c.name]</td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<th>Description:</th>
|
||||
<td>[c.description]</td>
|
||||
</tr>
|
||||
<tr class="d0">
|
||||
<th>Preferred Role:</th>
|
||||
<td>[c.role]</td>
|
||||
</tr>
|
||||
<tr class="d1">
|
||||
<th>OOC Comments:</th>
|
||||
<td>[c.comments]</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table class="download">
|
||||
<td class="download"><a href='byond://?src=[UID()];download=1;candidate=\ref[c];device=\ref[p]' class="button"><b>Download [c.name]</b></a>
|
||||
</td>
|
||||
</table>
|
||||
<br>
|
||||
"}
|
||||
|
||||
dat += {"
|
||||
</body>
|
||||
</html>
|
||||
"}
|
||||
|
||||
user << browse(dat, "window=findPai")
|
||||
|
||||
proc/requestRecruits(var/obj/item/paicard/P, mob/user)
|
||||
for(var/mob/dead/observer/O in GLOB.player_list)
|
||||
if(O.client && (ROLE_PAI in O.client.prefs.be_special))
|
||||
if(player_old_enough_antag(O.client,ROLE_PAI))
|
||||
if(check_recruit(O))
|
||||
to_chat(O, "<span class='boldnotice'>A pAI card activated by [user.real_name] is looking for personalities. (<a href='?src=[O.UID()];jump=\ref[P]'>Teleport</a> | <a href='?src=[UID()];signup=\ref[O]'>Sign Up</a>)</span>")
|
||||
//question(O.client)
|
||||
|
||||
proc/check_recruit(var/mob/dead/observer/O)
|
||||
if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O,"nonhumandept"))
|
||||
return 0
|
||||
if(!player_old_enough_antag(O.client,ROLE_PAI))
|
||||
return 0
|
||||
if(cannotPossess(O))
|
||||
return 0
|
||||
if(!(O in GLOB.respawnable_list))
|
||||
return 0
|
||||
if(O.client)
|
||||
return 1
|
||||
/datum/paiController/proc/check_recruit(var/mob/dead/observer/O)
|
||||
if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O,"nonhumandept"))
|
||||
return 0
|
||||
if(!player_old_enough_antag(O.client,ROLE_PAI))
|
||||
return 0
|
||||
if(cannotPossess(O))
|
||||
return 0
|
||||
if(!(O in GLOB.respawnable_list))
|
||||
return 0
|
||||
if(O.client)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/question(var/client/C)
|
||||
spawn(0)
|
||||
if(!C) return
|
||||
asked.Add(C.key)
|
||||
asked[C.key] = world.time
|
||||
var/response = alert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round")
|
||||
if(!C) return //handle logouts that happen whilst the alert is waiting for a response.
|
||||
if(response == "Yes")
|
||||
recruitWindow(C.mob)
|
||||
else if(response == "Never for this round")
|
||||
var/warning = alert(C, "Are you sure? This action will be undoable and you will need to wait until next round.", "You sure?", "Yes", "No")
|
||||
if(warning == "Yes")
|
||||
asked[C.key] = INFINITY
|
||||
else
|
||||
question(C)
|
||||
/datum/paiController/proc/question(var/client/C)
|
||||
spawn(0)
|
||||
if(!C) return
|
||||
asked.Add(C.key)
|
||||
asked[C.key] = world.time
|
||||
var/response = alert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round")
|
||||
if(!C) return //handle logouts that happen whilst the alert is waiting for a response.
|
||||
if(response == "Yes")
|
||||
recruitWindow(C.mob)
|
||||
else if(response == "Never for this round")
|
||||
var/warning = alert(C, "Are you sure? This action will be undoable and you will need to wait until next round.", "You sure?", "Yes", "No")
|
||||
if(warning == "Yes")
|
||||
asked[C.key] = INFINITY
|
||||
else
|
||||
question(C)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
//proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
@@ -174,4 +174,4 @@
|
||||
"You announce you are operating in low power mode.")
|
||||
playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You can only use this emote when you're out of charge.</span>")
|
||||
to_chat(src, "<span class='warning'>You can only use this emote when you're out of charge.</span>")
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
//proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
@@ -69,4 +69,4 @@
|
||||
playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0)
|
||||
m_type = 2
|
||||
|
||||
..(act, m_type, message)
|
||||
..(act, m_type, message)
|
||||
|
||||
@@ -558,7 +558,7 @@
|
||||
if(M.ear_damage <= 25)
|
||||
if(prob(30))
|
||||
M.SetEarDeaf(0)
|
||||
..()
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/medicine/atropine
|
||||
name = "Atropine"
|
||||
|
||||
@@ -108,4 +108,37 @@
|
||||
icon_state = "pipette"
|
||||
amount_per_transfer_from_this = 1
|
||||
possible_transfer_amounts = list(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1)
|
||||
volume = 1
|
||||
volume = 1
|
||||
|
||||
//Syndicate item. Virus transmitting mini hypospray
|
||||
/obj/item/reagent_containers/dropper/precision/viral_injector
|
||||
|
||||
/obj/item/reagent_containers/dropper/precision/viral_injector/attack(mob/living/M, mob/living/user, def_zone)
|
||||
if(M.can_inject(user, 1))
|
||||
to_chat(user, "<span class='warning'>You stab [M] with the [src].</span>")
|
||||
if(reagents.total_volume && M.reagents)
|
||||
var/list/injected = list()
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
injected += R.name
|
||||
var/datum/reagent/blood/B = R
|
||||
|
||||
if(istype(B) && B.data["viruses"])
|
||||
var/virList = list()
|
||||
for(var/dis in B.data["viruses"])
|
||||
var/datum/disease/D = dis
|
||||
var/virusData = D.name
|
||||
var/english_symptoms = list()
|
||||
var/datum/disease/advance/A = D
|
||||
if(A)
|
||||
for(var/datum/symptom/S in A.symptoms)
|
||||
english_symptoms += S.name
|
||||
virusData += " ([english_list(english_symptoms)])"
|
||||
virList += virusData
|
||||
var/str = english_list(virList)
|
||||
add_attack_logs(user, M, "Infected with [str].")
|
||||
|
||||
reagents.reaction(M, INGEST, reagents.total_volume)
|
||||
reagents.trans_to(M, 1)
|
||||
|
||||
var/contained = english_list(injected)
|
||||
add_attack_logs(user, M, "Injected with [src] containing ([contained])")
|
||||
|
||||
+207
-234
@@ -511,154 +511,152 @@
|
||||
var/tomail = 0 //changes if contains wrapped package
|
||||
var/hasmob = 0 //If it contains a mob
|
||||
|
||||
Destroy()
|
||||
QDEL_NULL(gas)
|
||||
active = 0
|
||||
return ..()
|
||||
/obj/structure/disposalholder/Destroy()
|
||||
QDEL_NULL(gas)
|
||||
active = 0
|
||||
return ..()
|
||||
|
||||
// initialize a holder from the contents of a disposal unit
|
||||
proc/init(var/obj/machinery/disposal/D)
|
||||
gas = D.air_contents// transfer gas resv. into holder object
|
||||
/obj/structure/disposalholder/proc/init(var/obj/machinery/disposal/D)
|
||||
gas = D.air_contents// transfer gas resv. into holder object
|
||||
|
||||
//Check for any living mobs trigger hasmob.
|
||||
//hasmob effects whether the package goes to cargo or its tagged destination.
|
||||
for(var/mob/living/M in D)
|
||||
if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
|
||||
hasmob = 1
|
||||
//Check for any living mobs trigger hasmob.
|
||||
//hasmob effects whether the package goes to cargo or its tagged destination.
|
||||
for(var/mob/living/M in D)
|
||||
if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
|
||||
hasmob = 1
|
||||
|
||||
//Checks 1 contents level deep. This means that players can be sent through disposals...
|
||||
//...but it should require a second person to open the package. (i.e. person inside a wrapped locker)
|
||||
for(var/obj/O in D)
|
||||
if(O.contents)
|
||||
for(var/mob/living/M in O.contents)
|
||||
if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
|
||||
hasmob = 1
|
||||
//Checks 1 contents level deep. This means that players can be sent through disposals...
|
||||
//...but it should require a second person to open the package. (i.e. person inside a wrapped locker)
|
||||
for(var/obj/O in D)
|
||||
if(O.contents)
|
||||
for(var/mob/living/M in O.contents)
|
||||
if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
|
||||
hasmob = 1
|
||||
|
||||
// now everything inside the disposal gets put into the holder
|
||||
// note AM since can contain mobs or objs
|
||||
for(var/atom/movable/AM in D)
|
||||
AM.loc = src
|
||||
if(istype(AM, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(FAT in H.mutations) // is a human and fat?
|
||||
has_fat_guy = 1 // set flag on holder
|
||||
if(istype(AM, /obj/structure/bigDelivery) && !hasmob)
|
||||
var/obj/structure/bigDelivery/T = AM
|
||||
destinationTag = T.sortTag
|
||||
if(istype(AM, /obj/item/smallDelivery) && !hasmob)
|
||||
var/obj/item/smallDelivery/T = AM
|
||||
destinationTag = T.sortTag
|
||||
//Drones can mail themselves through maint.
|
||||
if(istype(AM, /mob/living/silicon/robot/drone))
|
||||
var/mob/living/silicon/robot/drone/drone = AM
|
||||
destinationTag = drone.mail_destination
|
||||
if(istype(AM, /obj/item/shippingPackage) && !hasmob)
|
||||
var/obj/item/shippingPackage/sp = AM
|
||||
if(sp.sealed) //only sealed packages get delivered to their intended destination
|
||||
destinationTag = sp.sortTag
|
||||
// now everything inside the disposal gets put into the holder
|
||||
// note AM since can contain mobs or objs
|
||||
for(var/atom/movable/AM in D)
|
||||
AM.loc = src
|
||||
if(istype(AM, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(FAT in H.mutations) // is a human and fat?
|
||||
has_fat_guy = 1 // set flag on holder
|
||||
if(istype(AM, /obj/structure/bigDelivery) && !hasmob)
|
||||
var/obj/structure/bigDelivery/T = AM
|
||||
destinationTag = T.sortTag
|
||||
if(istype(AM, /obj/item/smallDelivery) && !hasmob)
|
||||
var/obj/item/smallDelivery/T = AM
|
||||
destinationTag = T.sortTag
|
||||
//Drones can mail themselves through maint.
|
||||
if(istype(AM, /mob/living/silicon/robot/drone))
|
||||
var/mob/living/silicon/robot/drone/drone = AM
|
||||
destinationTag = drone.mail_destination
|
||||
if(istype(AM, /obj/item/shippingPackage) && !hasmob)
|
||||
var/obj/item/shippingPackage/sp = AM
|
||||
if(sp.sealed) //only sealed packages get delivered to their intended destination
|
||||
destinationTag = sp.sortTag
|
||||
|
||||
|
||||
// start the movement process
|
||||
// argument is the disposal unit the holder started in
|
||||
proc/start(var/obj/machinery/disposal/D)
|
||||
if(!D.trunk)
|
||||
D.expel(src) // no trunk connected, so expel immediately
|
||||
return
|
||||
|
||||
loc = D.trunk
|
||||
active = 1
|
||||
dir = DOWN
|
||||
spawn(1)
|
||||
move() // spawn off the movement process
|
||||
|
||||
/obj/structure/disposalholder/proc/start(var/obj/machinery/disposal/D)
|
||||
if(!D.trunk)
|
||||
D.expel(src) // no trunk connected, so expel immediately
|
||||
return
|
||||
|
||||
loc = D.trunk
|
||||
active = 1
|
||||
dir = DOWN
|
||||
spawn(1)
|
||||
move() // spawn off the movement process
|
||||
|
||||
return
|
||||
|
||||
// movement process, persists while holder is moving through pipes
|
||||
proc/move()
|
||||
var/obj/structure/disposalpipe/last
|
||||
while(active)
|
||||
/* if(hasmob && prob(3))
|
||||
for(var/mob/living/H in src)
|
||||
if(!istype(H,/mob/living/silicon/robot/drone)) //Drones use the mailing code to move through the disposal system,
|
||||
H.take_overall_damage(20, 0, TRUE, "Blunt Trauma") */ //horribly maim any living creature jumping down disposals. c'est la vie
|
||||
/obj/structure/disposalholder/proc/move()
|
||||
var/obj/structure/disposalpipe/last
|
||||
while(active)
|
||||
/* if(hasmob && prob(3))
|
||||
for(var/mob/living/H in src)
|
||||
if(!istype(H,/mob/living/silicon/robot/drone)) //Drones use the mailing code to move through the disposal system,
|
||||
H.take_overall_damage(20, 0, "Blunt Trauma") */ //horribly maim any living creature jumping down disposals. c'est la vie
|
||||
|
||||
if(has_fat_guy && prob(2)) // chance of becoming stuck per segment if contains a fat guy
|
||||
active = 0
|
||||
// find the fat guys
|
||||
for(var/mob/living/carbon/human/H in src)
|
||||
if(has_fat_guy && prob(2)) // chance of becoming stuck per segment if contains a fat guy
|
||||
active = 0
|
||||
// find the fat guys
|
||||
for(var/mob/living/carbon/human/H in src)
|
||||
|
||||
break
|
||||
sleep(1) // was 1
|
||||
var/obj/structure/disposalpipe/curr = loc
|
||||
last = curr
|
||||
curr = curr.transfer(src)
|
||||
if(!curr)
|
||||
last.expel(src, loc, dir)
|
||||
break
|
||||
sleep(1) // was 1
|
||||
var/obj/structure/disposalpipe/curr = loc
|
||||
last = curr
|
||||
curr = curr.transfer(src)
|
||||
if(!curr)
|
||||
last.expel(src, loc, dir)
|
||||
|
||||
//
|
||||
if(!(count--))
|
||||
active = 0
|
||||
return
|
||||
//
|
||||
if(!(count--))
|
||||
active = 0
|
||||
return
|
||||
|
||||
|
||||
|
||||
// find the turf which should contain the next pipe
|
||||
proc/nextloc()
|
||||
return get_step(loc,dir)
|
||||
/obj/structure/disposalholder/proc/nextloc()
|
||||
return get_step(loc,dir)
|
||||
|
||||
// find a matching pipe on a turf
|
||||
proc/findpipe(var/turf/T)
|
||||
|
||||
if(!T)
|
||||
return null
|
||||
|
||||
var/fdir = turn(dir, 180) // flip the movement direction
|
||||
for(var/obj/structure/disposalpipe/P in T)
|
||||
if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir
|
||||
return P
|
||||
// if no matching pipe, return null
|
||||
/obj/structure/disposalholder/proc/findpipe(var/turf/T)
|
||||
if(!T)
|
||||
return null
|
||||
|
||||
var/fdir = turn(dir, 180) // flip the movement direction
|
||||
for(var/obj/structure/disposalpipe/P in T)
|
||||
if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir
|
||||
return P
|
||||
// if no matching pipe, return null
|
||||
return null
|
||||
|
||||
// merge two holder objects
|
||||
// used when a a holder meets a stuck holder
|
||||
proc/merge(var/obj/structure/disposalholder/other)
|
||||
for(var/atom/movable/AM in other)
|
||||
AM.loc = src // move everything in other holder to this one
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(M.client) // if a client mob, update eye to follow this holder
|
||||
M.client.eye = src
|
||||
/obj/structure/disposalholder/proc/merge(var/obj/structure/disposalholder/other)
|
||||
for(var/atom/movable/AM in other)
|
||||
AM.loc = src // move everything in other holder to this one
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(M.client) // if a client mob, update eye to follow this holder
|
||||
M.client.eye = src
|
||||
|
||||
if(other.has_fat_guy)
|
||||
has_fat_guy = 1
|
||||
qdel(other)
|
||||
if(other.has_fat_guy)
|
||||
has_fat_guy = 1
|
||||
qdel(other)
|
||||
|
||||
|
||||
// called when player tries to move while in a pipe
|
||||
relaymove(mob/user as mob)
|
||||
/obj/structure/disposalholder/relaymove(mob/user as mob)
|
||||
if(!istype(user,/mob/living))
|
||||
return
|
||||
|
||||
if(!istype(user,/mob/living))
|
||||
return
|
||||
var/mob/living/U = user
|
||||
|
||||
var/mob/living/U = user
|
||||
if(U.stat || U.last_special <= world.time)
|
||||
return
|
||||
|
||||
if(U.stat || U.last_special <= world.time)
|
||||
return
|
||||
U.last_special = world.time+100
|
||||
|
||||
U.last_special = world.time+100
|
||||
if(src.loc)
|
||||
for(var/mob/M in hearers(src.loc.loc))
|
||||
to_chat(M, "<FONT size=[max(0, 5 - get_dist(src, M))]>CLONG, clong!</FONT>")
|
||||
|
||||
if(src.loc)
|
||||
for(var/mob/M in hearers(src.loc.loc))
|
||||
to_chat(M, "<FONT size=[max(0, 5 - get_dist(src, M))]>CLONG, clong!</FONT>")
|
||||
|
||||
playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0)
|
||||
playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0)
|
||||
|
||||
// called to vent all gas in holder to a location
|
||||
proc/vent_gas(var/atom/location)
|
||||
if(location)
|
||||
location.assume_air(gas) // vent all gas to turf
|
||||
air_update_turf()
|
||||
return
|
||||
/obj/structure/disposalholder/proc/vent_gas(var/atom/location)
|
||||
if(location)
|
||||
location.assume_air(gas) // vent all gas to turf
|
||||
air_update_turf()
|
||||
return
|
||||
|
||||
// Disposal pipes
|
||||
|
||||
@@ -1000,44 +998,44 @@
|
||||
var/negdir = 0
|
||||
var/sortdir = 0
|
||||
|
||||
proc/updatedesc()
|
||||
desc = "An underfloor disposal pipe with a package sorting mechanism."
|
||||
if(sortType>0)
|
||||
var/tag = uppertext(GLOB.TAGGERLOCATIONS[sortType])
|
||||
desc += "\nIt's tagged with [tag]"
|
||||
/obj/structure/disposalpipe/sortjunction/proc/updatedesc()
|
||||
desc = "An underfloor disposal pipe with a package sorting mechanism."
|
||||
if(sortType>0)
|
||||
var/tag = uppertext(GLOB.TAGGERLOCATIONS[sortType])
|
||||
desc += "\nIt's tagged with [tag]"
|
||||
|
||||
proc/updatedir()
|
||||
posdir = dir
|
||||
negdir = turn(posdir, 180)
|
||||
/obj/structure/disposalpipe/sortjunction/proc/updatedir()
|
||||
posdir = dir
|
||||
negdir = turn(posdir, 180)
|
||||
|
||||
if(icon_state == "pipe-j1s")
|
||||
sortdir = turn(posdir, -90)
|
||||
else
|
||||
icon_state = "pipe-j2s"
|
||||
sortdir = turn(posdir, 90)
|
||||
if(icon_state == "pipe-j1s")
|
||||
sortdir = turn(posdir, -90)
|
||||
else
|
||||
icon_state = "pipe-j2s"
|
||||
sortdir = turn(posdir, 90)
|
||||
|
||||
dpdir = sortdir | posdir | negdir
|
||||
dpdir = sortdir | posdir | negdir
|
||||
|
||||
New()
|
||||
..()
|
||||
updatedir()
|
||||
updatedesc()
|
||||
update()
|
||||
/obj/structure/disposalpipe/sortjunction/New()
|
||||
..()
|
||||
updatedir()
|
||||
updatedesc()
|
||||
update()
|
||||
return
|
||||
|
||||
/obj/structure/disposalpipe/sortjunction/attackby(var/obj/item/I, var/mob/user, params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
attackby(var/obj/item/I, var/mob/user, params)
|
||||
if(..())
|
||||
return
|
||||
if(istype(I, /obj/item/destTagger))
|
||||
var/obj/item/destTagger/O = I
|
||||
|
||||
if(istype(I, /obj/item/destTagger))
|
||||
var/obj/item/destTagger/O = I
|
||||
|
||||
if(O.currTag > 0)// Tag set
|
||||
sortType = O.currTag
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
|
||||
var/tag = uppertext(GLOB.TAGGERLOCATIONS[O.currTag])
|
||||
to_chat(user, "<span class='notice'>Changed filter to [tag]</span>")
|
||||
updatedesc()
|
||||
if(O.currTag > 0)// Tag set
|
||||
sortType = O.currTag
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
|
||||
var/tag = uppertext(GLOB.TAGGERLOCATIONS[O.currTag])
|
||||
to_chat(user, "<span class='notice'>Changed filter to [tag]</span>")
|
||||
updatedesc()
|
||||
|
||||
|
||||
// next direction to move
|
||||
@@ -1045,61 +1043,59 @@
|
||||
// if coming in from posdir, then flip around and go back to posdir
|
||||
// if coming in from sortdir, go to posdir
|
||||
|
||||
nextdir(var/fromdir, var/sortTag)
|
||||
//var/flipdir = turn(fromdir, 180)
|
||||
if(fromdir != sortdir) // probably came from the negdir
|
||||
/obj/structure/disposalpipe/sortjunction/nextdir(var/fromdir, var/sortTag)
|
||||
//var/flipdir = turn(fromdir, 180)
|
||||
if(fromdir != sortdir) // probably came from the negdir
|
||||
|
||||
if(src.sortType == sortTag) //if destination matches filtered type...
|
||||
return sortdir // exit through sortdirection
|
||||
else
|
||||
return posdir
|
||||
else // came from sortdir
|
||||
// so go with the flow to positive direction
|
||||
if(src.sortType == sortTag) //if destination matches filtered type...
|
||||
return sortdir // exit through sortdirection
|
||||
else
|
||||
return posdir
|
||||
else // came from sortdir
|
||||
// so go with the flow to positive direction
|
||||
return posdir
|
||||
|
||||
transfer(var/obj/structure/disposalholder/H)
|
||||
var/nextdir = nextdir(H.dir, H.destinationTag)
|
||||
H.dir = nextdir
|
||||
var/turf/T = H.nextloc()
|
||||
var/obj/structure/disposalpipe/P = H.findpipe(T)
|
||||
/obj/structure/disposalpipe/sortjunction/transfer(var/obj/structure/disposalholder/H)
|
||||
var/nextdir = nextdir(H.dir, H.destinationTag)
|
||||
H.dir = nextdir
|
||||
var/turf/T = H.nextloc()
|
||||
var/obj/structure/disposalpipe/P = H.findpipe(T)
|
||||
|
||||
if(P)
|
||||
// find other holder in next loc, if inactive merge it with current
|
||||
var/obj/structure/disposalholder/H2 = locate() in P
|
||||
if(H2 && !H2.active)
|
||||
H.merge(H2)
|
||||
if(P)
|
||||
// find other holder in next loc, if inactive merge it with current
|
||||
var/obj/structure/disposalholder/H2 = locate() in P
|
||||
if(H2 && !H2.active)
|
||||
H.merge(H2)
|
||||
H.loc = P
|
||||
else // if wasn't a pipe, then set loc to turf
|
||||
H.loc = T
|
||||
return null
|
||||
|
||||
H.loc = P
|
||||
else // if wasn't a pipe, then set loc to turf
|
||||
H.loc = T
|
||||
return null
|
||||
|
||||
return P
|
||||
return P
|
||||
|
||||
|
||||
//a three-way junction that sorts objects destined for the mail office mail table (tomail = 1)
|
||||
/obj/structure/disposalpipe/wrapsortjunction
|
||||
|
||||
desc = "An underfloor disposal pipe which sorts wrapped and unwrapped objects."
|
||||
icon_state = "pipe-j1s"
|
||||
var/posdir = 0
|
||||
var/negdir = 0
|
||||
var/sortdir = 0
|
||||
|
||||
New()
|
||||
..()
|
||||
posdir = dir
|
||||
if(icon_state == "pipe-j1s")
|
||||
sortdir = turn(posdir, -90)
|
||||
negdir = turn(posdir, 180)
|
||||
else
|
||||
icon_state = "pipe-j2s"
|
||||
sortdir = turn(posdir, 90)
|
||||
negdir = turn(posdir, 180)
|
||||
dpdir = sortdir | posdir | negdir
|
||||
/obj/structure/disposalpipe/wrapsortjunction/New()
|
||||
..()
|
||||
posdir = dir
|
||||
if(icon_state == "pipe-j1s")
|
||||
sortdir = turn(posdir, -90)
|
||||
negdir = turn(posdir, 180)
|
||||
else
|
||||
icon_state = "pipe-j2s"
|
||||
sortdir = turn(posdir, 90)
|
||||
negdir = turn(posdir, 180)
|
||||
dpdir = sortdir | posdir | negdir
|
||||
|
||||
update()
|
||||
return
|
||||
update()
|
||||
return
|
||||
|
||||
|
||||
// next direction to move
|
||||
@@ -1107,40 +1103,34 @@
|
||||
// if coming in from posdir, then flip around and go back to posdir
|
||||
// if coming in from sortdir, go to posdir
|
||||
|
||||
nextdir(var/fromdir, var/istomail)
|
||||
//var/flipdir = turn(fromdir, 180)
|
||||
if(fromdir != sortdir) // probably came from the negdir
|
||||
|
||||
if(istomail) //if destination matches filtered type...
|
||||
return sortdir // exit through sortdirection
|
||||
else
|
||||
return posdir
|
||||
else // came from sortdir
|
||||
// so go with the flow to positive direction
|
||||
/obj/structure/disposalpipe/wrapsortjunction/nextdir(var/fromdir, var/istomail)
|
||||
//var/flipdir = turn(fromdir, 180)
|
||||
if(fromdir != sortdir) // probably came from the negdir
|
||||
if(istomail) //if destination matches filtered type...
|
||||
return sortdir // exit through sortdirection
|
||||
else
|
||||
return posdir
|
||||
else // came from sortdir
|
||||
return posdir // so go with the flow to positive direction
|
||||
|
||||
transfer(var/obj/structure/disposalholder/H)
|
||||
var/nextdir = nextdir(H.dir, H.tomail)
|
||||
H.dir = nextdir
|
||||
var/turf/T = H.nextloc()
|
||||
var/obj/structure/disposalpipe/P = H.findpipe(T)
|
||||
|
||||
if(P)
|
||||
// find other holder in next loc, if inactive merge it with current
|
||||
var/obj/structure/disposalholder/H2 = locate() in P
|
||||
if(H2 && !H2.active)
|
||||
H.merge(H2)
|
||||
|
||||
H.loc = P
|
||||
else // if wasn't a pipe, then set loc to turf
|
||||
H.loc = T
|
||||
return null
|
||||
|
||||
return P
|
||||
|
||||
/obj/structure/disposalpipe/wrapsortjunction/transfer(var/obj/structure/disposalholder/H)
|
||||
var/nextdir = nextdir(H.dir, H.tomail)
|
||||
H.dir = nextdir
|
||||
var/turf/T = H.nextloc()
|
||||
var/obj/structure/disposalpipe/P = H.findpipe(T)
|
||||
|
||||
if(P)
|
||||
// find other holder in next loc, if inactive merge it with current
|
||||
var/obj/structure/disposalholder/H2 = locate() in P
|
||||
if(H2 && !H2.active)
|
||||
H.merge(H2)
|
||||
|
||||
H.loc = P
|
||||
else // if wasn't a pipe, then set loc to turf
|
||||
H.loc = T
|
||||
return null
|
||||
|
||||
return P
|
||||
|
||||
//a trunk joining to a disposal bin or outlet on the same turf
|
||||
/obj/structure/disposalpipe/trunk
|
||||
@@ -1203,18 +1193,6 @@
|
||||
/obj/structure/disposalpipe/trunk/attackby(var/obj/item/I, var/mob/user, params)
|
||||
|
||||
//Disposal bins or chutes
|
||||
/*
|
||||
These shouldn't be required
|
||||
var/obj/machinery/disposal/D = locate() in src.loc
|
||||
if(D && D.anchored)
|
||||
return
|
||||
|
||||
//Disposal outlet
|
||||
var/obj/structure/disposaloutlet/O = locate() in src.loc
|
||||
if(O && O.anchored)
|
||||
return
|
||||
*/
|
||||
|
||||
//Disposal constructors
|
||||
var/obj/structure/disposalconstruct/C = locate() in src.loc
|
||||
if(C && C.anchored)
|
||||
@@ -1275,18 +1253,13 @@
|
||||
// i.e. will be treated as an empty turf
|
||||
desc = "A broken piece of disposal pipe."
|
||||
|
||||
New()
|
||||
..()
|
||||
update()
|
||||
return
|
||||
/obj/structure/disposalpipe/broken/New()
|
||||
..()
|
||||
update()
|
||||
return
|
||||
|
||||
// called when welded
|
||||
// for broken pipe, remove and turn into scrap
|
||||
|
||||
welded()
|
||||
// var/obj/item/scrap/S = new(src.loc)
|
||||
// S.set_components(200,0,0)
|
||||
qdel(src)
|
||||
/obj/structure/disposalpipe/broken/welded()
|
||||
qdel(src)
|
||||
|
||||
// the disposal outlet machine
|
||||
|
||||
|
||||
@@ -223,31 +223,31 @@
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
proc/openwindow(mob/user as mob)
|
||||
var/dat = "<tt><center><h1><b>TagMaster 2.2</b></h1></center>"
|
||||
/obj/item/destTagger/proc/openwindow(mob/user as mob)
|
||||
var/dat = "<tt><center><h1><b>TagMaster 2.2</b></h1></center>"
|
||||
|
||||
dat += "<table style='width:100%; padding:4px;'><tr>"
|
||||
for(var/i = 1, i <= GLOB.TAGGERLOCATIONS.len, i++)
|
||||
dat += "<td><a href='?src=[UID()];nextTag=[i]'>[GLOB.TAGGERLOCATIONS[i]]</a></td>"
|
||||
dat += "<table style='width:100%; padding:4px;'><tr>"
|
||||
for(var/i = 1, i <= GLOB.TAGGERLOCATIONS.len, i++)
|
||||
dat += "<td><a href='?src=[UID()];nextTag=[i]'>[GLOB.TAGGERLOCATIONS[i]]</a></td>"
|
||||
|
||||
if(i%4==0)
|
||||
dat += "</tr><tr>"
|
||||
if(i%4==0)
|
||||
dat += "</tr><tr>"
|
||||
|
||||
dat += "</tr></table><br>Current Selection: [currTag ? GLOB.TAGGERLOCATIONS[currTag] : "None"]</tt>"
|
||||
dat += "</tr></table><br>Current Selection: [currTag ? GLOB.TAGGERLOCATIONS[currTag] : "None"]</tt>"
|
||||
|
||||
user << browse(dat, "window=destTagScreen;size=450x350")
|
||||
onclose(user, "destTagScreen")
|
||||
user << browse(dat, "window=destTagScreen;size=450x350")
|
||||
onclose(user, "destTagScreen")
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
openwindow(user)
|
||||
return
|
||||
/obj/item/destTagger/attack_self(mob/user as mob)
|
||||
openwindow(user)
|
||||
return
|
||||
|
||||
Topic(href, href_list)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["nextTag"])
|
||||
var/n = text2num(href_list["nextTag"])
|
||||
src.currTag = n
|
||||
openwindow(usr)
|
||||
/obj/item/destTagger/Topic(href, href_list)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["nextTag"])
|
||||
var/n = text2num(href_list["nextTag"])
|
||||
src.currTag = n
|
||||
openwindow(usr)
|
||||
|
||||
/obj/machinery/disposal/deliveryChute
|
||||
name = "Delivery chute"
|
||||
|
||||
@@ -61,6 +61,10 @@
|
||||
<ul class="changes bgimages16">
|
||||
<li class="spellcheck">Fixed some formatting issues in post_equip.</li>
|
||||
</ul>
|
||||
<h3 class="author">Ansari updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Oculine processing should be less expensive now.</li>
|
||||
</ul>
|
||||
<h3 class="author">Desolate updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Refactors some reagent lists into global list</li>
|
||||
@@ -68,10 +72,18 @@
|
||||
<h3 class="author">Farie82 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Cyborgs can now refill welding tools and fire extinguishers using the recharging station</li>
|
||||
<li class="bugfix">Oculine now updates the blindness status correctly</li>
|
||||
<li class="rscadd">Added the Viral Injector. A virologist specific traitor item that acts like a sleepy pen but can transfer viruses. It's disguised as a functional pipette.</li>
|
||||
</ul>
|
||||
<h3 class="author">Purpose updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Moves Icon Smoothing to a Subsystem.</li>
|
||||
<li class="rscdel">Atom code will no longer track a list atoms, for literally zero reason.</li>
|
||||
<li class="spellcheck">Fixes grammatical error in the suit storage unit</li>
|
||||
</ul>
|
||||
<h3 class="author">Shazbot194 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">all north facing in hand icons for flags.</li>
|
||||
</ul>
|
||||
<h3 class="author">Squirgenheimer updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
@@ -86,12 +98,21 @@
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Final UI update was missed in Safe Refactor PR</li>
|
||||
</ul>
|
||||
<h3 class="author">name here updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Holodeck plating sprite is now back to the old one.</li>
|
||||
</ul>
|
||||
<h3 class="author">tigercat2000 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">We're going 512 boisssssssssssssss</li>
|
||||
</ul>
|
||||
<h3 class="author">variableundefined updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Improves the List free slots admin verb to show useful information.</li>
|
||||
<li class="bugfix">Cyborg hypospray's attack log message should no longer be reversed.</li>
|
||||
<li class="tweak">How containers work is now standardized in the back-end. There might be unexpected or odd bugs with containers and reagent transfer, please report them.</li>
|
||||
<li class="tweak">Minor refactor of revenant code.</li>
|
||||
<li class="bugfix">Some relative path & commented out code has been cleared up in code. Report unexpected issues.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">20 October 2018</h2>
|
||||
|
||||
@@ -7604,13 +7604,22 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
2018-10-21:
|
||||
Alonefromhell:
|
||||
- spellcheck: Fixed some formatting issues in post_equip.
|
||||
Ansari:
|
||||
- tweak: Oculine processing should be less expensive now.
|
||||
Desolate:
|
||||
- tweak: Refactors some reagent lists into global list
|
||||
Farie82:
|
||||
- tweak: Cyborgs can now refill welding tools and fire extinguishers using the recharging
|
||||
station
|
||||
- bugfix: Oculine now updates the blindness status correctly
|
||||
- rscadd: Added the Viral Injector. A virologist specific traitor item that acts
|
||||
like a sleepy pen but can transfer viruses. It's disguised as a functional pipette.
|
||||
Purpose:
|
||||
- tweak: Moves Icon Smoothing to a Subsystem.
|
||||
- rscdel: Atom code will no longer track a list atoms, for literally zero reason.
|
||||
- spellcheck: Fixes grammatical error in the suit storage unit
|
||||
Shazbot194:
|
||||
- bugfix: all north facing in hand icons for flags.
|
||||
Squirgenheimer:
|
||||
- bugfix: Explosive holoparasite booby traps will now behave better, such as correctly
|
||||
triggering on mobs
|
||||
@@ -7619,9 +7628,15 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
- rscdel: TG & BS12 sec-hardsuits in all dmis
|
||||
Warior4356:
|
||||
- bugfix: Final UI update was missed in Safe Refactor PR
|
||||
name here:
|
||||
- tweak: Holodeck plating sprite is now back to the old one.
|
||||
tigercat2000:
|
||||
- rscadd: We're going 512 boisssssssssssssss
|
||||
variableundefined:
|
||||
- tweak: Improves the List free slots admin verb to show useful information.
|
||||
- bugfix: Cyborg hypospray's attack log message should no longer be reversed.
|
||||
- tweak: How containers work is now standardized in the back-end. There might be
|
||||
unexpected or odd bugs with containers and reagent transfer, please report them.
|
||||
- tweak: Minor refactor of revenant code.
|
||||
- bugfix: Some relative path & commented out code has been cleared up in code. Report
|
||||
unexpected issues.
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 64 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 63 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 384 KiB After Width: | Height: | Size: 384 KiB |
Reference in New Issue
Block a user