From 309e3b04f62b64acf7dcf624a46323ed8d619f2d Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Fri, 17 Aug 2018 22:24:39 +0800 Subject: [PATCH 01/37] Clears up some relative pathing part 1 --- code/__HELPERS/icons.dm | 143 ++- code/_onclick/telekinesis.dm | 24 - .../helper_datums/construction_datum.dm | 413 +++--- code/datums/helper_datums/global_iterator.dm | 160 ++- code/datums/helper_datums/topic_input.dm | 88 +- code/game/area/Space Station 13 areas.dm | 17 - code/game/atoms.dm | 14 +- code/game/gamemodes/factions.dm | 6 +- code/game/machinery/atmo_control.dm | 1116 ++++++++--------- .../atmoalter/area_atmos_computer.dm | 268 ++-- code/game/machinery/atmoalter/canister.dm | 24 +- .../computer/syndicate_specops_shuttle.dm | 1 - code/game/machinery/deployable.dm | 204 +-- code/game/machinery/holosign.dm | 28 +- code/game/machinery/magnet.dm | 578 +++++---- code/game/machinery/syndicatebeacon.dm | 146 +-- code/game/machinery/telecomms/presets.dm | 8 +- code/game/mecha/mecha_parts.dm | 63 +- code/game/mecha/mecha_wreckage.dm | 182 +-- code/game/objects/effects/gibs.dm | 58 +- .../objects/effects/spawners/gibspawner.dm | 57 +- code/game/objects/items/bodybag.dm | 91 +- .../objects/items/devices/radio/beacon.dm | 7 +- code/game/objects/items/shooting_range.dm | 30 +- code/game/objects/items/weapons/caution.dm | 91 +- .../objects/items/weapons/dna_injector.dm | 321 +++-- .../objects/items/weapons/dnascrambler.dm | 96 +- .../items/weapons/grenades/chem_grenade.dm | 128 +- .../items/weapons/grenades/clowngrenade.dm | 64 +- .../items/weapons/grenades/custom_grenades.dm | 279 ++--- .../items/weapons/grenades/smokebomb.dm | 50 +- code/game/objects/items/weapons/lighters.dm | 3 +- code/game/objects/items/weapons/misc.dm | 30 +- .../objects/items/weapons/storage/backpack.dm | 7 +- .../objects/items/weapons/storage/bags.dm | 190 +-- .../objects/items/weapons/storage/belt.dm | 50 +- code/modules/atmos_automation/console.dm | 734 +++++------ .../preference/preferences_spawnpoints.dm | 14 +- .../modules/mob/living/silicon/pai/recruit.dm | 632 +++++----- .../modules/mob/living/silicon/robot/emote.dm | 4 +- .../mob/living/simple_animal/bot/emote.dm | 4 +- code/modules/recycling/disposal.dm | 441 +++---- code/modules/recycling/sortingmachinery.dm | 38 +- 43 files changed, 3388 insertions(+), 3514 deletions(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 96109186359..04fc2c6f73c 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -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. diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 5ab67ffb611..238ce2d5a94 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -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 - -*/ diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 127e7baa892..8cc1bdc27d8 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -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, ("There's not enough cable to finish the task.")) + 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, ("There's not enough material in this stack.")) + 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, "You don't have enough cable! You need at least [amount] coils.") 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, ("There's not enough cable to finish the task.")) + // WELDER + if(istype(used_atom,/obj/item/weldingtool)) + var/obj/item/weldingtool/welder=used_atom + if(!welder.isOn()) + to_chat(user, "You tap the [src] with your unlit welder. [pick("Ding","Dong")].") 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, ("There's not enough material in this stack.")) + if(!welder.remove_fuel(amount,user)) + to_chat(user, "You don't have enough fuel!") 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, "You don't have enough cable! You need at least [amount] coils.") - return 0 - // WELDER - if(istype(used_atom,/obj/item/weldingtool)) - var/obj/item/weldingtool/welder=used_atom - if(!welder.isOn()) - to_chat(user, "You tap the [src] with your unlit welder. [pick("Ding","Dong")].") - return 0 - if(!welder.remove_fuel(amount,user)) - to_chat(user, "You don't have enough fuel!") - return 0 - // STACKS - if(istype(used_atom,/obj/item/stack)) - var/obj/item/stack/stack=used_atom - if(stack.amount < amount) - to_chat(user, "You don't have enough [stack]! You need at least [amount].") - 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, "You don't have enough [stack]! You need at least [amount].") + 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) diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index e3f22e2a3e2..fdba9542412 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -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, "Invalid arguments supplied for [src.type], ref = \ref[src]") - 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() diff --git a/code/datums/helper_datums/topic_input.dm b/code/datums/helper_datums/topic_input.dm index 17dd3f1266e..8090a5221eb 100644 --- a/code/datums/helper_datums/topic_input.dm +++ b/code/datums/helper_datums/topic_input.dm @@ -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 \ No newline at end of file +/datum/topic_input/proc/getList(i) + var/t = getAndLocate(i) + return islist(t) ? t : null diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 068fe991a9d..49bc85959f5 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -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" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 47f28d0ae5b..87038749989 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -204,16 +204,8 @@ /atom/proc/is_open_container() return flags & OPENCONTAINER -/*//Convenience proc to see whether a container can be accessed in a certain way. - - proc/can_subract_container() - return flags & EXTRACT_CONTAINER - - proc/can_add_container() - return flags & INSERT_CONTAINER -*/ - - +/atom/proc/allow_drop() + return 1 /atom/proc/CheckExit() return 1 @@ -729,4 +721,4 @@ var/list/blood_splatter_icons = list() var/atom/L = loc if(!L) return null - return L.AllowDrop() ? L : get_turf(L) \ No newline at end of file + return L.AllowDrop() ? L : get_turf(L) diff --git a/code/game/gamemodes/factions.dm b/code/game/gamemodes/factions.dm index 1c043ff5f7e..1780881a51d 100644 --- a/code/game/gamemodes/factions.dm +++ b/code/game/gamemodes/factions.dm @@ -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 Exolitics 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." \ No newline at end of file + 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." diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index b6586d3c90a..96f0f76fb9b 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -1,4 +1,4 @@ -obj/machinery/air_sensor +/obj/machinery/air_sensor icon = 'icons/obj/stationobjs.dmi' icon_state = "gsensor1" name = "gas sensor" @@ -26,118 +26,116 @@ obj/machinery/air_sensor var/datum/radio_frequency/radio_connection - update_icon() - icon_state = "gsensor[on]" +/obj/machinery/air_sensor/update_icon() + icon_state = "gsensor[on]" - multitool_menu(var/mob/user, var/obj/item/multitool/P) - return {" - Main - "} +/obj/machinery/air_sensor/multitool_menu(var/mob/user, var/obj/item/multitool/P) + return {" + Main + "} - multitool_topic(var/mob/user, var/list/href_list, var/obj/O) - . = ..() - if(.) - return . +/obj/machinery/air_sensor/multitool_topic(var/mob/user, var/list/href_list, var/obj/O) + . = ..() + if(.) + return . - if("toggle_out_flag" in href_list) - var/bitflag_value = text2num(href_list["toggle_out_flag"])//this is a string normally - if(!(bitflag_value in list(1, 2, 4, 8, 16, 32))) //Here to prevent breaking the sensors with HREF exploits - return 0 - if(output&bitflag_value)//the bitflag is on ATM - output &= ~bitflag_value - else//can't not be off - output |= bitflag_value - return MT_UPDATE - if("toggle_bolts" in href_list) - bolts = !bolts - if(bolts) - visible_message("You hear a quite click as the [src] bolts to the floor", "You hear a quite click") + if("toggle_out_flag" in href_list) + var/bitflag_value = text2num(href_list["toggle_out_flag"])//this is a string normally + if(!(bitflag_value in list(1, 2, 4, 8, 16, 32))) //Here to prevent breaking the sensors with HREF exploits + return 0 + if(output&bitflag_value)//the bitflag is on ATM + output &= ~bitflag_value + else//can't not be off + output |= bitflag_value + return MT_UPDATE + if("toggle_bolts" in href_list) + bolts = !bolts + if(bolts) + visible_message("You hear a quite click as the [src] bolts to the floor", "You hear a quite click") + else + visible_message("You hear a quite click as the [src]'s floor bolts raise", "You hear a quite click") + return MT_UPDATE + +/obj/machinery/air_sensor/attackby(var/obj/item/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/multitool)) + update_multitool_menu(user) + return 1 + if(istype(W, /obj/item/wrench)) + if(bolts) + to_chat(usr, "The [src] is bolted to the floor! You can't detach it like this.") + return 1 + playsound(loc, W.usesound, 50, 1) + to_chat(user, "You begin to unfasten \the [src]...") + if(do_after(user, 40 * W.toolspeed, target = src)) + user.visible_message("[user] unfastens \the [src].", "You have unfastened \the [src].", "You hear ratchet.") + new /obj/item/pipe_gsensor(src.loc) + qdel(src) + return 1 + if(..()) + return 1 + +/obj/machinery/air_sensor/process_atmos() + if(on) + if(!radio_connection) + return + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.data["tag"] = id_tag + signal.data["timestamp"] = world.time + + var/datum/gas_mixture/air_sample = return_air() + + if(output&1) + signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1),) + if(output&2) + signal.data["temperature"] = round(air_sample.temperature,0.1) + + if(output>4) + var/total_moles = air_sample.total_moles() + if(total_moles > 0) + if(output&4) + signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1) + if(output&8) + signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1) + if(output&16) + signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1) + if(output&32) + signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1) else - visible_message("You hear a quite click as the [src]'s floor bolts raise", "You hear a quite click") - return MT_UPDATE + signal.data["oxygen"] = 0 + signal.data["toxins"] = 0 + signal.data["nitrogen"] = 0 + signal.data["carbon_dioxide"] = 0 + signal.data["sigtype"]="status" + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - attackby(var/obj/item/W as obj, var/mob/user as mob) - if(istype(W, /obj/item/multitool)) - update_multitool_menu(user) - return 1 - if(istype(W, /obj/item/wrench)) - if(bolts) - to_chat(usr, "The [src] is bolted to the floor! You can't detach it like this.") - return 1 - playsound(loc, W.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src]...") - if(do_after(user, 40 * W.toolspeed, target = src)) - user.visible_message("[user] unfastens \the [src].", "You have unfastened \the [src].", "You hear ratchet.") - new /obj/item/pipe_gsensor(src.loc) - qdel(src) - return 1 - if(..()) - return 1 +/obj/machinery/air_sensor/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - process_atmos() - if(on) - if(!radio_connection) - return - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.data["tag"] = id_tag - signal.data["timestamp"] = world.time +/obj/machinery/air_sensor/Initialize() + ..() + SSair.atmos_machinery += src + set_frequency(frequency) - var/datum/gas_mixture/air_sample = return_air() - - if(output&1) - signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1),) - if(output&2) - signal.data["temperature"] = round(air_sample.temperature,0.1) - - if(output>4) - var/total_moles = air_sample.total_moles() - if(total_moles > 0) - if(output&4) - signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1) - if(output&8) - signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1) - if(output&16) - signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1) - if(output&32) - signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1) - else - signal.data["oxygen"] = 0 - signal.data["toxins"] = 0 - signal.data["nitrogen"] = 0 - signal.data["carbon_dioxide"] = 0 - signal.data["sigtype"]="status" - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - - Initialize() - ..() - SSair.atmos_machinery += src - set_frequency(frequency) - - Destroy() - SSair.atmos_machinery -= src - if(radio_controller) - radio_controller.remove_object(src, frequency) - radio_connection = null - return ..() +/obj/machinery/air_sensor/Destroy() + SSair.atmos_machinery -= src + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() /obj/machinery/computer/general_air_control @@ -157,325 +155,322 @@ obj/machinery/air_sensor var/list/sensor_information = list() var/datum/radio_frequency/radio_connection - Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) - radio_connection = null - return ..() +/obj/machinery/computer/general_air_control/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() - attack_hand(mob/user) - if(..(user)) - return - var/html=return_text() - var/datum/browser/popup = new(user, "gac", name, 400, 400) - popup.set_content(html) - popup.open(0) - user.set_machine(src) - onclose(user, "gac") +/obj/machinery/computer/general_air_control/attack_hand(mob/user) + if(..(user)) + return + var/html=return_text() + var/datum/browser/popup = new(user, "gac", name, 400, 400) + popup.set_content(html) + popup.open(0) + user.set_machine(src) + onclose(user, "gac") - process() - ..() - if(!sensors) - //warning("[src.type] at [x],[y],[z] has null sensors. Please fix.")//commenting this line out because the admins will get a warning like this every time somebody builds another GAC - sensors = list() - src.updateUsrDialog() +/obj/machinery/computer/general_air_control/process() + ..() + if(!sensors) + //warning("[src.type] at [x],[y],[z] has null sensors. Please fix.")//commenting this line out because the admins will get a warning like this every time somebody builds another GAC + sensors = list() + src.updateUsrDialog() - attackby(I as obj, user as mob, params) - if(istype(I, /obj/item/multitool)) - update_multitool_menu(user) - if(..()) - return 1 +/obj/machinery/computer/general_air_control/attackby(I as obj, user as mob, params) + if(istype(I, /obj/item/multitool)) + update_multitool_menu(user) + if(..()) + return 1 - receive_signal(datum/signal/signal) - if(!signal || signal.encryption) return +/obj/machinery/computer/general_air_control/receive_signal(datum/signal/signal) + if(!signal || signal.encryption) return - var/id_tag = signal.data["tag"] - if(!id_tag || !sensors || !sensors.Find(id_tag)) return + var/id_tag = signal.data["tag"] + if(!id_tag || !sensors || !sensors.Find(id_tag)) return - sensor_information[id_tag] = signal.data + sensor_information[id_tag] = signal.data - proc/return_text() - var/sensor_data - if(show_sensors) - if(sensors.len) - for(var/id_tag in sensors) - var/long_name = sensors[id_tag] - var/list/data = sensor_information[id_tag] - var/sensor_part = "
[long_name]" +/obj/machinery/computer/general_air_control/proc/return_text() + var/sensor_data + if(show_sensors) + if(sensors.len) + for(var/id_tag in sensors) + var/long_name = sensors[id_tag] + var/list/data = sensor_information[id_tag] + var/sensor_part = "
[long_name]" - if(data) - sensor_part += "" - if(data["pressure"]) - sensor_part += "" - if(data["temperature"]) - sensor_part += "" - if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"]) - sensor_part += "" - sensor_part += "
Pressure:[data["pressure"]] kPa
Temperature:[data["temperature"]] K
Gas Composition :
    " - if(data["oxygen"]) - sensor_part += "
  • [data["oxygen"]]% O2
  • " - if(data["nitrogen"]) - sensor_part += "
  • [data["nitrogen"]]% N
  • " - if(data["carbon_dioxide"]) - sensor_part += "
  • [data["carbon_dioxide"]]% CO2
  • " - if(data["toxins"]) - sensor_part += "
  • [data["toxins"]]% Plasma
  • " - sensor_part += "
" + if(data) + sensor_part += "" + if(data["pressure"]) + sensor_part += "" + if(data["temperature"]) + sensor_part += "" + if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"]) + sensor_part += "" + sensor_part += "
Pressure:[data["pressure"]] kPa
Temperature:[data["temperature"]] K
Gas Composition :
    " + if(data["oxygen"]) + sensor_part += "
  • [data["oxygen"]]% O2
  • " + if(data["nitrogen"]) + sensor_part += "
  • [data["nitrogen"]]% N
  • " + if(data["carbon_dioxide"]) + sensor_part += "
  • [data["carbon_dioxide"]]% CO2
  • " + if(data["toxins"]) + sensor_part += "
  • [data["toxins"]]% Plasma
  • " + sensor_part += "
" - else - sensor_part += "[long_name] can not be found!
" - sensor_part += "
" - sensor_data += sensor_part + else + sensor_part += "[long_name] can not be found!
" + sensor_part += "
" + sensor_data += sensor_part - else - sensor_data = "No sensors connected." + else + sensor_data = "No sensors connected." - var/output = {" + var/output = {" - [show_sensors ? "

Sensor Data:

" + sensor_data : ""] - "} + [show_sensors ? "

Sensor Data:

" + sensor_data : ""] + "} - return output + return output - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) +/obj/machinery/computer/general_air_control/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - Initialize() - ..() - set_frequency(frequency) +/obj/machinery/computer/general_air_control/Initialize() + ..() + set_frequency(frequency) - multitool_menu(var/mob/user, var/obj/item/multitool/P) - var/dat= {" - Main - - Sensors: - "} - return dat +/obj/machinery/computer/general_air_control/multitool_menu(mob/user, obj/item/multitool/P) + var/dat= {" + Main + + Sensors: + "} + return dat - multitool_topic(var/mob/user,var/list/href_list,var/obj/O) - . = ..() - if(.) return . - if("add_sensor" in href_list) +/obj/machinery/computer/general_air_control/multitool_topic(mob/user,list/href_list,obj/O) + . = ..() + if(.) return . + if("add_sensor" in href_list) - // Make a list of all available sensors on the same frequency - var/list/sensor_list = list() - for(var/obj/machinery/air_sensor/G in machines) - if(!isnull(G.id_tag) && G.frequency == frequency) - sensor_list|=G.id_tag - if(!sensor_list.len) - to_chat(user, "No sensors on this frequency.") - return MT_ERROR + // Make a list of all available sensors on the same frequency + var/list/sensor_list = list() + for(var/obj/machinery/air_sensor/G in machines) + if(!isnull(G.id_tag) && G.frequency == frequency) + sensor_list|=G.id_tag + if(!sensor_list.len) + to_chat(user, "No sensors on this frequency.") + return MT_ERROR - // Have the user pick one of them and name its label - var/sensor = input(user, "Select a sensor:", "Sensor Data") as null|anything in sensor_list - if(!sensor) - return MT_ERROR - var/label = reject_bad_name( input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1) - if(!label) - return MT_ERROR + // Have the user pick one of them and name its label + var/sensor = input(user, "Select a sensor:", "Sensor Data") as null|anything in sensor_list + if(!sensor) + return MT_ERROR + var/label = reject_bad_name( input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1) + if(!label) + return MT_ERROR - // Add the sensor's information to general_air_controler - sensors[sensor] = label - return MT_UPDATE + // Add the sensor's information to general_air_controler + sensors[sensor] = label + return MT_UPDATE - if("edit_sensor" in href_list) - var/list/sensor_list = list() - for(var/obj/machinery/air_sensor/G in machines) - if(!isnull(G.id_tag) && G.frequency == frequency) - sensor_list|=G.id_tag - if(!sensor_list.len) - to_chat(user, "No sensors on this frequency.") - return MT_ERROR - var/label = sensors[href_list["edit_sensor"]] - var/sensor = input(user, "Select a sensor:", "Sensor Data", href_list["edit_sensor"]) as null|anything in sensor_list - if(!sensor) - return MT_ERROR - sensors.Remove(href_list["edit_sensor"]) - sensors[sensor] = label - return MT_UPDATE + if("edit_sensor" in href_list) + var/list/sensor_list = list() + for(var/obj/machinery/air_sensor/G in machines) + if(!isnull(G.id_tag) && G.frequency == frequency) + sensor_list|=G.id_tag + if(!sensor_list.len) + to_chat(user, "No sensors on this frequency.") + return MT_ERROR + var/label = sensors[href_list["edit_sensor"]] + var/sensor = input(user, "Select a sensor:", "Sensor Data", href_list["edit_sensor"]) as null|anything in sensor_list + if(!sensor) + return MT_ERROR + sensors.Remove(href_list["edit_sensor"]) + sensors[sensor] = label + return MT_UPDATE - unlinkFrom(var/mob/user, var/obj/O) - ..() - if("id_tag" in O.vars && (istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))) - sensors.Remove(O:id_tag) - return 1 - return 0 +/obj/machinery/computer/general_air_control/unlinkFrom(mob/user, obj/O) + ..() + if("id_tag" in O.vars && (istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))) + sensors.Remove(O:id_tag) + return 1 + return 0 - linkMenu(var/obj/O) - if(isLinkedWith(O)) - return +/obj/machinery/computer/general_air_control/linkMenu(obj/O) + if(isLinkedWith(O)) + return - var/dat="" + var/dat="" - if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) - dat += " \[New Sensor\] " - return dat + if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) + dat += " \[New Sensor\] " + return dat - canLink(var/obj/O, var/list/context) - if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) - return O:id_tag +/obj/machinery/computer/general_air_control/canLink(obj/O, list/context) + if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) + return O:id_tag - isLinkedWith(var/obj/O) - if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) - return O:id_tag in sensors +/obj/machinery/computer/general_air_control/isLinkedWith(obj/O) + if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) + return O:id_tag in sensors - linkWith(var/mob/user, var/obj/O, var/link/context) - sensors[O:id_tag] = reject_bad_name(input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1) +/obj/machinery/computer/general_air_control/linkWith(mob/user, obj/O, link/context) + sensors[O:id_tag] = reject_bad_name(input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1) + return 1 + +/obj/machinery/computer/general_air_control/large_tank_control + circuit = /obj/item/circuitboard/large_tank_control + req_one_access_txt = "24;10" + settagwhitelist = list("input_tag", "output_tag") + + var/input_tag + var/output_tag + + var/list/input_info + var/list/output_info + + var/list/input_linkable=list( + /obj/machinery/atmospherics/unary/outlet_injector, + /obj/machinery/atmospherics/unary/vent_pump + ) + + var/list/output_linkable=list( + /obj/machinery/atmospherics/unary/vent_pump + ) + + var/pressure_setting = ONE_ATMOSPHERE * 45 + +/obj/machinery/computer/general_air_control/large_tank_control/attackby(I as obj, user as mob) + if(istype(I, /obj/item/multitool)) + update_multitool_menu(user) + if(..()) return 1 - large_tank_control - circuit = /obj/item/circuitboard/large_tank_control - req_one_access_txt = "24;10" - settagwhitelist = list("input_tag", "output_tag") - var/input_tag - var/output_tag - - var/list/input_info - var/list/output_info - - var/list/input_linkable=list( - /obj/machinery/atmospherics/unary/outlet_injector, - /obj/machinery/atmospherics/unary/vent_pump - ) - - var/list/output_linkable=list( - /obj/machinery/atmospherics/unary/vent_pump - ) - - var/pressure_setting = ONE_ATMOSPHERE * 45 - - attackby(I as obj, user as mob) - if(istype(I, /obj/item/multitool)) - update_multitool_menu(user) - if(..()) - return 1 +/obj/machinery/computer/general_air_control/large_tank_control/multitool_menu(mob/user, obj/item/multitool/P) + var/dat= {" + + Sensors: + "} + return dat - multitool_menu(var/mob/user, var/obj/item/multitool/P) - var/dat= {" - - Sensors: - "} - return dat +/obj/machinery/computer/general_air_control/large_tank_control/linkWith(mob/user, obj/O, list/context) + if(context["slot"]=="input" && is_type_in_list(O,input_linkable)) + input_info = null + if(istype(O,/obj/machinery/atmospherics/unary/vent_pump)) + send_signal(list("tag"=input_tag, + "direction"=1, // Release + "checks" =0 // No pressure checks. + )) + return 1 + if(context["slot"]=="output" && is_type_in_list(O,output_linkable)) + output_tag = O:id_tag + output_info = null + if(istype(O,/obj/machinery/atmospherics/unary/vent_pump)) + send_signal(list("tag"=output_tag, + "direction"=0, // Siphon + "checks" =2 // Internal pressure checks. + )) + return 1 +/obj/machinery/computer/general_air_control/large_tank_control/unlinkFrom(mob/user, obj/O) + if("id_tag" in O.vars) + if(O:id_tag == input_tag) + input_tag=null + input_info=null + return 1 + if(O:id_tag == output_tag) + output_tag=null + output_info=null + return 1 + return 0 - linkWith(var/mob/user, var/obj/O, var/list/context) - if(context["slot"]=="input" && is_type_in_list(O,input_linkable)) - input_tag = O:id_tag - input_info = null - if(istype(O,/obj/machinery/atmospherics/unary/vent_pump)) - send_signal(list("tag"=input_tag, - "direction"=1, // Release - "checks" =0 // No pressure checks. - )) - return 1 - if(context["slot"]=="output" && is_type_in_list(O,output_linkable)) - output_tag = O:id_tag - output_info = null - if(istype(O,/obj/machinery/atmospherics/unary/vent_pump)) - send_signal(list("tag"=output_tag, - "direction"=0, // Siphon - "checks" =2 // Internal pressure checks. - )) - return 1 +/obj/machinery/computer/general_air_control/large_tank_control/linkMenu(obj/O) + var/dat="" + if(canLink(O,list("slot"="input"))) + dat += " \[Link @ Input\] " + if(canLink(O,list("slot"="output"))) + dat += " \[Link @ Output\] " + return dat - unlinkFrom(var/mob/user, var/obj/O) - if("id_tag" in O.vars) - if(O:id_tag == input_tag) - input_tag=null - input_info=null - return 1 - if(O:id_tag == output_tag) - output_tag=null - output_info=null - return 1 - return 0 +/obj/machinery/computer/general_air_control/large_tank_control/canLink(obj/O, list/context) + return (context["slot"]=="input" && is_type_in_list(O,input_linkable)) || (context["slot"]=="output" && is_type_in_list(O,output_linkable)) - linkMenu(var/obj/O) - var/dat="" - if(canLink(O,list("slot"="input"))) - dat += " \[Link @ Input\] " - if(canLink(O,list("slot"="output"))) - dat += " \[Link @ Output\] " - return dat +/obj/machinery/computer/general_air_control/large_tank_control/isLinkedWith(obj/O) + if(O:id_tag == input_tag) + return 1 + if(O:id_tag == output_tag) + return 1 + return 0 - canLink(var/obj/O, var/list/context) - return (context["slot"]=="input" && is_type_in_list(O,input_linkable)) || (context["slot"]=="output" && is_type_in_list(O,output_linkable)) +/obj/machinery/computer/general_air_control/large_tank_control/process() + ..() + if(!input_info && input_tag) + request_device_refresh(input_tag) + if(!output_info && output_tag) + request_device_refresh(output_tag) - isLinkedWith(var/obj/O) - if(O:id_tag == input_tag) - return 1 - if(O:id_tag == output_tag) - return 1 - return 0 +/obj/machinery/computer/general_air_control/large_tank_control/return_text() + var/output = ..() + //if(signal.data) + // input_info = signal.data // Attempting to fix intake control -- TLE - - process() - ..() - if(!input_info && input_tag) - request_device_refresh(input_tag) - if(!output_info && output_tag) - request_device_refresh(output_tag) - - return_text() - var/output = ..() - //if(signal.data) - // input_info = signal.data // Attempting to fix intake control -- TLE - - output += "

Tank Control System


" - if(input_tag) - if(input_info) - var/power = (input_info["power"]) - var/volume_rate = input_info["volume_rate"] - output += {" + output += "

Tank Control System


" + if(input_tag) + if(input_info) + var/power = (input_info["power"]) + var/volume_rate = input_info["volume_rate"] + output += {"
Input (Refresh) @@ -490,14 +485,13 @@ legend {
"} - - else - output += "ERROR: Can not find input port Search
" - if(output_tag) - if(output_info) - var/power = (output_info["power"]) - var/output_pressure = output_info["internal"] - output += {" + else + output += "ERROR: Can not find input port Search
" + if(output_tag) + if(output_info) + var/power = (output_info["power"]) + var/output_pressure = output_info["internal"] + output += {"
Output (Refresh) @@ -512,234 +506,234 @@ legend {
"} - else - output += "ERROR: Can not find output port Search
" + else + output += "ERROR: Can not find output port Search
" - return output + return output - receive_signal(datum/signal/signal) - if(!signal || signal.encryption) return +/obj/machinery/computer/general_air_control/large_tank_control/receive_signal(datum/signal/signal) + if(!signal || signal.encryption) return - var/id_tag = signal.data["tag"] + var/id_tag = signal.data["tag"] - if(input_tag == id_tag) - input_info = signal.data - updateUsrDialog() - else if(output_tag == id_tag) - output_info = signal.data - updateUsrDialog() - else - ..(signal) + if(input_tag == id_tag) + input_info = signal.data + updateUsrDialog() + else if(output_tag == id_tag) + output_info = signal.data + updateUsrDialog() + else + ..(signal) - proc/request_device_refresh(var/device) - send_signal(list("tag"=device, "status")) +/obj/machinery/computer/general_air_control/large_tank_control/proc/request_device_refresh(device) + send_signal(list("tag"=device, "status")) - proc/send_signal(var/list/data) - if(!radio_connection) - return - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - signal.data=data - signal.data["sigtype"]="command" - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) +/obj/machinery/computer/general_air_control/large_tank_control/proc/send_signal(list/data) + if(!radio_connection) + return + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data=data + signal.data["sigtype"]="command" + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - Topic(href, href_list) - if(..()) - return 1 +/obj/machinery/computer/general_air_control/large_tank_control/Topic(href, href_list) + if(..()) + return 1 - add_fingerprint(usr) + add_fingerprint(usr) - if(href_list["out_set_pressure"]) - var/response=input(usr,"Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num - pressure_setting = text2num(response) - pressure_setting = between(0, pressure_setting, 50*ONE_ATMOSPHERE) + if(href_list["out_set_pressure"]) + var/response=input(usr,"Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num + pressure_setting = text2num(response) + pressure_setting = between(0, pressure_setting, 50*ONE_ATMOSPHERE) - if(!radio_connection) - return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - if(href_list["in_refresh_status"]) - input_info = null - signal.data = list ("tag" = input_tag, "status" = 1) + if(!radio_connection) + return 0 + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + if(href_list["in_refresh_status"]) + input_info = null + signal.data = list ("tag" = input_tag, "status" = 1) - else if(href_list["in_toggle_injector"]) - input_info = null - signal.data = list ("tag" = input_tag, "power_toggle" = 1) + else if(href_list["in_toggle_injector"]) + input_info = null + signal.data = list ("tag" = input_tag, "power_toggle" = 1) - else if(href_list["out_refresh_status"]) - output_info = null - signal.data = list ("tag" = output_tag, "status" = 1) + else if(href_list["out_refresh_status"]) + output_info = null + signal.data = list ("tag" = output_tag, "status" = 1) - else if(href_list["out_toggle_power"]) - output_info = null - signal.data = list ("tag" = output_tag, "power_toggle" = 1) + else if(href_list["out_toggle_power"]) + output_info = null + signal.data = list ("tag" = output_tag, "power_toggle" = 1) - else if(href_list["out_set_pressure"]) - output_info = null - signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]") - /*else - testing("Bad Topic() to GAC \"[src.name]\": [href]") - return*/ // NOPE. // disabling because it spams when multitool menus are used + else if(href_list["out_set_pressure"]) + output_info = null + signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]") + /*else + testing("Bad Topic() to GAC \"[src.name]\": [href]") + return*/ // NOPE. // disabling because it spams when multitool menus are used - signal.data["sigtype"] = "command" - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - src.updateUsrDialog() + signal.data["sigtype"] = "command" + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + src.updateUsrDialog() - fuel_injection - icon = 'icons/obj/computer.dmi' - icon_screen = "atmos" - circuit = /obj/item/circuitboard/injector_control +/obj/machinery/computer/general_air_control/fuel_injection + icon = 'icons/obj/computer.dmi' + icon_screen = "atmos" + circuit = /obj/item/circuitboard/injector_control - var/device_tag - var/list/device_info + var/device_tag + var/list/device_info - var/automation = 0 + var/automation = 0 - var/cutoff_temperature = 2000 - var/on_temperature = 1200 + var/cutoff_temperature = 2000 + var/on_temperature = 1200 - attackby(I as obj, user as mob, params) - if(istype(I, /obj/item/multitool)) - update_multitool_menu(user) - if(..()) - return 1 +/obj/machinery/computer/general_air_control/fuel_injection/attackby(I as obj, user as mob, params) + if(istype(I, /obj/item/multitool)) + update_multitool_menu(user) + if(..()) + return 1 - process() - if(automation) - if(!radio_connection) - return 0 +/obj/machinery/computer/general_air_control/fuel_injection/process() + if(automation) + if(!radio_connection) + return 0 - var/injecting = 0 - for(var/id_tag in sensor_information) - var/list/data = sensor_information[id_tag] - if(data["temperature"]) - if(data["temperature"] >= cutoff_temperature) - injecting = 0 - break - if(data["temperature"] <= on_temperature) - injecting = 1 + var/injecting = 0 + for(var/id_tag in sensor_information) + var/list/data = sensor_information[id_tag] + if(data["temperature"]) + if(data["temperature"] >= cutoff_temperature) + injecting = 0 + break + if(data["temperature"] <= on_temperature) + injecting = 1 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src - signal.data = list( - "tag" = device_tag, - "power" = injecting, - "sigtype"="command" - ) + signal.data = list( + "tag" = device_tag, + "power" = injecting, + "sigtype"="command" + ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - ..() + ..() - return_text() - var/output = ..() - output += "
Fuel Injection System (Refresh)" - if(device_info) - var/power = device_info["power"] - var/volume_rate = device_info["volume_rate"] - output += {" - - - - - - - - - - - - "} +/obj/machinery/computer/general_air_control/fuel_injection/return_text() + var/output = ..() + output += "
Fuel Injection System (Refresh)" + if(device_info) + var/power = device_info["power"] + var/volume_rate = device_info["volume_rate"] + output += {"
Status:[power?"Injecting":"On Hold"]
Rate:[volume_rate] L/sec
Automated Fuel Injection:[automation?"Engaged":"Disengaged"]
+ + + + + + + + + + + + "} - if(automation) + if(automation) - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\atmo_control.dm:372: output += "Automated Fuel Injection: Engaged
" - output += {" - - - "} - // END AUTOFIX - else + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\atmo_control.dm:372: output += "Automated Fuel Injection: Engaged
" + output += {" + + + "} + // END AUTOFIX + else - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\atmo_control.dm:375: output += "Automated Fuel Injection: Disengaged
" - output += {" - - - - "} - // END AUTOFIX - output += "
Status:[power?"Injecting":"On Hold"]
Rate:[volume_rate] L/sec
Automated Fuel Injection:[automation?"Engaged":"Disengaged"]
Injector Controls Locked Out
Injector Controls Locked Out
Injector:Toggle Power Inject (1 Cycle)
" - else - output += {"

ERROR: Can not find device. Search

"} - output += "
" + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\atmo_control.dm:375: output += "Automated Fuel Injection: Disengaged
" + output += {" + + Injector: + Toggle Power Inject (1 Cycle) + "} + // END AUTOFIX + output += "" + else + output += {"

ERROR: Can not find device. Search

"} + output += "" - return output + return output - receive_signal(datum/signal/signal) - if(!signal || signal.encryption) return +/obj/machinery/computer/general_air_control/fuel_injection/receive_signal(datum/signal/signal) + if(!signal || signal.encryption) return - var/id_tag = signal.data["tag"] + var/id_tag = signal.data["tag"] - if(device_tag == id_tag) - device_info = signal.data - else - ..(signal) + if(device_tag == id_tag) + device_info = signal.data + else + ..(signal) - Topic(href, href_list) - if(..()) - return +/obj/machinery/computer/general_air_control/fuel_injection/Topic(href, href_list) + if(..()) + return - if(href_list["refresh_status"]) - device_info = null - if(!radio_connection) - return 0 + if(href_list["refresh_status"]) + device_info = null + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - signal.data = list( - "tag" = device_tag, - "status", - "sigtype"="command" - ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data = list( + "tag" = device_tag, + "status", + "sigtype"="command" + ) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - if(href_list["toggle_automation"]) - automation = !automation + if(href_list["toggle_automation"]) + automation = !automation - if(href_list["toggle_injector"]) - device_info = null - if(!radio_connection) - return 0 + if(href_list["toggle_injector"]) + device_info = null + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - signal.data = list( - "tag" = device_tag, - "power_toggle", - "sigtype"="command" - ) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data = list( + "tag" = device_tag, + "power_toggle", + "sigtype"="command" + ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - if(href_list["injection"]) - if(!radio_connection) - return 0 + if(href_list["injection"]) + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - signal.data = list( - "tag" = device_tag, - "inject", - "sigtype"="command" - ) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data = list( + "tag" = device_tag, + "inject", + "sigtype"="command" + ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index 990488ad624..3d53e130628 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -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 = {" - - - - - -

Area Air Control

- [status]
- Scan - "} - for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in connectedscrubbers) - dat += {" - - - - "} - +/obj/machinery/computer/area_atmos/attack_hand(mob/user as mob) + if(..(user)) + return + src.add_fingerprint(usr) + var/dat = {" + + + + + +

Area Air Control

+ [status]
+ Scan +
[scrubber.name]Turn On Turn Off
"} + for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in connectedscrubbers) dat += {" -

- [zone] - - "} - var/datum/browser/popup = new(user, "area_atmos", name, 400, 400) - popup.set_content(dat) - popup.open(0) - status = "" + + [scrubber.name] + Turn On Turn Off + "} - Topic(href, href_list) - if(..()) + dat += {" +
+ [zone] + + "} + 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() diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 78b94f969fd..1be5fa5e43a 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -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 diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index 0889c97dcca..d25f86acb16 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -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) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 8c47855731f..c3d25d3cdb9 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -169,116 +169,116 @@ 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 - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, src) - s.start() - visible_message("BZZzZZzZZzZT") +/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 + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(2, 1, src) + s.start() + visible_message("BZZzZZzZZzZT") + 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("[user] repairs the [src]!") 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("[user] repairs the [src]!") - return - else if(src.emagged > 0) - src.emagged = 0 - src.req_access = list(access_security) - visible_message("[user] repairs the [src]!") - return + else if(src.emagged > 0) + src.emagged = 0 + src.req_access = list(access_security) + visible_message("[user] repairs the [src]!") 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].") - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, src) - s.start() - visible_message("BZZzZZzZZzZT") - else if(src.emagged == 1) - src.emagged = 2 - to_chat(user, "You short out the anchoring mechanism on the [src].") - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, src) - s.start() - visible_message("BZZzZZzZZzZT") - - 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() - return - - 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 - - proc/explode() - - visible_message("[src] blows apart!") - var/turf/Tsec = get_turf(src) - - /* var/obj/item/stack/rods/ =*/ - new /obj/item/stack/rods(Tsec) + ..() +/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].") var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) + s.set_up(2, 1, src) s.start() + visible_message("BZZzZZzZZzZT") + else if(src.emagged == 1) + src.emagged = 2 + to_chat(user, "You short out the anchoring mechanism on the [src].") + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(2, 1, src) + s.start() + visible_message("BZZzZZzZZzZT") - explosion(src.loc,-1,-1,0) - if(src) - qdel(src) \ No newline at end of file +/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]" + +/obj/machinery/deployable/barrier/blob_act() + src.health -= 25 + if(src.health <= 0) + src.explode() + return + +/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 + +/obj/machinery/deployable/barrier/proc/explode() + visible_message("[src] blows apart!") + var/turf/Tsec = get_turf(src) + +/* var/obj/item/stack/rods/ =*/ + new /obj/item/stack/rods(Tsec) + + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(3, 1, src) + s.start() + + explosion(src.loc,-1,-1,0) + if(src) + qdel(src) diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 713e29abf8a..13ed8bebc23 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -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" diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 09774a6d600..7741d1ce056 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -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 = "Magnetic Control Console

" + if(!autolink) + dat += {" + Frequency: [frequency]
+ Code: [code]
+ Probe Generators
+ "} + + if(magnets.len >= 1) + + dat += "Magnets confirmed:
" + var/i = 0 + for(var/obj/machinery/magnetic_module/M in magnets) + i++ + dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
" + + dat += "
Speed: - [speed] +
" + dat += "Path: {[path]}
" + dat += "Moving: [moving ? "Enabled":"Disabled"]" + + + 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 = "Magnetic Control Console

" - if(!autolink) - dat += {" - Frequency: [frequency]
- Code: [code]
- Probe Generators
- "} + break - if(magnets.len >= 1) + looping = 1 - dat += "Magnets confirmed:
" - var/i = 0 - for(var/obj/machinery/magnetic_module/M in magnets) - i++ - dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
" + // 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 += "
Speed: - [speed] +
" - dat += "Path: {[path]}
" - dat += "Moving: [moving ? "Enabled":"Disabled"]" + 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 diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 37d1c3ae93c..dacb5f14f46 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -17,89 +17,89 @@ var/selfdestructing = 0 var/charges = 1 - attack_hand(var/mob/user as mob) - usr.set_machine(src) - var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" - if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) - if(is_special_character(user)) - dat += "Operative record found. Greetings, Agent [user.name].
" - else if(charges < 1) - dat += "Connection severed.
" - else - var/honorific = "Mr." - if(user.gender == FEMALE) - honorific = "Ms." - dat += "Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]?
" - if(!selfdestructing) - dat += "

\"[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?")]\"
" - 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 = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" + if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) + if(is_special_character(user)) + dat += "Operative record found. Greetings, Agent [user.name].
" + else if(charges < 1) + dat += "Connection severed.
" + else + var/honorific = "Mr." + if(user.gender == FEMALE) + honorific = "Ms." + dat += "Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]?
" + if(!selfdestructing) + dat += "

\"[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?")]\"
" + 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 = "We have no need for you at this time. Have a pleasant day.
" + src.updateUsrDialog() + return + charges -= 1 + switch(rand(1,2)) + if(1) + temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind." src.updateUsrDialog() + spawn(rand(50,200)) selfdestruct() return - var/mob/M = locate(href_list["traitormob"]) - if(M.mind.special_role) - temptext = "We have no need for you at this time. Have a pleasant day.
" - src.updateUsrDialog() - return - charges -= 1 - switch(rand(1,2)) - if(1) - temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind." - 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, "You have joined the ranks of the Syndicate and become a traitor to the station!") + to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") - 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, "Objective #[obj_count]: [OBJ.explanation_text]") - obj_count++ + var/obj_count = 1 + for(var/datum/objective/OBJ in M.mind.objectives) + to_chat(M, "Objective #[obj_count]: [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" \ No newline at end of file + icon_state = "beaconsynd0" diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index 0a12b637a39..539e4565d66 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -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" diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index a5a1bb95bc1..75b9fc6b1b8 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -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" diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 204fcfc67f2..d108311b99d 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -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 diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index 3cffb3f7eaf..a5cd1b8b6b1 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -16,40 +16,40 @@ 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, "Gib list length mismatch!") - return +/obj/effect/gibspawner/proc/Gib(atom/location, datum/dna/MobDNA = null) + if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) + to_chat(world, "Gib list length mismatch!") + return - var/obj/effect/decal/cleanable/blood/gibs/gib = null + var/obj/effect/decal/cleanable/blood/gibs/gib = null - if(sparks) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, location) - s.start() + if(sparks) + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(2, 1, location) + s.start() - 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) diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index 5446ba348e6..b75df275659 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -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) - ..() \ No newline at end of file +/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) + ..() diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index cf698f439f5..286bd315b61 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -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, "It won't budge!") \ No newline at end of file + to_chat(user, "It won't budge!") diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 19e26f06bf5..59cf53451cd 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -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 \ No newline at end of file + return diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 2a4a5a3fab1..a91410c28fe 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -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) diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm index 264753dc695..a4599a2e79f 100644 --- a/code/game/objects/items/weapons/caution.dm +++ b/code/game/objects/items/weapons/caution.dm @@ -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, "You disarm \the [src].") - return - timing = !timing - if(timing) - processing_objects.Add(src) - else - armed = 0 - timepassed = 0 - to_chat(H, "You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]") +/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, "You disarm \the [src].") + return + timing = !timing + if(timing) + processing_objects.Add(src) + else + armed = 0 + timepassed = 0 + to_chat(H, "You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]") - 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) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 3a7e203101d..681db222d0b 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -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 + ..() diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm index fc13fa69f79..bbad0eb9157 100644 --- a/code/game/objects/items/weapons/dnascrambler.dm +++ b/code/game/objects/items/weapons/dnascrambler.dm @@ -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, "You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.") + return + + if(M == user) + user.visible_message("[user] injects [user.p_them()]self with [src]!") + injected(user, user) + else + user.visible_message("[user] is trying to inject [M] with [src]!") + if(do_mob(user,M,30)) + user.visible_message("[user] injects [M] with [src].") + injected(M, user) + else + to_chat(user, "You failed to inject [M].") + +/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, "You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.") - return - - if(M == user) - user.visible_message("[user] injects [user.p_them()]self with [src]!") - injected(user, user) - else - user.visible_message("[user] is trying to inject [M] with [src]!") - if(do_mob(user,M,30)) - user.visible_message("[user] injects [M] with [src].") - injected(M, user) - else - to_chat(user, "You failed to inject [M].") - - 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 diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 9e836fecc87..3de4fc4cf8d 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -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 diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm index 18dbf93ae45..bce9861fb72 100644 --- a/code/game/objects/items/weapons/grenades/clowngrenade.dm +++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm @@ -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 diff --git a/code/game/objects/items/weapons/grenades/custom_grenades.dm b/code/game/objects/items/weapons/grenades/custom_grenades.dm index 133cc906850..b5598bc86be 100644 --- a/code/game/objects/items/weapons/grenades/custom_grenades.dm +++ b/code/game/objects/items/weapons/grenades/custom_grenades.dm @@ -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 \ No newline at end of file + +/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 diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index c4ccb3e83dc..6b9c4d815f4 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -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 diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index ac8c7d04a95..c6ece450f5e 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -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]" diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm index f8cc628dc01..a38f6e11873 100644 --- a/code/game/objects/items/weapons/misc.dm +++ b/code/game/objects/items/weapons/misc.dm @@ -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" diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 85a0e679bb6..5395f2e8395 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -167,10 +167,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" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 3e7f2f6f8c9..da97f330c1f 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -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, "The snatcher is full.") - 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, "The snatcher is full.") + 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) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 5ba58e2f313..67f32dbfd58 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -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) diff --git a/code/modules/atmos_automation/console.dm b/code/modules/atmos_automation/console.dm index e486898d18d..f4c3873717c 100644 --- a/code/modules/atmos_automation/console.dm +++ b/code/modules/atmos_automation/console.dm @@ -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 += "RUNNING" + else + out += "STOPPED" - if(on) - out += "RUNNING" - else - out += "STOPPED" + out += {" +

Automations

+

\[ + + Add + + | + + Reset All + + | + + Clear + + \]

+

\[ + + Export + + | + + Import + + \]

"} + if(automations.len==0) + out += "No automations present." + else + for(var/datum/automation/A in automations) + out += {" +
+ + [A.label] + (Reset | + ×) + + [A.GetText()] +
+ "} + return out - out += {" -

Automations

-

\[ - - Add - - | - - Reset All - - | - - Clear - - \]

-

\[ - - Export - - | - - Import - - \]

"} - if(automations.len==0) - out += "No automations present." - 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 += {" -
- - [A.label] - (Reset | - ×) - - [A.GetText()] -
- "} - 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 diff --git a/code/modules/client/preference/preferences_spawnpoints.dm b/code/modules/client/preference/preferences_spawnpoints.dm index 60d77b38873..38b6b87ef43 100644 --- a/code/modules/client/preference/preferences_spawnpoints.dm +++ b/code/modules/client/preference/preferences_spawnpoints.dm @@ -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 \ No newline at end of file + turfs = latejoin_cyborg diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 29bfabddb0a..387fdf9880e 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -22,102 +22,233 @@ 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 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 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(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate)) + var/mob/living/silicon/pai/pai = new(card) + if(!candidate.name) + pai.name = pick(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(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate)) - var/mob/living/silicon/pai/pai = new(card) - if(!candidate.name) - pai.name = pick(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 += {" - + "} + + dat += {" + + pAI Personality Configuration +

Please configure your pAI personality's options. Remember, what you enter here could determine whether or not the user requesting a personality chooses you!

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:[candidate.name] 
What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.
Description:[candidate.description] 
What sort of pAI you typically play; your mannerisms, your quirks, etc. This can be as sparse or as detailed as you like.
Preferred Role:[candidate.role] 
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.
OOC Comments:[candidate.comments] 
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.
+
+ + + + + + + +
+ Save Personality +
+ Load Personality +

+ + +
Submit Personality

+ + + "} + + 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 respawnable_list) + if(o.key == c.key) + found = 1 + if(found) + available.Add(c) + var/dat = "" + + dat += {" + + + + - "} + + + pAI Availability List

+ "} + dat += "

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.

" + for(var/datum/paiCandidate/c in available) dat += {" - - pAI Personality Configuration -

Please configure your pAI personality's options. Remember, what you enter here could determine whether or not the user requesting a personality chooses you!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:[candidate.name] 
What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.
Description:[candidate.description] 
What sort of pAI you typically play; your mannerisms, your quirks, etc. This can be as sparse or as detailed as you like.
Preferred Role:[candidate.role] 
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.
OOC Comments:[candidate.comments] 
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.
-
- - -
- Save Personality + + + + + + + + + + + + + + + + + +
Name:[c.name]
Description:[c.description]
Preferred Role:[c.role]
OOC Comments:[c.comments]
+ + - - - - -
Download [c.name]
- Load Personality -

- - -
Submit Personality

- - +
+
"} - M << browse(dat, "window=paiRecruit;size=580x580;") + dat += {" + + + "} - 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 respawnable_list) - if(o.key == c.key) - found = 1 - if(found) - available.Add(c) - var/dat = "" + user << browse(dat, "window=findPai") - dat += {" - - - - - - - pAI Availability List

- "} - dat += "

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.

" +/datum/paiController/proc/requestRecruits(var/obj/item/paicard/P, mob/user) + for(var/mob/dead/observer/O in 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, "A pAI card activated by [user.real_name] is looking for personalities. (Teleport | Sign Up)") + //question(O.client) - for(var/datum/paiCandidate/c in available) - dat += {" - - - - - - - - - - - - - - - - - -
Name:[c.name]
Description:[c.description]
Preferred Role:[c.role]
OOC Comments:[c.comments]
- - -
Download [c.name] -
-
- "} - - dat += {" - - - "} - - user << browse(dat, "window=findPai") - - proc/requestRecruits(var/obj/item/paicard/P, mob/user) - for(var/mob/dead/observer/O in 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, "A pAI card activated by [user.real_name] is looking for personalities. (Teleport | Sign Up)") - //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 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 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) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index f4db32b8081..9c130780d81 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -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, "You can only use this emote when you're out of charge.") \ No newline at end of file + to_chat(src, "You can only use this emote when you're out of charge.") diff --git a/code/modules/mob/living/simple_animal/bot/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm index 70e27937745..2ea085464a7 100644 --- a/code/modules/mob/living/simple_animal/bot/emote.dm +++ b/code/modules/mob/living/simple_animal/bot/emote.dm @@ -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) \ No newline at end of file + ..(act, m_type, message) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 78e7ad47f57..8593de82ba5 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -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, "CLONG, clong!") - if(src.loc) - for(var/mob/M in hearers(src.loc.loc)) - to_chat(M, "CLONG, clong!") - - 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(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(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(TAGGERLOCATIONS[O.currTag]) - to_chat(user, "Changed filter to [tag]") - updatedesc() + if(O.currTag > 0)// Tag set + sortType = O.currTag + playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) + var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) + to_chat(user, "Changed filter to [tag]") + 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 diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 1b1b5c0ffa9..a98e8e60adc 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -223,31 +223,31 @@ flags = CONDUCT slot_flags = SLOT_BELT - proc/openwindow(mob/user as mob) - var/dat = "

TagMaster 2.2

" +/obj/item/destTagger/proc/openwindow(mob/user as mob) + var/dat = "

TagMaster 2.2

" - dat += "" - for(var/i = 1, i <= TAGGERLOCATIONS.len, i++) - dat += "" + dat += "
[TAGGERLOCATIONS[i]]
" + for(var/i = 1, i <= TAGGERLOCATIONS.len, i++) + dat += "" - if(i%4==0) - dat += "" + if(i%4==0) + dat += "" - dat += "
[TAGGERLOCATIONS[i]]

Current Selection: [currTag ? TAGGERLOCATIONS[currTag] : "None"]
" + dat += "
Current Selection: [currTag ? TAGGERLOCATIONS[currTag] : "None"]
" - 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" From 65c246c1c941f93880550b1f3efdd085649780a2 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Fri, 14 Sep 2018 21:41:15 +0800 Subject: [PATCH 02/37] TG container_type refactor --- code/__DEFINES/flags.dm | 2 - code/__DEFINES/reagents.dm | 12 +++ code/game/atoms.dm | 54 +++++++------ code/game/machinery/cryo.dm | 2 +- code/game/objects/items/devices/scanners.dm | 3 +- .../objects/items/weapons/extinguisher.dm | 8 +- .../items/weapons/implants/implant_chem.dm | 2 +- code/game/objects/items/weapons/paint.dm | 2 +- .../objects/items/weapons/tanks/watertank.dm | 3 +- code/game/objects/structures/janicart.dm | 2 +- code/game/objects/structures/mop_bucket.dm | 2 +- code/game/objects/structures/watercloset.dm | 4 +- code/modules/crafting/craft.dm | 2 +- .../detective_work/footprints_and_rag.dm | 3 +- code/modules/fish/fishtank.dm | 81 +++++++++---------- .../food_and_drinks/drinks/bottler/bottler.dm | 2 +- code/modules/food_and_drinks/drinks/drinks.dm | 79 +++++++++--------- .../modules/food_and_drinks/food/condiment.dm | 6 +- .../kitchen_machinery/kitchen_machine.dm | 6 +- code/modules/hydroponics/hydroitemdefines.dm | 4 +- code/modules/hydroponics/hydroponics.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/living.dm | 8 +- code/modules/paperwork/pen.dm | 2 +- .../projectiles/ammunition/ammo_casings.dm | 2 +- code/modules/projectiles/guns/dartgun.dm | 6 +- .../projectiles/guns/energy/special.dm | 3 +- code/modules/reagents/chemistry/holder.dm | 15 ++++ .../reagents/chemistry/machinery/pandemic.dm | 10 +-- .../chemistry/machinery/reagentgrinder.dm | 2 +- code/modules/reagents/chemistry/readme.dm | 8 -- code/modules/reagents/reagent_containers.dm | 8 -- .../reagents/reagent_containers/bottle.dm | 2 +- .../reagent_containers/glass_containers.dm | 18 ++--- .../reagents/reagent_containers/hypospray.dm | 2 +- .../reagents/reagent_containers/spray.dm | 3 +- .../reagents/reagent_containers/syringes.dm | 11 +-- code/modules/reagents/reagent_dispenser.dm | 16 ++-- code/modules/research/circuitprinter.dm | 2 +- code/modules/research/protolathe.dm | 2 +- .../research/xenobiology/xenobiology.dm | 1 + 41 files changed, 205 insertions(+), 201 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 6c34d3144b0..ae6943d553a 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -17,8 +17,6 @@ #define HEADBANGPROTECT 4096 -#define OPENCONTAINER 4096 // is an open container for chemistry purposes - #define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! #define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT) diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 0d20a3edb74..cf76a42e926 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -4,3 +4,15 @@ #define REAGENT_OVERDOSE_EFFECT 1 #define REAGENT_OVERDOSE_FLAGS 2 +// container_type defines +#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes. +#define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes. + +#define REFILLABLE (1<<2) // Makes it possible to add reagents through any reagent container. +#define DRAINABLE (1<<3) // Makes it possible to remove reagents through any reagent container. + +#define TRANSPARENT (1<<4) // Used on containers which you want to be able to see the reagents off. +#define AMOUNT_VISIBLE (1<<5) // For non-transparent containers that still have the general amount of reagents in them visible. + +// Is an open container for all intents and purposes. +#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 47f28d0ae5b..fd1cb0e32c1 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -16,6 +16,7 @@ var/dont_save = 0 // For atoms that are temporary by necessity - like lighting overlays ///Chemistry. + var/container_type = NONE var/datum/reagents/reagents = null //This atom's HUD (med/sec, etc) images. Associative list. @@ -23,9 +24,6 @@ //HUD images that this atom can provide. var/list/hud_possible - - //var/chem_is_open_container = 0 - // replaced by OPENCONTAINER flags and atom/proc/is_open_container() ///Chemistry. @@ -198,22 +196,21 @@ /atom/proc/Bumped(AM as mob|obj) return -// Convenience proc to see if a container is open for chemistry handling -// returns true if open -// false if closed +// Convenience procs to see if a container is open for chemistry handling /atom/proc/is_open_container() - return flags & OPENCONTAINER + return is_refillable() && is_drainable() -/*//Convenience proc to see whether a container can be accessed in a certain way. +/atom/proc/is_injectable(allowmobs = TRUE) + return reagents && (container_type & (INJECTABLE | REFILLABLE)) - proc/can_subract_container() - return flags & EXTRACT_CONTAINER - - proc/can_add_container() - return flags & INSERT_CONTAINER -*/ +/atom/proc/is_drawable(allowmobs = TRUE) + return reagents && (container_type & (DRAWABLE | DRAINABLE)) +/atom/proc/is_refillable() + return reagents && (container_type & REFILLABLE) +/atom/proc/is_drainable() + return reagents && (container_type & DRAINABLE) /atom/proc/CheckExit() return 1 @@ -279,17 +276,24 @@ if(desc) to_chat(user, desc) - if(reagents && is_open_container()) //is_open_container() isn't really the right proc for this, but w/e - to_chat(user, "It contains:") - if(reagents.reagent_list.len) - if(user.can_see_reagents()) //Show each individual reagent - for(var/datum/reagent/R in reagents.reagent_list) - to_chat(user, "[R.volume] units of [R.name]") - else //Otherwise, just show the total volume - if(reagents && reagents.reagent_list.len) - to_chat(user, "[reagents.total_volume] units of various reagents.") - else - to_chat(user, "Nothing.") + if(reagents) + if(container_type & TRANSPARENT) + to_chat(user, "It contains:") + if(reagents.reagent_list.len) + if(user.can_see_reagents()) //Show each individual reagent + for(var/I in reagents.reagent_list) + var/datum/reagent/R = I + to_chat(user, "[R.volume] units of [R.name]") + else //Otherwise, just show the total volume + if(reagents && reagents.reagent_list.len) + to_chat(user, "[reagents.total_volume] units of various reagents.") + else + to_chat(user, "Nothing.") + else if(container_type & AMOUNT_VISIBLE) + if(reagents.total_volume) + to_chat(user, "It has [reagents.total_volume] unit\s left.") + else + to_chat(user, "It's empty.") SendSignal(COMSIG_PARENT_EXAMINE, user) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 90ce57e880f..62bb8f75873 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -280,7 +280,7 @@ return B.forceMove(src) beaker = B - add_attack_logs(user, null, "Added [B] containing [B.reagentlist()] to a cryo cell at [COORD(src)]") + add_attack_logs(user, null, "Added [B] containing [B.reagents.log_list()] to a cryo cell at [COORD(src)]") user.visible_message("[user] adds \a [B] to [src]!", "You add \a [B] to [src]!") diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 2f1a280f83f..aece125c657 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -439,7 +439,8 @@ REAGENT SCANNER icon_state = "spectrometer" item_state = "analyzer" w_class = WEIGHT_CLASS_SMALL - flags = CONDUCT | OPENCONTAINER + flags = CONDUCT + container_type = OPENCONTAINER slot_flags = SLOT_BELT throwforce = 5 throw_speed = 4 diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index fb4829dd13f..d32d98f3a27 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -11,6 +11,7 @@ throw_speed = 2 throw_range = 7 force = 10 + container_type = AMOUNT_VISIBLE materials = list(MAT_METAL=90) attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") var/max_water = 50 @@ -36,11 +37,8 @@ sprite_name = "miniFE" /obj/item/extinguisher/examine(mob/user) - if(..(user, 0)) - to_chat(usr, "[bicon(src)] [src.name] contains:") - if(reagents && reagents.reagent_list.len) - for(var/datum/reagent/R in reagents.reagent_list) - to_chat(user, "[R.volume] units of [R.name]") + . = ..() + to_chat(user, "The safety is [safety ? "on" : "off"].") /obj/item/extinguisher/New() diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm index b2f79f7e5c9..5f0fea79da9 100644 --- a/code/game/objects/items/weapons/implants/implant_chem.dm +++ b/code/game/objects/items/weapons/implants/implant_chem.dm @@ -3,7 +3,7 @@ desc = "Injects things." icon_state = "reagents" origin_tech = "materials=3;biotech=4" - flags = OPENCONTAINER + container_type = OPENCONTAINER /obj/item/implant/chem/get_data() var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 7c8883ca7e8..dc466f479d0 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -13,7 +13,7 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = list(5,10,20,30,50,70) volume = 70 - flags = OPENCONTAINER + container_type = OPENCONTAINER /obj/item/reagent_containers/glass/paint/afterattack(turf/simulated/target, mob/user, proximity) if(!proximity) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 364fd49847b..96dd853be09 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -116,7 +116,8 @@ amount_per_transfer_from_this = 50 possible_transfer_amounts = list(25,50,100) volume = 500 - flags = NODROP | OPENCONTAINER | NOBLUDGEON + flags = NODROP | NOBLUDGEON + container_type = OPENCONTAINER var/obj/item/watertank/tank diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index b19c5a56e99..bba1dc18de6 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -7,7 +7,7 @@ icon_state = "cart" anchored = 0 density = 1 - flags = OPENCONTAINER + container_type = OPENCONTAINER //copypaste sorry var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite var/obj/item/storage/bag/trash/mybag = null diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index aa9f21a9cce..f01cc8c41ca 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/janitor.dmi' icon_state = "mopbucket" density = 1 - flags = OPENCONTAINER + container_type = OPENCONTAINER var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite /obj/structure/mopbucket/New() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 751ade6081f..e657e9f8538 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -115,8 +115,8 @@ if(!open) return var/obj/item/reagent_containers/RG = I - if(RG.is_open_container()) - if(RG.reagents.total_volume >= RG.volume) + if(RG.is_refillable()) + if(RG.reagents.holder_full()) to_chat(user, "[RG] is full.") else RG.reagents.add_reagent("toiletwater", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 37fa041af77..ea5e4a652aa 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -69,7 +69,7 @@ else if(istype(I, /obj/item/reagent_containers)) var/obj/item/reagent_containers/RC = I - if(RC.flags & OPENCONTAINER) + if(RC.container_type & OPENCONTAINER) for(var/datum/reagent/A in RC.reagents.reagent_list) .[A.type] += A.volume .[I.type] += 1 diff --git a/code/modules/detective_work/footprints_and_rag.dm b/code/modules/detective_work/footprints_and_rag.dm index dda9490b82a..31f9e66255b 100644 --- a/code/modules/detective_work/footprints_and_rag.dm +++ b/code/modules/detective_work/footprints_and_rag.dm @@ -19,7 +19,8 @@ possible_transfer_amounts = list(5) volume = 5 can_be_placed_into = null - flags = OPENCONTAINER | NOBLUDGEON + flags = NOBLUDGEON + container_type = OPENCONTAINER var/wipespeed = 30 /obj/item/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag) diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index 412c5407ddc..524395a0ac0 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -584,51 +584,46 @@ else return ..() //Open reagent containers add and remove water - else if(O.is_open_container()) - if(istype(O, /obj/item/reagent_containers/glass)) - if(lid_switch) - to_chat(user, "Open the lid on [src] first!") - return - var/obj/item/reagent_containers/glass/C = O - //Containers with any reagents will get dumped in - if(C.reagents.total_volume) - var/water_value = 0 - water_value += C.reagents.get_reagent_amount("water") //Water is full value - water_value += C.reagents.get_reagent_amount("holywater") *1.1 //Holywater is (somehow) better. Who said religion had to make sense? - water_value += C.reagents.get_reagent_amount("tonic") * 0.25 //Tonic water is 25% value - water_value += C.reagents.get_reagent_amount("sodawater") * 0.50 //Sodawater is 50% value - water_value += C.reagents.get_reagent_amount("fishwater") * 0.75 //Fishwater is 75% value, to account for the fish poo - water_value += C.reagents.get_reagent_amount("ice") * 0.80 //Ice is 80% value - var/message = "" - if(!water_value) //The container has no water value, clear everything in it - message = "The filtration process removes everything, leaving the water level unchanged." - C.reagents.clear_reagents() - else - if(water_level == water_capacity) - to_chat(user, "[src] is already full!") - else - message = "The filtration process purifies the water, raising the water level." - - if((water_level + water_value) == water_capacity) - message += " You filled [src] to the brim!" - if((water_level + water_value) > water_capacity) - message += " You overfilled [src] and some water runs down the side, wasted." - C.reagents.clear_reagents() - adjust_water_level(water_value) - user.visible_message("[user.name] pours the contents of [C.name] into [src].", "[message]") - //Empty containers will scoop out water, filling the container as much as possible from the water_level + else if(O.is_drainable()) + //Containers with any reagents will get dumped in + if(O.reagents.total_volume) + var/water_value = 0 + water_value += O.reagents.get_reagent_amount("water") //Water is full value + water_value += O.reagents.get_reagent_amount("holywater") *1.1 //Holywater is (somehow) better. Who said religion had to make sense? + water_value += O.reagents.get_reagent_amount("tonic") * 0.25 //Tonic water is 25% value + water_value += O.reagents.get_reagent_amount("sodawater") * 0.50 //Sodawater is 50% value + water_value += O.reagents.get_reagent_amount("fishwater") * 0.75 //Fishwater is 75% value, to account for the fish poo + water_value += O.reagents.get_reagent_amount("ice") * 0.80 //Ice is 80% value + var/message = "" + if(!water_value) //The container has no water value, clear everything in it + message = "The filtration process removes everything, leaving the water level unchanged." + O.reagents.clear_reagents() else - if(!water_level) - to_chat(user, "[src] is empty!") + if(water_level == water_capacity) + to_chat(user, "[src] is already full!") else - if(water_level >= C.volume) //Enough to fill the container completely - C.reagents.add_reagent("fishwater", C.volume) - adjust_water_level(-C.volume) - user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [C.name] from [src].") - else //Fill the container as much as possible with the water_level - C.reagents.add_reagent("fishwater", water_level) - adjust_water_level(-water_level) - user.visible_message("[user.name] scoops out some water from [src].", "You fill [C.name] with the last of the water in [src].") + message = "The filtration process purifies the water, raising the water level." + + if((water_level + water_value) == water_capacity) + message += " You filled [src] to the brim!" + if((water_level + water_value) > water_capacity) + message += " You overfilled [src] and some water runs down the side, wasted." + O.reagents.clear_reagents() + adjust_water_level(water_value) + user.visible_message("[user.name] pours the contents of [O.name] into [src].", "[message]") + //Empty containers will scoop out water, filling the container as much as possible from the water_level + else if(O.is_refillable()) + if(!water_level) + to_chat(user, "[src] is empty!") + else + if(water_level >= O.reagents.maximum_volume) //Enough to fill the container completely + O.reagents.add_reagent("fishwater", O.reagents.maximum_volume) + adjust_water_level(-O.reagents.maximum_volume) + user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [O.name] from [src].") + else //Fill the container as much as possible with the water_level + O.reagents.add_reagent("fishwater", water_level) + adjust_water_level(-water_level) + user.visible_message("[user.name] scoops out some water from [src].", "You fill [O.name] with the last of the water in [src].") //Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process else if(iswrench(O)) if(!water_level) diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm index 6086f2798a7..4cf5c58bd06 100644 --- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm +++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm @@ -235,7 +235,7 @@ //empties aren't sealed, so let's open it quietly drink_container = new drink_container() drink_container.canopened = 1 - drink_container.flags |= OPENCONTAINER + drink_container.container_type |= OPENCONTAINER drink_container.forceMove(loc) containers[con_type]-- diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index e64b74f1635..19997df2805 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -6,7 +6,7 @@ desc = "yummy" icon = 'icons/obj/drinks.dmi' icon_state = null - flags = OPENCONTAINER + container_type = OPENCONTAINER consume_sound = 'sound/items/drink.ogg' possible_transfer_amounts = list(5,10,15,20,25,30,50) volume = 50 @@ -26,7 +26,11 @@ /obj/item/reagent_containers/food/drinks/attack(mob/M, mob/user, def_zone) if(!reagents || !reagents.total_volume) to_chat(user, " None of [src] left, oh no!") - return 0 + return FALSE + + if(!is_drainable()) + to_chat(user, " You need to open [src] first!") + return FALSE if(istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M @@ -36,14 +40,13 @@ borg.cell.use(30) var/refill = reagents.get_master_reagent_id() if(refill in drinks) // Only synthesize drinks - spawn(600) - reagents.add_reagent(refill, bitesize) - return 1 - return 0 + addtimer(CALLBACK(reagents, /datum/reagents.proc/add_reagent, refill, bitesize), 600) + return TRUE + return FALSE /obj/item/reagent_containers/food/drinks/MouseDrop(atom/over_object) //CHUG! CHUG! CHUG! var/mob/living/carbon/chugger = over_object - if (!(flags & OPENCONTAINER)) + if (!(container_type & DRAINABLE)) to_chat(chugger, "You need to open [src] first!") return if(istype(chugger) && loc == chugger && src == chugger.get_active_hand() && reagents.total_volume) @@ -56,39 +59,18 @@ break /obj/item/reagent_containers/food/drinks/afterattack(obj/target, mob/user, proximity) - if(!proximity) return + if(!proximity) + return - // Moved from the can code; not necessary since closed cans aren't open containers now, but, eh. - if(istype(target, /obj/item/reagent_containers/food/drinks/cans)) - var/obj/item/reagent_containers/food/drinks/cans/cantarget = target - if(cantarget.canopened == 0) - to_chat(user, "You need to open the drink you want to pour into!") - return - - if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - - if(!target.reagents.total_volume) - to_chat(user, " [target] is empty.") - return - - if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, " [src] is full.") - return - - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) - to_chat(user, " You fill [src] with [trans] units of the contents of [target].") - - else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. + if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, " [src] is empty.") - return + return FALSE - if(target.reagents.total_volume >= target.reagents.maximum_volume) + if(target.reagents.holder_full()) to_chat(user, " [target] is full.") - return - - - + return FALSE + var/datum/reagent/refill var/datum/reagent/refillName if(isrobot(user)) @@ -103,18 +85,30 @@ var/mob/living/silicon/robot/bro = user var/chargeAmount = max(30,4*trans) bro.cell.use(chargeAmount) - to_chat(user, "Now synthesizing [trans] units of [refillName]...") + to_chat(user, "Now synthesizing [trans] units of [refillName]...") + addtimer(CALLBACK(reagents, /datum/reagents.proc/add_reagent, refill, trans), 300) + addtimer(CALLBACK(GLOBAL_PROC, .proc/__to_chat, user, "Cyborg [src] refilled."), 300) + else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. + if(!is_refillable()) + to_chat(user, "[src]'s tab isn't open!") + return FALSE + if(!target.reagents.total_volume) + to_chat(user, "[target] is empty.") + return FALSE - spawn(300) - reagents.add_reagent(refill, trans) - to_chat(user, "Cyborg [src] refilled.") + if(reagents.holder_full()) + to_chat(user, "[src] is full.") + return FALSE - return + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) + to_chat(user, "You fill [src] with [trans] units of the contents of [target].") + + return FALSE /obj/item/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird - return + return FALSE if(is_hot(I)) if(reagents) reagents.chem_temp += 15 @@ -151,7 +145,8 @@ materials = list(MAT_METAL=100) possible_transfer_amounts = list() volume = 5 - flags = CONDUCT | OPENCONTAINER + flags = CONDUCT + container_type = OPENCONTAINER /obj/item/reagent_containers/food/drinks/trophy/gold_cup name = "gold cup" diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index b0c0d24efaa..60642cab847 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -10,7 +10,7 @@ desc = "Just your average condiment container." icon = 'icons/obj/food/containers.dmi' icon_state = "emptycondiment" - flags = OPENCONTAINER + container_type = OPENCONTAINER possible_transfer_amounts = list(1, 5, 10, 15, 20, 25, 30, 50) volume = 50 //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites. @@ -47,7 +47,7 @@ if(!reagents || !reagents.total_volume) return // The condiment might be empty after the delay. user.visible_message("[user] feeds [M] from [src].") - add_attack_logs(user, M, "Fed [src] containing [reagentlist()]") + add_attack_logs(user, M, "Fed [src] containing [reagents.log_list()]") var/fraction = min(10/reagents.total_volume, 1) reagents.reaction(M, INGEST, fraction) @@ -75,7 +75,7 @@ to_chat(user, "You fill [src] with [trans] units of the contents of [target].") //Something like a glass or a food item. Player probably wants to transfer TO it. - else if(target.is_open_container() || istype(target, /obj/item/reagent_containers/food/snacks)) + else if(target.is_drainable() || istype(target, /obj/item/reagent_containers/food/snacks)) if(!reagents.total_volume) to_chat(user, "[src] is empty!") return diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index 9de98749e42..d97d5742b06 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -8,7 +8,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 - flags = OPENCONTAINER + container_type = OPENCONTAINER var/operating = 0 // Is it on? var/dirty = 0 // = {0..100} Does it need cleaning? var/broken = 0 // ={0,1,2} How broken is it??? @@ -93,7 +93,7 @@ icon_state = off_icon broken = 0 // Fix it! dirty = 0 // just to be sure - flags = OPENCONTAINER + container_type = OPENCONTAINER else to_chat(user, "It's broken!") return 1 @@ -105,7 +105,7 @@ dirty = 0 // It's clean! broken = 0 // just to be sure icon_state = off_icon - flags = OPENCONTAINER + container_type = OPENCONTAINER else //Otherwise bad luck!! to_chat(user, "It's dirty!") return 1 diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 6b2da2c29ae..a3453585817 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -21,7 +21,7 @@ icon_state = "weedspray" item_state = "plantbgone" volume = 100 - flags = OPENCONTAINER + container_type = OPENCONTAINER slot_flags = SLOT_BELT throwforce = 0 w_class = WEIGHT_CLASS_SMALL @@ -43,7 +43,7 @@ icon_state = "pestspray" item_state = "plantbgone" volume = 100 - flags = OPENCONTAINER + container_type = OPENCONTAINER slot_flags = SLOT_BELT throwforce = 0 w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index b5bea1fc6b3..92f91ddf51a 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -763,8 +763,8 @@ else if(transfer_amount) // Droppers, cans, beakers, what have you. visi_msg="[user] uses [reagent_source] on [target]" irrigate = 1 - // Beakers, bottles, buckets, etc. Can't use is_open_container though. - if(istype(reagent_source, /obj/item/reagent_containers/glass/)) + // Beakers, bottles, buckets, etc. + if(reagent_source.is_drainable()) playsound(loc, 'sound/effects/slosh.ogg', 25, 1) if(irrigate && transfer_amount > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c5557028896..ea2d66745f0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1019,7 +1019,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, return 1 /mob/living/carbon/proc/forceFedAttackLog(var/obj/item/reagent_containers/food/toEat, mob/user) - add_attack_logs(user, src, "Fed [toEat]. Reagents: [toEat.reagentlist(toEat)]", ATKLOG_FEW) + add_attack_logs(user, src, "Fed [toEat]. Reagents: [toEat.reagents.log_list(toEat)]", ATKLOG_FEW) if(!iscarbon(user)) LAssailant = null else diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fdd91bf1cd9..591c62ff862 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -329,7 +329,13 @@ /mob/living/proc/can_inject() - return 1 + return TRUE + +/mob/living/is_injectable(allowmobs = TRUE) + return (allowmobs && reagents && can_inject()) + +/mob/living/is_drawable(allowmobs = TRUE) + return (allowmobs && reagents && can_inject()) /mob/living/proc/get_organ_target() var/mob/shooter = src diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 4e3aaefd1eb..83897e5cbd3 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -123,7 +123,7 @@ * Sleepypens */ /obj/item/pen/sleepy - flags = OPENCONTAINER + container_type = OPENCONTAINER origin_tech = "engineering=4;syndicate=2" diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index f3c5db5da22..43112467f33 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -242,11 +242,11 @@ name = "shotgun dart" desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical." icon_state = "cshell" + container_type = OPENCONTAINER projectile_type = /obj/item/projectile/bullet/dart /obj/item/ammo_casing/shotgun/dart/New() ..() - flags |= OPENCONTAINER create_reagents(30) /obj/item/ammo_casing/shotgun/dart/attackby() diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm index 5c78613fbdf..7b39bfa3be8 100644 --- a/code/modules/projectiles/guns/dartgun.dm +++ b/code/modules/projectiles/guns/dartgun.dm @@ -29,7 +29,7 @@ var/obj/item/dart_cartridge/cartridge = null //Container of darts. var/max_beakers = 3 var/dart_reagent_amount = 15 - var/container_type = /obj/item/reagent_containers/glass/beaker + var/containers_type = /obj/item/reagent_containers/glass/beaker var/list/starting_chems = null /obj/item/gun/dartgun/update_icon() @@ -49,7 +49,7 @@ ..() if(starting_chems) for(var/chem in starting_chems) - var/obj/B = new container_type(src) + var/obj/B = new containers_type(src) B.reagents.add_reagent(chem, 50) beakers += B cartridge = new /obj/item/dart_cartridge(src) @@ -87,7 +87,7 @@ update_icon() return if(istype(I, /obj/item/reagent_containers/glass)) - if(!istype(I, container_type)) + if(!istype(I, containers_type)) to_chat(user, "[I] doesn't seem to fit into [src].") return if(beakers.len >= max_beakers) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index f0816022b64..fa010a69e49 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -143,7 +143,8 @@ fire_sound = 'sound/weapons/laser.ogg' usesound = 'sound/items/Welder.ogg' toolspeed = 1 - flags = CONDUCT | OPENCONTAINER + container_type = OPENCONTAINER + flags = CONDUCT attack_verb = list("attacked", "slashed", "cut", "sliced") force = 12 sharp = 1 diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index dacd44a5035..e54c9689be2 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -678,6 +678,16 @@ var/const/INGEST = 2 stuff += A.id return english_list(stuff) +/datum/reagents/proc/log_list() + if(!length(reagent_list)) + return "no reagents" + var/list/data = list() + for(var/r in reagent_list) //no reagents will be left behind + var/datum/reagent/R = r + data += "[R.id] ([round(R.volume, 0.1)]u)" + //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. + return english_list(data) + //two helper functions to preserve data across reactions (needed for xenoarch) /datum/reagents/proc/get_data(reagent_id) for(var/datum/reagent/D in reagent_list) @@ -739,6 +749,11 @@ var/const/INGEST = 2 break return result +/datum/reagents/proc/holder_full() + if(total_volume >= maximum_volume) + return TRUE + return FALSE + /datum/reagents/Destroy() . = ..() processing_objects -= src diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index aa1f8aaf385..3a5b753217f 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -30,7 +30,6 @@ if(BL.data && BL.data["viruses"]) var/list/viruses = BL.data["viruses"] return viruses[index] - return null /obj/machinery/computer/pandemic/proc/GetResistancesByIndex(index) if(beaker && beaker.reagents) @@ -40,13 +39,11 @@ if(BL.data && BL.data["resistances"]) var/list/resistances = BL.data["resistances"] return resistances[index] - return null /obj/machinery/computer/pandemic/proc/GetVirusTypeByIndex(index) var/datum/disease/D = GetVirusByIndex(index) if(D) return D.GetDiseaseID() - return null /obj/machinery/computer/pandemic/proc/replicator_cooldown(waittime) wait = 1 @@ -175,7 +172,6 @@ return add_fingerprint(usr) - return //Prints a nice virus release form. Props to Urbanliner for the layout /obj/machinery/computer/pandemic/proc/print_form(var/datum/disease/advance/D, mob/living/user) @@ -319,12 +315,12 @@ popup.set_content(dat) popup.open(0) onclose(user, "pandemic") - return /obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers) && (I.flags & OPENCONTAINER)) - if(stat & (NOPOWER|BROKEN)) return + if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER)) + if(stat & (NOPOWER|BROKEN)) + return if(beaker) to_chat(user, "A beaker is already loaded into the machine!") return diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 5948d29e4cd..9ea55dd5af7 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -112,7 +112,7 @@ if(default_unfasten_wrench(user, I)) return - if (istype(I, /obj/item/reagent_containers) && (I.flags & OPENCONTAINER) ) + if (istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER) ) if (!beaker) if(!user.drop_item()) return 1 diff --git a/code/modules/reagents/chemistry/readme.dm b/code/modules/reagents/chemistry/readme.dm index 1fe946a10d1..6c76d0a3a0f 100644 --- a/code/modules/reagents/chemistry/readme.dm +++ b/code/modules/reagents/chemistry/readme.dm @@ -238,12 +238,4 @@ About the Tools: It simply tells us how much to transfer when 'pouring' our reagents into something else. - atom/proc/is_open_container() - Checks atom/var/flags & OPENCONTAINER. - If this returns 1 , you can use syringes, beakers etc - to manipulate the contents of this object. - If it's 0, you'll need to write your own custom reagent - transfer code since you will not be able to use the standard - tools to manipulate it. - */ \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index e3e0daee333..258bf98468d 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -61,14 +61,6 @@ /obj/item/reagent_containers/afterattack(obj/target, mob/user , flag) return -/obj/item/reagent_containers/proc/reagentlist() //Return reagents in a reagent_container, default to source - var/data - if(reagents && reagents.reagent_list && reagents.reagent_list.len) //find a reagent list if there is and check if it has entries - for(var/datum/reagent/R in reagents.reagent_list) //no reagents will be left behind - data += "[R.id]([R.volume] units); " //Using IDs because SOME chemicals(I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. - return data - else return "No reagents" - /obj/item/reagent_containers/wash(mob/user, atom/source) if(is_open_container()) if(reagents.total_volume >= volume) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 22332bd4103..337b78882cf 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -9,7 +9,7 @@ item_state = "atoxinbottle" amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30) - flags = OPENCONTAINER + container_type = OPENCONTAINER volume = 30 /obj/item/reagent_containers/glass/bottle/on_reagent_change() diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index d20ef6f82ee..69030fafa74 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -11,7 +11,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,50) volume = 50 - flags = OPENCONTAINER + container_type = OPENCONTAINER var/label_text = "" // the fucking asshole who designed this can go die in a fire - Iamgoofball @@ -59,10 +59,10 @@ ..() if(is_open_container()) to_chat(usr, "You put the lid on [src].") - flags ^= OPENCONTAINER + container_type ^= REFILLABLE | DRAINABLE else to_chat(usr, "You take the lid off [src].") - flags |= OPENCONTAINER + container_type |= REFILLABLE | DRAINABLE update_icon() /obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity) @@ -262,7 +262,7 @@ volume = 100 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,50,100) - flags = OPENCONTAINER + container_type = OPENCONTAINER /obj/item/reagent_containers/glass/beaker/vial name = "vial" @@ -272,7 +272,7 @@ volume = 25 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25) - flags = OPENCONTAINER + container_type = OPENCONTAINER can_assembly = 0 /obj/item/reagent_containers/glass/beaker/drugs @@ -282,7 +282,7 @@ amount_per_transfer_from_this = 2 possible_transfer_amounts = 2 volume = 10 - flags = OPENCONTAINER + container_type = OPENCONTAINER can_assembly = 0 /obj/item/reagent_containers/glass/beaker/noreact @@ -293,7 +293,7 @@ volume = 50 amount_per_transfer_from_this = 10 origin_tech = "materials=2;engineering=3;plasmatech=3" - flags = OPENCONTAINER + container_type = OPENCONTAINER /obj/item/reagent_containers/glass/beaker/noreact/New() ..() @@ -307,7 +307,7 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,50,100,300) - flags = OPENCONTAINER + container_type = OPENCONTAINER origin_tech = "bluespace=5;materials=4;plasmatech=4" /obj/item/reagent_containers/glass/beaker/cryoxadone @@ -337,7 +337,7 @@ volume = 120 armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) slot_flags = SLOT_HEAD - flags = OPENCONTAINER + container_type = OPENCONTAINER /obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot) ..() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index ced02f2e48f..042b12e3122 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -11,7 +11,7 @@ amount_per_transfer_from_this = 5 volume = 30 possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30) - flags = OPENCONTAINER + container_type = OPENCONTAINER slot_flags = SLOT_BELT var/ignore_flags = FALSE var/emagged = FALSE diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 02ab4408acb..7c0823c2497 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -4,7 +4,8 @@ icon = 'icons/obj/janitor.dmi' icon_state = "cleaner" item_state = "cleaner" - flags = OPENCONTAINER | NOBLUDGEON + flags = NOBLUDGEON + container_type = OPENCONTAINER slot_flags = SLOT_BELT throwforce = 0 w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 38478abd0e7..654dff53b5e 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -16,6 +16,7 @@ volume = 15 w_class = WEIGHT_CLASS_TINY sharp = 1 + container_type = TRANSPARENT var/busy = 0 var/mode = SYRINGE_DRAW var/projectile_type = /obj/item/projectile/bullet/dart/syringe @@ -78,7 +79,7 @@ switch(mode) if(SYRINGE_DRAW) - if(reagents.total_volume >= reagents.maximum_volume) + if(reagents.holder_full()) to_chat(user, "The syringe is full.") return @@ -91,7 +92,7 @@ if(!do_mob(user, target)) busy = 0 return - if(reagents.total_volume >= reagents.maximum_volume) + if(reagents.holder_full()) return busy = 0 if(L.transfer_blood_to(src, drawn_amount)) @@ -104,14 +105,14 @@ to_chat(user, "[target] is empty!") return - if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract)) + if(!target.is_drawable()) to_chat(user, "You cannot directly remove reagents from [target]!") return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? to_chat(user, "You fill [src] with [trans] units of the solution.") - if(reagents.total_volume >= reagents.maximum_volume) + if(reagents.holder_full()) mode=!mode update_icon() @@ -120,7 +121,7 @@ to_chat(user, "[src] is empty.") return - if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/storage/fancy/cigarettes)) + if(!L && !target.is_injectable()) to_chat(user, "You cannot directly fill [target]!") return if(target.reagents.total_volume >= target.reagents.maximum_volume) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index bcbcad6bc98..a90dd80ac59 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -6,28 +6,22 @@ density = 1 anchored = 0 pressure_resistance = 2*ONE_ATMOSPHERE + container_type = DRAINABLE | AMOUNT_VISIBLE var/tank_volume = 1000 //In units, how much the dispenser can hold var/reagent_id = "water" //The ID of the reagent that the dispenser uses var/lastrigger = "" // The last person to rig this fuel tank - Stored with the object. Only the last person matter for investigation -/obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user, params) - return +/obj/structure/reagent_dispensers/attackby(obj/item/I, mob/user, params) + . = ..() + if(I.is_refillable()) + return FALSE //so we can refill them via their afterattack. /obj/structure/reagent_dispensers/New() create_reagents(tank_volume) reagents.add_reagent(reagent_id, tank_volume) ..() -/obj/structure/reagent_dispensers/examine(mob/user) - if(!..(user, 2)) - return - if(reagents.total_volume) - to_chat(user, "It has [reagents.total_volume] units left.") - else - to_chat(user, "It's empty.") - - /obj/structure/reagent_dispensers/proc/boom() visible_message("[src] ruptures!") chem_splash(loc, 5, list(reagents)) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index ce728a4fde3..57a0eaef7da 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -8,7 +8,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). name = "Circuit Imprinter" desc = "Manufactures circuit boards for the construction of machines." icon_state = "circuit_imprinter" - flags = OPENCONTAINER + container_type = OPENCONTAINER var/efficiency_coeff diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 0fa843cb8ae..a441dff00b3 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -11,7 +11,7 @@ Note: Must be placed west/left of and R&D console to function. name = "Protolathe" desc = "Converts raw materials into useful objects." icon_state = "protolathe" - flags = OPENCONTAINER + container_type = OPENCONTAINER var/efficiency_coeff diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 56ef19b7c1a..9ad049c604b 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -8,6 +8,7 @@ icon_state = "grey slime extract" force = 1 w_class = WEIGHT_CLASS_TINY + container_type = INJECTABLE | DRAWABLE throwforce = 0 throw_speed = 3 throw_range = 6 From a71377108a900f537dc77ab48003d2c74ef5e8bd Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sat, 13 Oct 2018 21:11:18 +0800 Subject: [PATCH 03/37] Improve revenant code a bit --- .../gamemodes/miniantags/revenant/revenant.dm | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index d75a1bd6d52..ce1f5fc980b 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -121,9 +121,20 @@ remove_from_all_data_huds() spawn(5) - if(src.mind) - src.mind.wipe_memory() - src << 'sound/effects/ghost.ogg' + if(mind) + giveObjectivesandGoals() + if(!giveSpells()) + message_admins("Revenant was created but has no mind. Trying again in ten seconds.") + addtimer(CALLBACK(src, .proc/tryGiveinTen), 100) + +/mob/living/simple_animal/revenant/proc/tryGiveinTen() + if(!giveSpells()) + message_admins("Revenant still has no mind. Deleting...") + qdel(src) + else + giveObjectivesandGoals() + +/mob/living/simple_animal/revenant/proc/giveObjectivesandGoals() to_chat(src, "
") to_chat(src, "You are a revenant.") to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.") @@ -132,22 +143,15 @@ to_chat(src, "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.") to_chat(src, "You do not remember anything of your past lives, nor will you remember anything about this one after your death.") to_chat(src, "Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more.") - var/datum/objective/revenant/objective = new - objective.owner = src.mind - src.mind.objectives += objective + objective.owner = mind + mind.objectives += objective to_chat(src, "Objective #1: [objective.explanation_text]") var/datum/objective/revenantFluff/objective2 = new - objective2.owner = src.mind - src.mind.objectives += objective2 + objective2.owner = mind + mind.objectives += objective2 to_chat(src, "Objective #2: [objective2.explanation_text]") - ticker.mode.traitors |= src.mind //Necessary for announcing - if(!src.giveSpells()) - message_admins("Revenant was created but has no mind. Trying again in five seconds.") - spawn(50) - if(!src.giveSpells()) - message_admins("Revenant still has no mind. Deleting...") - qdel(src) + ticker.mode.traitors |= mind //Necessary for announcing /mob/living/simple_animal/revenant/proc/giveSpells() if(src.mind) From 747684927ada8e635c16a6e1c6f7cae5cdff5a34 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sat, 13 Oct 2018 22:12:37 +0800 Subject: [PATCH 04/37] Formatting fixes & spanning fish tank --- code/game/atoms.dm | 8 +-- .../objects/items/weapons/extinguisher.dm | 2 +- code/modules/fish/fishtank.dm | 64 +++++++++---------- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index fd1cb0e32c1..77f3a59a12b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -278,17 +278,17 @@ if(reagents) if(container_type & TRANSPARENT) - to_chat(user, "It contains:") + to_chat(user, "It contains:") if(reagents.reagent_list.len) if(user.can_see_reagents()) //Show each individual reagent for(var/I in reagents.reagent_list) var/datum/reagent/R = I - to_chat(user, "[R.volume] units of [R.name]") + to_chat(user, "[R.volume] units of [R.name]") else //Otherwise, just show the total volume if(reagents && reagents.reagent_list.len) - to_chat(user, "[reagents.total_volume] units of various reagents.") + to_chat(user, "[reagents.total_volume] units of various reagents.") else - to_chat(user, "Nothing.") + to_chat(user, "Nothing. ") else if(container_type & AMOUNT_VISIBLE) if(reagents.total_volume) to_chat(user, "It has [reagents.total_volume] unit\s left.") diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index d32d98f3a27..3d893c86371 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -38,7 +38,7 @@ /obj/item/extinguisher/examine(mob/user) . = ..() - to_chat(user, "The safety is [safety ? "on" : "off"].") + to_chat(user, "The safety is [safety ? "on" : "off"].") /obj/item/extinguisher/New() diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index 524395a0ac0..63d07ad3d27 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -474,7 +474,7 @@ //Finally, report the full examine_message constructed from the above reports - to_chat(user, "[examine_message]") + to_chat(user, "[examine_message]") return examine_message ////////////////////////////// @@ -485,39 +485,39 @@ if(istype(M, /mob/living/simple_animal/pet/cat)) if(M.a_intent == INTENT_HELP) //Cats can try to fish in open tanks on help intent if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open. - M.visible_message("[M.name] stares at into [src] while sitting perfectly still.", "The lid is closed, so you stare into [src] intently.") + M.visible_message("[M.name] stares at into [src] while sitting perfectly still.", "The lid is closed, so you stare into [src] intently.") else if(fish_count) //Tank must actually have fish to try catching one - M.visible_message("[M.name] leaps up onto [src] and attempts to fish through the opening!", "You jump up onto [src] and begin fishing through the opening!") + M.visible_message("[M.name] leaps up onto [src] and attempts to fish through the opening!", "You jump up onto [src] and begin fishing through the opening!") if(water_level && prob(45)) //If there is water, there is a chance the cat will slip, Syndicat will spark like E-N when this happens - M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!") + M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!") if(istype(M, /mob/living/simple_animal/pet/cat/Syndi)) var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, 1, src) s.start() else //No water or didn't slip, get that fish! - M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!") + M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!") kill_fish() //Kill a random fish M.health = M.maxHealth //Eating fish heals the predator else - to_chat(M, "There are no fish in [src]!") + to_chat(M, "There are no fish in [src]!") else return ..() else if(istype(M, /mob/living/simple_animal/hostile/bear)) if(M.a_intent == INTENT_HELP) //Bears can try to fish in open tanks on help intent if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open. - M.visible_message("[M.name] scrapes it's claws along [src]'s lid.", "The lid is closed, so you scrape your claws against [src]'s lid.") + M.visible_message("[M.name] scrapes it's claws along [src]'s lid.", "The lid is closed, so you scrape your claws against [src]'s lid.") else if(fish_count) //Tank must actually have fish to try catching one - M.visible_message("[M.name] reaches into [src] and attempts to fish through the opening!", "You reach into [src] and begin fishing through the opening!") + M.visible_message("[M.name] reaches into [src] and attempts to fish through the opening!", "You reach into [src] and begin fishing through the opening!") if(water_level && prob(5)) //Bears are good at catching fish, only a 5% chance to fail - M.visible_message("[M.name] swipes at the water!", "You just barely missed that fish!") + M.visible_message("[M.name] swipes at the water!", "You just barely missed that fish!") else //No water or didn't slip, get that fish! - M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!") + M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!") kill_fish() //Kill a random fish M.health = M.maxHealth //Eating fish heals the predator else - to_chat(M, "There are no fish in [src]!") + to_chat(M, "There are no fish in [src]!") else return ..() else @@ -532,8 +532,8 @@ "You hear a banging sound.") else playsound(loc, 'sound/effects/glassknock.ogg', 80, 1) - user.visible_message("[user.name] taps on the [name].", \ - "You tap on the [name].", \ + user.visible_message("[user.name] taps on the [name].", \ + "You tap on the [name].", \ "You hear a knocking sound.") /obj/machinery/fishtank/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) @@ -573,14 +573,14 @@ if(W.isOn()) if(obj_integrity < max_integrity) playsound(loc, W.usesound, 50, 1) - to_chat(user, "You repair some of the cracks on [src].") + to_chat(user, "You repair some of the cracks on [src].") obj_integrity = min(obj_integrity + 20, max_integrity) check_health() else - to_chat(user, "There is no damage to fix!") + to_chat(user, "There is no damage to fix!") else if(obj_integrity < max_integrity) - to_chat(user, "[W] must be on to repair this damage.") + to_chat(user, "[W] must be on to repair this damage.") else return ..() //Open reagent containers add and remove water @@ -600,7 +600,7 @@ O.reagents.clear_reagents() else if(water_level == water_capacity) - to_chat(user, "[src] is already full!") + to_chat(user, "[src] is already full!") else message = "The filtration process purifies the water, raising the water level." @@ -610,20 +610,20 @@ message += " You overfilled [src] and some water runs down the side, wasted." O.reagents.clear_reagents() adjust_water_level(water_value) - user.visible_message("[user.name] pours the contents of [O.name] into [src].", "[message]") + user.visible_message("[user.name] pours the contents of [O.name] into [src].", "[message]") //Empty containers will scoop out water, filling the container as much as possible from the water_level else if(O.is_refillable()) if(!water_level) - to_chat(user, "[src] is empty!") + to_chat(user, "[src] is empty!") else if(water_level >= O.reagents.maximum_volume) //Enough to fill the container completely O.reagents.add_reagent("fishwater", O.reagents.maximum_volume) adjust_water_level(-O.reagents.maximum_volume) - user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [O.name] from [src].") + user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [O.name] from [src].") else //Fill the container as much as possible with the water_level O.reagents.add_reagent("fishwater", water_level) adjust_water_level(-water_level) - user.visible_message("[user.name] scoops out some water from [src].", "You fill [O.name] with the last of the water in [src].") + user.visible_message("[user.name] scoops out some water from [src].", "You fill [O.name] with the last of the water in [src].") //Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process else if(iswrench(O)) if(!water_level) @@ -632,17 +632,17 @@ if(do_after(user, 50 * O.toolspeed, target = src)) deconstruct(TRUE) else - to_chat(user, "[src] must be empty before you disassemble it!") + to_chat(user, "[src] must be empty before you disassemble it!") //Fish eggs else if(istype(O, /obj/item/fish_eggs)) var/obj/item/fish_eggs/egg = O //Don't add eggs if there is no water (they kinda need that to live) if(!water_level) - to_chat(user, "[src] has no water; [egg.name] won't hatch without water!") + to_chat(user, "[src] has no water; [egg.name] won't hatch without water!") else //Don't add eggs if the tank already has the max number of fish if(fish_count >= max_fish) - to_chat(user, "[src] can't hold any more fish.") + to_chat(user, "[src] can't hold any more fish.") else add_fish(egg.fish_type) qdel(egg) @@ -652,30 +652,30 @@ if(water_level) if(food_level < 10) if(fish_count == 0) - user.visible_message("[user.name] shakes some fish food into the empty [src]... How sad.", "You shake some fish food into the empty [src]... If only it had fish.") + user.visible_message("[user.name] shakes some fish food into the empty [src]... How sad.", "You shake some fish food into the empty [src]... If only it had fish.") else - user.visible_message("[user.name] feeds the fish in [src]. The fish look excited!", "You feed the fish in [src]. They look excited!") + user.visible_message("[user.name] feeds the fish in [src]. The fish look excited!", "You feed the fish in [src]. They look excited!") adjust_food_level(10) else - to_chat(user, "[src] already has plenty of food in it. You decide to not add more.") + to_chat(user, "[src] already has plenty of food in it. You decide to not add more.") else - to_chat(user, "[src] doesn't have any water in it. You should fill it with water first.") + to_chat(user, "[src] doesn't have any water in it. You should fill it with water first.") //Fish egg scoop else if(istype(O, /obj/item/egg_scoop)) if(egg_count) - user.visible_message("[user.name] harvests some fish eggs from [src].", "You scoop the fish eggs out of [src].") + user.visible_message("[user.name] harvests some fish eggs from [src].", "You scoop the fish eggs out of [src].") harvest_eggs(user) else - user.visible_message("[user.name] fails to harvest any fish eggs from [src].", "There are no fish eggs in [src] to scoop out.") + user.visible_message("[user.name] fails to harvest any fish eggs from [src].", "There are no fish eggs in [src] to scoop out.") //Fish net else if(istype(O, /obj/item/fish_net)) harvest_fish(user) //Tank brush else if(istype(O, /obj/item/tank_brush)) if(filth_level == 0) - to_chat(user, "[src] is already spotless!") + to_chat(user, "[src] is already spotless!") else adjust_filth_level(-filth_level) - user.visible_message("[user.name] scrubs the inside of [src], cleaning the filth.", "You scrub the inside of [src], cleaning the filth.") + user.visible_message("[user.name] scrubs the inside of [src], cleaning the filth.", "You scrub the inside of [src], cleaning the filth.") else return ..() \ No newline at end of file From 2607eac734a66c1a6566c0b8e012dfd6656cde17 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sat, 13 Oct 2018 22:33:32 +0800 Subject: [PATCH 05/37] Fixes missing sound --- code/game/gamemodes/miniantags/revenant/revenant.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index ce1f5fc980b..21d35be839b 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -125,9 +125,9 @@ giveObjectivesandGoals() if(!giveSpells()) message_admins("Revenant was created but has no mind. Trying again in ten seconds.") - addtimer(CALLBACK(src, .proc/tryGiveinTen), 100) + addtimer(CALLBACK(src, .proc/giveSpellsObjectivesordelete), 100) -/mob/living/simple_animal/revenant/proc/tryGiveinTen() +/mob/living/simple_animal/revenant/proc/giveSpellsObjectivesordelete() if(!giveSpells()) message_admins("Revenant still has no mind. Deleting...") qdel(src) @@ -135,6 +135,8 @@ giveObjectivesandGoals() /mob/living/simple_animal/revenant/proc/giveObjectivesandGoals() + mind.wipe_memory() + SEND_SOUND(src, 'sound/effects/ghost.ogg') to_chat(src, "
") to_chat(src, "You are a revenant.") to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.") From 6e70f1eed313a1c7b4fae5359573f360750394ad Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Mon, 15 Oct 2018 18:35:11 +0800 Subject: [PATCH 06/37] SECONDS --- code/game/gamemodes/miniantags/revenant/revenant.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 21d35be839b..1969aaaaab9 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -125,7 +125,7 @@ giveObjectivesandGoals() if(!giveSpells()) message_admins("Revenant was created but has no mind. Trying again in ten seconds.") - addtimer(CALLBACK(src, .proc/giveSpellsObjectivesordelete), 100) + addtimer(CALLBACK(src, .proc/giveSpellsObjectivesordelete), 10 SECONDS) /mob/living/simple_animal/revenant/proc/giveSpellsObjectivesordelete() if(!giveSpells()) From 6d6c6bba9d5fe0bdeae2be265af140b836943b37 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Wed, 17 Oct 2018 20:18:55 +0200 Subject: [PATCH 07/37] Viromancy! --- code/datums/uplink_item.dm | 10 ++++++++++ .../modules/reagents/reagent_containers/dropper.dm | 14 +++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 82af6fef4d9..0b76f203784 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -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/rad_laser + name = "Viral Injector" + desc = "A modified hypospray disguised as a functional pipette. The pipette can infect victims with viruses upon injection." + reference = "RL" + item = /obj/item/reagent_containers/dropper/precision/viral_injector + cost = 3 + job = list("Virologist") + /datum/uplink_item/dangerous/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." diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 6198313bf88..46c1375e605 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -108,4 +108,16 @@ 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 \ No newline at end of file + 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, "You stab [M] with the [src].") + add_attack_logs(user, M, "Stabbed with Viral Injector") + + if(reagents.total_volume && M.reagents) + reagents.reaction(M, INGEST, reagents.total_volume) + reagents.trans_to(M, 1) From 4041e13afcb1b09107637cc2db01d7e091b47966 Mon Sep 17 00:00:00 2001 From: farie82 Date: Wed, 17 Oct 2018 22:41:11 +0200 Subject: [PATCH 08/37] Update uplink_item.dm --- code/datums/uplink_item.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 0b76f203784..51e22f36e1f 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -222,10 +222,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) //Virology -/datum/uplink_item/jobspecific/rad_laser +/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 = "RL" + reference = "VI" item = /obj/item/reagent_containers/dropper/precision/viral_injector cost = 3 job = list("Virologist") From 4869767d57da5060da94bbef3a0b62ec7b82a324 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Thu, 18 Oct 2018 10:45:07 +0800 Subject: [PATCH 09/37] Revvie fixes --- .../gamemodes/miniantags/revenant/revenant.dm | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 1969aaaaab9..16b39ab9911 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -120,19 +120,33 @@ updateallghostimages() remove_from_all_data_huds() - spawn(5) - if(mind) - giveObjectivesandGoals() - if(!giveSpells()) - message_admins("Revenant was created but has no mind. Trying again in ten seconds.") - addtimer(CALLBACK(src, .proc/giveSpellsObjectivesordelete), 10 SECONDS) - -/mob/living/simple_animal/revenant/proc/giveSpellsObjectivesordelete() - if(!giveSpells()) - message_admins("Revenant still has no mind. Deleting...") - qdel(src) - else + addtimer(CALLBACK(src, .proc/firstSetupAttempt), 15 SECONDS) // Give admin 10 seconds to put in a ghost (Or wait 10 seconds before giving it objectives) + + +/mob/living/simple_animal/revenant/proc/firstSetupAttempt() + if(mind) giveObjectivesandGoals() + giveSpells() + else + message_admins("Revenant was created but has no mind. Put a ghost inside, or a poll will be made in one minute.") + addtimer(CALLBACK(src, .proc/setupOrDelete), 1 MINUTES) + +/mob/living/simple_animal/revenant/proc/setupOrDelete() + if(mind) + giveObjectivesandGoals() + giveSpells() + else + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [real_name]?", poll_time = 15 SECONDS) + var/mob/dead/observer/theghost = null + if(candidates.len) + theghost = pick(candidates) + message_admins("[key_name_admin(theghost)] has taken control of a revenant created without a mind") + key = theghost.key + giveObjectivesandGoals() + giveSpells() + else + message_admins("No ghost was willing to take control of a mindless revenant. Deleting...") + qdel(src) /mob/living/simple_animal/revenant/proc/giveObjectivesandGoals() mind.wipe_memory() @@ -156,14 +170,12 @@ ticker.mode.traitors |= mind //Necessary for announcing /mob/living/simple_animal/revenant/proc/giveSpells() - if(src.mind) - src.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) - src.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) - src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) - src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) - src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null)) - return 1 - return 0 + mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) + mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) + mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) + mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) + mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null)) + return TRUE /mob/living/simple_animal/revenant/dust() From ede44776892ee9a0d675be39da189e77d01e214a Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Thu, 18 Oct 2018 23:18:18 +0200 Subject: [PATCH 10/37] Added logging --- .../reagents/reagent_containers/dropper.dm | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 46c1375e605..222475dac74 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -116,8 +116,29 @@ /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, "You stab [M] with the [src].") - add_attack_logs(user, M, "Stabbed with Viral Injector") - if(reagents.total_volume && M.reagents) - reagents.reaction(M, INGEST, reagents.total_volume) - reagents.trans_to(M, 1) + var/list/injected = list() + for(var/datum/reagent/R in reagents.reagent_list) + injected += R.name + var/datum/reagent/blood/B = R + + if(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])") From 927fd6febc381b8337c0ca0de9195624664d2d3f Mon Sep 17 00:00:00 2001 From: farie82 Date: Fri, 19 Oct 2018 08:24:57 +0200 Subject: [PATCH 11/37] Damn web IDE adding enters and shizle --- code/datums/uplink_item.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 9ec6dbe90fb..a2ea8d3a23a 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -231,7 +231,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) 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." item = /obj/item/grenade/spawnergrenade/feral_cats From bbff7546d0ec570f40cbb450369a07005a17685b Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sat, 20 Oct 2018 18:58:42 +0200 Subject: [PATCH 12/37] Fixed the weirdness --- code/modules/reagents/reagent_containers/dropper.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 222475dac74..19fb197c077 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -122,7 +122,7 @@ injected += R.name var/datum/reagent/blood/B = R - if(B && B.data["viruses"]) + if(istype(B) && B.data["viruses"]) var/virList = list() for(var/dis in B.data["viruses"]) var/datum/disease/D = dis From a3b7b3c8c04aef337b2d94fcaa76c42860a6e146 Mon Sep 17 00:00:00 2001 From: Purpose Date: Sat, 20 Oct 2018 21:59:00 +0100 Subject: [PATCH 13/37] this does nothing --- code/controllers/subsystem/atoms.dm | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 54adebf5125..a0b2d49d958 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -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)) From 9c47fbd00f3834dcbd7996683bf33f81fc1d5a8b Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 00:03:49 +0000 Subject: [PATCH 14/37] Automatic changelog compile, [ci skip] --- html/changelog.html | 32 +++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 18 +++++++++++++ html/changelogs/AutoChangeLog-pr-9562.yml | 4 --- html/changelogs/AutoChangeLog-pr-9719.yml | 4 --- html/changelogs/AutoChangeLog-pr-9839.yml | 4 --- html/changelogs/AutoChangeLog-pr-9842.yml | 4 --- html/changelogs/AutoChangeLog-pr-9895.yml | 5 ---- html/changelogs/AutoChangeLog-pr-9913.yml | 4 --- html/changelogs/AutoChangeLog-pr-9914.yml | 4 --- html/changelogs/AutoChangeLog-pr-9920.yml | 4 --- 10 files changed, 50 insertions(+), 33 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9562.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9719.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9839.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9842.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9895.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9913.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9914.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9920.yml diff --git a/html/changelog.html b/html/changelog.html index 38a71165fc0..a031279a516 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,38 @@ -->
+

21 October 2018

+

Alonefromhell updated:

+
    +
  • Fixed some formatting issues in post_equip.
  • +
+

Desolate updated:

+
    +
  • Refactors some reagent lists into global list
  • +
+

Farie82 updated:

+
    +
  • Cyborgs can now refill welding tools and fire extinguishers using the recharging station
  • +
+

Purpose updated:

+
    +
  • Moves Icon Smoothing to a Subsystem.
  • +
+

Triiodine updated:

+
    +
  • Skrell & Tajaran sechardsuit to paracode palette, from Bay12 palette.
  • +
  • TG & BS12 sec-hardsuits in all dmis
  • +
+

Warior4356 updated:

+
    +
  • Final UI update was missed in Safe Refactor PR
  • +
+

variableundefined updated:

+
    +
  • Improves the List free slots admin verb to show useful information.
  • +
  • Cyborg hypospray's attack log message should no longer be reversed.
  • +
+

20 October 2018

Birdtalon updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 614b31a3e41..9ed825ec06e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7601,3 +7601,21 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: It is no longer possible to duplicate uvents. variableundefined: - tweak: Plating's icon is back to the old one once again. +2018-10-21: + Alonefromhell: + - spellcheck: Fixed some formatting issues in post_equip. + Desolate: + - tweak: Refactors some reagent lists into global list + Farie82: + - tweak: Cyborgs can now refill welding tools and fire extinguishers using the recharging + station + Purpose: + - tweak: Moves Icon Smoothing to a Subsystem. + Triiodine: + - tweak: Skrell & Tajaran sechardsuit to paracode palette, from Bay12 palette. + - rscdel: TG & BS12 sec-hardsuits in all dmis + Warior4356: + - bugfix: Final UI update was missed in Safe Refactor PR + 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. diff --git a/html/changelogs/AutoChangeLog-pr-9562.yml b/html/changelogs/AutoChangeLog-pr-9562.yml deleted file mode 100644 index 033e5c7b202..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9562.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Desolate" -delete-after: True -changes: - - tweak: "Refactors some reagent lists into global list" diff --git a/html/changelogs/AutoChangeLog-pr-9719.yml b/html/changelogs/AutoChangeLog-pr-9719.yml deleted file mode 100644 index b18f8874b49..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9719.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Purpose" -delete-after: True -changes: - - tweak: "Moves Icon Smoothing to a Subsystem." diff --git a/html/changelogs/AutoChangeLog-pr-9839.yml b/html/changelogs/AutoChangeLog-pr-9839.yml deleted file mode 100644 index 40a0ca087a9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9839.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "variableundefined" -delete-after: True -changes: - - bugfix: "Cyborg hypospray's attack log message should no longer be reversed." diff --git a/html/changelogs/AutoChangeLog-pr-9842.yml b/html/changelogs/AutoChangeLog-pr-9842.yml deleted file mode 100644 index d1c2b499e6e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9842.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "variableundefined" -delete-after: True -changes: - - tweak: "Improves the List free slots admin verb to show useful information." diff --git a/html/changelogs/AutoChangeLog-pr-9895.yml b/html/changelogs/AutoChangeLog-pr-9895.yml deleted file mode 100644 index 19ad1fe31bf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9895.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Triiodine" -delete-after: True -changes: - - tweak: "Skrell & Tajaran sechardsuit to paracode palette, from Bay12 palette." - - rscdel: "TG & BS12 sec-hardsuits in all dmis" diff --git a/html/changelogs/AutoChangeLog-pr-9913.yml b/html/changelogs/AutoChangeLog-pr-9913.yml deleted file mode 100644 index 70bbf5ca3df..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9913.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Farie82" -delete-after: True -changes: - - tweak: "Cyborgs can now refill welding tools and fire extinguishers using the recharging station" diff --git a/html/changelogs/AutoChangeLog-pr-9914.yml b/html/changelogs/AutoChangeLog-pr-9914.yml deleted file mode 100644 index 2f3a7f7ba9e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9914.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Warior4356" -delete-after: True -changes: - - bugfix: "Final UI update was missed in Safe Refactor PR" diff --git a/html/changelogs/AutoChangeLog-pr-9920.yml b/html/changelogs/AutoChangeLog-pr-9920.yml deleted file mode 100644 index 26e1d62557a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9920.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Alonefromhell" -delete-after: True -changes: - - spellcheck: "Fixed some formatting issues in post_equip." From df6bee335b5fad0168ac405d39521b085e5817ae Mon Sep 17 00:00:00 2001 From: Squirgenheimer Date: Sat, 20 Oct 2018 21:07:37 -0400 Subject: [PATCH 15/37] Various guardian_bomb fixes -they will now respect opacity and direction of the atom they are disguised as -they will no longer be triggered by objs and will instead trigger on the mob correctly -automatic disarming now uses timer ss so no more deletion of the contained obj after already being triggered -replaces loc assignments with forceMove --- .../miniantags/guardian/types/bomb.dm | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index 0503806b196..0484ade1142 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -37,32 +37,36 @@ /obj/item/guardian_bomb/proc/disguise(var/obj/A) A.forceMove(src) stored_obj = A + opacity = A.opacity anchored = A.anchored density = A.density appearance = A.appearance - spawn(600) - if(src) - stored_obj.loc = get_turf(loc) - if(spawner) - to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.") - qdel(src) + dir = A.dir + addtimer(CALLBACK(src, .proc/disable), 600) + +/obj/item/guardian_bomb/proc/disable() + stored_obj.forceMove(get_turf(src)) + to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.") + qdel(src) /obj/item/guardian_bomb/proc/detonate(var/mob/living/user) + if(!istype(user)) + return to_chat(user, "The [src] was boobytrapped!") if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) var/mob/living/simple_animal/hostile/guardian/G = spawner if(user == G.summoner) to_chat(user, "You knew this because of your link with your guardian, so you smartly defuse the bomb.") - stored_obj.loc = get_turf(loc) + stored_obj.forceMove(get_turf(loc)) qdel(src) return to_chat(spawner, "Success! Your trap on [src] caught [user]!") - stored_obj.loc = get_turf(loc) + stored_obj.forceMove(get_turf(loc)) playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1) user.ex_act(2) qdel(src) -/obj/item/guardian_bomb/attackby(mob/living/user) +/obj/item/guardian_bomb/attackby(obj/item/W, mob/living/user) detonate(user) return From 3bd73279e73ecb8d52890504d7af8ca18b8bef2d Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sun, 21 Oct 2018 09:10:50 +0800 Subject: [PATCH 16/37] No more bitshift --- code/__DEFINES/reagents.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index cf76a42e926..e2dd3ee3ac7 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -5,14 +5,14 @@ #define REAGENT_OVERDOSE_EFFECT 1 #define REAGENT_OVERDOSE_FLAGS 2 // container_type defines -#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes. -#define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes. +#define INJECTABLE 1 // Makes it possible to add reagents through droppers and syringes. +#define DRAWABLE 2 // Makes it possible to remove reagents through syringes. -#define REFILLABLE (1<<2) // Makes it possible to add reagents through any reagent container. -#define DRAINABLE (1<<3) // Makes it possible to remove reagents through any reagent container. +#define REFILLABLE 4 // Makes it possible to add reagents through any reagent container. +#define DRAINABLE 8 // Makes it possible to remove reagents through any reagent container. -#define TRANSPARENT (1<<4) // Used on containers which you want to be able to see the reagents off. -#define AMOUNT_VISIBLE (1<<5) // For non-transparent containers that still have the general amount of reagents in them visible. +#define TRANSPARENT 16 // Used on containers which you want to be able to see the reagents off. +#define AMOUNT_VISIBLE 32 // For non-transparent containers that still have the general amount of reagents in them visible. // Is an open container for all intents and purposes. #define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) From 491633048740d9b16f44350bfb45c1980bdb430f Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Sat, 20 Oct 2018 18:22:09 -0700 Subject: [PATCH 17/37] Making the jump to 512 time bois --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1ee02d4bbee..e25b3495f45 100644 --- a/.travis.yml +++ b/.travis.yml @@ -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" From 4bbe0a3f223c32113dce00933f1a6aa8a5d44f11 Mon Sep 17 00:00:00 2001 From: Squirgenheimer Date: Sat, 20 Oct 2018 21:22:50 -0400 Subject: [PATCH 18/37] removes trailing returns --- code/game/gamemodes/miniantags/guardian/types/bomb.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index 0484ade1142..f8c3898ed9c 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -68,11 +68,9 @@ /obj/item/guardian_bomb/attackby(obj/item/W, mob/living/user) detonate(user) - return /obj/item/guardian_bomb/pickup(mob/living/user) detonate(user) - return /obj/item/guardian_bomb/examine(mob/user) stored_obj.examine(user) From 242d832b2ef525f428dcdb8d26e71ee4fcc15462 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 20 Oct 2018 21:34:59 -0400 Subject: [PATCH 19/37] Automatic changelog generation for PR #9538 [ci skip] --- html/changelogs/AutoChangeLog-pr-9538.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9538.yml diff --git a/html/changelogs/AutoChangeLog-pr-9538.yml b/html/changelogs/AutoChangeLog-pr-9538.yml new file mode 100644 index 00000000000..ea466004eee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9538.yml @@ -0,0 +1,4 @@ +author: "variableundefined" +delete-after: True +changes: + - 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." From 5d4ada3ff209447dbef8b3ede08f5e20b3e02fa1 Mon Sep 17 00:00:00 2001 From: Squirgenheimer Date: Sat, 20 Oct 2018 21:38:33 -0400 Subject: [PATCH 20/37] adds another sanity check --- code/game/gamemodes/miniantags/guardian/types/bomb.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index f8c3898ed9c..23f922687a2 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -46,7 +46,8 @@ /obj/item/guardian_bomb/proc/disable() stored_obj.forceMove(get_turf(src)) - to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.") + if(spawner) + to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.") qdel(src) /obj/item/guardian_bomb/proc/detonate(var/mob/living/user) From 2771c17a0c69ba09b811e12d57ef8b636713fd4d Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sun, 21 Oct 2018 09:45:41 +0800 Subject: [PATCH 21/37] Fixes inconsistent comment and no name on revenant prompt --- code/game/gamemodes/miniantags/revenant/revenant.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 16b39ab9911..b85a908c6a2 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -120,7 +120,7 @@ updateallghostimages() remove_from_all_data_huds() - addtimer(CALLBACK(src, .proc/firstSetupAttempt), 15 SECONDS) // Give admin 10 seconds to put in a ghost (Or wait 10 seconds before giving it objectives) + addtimer(CALLBACK(src, .proc/firstSetupAttempt), 15 SECONDS) // Give admin 15 seconds to put in a ghost (Or wait 15 seconds before giving it objectives) /mob/living/simple_animal/revenant/proc/firstSetupAttempt() @@ -136,7 +136,7 @@ giveObjectivesandGoals() giveSpells() else - var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [real_name]?", poll_time = 15 SECONDS) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as a revenant?", poll_time = 15 SECONDS) var/mob/dead/observer/theghost = null if(candidates.len) theghost = pick(candidates) From 91ee86afac4dbf90d1a66db988c4727086bbd830 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 20 Oct 2018 21:51:18 -0400 Subject: [PATCH 22/37] Automatic changelog generation for PR #9924 [ci skip] --- html/changelogs/AutoChangeLog-pr-9924.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9924.yml diff --git a/html/changelogs/AutoChangeLog-pr-9924.yml b/html/changelogs/AutoChangeLog-pr-9924.yml new file mode 100644 index 00000000000..19250259388 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9924.yml @@ -0,0 +1,4 @@ +author: "Squirgenheimer" +delete-after: True +changes: + - bugfix: "Explosive holoparasite booby traps will now behave better, such as correctly triggering on mobs" From c387fafabe0cbd0e682a5d74469d1e9c769c9c34 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 20 Oct 2018 22:44:21 -0400 Subject: [PATCH 23/37] Automatic changelog generation for PR #9837 [ci skip] --- html/changelogs/AutoChangeLog-pr-9837.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9837.yml diff --git a/html/changelogs/AutoChangeLog-pr-9837.yml b/html/changelogs/AutoChangeLog-pr-9837.yml new file mode 100644 index 00000000000..2925eaa4cbc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9837.yml @@ -0,0 +1,4 @@ +author: "variableundefined" +delete-after: True +changes: + - tweak: "Minor refactor of revenant code." From ffbb77b3bf1b02bcbb324fc8128b22eb41353132 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 03:15:46 +0000 Subject: [PATCH 24/37] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 6 ++++++ html/changelogs/AutoChangeLog-pr-9538.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9837.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9924.yml | 4 ---- 5 files changed, 12 insertions(+), 12 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9538.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9837.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9924.yml diff --git a/html/changelog.html b/html/changelog.html index a031279a516..2f30b3a61c2 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -73,6 +73,10 @@
    • Moves Icon Smoothing to a Subsystem.
    +

    Squirgenheimer updated:

    +
      +
    • Explosive holoparasite booby traps will now behave better, such as correctly triggering on mobs
    • +

    Triiodine updated:

    • Skrell & Tajaran sechardsuit to paracode palette, from Bay12 palette.
    • @@ -86,6 +90,8 @@
      • Improves the List free slots admin verb to show useful information.
      • Cyborg hypospray's attack log message should no longer be reversed.
      • +
      • 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.
      • +
      • Minor refactor of revenant code.

      20 October 2018

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 9ed825ec06e..678fe6bd67d 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7611,6 +7611,9 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. station Purpose: - tweak: Moves Icon Smoothing to a Subsystem. + Squirgenheimer: + - bugfix: Explosive holoparasite booby traps will now behave better, such as correctly + triggering on mobs Triiodine: - tweak: Skrell & Tajaran sechardsuit to paracode palette, from Bay12 palette. - rscdel: TG & BS12 sec-hardsuits in all dmis @@ -7619,3 +7622,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 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. diff --git a/html/changelogs/AutoChangeLog-pr-9538.yml b/html/changelogs/AutoChangeLog-pr-9538.yml deleted file mode 100644 index ea466004eee..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9538.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "variableundefined" -delete-after: True -changes: - - 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." diff --git a/html/changelogs/AutoChangeLog-pr-9837.yml b/html/changelogs/AutoChangeLog-pr-9837.yml deleted file mode 100644 index 2925eaa4cbc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9837.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "variableundefined" -delete-after: True -changes: - - tweak: "Minor refactor of revenant code." diff --git a/html/changelogs/AutoChangeLog-pr-9924.yml b/html/changelogs/AutoChangeLog-pr-9924.yml deleted file mode 100644 index 19250259388..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9924.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Squirgenheimer" -delete-after: True -changes: - - bugfix: "Explosive holoparasite booby traps will now behave better, such as correctly triggering on mobs" From 611b572d04cf80fb636eb7071d8b758334b027b1 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 00:15:57 -0400 Subject: [PATCH 25/37] Automatic changelog generation for PR #9916 [ci skip] --- html/changelogs/AutoChangeLog-pr-9916.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9916.yml diff --git a/html/changelogs/AutoChangeLog-pr-9916.yml b/html/changelogs/AutoChangeLog-pr-9916.yml new file mode 100644 index 00000000000..a46688e60e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9916.yml @@ -0,0 +1,4 @@ +author: "Purpose" +delete-after: True +changes: + - rscdel: "Atom code will no longer track a list atoms, for literally zero reason." From 0473bd97c9c3b7d3ecaa37f716b9b83c169694ef Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sun, 21 Oct 2018 12:45:27 +0800 Subject: [PATCH 26/37] This restore the old plating sprite to holodeck --- icons/turf/floors.dmi | Bin 393056 -> 393019 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 99210d9cf88d150ec10ece91a3d5c18e4426f209..2f493a8acc1743bf7d58a858c214196338e0e70d 100644 GIT binary patch delta 28177 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 9~4z{olCM7h#MnD1~Cc??9z3L5aWF@Dz1@|4$o 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
        2s6+Dxx8#fs@WrM!gYiJL5wvOEhvuMdy_q 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 From 62bd7ff06366e4786c1ef21620bdf4a2eafca8ab Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 01:09:58 -0400 Subject: [PATCH 27/37] Automatic changelog generation for PR #9377 [ci skip] --- html/changelogs/AutoChangeLog-pr-9377.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9377.yml diff --git a/html/changelogs/AutoChangeLog-pr-9377.yml b/html/changelogs/AutoChangeLog-pr-9377.yml new file mode 100644 index 00000000000..fbe35465794 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9377.yml @@ -0,0 +1,4 @@ +author: "variableundefined" +delete-after: True +changes: + - bugfix: "Some relative path & commented out code has been cleared up in code. Report unexpected issues." From 69b90bb2cead7e6dbf88e8ede47ed6e4e92837f5 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 02:08:52 -0400 Subject: [PATCH 28/37] Automatic changelog generation for PR #9925 [ci skip] --- html/changelogs/AutoChangeLog-pr-9925.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9925.yml diff --git a/html/changelogs/AutoChangeLog-pr-9925.yml b/html/changelogs/AutoChangeLog-pr-9925.yml new file mode 100644 index 00000000000..5d41a8670bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9925.yml @@ -0,0 +1,4 @@ +author: "name here" +delete-after: True +changes: + - tweak: "Holodeck plating sprite is now back to the old one." From 86319e9e6f722195c8c7838528c7759483fe6838 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 07:23:52 +0000 Subject: [PATCH 29/37] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-9377.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9916.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9925.yml | 4 ---- 5 files changed, 11 insertions(+), 12 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9377.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9916.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9925.yml diff --git a/html/changelog.html b/html/changelog.html index 2f30b3a61c2..eaef528c5ca 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -72,6 +72,7 @@

        Purpose updated:

        • Moves Icon Smoothing to a Subsystem.
        • +
        • Atom code will no longer track a list atoms, for literally zero reason.

        Squirgenheimer updated:

          @@ -86,12 +87,17 @@
          • Final UI update was missed in Safe Refactor PR
          +

          name here updated:

          +
            +
          • Holodeck plating sprite is now back to the old one.
          • +

          variableundefined updated:

          • Improves the List free slots admin verb to show useful information.
          • Cyborg hypospray's attack log message should no longer be reversed.
          • 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.
          • Minor refactor of revenant code.
          • +
          • Some relative path & commented out code has been cleared up in code. Report unexpected issues.

          20 October 2018

          diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 678fe6bd67d..4907f56b908 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7611,6 +7611,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. station Purpose: - tweak: Moves Icon Smoothing to a Subsystem. + - rscdel: Atom code will no longer track a list atoms, for literally zero reason. Squirgenheimer: - bugfix: Explosive holoparasite booby traps will now behave better, such as correctly triggering on mobs @@ -7619,9 +7620,13 @@ 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. 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. diff --git a/html/changelogs/AutoChangeLog-pr-9377.yml b/html/changelogs/AutoChangeLog-pr-9377.yml deleted file mode 100644 index fbe35465794..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9377.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "variableundefined" -delete-after: True -changes: - - bugfix: "Some relative path & commented out code has been cleared up in code. Report unexpected issues." diff --git a/html/changelogs/AutoChangeLog-pr-9916.yml b/html/changelogs/AutoChangeLog-pr-9916.yml deleted file mode 100644 index a46688e60e9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9916.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Purpose" -delete-after: True -changes: - - rscdel: "Atom code will no longer track a list atoms, for literally zero reason." diff --git a/html/changelogs/AutoChangeLog-pr-9925.yml b/html/changelogs/AutoChangeLog-pr-9925.yml deleted file mode 100644 index 5d41a8670bb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9925.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "name here" -delete-after: True -changes: - - tweak: "Holodeck plating sprite is now back to the old one." From 9a6e3578d6656e44052ee60afa898cf31fc7953e Mon Sep 17 00:00:00 2001 From: Purpose Date: Sun, 21 Oct 2018 11:12:25 +0100 Subject: [PATCH 30/37] a an --- code/game/machinery/suit_storage_unit.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 2d395da0dd0..3cabbac3e75 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -361,7 +361,7 @@ dat+= "Suit storage unit: Maintenance panel" dat+= "Maintenance panel controls
          " dat+= "The panel is ridden with controls, button and meters, labeled in strange signs and symbols that
          you cannot understand. Probably the manufactoring world's language.
          Among other things, a few controls catch your eye.

          " - dat+= text("A small dial with a arrow embroidered on it. It's pointing towards a gauge that reads [].
          Turn towards []
          ",(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 [].
          Turn towards []
          ",(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.
          Press button",(safeties ? "GREEN" : "RED")) dat+= "

          Close panel" else if(uv) //The thing is running its cauterisation cycle. You have to wait. From 791922efd8f04edd8c8299f081b26b38754f8d6f Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 06:23:51 -0400 Subject: [PATCH 31/37] Automatic changelog generation for PR #9930 [ci skip] --- html/changelogs/AutoChangeLog-pr-9930.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9930.yml diff --git a/html/changelogs/AutoChangeLog-pr-9930.yml b/html/changelogs/AutoChangeLog-pr-9930.yml new file mode 100644 index 00000000000..59d74f4a395 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9930.yml @@ -0,0 +1,4 @@ +author: "Purpose" +delete-after: True +changes: + - spellcheck: "Fixes grammatical error in the suit storage unit" From 7d256b086d0f9841fd90d85776b74ecbfc11cc9c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 06:31:51 -0400 Subject: [PATCH 32/37] Automatic changelog generation for PR #9887 [ci skip] --- html/changelogs/AutoChangeLog-pr-9887.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9887.yml diff --git a/html/changelogs/AutoChangeLog-pr-9887.yml b/html/changelogs/AutoChangeLog-pr-9887.yml new file mode 100644 index 00000000000..de24ade3bfc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9887.yml @@ -0,0 +1,4 @@ +author: "Farie82" +delete-after: True +changes: + - 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." From decfcb91b28871959416230261fadd614df9b3a3 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 21 Oct 2018 12:47:38 +0200 Subject: [PATCH 33/37] Fixed it --- code/modules/reagents/chemistry/reagents/medicine.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 6ca2c4a1260..ebe2ac18324 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -551,10 +551,10 @@ update_flags |= M.AdjustEyeBlurry(-1, FALSE) update_flags |= M.AdjustEarDamage(-1, FALSE) if(prob(50)) - update_flags |= M.CureNearsighted(FALSE) + update_flags |= M.CureNearsighted() if(prob(30)) - update_flags |= M.CureBlind(FALSE) - update_flags |= M.SetEyeBlind(0, FALSE) + update_flags |= M.CureBlind() + update_flags |= M.SetEyeBlind(0) if(M.ear_damage <= 25) if(prob(30)) M.SetEarDeaf(0) From cb19976d4314d69b828cacdffb133e0e259f7e20 Mon Sep 17 00:00:00 2001 From: shazbot194 Date: Sun, 21 Oct 2018 02:57:47 -0800 Subject: [PATCH 34/37] Fixes north flag in hand sprites --- icons/mob/inhands/flags_lefthand.dmi | Bin 64802 -> 65196 bytes icons/mob/inhands/flags_righthand.dmi | Bin 63625 -> 64335 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/inhands/flags_lefthand.dmi b/icons/mob/inhands/flags_lefthand.dmi index c619b351106ef2d8471cdc9229d706514f479384..e04ef0f52e84b65f400155ae7b017fd7bacaadf2 100644 GIT binary patch literal 65196 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 L-o;$?TaW(_(quAZ literal 64802 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 diff --git a/icons/mob/inhands/flags_righthand.dmi b/icons/mob/inhands/flags_righthand.dmi index 84b4e2e806776a017a6d8e364453d5ab63d2742c..4c1619e487c6b29b21cf537a7cf0dd3414529908 100644 GIT binary patch literal 64335 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 z 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 D(aV%a literal 63625 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 Qu`uwXD6cA)Cu8LEFBEz|0ssI2 From be74a449f695d1f5f237eb3b519e8059c768d122 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 07:28:31 -0400 Subject: [PATCH 35/37] Automatic changelog generation for PR #9932 [ci skip] --- html/changelogs/AutoChangeLog-pr-9932.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9932.yml diff --git a/html/changelogs/AutoChangeLog-pr-9932.yml b/html/changelogs/AutoChangeLog-pr-9932.yml new file mode 100644 index 00000000000..00cf01edcd9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9932.yml @@ -0,0 +1,4 @@ +author: "Shazbot194" +delete-after: True +changes: + - bugfix: "all north facing in hand icons for flags." From 3deccfa1c7f68704d7b86bc1a24fc3dcc81921bb Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 07:36:57 -0400 Subject: [PATCH 36/37] Automatic changelog generation for PR #9931 [ci skip] --- html/changelogs/AutoChangeLog-pr-9931.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9931.yml diff --git a/html/changelogs/AutoChangeLog-pr-9931.yml b/html/changelogs/AutoChangeLog-pr-9931.yml new file mode 100644 index 00000000000..9fcd5b314c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9931.yml @@ -0,0 +1,4 @@ +author: "Farie82" +delete-after: True +changes: + - bugfix: "Oculine now updates the blindness status correctly" From 921b0a0a73f8e7287398aa3ea5463f3b2d452d55 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 09:46:45 -0400 Subject: [PATCH 37/37] Automatic changelog generation for PR #9923 [ci skip] --- html/changelogs/AutoChangeLog-pr-9923.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9923.yml diff --git a/html/changelogs/AutoChangeLog-pr-9923.yml b/html/changelogs/AutoChangeLog-pr-9923.yml new file mode 100644 index 00000000000..e1454a356bd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9923.yml @@ -0,0 +1,4 @@ +author: "tigercat2000" +delete-after: True +changes: + - rscadd: "We're going 512 boisssssssssssssss"