From f328db7b2ad89d7831a1b35f2578d0045312e29b Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sun, 20 May 2018 05:45:07 -0400 Subject: [PATCH 01/99] Refactors Camera Damage and Disabling --- code/_onclick/item_attack.dm | 2 +- code/datums/wires/camera.dm | 94 ------- code/game/machinery/camera/camera.dm | 250 ++++++++---------- code/game/machinery/camera/camera_assembly.dm | 67 ++--- code/game/objects/effects/effects.dm | 1 + code/game/objects/items.dm | 24 +- .../objects/items/weapons/storage/storage.dm | 21 +- code/game/objects/objs.dm | 1 + paradise.dme | 1 - 9 files changed, 178 insertions(+), 283 deletions(-) delete mode 100644 code/datums/wires/camera.dm diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index bf01bca6e3c..7dd3c140b4c 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -17,7 +17,7 @@ return SendSignal(COMSIG_PARENT_ATTACKBY, W, user, params) /obj/attackby(obj/item/I, mob/living/user, params) - return ..() || I.attack_obj(src, user) + return ..() || (can_be_hit && I.attack_obj(src, user)) /mob/living/attackby(obj/item/I, mob/living/user, params) user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm deleted file mode 100644 index ee25f8c3898..00000000000 --- a/code/datums/wires/camera.dm +++ /dev/null @@ -1,94 +0,0 @@ -// Wires for cameras. - -/datum/wires/camera - random = 0 - holder_type = /obj/machinery/camera - wire_count = 6 - -/datum/wires/camera/get_status() - . = ..() - var/obj/machinery/camera/C = holder - . += "The focus light is [(C.view_range == initial(C.view_range)) ? "on" : "off"]." - . += "The power link light is [C.can_use() ? "on" : "off"]." - . += "The camera light is [C.light_disabled ? "off" : "on"]." - . += "The alarm light is [C.alarm_on ? "on" : "off"]." - -/datum/wires/camera/CanUse(mob/living/L) - var/obj/machinery/camera/C = holder - if(!C.panel_open) - return 0 - return 1 - -var/const/CAMERA_WIRE_FOCUS = 1 -var/const/CAMERA_WIRE_POWER = 2 -var/const/CAMERA_WIRE_LIGHT = 4 -var/const/CAMERA_WIRE_ALARM = 8 -var/const/CAMERA_WIRE_NOTHING1 = 16 -var/const/CAMERA_WIRE_NOTHING2 = 32 - -/datum/wires/camera/GetWireName(index) - switch(index) - if(CAMERA_WIRE_FOCUS) - return "Focus" - - if(CAMERA_WIRE_POWER) - return "Power" - - if(CAMERA_WIRE_LIGHT) - return "Light" - - if(CAMERA_WIRE_ALARM) - return "Alarm" - - if(CAMERA_WIRE_NOTHING1) - return "Nothing" - - if(CAMERA_WIRE_NOTHING2) - return "Nothing" - -/datum/wires/camera/UpdateCut(index, mended) - var/obj/machinery/camera/C = holder - - switch(index) - if(CAMERA_WIRE_FOCUS) - var/range = (mended ? initial(C.view_range) : C.short_range) - C.setViewRange(range) - - if(CAMERA_WIRE_POWER) - if(C.status && !mended || !C.status && mended) - C.toggle_cam(usr, 1) - - if(CAMERA_WIRE_LIGHT) - C.light_disabled = !mended - - if(CAMERA_WIRE_ALARM) - if(!mended) - C.triggerCameraAlarm() - else - C.cancelCameraAlarm() - ..() - -/datum/wires/camera/UpdatePulsed(index) - var/obj/machinery/camera/C = holder - if(IsIndexCut(index)) - return - switch(index) - if(CAMERA_WIRE_FOCUS) - var/new_range = (C.view_range == initial(C.view_range) ? C.short_range : initial(C.view_range)) - C.setViewRange(new_range) - - if(CAMERA_WIRE_POWER) - C.toggle_cam(null) // Deactivate the camera - - if(CAMERA_WIRE_LIGHT) - C.light_disabled = !C.light_disabled - - if(CAMERA_WIRE_ALARM) - C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*") - ..() - -/datum/wires/camera/proc/CanDeconstruct() - if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS) && IsIndexCut(CAMERA_WIRE_LIGHT) && IsIndexCut(CAMERA_WIRE_NOTHING1) && IsIndexCut(CAMERA_WIRE_NOTHING2)) - return 1 - else - return 0 \ No newline at end of file diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 0e9f261d73d..bbd4ed6201c 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -6,15 +6,17 @@ use_power = 2 idle_power_usage = 5 active_power_usage = 10 - layer = 5 + layer = WALL_OBJ_LAYER + armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0) - var/datum/wires/camera/wires = null // Wires datum + max_integrity = 100 + integrity_failure = 50 var/list/network = list("SS13") var/c_tag = null var/c_tag_order = 999 var/status = 1 - anchored = 1 - var/start_active = 0 //If it ignores the random chance to start broken on round start + anchored = TRUE + var/start_active = FALSE //If it ignores the random chance to start broken on round start var/invuln = null var/obj/item/camera_bug/bug = null var/obj/item/camera_assembly/assembly = null @@ -24,17 +26,14 @@ var/view_range = 7 var/short_range = 2 - var/light_disabled = 0 - var/alarm_on = 0 - var/busy = 0 - var/emped = 0 //Number of consecutive EMP's on this camera + var/alarm_on = FALSE + var/busy = FALSE + var/emped = FALSE //Number of consecutive EMP's on this camera - var/toggle_message = 'sound/items/Wirecutter.ogg' + var/toggle_sound = 'sound/items/Wirecutter.ogg' /obj/machinery/camera/New() ..() - wires = new(src) - assembly = new(src) assembly.state = 4 assembly.anchored = 1 @@ -47,17 +46,15 @@ ..() if(is_station_level(z) && prob(3) && !start_active) toggle_cam() - wires.CutAll() /obj/machinery/camera/Destroy() toggle_cam(null, 0) //kick anyone viewing out QDEL_NULL(assembly) if(istype(bug)) - bug.bugged_cameras -= src.c_tag + bug.bugged_cameras -= c_tag if(bug.current == src) bug.current = null bug = null - QDEL_NULL(wires) cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that cameranet.cameras -= src var/area/ai_monitored/A = get_area(src) @@ -71,33 +68,33 @@ return if(!isEmpProof()) if(prob(150/severity)) - icon_state = "[initial(icon_state)]emp" + update_icon() var/list/previous_network = network network = list() cameranet.removeCamera(src) stat |= EMPED set_light(0) emped = emped+1 //Increase the number of consecutive EMP's + update_icon() var/thisemp = emped //Take note of which EMP this proc is for spawn(900) if(loc) //qdel limbo triggerCameraAlarm() //camera alarm triggers even if multiple EMPs are in effect. if(emped == thisemp) //Only fix it if the camera hasn't been EMP'd again network = previous_network - icon_state = initial(icon_state) stat &= ~EMPED - cancelCameraAlarm() + update_icon() if(can_use()) cameranet.addCamera(src) emped = 0 //Resets the consecutive EMP count spawn(100) if(!QDELETED(src)) cancelCameraAlarm() - for(var/mob/O in mob_list) - if(O.client && O.client.eye == src) - O.unset_machine() - O.reset_perspective(null) - to_chat(O, "The screen bursts into static.") + for(var/mob/M in player_list) + if(M.client && M.client.eye == src) + M.unset_machine() + M.reset_perspective(null) + to_chat(M, "The screen bursts into static.") ..() /obj/machinery/camera/tesla_act(var/power)//EMP proof upgrade also makes it tesla immune @@ -106,109 +103,91 @@ ..() qdel(src)//to prevent bomb testing camera from exploding over and over forever -/obj/machinery/camera/ex_act(severity, target) - if(src.invuln) +/obj/machinery/camera/ex_act(severity) + if(invuln) return - else - ..() - return - -/obj/machinery/camera/blob_act() - qdel(src) - return - -/obj/machinery/camera/attack_ghost(mob/user) - if(panel_open) - wires.Interact(user) - -/obj/machinery/camera/attack_alien(mob/living/carbon/alien/humanoid/user) - if(!istype(user)) - return - user.do_attack_animation(src) - add_hiddenprint(user) - status = 0 - visible_message("\The [user] slashes at [src]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - toggle_cam(user, 0) - + ..() /obj/machinery/camera/proc/setViewRange(num = 7) - src.view_range = num + view_range = num cameranet.updateVisibility(src, 0) -/obj/machinery/camera/attackby(obj/item/W, mob/living/user as mob, params) - var/msg = "You attach [W] into the assembly inner circuits." +/obj/machinery/camera/attackby(obj/item/I, mob/living/user as mob, params) + var/msg = "You attach [I] into the assembly inner circuits." var/msg2 = "The camera already has that upgrade!" // DECONSTRUCTION - if(istype(W, /obj/item/screwdriver)) -// to_chat(user, "You start to [panel_open ? "close" : "open"] the camera's panel.") - //if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown + if(isscrewdriver(I)) panel_open = !panel_open - user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!", - "You screw the camera's panel [panel_open ? "open" : "closed"].") - playsound(src.loc, W.usesound, 50, 1) + to_chat(user, "You screw the camera's panel [panel_open ? "open" : "closed"].") + playsound(loc, I.usesound, 50, 1) - else if((istype(W, /obj/item/wirecutters) || istype(W, /obj/item/multitool)) && panel_open) - wires.Interact(user) + else if(iswirecutter(I) && panel_open) + toggle_cam(user, 1) + obj_integrity = max_integrity //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex. + playsound(loc, I.usesound, 50, 1) - else if(istype(W, /obj/item/weldingtool) && wires.CanDeconstruct()) - if(weld(W, user)) - to_chat(user, "You unweld the camera leaving it as just a frame screwed to the wall.") - if(!assembly) - assembly = new() - assembly.loc = src.loc - assembly.state = 1 - assembly.dir = src.dir - assembly.update_icon() - assembly = null - qdel(src) + else if(ismultitool(I) && panel_open) + setViewRange((view_range == initial(view_range)) ? short_range : initial(view_range)) + to_chat(user, "You [(view_range == initial(view_range)) ? "restore" : "mess up"] the camera's focus.") + + else if(iswelder(I) && panel_open) + var/obj/item/weldingtool/WT = I + if(!WT.remove_fuel(0, user)) return - else if(istype(W, /obj/item/analyzer) && panel_open) //XRay - if(!user.unEquip(W)) - to_chat(user, "[W] is stuck!") + to_chat(user, "You start to weld [src]...") + playsound(loc, WT.usesound, 50, 1) + if(do_after(user, 100 * WT.toolspeed, target = src)) + user.visible_message("[user] unwelds [src], leaving it as just a frame bolted to the wall.", + "You unweld [src], leaving it as just a frame bolted to the wall") + deconstruct(TRUE) + + else if(istype(I, /obj/item/analyzer) && panel_open) //XRay + if(!user.drop_item()) + to_chat(user, "[I] is stuck to your hand!") return if(!isXRay()) upgradeXRay() - qdel(W) + qdel(I) to_chat(user, "[msg]") else to_chat(user, "[msg2]") - else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open) - if(!user.unEquip(W)) - to_chat(user, "[W] is stuck!") + else if(istype(I, /obj/item/stack/sheet/mineral/plasma) && panel_open) + if(!user.drop_item()) + to_chat(user, "[I] is stuck to your hand!") return if(!isEmpProof()) upgradeEmpProof() to_chat(user, "[msg]") - qdel(W) + qdel(I) else to_chat(user, "[msg2]") - else if(istype(W, /obj/item/assembly/prox_sensor) && panel_open) - if(!user.unEquip(W)) + else if(istype(I, /obj/item/assembly/prox_sensor) && panel_open) + if(!user.drop_item()) + to_chat(user, "[I] is stuck to your hand!") return if(!isMotion()) upgradeMotion() to_chat(user, "[msg]") - qdel(W) + qdel(I) else to_chat(user, "[msg2]") // OTHER - else if((istype(W, /obj/item/paper) || istype(W, /obj/item/pda)) && isliving(user)) + else if((istype(I, /obj/item/paper) || istype(I, /obj/item/pda)) && isliving(user)) var/mob/living/U = user var/obj/item/paper/X = null var/obj/item/pda/P = null var/itemname = "" var/info = "" - if(istype(W, /obj/item/paper)) - X = W + if(istype(I, /obj/item/paper)) + X = I itemname = X.name info = X.info else - P = W + P = I var/datum/data/pda/app/notekeeper/N = P.find_program(/datum/data/pda/app/notekeeper) if(N) itemname = P.name @@ -229,37 +208,58 @@ to_chat(O, "[U] holds \a [itemname] up to one of the cameras ...") O << browse(text("[][]", itemname, info), text("window=[]", itemname)) - else if(istype(W, /obj/item/camera_bug)) - if(!src.can_use()) + else if(istype(I, /obj/item/camera_bug)) + if(!can_use()) to_chat(user, "Camera non-functional.") return - if(istype(src.bug)) + if(istype(bug)) to_chat(user, "Camera bug removed.") - src.bug.bugged_cameras -= src.c_tag - src.bug = null + bug.bugged_cameras -= c_tag + bug = null else to_chat(user, "Camera bugged.") - src.bug = W - src.bug.bugged_cameras[src.c_tag] = src + bug = I + bug.bugged_cameras[c_tag] = src - else if(istype(W, /obj/item/melee/energy/blade))//Putting it here last since it's a special case. I wonder if there is a better way to do these than type casting. - toggle_cam(user, 1) - var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() - spark_system.set_up(5, 0, loc) - spark_system.start() - playsound(loc, W.usesound, 50, 1) - playsound(loc, "sparks", 50, 1) - visible_message("[user] has sliced the camera apart with an energy blade!") - qdel(src) - - else if(istype(W, /obj/item/laser_pointer)) - var/obj/item/laser_pointer/L = W + else if(istype(I, /obj/item/laser_pointer)) + var/obj/item/laser_pointer/L = I L.laser_act(src, user) else - ..() - return + return ..() -/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1) +/obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) + if(damage_flag == "melee" && damage_amount < 12 && !(stat & BROKEN)) + return 0 + . = ..() + +/obj/machinery/camera/obj_break(damage_flag) + if(status) + triggerCameraAlarm() + toggle_cam(null, 0) + +/obj/machinery/camera/deconstruct(disassembled = TRUE) + if(disassembled) + if(!assembly) + assembly = new() + assembly.forceMove(loc) + assembly.state = 1 + assembly.setDir(dir) + assembly.update_icon() + assembly = null + else + new /obj/item/camera_assembly(loc) + new /obj/item/stack/cable_coil(loc, 2) + qdel(src) + +/obj/machinery/camera/update_icon() + if(!status) + icon_state = "[initial(icon_state)]1" + else if(stat & EMPED) + icon_state = "[initial(icon_state)]emp" + else + icon_state = "[initial(icon_state)]" + +/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = TRUE) status = !status if(can_use()) cameranet.addCamera(src) @@ -268,10 +268,7 @@ cameranet.removeCamera(src) cameranet.updateChunk(x, y, z) var/change_msg = "deactivates" - if(!status) - icon_state = "[initial(icon_state)]1" - else - icon_state = initial(icon_state) + if(status) change_msg = "reactivates" triggerCameraAlarm() spawn(100) @@ -284,7 +281,8 @@ else visible_message("\The [src] [change_msg]!") - playsound(src.loc, toggle_message, 100, 1) + playsound(loc, toggle_sound, 100, 1) + update_icon() // now disconnect anyone using the camera //Apparently, this will disconnect anyone even if the camera was re-activated. @@ -300,9 +298,6 @@ motion_alarm.triggerAlarm(loc, src) /obj/machinery/camera/proc/cancelCameraAlarm() - if(wires.IsIndexCut(CAMERA_WIRE_ALARM)) - return - alarm_on = 0 motion_alarm.clearAlarm(loc, src) @@ -331,13 +326,13 @@ //If someone knows a better way to do this, let me know. -Giacom switch(i) if(NORTH) - src.dir = SOUTH + setDir(SOUTH) if(SOUTH) - src.dir = NORTH + setDir(NORTH) if(WEST) - src.dir = EAST + setDir(EAST) if(EAST) - src.dir = WEST + setDir(WEST) break //Return a working camera that can see a given mob @@ -357,32 +352,15 @@ return null -/obj/machinery/camera/proc/weld(var/obj/item/weldingtool/WT, var/mob/user) - if(busy) - return 0 - if(!WT.remove_fuel(0, user)) - return 0 - - to_chat(user, "You start to weld [src]...") - playsound(src.loc, WT.usesound, 50, 1) - busy = 1 - if(do_after(user, 100 * WT.toolspeed, target = src)) - busy = 0 - if(!WT.isOn()) - return 0 - return 1 - busy = 0 - return 0 - /obj/machinery/camera/proc/Togglelight(on=0) for(var/mob/living/silicon/ai/A in ai_list) for(var/obj/machinery/camera/cam in A.lit_cameras) if(cam == src) return if(on) - src.set_light(AI_CAMERA_LUMINOSITY) + set_light(AI_CAMERA_LUMINOSITY) else - src.set_light(0) + set_light(0) /obj/machinery/camera/proc/nano_structure() var/cam[0] diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index dc5a0141b27..8baf02088bb 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -6,7 +6,8 @@ w_class = WEIGHT_CLASS_SMALL anchored = 0 materials = list(MAT_METAL=400, MAT_GLASS=250) - + max_integrity = 150 + can_be_hit = TRUE // Motion, EMP-Proof, X-Ray var/list/obj/item/possible_upgrades = list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer) var/list/upgrades = list() @@ -24,13 +25,13 @@ QDEL_LIST(upgrades) return ..() -/obj/item/camera_assembly/attackby(obj/item/W, mob/living/user, params) +/obj/item/camera_assembly/attackby(obj/item/I, mob/living/user, params) switch(state) if(0) // State 0 - if(iswrench(W) && isturf(src.loc)) - playsound(src.loc, W.usesound, 50, 1) + if(iswrench(I) && isturf(loc)) + playsound(loc, I.usesound, 50, 1) to_chat(user, "You wrench the assembly into place.") anchored = 1 state = 1 @@ -40,15 +41,15 @@ if(1) // State 1 - if(iswelder(W)) - if(weld(W, user)) + if(iswelder(I)) + if(weld(I, user)) to_chat(user, "You weld the assembly securely into place.") anchored = 1 state = 2 return - else if(iswrench(W)) - playsound(src.loc, W.usesound, 50, 1) + else if(iswrench(I)) + playsound(loc, I.usesound, 50, 1) to_chat(user, "You unattach the assembly from it's place.") anchored = 0 update_icon() @@ -57,19 +58,18 @@ if(2) // State 2 - if(iscoil(W)) - var/obj/item/stack/cable_coil/C = W + if(iscoil(I)) + var/obj/item/stack/cable_coil/C = I if(C.use(2)) to_chat(user, "You add wires to the assembly.") - playsound(loc, W.usesound, 50, 1) + playsound(loc, I.usesound, 50, 1) state = 3 else to_chat(user, "You need 2 coils of wire to wire the assembly.") return - else if(iswelder(W)) - - if(weld(W, user)) + else if(iswelder(I)) + if(weld(I, user)) to_chat(user, "You unweld the assembly from it's place.") state = 1 anchored = 1 @@ -78,8 +78,8 @@ if(3) // State 3 - if(isscrewdriver(W)) - playsound(src.loc, W.usesound, 50, 1) + if(isscrewdriver(I)) + playsound(loc, I.usesound, 50, 1) var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) if(!input) @@ -96,8 +96,8 @@ input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag)) state = 4 - var/obj/machinery/camera/C = new(src.loc) - src.loc = C + var/obj/machinery/camera/C = new(loc) + loc = C C.assembly = src C.auto_turn() @@ -119,35 +119,36 @@ break return - else if(iswirecutter(W)) + else if(iswirecutter(I)) new/obj/item/stack/cable_coil(get_turf(src), 2) - playsound(src.loc, W.usesound, 50, 1) + playsound(loc, I.usesound, 50, 1) to_chat(user, "You cut the wires from the circuits.") state = 2 return // Upgrades! - if(is_type_in_list(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already. - if(!user.unEquip(W)) - to_chat(user, "[W] is stuck!") + if(is_type_in_list(I, possible_upgrades) && !is_type_in_list(I, upgrades)) // Is a possible upgrade and isn't in the camera already. + if(!user.unEquip(I)) + to_chat(user, "[I] is stuck!") return - to_chat(user, "You attach \the [W] into the assembly inner circuits.") - upgrades += W + to_chat(user, "You attach [I] into the assembly inner circuits.") + upgrades += I user.drop_item() - W.loc = src + I.loc = src return // Taking out upgrades - else if(iscrowbar(W) && upgrades.len) + else if(iscrowbar(I) && upgrades.len) var/obj/U = locate(/obj) in upgrades if(U) to_chat(user, "You unattach an upgrade from the assembly.") - playsound(src.loc, W.usesound, 50, 1) + playsound(loc, I.usesound, 50, 1) U.loc = get_turf(src) upgrades -= U return - ..() + else + return ..() /obj/item/camera_assembly/update_icon() if(anchored) @@ -159,7 +160,7 @@ if(!anchored) ..() -/obj/item/camera_assembly/proc/weld(var/obj/item/weldingtool/WT, var/mob/living/user) +/obj/item/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user) if(busy) return 0 @@ -167,7 +168,7 @@ return 0 to_chat(user, "You start to weld the [src]..") - playsound(src.loc, WT.usesound, 50, 1) + playsound(loc, WT.usesound, 50, 1) busy = 1 if(do_after(user, 20 * WT.toolspeed, target = src)) busy = 0 @@ -176,3 +177,7 @@ return 1 busy = 0 return 0 + +/obj/item/camera_assembly/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/metal(loc) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 467858ad670..6a3e1aba86a 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -6,6 +6,7 @@ icon = 'icons/effects/effects.dmi' burn_state = LAVA_PROOF | FIRE_PROOF resistance_flags = INDESTRUCTIBLE + can_be_hit = FALSE /obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) return diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 21bc0453500..c57bbab4d27 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -15,6 +15,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/inhand_x_dimension = 32 var/inhand_y_dimension = 32 + can_be_hit = FALSE + var/r_speed = 1.0 var/health = null var/hitsound = null @@ -277,25 +279,25 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d // Due to storage type consolidation this should get used more now. // I have cleaned it up a little, but it could probably use more. -Sayu -/obj/item/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W,/obj/item/storage)) - var/obj/item/storage/S = W +/obj/item/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/storage)) + var/obj/item/storage/S = I if(S.use_to_pickup) if(S.collection_mode) //Mode is set to collect all items on a tile and we clicked on a valid one. - if(isturf(src.loc)) + if(isturf(loc)) var/list/rejections = list() var/success = 0 var/failure = 0 - for(var/obj/item/I in src.loc) - if(I.type in rejections) // To limit bag spamming: any given type only complains once + for(var/obj/item/IT in loc) + if(IT.type in rejections) // To limit bag spamming: any given type only complains once continue - if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no - rejections += I.type // therefore full bags are still a little spammy + if(!S.can_be_inserted(IT)) // Note can_be_inserted still makes noise when the answer is no + rejections += IT.type // therefore full bags are still a little spammy failure = 1 continue success = 1 - S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. + S.handle_item_insertion(IT, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. if(success && !failure) to_chat(user, "You put everything in [S].") else if(success) @@ -305,8 +307,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d else if(S.can_be_inserted(src)) S.handle_item_insertion(src) - - return + else + return ..() /obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(prob(final_block_chance)) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 93f230a07e8..66316b6f7ef 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -357,19 +357,22 @@ remove_from_storage(Item, loc, burn) //This proc is called when you want to place an item into the storage item. -/obj/item/storage/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/storage/attackby(obj/item/I, mob/user, params) ..() - + if(istype(I, /obj/item/hand_labeler)) + var/obj/item/hand_labeler/labeler = I + if(labeler.mode) + return FALSE + . = 1 //no afterattack if(isrobot(user)) - to_chat(user, "You're a robot. No.") - return 1//Robots can't interact with storage items. + return //Robots can't interact with storage items. - if(!can_be_inserted(W)) - return 0 - - handle_item_insertion(W) - return 1 + if(!can_be_inserted(I)) + if(contents.len >= storage_slots) //don't use items on the backpack if they don't fit + return TRUE + return FALSE + handle_item_insertion(I) /obj/item/storage/attack_hand(mob/user as mob) playsound(src.loc, "rustle", 50, 1, -5) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index fe9e8444378..dc642dcbde5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -17,6 +17,7 @@ var/integrity_failure = 0 //0 if we have no special broken behavior var/resistance_flags = NONE // INDESTRUCTIBLE + var/can_be_hit = TRUE //can this be bludgeoned by items? var/Mtoollink = 0 // variable to decide if an object should show the multitool menu linking menu, not all objects use it diff --git a/paradise.dme b/paradise.dme index 6cf47e457f5..c10e5633cc6 100644 --- a/paradise.dme +++ b/paradise.dme @@ -360,7 +360,6 @@ #include "code\datums\wires\alarm.dm" #include "code\datums\wires\apc.dm" #include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\camera.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\mulebot.dm" #include "code\datums\wires\nuclearbomb.dm" From 66dd09ea4f769215bf9494df8bf01bdd8a6abdb2 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sun, 20 May 2018 05:58:14 -0400 Subject: [PATCH 02/99] arbitrary --- code/modules/paperwork/handlabeler.dm | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 2700c8702db..92ec694ecb4 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -7,30 +7,23 @@ var/labels_left = 30 var/mode = 0 //off or on. -/obj/item/hand_labeler/afterattack(atom/A, mob/user as mob, proximity) - if(!proximity) return +/obj/item/hand_labeler/afterattack(atom/A, mob/user, proximity) + if(!proximity) + return if(!mode) //if it's off, give up. return - if(A == loc) // if placing the labeller into something (e.g. backpack) - return // don't set a label if(!labels_left) - to_chat(user, "No labels left.") + to_chat(user, "No labels left!") return if(!label || !length(label)) - to_chat(user, "No text set.") + to_chat(user, "No text set!") return if(length(A.name) + length(label) > 64) - to_chat(user, "Label too big.") + to_chat(user, "Label too big!") return - if(ishuman(A)) - to_chat(user, "You can't label humans.") - return - if(issilicon(A)) - to_chat(user, "You can't label cyborgs.") - return - if(istype(A, /obj/item/reagent_containers/glass)) - to_chat(user, "The label can't stick to the [A.name]. (Try using a pen)") + if(ismob(A)) + to_chat(user, "You can't label creatures!") // use a collar return user.visible_message("[user] labels [A] as [label].", \ From 657d6fe275135fc41a9be186e05c884185dc447d Mon Sep 17 00:00:00 2001 From: Ansari Date: Sun, 20 May 2018 19:40:52 +0800 Subject: [PATCH 03/99] Leftover healing is now split onto logical limbs --- code/game/objects/items/stacks/medical.dm | 41 +++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 3ffdfaaf751..b4d5a66ca39 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -104,7 +104,27 @@ if(stop_bleeding) if(!H.bleedsuppress) //so you can't stack bleed suppression H.suppress_bloodloss(stop_bleeding) + + var/rembrute = max(0, heal_brute - affecting.brute_dam) + var/remburn = max(0, heal_burn - affecting.burn_dam) + var/nrembrute = rembrute + var/nremburn = remburn affecting.heal_damage(heal_brute, heal_burn) + if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO)) + for(var/obj/item/organ/external/E in affecting.children) + if(rembrute <= 0 && remburn <= 0) // Make sure there's actually overheal left and the organ is damaged before bothering + break + else if(E.status && ORGAN_ROBOT || E.open == 1) // Ignore robotic or open limb + continue + else if(E.brute_dam == 0 && E.burn_dam == 0) // Ignore undamaged limb + continue + nrembrute = rembrute - E.brute_dam // Deduct the healed damage from the remain + nremburn = remburn - E.burn_dam + E.heal_damage(rembrute, remburn) + rembrute = nrembrute + remburn = nremburn + user.visible_message("[user] bandages the wounds on [H]'s [E.name] with the remaining bandages.", \ + "You bandages the wounds on [H]'s [E.name] with the remaining bandages." ) H.UpdateDamageIcon() use(1) else @@ -143,9 +163,26 @@ if(affecting.open == 0) affecting.germ_level = 0 - user.visible_message("[user] salves the wounds on [H]'s [affecting.name].", \ - "You salve the wounds on [H]'s [affecting.name]." ) + var/rembrute = max(0, heal_brute - affecting.brute_dam) + var/remburn = max(0, heal_burn - affecting.burn_dam) + var/nrembrute = rembrute + var/nremburn = remburn affecting.heal_damage(heal_brute, heal_burn) + if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO)) + for(var/obj/item/organ/external/E in affecting.children) + if(rembrute <= 0 && remburn <= 0) // Make sure there's actually overheal left and the organ is damaged before bothering + break + else if(E.status && ORGAN_ROBOT || E.open == 1) // Ignore robotic or open limb + continue + else if(E.brute_dam == 0 && E.burn_dam == 0) // Ignore undamaged limb + continue + nrembrute = rembrute - E.brute_dam // Deduct the healed damage from the remain + nremburn = remburn - E.burn_dam + E.heal_damage(rembrute, remburn) + rembrute = nrembrute + remburn = nremburn + user.visible_message("[user] salves the wounds on [H]'s [E.name] with the remaining ointment.", \ + "You salve the wounds on [H]'s [E.name] with the remaining ointment." ) H.UpdateDamageIcon() use(1) else From ca1784d39431a2118054642e458c97a15e0240a3 Mon Sep 17 00:00:00 2001 From: Ansari Date: Sun, 20 May 2018 20:05:22 +0800 Subject: [PATCH 04/99] Fixes missing message for burn kit --- code/game/objects/items/stacks/medical.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index b4d5a66ca39..235e94fe05f 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -163,6 +163,9 @@ if(affecting.open == 0) affecting.germ_level = 0 + user.visible_message("[user] salves the wounds on [H]'s [affecting.name].", \ + "You salves the wounds on [H]'s [affecting.name]." ) + var/rembrute = max(0, heal_brute - affecting.brute_dam) var/remburn = max(0, heal_burn - affecting.burn_dam) var/nrembrute = rembrute From 43cefbcf715041baa17446fbe51dfad26cd09245 Mon Sep 17 00:00:00 2001 From: Ansari Date: Sun, 20 May 2018 20:51:52 +0800 Subject: [PATCH 05/99] No longer discriminates against the lower body --- code/game/objects/items/stacks/medical.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 235e94fe05f..d7ef2969bf6 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -110,7 +110,7 @@ var/nrembrute = rembrute var/nremburn = remburn affecting.heal_damage(heal_brute, heal_burn) - if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO)) + if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO, LOWER_TORSO)) for(var/obj/item/organ/external/E in affecting.children) if(rembrute <= 0 && remburn <= 0) // Make sure there's actually overheal left and the organ is damaged before bothering break @@ -171,7 +171,7 @@ var/nrembrute = rembrute var/nremburn = remburn affecting.heal_damage(heal_brute, heal_burn) - if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO)) + if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO, LOWER_TORSO)) for(var/obj/item/organ/external/E in affecting.children) if(rembrute <= 0 && remburn <= 0) // Make sure there's actually overheal left and the organ is damaged before bothering break From 1cc1e30c54c080aef45791759b6ce01af88fa401 Mon Sep 17 00:00:00 2001 From: Ansari Date: Mon, 21 May 2018 08:01:57 +0800 Subject: [PATCH 06/99] Woot, refactored code. Added "healverb" --- code/game/objects/items/stacks/medical.dm | 77 ++++++++++------------- 1 file changed, 32 insertions(+), 45 deletions(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index d7ef2969bf6..00388d7e40b 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -12,6 +12,7 @@ var/self_delay = 20 var/unique_handling = 0 //some things give a special prompt, do we want to bypass some checks in parent? var/stop_bleeding = 0 + var/healverb = "bandage" /obj/item/stack/medical/attack(mob/living/M, mob/user) if(!iscarbon(M) && !isanimal(M)) @@ -77,6 +78,33 @@ "You apply [src] on [M].") use(1) +/obj/item/stack/medical/proc/heal(mob/living/M, mob/user) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) + user.visible_message("[user] [healverb]s the wounds on [H]'s [affecting.name].", \ + "You [healverb] the wounds on [H]'s [affecting.name]." ) + + var/rembrute = max(0, heal_brute - affecting.brute_dam) + var/remburn = max(0, heal_burn - affecting.burn_dam) + var/nrembrute = rembrute + var/nremburn = remburn + affecting.heal_damage(heal_brute, heal_burn) + if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO, LOWER_TORSO)) + for(var/obj/item/organ/external/E in affecting.children) + if(rembrute <= 0 && remburn <= 0) // Make sure there's actually overheal left and the organ is damaged before bothering + break + else if(E.status && ORGAN_ROBOT || E.open) // Ignore robotic or open limb + continue + else if(E.brute_dam == 0 && E.burn_dam == 0) // Ignore undamaged limb + continue + nrembrute = rembrute - E.brute_dam // Deduct the healed damage from the remain + nremburn = remburn - E.burn_dam + E.heal_damage(rembrute, remburn) + rembrute = nrembrute + remburn = nremburn + user.visible_message("[user] [healverb]s the wounds on [H]'s [E.name] with the remaining medication.", \ + "You [healverb] the wounds on [H]'s [E.name] with the remaining medication." ) + //Bruise Packs// /obj/item/stack/medical/bruise_pack @@ -98,33 +126,12 @@ if(affecting.open == 0) affecting.germ_level = 0 - user.visible_message("[user] bandages the wounds on [H]'s [affecting.name].", \ - "You bandage the wounds on [H]'s [affecting.name]." ) - if(stop_bleeding) if(!H.bleedsuppress) //so you can't stack bleed suppression H.suppress_bloodloss(stop_bleeding) - var/rembrute = max(0, heal_brute - affecting.brute_dam) - var/remburn = max(0, heal_burn - affecting.burn_dam) - var/nrembrute = rembrute - var/nremburn = remburn - affecting.heal_damage(heal_brute, heal_burn) - if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO, LOWER_TORSO)) - for(var/obj/item/organ/external/E in affecting.children) - if(rembrute <= 0 && remburn <= 0) // Make sure there's actually overheal left and the organ is damaged before bothering - break - else if(E.status && ORGAN_ROBOT || E.open == 1) // Ignore robotic or open limb - continue - else if(E.brute_dam == 0 && E.burn_dam == 0) // Ignore undamaged limb - continue - nrembrute = rembrute - E.brute_dam // Deduct the healed damage from the remain - nremburn = remburn - E.burn_dam - E.heal_damage(rembrute, remburn) - rembrute = nrembrute - remburn = nremburn - user.visible_message("[user] bandages the wounds on [H]'s [E.name] with the remaining bandages.", \ - "You bandages the wounds on [H]'s [E.name] with the remaining bandages." ) + heal(H, user) + H.UpdateDamageIcon() use(1) else @@ -151,6 +158,7 @@ singular_name = "ointment" icon_state = "ointment" origin_tech = "biotech=2" + healverb = "salve" /obj/item/stack/medical/ointment/attack(mob/living/M, mob/user) if(..()) @@ -163,29 +171,8 @@ if(affecting.open == 0) affecting.germ_level = 0 - user.visible_message("[user] salves the wounds on [H]'s [affecting.name].", \ - "You salves the wounds on [H]'s [affecting.name]." ) + heal(H, user) - var/rembrute = max(0, heal_brute - affecting.brute_dam) - var/remburn = max(0, heal_burn - affecting.burn_dam) - var/nrembrute = rembrute - var/nremburn = remburn - affecting.heal_damage(heal_brute, heal_burn) - if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO, LOWER_TORSO)) - for(var/obj/item/organ/external/E in affecting.children) - if(rembrute <= 0 && remburn <= 0) // Make sure there's actually overheal left and the organ is damaged before bothering - break - else if(E.status && ORGAN_ROBOT || E.open == 1) // Ignore robotic or open limb - continue - else if(E.brute_dam == 0 && E.burn_dam == 0) // Ignore undamaged limb - continue - nrembrute = rembrute - E.brute_dam // Deduct the healed damage from the remain - nremburn = remburn - E.burn_dam - E.heal_damage(rembrute, remburn) - rembrute = nrembrute - remburn = nremburn - user.visible_message("[user] salves the wounds on [H]'s [E.name] with the remaining ointment.", \ - "You salve the wounds on [H]'s [E.name] with the remaining ointment." ) H.UpdateDamageIcon() use(1) else From 25dd0feda24c0da8a6f9a7cf9549a85d4bf942e7 Mon Sep 17 00:00:00 2001 From: Ansari Date: Mon, 21 May 2018 08:02:36 +0800 Subject: [PATCH 07/99] Use !E.brutedam instead of == 0 --- code/game/objects/items/stacks/medical.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 00388d7e40b..846da0b61aa 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -95,7 +95,7 @@ break else if(E.status && ORGAN_ROBOT || E.open) // Ignore robotic or open limb continue - else if(E.brute_dam == 0 && E.burn_dam == 0) // Ignore undamaged limb + else if(!E.brute_dam && !E.burn_dam) // Ignore undamaged limb continue nrembrute = rembrute - E.brute_dam // Deduct the healed damage from the remain nremburn = remburn - E.burn_dam From c1d66ab81a96d335217654932cdd9074f561b452 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 23 May 2018 00:17:20 -0400 Subject: [PATCH 08/99] KOI --- code/modules/events/event_container.dm | 3 +- code/modules/events/koi_mirgration.dm | 41 ++++++++++++++++++ .../simple_animal/hostile/retaliate/fish.dm | 39 ++++++++++++++++- icons/obj/fish_items.dmi | Bin 15203 -> 34359 bytes paradise.dme | 1 + 5 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 code/modules/events/koi_mirgration.dm diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index ef7b99e1133..96a271db644 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -139,7 +139,8 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Sentience", /datum/event/sentience, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 15, is_one_shot = TRUE) + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 15, is_one_shot = TRUE), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Koi School", /datum/event/koi_migration, 200,) ) /datum/event_container/moderate diff --git a/code/modules/events/koi_mirgration.dm b/code/modules/events/koi_mirgration.dm new file mode 100644 index 00000000000..52e4a3d37cc --- /dev/null +++ b/code/modules/events/koi_mirgration.dm @@ -0,0 +1,41 @@ +/datum/event/koi_migration + announceWhen = 50 + endWhen = 900 + + var/list/spawned_koi = list() + +/datum/event/koi_migration/setup() + announceWhen = rand(40, 60) + endWhen = rand(600,1200) + +/datum/event/koi_migration/announce() + var/announcement = "" + announcement = "Unknown biological [spawned_koi.len == 1 ? "entity has" : "entities have"] been detected near [station_name()], please stand-by." + event_announcement.Announce(announcement, "Lifesign Alert") + +/datum/event/koi_migration/start() + spawn_fish(landmarks_list.len) + +/datum/event/koi_migration/proc/spawn_fish(var/num_groups, var/group_size_min=3, var/group_size_max=5) + var/list/spawn_locations = list() + + for(var/obj/effect/landmark/C in landmarks_list) + if(C.name == "carpspawn") + spawn_locations.Add(C.loc) + spawn_locations = shuffle(spawn_locations) + num_groups = min(num_groups, spawn_locations.len) + + var/i = 1 + while(i <= num_groups) + var/group_size = rand(group_size_min, group_size_max) + for(var/j = 1, j <= group_size, j++) + var/carptype = /mob/living/simple_animal/hostile/retaliate/carp/koi + spawned_koi.Add(new carptype(spawn_locations[i])) + i++ + +/datum/event/koi_migration/end() + for(var/mob/living/simple_animal/hostile/retaliate/carp/koi/C in spawned_koi) + if(!C.stat) + var/turf/T = get_turf(C) + if(istype(T, /turf/space)) + qdel(C) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm index 3462e8e18e7..4ac78a86fcb 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm @@ -27,4 +27,41 @@ speak_emote = list("gnashes") faction = list("carp") - flying = 1 \ No newline at end of file + flying = 1 + + +/mob/living/simple_animal/hostile/retaliate/carp/koi + name = "space koi" + desc = "a gentle space faring koi." + icon = 'icons/obj/fish_items.dmi' + icon_state = "koi1" + icon_living = "koi1" + icon_dead = "koi1-dead" + icon_gib = "carp_gib" + + harm_intent_damage = 1 + melee_damage_lower = 2 + melee_damage_upper = 2 + attacktext = "bites" + attack_sound = 'sound/weapons/bite.ogg' + speak_emote = list("blurps") + + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + maxbodytemp = 1500 + + faction = list("carp") + flying = 1 + +/mob/living/simple_animal/hostile/retaliate/carp/koi/New() + ..() + var/koinum = rand(1,4) + icon_state = "koi[koinum]" + icon_living = "koi[koinum]" + icon_dead = "koi[koinum]-dead" + if(prob(1)) + icon_state = "koi5" + + +/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(var/movement_dir = 0) + return 1 \ No newline at end of file diff --git a/icons/obj/fish_items.dmi b/icons/obj/fish_items.dmi index fd8eea365405dfbc1a2fd3edf12a4df3515637b1..47b62af97f751c7817dc6a33f89ac34a9f3e07bc 100644 GIT binary patch literal 34359 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

%`BtG4ogq=*NHk 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 z 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 diff --git a/paradise.dme b/paradise.dme index 6cf47e457f5..8dea50b6372 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1339,6 +1339,7 @@ #include "code\modules\events\immovable_rod.dm" #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" +#include "code\modules\events\koi_mirgration.dm" #include "code\modules\events\mass_hallucination.dm" #include "code\modules\events\meaty_gore.dm" #include "code\modules\events\meaty_ops.dm" From dd997a0b20e210defc892743e4fee8abe64d5068 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 23 May 2018 01:34:58 -0400 Subject: [PATCH 09/99] some tweaks. --- code/modules/events/koi_mirgration.dm | 7 +++---- .../mob/living/simple_animal/hostile/retaliate/fish.dm | 2 ++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/events/koi_mirgration.dm b/code/modules/events/koi_mirgration.dm index 52e4a3d37cc..9fba9f092be 100644 --- a/code/modules/events/koi_mirgration.dm +++ b/code/modules/events/koi_mirgration.dm @@ -9,8 +9,7 @@ endWhen = rand(600,1200) /datum/event/koi_migration/announce() - var/announcement = "" - announcement = "Unknown biological [spawned_koi.len == 1 ? "entity has" : "entities have"] been detected near [station_name()], please stand-by." + var/announcement = "Unknown biological entities have been detected near [station_name()], please stand-by." event_announcement.Announce(announcement, "Lifesign Alert") /datum/event/koi_migration/start() @@ -29,8 +28,8 @@ while(i <= num_groups) var/group_size = rand(group_size_min, group_size_max) for(var/j = 1, j <= group_size, j++) - var/carptype = /mob/living/simple_animal/hostile/retaliate/carp/koi - spawned_koi.Add(new carptype(spawn_locations[i])) + var/mob/living/simple_animal/hostile/retaliate/carp/koi/K = new(spawn_locations[i]) + spawned_koi.Add(K) i++ /datum/event/koi_migration/end() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm index 4ac78a86fcb..4422c695196 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm @@ -45,6 +45,7 @@ attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("blurps") + butcher_results = null atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 @@ -52,6 +53,7 @@ faction = list("carp") flying = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/hostile/retaliate/carp/koi/New() ..() From 4e7aa78dcaea817dbfc3bdcb1526389df3f956e2 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 23 May 2018 01:38:32 -0400 Subject: [PATCH 10/99] I can be stupid. --- code/modules/events/koi_mirgration.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/events/koi_mirgration.dm b/code/modules/events/koi_mirgration.dm index 9fba9f092be..bb986a0f899 100644 --- a/code/modules/events/koi_mirgration.dm +++ b/code/modules/events/koi_mirgration.dm @@ -9,8 +9,7 @@ endWhen = rand(600,1200) /datum/event/koi_migration/announce() - var/announcement = "Unknown biological entities have been detected near [station_name()], please stand-by." - event_announcement.Announce(announcement, "Lifesign Alert") + event_announcement.Announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") /datum/event/koi_migration/start() spawn_fish(landmarks_list.len) From 5ae7eb3963ce91e0bb0426a419db761c2e239f2d Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 24 May 2018 18:58:29 -0400 Subject: [PATCH 11/99] feedback update --- code/modules/events/event_container.dm | 2 +- .../simple_animal/hostile/retaliate/fish.dm | 19 +++++++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 96a271db644..45bf962178b 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -140,7 +140,7 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Sentience", /datum/event/sentience, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 15, is_one_shot = TRUE), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Koi School", /datum/event/koi_migration, 200,) + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Koi School", /datum/event/koi_migration, 80,) ) /datum/event_container/moderate diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm index 4422c695196..28a8826362f 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm @@ -32,18 +32,15 @@ /mob/living/simple_animal/hostile/retaliate/carp/koi name = "space koi" - desc = "a gentle space faring koi." + desc = "A gentle space-faring koi." icon = 'icons/obj/fish_items.dmi' icon_state = "koi1" icon_living = "koi1" icon_dead = "koi1-dead" - icon_gib = "carp_gib" harm_intent_damage = 1 melee_damage_lower = 2 melee_damage_upper = 2 - attacktext = "bites" - attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("blurps") butcher_results = null @@ -51,19 +48,17 @@ minbodytemp = 0 maxbodytemp = 1500 - faction = list("carp") - flying = 1 - gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/retaliate/carp/koi/New() ..() - var/koinum = rand(1,4) + var/koinum = rand(1, 4) + if(prob(1)) + koinum = 5 icon_state = "koi[koinum]" icon_living = "koi[koinum]" icon_dead = "koi[koinum]-dead" - if(prob(1)) - icon_state = "koi5" -/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(var/movement_dir = 0) - return 1 \ No newline at end of file +/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(var/movement_dir) + return TRUE \ No newline at end of file From ce42a6d95298febde38b0c790c74584cd7b66537 Mon Sep 17 00:00:00 2001 From: Citinited Date: Sun, 29 Apr 2018 18:56:18 +0100 Subject: [PATCH 12/99] RPD refactor Adds rpd_act proc to do stuff instead of doing it all in one big afterattack proc Removes RPD_ALLOWED_HERE flag as it is now redundant --- code/__DEFINES/construction.dm | 8 + code/__DEFINES/flags.dm | 1 - code/game/atoms.dm | 3 + code/game/machinery/pipe/construction.dm | 22 +++ code/game/objects/items/weapons/rpd.dm | 161 +++++++++--------- code/game/objects/objs.dm | 4 + code/game/objects/structures/window.dm | 3 + code/game/turfs/simulated.dm | 1 - code/game/turfs/simulated/shuttle.dm | 4 +- code/game/turfs/simulated/walls.dm | 12 ++ code/game/turfs/space/space.dm | 1 - code/game/turfs/space/transit.dm | 4 +- code/game/turfs/turf.dm | 11 ++ code/game/turfs/unsimulated.dm | 3 + .../recycling/disposal-construction.dm | 13 ++ 15 files changed, 163 insertions(+), 88 deletions(-) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 9d8ca0b3013..8e967777225 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -52,3 +52,11 @@ #define MAX_STACK_SIZE 50 //maximum amount of cable in a coil #define MAXCOIL 30 + +//rpd stuff + +#define RPD_ATMOS_MODE 1 +#define RPD_DISPOSALS_MODE 2 +#define RPD_ROTATE_MODE 3 +#define RPD_FLIP_MODE 4 +#define RPD_DELETE_MODE 5 diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 0ec1567f86d..cd6688d095f 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -101,7 +101,6 @@ //turf-only flags #define NOJAUNT 1 -#define RPD_ALLOWED_HERE 2//By default, RPD is disabled on turfs. //ITEM INVENTORY SLOT BITMASKS #define SLOT_OCLOTHING 1 diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 19af319aa20..e8ceb49dc35 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -296,6 +296,9 @@ /atom/proc/emag_act() return +/atom/proc/rpd_act() + return + /atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked) if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 2d5a885aba1..7b67aed66be 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -180,6 +180,16 @@ //update the name and icon of the pipe item depending on the type +/obj/item/pipe/rpd_act(mob/user, obj/item/rpd/our_rpd) + if(our_rpd.mode == RPD_ROTATE_MODE) + rotate() + else if(our_rpd.mode == RPD_FLIP_MODE) + flip() + else if(our_rpd.mode == RPD_DELETE_MODE) + our_rpd.delete_single_pipe(user, src) + else + ..() + /obj/item/pipe/proc/update(var/obj/machinery/atmospherics/make_from) var/list/nlist = list( \ "pipe", \ @@ -650,6 +660,12 @@ to_chat(user, "You have fastened the meter to the pipe.") qdel(src) +/obj/item/pipe_meter/rpd_act(mob/user, obj/item/rpd/our_rpd) + if(our_rpd.mode == RPD_DELETE_MODE) + our_rpd.delete_single_pipe(user, src) + else + ..() + /obj/item/pipe_gsensor name = "gas sensor" desc = "A sensor that can be hooked to a computer" @@ -667,6 +683,12 @@ to_chat(user, "You have fastened the gas sensor.") qdel(src) +/obj/item/pipe_gsensor/rpd_act(mob/user, obj/item/rpd/our_rpd) + if(our_rpd.mode == RPD_DELETE_MODE) + our_rpd.delete_single_pipe(user, src) + else + ..() + #undef PIPE_SIMPLE_STRAIGHT #undef PIPE_SIMPLE_BENT #undef PIPE_HE_STRAIGHT diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index aaaf034b933..b43d7d0a44f 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -14,16 +14,13 @@ #define GAS_SENSOR 98 #define METER 99 #define DISPOSALS_JUNCTION 2 -#define ATMOS_MODE 1 -#define DISPOSALS_MODE 2 -#define ROTATION_MODE 3 -#define FLIP_MODE 4 -#define DELETE_MODE 5 #define ATMOS_PIPING 1 #define SUPPLY_PIPING 2 #define SCRUBBERS_PIPING 3 #define DEVICES 4 #define HEAT_PIPING 5 +#define RPD_COOLDOWN_TIME 4 //How long should we have to wait between dispensing pipes? +#define RPD_WALLBUILD_TIME 40 //How long should drilling into a wall take? /obj/item/rpd name = "rapid pipe dispenser" @@ -44,12 +41,12 @@ var/datum/effect_system/spark_spread/spark_system var/lastused var/iconrotation = 0 //used to orient icons and pipes - var/mode = 1 //Disposals, atmospherics, etc. + var/mode = RPD_ATMOS_MODE //Disposals, atmospherics, etc. var/pipetype = 1//For nanoUI menus var/whatpipe = 0 //What kind of pipe is it? See code/game/machinery/pipe/construction.dm for a list of defines - var/whatdpipe = 0 //What kind of disposals pipe is it? See code/game/machinery/pipe/dispenser.dm for a list of defines - var/spawndelay = 4 //How long should we have to wait between dispensing pipes? - var/walldelay = 40 //How long should drilling into a wall take? + var/whatdpipe = 0 //What kind of disposals pipe is it? + var/spawndelay = RPD_COOLDOWN_TIME + var/walldelay = RPD_WALLBUILD_TIME /obj/item/rpd/New() ..() @@ -59,18 +56,81 @@ //Procs -/obj/item/rpd/proc/Activaterpd(delay) +/obj/item/rpd/proc/Activaterpd(delay) //Maybe makes sparks and activates cooldown if there is a delay. playsound(loc, "sound/machines/click.ogg", 50, 1) if(prob(15)) spark_system.start() if(delay) lastused = world.time -/obj/item/rpd/proc/Manipulatepipes(subject, atmosverb, disposalsverb) - if(istype(subject, /obj/item/pipe)) - call(subject, atmosverb)() - else if(istype(subject, /obj/structure/disposalconstruct/)) - call(subject, disposalsverb)() +/obj/item/rpd/proc/create_atmos_pipe(mob/user, turf/T) //Make an atmos pipe, meter, or gas sensor + var/obj/item/pipe/P + if(whatpipe == GAS_SENSOR) + P = new /obj/item/pipe_gsensor(T) + else if(whatpipe == METER) + P = new /obj/item/pipe_meter(T) + else + P = new(T, pipe_type = whatpipe, dir = user.dir) + if(iconrotation == 0 && P.is_bent_pipe()) //Automatic rotation of dispensed pipes + P.dir = turn(user.dir, 135) + else if(iconrotation == 0 && P.pipe_type in list(CONNECTOR, UNARY_VENT, GAS_SCRUBBER, HE_EXCHANGER, SIMPLE_CAP, SUPPLY_CAP, SCRUBBERS_CAP, INJECTOR, PASSIVE_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction + P.flip() + else if(iconrotation != 0 && P.is_bent_pipe()) //If they selected a rotation and the pipe is bent + P.dir = turn(iconrotation, -45) + else if(iconrotation != 0) + P.dir = iconrotation + to_chat(user, "[src] rapidly dispenses [P]!") + Activaterpd(1) + +/obj/item/rpd/proc/create_disposals_pipe(mob/user, turf/T) //Make a disposals pipe / construct + var/obj/structure/disposalconstruct/P = new(T) //Now we make the pipe + P.dir = iconrotation + P.ptype = whatdpipe + if(iconrotation == 0) //Automatic rotation + P.dir = user.dir + if(iconrotation == 0 && whatdpipe != DISPOSALS_JUNCTION) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though + P.flip() + P.update() + to_chat(user, "[src] rapidly dispenses [P]!") + Activaterpd(1) + +/obj/item/rpd/proc/rotate_all_pipes(mob/user, turf/T) //Rotate all pipes on a turf + for(var/obj/item/pipe/P in T) + P.rotate() + for(var/obj/structure/disposalconstruct/D in T) + D.rotate() + +/obj/item/rpd/proc/flip_all_pipes(mob/user, turf/T) //Flip all pipes on a turf + for(var/obj/item/pipe/P in T) + P.flip() + for(var/obj/structure/disposalconstruct/D in T) + D.flip() + +/obj/item/rpd/proc/delete_all_pipes(mob/user, turf/T) //Delete all pipes on a turf + var/eaten + for(var/obj/item/pipe/P in T) + QDEL_NULL(P) + eaten = TRUE + for(var/obj/item/pipe_gsensor/G in T) + QDEL_NULL(G) + eaten = TRUE + for(var/obj/item/pipe_meter/M in T) + QDEL_NULL(M) + eaten = TRUE + for(var/obj/structure/disposalconstruct/D in T) + if(!D.anchored) + QDEL_NULL(D) + eaten = TRUE + if(eaten) + to_chat(user, "[src] sucks up the loose pipes on [T].") + Activaterpd() + else + to_chat(user, "There were no loose pipes on [T].") + +/obj/item/rpd/proc/delete_single_pipe(mob/user, obj/P) //Delete a single pipe + to_chat(user, "[src] sucks up [P].") + QDEL_NULL(P) + Activaterpd() //Lists of things @@ -175,71 +235,11 @@ var/list/pipemenu = list( return SSnanoui.update_uis(src) -//What the RPD actually does - /obj/item/rpd/afterattack(atom/target, mob/user, proximity) ..() - var/turf/T = get_turf(target) - if(loc != user || ismob(target) || istype(target, /obj/structure/window) || !proximity || world.time < lastused + spawndelay) + if(loc != user || !proximity || world.time < lastused + spawndelay) return - if(!(T.flags & RPD_ALLOWED_HERE)) - to_chat(user, "[src] beeps, \"Unable to interface with [T]. Please try again later.\"") - return - if(mode == ATMOS_MODE) - if(istype(T, /turf/simulated/wall)) //Drilling into walls takes time - playsound(loc, "sound/weapons/circsawhit.ogg", 50, 1) - user.visible_message("[user] starts drilling a hole in [T]...", "You start drilling a hole in [T]...", "You hear a drill.") - if(!do_after(user, walldelay, target = T)) - return - user.visible_message("[user] finishes drilling a hole in [T]!", "You finish drilling a hole in [T]!", "You hear clanking.") - var/obj/item/pipe/P - if(whatpipe == GAS_SENSOR) - P = new /obj/item/pipe_gsensor(T) - else if(whatpipe == METER) - P = new /obj/item/pipe_meter(T) - else - P = new(T, pipe_type = whatpipe, dir = user.dir) - if(iconrotation == 0 && P.is_bent_pipe()) //Automatic rotation of dispensed pipes - P.dir = turn(user.dir, 135) - else if(iconrotation == 0 && P.pipe_type in list(CONNECTOR, UNARY_VENT, GAS_SCRUBBER, HE_EXCHANGER, SIMPLE_CAP, SUPPLY_CAP, SCRUBBERS_CAP, INJECTOR, PASSIVE_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction - P.flip() - else if(iconrotation != 0 && P.is_bent_pipe()) //If they selected a rotation and the pipe is bent - P.dir = turn(iconrotation, -45) - else if(iconrotation != 0) - P.dir = iconrotation - to_chat(user, "[src] rapidly dispenses [P]!") - Activaterpd(1) - else if(mode == DISPOSALS_MODE && !istype(T, /turf/simulated/shuttle)) - if(istype(T, /turf/simulated/wall)) //No disposals pipes on walls - to_chat(user, "That type of pipe won't fit on [T]!") - return - var/obj/structure/disposalconstruct/P = new(T) //Now we make the pipe - P.dir = iconrotation - P.ptype = whatdpipe - if(iconrotation == 0) //Automatic rotation - P.dir = user.dir - if(iconrotation == 0 && whatdpipe != DISPOSALS_JUNCTION) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though - P.flip() - P.update() - to_chat(user, "[src] rapidly dispenses [P]!") - Activaterpd(1) - else if(mode == ROTATION_MODE) - for(var/obj/W in T) - Manipulatepipes(W, /obj/item/pipe/verb/rotate, /obj/structure/disposalconstruct/verb/rotate) - else if(mode == FLIP_MODE) - for(var/obj/W in T) - Manipulatepipes(W, /obj/item/pipe/verb/flip, /obj/structure/disposalconstruct/verb/flip) - else if(mode == DELETE_MODE) - var/eaten - for(var/obj/W in T) - if(istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor) || istype(W, /obj/structure/disposalconstruct) && !W.anchored) - QDEL_NULL(W) - eaten = TRUE - if(eaten) - to_chat(user, "[src] sucks up the loose pipes on [T].") - Activaterpd() - else - to_chat(user, "There were no loose pipes on [T].") + target.rpd_act(user, src) #undef SIMPLE_CAP #undef SUPPLY_CAP @@ -253,13 +253,10 @@ var/list/pipemenu = list( #undef GAS_SENSOR #undef METER #undef DISPOSALS_JUNCTION -#undef ATMOS_MODE -#undef DISPOSALS_MODE -#undef ROTATION_MODE -#undef FLIP_MODE -#undef DELETE_MODE #undef ATMOS_PIPING #undef SUPPLY_PIPING #undef SCRUBBERS_PIPING #undef DEVICES #undef HEAT_PIPING +#undef RPD_COOLDOWN_TIME +#undef RPD_WALLBUILD_TIME diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index fe9e8444378..352868056f5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -68,6 +68,10 @@ SSnanoui.close_uis(src) return ..() +/obj/rpd_act(mob/user, obj/item/rpd/our_rpd) + var/turf/T = get_turf(src) //This preserves RPD behaviour on specific turfs + T.rpd_act(user, our_rpd) + /obj/proc/process() set waitfor = 0 processing_objects.Remove(src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index aebd111ad26..8b42d1f350e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -79,6 +79,9 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f /obj/structure/window/narsie_act() color = "#7D1919" +/obj/structure/window/rpd_act() + return + /obj/structure/window/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) destroy() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 89c40be8641..61f622c071f 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -4,7 +4,6 @@ var/image/wet_overlay = null var/thermite = 0 - flags = RPD_ALLOWED_HERE oxygen = MOLES_O2STANDARD nitrogen = MOLES_N2STANDARD var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed diff --git a/code/game/turfs/simulated/shuttle.dm b/code/game/turfs/simulated/shuttle.dm index 0c5e6c08f6b..7a781679173 100644 --- a/code/game/turfs/simulated/shuttle.dm +++ b/code/game/turfs/simulated/shuttle.dm @@ -1,7 +1,6 @@ /turf/simulated/shuttle name = "shuttle" icon = 'icons/turf/shuttle.dmi' - flags = null thermal_conductivity = 0.05 heat_capacity = 0 layer = 2 @@ -13,6 +12,9 @@ density = 1 blocks_air = 1 +/turf/simulated/shuttle/rpd_act(mob/user, obj/item/rpd/our_rpd) + if(our_rpd.mode == RPD_DELETE_MODE)//No pipes on shuttles + our_rpd.delete_all_pipes(user, src) /turf/simulated/shuttle/narsie_act() if(prob(20)) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index b1cbf84493f..545cf857d6d 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -168,6 +168,18 @@ if(prob(50)) dismantle_wall() +/turf/simulated/wall/rpd_act(mob/user, obj/item/rpd/our_rpd) + if(our_rpd.mode == RPD_ATMOS_MODE) + playsound(src, "sound/weapons/circsawhit.ogg", 50, 1) + user.visible_message("[user] starts drilling a hole in [src]...", "You start drilling a hole in [src]...", "You hear drilling.") + if(!do_after(user, our_rpd.walldelay, target = src)) //Drilling into walls takes time + return + our_rpd.create_atmos_pipe(user, src) + else if(our_rpd.mode == RPD_DISPOSALS_MODE) + return + else + ..() + /turf/simulated/wall/mech_melee_attack(obj/mecha/M) if(M.damtype == "brute") playsound(src, 'sound/weapons/punch4.ogg', 50, 1) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 60c63d0f221..58911d952b4 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -3,7 +3,6 @@ name = "\proper space" icon_state = "0" dynamic_lighting = 0 - flags = RPD_ALLOWED_HERE luminosity = 1 temperature = TCMB diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 611ff1656f3..a1749cf15c9 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -1,5 +1,4 @@ /turf/space/transit - flags = null var/pushdirection // push things that get caught in the transit tile this direction //Overwrite because we dont want people building rods in space. @@ -119,7 +118,8 @@ AM.newtonian_move(dir) - +/turf/space/transit/rpd_act() + return //Overwrite because we dont want people building rods in space. /turf/space/transit/attackby() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index f70aee9740f..dda914482b1 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -71,6 +71,17 @@ /turf/ex_act(severity) return 0 +/turf/rpd_act(mob/user, obj/item/rpd/our_rpd) + if(our_rpd.mode == RPD_ATMOS_MODE) + our_rpd.create_atmos_pipe(user, src) + else if(our_rpd.mode == RPD_DISPOSALS_MODE) + our_rpd.create_disposals_pipe(user, src) + else if(our_rpd.mode == RPD_ROTATE_MODE) + our_rpd.rotate_all_pipes(user, src) + else if(our_rpd.mode == RPD_FLIP_MODE) + our_rpd.flip_all_pipes(user, src) + else if(our_rpd.mode == RPD_DELETE_MODE) + our_rpd.delete_all_pipes(user, src) /turf/bullet_act(var/obj/item/projectile/Proj) if(istype(Proj ,/obj/item/projectile/beam/pulse)) diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index 5c9509a3d68..35b6c2056e3 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -7,6 +7,9 @@ /turf/unsimulated/can_lay_cable() return 0 +/turf/unsimulated/rpd_act() + return + /turf/unsimulated/floor/plating/vox icon_state = "plating" name = "plating" diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 3658846a696..137962d040c 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -265,3 +265,16 @@ else to_chat(user, "You need to attach it to the plating first!") return + +/obj/structure/disposalconstruct/rpd_act(mob/user, obj/item/rpd/our_rpd) + if(anchored) + to_chat(user, "[src] is bolted down!") + return + else if(our_rpd.mode == RPD_ROTATE_MODE) + rotate() + else if(our_rpd.mode == RPD_FLIP_MODE) + flip() + else if(our_rpd.mode == RPD_DELETE_MODE) + our_rpd.delete_single_pipe(user, src) + else + ..() From 2ec3c797fdb1b339931d2ce6e9016c5d22c33d6a Mon Sep 17 00:00:00 2001 From: Citinited Date: Thu, 3 May 2018 23:59:43 +0100 Subject: [PATCH 13/99] RPD refactor: part 2 --- code/__DEFINES/construction.dm | 8 - code/__DEFINES/pipes.dm | 69 ++++ code/__HELPERS/global_lists.dm | 7 + code/_globalvars/lists/objects.dm | 4 +- code/datums/pipe_datums.dm | 311 ++++++++++++++++++ code/game/machinery/pipe/construction.dm | 82 ----- code/game/machinery/pipe/pipe_dispenser.dm | 46 +-- code/game/objects/items/weapons/rpd.dm | 147 ++------- code/game/turfs/turf.dm | 2 +- .../recycling/disposal-construction.dm | 13 +- icons/obj/pipes/disposal.dmi | Bin 89359 -> 97824 bytes nano/templates/rpd.tmpl | 109 +++--- paradise.dme | 2 + 13 files changed, 505 insertions(+), 295 deletions(-) create mode 100644 code/__DEFINES/pipes.dm create mode 100644 code/datums/pipe_datums.dm diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 8e967777225..9d8ca0b3013 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -52,11 +52,3 @@ #define MAX_STACK_SIZE 50 //maximum amount of cable in a coil #define MAXCOIL 30 - -//rpd stuff - -#define RPD_ATMOS_MODE 1 -#define RPD_DISPOSALS_MODE 2 -#define RPD_ROTATE_MODE 3 -#define RPD_FLIP_MODE 4 -#define RPD_DELETE_MODE 5 diff --git a/code/__DEFINES/pipes.dm b/code/__DEFINES/pipes.dm new file mode 100644 index 00000000000..cd67811ecdf --- /dev/null +++ b/code/__DEFINES/pipes.dm @@ -0,0 +1,69 @@ +//Atmospherics pipes + +#define PIPE_SIMPLE_STRAIGHT 0 +#define PIPE_SIMPLE_BENT 1 +#define PIPE_HE_STRAIGHT 2 +#define PIPE_HE_BENT 3 +#define PIPE_CONNECTOR 4 +#define PIPE_MANIFOLD 5 +#define PIPE_JUNCTION 6 +#define PIPE_UVENT 7 +#define PIPE_MVALVE 8 +#define PIPE_PUMP 9 +#define PIPE_SCRUBBER 10 +#define PIPE_INSULATED_STRAIGHT 11 +#define PIPE_INSULATED_BENT 12 +#define PIPE_GAS_FILTER 13 +#define PIPE_GAS_MIXER 14 +#define PIPE_PASSIVE_GATE 15 +#define PIPE_VOLUME_PUMP 16 +#define PIPE_HEAT_EXCHANGE 17 +#define PIPE_TVALVE 18 +#define PIPE_MANIFOLD4W 19 +#define PIPE_CAP 20 +#define PIPE_OMNI_MIXER 21 +#define PIPE_OMNI_FILTER 22 +#define PIPE_UNIVERSAL 23 +#define PIPE_SUPPLY_STRAIGHT 24 +#define PIPE_SUPPLY_BENT 25 +#define PIPE_SCRUBBERS_STRAIGHT 26 +#define PIPE_SCRUBBERS_BENT 27 +#define PIPE_SUPPLY_MANIFOLD 28 +#define PIPE_SCRUBBERS_MANIFOLD 29 +#define PIPE_SUPPLY_MANIFOLD4W 30 +#define PIPE_SCRUBBERS_MANIFOLD4W 31 +#define PIPE_SUPPLY_CAP 32 +#define PIPE_SCRUBBERS_CAP 33 +#define PIPE_INJECTOR 34 +#define PIPE_DVALVE 35 +#define PIPE_DP_VENT 36 +#define PIPE_PASV_VENT 37 +#define PIPE_DTVALVE 38 +#define PIPE_CIRCULATOR 39 +#define PIPE_GAS_SENSOR 98 +#define PIPE_METER 99 + +//Disposals pipes + +#define PIPE_DISPOSALS_STRAIGHT 0 +#define PIPE_DISPOSALS_BENT 1 +#define PIPE_DISPOSALS_JUNCTION 2 +#define PIPE_DISPOSALS_Y_JUNCTION 4 +#define PIPE_DISPOSALS_TRUNK 5 +#define PIPE_DISPOSALS_BIN 6 +#define PIPE_DISPOSALS_OUTLET 7 +#define PIPE_DISPOSALS_CHUTE 8 + +//RPD stuff + +#define RPD_ATMOS_MODE 1 +#define RPD_DISPOSALS_MODE 2 +#define RPD_ROTATE_MODE 3 +#define RPD_FLIP_MODE 4 +#define RPD_DELETE_MODE 5 + +#define RPD_ATMOS_PIPING 1 +#define RPD_SUPPLY_PIPING 2 +#define RPD_SCRUBBERS_PIPING 3 +#define RPD_DEVICES 4 +#define RPD_HEAT_PIPING 5 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index d0e1feb3d62..2af41d294db 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -50,6 +50,13 @@ init_subtypes(/datum/crafting_recipe, crafting_recipes) +//RPD stuff + var/list/pipe_list = list() + init_subtypes(/datum/pipes/atmospheric, pipe_list) + init_subtypes(/datum/pipes/disposal, pipe_list) + for(var/I in pipe_list) + var/datum/pipes/P = I + construction_pipe_list += list(list("pipename" = P.pipename, "pipeid" = P.pipeid, "atmosordisposals" = P.pipetype, "category" = P.category, "orientations" = P.orientations, "icon" = P.previewicon, "bendy" = P.bendy)) return 1 /* // Uncomment to debug chemical reaction list. diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 5a025702877..62bc1716c36 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -43,4 +43,6 @@ var/global/list/meteor_list = list() //list of all meteors var/global/list/poi_list = list() //list of points of interest for observe/follow var/global/list/active_jammers = list() // List of active radio jammers -var/global/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing. \ No newline at end of file +var/global/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing. + +var/global/list/construction_pipe_list = list() //List of all pipe datums diff --git a/code/datums/pipe_datums.dm b/code/datums/pipe_datums.dm new file mode 100644 index 00000000000..95850555a6e --- /dev/null +++ b/code/datums/pipe_datums.dm @@ -0,0 +1,311 @@ +//For use with the RPD (for now). All pipes here are ones that can be dispensed with the RPD + +#define RPD_ATMOS 1 +#define RPD_DISPOSAL 2 + +/datum/pipes + var/pipename //What the pipe is called in the interface + var/pipeid //Use the pipe define for this + var/pipetype //Atmos, disposals etc. + var/category //What category of pipe + var/bendy = FALSE//Is this pipe bendy? + var/orientations //Number of orientations (for interface purposes) + var/previewicon //icon_state of the dispensed pipe (for interface purposes) + +/datum/pipes/atmospheric + pipetype = RPD_ATMOS + category = RPD_ATMOS_PIPING + +/datum/pipes/disposal + pipetype = RPD_DISPOSAL + +//Normal pipes + +/datum/pipes/atmospheric/simple + pipename = "Straight pipe" + pipeid = PIPE_SIMPLE_STRAIGHT + orientations = 2 + previewicon = "simple" + +/datum/pipes/atmospheric/simple/bent + pipename = "Bent pipe" + pipeid = PIPE_SIMPLE_BENT + orientations = 4 + bendy = TRUE + +/datum/pipes/atmospheric/manifold + pipename = "T-manifold" + pipeid = PIPE_MANIFOLD + orientations = 4 + previewicon = "manifold" + +/datum/pipes/atmospheric/manifold4w + pipename = "4-way manifold" + pipeid = PIPE_MANIFOLD4W + orientations = 1 + previewicon = "manifold4w" + +/datum/pipes/atmospheric/cap + pipename = "Pipe cap" + pipeid = PIPE_CAP + orientations = 4 + previewicon = "cap" + +/datum/pipes/atmospheric/valve + pipename = "Manual valve" + pipeid = PIPE_MVALVE + orientations = 2 + previewicon = "mvalve" + +/datum/pipes/atmospheric/valve/digital + pipename = "Digital valve" + pipeid = PIPE_DVALVE + previewicon = "dvalve" + +/datum/pipes/atmospheric/tvalve + pipename = "Manual T-valve" + pipeid = PIPE_TVALVE + orientations = 4 + previewicon = "tvalve" + +/datum/pipes/atmospheric/tvalve/digital + pipename = "Digital T-valve" + pipeid = PIPE_DTVALVE + previewicon = "dtvalve" + +//Supply pipes + + +/datum/pipes/atmospheric/simple/supply + pipename = "Straight supply pipe" + pipeid = PIPE_SUPPLY_STRAIGHT + category = RPD_SUPPLY_PIPING + +/datum/pipes/atmospheric/simple/bent/supply + pipename = "Bent supply pipe" + pipeid = PIPE_SUPPLY_BENT + category = RPD_SUPPLY_PIPING + +/datum/pipes/atmospheric/manifold/supply + pipename = "Supply T-manifold" + pipeid = PIPE_SUPPLY_MANIFOLD + category = RPD_SUPPLY_PIPING + +/datum/pipes/atmospheric/manifold4w/supply + pipename = "4-way supply manifold" + pipeid = PIPE_SUPPLY_MANIFOLD4W + category = RPD_SUPPLY_PIPING + +/datum/pipes/atmospheric/cap/supply + pipename = "Supply pipe cap" + pipeid = PIPE_SUPPLY_CAP + category = RPD_SUPPLY_PIPING + +//Scrubbers pipes + +/datum/pipes/atmospheric/simple/scrubbers + pipename = "Straight scrubbers pipe" + pipeid = PIPE_SCRUBBERS_STRAIGHT + category = RPD_SCRUBBERS_PIPING + +/datum/pipes/atmospheric/simple/bent/scrubbers + pipename = "Bent scrubbers pipe" + pipeid = PIPE_SCRUBBERS_BENT + category = RPD_SCRUBBERS_PIPING + +/datum/pipes/atmospheric/manifold/scrubbers + pipename = "Scrubbers T-manifold" + pipeid = PIPE_SCRUBBERS_MANIFOLD + category = RPD_SCRUBBERS_PIPING + +/datum/pipes/atmospheric/manifold4w/scrubbers + pipename = "4-way scrubbers manifold" + pipeid = PIPE_SCRUBBERS_MANIFOLD4W + category = RPD_SCRUBBERS_PIPING + +/datum/pipes/atmospheric/cap/scrubbers + pipename = "Scrubbers pipe cap" + pipeid = PIPE_SCRUBBERS_CAP + category = RPD_SCRUBBERS_PIPING + +//Devices + +/datum/pipes/atmospheric/upa + pipename = "Universal pipe adapter" + pipeid = PIPE_UNIVERSAL + orientations = 2 + previewicon = "universal" + category = RPD_DEVICES + +/datum/pipes/atmospheric/connector + pipename = "Connector" + pipeid = PIPE_CONNECTOR + orientations = 4 + previewicon = "connector" + category = RPD_DEVICES + +/datum/pipes/atmospheric/unaryvent + pipename = "Unary vent" + pipeid = PIPE_UVENT + orientations = 4 + previewicon = "uvent" + category = RPD_DEVICES + +/datum/pipes/atmospheric/scrubber + pipename = "Scrubber" + pipeid = PIPE_SCRUBBER + orientations = 4 + previewicon = "scrubber" + category = RPD_DEVICES + +/datum/pipes/atmospheric/pump + pipename = "Gas pump" + pipeid = PIPE_PUMP + orientations = 4 + previewicon = "pump" + category = RPD_DEVICES + +/datum/pipes/atmospheric/volume_pump + pipename = "Volume pump" + pipeid = PIPE_VOLUME_PUMP + orientations = 4 + previewicon = "volumepump" + category = RPD_DEVICES + +/datum/pipes/atmospheric/gate + pipename = "Passive gate" + pipeid = PIPE_PASSIVE_GATE + orientations = 4 + previewicon = "passivegate" + category = RPD_DEVICES + +/datum/pipes/atmospheric/filter + pipename = "Gas filter" + pipeid = PIPE_GAS_FILTER + orientations = 4 + previewicon = "filter" + category = RPD_DEVICES + +/datum/pipes/atmospheric/mixer + pipename = "Gas mixer" + pipeid = PIPE_GAS_MIXER + orientations = 4 + previewicon = "mixer" + category = RPD_DEVICES + +/datum/pipes/atmospheric/sensor + pipename = "Gas sensor" + pipeid = PIPE_GAS_SENSOR + orientations = 1 + previewicon = "sensor" + category = RPD_DEVICES + +/datum/pipes/atmospheric/meter + pipename = "Gas meter" + pipeid = PIPE_METER + orientations = 1 + previewicon = "meter" + category = RPD_DEVICES + +/datum/pipes/atmospheric/passive_vent + pipename = "Passive vent" + pipeid = PIPE_PASV_VENT + orientations = 4 + previewicon = "passive vent" + category = RPD_DEVICES + +/datum/pipes/atmospheric/dual_vent_pump + pipename = "Dual-port vent pump" + pipeid = PIPE_DP_VENT + orientations = 2 + previewicon = "dual-port vent" + category = RPD_DEVICES + +/datum/pipes/atmospheric/injector + pipename = "Air injector" + pipeid = PIPE_INJECTOR + orientations = 4 + previewicon = "injector" + category = RPD_DEVICES + +//Heat exchange pipes + +/datum/pipes/atmospheric/he + pipename = "Straight pipe" + pipeid = PIPE_HE_STRAIGHT + orientations = 2 + previewicon = "he" + category = RPD_HEAT_PIPING + +/datum/pipes/atmospheric/he/bent + pipename = "Bent pipe" + pipeid = PIPE_HE_BENT + orientations = 4 + bendy = TRUE + +/datum/pipes/atmospheric/he_junction + pipename = "Junction" + pipeid = PIPE_JUNCTION + orientations = 4 + previewicon = "junction" + category = RPD_HEAT_PIPING + +/datum/pipes/atmospheric/heat_exchanger + pipename = "Heat exchanger" + pipeid = PIPE_HEAT_EXCHANGE + orientations = 4 + previewicon = "heunary" + category = RPD_HEAT_PIPING + +//DISPOSALS PIPES + +/datum/pipes/disposal/straight + pipename = "Straight pipe" + pipeid = PIPE_DISPOSALS_STRAIGHT + orientations = 2 + previewicon = "conpipe-s" + +/datum/pipes/disposal/bent + pipename = "Bent pipe" + pipeid = PIPE_DISPOSALS_BENT + orientations = 4 + previewicon = "conpipe-c" + +/datum/pipes/disposal/junction + pipename = "Junction" + pipeid = PIPE_DISPOSALS_JUNCTION + orientations = 4 + previewicon = "conpipe-j1" + +/datum/pipes/disposal/y_junction + pipename = "Y-junction" + pipeid = PIPE_DISPOSALS_Y_JUNCTION + orientations = 4 + previewicon = "conpipe-y" + +/datum/pipes/disposal/trunk + pipename = "Trunk" + pipeid = PIPE_DISPOSALS_TRUNK + orientations = 4 + previewicon = "conpipe-t" + +/datum/pipes/disposal/bin + pipename = "Bin" + pipeid = PIPE_DISPOSALS_BIN + orientations = 1 + previewicon = "condisposal" + +/datum/pipes/disposal/outlet + pipename = "Outlet" + pipeid = PIPE_DISPOSALS_OUTLET + orientations = 4 + previewicon = "outlet" + +/datum/pipes/disposal/chute + pipename = "Chute" + pipeid = PIPE_DISPOSALS_CHUTE + orientations = 4 + previewicon = "intake" + +#undef RPD_ATMOS +#undef RPD_DISPOSAL diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 7b67aed66be..4c702be5c39 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -1,44 +1,3 @@ -#define PIPE_SIMPLE_STRAIGHT 0 -#define PIPE_SIMPLE_BENT 1 -#define PIPE_HE_STRAIGHT 2 -#define PIPE_HE_BENT 3 -#define PIPE_CONNECTOR 4 -#define PIPE_MANIFOLD 5 -#define PIPE_JUNCTION 6 -#define PIPE_UVENT 7 -#define PIPE_MVALVE 8 -#define PIPE_PUMP 9 -#define PIPE_SCRUBBER 10 -#define PIPE_INSULATED_STRAIGHT 11 -#define PIPE_INSULATED_BENT 12 -#define PIPE_GAS_FILTER 13 -#define PIPE_GAS_MIXER 14 -#define PIPE_PASSIVE_GATE 15 -#define PIPE_VOLUME_PUMP 16 -#define PIPE_HEAT_EXCHANGE 17 -#define PIPE_TVALVE 18 -#define PIPE_MANIFOLD4W 19 -#define PIPE_CAP 20 -#define PIPE_OMNI_MIXER 21 -#define PIPE_OMNI_FILTER 22 -#define PIPE_UNIVERSAL 23 -#define PIPE_SUPPLY_STRAIGHT 24 -#define PIPE_SUPPLY_BENT 25 -#define PIPE_SCRUBBERS_STRAIGHT 26 -#define PIPE_SCRUBBERS_BENT 27 -#define PIPE_SUPPLY_MANIFOLD 28 -#define PIPE_SCRUBBERS_MANIFOLD 29 -#define PIPE_SUPPLY_MANIFOLD4W 30 -#define PIPE_SCRUBBERS_MANIFOLD4W 31 -#define PIPE_SUPPLY_CAP 32 -#define PIPE_SCRUBBERS_CAP 33 -#define PIPE_INJECTOR 34 -#define PIPE_DVALVE 35 -#define PIPE_DP_VENT 36 -#define PIPE_PASV_VENT 37 -#define PIPE_DTVALVE 38 -#define PIPE_CIRCULATOR 39 - /obj/item/pipe name = "pipe" desc = "A pipe" @@ -688,44 +647,3 @@ our_rpd.delete_single_pipe(user, src) else ..() - -#undef PIPE_SIMPLE_STRAIGHT -#undef PIPE_SIMPLE_BENT -#undef PIPE_HE_STRAIGHT -#undef PIPE_HE_BENT -#undef PIPE_CONNECTOR -#undef PIPE_MANIFOLD -#undef PIPE_JUNCTION -#undef PIPE_UVENT -#undef PIPE_MVALVE -#undef PIPE_PUMP -#undef PIPE_SCRUBBER -#undef PIPE_INSULATED_STRAIGHT -#undef PIPE_INSULATED_BENT -#undef PIPE_GAS_FILTER -#undef PIPE_GAS_MIXER -#undef PIPE_PASSIVE_GATE -#undef PIPE_VOLUME_PUMP -#undef PIPE_HEAT_EXCHANGE -#undef PIPE_TVALVE -#undef PIPE_MANIFOLD4W -#undef PIPE_CAP -#undef PIPE_OMNI_MIXER -#undef PIPE_OMNI_FILTER -#undef PIPE_UNIVERSAL -#undef PIPE_SUPPLY_STRAIGHT -#undef PIPE_SUPPLY_BENT -#undef PIPE_SCRUBBERS_STRAIGHT -#undef PIPE_SCRUBBERS_BENT -#undef PIPE_SUPPLY_MANIFOLD -#undef PIPE_SCRUBBERS_MANIFOLD -#undef PIPE_SUPPLY_MANIFOLD4W -#undef PIPE_SCRUBBERS_MANIFOLD4W -#undef PIPE_SUPPLY_CAP -#undef PIPE_SCRUBBERS_CAP -#undef PIPE_INJECTOR -#undef PIPE_DVALVE -#undef PIPE_DP_VENT -#undef PIPE_PASV_VENT -#undef PIPE_DTVALVE -#undef PIPE_CIRCULATOR diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index cb2892722aa..138efcc0f9b 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -10,12 +10,12 @@ /obj/machinery/pipedispenser/attack_hand(mob/user) if(..()) return 1 - + interact(user) - + /obj/machinery/pipedispenser/attack_ghost(mob/user) interact(user) - + /obj/machinery/pipedispenser/interact(mob/user) var/dat = {" Regular pipes:
@@ -163,22 +163,22 @@ /obj/machinery/pipedispenser/disposal/attack_hand(mob/user) if(..()) return - + interact(user) - + /obj/machinery/pipedispenser/disposal/attack_ghost(mob/user) interact(user) - + /obj/machinery/pipedispenser/disposal/interact(mob/user) var/dat = {"Disposal Pipes

Pipe
Bent Pipe
Junction
-Y-Junction
-Trunk
-Bin
-Outlet
-Chute
+Y-Junction
+Trunk
+Bin
+Outlet
+Chute
"} var/datum/browser/popup = new(user, "pipedispenser", name, 400, 400) @@ -194,29 +194,15 @@ if(!wait) var/p_type = text2num(href_list["dmake"]) - var/obj/structure/disposalconstruct/C = new (loc) + var/obj/structure/disposalconstruct/C = new (loc, p_type) switch(p_type) - if(0) - C.ptype = 0 - if(1) - C.ptype = 1 - if(2) - C.ptype = 2 - if(3) - C.ptype = 4 - if(4) - C.ptype = 5 - if(5) - C.ptype = 6 - C.density = 1 if(6) - C.ptype = 7 - C.density = 1 + C.density = TRUE if(7) - C.ptype = 8 - C.density = 1 + C.density = TRUE + if(8) + C.density = TRUE C.add_fingerprint(usr) - C.update() wait = 1 spawn(15) wait = 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index b43d7d0a44f..b74ff4ba594 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -2,23 +2,6 @@ Rapid Pipe Dispenser */ -#define SIMPLE_CAP 20 -#define SUPPLY_CAP 32 -#define SCRUBBERS_CAP 33 -#define HE_EXCHANGER 17 -#define CONNECTOR 4 -#define UNARY_VENT 7 -#define PASSIVE_VENT 37 -#define GAS_SCRUBBER 10 -#define INJECTOR 34 -#define GAS_SENSOR 98 -#define METER 99 -#define DISPOSALS_JUNCTION 2 -#define ATMOS_PIPING 1 -#define SUPPLY_PIPING 2 -#define SCRUBBERS_PIPING 3 -#define DEVICES 4 -#define HEAT_PIPING 5 #define RPD_COOLDOWN_TIME 4 //How long should we have to wait between dispensing pipes? #define RPD_WALLBUILD_TIME 40 //How long should drilling into a wall take? @@ -40,11 +23,11 @@ origin_tech = "engineering=4;materials=2" var/datum/effect_system/spark_spread/spark_system var/lastused - var/iconrotation = 0 //used to orient icons and pipes + var/iconrotation = 0 //Used to orient icons and pipes var/mode = RPD_ATMOS_MODE //Disposals, atmospherics, etc. - var/pipetype = 1//For nanoUI menus - var/whatpipe = 0 //What kind of pipe is it? See code/game/machinery/pipe/construction.dm for a list of defines - var/whatdpipe = 0 //What kind of disposals pipe is it? + var/pipetype = RPD_ATMOS_PIPING//For nanoUI menus, this is a subtype of pipes e.g. scrubbers pipes, devices + var/whatpipe = PIPE_SIMPLE_STRAIGHT //What kind of atmos pipe is it? + var/whatdpipe = PIPE_DISPOSALS_STRAIGHT //What kind of disposals pipe is it? var/spawndelay = RPD_COOLDOWN_TIME var/walldelay = RPD_WALLBUILD_TIME @@ -56,7 +39,7 @@ //Procs -/obj/item/rpd/proc/Activaterpd(delay) //Maybe makes sparks and activates cooldown if there is a delay. +/obj/item/rpd/proc/activate_rpd(delay) //Maybe makes sparks and activates cooldown if there is a delay playsound(loc, "sound/machines/click.ogg", 50, 1) if(prob(15)) spark_system.start() @@ -65,34 +48,31 @@ /obj/item/rpd/proc/create_atmos_pipe(mob/user, turf/T) //Make an atmos pipe, meter, or gas sensor var/obj/item/pipe/P - if(whatpipe == GAS_SENSOR) + if(whatpipe == PIPE_GAS_SENSOR) P = new /obj/item/pipe_gsensor(T) - else if(whatpipe == METER) + else if(whatpipe == PIPE_METER) P = new /obj/item/pipe_meter(T) else - P = new(T, pipe_type = whatpipe, dir = user.dir) - if(iconrotation == 0 && P.is_bent_pipe()) //Automatic rotation of dispensed pipes + P = new(T, pipe_type = whatpipe, dir = user.dir) //Make the pipe, BUT WAIT! There's more! + if(!iconrotation && P.is_bent_pipe()) //Automatically rotates dispensed pipes if the user selected auto-rotation P.dir = turn(user.dir, 135) - else if(iconrotation == 0 && P.pipe_type in list(CONNECTOR, UNARY_VENT, GAS_SCRUBBER, HE_EXCHANGER, SIMPLE_CAP, SUPPLY_CAP, SCRUBBERS_CAP, INJECTOR, PASSIVE_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction + else if(!iconrotation && P.pipe_type in list(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_CAP, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_INJECTOR, PIPE_PASV_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction P.flip() - else if(iconrotation != 0 && P.is_bent_pipe()) //If they selected a rotation and the pipe is bent + else if(iconrotation && P.is_bent_pipe()) //If user selected a rotation and the pipe is bent P.dir = turn(iconrotation, -45) - else if(iconrotation != 0) + else if(iconrotation) //If user selected a rotation P.dir = iconrotation to_chat(user, "[src] rapidly dispenses [P]!") - Activaterpd(1) + activate_rpd(1) /obj/item/rpd/proc/create_disposals_pipe(mob/user, turf/T) //Make a disposals pipe / construct - var/obj/structure/disposalconstruct/P = new(T) //Now we make the pipe - P.dir = iconrotation - P.ptype = whatdpipe - if(iconrotation == 0) //Automatic rotation + var/obj/structure/disposalconstruct/P = new(T, whatdpipe, iconrotation) + if(!iconrotation) //Automatic rotation P.dir = user.dir - if(iconrotation == 0 && whatdpipe != DISPOSALS_JUNCTION) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though + if(!iconrotation && whatdpipe != PIPE_DISPOSALS_JUNCTION) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though P.flip() - P.update() to_chat(user, "[src] rapidly dispenses [P]!") - Activaterpd(1) + activate_rpd(1) /obj/item/rpd/proc/rotate_all_pipes(mob/user, turf/T) //Rotate all pipes on a turf for(var/obj/item/pipe/P in T) @@ -123,76 +103,29 @@ eaten = TRUE if(eaten) to_chat(user, "[src] sucks up the loose pipes on [T].") - Activaterpd() + activate_rpd() else to_chat(user, "There were no loose pipes on [T].") /obj/item/rpd/proc/delete_single_pipe(mob/user, obj/P) //Delete a single pipe to_chat(user, "[src] sucks up [P].") QDEL_NULL(P) - Activaterpd() + activate_rpd() //Lists of things -var/list/pipelist = list( //id refers to the pipe_type found in construction.dm, icon refers to the name of the icon state in icons/obj/pipe-item.dmi. Icons are made with the asset-cache - list("pipename" = "Straight pipe", "id" = 0, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "simple"), - list("pipename" = "Bent pipe", "id" = 1, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1), - list("pipename" = "T-manifold", "id" = 5, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "manifold"), - list("pipename" = "4-way manifold", "id" = 19, "category" = ATMOS_PIPING, "orientations" = 1, "icon" = "manifold4w"), - list("pipename" = "Pipe cap", "id" = 20, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "cap"), - list("pipename" = "Manual valve", "id" = 8, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "mvalve"), - list("pipename" = "Digital valve", "id" = 35, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "dvalve"), - list("pipename" = "Manual T-valve", "id" = 18, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "tvalve"), - list("pipename" = "Digital T-valve", "id" = 38, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "dtvalve"), - list("pipename" = "Straight supply pipe", "id" = 24, "category" = SUPPLY_PIPING, "orientations" = 2, "icon" = "simple"), - list("pipename" = "Bent supply pipe", "id" = 25, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1), - list("pipename" = "Supply T-manifold", "id" = 28, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "manifold"), - list("pipename" = "4-way supply manifold", "id" = 30, "category" = SUPPLY_PIPING, "orientations" = 1, "icon" = "manifold4w"), - list("pipename" = "Supply pipe cap", "id" = 32, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "cap"), - list("pipename" = "Straight scrubbers pipe", "id" = 26, "category" = SCRUBBERS_PIPING, "orientations" = 2, "icon" = "simple"), - list("pipename" = "Bent scrubbers pipe", "id" = 27, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1), - list("pipename" = "Scrubbers T-manifold", "id" = 29, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "manifold"), - list("pipename" = "4-way scrubbers manifold", "id" = 31, "category" = SCRUBBERS_PIPING, "orientations" = 1, "icon" = "manifold4w"), - list("pipename" = "Scrubbers pipe cap", "id" = 33, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "cap"), - list("pipename" = "Universal pipe adapter", "id" = 23, "category" = DEVICES, "orientations" = 2, "icon" = "universal"), - list("pipename" = "Connector", "id" = 4, "category" = DEVICES, "orientations" = 4, "icon" = "connector"), - list("pipename" = "Unary vent", "id" = 7, "category" = DEVICES, "orientations" = 4, "icon" = "uvent"), - list("pipename" = "Scrubber", "id" = 10, "category" = DEVICES, "orientations" = 4, "icon" = "scrubber"), - list("pipename" = "Gas pump", "id" = 9, "category" = DEVICES, "orientations" = 4, "icon" = "pump"), - list("pipename" = "Volume pump", "id" = 16, "category" = DEVICES, "orientations" = 4, "icon" = "volumepump"), - list("pipename" = "Passive gate", "id" = 15, "category" = DEVICES, "orientations" = 4, "icon" = "passivegate"), - list("pipename" = "Gas filter", "id" = 13, "category" = DEVICES, "orientations" = 4, "icon" = "filter"), - list("pipename" = "Gas mixer", "id" = 14, "category" = DEVICES, "orientations" = 4, "icon" = "mixer"), - list("pipename" = "Gas sensor", "id" = 98, "category" = DEVICES, "orientations" = 1, "icon" = "sensor"), - list("pipename" = "Meter", "id" = 99, "category" = DEVICES, "orientations" = 1, "icon" = "meter"), - list("pipename" = "Passive vent", "id" = 37, "category" = DEVICES, "orientations" = 4, "icon" = "passive vent"), - list("pipename" = "Dual-port vent pump", "id" = 36, "category" = DEVICES, "orientations" = 2, "icon" = "dual-port vent"), - list("pipename" = "Air injector", "id" = 34, "category" = DEVICES, "orientations" = 4, "icon" = "injector"), - list("pipename" = "Straight HE pipe", "id" = 2, "category" = HEAT_PIPING, "orientations" = 2, "icon" = "he"), - list("pipename" = "Bent HE pipe", "id" = 3, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "he", "bendy" = 1), - list("pipename" = "Junction", "id" = 6, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "junction"), - list("pipename" = "Heat exchanger", "id" = 17, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "heunary")) -var/list/dpipelist = list( - list("pipename" = "Straight pipe", "id" = 0, "orientations" = 2, "icon" = "conpipe-s"), - list("pipename" = "Bent pipe", "id" = 1, "orientations" = 4, "icon" = "conpipe-c"), - list("pipename" = "Junction", "id" = 2, "orientations" = 4, "icon" = "conpipe-j1"), - list("pipename" = "Y-junction", "id" = 4, "orientations" = 4, "icon" = "conpipe-y"), - list("pipename" = "Trunk", "id" = 5, "orientations" = 4, "icon" = "conpipe-t"), - list("pipename" = "Bin", "id" = 6, "orientations" = 1, "icon" = "condisposal"), - list("pipename" = "Outlet", "id" = 7, "orientations" = 4, "icon" = "outlet"), - list("pipename" = "Chute", "id" = 8, "orientations" = 4, "icon" = "intake")) var/list/mainmenu = list( - list("category" = "Atmospherics", "mode" = 1, "icon" = "wrench"), - list("category" = "Disposals", "mode" = 2, "icon" = "recycle"), - list("category" = "Rotate", "mode" = 3, "icon" = "rotate-right"), - list("category" = "Flip", "mode" = 4, "icon" = "exchange"), - list("category" = "Recycle", "mode" = 5, "icon" = "trash")) + list("category" = "Atmospherics", "mode" = RPD_ATMOS_MODE, "icon" = "wrench"), + list("category" = "Disposals", "mode" = RPD_DISPOSALS_MODE, "icon" = "recycle"), + list("category" = "Rotate", "mode" = RPD_ROTATE_MODE, "icon" = "rotate-right"), + list("category" = "Flip", "mode" = RPD_FLIP_MODE, "icon" = "exchange"), + list("category" = "Recycle", "mode" = RPD_DELETE_MODE, "icon" = "trash")) var/list/pipemenu = list( - list("pipecategory" = "Normal", "pipemode" = 1), - list("pipecategory" = "Supply", "pipemode" = 2), - list("pipecategory" = "Scrubber", "pipemode" = 3), - list("pipecategory" = "Devices", "pipemode" = 4), - list("pipecategory" = "Heat exchange", "pipemode" = 5)) + list("pipecategory" = "Normal", "pipemode" = RPD_ATMOS_PIPING), + list("pipecategory" = "Supply", "pipemode" = RPD_SUPPLY_PIPING), + list("pipecategory" = "Scrubber", "pipemode" = RPD_SCRUBBERS_PIPING), + list("pipecategory" = "Devices", "pipemode" = RPD_DEVICES), + list("pipecategory" = "Heat exchange", "pipemode" = RPD_HEAT_PIPING)) //NanoUI stuff @@ -208,11 +141,10 @@ var/list/pipemenu = list( /obj/item/rpd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state) var/data[0] - data["dpipelist"] = dpipelist data["iconrotation"] = iconrotation data["mainmenu"] = mainmenu data["mode"] = mode - data["pipelist"] = pipelist + data["pipelist"] = construction_pipe_list data["pipemenu"] = pipemenu data["pipetype"] = pipetype data["whatdpipe"] = whatdpipe @@ -239,24 +171,7 @@ var/list/pipemenu = list( ..() if(loc != user || !proximity || world.time < lastused + spawndelay) return - target.rpd_act(user, src) + target.rpd_act(user, src) //Handle RPD effects in separate procs -#undef SIMPLE_CAP -#undef SUPPLY_CAP -#undef SCRUBBERS_CAP -#undef HE_EXCHANGER -#undef CONNECTOR -#undef UNARY_VENT -#undef PASSIVE_VENT -#undef GAS_SCRUBBER -#undef INJECTOR -#undef GAS_SENSOR -#undef METER -#undef DISPOSALS_JUNCTION -#undef ATMOS_PIPING -#undef SUPPLY_PIPING -#undef SCRUBBERS_PIPING -#undef DEVICES -#undef HEAT_PIPING #undef RPD_COOLDOWN_TIME #undef RPD_WALLBUILD_TIME diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index dda914482b1..aa0c8ecdcac 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -71,7 +71,7 @@ /turf/ex_act(severity) return 0 -/turf/rpd_act(mob/user, obj/item/rpd/our_rpd) +/turf/rpd_act(mob/user, obj/item/rpd/our_rpd) //This is the default turf behaviour for the RPD; override it as required if(our_rpd.mode == RPD_ATMOS_MODE) our_rpd.create_atmos_pipe(user, src) else if(our_rpd.mode == RPD_DISPOSALS_MODE) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 137962d040c..ebdd9b5fde4 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -17,6 +17,14 @@ var/dpdir = 0 // directions as disposalpipe var/base_state = "pipe-s" +/obj/structure/disposalconstruct/New(loc, pipe_type, direction) + ..() + if(pipe_type) + ptype = pipe_type + if(dir) + dir = direction + update() + // update iconstate and dpdir due to dir and type /obj/structure/disposalconstruct/proc/update() var/flip = turn(dir, 180) @@ -267,10 +275,7 @@ return /obj/structure/disposalconstruct/rpd_act(mob/user, obj/item/rpd/our_rpd) - if(anchored) - to_chat(user, "[src] is bolted down!") - return - else if(our_rpd.mode == RPD_ROTATE_MODE) + if(our_rpd.mode == RPD_ROTATE_MODE) rotate() else if(our_rpd.mode == RPD_FLIP_MODE) flip() diff --git a/icons/obj/pipes/disposal.dmi b/icons/obj/pipes/disposal.dmi index 707a064dd94bc2b14c41ee526a162f8f96dc44ab..cbd0834b435845be68c5b2e691dff3853a1ab604 100644 GIT binary patch literal 97824 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 eaiT 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 MZKzdw$tLW-0Fi&&S^xk5 literal 89359 zcmZ^~bx>Px)Gdq`*Wv|Aao6GyN(&UHI257Q&R%P;6{W5!kB3c#jf8}Rr||ic1`-m=%OMI9CdSLhwb$Gu z5)!h#kCxuIPgd?0ZniGpY@MBuki2qI(>^%$y(N@gxMi!b{Q9%MvB+auCH42{&sNmh z+JXX8WT(BA^o&nVZ1~CO#Q7zFKAZh$tJ^l;6}r09C#mOmiUMqP=@ojFv%A@U!- zpkAx3U&zTHQ_#{8*gwPXvcfNczDgpr6AR@xA&^lBP;KQFzl>Ff3oH5{*~uF53wBry{(s-G zrN5Kv(>+c_z*0GM7ANx#F6l0dJBRL`*-XSePm`PjpxNs^O^AyF8gWk@OGIa9C;a<@ z5lcjc@u}&nNkX_`;5ia`o|&g^`s%k?l{$wde&>RVY6#pXa}w^{^{|iLXL8&)_f(yS zm;obtVi5jjh-fTG8Pa&2)NO7210LQ@ox_8h_w&udE|>EIsW++vLkF(&WNuQ&l^xaBl|8j}DRd;MCXV}AU! z0ES6PNtt-tq(ezfovg>{G4&5n`2={`k=3_vT4|o&D5ThHK~jA#?QmY-@MKjn1-DVc z2>`;+_q1+|yB@f$f%Md}6IXvnuW%HvA|7zjz)z4 z7A)Nj@fT{c{JmxeRC)(lyeP-+<~-TYcD@ZbX|B4WK0Yq$Do`Div$x8J=-MSKWDf8D zDrTl9A<<{(pVL$1-`ROIi0yJ#c3PUOL~K8)9m98$=AMBJPrwhqcOKo1DpwG`>(D&( zKEx9Q;d{RPazk`Eok;-csn?5V4}JVoU z^PUTy)?MP(ld5*hXR{N=vj^hjj@`jo{?%bS{X5^2)4Idnf8 z8RhynHa3m?#)ipBX5^jGe!))Z>7l2jpwemN;{I7pbN@s)`z*W+mjv+i^)c}OHZhi< z&m-P?DZ;ZKywbf!m49N1t4ouuXlTy7?M@=&M}AmU{x}Qm(&1QpeDmzz=|faEvmmTa zbniFl+2sy~Xi!Q!*6HX}7_#M#iIdX39}Em^?Qjn>Zu@fdS7~Eymgz{@pv~v8{J^9D zIy7VJ?5sKPQ`HqBlUAu$FpBBY{;S@-m2VTv3ce<}Hq+?a%)Ui=bbMB|_^{!Aw+64f z)rmUkS{6^ER1Q@)KB_49Ob{toKFqX;y1BhMvbQ}tqY-&Ku|AFPg#BV~eIG^D8KE*$ zVbVpe*=E9B$WS=5IQ14a1l8L6s?l-9qx8m}0|Qig37NZY&bY5;N3yE;CRX^_DFqJy zKq|yg=E`&(_@un^V`#@?lhA@$z$r9P`!nXIw0^0U0hQLtr{9C$&#{>L58*@K5nbn; z7Zq?-gy!_K`{fCBR#8{2zL;*+JPyPVTh1!X^`&3 z^C;IXwCh(2{-FBfYay>dK8efzcrD(lq|oi4jo9MXyM$MfPi<&hS|wB}xX2h$A*qG`m#6)_5LIJimA;%n zpP}@NHj=OJCpt|Ktx%SvIvH>&Uj{>Ap&DbN2EL++JXdl}ID_QJQ|?KiB$4-7(Z^;t zuos~*vthmsVN9!PJ7!0ueQg?TT&PMuyrXtnWEA&2YXCzKW7$?i^9w+E=^HKcMsiUKY30R9`D80>6rV^}U z>*$!6)`U+Ywo~She|@JEZvfW&z*yPPAUMVXfYT$YyY6Fq-Az2#zDpGZ^Y|YrMR%nG zp6UStdf?}OK)iWR$deIb-S_;xIag|i{LH(1#8o=P&?{H68%7e90e93n-hMx`zRc+O zBYEDV@y7}E_^Fhj2+sdjSuqj^73C|6~$b3 z2EBp^TA$zdJ3gXXZ_E9J223q&hF8t`s(V>=kQaVUPU%JX`c8EqV?Hu0R43LZ29O5( zAP;HIOfPd5~>o4lBusXsE7|jCC;G zHh`+llwh|(xd=gKs~P>f)1sB}Wc7gn_j)XUn-;xv?g4Rj4zD73Uh~?C6*vRee0&Wb zwppEkd2A4qTfZCdtfXNXp4@)HwzL(1>c`ezx7k!6GD zTm!wOh8fd{t~5b|K%s&!m+scDKi$!Fg6dB}CSsslX<{lTXIwhs;ICf|R*kee;!B3c zNu{O$`8tRB?9uv#q&C)K&y(NaPsH%C0stVrwjE4GOQ`0GA>sA0tjojrx>@U0AmoP=2;3e}m9;s-0+#9RGuFhQIws*4`Rpg#C?*+t?WN=4 zaWi~tWW@gMN>RPb*37TxeyTq~lCKvjpwREWkM8#5WZtUs6iz#L|Q_x+eaO@wdb1J#I_^XjLWYhnM2)kl|f`A9u+JaOnvrGhU zlU3PBK4;nH@uYNl1vMt{7VHKg6h{KgL6@Ne%lD&4l<_A^A+!6%)*~maz*J5@2 zO6&cv7GiodD7JRLQcwIgI0Kj=jSf9AG-g?f>c~at`N;4u1solpE==m~Z9qlQ3cWqa z%nv5-&d#`7&n)PmSR)tb)>ej7bTuh(#WQdYYA?PQt*K=+ZcUSNa+@R^OP%Am2V0(t<4 zPU}r$3f-DZsB8!?^3?eb;g`cl%JcpAmkxGYEaK|;J0s})Wz5<#B(QxvCnI6a@rXPk zvw*bc^bmwze;E+;kLxTd47Q1t+KX_w9x_s6h3uTg12u|~c2hROV93UNx{ui$@Y6Wz z$-T68-${XSQUnueU@Wz4lhYbIJIObdXZR=wfY0h}n`!`}=!)_gzV5sR>;;oP$MIkE zfw~GAQGUCxcKW7UB_v-+kB5Y~XQ>(LR3E0q#aWT76>I|!;(n*i;FVsb9uA$<%t6aJt&%o?!hD05LT|blrOIy2V%BQ|CJis+ zME7Iqu_r4_E*JP&6hawEv;4r z{An+Y+&G~;;Lr3%E3Pkxb429OTyt1F*(yI zx|vH>BjXXEohp0X3EKMy4%Kv1&8I(mjWRF|1_~Z(iEXg8)`s?5)XMlv1ao)b=tV3= zHT=5C^m%%9(_uFz1|oJEX|1iv&I6#NN)Bi*&;QnV9GySC^&^nHYH{#)&%SE$5xx5- zP-LMWQE~P!A#uyBokjjl*ZKtAIX%pc^S!YfVs8^PLzyn@Cd~BL^9PFr^13<}Z1NLm z)%8paR_nN==zaN6Vl_~fI!F>D+|AI@8bNmujF5X@u^GU)-5XJ7mte`yhJ(C`m4O34 zpkeL#c(FPmc zVlj>X)5^wGLFirQxqoyyW`+=1I>z677l1p&^k2WYdk}e`Fq4+_Pg&*;uO2)jpp0A5 zzvVS6-vT+>KefasD;w~pqI?ZR6q$q|Z+iJ37UyzYj4k48W;%jp$J4w zPX|1G<>`i;>PCstVUh*NQQD}>26>T?65TX5s;aw-UOTk;_#XI;n5i;NnnVGDWZ&rB z^0rcGEBg3E6g8Fp!RiRS44Ze^LkoNw&yXTb*6exj=yYUqU#`j$@*dhJdjBy9vztl7fO^FSMy0@?}Y zeU&98*&B%T18hlia+Lb(hE~wRTV2Bp!J-hLwb5a`5Mh}_V*V~q zdGY9?Fg|^V4%AW8>?b%BDxNt>nj(F;^HRDsHI_mf=4V?`{}QJ6l&{GpLG{11FBuOo zbOk{6qs?cPjYY-}=S1uovdvmjU5!GEH48(+Sb4i-V(oGCl1dL$3jKOSA?n=LP3RR8D zDH2t$a;)WZ|8rmX0J%wrjbb+&3-}$6Q$UX(H%TNieeY^*!1n$&opAA3fpku*;b@+} zOeK9}C`49o>ND_!+L`k{a}nw~L}MSkmqoyH<=`RLmVV1i zMKL`V7@F0TW_?66{B_V)O)b_4rR259pR6%!Ts_caku<9dGpzk9R*d=|Lvr#2u?4n+ z4RvRy>a4(f*Awrc=z5*YtIq3AVn0!IeGs6&Cdzkl_HS$*KF_5%}O$xAA3xx73F;D5*}x0Y9sluW=WnG$yS zZ8V9l58sTWjPPv((csMyR-YMoUE2zaX-oc6t(0VGf>A<$Toa5n7U8~+Q_fHo!)={M zsQu&DytmjDH#Jod8bhxe6RZd$5*II?wTf!*s07T-7TEi&X@@!S`2|=5Yx*Y6q_owA zhvNfa7T%WwJU{3$8xOI{cN=M*AXt#sEIw?st2#fwcRj|oyV>yuHo1Z-9e^Z?RPbsu#TEr5 zQY=p`JM6WmdB9f{Pb2*uTHfw7vk0#u@8BHPNUaMo2$?X zXrBKqB{*bo4Q2LZ3N;wh?%LGlc?ZuXQaD2x39m8y)9)ssBkDJN<}!SNNJnW4Gc#@Z z2WHjOLJlsO1h9oe!VA!n%zD7aZPXL>?#9@8QaIPIV$83}*8u()-IN6w#Q4IwU0>2lWv&i))G{vQFL5hjQ&$8K z@smaJQZM4)bdm28+q(etx^H3Ube>N-R%rXN*$*)Hi4>M5DaSl48_$D=C*2A7k-&#i zwriQ+AyXK}ugLMC!RM;OqHdnX!(%+Z6P?$=wS?%0UK`GaTQP+G+{DempOC|cSzw57 z>{ZlI^8F*jqo&bjm^&4u*fkj+IemWK*s4te0yX#2m|xE5jIRA4u|tc^Taw4qNH=> z*HSU!3{$u@t+N{r_bmNHT?APnYJHv$XSmy9{?5s3@{d#9WM$OYev(PmScMY#U!hGyVg38^#EQ>Go>+1TX^wS71lmLw`ME{ zgG0DP4aI)_B7?8hq~6z^vf8+~*sKx^xfl$bs&2{_)QAAWBu+bn+WP!^PPTocyBP`+*gN$MJ{e8`I^ z@R>BbQQ(Zu02P=*75tH%J@0A2qHd1~`2C%ip01%5i>KsaXss~Q*)b0`UT9R&mk)0Y zeqlq%L<<@x*xps=JkMH=PK@_DPn<{(BO9vrdH}L}h^8a}(5{s;N&%(U zOx-E(i;7y<*!OY)Dor8+ijG8~45;lmy>zlH*Il1nd&nUyf;;S#-0yc7DuL;L4!Arq zl~b2NqW8i~UdzuIWTSg%5i83gc>Svsuh-44RrZ8(FADB0xLvS&J}(Swp?af&~W>F2L&uy?18cL`mQWr^xy2 zn`3j)t%Ct!UxKuc|H+lZCkxyn*&ku{i{<`|~BJ-!kS&b>X?@(%%@|^@* zQ~fqjs)n@ojmo$TU9A!TU?D$IT5<-~bN19|WjY;}u9EaKzjgMG)^mR2{+u9+dq#+| zSy$4$fF>*waGMDn9Rx(FrRkT0KX!%id6HhMsQj@$YC4vE=}H?X^VExW9}d9To^H&Y zmC?C?oERnB%kLxE``MA=))I>gTyFPUniL3n=_Vmkoct$C(f2DbRvp0XkD6i;Mol=u-w^bbU?xMN#{jvNPE zie#MVgOhjrgU)CMdAYu@eImpF2%} z;6w#+X9{2tx#>aN>3mJp-3NwlR$0&%yoXdIWIFgG{~rY*hV^ls8nK=`03d-4v-kIe z{_m{co1>K6JIIp#hH(*CX@2w!8?C)2yq0vH|E6WnO+=qc`Ybbct=H41@SMgsPH$fN zk!WwEVI@-{0$S>S+Ia~csch~dATb9w>+7ZbIgf|Yk2t-6WB;uuBZ9cGRPu!*=r5cf zgd>?90n=gRqZaW1>!nl1Qr9$rQ;-l$p7hyk3+_1*-Y1-a^yxlg5L?2c>mIBM(rV9N zO@f+htLYv6a6Sa(L%x!p_r;KH;$1{O%$Tsjl+>StJQHhxf_zEO#hTn3LG4(vZo0l6 zPN_XX0p3@c2f%(rj40B(>_4Ysk_2x#aV(!F)nGxENq9QjLPs z4!tS7r%W*Gbdk_3v@_eqxW2t5C4PUH7Oo!R1tjjS=eixFbrmQG6ciR7!zpuRAS~f{ z`+(%RNoW|XSz-mR`Gvwyia2w2rRz0yJ?~pwqE?i5SITb9{?h%Tj+=4wED(FZW74yn zxJ|ENBbLQ;VPi4fdnnt;($K~_X@d}hBclmJ5aU21B~R)EN~GwP>d$N|*boW2T%<1A zYCe)mK1FYXW&vpQwp!}|J^`$D**pK)*yF6_R0@p2C zWzXo=E6L0Ne|^!k(=Wfl+RO~%OGc{ORUIG|5wNZjS^f5Ct9ZiYHq;3bq>mo+oh1ELx}tM3&ZEw-h!0{S679AXGBsY>8>$S;M<8A;+ut>s`x#B)k4+AEQd~`pucr zH*tatbE5rKB=YlD*i*kEekex9{JQB%IFyw_k*W9fte#F9--0di&72Db=67l%RWa>(1(T2@_U`1I>c? z!G~?$ze3i6tdoJB#ZbOMcozxd$rlfKqU}$n%g4T*{4^dD>k;zzm;wGgRV4WP z&hW=-Kh9f44kRx!m!3j}?cj};OIG)uuK*;5oL>X>8v43qdy2pK=h^>;W*Hn68D6}U zVT0X(+lqxD0dY{@`ceD(?5uqRHQt8{iOmVLgl*!S;J!>5LVCD8F5>34x!?J+p`oee zK56W%Dmm^}Xw0vqDMt#ge>hTr``0^E^3`kT5LMXlNax#?#?9c_yTS($z^z#POXlEV_5 z7s}#}TqYa*B3Oaa>NaSAbzJ>bDF1l6&ZgZi-mq zsWL4tpW14ko|LbLAvEOIh^b|1Z_I$_^1S+za|nkE##y&n?)n{cQnXJ>{B@|= zJ65t5D10|W-Kfe%C-obmeevv991%N>7em)WXG7Yw@;sh1v}@-~ zy4Dt^KI=;Aa)2{Ttpsr9wrCFy)g5b8yx)JoPTkPc`$4%y3f%+EUedKamwLEiP4#_<;A8m5#d?Ru4GUM_o5>!fo?8c zvn8~DS|A2+2Xd%M865)#UeoYJ&l7+B1f$nA3G9>F3&Q~gsvIR z=Z)GTJn<+L%@4nnEbyqA^+X_u~EWRHI zWn{#T(8k+k9P!uXQ7uYBLHk7T>dxCNPDZR*0z((ZQe{y@fG%n<12_i8;@k1PA0=3$_p$Tnu{eH!ps>R{8)wCM9I6=g z1LaZ@MV6L4%s7Sq3Y+z0e8% zaQOqH zgs7&qlFJarV_U`LbUSxIdM67f=-XakGT+wkixQR|(MSEcK#d}dZP!}$GD1RKb%^} z68^t9HTmB3>eOi{nAqgZkK*2~H>6ihlv2 z6i(V1lH*$a#8h5%)aFo?GNwvH1%?Rx=)btQvBQ0U`yjPjxH&5_rr79(%X6F0y$^ZF zs45!Pj`s>drK>3BGU`qmlO{xqay{mOtc`qiqq1Sc(J`%{z-;zVA?|0#XjZQ!O|mE6 zPxEjA7x`fn!z>Qv4U;-tS8O;G8D77?-P{5=Ga1FcdE?{zXz6A7*{$FE2I`%Lu4{T< z1@5_qzLN6Y0d8ldv?ZJ>_C}{}u}=R7QOPt&owB89tRA(RI#=H#^=T{~|1tE1%o7et z@P7R0n*%E4XPihFQ=pu>4^`U#m8n_F|F$l-FO=m!l;MSh`_=PFjqb* z9!_e7llB0tY;c7Nnnh1lYV#cCgZHEbGkTT&W38)sU#cU8@znkydo~Sd-_$Fm7RcTa zR2eFr=4=rf($+e~vbCohyOo~#^V7yEiN%0G&u4E9>sd*Wl6`YtcNAQ>qujqtpwcu| zB|ZdP^vVDEI-`D2*HHK$8PE(LF)j5{5BFX?R_%m-ylPU({^xJGLW2F_e(SsRrO5ta zq4ND~bYS==R38?$zE4pRY5Ap@hde&;&0K-PKcbn3CAn@tvEG&8bOm^NJ35t?l)Q)5 zs{w39mAWU@cC9%-=HMaB9CGc_KlbsjTK4|;TATum@^_&8FExmsrt_pSD48QIez}Z@0%=zAvZwz*VNgJGCe+5>!^S3lN8jR`br0GeZC+~|G>t|for8b+gJ{H`jqTom zt5O!Wjjw`gNdB*S0u6&d+Rf3#z3f; z+Z$TaqOZ?=jeCV^Q#f>VI#uZrR#ENW z%h!|rq%t!gA&Z@+_KlEO8B>_EcMQY&XhZ5@H<{_AyYCsgy2)v;qcrM*rTQx3-a8vh zj7+gx_&i-kGw(w5Uk-aVvif0-h^_xa&=8k%FM^^GMl`j1G=*2KOW87AbFR|*U&oa= zqnv74^V$fnXQ!M;%DIz8Rs85v`^MZ_yI;r$QFx2RUXH*<)sG9I_m~=Ca>}i%8QIgk zQ@ZNiqoN?2kz%`_-%ggMQ654~MAu^_2}U_3>qB=mLya0F($mJrt@4RTjbviMPXb^> z#XWht!-&z4#$E7}+9J**xdh51T`m75tmD$;2mGHCi7{r9l!6!2LD5tu-@kqlg2!wu z1dbz`&Z*-Qq5AAQ=pRNeD?4UW3j9xLBJZoGFpA-9fu4$Vc%1df01 z%eXO#M;~|S|&9KCJONvb`vB`J;Lf_L!)f_e*B!S$xuk(EwS5ogt zpuMM7S?zp9^*YIW6)!z_>cH(b5P4afpVlS86(DVns(M31pq@S#wc0Iys)Hq_t>DgD)@h*^X4H_^)6bMWa%W55JS4!8Lu*fdKL!h!+r}+YR>mKud;I zo%gvw+nt`xo%UK-0DiE5?f26BWS|C;=P!CDZu=t@r$4UwtodugRe<#x_AfR+gVes6 z_4R^aW-DlnW~rIdW=$QdIaOB%&g-7=8|wHHOH&(lkF%_pKl_~2tHST@L2wv>pU(qN z(>ubnPT7b{=>*;%w6Y!|F+Y1`NXsia%2o$xJo2~d19Gf z&}2#=q|-!KK|%v##YH(M?}oGFH`}K(l?EXj{tX@ak-H>AF8FOA6G zSibA&V^U2<++A(F|2WHp?}}ry8m0W#1)mK1tXC!FBx^@D>LE{={O|eyD(K)0(Lc@$ zOL1G2R{Z-jkRp>Lq8GCxO948yH_7IYbJOEmI!eB`Hu%@W`P?F0;@Zy}eZ5J2wfD6+ zj)B?i{KXvtFmAmEzHtjNU6wx*RT06dOjABVuM#>gGtaCM4N$cxXyOX5Q? z(s9Yk2wWUa^-^DTNAiF+tY)U##?9v#J8$t~s8oOIKj9D{w+39jIHhpLel}gr<}YD4 zo-r0q-&8@WCs&8OjMclk5vR>+G_Q;%UQTGSuT05lbqA@EGxl?he*e2*eClp{p2Cq~ zZ#dC)T&JY!TG;=MyXXOEfK>P24V320au?WfaoPa ziLs4dr#wu(+(^hTl#BiBc(0qAcVL25*z~z`7hA8rb0rwAYhUaSZc-Hu7>t0;q<1w8 z6(f$LH!dhjqnR=26Kuk21k6mAE2G1fDdd869 zLacDWw8bw6&Uv%<_YHZcM|2JN?yZ&L4(DVhjbBoCxaEp6j&}}KC z`=XkRm+0L4!t%W5V;UM_tOwmaIGb3#dD+D)-hklQ-NVZh2x%0P#~gt)oqLxav(rqd(26*kCoJxu4cXvAQ}2w~$))f}%GRzwaFFtyr?*k;@&`d1Tl zLaLtk;j-ryU5db@$gE9LsFEAEDcsBW=jejNUG*Hi0OX0-NqhoW-hr7lbDq7XDF5P_ zyPcUzs1;nb0&+kvrP_pkTKN$+dl0OlTV_Otitvqwr(q+omI%nWwI2I+9<4s(&GY=x zJG}VRM`bt9b|bC1ADuzq1V**0B~OyfU?;Blwn&o|jW*3r-n5GCwQ~ie|WCnLl1r<~#ft zx81&&7pB*3vWujz6pJV-hRE)fKfOY~-*+l}%H?o$$?di||D1%TkDx3M8*ksoBWXodL|PUU zvbv8+X@sA-K8v=l5MNawke6Ch-j&KA(K=9sp40I@4fUQk@6Kd=?=`PMFUn`^n%-hp zPTCDNcrfL5u2Nq$#`#`!N!eeWSrXScp!J@LcA$@}{gH0;Efm@BFgdhbv4HNrMeJx$ z{={m+Q)GAx^9aoOT=NBMgFx`{ReDHYp^!#Koo?3Kf#5P~32qO#HxT*j2Fd^`P^T0c zkrr968P)?Mpsx6I6m@XLU{e<=9I2sXk3uTQVvzH6ZeT9(^&NF9f^&PJrCY%~#G1Vp zQDppt0#8qZ^Wudge`?yociKQNPoVm1y0IBZG1Kq0Ogz!OmJWgKJ^LW~xt7lLM&CD?{VK9D zJF%ZH5qE?C2X`_}99TU49b~&6a|6JHjWF9h0j;wVu%Iv;w=H%30<-LK0gzuAV2+dQd;r#S+PG$dJHqIU~B$F>RsaLGEqan5i5Md zYX|R1c{DT-nbVYCFYLw3?!}z`=9^!Le=kOQfC-KX4h zFID%kT)Xi2$X^4!9Km7f#PBW`_{%mDIFSBo8~xvf;JhCwbrY&XQ^f;IR9EY76)J=Chpy z!%Fk{av}9P90Ssp7T|voLU-K?3iCDDe->YKPsdM@C4Mx#2bf$SK(HZD#qdKiniL6Q zqt!mW!l2dd#g;nBfpjfjJaAOEH-=;NHb&*w_4a>Ji-Ol7Gq{R;y>3LK(ub#p6`ebV zWMCrvDNKNPC@B}}mVPgA#~;^YbBTO;-Ss7}z*Di--e&dO_Wo*IU~;%vC3|;^PU79U zFQR%(x9dv#VOYK@4fK2qd9l9cG63M0@q1`%h?B3)BW2ng_!Rel8^4_p0IrC#k9z(k z9)Ll{0XMoJZTJoVUg&ZjaJmqna@Kl4D|(RQzMCjdo9TwALR4;CIk%lQl@Zs_Rohp0 z&i|LnsCb>2IQe2G;=b67=IPSwdhr~Lyg1%i2_!B8b3B%9ufT{0aGmRp9Ch)4L#p}d z--Eh)Tsbs>K)W`W_d@$R69RsY;6BLnt&)IU^toM)u#9P{Nis<|%WOgajUqaq4UnaG z%w&kuNF(!)P%!hQpf52G0mlOvbh25Ff+hD`(%&wDnZ$6`Z*~TU+XDBTQprFh3@(seKt7loS`DNTa#C9l=n$9O%?HkN>3M@4Th1ozZaI<^;T zr73|?`=E8&8_c_NQsb`JYan}4*Y#T^HxlTBFpQ=&E`~H{o<9kvD#A< zF6$t^78VgwLvnj43O5l-0e6W z2I1hh^kR;WAZYb2%I(?aO+b4bLNT0~6}4nF%J~(gQA)8_lo&kI4xHpMrq&eXy>AOT zSj(?nP8!T4{x%}G?h)@7V7h<;76l9X{eZc7W);536^bjYs8YkM;fMKP>Mdm@7u-$A8rHu*)>fv@5?9la>L9BaZUBsTV*uLp07Q=D|o7<3hGM;zEr=6s!JxX|xw&IG(XZZOOkH@+7=k@~8>I0X5KT@wU5jPMr^b_2j zo_ibnDgkTt>QQNbN0~YehCe<85pyyhkw2GS&{1LIqL8Be{hpse`x7R~<|?^3pT3;$urf)1AEwb5=-#6YQX~y!t7cv)E;%KA@QSyYmq*0z%iR#7L z+McirP46gPm2DiU_~&!FeRXMsqWVs}s&6Vp^~}I0WIoU{aY1wknHV`e@6jP@5&dc8 zR)*+~sZ>NpPWG^A zy0^?L-bJkYs7Yz#F1L(xbv^{}*TC1WSFQVA7AGWlbkgoXT%fxzF&B&?-6Vztx+z{;aLDLh{CCMAD)K_H=s-d14AA}WKiHQ9&m%bdyKNjjus3j-1F)Kc*7=^pX= z>;>g*=?6cpCWlj*P}y4u1ygn<=Tf9kC(={WQYHs!8O-c>yN^8v)UV!`sy%?=z2s^A z?_Eh}T-#&_06z&J1<`AF(^;hS%_ zVlu>??iA!pgi{gTd3XrMDhhM;<+yDuQzX zI&X`AFhiLhwlTcZD2ZV{C)SuDsXMxkE#8!X{&RnX+Lpa$v>Mz06K-FxgIds!RCIE! zL6o$)q1^aF3Tld*n`812xt{B6cdP!*@#Lto;hl^6PXqng00o?$lK^^JDN3#g*39Gg zU}*E?ML(zW;Lj}T^=$TZ%AqlGwN2mD1G;EDu*SzX%ZzWr$=Qx&FBI4DmI@h5cg1fI z_5}L2h01sD@9Qgb`}&0Nsua%6G?mK32JYWT;!DQ2)AeZk%l-IRU=V$v=;cK(mEh(6)Mh{Vav80rw?>D~1 z#^chHw^l!wk^1jGjR%Z?t-hvHT>I?CycL@v>~yYB)aG_o(%AUdRK>aa#ap*A>09-* zc>Xwe_xkE0gC%#2@XBYsHk2xzZ^RNh^Iovxn)e;yTbD&)+CaYq{Lmq)JJ@%KdnH(w zSwT6ARH)UgJ4-3bh802a^oJaKs0A!s^jcPM@<9M2=M6FnDR#U25IqgqC65MtuX%2bXOIUBCK?< zAxrpLSakA57<#NyprILJ2Z%@q<38$XhA`TnIARwtk=Hc_ZW8+-(|TWjY5ga8p7^Q@ zk>IfLw+OUm1x9XDy-(dCTCw6E*uGeKeRpcN1x%f~kjS5^DJkB!URqi!IcSji9}C&d zAIF*1)prMA_i(|N>?YC4{BS6-I2CIQN3xi*#wf0)MW4`QR$^K=()=~4B&cpNy|Gy_ zmp|^4N-moqy6$UoiQnIu9u!I^xdYpM^1Q9R@Gzq4`q6`21tzJ5m;5F+{N1{7{UFj2 z#zB1jIZC)a+fUmH1DZ%=G*bQ;taNC1#Jfa#i}Zvt$zajH=w?5MGMqjcHQ)IX?Tzy> zPJ|z$rF8h?!Ie+q5%-$#G%lX9t7X#yVYyD`WL6||nM_NG9qkYN#-3``SmV^rFc7&i z1{fX%kH#;c_2W zr=a}<>eqj|zWm0AbeXZd)%zwdj9Z=Jv-z&Sv-j9n%X|og5m68v6x!_da}ZwKwVpgp zw9#8NkIHZn&`YgZw)qnE>9{(!$NmT&(cQC@utLGM4`{q92gG{4wKlk*!xgVvQ}ANg zj}5lED}8qb{OqkiV;cJYX7(;V=o5y&l6-xGknr!iRNbH@%ZAjudLakA$?{lq-G}aj zT0}#bABoR?j5%Gp17VOVO`C>BVV@6kA-{weeb+V}lfB;FoZl{;@2fcS(DqjMVTKiM z#hN^QPAR9!AFG4*^fPvM6z53SfyiWg2u(Mn-+Z5N7`D*KQTaSq&usn=Wp5eRR?vQn z2KNHRrMSCOibD&fXmKmDZXHTxVV&i{rl_!wP^%C3!nH{)|cY66hoPC$#z|g>O5(-Bf z23AqAcgt;kDDjss`TDaKho8d02TcmLyE9lLdq_!)u&dv6PK(eIg9oV$mWhE0dnq(d zt*HjwSuaUim_y zpXkZ4S>M6%IS0>NtoOD`wYuM_GuVD8*pydovRkR)XJeG9Lb*=+&7bejgx>tYd7Bph zju$`Dj?6CMaw$i^`*$x%Tn6BKSer#7ran|*i9+_#2+`6T+;nOQ;lmMi8_d_JV;AH7Q(hV>HzgXuh?wZi?Ld?0c5 z058$rI6Y=bH;cj4>Bej4!IWf&M87QEU>%B-7)(w+Q2WyWb<3XVPX-ANjWHoW3kZh>fq3fNg%c4 z$e!<@FNFTS0#u;CTiU1qyKU-Me))b#ikbnjSziQC5G|JVrGIJ)~8Od$k z+lj$*J`1nw{;uB}e4j_1=rkS=^=h9(Fh?n?Ye7_`dF; zMQjLf<1%b>zwahRl?-de2Ko6*6??j)w^swBeQXvSwa8hJW&hzFN{$rJ90MUFVRKfT zu_UnCXA=BR5f)$Tp3y_$q0v-gUl=^^vAiT(q)V2&1dY_)#CZ3Wq7%ZDUq4v*BAQ2= zYLjUY%UtAnNoK#de2mtYqXV>k{bmv)6nFvO90xD_)Lu4qK~pxU@QdsMs+*9JdmJcD zr-52BJ!6(XGg{4XF;&Bb_Owe%`@n&u2V~D?-9i%M2?XOtsi9TN%hgY#^UDj2#tg{v|{n@=H=PeB1gpltU$V zk6Nz3VkTc(e3uZ%U7ajRcBQSiE`VALdVSgiGG6MoidA~GlbyD^kbp?hjogcKe&I(M zU`Mo_U|?xhY96%KW%Dz~XMXW_C3$fETzEd-cqmt?)9vAQ@C<(O*AdJv^Ki?3R>bgS z{WyR^T> zYYFksI;SZI_H6weX01Hbr(NsdvpfTa=tsR?2IyGxMQ;nWzMZdjEXX82Q*w@VC~B&b zbAY0tdAdRSMd<}h!v({Vm#6*h3(NG~GT{NSH#dZ2t2V*|2iGnaRYqRpxq2v+bTm4} z8%$lkr%48_ZkfypQVQpfGeJL~KQq;iHr>x3;NhmlgNT{OQRc>(j#vao;9Z*}_$bC#fUd{ds)IUAX=VBb1xQ`b#c zcN0itAL2A!J;8Il?+afDkGhC7x-%P~Im;wcBa6l07Yh6=HLE`R`4uGM6xTpct_6$S z0z1ICTiByjGbLXZ+GfXSa#Rv9(*%+TC=8cfUE(`8s#l%RajKdiZ9O5Gk!U( z*xDGEGJVR6k*hN;=lY5YgRj5-vh~v9Nhz?zFjA_&C9 zYw)Mm=hGnwBfg>K@JsrCITLS>a6;>?W;h#7PR?F>X4}|TX0ePkSxPyobW6$BzRE{; z0ZNlr7tT&#=i!_dR^?j9=Xfs4_y^>SU5)YJIIWP$Avr*0&vvKErlqw-1yuK9qTb-- zKwRB;wdy620@aImV?|fyX_OvF-xg^jZIo>9U*`=dD@2 zGx8VNKQ^ED(_W9|$VKOtty>5L*X69QK4*C1WX?F*M44v3$)$ri)P!t2_dAvQ)4K-7V z|I?~}WKq6P3!6n2Axi#^lKI%@V&^uJAK+I#vXp3oAM3yk_@eu%Sy^rN@{C4J`$KB3P|H z@ij6mjfP=Lu-6}_dPOkj30YQpAFSYYMaCYg!I`u8{m~+jSrTC%tmV{CYRj>vij-LS1>F4pA-pFMj z4;NYY`W$LK8x?qNlrHxNf^$9>Kj5#)yk#OuBi=LXrTVY?pH%VRB@&pNMi_e$y;|EI z|E`~=l1N2d5@aXjn3;VcVeog&cjJRDV497#)abT=Jz}>T7|dXe%1J84#|KX-k}gD2 zwfBB4wHXc3I_=tj0qtS0aZc)?ot@B&{EXbqh@|s34ZfVDP#f=mDDW1K$YdqQ-fLG) z$Q{MqB56B5I{)!4?|P=M|3NMFfJjeDD{#3BF9L$W|MoljCXO85T8DL)D9^T6M|Zy; zQl$|yNC-0Lsg|zJxeh7t>YSa=l8WR;b0764?BBbn`H0G3#i$UspM$r(cP))jkP?4x zlJF+n^X4GR~$le);z z2_kH=i6gNMCb)W4=Ug~-P8lenCWQU!at}A1l4Z1v%P=w#HN;}=>S~hw6U#XrAv#M3 zb`;Gk54(qlGS!Q-uS3sr+0yoVi#SLNKlTjy*klJpZ?>gEsiYM77{t4Y>*zzTpC!pf z&VDmMA&Aw=8hrFMBqjvJc3_e#&4OGRD=b{b-mOXX)yo}V7!!uqgd+tXd4HSCYULx8 zrf!|Ulae3*9uFEQp_bt8B?{Lusf-LrGn*InSieb%%NBPhTHlXeY+$V$(G#$yI`AS< zO7#;9xtvHK80f(P}7!2ZwaQg7o&Qs1K|_2hj}SML+$ zDN#$u1?*G2h61fR0iJv^pw7Q@HdyFMPY|RtKnMQpSG(A1ul6ro-)mG0=um;mtrCJe zpPpi{2Kvs|dggygQqmU4mI89#%f_+dX6P+vu{O(q(ZPTEKFY`ABK}d&c97ltY)_HVFQ`9KcFCE+Ou38CGN3O7h1<&w*Bt9>p|Y>6bEZs5r4h0`+a^i~x** zeB^ur5AUwKrcKPmelnBWY)LMY5aUf5ZR|1!UI$Z5o}B$<&Fs4na@I{V{_PZm%D^Jy z&W6EZvzuoWts4qEvSbfuO|y~JqVv4LL3|P*nRR{7{xEZaM>chMvTi{%6-j z4-@Z*TxRAh0@>b9Ftel(s%~BJk%k@&47PUqPLL4ehpX3^Y`vZEh)Cl1K~OrO zBZ_;@z?&hgw~T7t?Rb~ZCw7`bxf{p*n)jkMp*ML46#lMz*(~&|-9N}=Fjp8to{ENE zsJr2!QpWbR&Twu-J50%zqe@6~hFqpDis$}7C-3_7Y5aUWbdU-uv?fd=?dQNU3)z{O z(U5?R#ivlyEjH1%nWA;C`CrROB$D9x2HNr3e!{@8K|;76C8b6qm@D7<+ExmD*f4Cw zpvr^HAo*o95Y|NEBmtO}cyfHRKg8R+PUr!R;)X+x^P35y{RCCmP6{0$9F5Px6uX(? z+tB**+rD2^DMxRa-YA9g=77lxj_91ADT9xZahZh@_ zYcH%I9cS1o`I!r}e=n~vCCUd$-sXZOw)}W0Qr~P`qkyBJiPYj04Zt8W++&P^2Ys|@`(T|;tbNMh-E)_CqPmb6RpmDS8v)k zqL)OQ`A94|R01o4=nAD%@noccGKq%t_E>0#NZ%8G(!tk^g9OD2qh3T|I3U0l@U(H% z*!^q!_T`lDOj=Fw`fu?z&?77#la}-HvO;9N@XDH!x!Q)We?0{B){+hX?&eN+5rf{? zt&Z=n_`M`u@xK)pJj-`)CIx8{TMvds6Yz|2!`@CwugtG9A+5H;=+4sdQ2HfXU4cJW zdktHo{YsMVN%7vHs2|*$+Tz=OoD6$Ecg_9^zcFtv@7l$XJguqo%dj#I=|Y1LD}9=L zCsDaOK};TiQiLBz6uz%tU|>i4K=6+}ufN8Tw$`{Jg*Wwv&7! z>ih+DQic`UhR|NjFa5Ih7EZ;Z+j@)5bZVAD_`LI)q<3Dop~-`kpUjR6^7z~>XYjKu`~_4v$e-NjfX6ZLm3{?9hHYwK{~1qwL}mxj7RAP;oqE#QKjK^lFnCU z3GcaNn^Gbnm_uGDdUUgT@^wvH@ZjGmjV$g=7Hm_(KnEr|?%|^G*8Ewtt0^);K~@|l zHHBOxU4JH+FFRZxljIH!gCWO-oJ?wzHYhF6Yky^LgB}(d_Z_qAGRxYu+-7qyAE%eT zz283{e;q}{VhtpR2(eW!2)N7s>fwp6U?8Q>UkA~mijMixfg8dRxMXUrkg_S-@akh< zq#!~Y$1l@d%lZP3qd!LjNP3x>j_qo{(jQ4Amy%HNg{`c~_pU?65@xJ0kkP)T2 zx<8EzYvuJ_hv7M}u;yw6S1j+*2sCP$umIn%J1K7 z6?xt%ti`v4NZH6F199Sf4bn_bSj2%%M+F0LVafBoM+2SLaQf$qRj(nvq@*m+ehu6D zty3Z5Ri{@OOxItNTBa&)Wx{Q`mb!D3oq&NFoD?1vrhYi&PcP;5_%&=n%8QHV?G5)& zga9DRd(497^U8u|IM|T~+bgGk&K_ln!!+YkakVjA#Wtp?S{1{DFGNTon}CeD#qLQyWM9~Ftz zqOVoir;Bwvf{z8kGc6;mcc3I%FJH&roo+UD7I{bvJc_jJSR!&6?s

EKCIx6rcET_M~jE6Y93--OwK9O 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

H@BY(DsVhQy(?lcwI%AB60h-wtLo-`!N zq62l=H`>;sCNu&=N747`X7v{D5V4W5qqA7~N1l0qJ6a>)#A8UGW5Kx|7$2SmjEd691RDA?pr0m zuIRr?6I}*3Ln6kWV!}Ik-!+ovE`d-+o{Z2;gh^XiGh_BxzV6$W3}=7ejSVU@dHy|4 zL6i7WseqwBJ$NdDlzEp`!QvFU#~DGO^N|vc1XS?;N)xm@Kk50M#9y;r^06AFW774x zaac{b7AJAc5WBd+)Hxna=l3k)nC+ z%2>yZ+BjBOltr?0h z7qV=Ssn^qFgY?HariNS|sqKZBT>g)kg_bL@=A}Y`GZVr0Xs_X(-(lH4cwu&tk2R%q zjY(mYYNUEM*T<@y&$CQiwqmFQ-!j9>ajv3+1v7kY^?lA4C}IRsJI{mt4y_P9rpSr! zNSfoKRYejRCw{QBbbdVh(BE5)DscJokC&L;=@+$Sw&68VjvOI(c5Z`Kwe(81(+169 z1bA-t36Z;0AkCi-VcU-HMn1)l(%2kz=IbZ2()dxN(RjyY5~sGBrODpfJH1WNzx}0^ zqDU7}2UYHcDnxg!L1Bf78i5e|o2=JDUJgYD^ zK{~loOr;LrokENnh~OI+U2wh;kK0V3&1zhkUtG!N&`MOQfMCc8pB2axH~; z!?D`Ao}4;j;YmNolR06s;?EB`f>y)vyGg6Nn7qZvk2VjG4%3kXzeeflit=lp3yjAY z1U%lj+ZZ(wy_WBQ1?8DZCQ}!V-ga|(RaWkP#YgqI)a4!P0}g!clEv1E>YQR#Yo_od zCmyRgeNOG~wO`FyA>?>?>?N-$`5v$m&bs$RDARc8!r%BQ%=_ej|i7SA?5~zD5n_Ivz0FPnn7gx|Os%5lMtVoNULs zHMwa%+AAjDGnbc^7Hv!ja1xWDG|v-rUy-a+JGeZ52eu@^D zrPUSe#fN+k$*r)cfak{s{=;-4iV=DaZ ztKG%?txK+bG7#n~FH{4*G3Bh#&^BTIvrV zGMu`DzPLqnK4az|a4IQ-TEyaAq~p-(Q-GS6c9>d}(D2phg?An;EW3QTudbbzy;nU;2^4^dC-+a=_Is5PF7v!8MV$CJB9-X7pV@W5DHa?rK4pP8829f&yci9g<$Zk zMOiQNfePMLnLT)FZ+!y1DjEF&-kY#bEpkG&Pe_Kl_xdSBKemhW34vP9_`b0idJQ72O*OLLyos|cK@exX_&gDiRdrR>fVX8;JK80NX z7!tfdznMdcXva(hJCjDkLcgIxNPCkZ`pg(SPZdqM1Yv_bj zugWIw$8?m+Uj&&CcDS$*rFqJUTmSkhXjm~>`_bY2 z2fQVfB+quU^ajt}5rCBa&b{Uwmas7#~PV=Xp9;VemXZirO*$ zxx%&B7||_O@SBzvJ3Vd?X7DFm=6HH>9b})6QP2zifN1PYgY@(*$;hcj&RbgS#Wkf@ zN?W*6DnASa4e;DK1R8nd0Frm%0O&rI+%!vW)r{G@jM|eUq zDa>R2MLKtf=?t!N%@Y(f&Yzln31xg)Od7=05vD3SJmLef#2}re@CLbd3g0Te7K?2R zJKPXSvy}5|c59kzmdeH1#XnI?Ymq=3%e;gRZC zC+Q;D3lgtNTV4DeiLqRI6B~4jT6vo86vaZ>o=c8Lv83h5@|z(Py?#(j)J-=-6h+Z6 zgr4$~oBZQU{_(0)XBU|k4K1ywR$-@RZXp4N&5`k?q$#|$hV2s}^CpCk6nJo3&~JzPudqprB$;fErJ-rjC#FsrN^_(0)*Uk#D<@6| z!)eu!muiv89Dc4v?qoxu>1JprzO{1yDpgA9%|Jj#9ASpcleHF!s!;rRh?r*f$~IVr zg^(TVyCMTVjYs$JOag{08zJW(jM-V-D?(H%Sw!)axs+@M^Bh3-^Mne+Q>{*GuT*UW z{4W(qj0ZJ#1->|~_1TvIjmWPX>(*)!5|=MD)}K0RtVLphGG>0Hz1=nS2C%^7&+u^Mb-+C5>OLSO76_cE_TnDv9F0Oz*_Lh@JRRDPBAbwBX$0 zqJBaNhrL{3bt^wLi5!ji$!!?r*n7`)UxFqmDz_jJLn`U_v$s5`8~3X0p>LRux!zUl zFb!L-`P;L0km!CA`bDc`Q(A(r_tAKOHBGj<-p5qz_gj$U=UPX*GZZX}BEPq7I;;d- z35;b=)=+9(baaLv*O-{&0|K(6^pyBv2k?9lIkW0N7%1;q7FFs0T!se$OV%=4s;VR( zHS@0ZZZ6Lj9=!^+e7@-SVyRF(ge6q)Fn8a5W#Q^*0MiO%rM0qq@hnE1=x6;Vd6M&s zN55NTxKeC=wPAz2{-*T0c%qJO482yz118@DuoMn7R}eWkxTGCbTj6EE+PJ0IBtL#a z0MQ(X%d5`#G6@AM-gc@xh#Q)V?c;kIzR{@l`m9Ph8uoP-ZkQonXK0>bbB=BB0|Oof zN_Pace0b2->M4@8IFrl)vCPzuoyJP%{MlbMBR|TpN>dYucc}T(BrM6sk)WvnHw;X3 zYsemqstImUZs%v^!j&s*jRumq*$e47*^LEFuZ{kECX)SoLe4oK)vV0 z36HkhqlaNBE_9p^+u_REf%VoRmJs%~jg4&ercWMyBcA zon@XfTdGvs1*>^7%ww^kC-Q^jo$tJ?Q$^Hl=f;AsLHamPA8!Sm;&iB%)x|louDM8&&Im43iQt+YR+?+opXApcB;!2eiOP}8G~szT=wZ$-t7lY(?&A#C z-$&#y2HVrQaa3gLRdPo|cnF=4v&LhN0~CX5nBZR1zk{A7ywi5pUi)}Y!A+XEJ{Ay4 z43~QWDusOfzfeP-pS1!$D0locU_SA2H%KiBM{b@`m9%*yX_Ech8|+J{YyT@sFL>0- zS_Yqn6uuX}*cZRW%7K~gAUxJDY!45-|L-6J`tM!(J*?T9tQdPHRs`RzS|vv_Wji+Z zejLu(=ds@r&8g84z$s(NFqn++4jWf@(v$wd7bd?WH2<^V*;bqJrp%pQ9u8Wl6y)F-* zCkBBq8SA@6ZS_b{ok{n{@SM%@Z5Al`3^$87bQJm?5&zDoZ-HnaXIYJ^mEr0U4PrV1 zEre7b^|=D`T7j>6B`8$KkdN)V$=L{p1o2WFo}XO|YK`s%0d1n``q8;6af)4kKCdCPEB*)gi*p3NeuGzmSDVdk6UVd%YL> z;QHQc=KcQjLx;&W#*u4!{{U190kRDbiD%nP#sDF=X0-VGQw~U2LZL8tp4(m2`Gj@; zC_7o8x}=Zms~im{T}=Ntt$Og47yn8OMrOt&uNq6sm^h;zuiJH11RKHT7C{^ubC!x< zT+dPI-t(X?&q6yIqhJA~|I<%0)qKT2IWmqCmu{NPejHJ*o(lBMj%1HZ)>KZ#M5;6`u;{3+|xi9)Qz1#zN~5Nb$z;_ zwv)>FvqY{8fgM}^zmuXHB3D+Jz^WUoY3kx9&wn_{TSG{uC4_yAsj9w&m+HrVb{s`- z{9D%l(tT##d)rLnaWKy=3S@uHk{xb0uchYWXM4>?{glgZt9B(T_+CmmAfS7*1yee2 z*a2g#a0nwYe2@xyoov$l424a)HTHf0TD?TWUc#`@i6M%pcUho}&-AvZC}ch~nz7B>tv^gX!yZ#6lVlV$}1Vju6FPJoVR%wH35-k9)BZ zXnV~E_Mm=_y=&~OR1>~o&&f%bOvwAM%t`ceyr_T7arcQ7{57pfWWM13%?qW^xHM`45PZ`m}54K-KNTQ+@U(w_n& zhvaBv(r%~QCNVZ{EBJBNNKHqcw7BCe` zo}#vGR$nyk2Q_P)bP^Waa}50BM^kT1*iJWITZP-<9zG>bEw#H^m5F<%%hTz(ALGY! z7q!NNb-)Pj0QKlTJ*t#k_HOzUBLg}m)x7Q}zVC^-FOpWqg{Bx$d<#`caYEo5vK?2M zaD%zsmXiyVI>hI9b2e%lekEvsOgU%^?#hlIlSjg<>)cqs;67M`X?EZX? zrYm5^(w~!NuB~20zfx#@dm{)F3`%>E0FV5mHSq_GO>MJ5B%XsFO$z(Mdp@4JA_0GZ zv%6luNy7mKNWe6pxG;FXaV*3zSybUZg0)o|0BllmIwKzj?L^3Q6+>{moeUy{HGAZW zSx&eHkfK_6;S{EeI%e(x8<`S~Oo|Z*6Gh>5f|J%_2#ns`QoKySFjKr)B%dydu`@#q z^my?xg(xi#T3IuQn(hvaM1DBgLCBPHV7}FXHBJ`W8I;Uj0RR&-}xV#VW_>S*q)` zQV9~*zs~h(I$`wnpQr`C4gf~gz4(4J$=>#TxF$61^z_Sf zQ2UD6&L!dfBaH2tR}VYvE_C%w4oq6zEQSzJQ2nSDKT^9uKTK>h?l&^B0p(V0DIIIM zAE8zES+Cocuf5e5KnqYnOB=*q4?xgmeBwBKLIIHc2rN9mp8YY4PH@0+Fbg49`R>6O)^$OSugG;1n*vJI(YxP7wZk@msC1841 zcMn-=kWE-H*UAO}P#Tdcp&Sq3JSIcJ*jbEid}mS%*C7MLjZ^yq*8 z=l1A2`dYmfKIFAl2s|udr;F}bCDjVQ6aaU)Tc$kmiUc2|)w#EovU zW5Bip^-H|k&*K50c`iMgM!~-f_Lt!W96!dYT%y(!FkjLxqy1yZmhFgci`U znkD0BLph{^N%?*ZViMZF0^`uKgOMPn@i3E-{A+q~#09e7_`J@LyUeQLiMd~(CIOd! z7U9S08#hpNy$oi@ApKvF$Fljg3#RPPx&EQ@t5TN>Mi0^r#dFQ6p$Hu2!)NU)f<;*W zzMrqwc8HiRCQ7aTM1A99Kc?Z@U%y44za&eXU%BxIzP2g?>xm8|>9Qx|4ES)Tzpm*n z`tE0oX%SbR?wV8Xt)Z>0LJ(nh2%_)kBZR<6igMuI<>zhWMnbTAyEM!aT4(rSTwLSD zT$*#`%2`?kW2#Sb<>`7FlEAHwWHkw!R56N@sxo6HX}`0dLL;w!-!y-`B%GgE$IB=LfL0!HV`&W*cI;Abkg z9Pv9<964>LMOC(BNuQ?OX8D^@)2filW#3CdozQv$ zW#t?TslTiVjZwBgF;~?q^lz_iy7iJD7r01~67Jvaq3Xcw5K1NvOS8=6hRfF+S z;N|T_uX=t%^+m%)O+i6H!?45m%AqyeOWSB6ac(5(R85_x(3Fy}b8->_HvRO)_xKGC z*Nst;*l)QhDnEbROCC~c$wecv!3|ISWJusxnz`)l;Nny^GL<~I8! ziv9$T#*1<9&3-bghYlbhbmSqaFzNQ0^CSNyRn0nSqx)eUCVrim$zjS+_>=D#X_+A4 zIjRi#mZQC|Yh`B#rWOs9nWu%Uu>u!|!34oJMN6M39>`jPj@e*5z*loTDD#aa=Mb2D`aGj9Tiy%@E); zl$xKx3HIFe`WEP;-@0y*{x-jfFC=1gc)}T=km4m<)NVwAkjQ|7c`Hba60TiMgDKTV zt@<1ZkT*JNEqQ{15CmLJYtt9=Ux$t`{y^uI#DUSD-a@KseAkTtqwLYurjJvH*plUJ zWYwx&rKRB>6H?Wr&aIp(QC@6vC&qmhkYs6b<-A{J>Tj}xzJ7IrkRpS>*K(EbyHTs_ zND#UKthK#K6GJdg2lqfKnoRe4QQrKAD zQo3D#r;nff{lM-8<=I}C_s{bmjS)1G%uJccOSH?pV<%S;mBtB@jHX`z@LmFNa{=0E z3*Lk2XrMqr0((HM|NdMrGH6VBs@VT3Sv?Q{<3y)OH_Q8!5|_~Tvps}~gmjsobcKq9 zg>kZ^VtP6;-n!P^+fL%Xz)KAhtP+KZDtoW|hgPoxD@dVljtYHVuR{$u6u{puL$xEI*#{xDBh*W>n!0mFSiU{5 zAT%+4(_;rGL=f@_Y^wBxz6m*ouf`&gMC2SeibM(B5C2sPc7y?YF9>|cPsW*A6S$dZ z^mu=-HXF_G&S$;_dM&65vDzm{kjIV2IB3928mo%UcIpE9aqR}lse(1|$r{%L)fJb~ zS~%`)z8Q$4`i7tj7H7V5n76{soivUz#e>l8ukO7q`#xZu5JC(RV_Y4!?Xsc9EH$eB zV9D!7{xWTfIU1z8J-i`4IwcCZ^2?p?o>k% zy%99zrg5s(+TL0Yf!qdMe%2^L9^sWdh%cg|C>ki}zwu!Njm=1c_pElPxx--!(0~5@ z2qe2oP7VbIS{4A5n-D8p)Y?m*|H}K{deW%Dc_MfsdLns#nk$iOz(HH!6gPVZz1k3k z#Q5=MVmlRi%<@DbjlLb;Be%9#O#QOqAil~$a=`ER*ah$3VE#+z4;@iE>*)-Qk5L(L`U2RQhT3=~IN_M|`9gpbI+Doo=~SV&s^Vyt_c z&^=RmXxrt->M0pEN1%3fc8Nl5<@6Qtiuu)BTxxw z%2OWn`Bcv_PC|*Tw1y6iU3C$9*^>&+y98gDLO9qauu?oPdlzDXV&?iuO`){wxNz8= z<_{WQlII_0_X@?I(tA3*&&gm6O9?p`HJ;*pwXL$M{F=sPtH)qTWtrTTlS|@hF{TB1 z|LV2}G)e9Om8Fvcf}bRc3-F^!5$kvg0a<%Tzdq^5?5&WIl~_v4ebBobUThybVASW8 zGsC%}6K_=1|IjD)gjpr7zF!*)YNarO-*r<~2?UiWqLdTFY)>5-OK`El60eIFn+>78 zUs)9u!H(B%q3sgS83X0Sgq5ouz(H5CpEwc^ z)i<7%hKj&G$*wyb#}OnLncv&}n$LLYx^M%Oe1y<`$FxTnfoQeH@ZlmEfo|F=qr-1A zzjYps7Ym#qjF=+Mh!UV~yY>K+SD_gU3MJ*B#tEKpB3 z5>+u5XQCCu-fr(JhDq;|)SGog{S8zz_@&P-YmtBboE)N;-KqLkgu?nbzH@#wX+9kNTB$(sP$V^KpKJAPa20{GRK#iOJ<%pJIux_@yIR)yu!Yx7d_A!NmsriTV zjS=h~o17_XOu#^;o6JW=`&JpEfnf0nh2D2Xpo@e+Fz1;h*Vo_en=% zQ5P#RD6Itjb?|>2ro158^cu#Thw>zof^UMt?RA;>9hEK6H?$jClc1ZUz#$s3nQdPe zUUxjL!7xh;+(8T&;vyFxXW;W-M z)r5#nzn+U#z*FK9Cb4Ib&}6Q$Q2v@QZVt@gANL!hUgJXbeap)otX|ku9yLtsP}m=` zPQ?3#b}1uCDx6Ti?aB+bWV z)SiOW;edJo9DC%s(Wxw@R(g1rpZkcF8X*GqJITk_ExHh6hZ_(f2Jy4*?vZFO?SPbb&JHZ z)W)Nwt4fuR6fZF=N1-tt4p96o)yfWUx^v4Xi__S16DL|#DyYsIeu7CYd1Wi)`dwps z4lzwc8R!aZN?WcsVQ%|2=CGY0!9-AEf_nvDNIY$t5;(`~1UBOC%_bwy^SuS;h;Kr0 zUpv%0W`W{uMx$W9Q52Hi`t6D5v!I~&HOYY?^to-uFQ36jR1kbh zfF<6e>>UF7U03yI@m|mn_elw-(Qio>eKo$E^l8#Sy#p0d@Md0F!8@gz%sk*Ha42pQ z9w*kSrm2DW`o?}+R8%$vq^Y&;-5JNJxOWN>hh`hwm+C!Bs*J=h*vU#V8a;c-I(pXK z+1bQ94p@TCXxB&dbR^Pe9t@0`ENq53^|xB?8X~wxt@Ca?l6hR;Q@~(j8JQrf1_>X? zTOp-(^su#^8KSgyqTrD`c8HY`R;D=%U37>CX(Cs!)gh~?=&!w{ULWqZo8Eusjp`Qx zhrT}?fIao`>>z?bzm)|g^uwP^Gyu=sj`FzckKtW;RNsLu>=qP3YA?vW&{k2tsE-!M za?v!_I)?Q$Hr@4-u$!D#Uji%Hpp;PLf%U+pLIM3FP6$)yy%ruPYK4}a9cr!;13&yw zC<01Zf#@?DFp(J06E!%r{m-hkT?N6<_UmJ5bsn*Nl3C7uF&yX2-(TDB@v1!b2Tbj) z>K-^#y~(Y^6lDWuD;d<4a}pX>J$O0wI}?H-@r4UX`Q0Yx4L#LSsXl~T^eC4_@0Ho)I<10wmHo?+!Ehdi>cO#!~JBVVa#dV(66)qAn zbGhDEv*2|--ELK9V7l1!%o|gz;GeW@*Dryi+S08Qf~D7;nVIE5AVS z-_LjR?2QwL*gt3HL)qkS`TL#Exf^nxh{dTh8_XYg-Vi7Erj&L!KS|_eVD0e?(Wcl; z+~Tj8az+z^%Z`cZDw1JSG;Q@7ajJH@q--|U(;i@-YlWne})C|Pqo{`jw zB_>^$SANCnl<}Fd6XbakJicGYb{oit?^ZoYpM;tQUtN24k?)^IlzoS4M)-JyB}0p8 z?di*&>ZaPv#()>QW~rq5dBCx_vnDxnr}Tizv^TzqNSxEOVhfo+i5GV1$LyfRr8Y-} zq(F1T0t5`MCYb^HroVQs8LGm0YO^&hD{)3uEiHO6g(0E>ZxsTU0wo7k5k)Pem;2=V)2C^W)+C77Ie zP>U16(X)QL@YE{Ug&RnN4GfLZtn0$+SpAR!{4dc|7?E9)m$!0q7!I(WJ4LOMmtNXp&; z0uaS|9(Si&9XsaVHC^v~f2lxy|Io9Z&>Mcfcm-(s%oA&uE8ZWlnw_|+Sh@;m<{h&2 zoWi6&3ckBx%FXg(HKtLUuuT&X^H7|AZyKirPF(ph9r^t+7H+~*x0*}oEMmd{%;mCi z>bik%65D^>MJ<-&g)ru({-bhY=Ow-MV?z)>(ya=? zlofv9M4I=A&DjK$IFH$vMVyN*Tr0tp(5`48BTC2{%3v*X!+GMcl zI2}GD^*d#z#^jyGIT1Tu5V`$$HFsDFVmd!UI{QkYXow#fUlJ7DJ&84ENauI#Id;}R zjSK16?HYgsXt%C`byX5>P?Q;ZwuNd6`OI*0Ovk$&%QTv7)Y2MUVPW0{# z;~cTx=^-dV02Ya4b#?fS`%o6`V+Fq5U%#77k+HhwebJgKLf`31#*L^sj0LIw8NK1FC6E7RzI;g&X2dM4zvszWg+sP;n%66kB4KdN@Q61u#Wovgi#XbBL)oBmnXBt4&hvPSA-o)oA zmnUoO&kz!7QsH~BBj*aSX8Y-k%<_Z0?K@8)h9P zH0QJB-)ncX97Jt{d^80r>wc%M5fDIb!!P20_(XgX$KHMeo=6sfR6su^krbfc6&IHu z-$t#GSD1ailAnCA?d*?spAW5ur88=I7;PT6K*2xURzv5FrY(o*JJ?yWB4==Q8gReW z!{@+}Qzt)CgDT%cLgzQ7+{nYXa0-zo;Jo{$xPD8ks{XtyRCmr&C1M&YL6(2VyogVb zG4;WpVCe_BQ><*Por1?tihZhgcEn^=VhBF^NOI1VySua}O^S(NN{xyKFCk4ISD?Z9 zqN?-mF!EiddFK#f=fSf27w)UC6dZVW6+v6G!R`QmdK>CpVCBMx?>k}WKd2MmgwQk< zirps^0IVFxK7rj`XN@ceL-yhQ8laB~P&ozBZm%mNeH9qh>(n5fh{}Czz+3vJM^U2d zdT#~Qh?*s!JK$xsPD6JL=&~nK@JOtm>x2?}wF5lz3ztiP<8te_N=v#rWR)h@l6;j4 zrS?Rvw@|ZiNnGk9C0-N+d?cYYSNQgHSk@<#y(q?i?)#QyPUUlVHoKajLfUR|(`L+l zSOVcF27?~cZ%o|F6;t5tG4}~5ybSA@FYoTKo;qy>4}lqUb+tg;cg1{T9N^1ns0BDD0#oHjrWF)`t*qy?yLz0(`p-boG_i$xrWL^rhC zaO~H$_tuixy&K&o1Zd3T5TlWYY>-gH4X0**_APz-(WW$|!dess@ zN<%te@3rRvkvHzXcUukLAj91m4fNkj6#8H^TW9%4yRA(1AexH`zFNoqHu?=}Un#2k z=**UTboSEAv;WjTALAGLu{{dgIdWE3^!@XUhc3Zz|xBrPQs?;8RUG zft3MNdF_+`P9m2-67A@tn)-YdT~3DJb5xaxx5&{Hg4B^6s$B{6Oe#*#+5Fj}*)n!S zo;CfCi1&AxUl;p)U=g7M`S{rYmbjh^^B6GtYs?+#NJVa5?q=dldj4C@S)#;zEnHfv{-#mgifTCgx;{nx>OXMLq)g(f%X39n=i&Nw} zQBeo-FyqBsvmNdI!yQbQex}V%Q#4sK{bPeEr{uXBRl~mYO;ey6*W)6GVK&C#aC@jV8~t%WYJ_7o+9_mIL4{&|~wN z%IeY+2;z8RI4YY9!%qxuT=ucABL<>hwdE!@9g}+)_m?B8*qxLLhMJd_Gue2wop=f% zww-9h-3&9M*dc^_{M0q_8~AQLfWo*sm}<%Dhx|s0g{Qe>=5T1+_va=`Bxib~9Ix@~ z&6@2=W}a*6qsnt0T06`0XiuJm$9&^zU@;o}+$TqTS^C3WzVp0mVtCT*;5tk3N*Vd# z>6&q$H^J=GF^414TaQQ#j3^`iRkcPJvF)P{{jd~m7#K*LP!fn#vBNNKGoPO2i`?%R z7hz94bAA;?f1u%)Wd6(i!W?UNz0J09y1w}k7DnjsBYv!M2K=3sNTG-&n%s`8)^lh& z!<-S7Q0ZEpFcj(8z^o>v??NNjGaQAB-a!noF4g-r_KgR`WyG}FN zpm!K#ia%S23*?{Qlk$$X38xw9Pwt;<+@7{sOlbG+-+^1JuRK1Qi3^CKmTGyn-1)#3 zLf~gmzBmYhoB{&7;}d_RN>K=$&CtX=Pk#({Q5kIwS#c9wXW}&#Nm9zk2#S66pc`$B zz&YwSX=T?y$Qb^lb$rO1eyc7+3r;M+x43DKk;E0JUtq#f z9B6j=!oI%@`acQ+_e=I}9rd_4D?%|670DFMfE}%x{{n_0JJ{7mOmfoiIuE|Y%a+J^ zJpsiua~{089Gi;{BjwqhLom52TM1j=e*9mSwP$4R^rjARA{CW@Bcb(|neZup%;?yt z*F|LB2x4p^swc9uIaV=twzfUh3S>}r?a6kOI!IPmMvS=$A&n$X4cN+ZtEI4ArsnuE#`Hz5ww3i2vAc8zXh7FO~GNP}?0@PjLY ze~@1Rvt_cCUHfmjFfp+bMWI)JX91YFgfPPt3H`GEMv(NwI^5C0h3i>z1pBfxw0IIx ztP56O1(7q>4;CCVhTY)RWlIV-!`mx(#4Z7v$zf9AHv@#nz{xanxUurHL z(-COXCO@B9_RB8?YrW&f&x6ABC61%c8nfU9&86^Ll%(L&@wAIaqE|M!2pPqXRP!aF zKOIr+q~1HGw<7w%=>% znZrWscqoXh=u2P3`K;zO4Uc;~^z($$8(+Sz%b=iF%eL`@Z(_FTv8KB6E!Jw3b}g1#<#bK6mixjGHSR76rDiqifOA#n8mV30t%R3J+7itSF45Y*~8e!#2^wb+;hi;xH~D=qGlF42Q9?$HXU}X;|Tq3K}w3 zm7udoX zA?_f7RL^NmZA1~$501lGk*qduMElo2#1hma;o^LJb?hb8;pV*RlEy6ZaJNa1eWL;k zIDg=5ChF@M>F(<^=jRE+L94oYog*|mX7VWpxl)qfNj-ke7S>tWN?e?jHJ=z&=9wqk0jOb5 z!soj13I`{&mc~%^-SEut!VuM8?`?%&0a0UgBe$~R!>?)MzO12@9E6QM4^atL49jj> zFI(5HIgM_7WU1#>L-MP$L%3~E2J3_oH1$1BWkrdY36>J<`J(tpx!?C@k{Mm_A#6&9 z>NO+;$(P5L8b~G>YzIW)Y(kJNh*eSu2C^qIW4$UbOSQ99kR_J*@>*%U)aR*PgnIJe z8`&;Pjle5_==2HhX!$0%_TSxNQ@jhzCi3zcM`wv%U9O1HPNI~!$h7()|Ec8N?#i8! z61q(8LZxf(7Unx8ri?Wi25h#)eSpRZWs=0mf@`UGU08h%B_bKV7;JG3WjgNC_25ghnu# zlMrdHj&rf}S8Rb(4x@~HilqsaBhNo2n*S<-($lk^in)iWhjp@ME+>%af$9?u6wEY`?<;g?n9_Pu>Jb}5 z>4T$428IX$G)b}H9nw%83+_Vlkp@rPRS{jum}&jK$3=-d@JMwoZe zbwqW7rbHHI@g@@U2jU(!>M*V%R?3l`7A4MAO4cGK-b5v`7|*el8AL%$I+uAQJANe%$%@B_VT_9Pmv2m;f~1`@df`;zIWR1B_Fs~->)44-0X(2KeYQGN-wYv`54^IE1eByp-@-hLgs%pLbqQmp$`twZQn;~ zcQ`Q!XwQZjp6J31G7^M^DyK28Q9~A*)+xnH7rKkefWq|u&<%u7$+=F@KSC3+)cAuc zEKWu6ygFO_idZ;x#bHHYx|4w;xE2%!>dXDH0~7PZ=M#0HVLKFuB2GGF&p}(B&ntXE z42$20B#Xn3NU?A0r)%BA7#Z}WbJR{k92w#cTjZ(heJ&=A~*!0>w z3e3GK)G}hRPpFAvaUw_?;&5m|n!xqN+UJ*{$GeKjM#<)}c)CLC*ERqGgD-ors`Nuy zYskJkrR477L~yP$sE#O2<4zM!=P3QA;O~Wuo=QAmp~5NqLSmEiUc!f9!LIxKCVNgE z$fO3Gums6od5c2n-%-v6hB{c?3JJP^QI6&mmSk=&Kh*#0I6=EAoV(XshbEF!f3~9+ zc{KA}*?te&iG@}wfqw@8!N4HVr)%h2e=q{R>i}C7oRkWSeT)~=wT&Bsxlo!U10;3R zCes|}JSGIiDy;q)u#>~2nHb2OE+A`8^k2S+i19DYfV-hcJq@u_KolD|(rl_#myxj% z)KQoIchvqDp8`7GuC5QbA$>vL@1k2mnrlGy4V{_F?)`MDJJz2h(Ijii-*o@MW;A3` za3E5Iri~sHo=raPJz%UUWwq3Sjp2DhdrGc?{+pwQtfUDSv@W%Vwk()JLF+?)Vl?h8 zIY1BYY>Si0nLzhM6}i`Q?lqp=mqt~vV81#D=OeE3qv?{q5c|Kf?vEZF!yCUkbd=P+ zO(RMO4jl|SIe9)5iZwK%8y+2np&er&`R4u%5W_~1GH|Mp)KdL)@sNDX!jjRF~|$Asn* zS|q1r2%Nt%k8$X~TEl+@cB>69CSw?QAqXjJjvz-|Eh%f(dAleud-W!KS7UYhxm!0* zpMh;qrL77H4ntucZK1D^ighKfCaP1Y38lBWN@{>UD@#XV!rQGbj{diL0BR>S3fA9B zYc_hudQD#J$ohdiY=6h5qtJacPkc`S*D%RiW1wpgY;;S_h*|3zt0|Acj172~?@1drM2Yt>~zo1W0Y;q@P9 zp7ifu3u08X*TzBOv*IO`xK|p^FUJyeV{=p<<8y+m`)VA-6 zGuRw++w*7GE9V4m?4*$h>i#0p00@DT-?Qs{i|78cxXL!+OH`EuLuE?GBiRe1j38Pt>Z!HfD@tn^L>rq!$LWfKj=R+Jp6!{3|(7* zpu*4jHZqo%EFKl#z^IlkF-$N@@jyqbc>we7UV|;KI5RV|W@GGq#d;rGsaSVo4v{%* z9fTnZYy%1GfDoF!FUnl0{T5o1cg(@&VWcyN7Qq8yIBXVP?ZBl#LyiSXEi2N>u;Zn)jMFby@ne1 zBr30kh_ja|ZU`MQgv(9}KcB;GxK}4dLPG;{D?rnBzy>pzH#Px6Sd?Tf*=U%ukl|gd z8Y=`&qG6jNqlPtXJ53#7(5Lo2;L|r~WjH|NUp(Q;MUJ=!SMF@nLK-Ja&m1)BR!&~8 z(&riVzkBo40Z2lQdw~zOzvPHr7z(YlJv~cjYyD$st`=rD*~nd8S9oc|BtOXDNEJ0n zy%p&MU1as&F;)gWSsLOcX|NFJ$l}-)3hlZHb7W*I5`TijjY$7UK!^He2y4kLp!D_S z;>D9WpQ89+iU=KdxF%yNGRES%1dGY>@k?fvL*x)q%UcwKM~Ppc zvDzOJrm8P6VSOcVtwZ7e?GjhKz7R8g8chaP0<=8N6)S7bWu>tL6he;yAZ($JI03N5 zsQ?ry=uW0Zh0{(FaTxZWI>pJCXk`+tT$prM)z_OWDIWe5+QC+SZ)Nqao-7c#m-bI( z-=KwIhYMvSyg1reu2K~Z0vF-Fk!v68{Z}cZlLZ_4+U1BR@!F5|L~NtFwI4MjHXgNj zk!9lInp_v`-WV$HoJeNr?mo)$W!CtobteP`a}v zW`|oHAGzMS4vVm0%XK-KP8T)yL&!J{dK7bPK}9T06{`zE3?noS&Cud~3!ZtEcuVKS z`E|9QiHWVgYkYp(M2SkgF?QObNcw!Th%9mPFg9I$z<5n4wVj(=j7Gw4FLwJB?c*7- zS*p|;WG+c_gv9%=&S7Q8_O=>sFxMWsIKnUJJBTL0aza1%y~%DtAb2eaeB7n{T`DLA)QOm$z~0RTn{ zA7rI;K6TCY^jMt-HGYyl#%TY~D?RlADaT5@{WL7>EZpEzA#U=)c&-hvP(>qg82>9r z;D7wDaQ4+!>j_KNrI_$V9eMt{sH>&0efU1BGUZ*Nu=b1YOK}m5;`h$$tsj)gv%*ArN$_|q!h77gEQX&7#zO-M>=CuM1q@(>3Ho2$M?JS;G;&P-zYDk z`;n;?6yf*2ro(7qSPbRJH8XoNVM+3B`IgpfO1UL9geCfe&WS~Q6h(IA{izPfX(I5y z`fd)mMe+U~wrtKPi5I%+gebdPuu$rZnu%L=XZsN+zvT8s`+%7z`5SN{*SuHBS%VV6 zaj=+hhq@5?|Ia6DWSCh^#azkM8f&&wfjqc$W(G@S{bX^*fEx7WI%_SgK?)%!g}>}| zum5Rzza6_yUV)8hoNn6J7DaWGZ0vgqSO@N;yqNM3lyednDmV5#VV!UFDwuZv`GOAO zQN*Kb{*P0Iq>0cf=oI{k{+5rz0zszLXDZM}O+GgR-q1e4j+#6mn;8&XDlfp%Qzb!- z8Zn|C04u=L#D0V2W6c$X$$mQW78;h?K`Xc$peq< zNO}v1u?7}j+QR9rY(ZX(&r~xb&ac$xO*qymr=m$o9Tk1@+eW3*lfRl8nW!G|kROWlS%!4YTiFsRitrvPty57!a$CkJ6M_ zc=1&raVr3OdaLsU!Ag3qsdI*WWpS75m+WTMbMH;`uw9k*f1tpgSt@{L9ToekoBD5& zOmwma172yjD@H8zHd@^!YsNTW>A-8S>+GcWT=e9AyI)T1~!H%yG@UqK31%^h4k zwfPYK5Uz?_Z7LIutsO#*5v&6^!*}CEyBPq3DkU;z8cn*R#GfYA=lEyDltsNS+%FLp zPGN(46r5`^jJF=bH$U>_mlpJy^4bvlN=G7KZdUsIZf}IHetiBpj5Yd)a#weI0PYj#1WW#EgB~t%(#KQKO zR#ICtZ5SxnS%@wo!oa!wF&vUoGlHqzMHsTK29Z=e^&`h@_5z=QR<5Zp`TSOS1`j<9 z3eXcL|LnGGs*cS|V;k0@ZHnUWs18 zIcAfG0SC+M)zw`&!B10W^GTGVo5RPcN8kQ&)IQuj)?~2Deb1SOGha`Zr*C!Jg^A@2 z5dpoUP@qdI9UnH1jjXH?UZ2ZX?2a1V-))QkmWF{;YHQi9y$2spd-oAvFCP1|Y+wJL zcf?Oj-i&~@5*IfYS?=rRkZTO39Piqb`z8axU65j2!&a|IPzxq5*7MD2Z6n+5w~k+J z*#q}c>ba=lX5Cj{&lHTQXv?H6h&eM10#iHn%lf~)j5!2b=fG_Z;lF5jTLA>Wv6DQM zRTQW|0dZL*A|HO2J{fH2-4*d4SPWTh|vryy_Wj#{1J z_b=7Mn|A8GZ~%F$Y%5AoiQk_v?~PfUQfDAYLl7#_>s+9y2g2ke+3r2eb=(gbf{U5? zr1gR5P};+{BI<=PnzE3*7AmZG^_Z#5T@GtQOrEzc{6{0|a5WnVx@i&gJt)r_U)>De z@J}sBrdVZnPKS9W?D;y$vc)=Pe(Q`{TC%%n^u_(0;{P2iYh)D{YEw!-xvLjtpCetI z25W97ig`+U?DZ%V73q_IW6i(z4?|A`A`tape{<`8e6>arCd zDTV32p2TE}&#$TGoAgQ-gbNmM?>2dBMfvh}bbnmHTxgwF8z{w*I1grxQN z^0HFn>xJ_P{qwVMM*uOkc=G!!%^>KN%-p}0W8}|(_8DSKp2?Y5M{~Cjco~^_dBxj_ zfQ_+imeVyrBxrW8=RgLDPT-&KwND!H zasRP)lwhj{q=dS^<C7Fy$naFko+LMR)4mC(KtQszflOob*3{VXG zC2R$n=+uLr0(Jtdeh+8Y*w(zl!W44oz>jd(ZgC<|=+9!n#6hYpf6tTr@vd1#Ic+)S zdFmtgW@oCejs%hD?H5EjB~6taJ7C%`$3Z_k*E7 zB$C*!dn+U!CFQ`OY%59qQ&_+Tahx8#+%-d3k>5c%aaUfyh_5_#L}pJ?_#0yILMKkO z%d{v>1MjwsQI+|DGqn|+^Q|W{K7!as(pbqXRTIZ8p3i%0ZaW6+Q2IgIc78TGszT^s z+J_E_V+1TB(Dc>i{B`3V>;>-xtyO!#~&*76L?GE=%F~8+ZOibdjH*&3#P;f#XRfa?o|=>xk#5m zUeDr{%NriQDGM67bOft#LIeV?O_g>Glo|W;FhwhtP zyu|DEwLtH-s{5?qzMjY~PTgoR_*#_xLIySJ|g$2EmE}WWL80Cy4Nlh{SmSHbw_j zo;YwDadBmWw*NRky!`X6NatyBNp(-19gh(Em;T(Nirf%h?soN;EI}?p$1>ZUF%Fla@H*a}Ow@NXw^zyaZ2r;EH830ej@ubuZj-O@F54@sbt1TyN^L_p;Dl&@5^oyLE# zTE(^JyzXw}j0$THdM~Dx{qS|F-v<+}0_xwoJ~4q|)hl;N`$Krxx~G*FK0Axe1O0ow zBC7kjemu_NAnu#HyD6=_PZ71>EIEzFc3QR(9zX+1bFdEMiqzOh+FmTl)j9iY))cXL zg9tyPyj5)FV=9ZrT7SV$Vc0W5BzE1uSAG1}`S2fn%I;ycahG%BjIVEHI%wZ~s9d(3Sc7@kG8XRuQyGV-?IN+hXh_Hb>u z`8`i_IDgLqU336S0zE@_+&#JPj>xKilm99N9OsKMjzrSY)9nNs8dd(J5=QXne}sxb z>i=xBni567=ND_l7T@v=j%s(?J_+F>=ZxKMMvHx9F-&cn6FW*D>%YCXZT?S``0WEw zYbJB8pDd5t@3=a6(DDz-3*58+e%|4+Q;5#IFod8A+&g980>wF4=KQ-1tK~H67#SPc zY0gfzMjh&qBU}1q`RJGg=1l_HsYTEEsdTxTX)`THEv%uf$=e6o{r%=0r#Qjb8f|28 zOH3AlLelFE$o0~Llzh^xRxG7fC?U903)7Ia=R)wCmWbK>RXA znEhRPpkBr^ldlkc0R%+_na+fSg(eVoAJ=O7iQk)P2i>Z$H-f){?dg1PBspolVMW2B zXn0wg?X~VAlL3U5OwaDjj?&xGr@_o1 z1?h3{i(eMvfjd!lO$A+Ok2C|)mdiVrpc!)*1*N@V;|AbR;h$>x$K1b(o$`^RU7vi*z4y|AEZso3=gf(ZfmD`Pk z2xcH*_v@`N?*>wCU;mn=Xq3Xql;TrnvxXLC<(TngX-+W+)QgQgd-6X)mXinF+Lx(1 zlIW@Cm%)^M%RS?heWr*LVPVu86#F=t_$@Y{#E*_+Ma6?!6NSZt%xG9tHSOmjrlBS7 z8ygl!ROG3omBBr7{8D#!*FzEL3}jAj-!!z-?fhtqP?W+7&`YL5A3=H&SoojG5qP5?@%`Q7~~o!di4(3xR4=g>f5 z*J*7AdO6RZAXmkU#j`s73#wpal(; zHK!GpjMecv|67rf}}-vWTifq{d=PKegY$gp`6hq_HFEc4=hLoLCIwGA546A)8uudzgVZ( zGzW`-AgqYq8u2Ij*{SXTf+x;ies2uf%GeHd+h?HHOo zB(R-^V52KoOS)J6a&NKrhfef_<~0oK3TG8Ws3b-h7VF6wSES$r5G@0o;=N9nlw!zu z3tMl!-oNyk5-2mzBpG!%rBsbUVKFa~uzeEePf}37y}T%9(~4jnia$M@g0|X3D;0fD zP)IRHuHKf(xbPlL*(0bMpS^0k>&4d@)$E?0g~^%`wCh!$S7kd9XT0mDz3D>D5sL-~ z2k|phJ@JG`pesfj+mJD8BwrA}jj#qlX zDl$cFKHP|EyDXNp<|G9vqprRKbc3nnrD5-~my8o-^1k-KXe+`Z8_r6i!xjV;z7Wjk~@FzK(GEY~Q0B%n@Q#}OCb z>0%qi9uRsr2$3l7#}^=VvX<@|7cy`v8!${I<2gx0lF!!V$#F-Mg*akhV3Y*R8F6L< z5al_vvoHiKoDhA>V_-a+X);6i_Wf`(nb`8j#PoPen!Vl+2&mX)xs1BDBV$bWEDr@) zU_EpsMnpoxgFnN6_LU_8y&IbZI6SxQ*11R`aC z;3$kyJNhEWAC%Z_A9gvc!X}GzbtO~%QyPnW0$MprHR;oMNp1eSl3`l{QprfL!lNsm zxiB>+x4Lm^=Y`x!M!qih$1F*~IyyN?9fd2)JS4@8n0T-5cFSOQ=lN`5`96(FoOzCv z-Ty_6pH8IiRu~C;!H4^|y#=ax%7*;7i3z0zPAtmvpc9UZ1an3j+E*$UBn_VDXKH)B zT7j1&h}fjC{`9AL%<>xeaeWfh95?R*e)1aB3-d!9XIF1!;P>MaG0%Cuj?F?}l0hK_ zLul%>QSOPH37%q#BaC+Vfgb$1O}CN)$;pq(mi2NM^?1FMr<`2Z+yDvG&GO5nLd2jd0X;cJe?*K<6oi=fqEXTW!5$y}5 zGd|QrVE|Y(ApArl&E|+IDQWryPXmLD9WKra#aWS;_qwROLVcFkxskM#;gNSiFXp!s zWK7ALB7uPm55wSZ;|;zq)*BwnNmCJ&aZ+cyq`Q1yn9{?~=P*TKczvdN$ZH@i>}`== ze<&R{HM!j{mSFF|2vouX zsoRS!Wo(FNy3@N3m8H-S3-Wuj3gEbiUP9J``h_|jb8l>WurI+Vv*fcS?n(cCFdYl3 z3SBNcq29BNZWoqdLnxy?VYOW0iG2hC=kR;`oYm(X(}kawFRTXbj!Sdw=JNuY-(U56 zc2sFC9Cc@7Y<)5DyH$HwSw8FFl=DPzNYGoF1r1~n*19hUt9?}(8rA1YKEY4$5_1!r zRCSU%IWQJ`d;Ea#ZZU-HLEr9Qc(J0TJqiEMDs#9}s%}!)I`p6?fFqG3BSo-mZ;yp? z6Qzeo&x}Y-N#uc@3~ORS8@P)@(HJ84%x8DU{;c*?TvKt^t$5Fu@(@pyX)K7O8g zr-B+OPkRs>;->?|$-)*50EuZpI+gJ;gq@Ojy3UPn%f?o!4uDy?Q}lg@1bbM&W>YSO2NASzwpnI6<4}fSpMPzrP#M%y z7U?+NrNH4+qqSRqhmh>x@#9cPG7Lp+(HBD)Fe0y-ylB*Bh64S%0<-@I4H?XWDnx^Z zHf6POp0y?>ccTe%Ff8-&I|TRVp%U~SuKeHJ147&150iPP3=ZIUFdcm^mZz$WMsSg1 zLQMs$urw2GWAzvnsTeoxDxV8O5GdpDz&hpUZ+qG^y2`5hdiuTSm@Xd`vqCNKPH~DU zLC+`WFu!Hj%xm2JOUtZd2Do&7_}u#D0$BL#}o$3O?BoYv{}yA}mx{=6 zqFQo07okdYk?GTMU!($rQ9J{=-FndE8(+N13wRRmSUL{S6xnPb`9)4$3(KMjO5Fsx$AzvRBH{RdQM2rGa0G- z%j2~bbX%xfMw)E=CG)943`pp7`-f0BXyxgwnGAqC{pIuROF~NI`~e*K-gV4qft5cu zUnUm)kR)_l$x=E?OO?)nyqNfqZHWPp=^)5!TPEdr-RWUB#N4XkK=pM05={hi?jmts zZ(17vdB5{nitwbgTHhOD)T0_Lok4IbB*RfAWpoHaK=Aw>w8|Ou{X*sxEy#P#S2-t0 zMYcPkw89P#qd94S(APyhDO*wr+23bjj!m^DaI_X@!Qw->KmN@QjrfPHFs?8arY*J3 z^mvGVQg>x}f)R8f>KM8EgbZNgj?iqd)}bRo$tdYLD)-dOp))z*0BDX}>aZBl=~tPS z_TbxM>$fBz5X~m`ldpex@{Z#zyJLiehtDSM>u*)<>!mt7n@jbX~+{j|uP8ts|;N@i|Ib+D5HZS(R$I zuh=qFb*uzsE2wp>tWs2@69>MZKXkCrtJym_mO6_)1U zM;*_fwA*}o+Wuj7f0>ax%b9^gWTI;o3w@O*Vw10Jq8==?cG8p;%kuL#4$&LouOkhe zk>4v_;Jjx)#*Mlxu^MRAlH3w4@%XdBKH=1gj0hmEaSfMf4l`kLVggeP3Inc{6jCe=fY zcy~!LuM=sFSvR+hAO9fNZ6OlCNDut7s;+(}MhWnWC0)Ga<@eLfJ4bd*6=uOXKt{93 zWD>Gg&;TFvldnVmynIDR{+>4%Y4(gSx29k>CGgu(PjtjjK~(JJ2mPy15H57}&XF0@ z|0>72tvS&g%bt9}#>2>%51fmRuJGFO+t*`MC6t9&40bZSD;rq>g9nUZ&u&rc=KlLH-x+q+%6-y92uo!15D|-iTXl@0Qali zRr)Bau0_5_m)=hed`}(Wvxz@aeqq=@$dV3-Pfa)Ca?zsWI( zbL@DDEj@bTN{GW55*mXdg(<6^Mf>^-3eX9Cg0%50DqW6uyBm{yxGZDMJCL*zqYgVx zyyIQ1NwfKd8bB5w*d5#rxS?HP4g6$&haidF3%mGxs&&!%&wtp{E-&c{}?~ zjY)6ON+mgaaDPs@g@M{y+l(;qX<3%phio00Q44;)RUY&gpDAS!zXM8euzcfL+n^a# z#z;8HXeOvQ8Umdxw`G+6L{IO2!G(o4?>#|@C@kL4LTs&C2$BDQ*9%<(95b2M6V0)m zxbroEf1uiHGIPEvM;33>YocTyF#2}F+oz_c)J#mIrUl4kAUybJ_m)7Ty_$e?hn5Wx)_}4hw%Qy|CPnFeRt`>!2kLk++1$w#?{E-=?Y&t zGM+Z^26Pf;41c^kD=sU0X%W-ArgMYTmu)IaTxKY$7L#6EusduJjl(hisP6DB!;%}v zZWAh;2SO7MWK#R=8Bf+gc5q&HdUrE>0Jzp&*N%RJ(W|%7!YU+u!qs^(K-FwBy7*hG zI@}Et$QF?%XK#nt0nCF(+M9_$!3xyi%8jt!PCav>NTE70BZ!N?lzSV}9rTHd}v4B4PkB9(WW0Cg#@kDfQT z^NN_VVjD3$-^&g0g-*T>$i`FpAPJub2SF#0M`%CGq5FlQ>#|d-l=TCVVUT#VE8A3T zNZyaL^z5{?X#WUP3K7tWDNd5xg&pa~~Sb;29=@Jp)wP2~GW7PWPohCPPhib1K?rmbwd(4j@y%>snhg zeHa8ml`$wSK_Czg*k;$gogQX5<`478SIDveqGq|enblL=8#3Ng`g{9GlhB-SW8kJR zHJDnyygi`Bde8u=3`dYpFhv zd-nySp1B1R0;J%HIJCsKLM05mRPATUWN=6ajfWzl57BJ=kT2Q2(Q*?_|5L17GNV_}d4_(HH=rTU< zhKtP~Dh55?gy&voogfzHo=*++R>4vE`A;XdG?}Rd?=82`KJrsLiQ823`xa0{gVbUI zTRi(mP+`~-sPhZ8Y|?^XwrqcWkdVCKo{!-ku#R3GA?c`7-+G`BbNWA4N%>~IDgmZQ#jJ^8c?+#oSx3|un%H!uy4>~LD~LHZMM=IBV$RsaT~OY z^7HST#s`r}zWNCy>V|gcRdAwv5LUeU#)_Qx=jq5G$z!*o#k2_Tmuvp@B2|?BC%f`*!d2Y!!$O2j`Cw0w>1g7))@3*=jmrlb}ONM6}%G{Eqdsk9`y)E3WC zdH@L)rX;vk`xL zDrHaWJrXdYgjqQm!D8HOSBQy6h-}`IJ@OEF``ykW^16pTXd_~u7M`mRp-#{1M>j{u z<#MmF7QoZN(tx!wR%d?1INpg0hp;0UN6~OF++_#k4_Y>GK-_nUK!o;JeW4n6XYkhzSyQ3hQrhNOBB9~Y^1R7gHrtnS;o zZ}0FerdfC-319<`l}t6IMa ztC6rbxYK9F;Oh5CqsFRh{Wj{Q=9NvVO}LnHOVqFKO#?L82kBDj}VN04FY_lW8Slsc{J)+3I#q5hD6uzSr`!+osh?j=J2=^ z1dfO((r;s25s!!KQ#xMj42F0Gw$^9jS%?c~QiUYg_sK{n(V6ej4G>I@VfuuOPit2c zuM_?$xy)8@UwDS?OXJ^%{7pYLRygEq1@dQZiDBa`=lzlr!AiBF`cyH#4ph!=oXN2( zad9@XRyJ~%tq+*L<*?bO2dPZh5b_C1lyii2U(3?pXoxRfVxT`%G*kpX_ZX)OYq)b4mFGq2fJN9 zWO;b#h2K29Th^@q7&zBVKHd_69@8R4+skEjEU2Bi+#PVwl^ELNiq?l4uZ?n|ijV&D zE4~cT5a%}pjo1H|;Z|0mo3R@4<+1xVF;0-D)P)j$dm9(@YPp_5CY%j3P>AH8{)*>{77|X$k{?elU{tS`c(VYBL*LA68KsC5Eux^<> z%gl9g=WAP6VAa`M-NUllOyof^ieKRp;5U3)$yue(PKgi=J*9TduJ&C0pk|2OlFO zz{YKnvD`R_b*SG@Mf4{QFZmwq?e&j!SCX1Dgm#3o8`cIzEV?zWPB$T%#<}#~OHtxd zueePWh7XnJzcGgf#S$LQqUm|4>} zY2Vh)SM!pjK9yZvO7<|oqW`_o2lIQ$V>ncZ^U!Ww8(|(~3Z;P${f#I+5~N$5b%i>6 zgb`Hoq5~KhHRCT+MH4=VvKkt7{jPEQ2xW~&k%Q9*DgGQn#;lsx&LnriY(P&jFGfWw za$*?(V_4($Vgrr`tmohrKV`IkArp>b1kYunX3iluGY0cQmXoNR-r_0ta1mE#WA;)5 z7NEF9sIa(Dx?){dI>3gMRl1080Sl{tWhA@{1*1HRSp$sQn2!xZzQ;j&|EDEwE>g+d zL!z$hf@Rfx`=-b@`*YlWSQcg=XAv&V;Zbsdbx;h-Z$sP>+Y8Fem82tdbqwS+0MDCv zG3a?HID^MTO$M|_k;gRpnu;o=&%${Hf5-3>ZZu2YcI&C4DgJwEYh5DbjjKF+XoD!- z^=2CpYB;U}5W+GKgbxI}s-aQE$hQ0~`jA~Fh#pqp7IpGp0LUYq$1h(Gymg)Y>e8+h zeMNqpKzw?|VU{Tpj3b=KdR6Rdp1EW+os9$?Bt@=A+U_EMTOv-sMA4&o&Kj+%;~HrB zkk<14>Lt}yD}w+T`SH}2*4{?1Bj2{y*{b?gw&fK1(&ZRlT_O-0-R?A7Xr|STeO;z< zMWV}Q5tk?yqqD5=W1&;Wk2O%vSf^W)VM$-d$T98<5-Mi#JX=knA>&!*9N`AxM2ngR z1NVxCc81dG*GS!8?}Cb2kDkW~tng_q1szXP@B0ie?V%?;*O;?;0@^sSHo=HS_UlC1nQ0r2FF(A8DHJQV7jrylzwZT;&rfy1+EHj0idSvoO}DE$o=pUmL%XAiR?QsFc%#mr{2}%%NhIak>>&_4#3nW z7ugYGoW=UPx)3)~t*I2;FD$J@w}$xBg+YWahL3zmcc0%PS|<(=hv3z;)TG^lu4|p5 z?1uRyKP?aDhC(|D69TNl!np!F6WjWld6tCCx*2{_PAH!_r+^sAxqcyMm^mu^Rww3xIq%itqWq;x&1euQP6nDnS5UDnGigeg z$lt$^EzsvM!ri7##1|}pIZU(0&1ZvuN`#9MG39vz;s0GC@T>-|`xzdVAENq9T8rQB z;bRa*30)eflq@WF{)2bC0MfBSw^PI{Ho!*Sf&ppc3_eJp$f2K5q~S`Q_~Q&(?G%5G zLPa@PVF&-Kn$_gLi_Mub{(1=e_}5qH>H)_~%@9~(QSr&zbzh3sB!UsHwA7p2bb)0R zMH$vIR%q=I7Ou@)-W`eN-Ou)-jm%xvJyg>BzXk%q7Y@{TM;!>iIcF@orw8B@6(D`? zyZQ_oYM{#%z>h*}piU|vfl3ao=Ept*{9TLc$Utk*GV6#*q`1+SkkD?l(dQ5~IDK62 z^NN5EP=bdM=X|o$<)7(^%f4egtPWO?8jo2Lh@kuK5usT<^U!nTo%Kza0Nc$Y9#*^| z-iez%Iy)`)t#MAaLARLV-2<+9DFk9+lEMj08JW?<#WPVz2xT}_M&BGpLjwp65?{!& z(*iO1O`}yV?%m7__X=hUVORO$4U^9!Qtx*M?qSMR!wNQeIuM>51o|W zV_JDeZdT2ovLA~gE36g!qxj4j+VlQtr&R#F*K|pN%1O^{5anS$RvO}#oskPSt_mJt zMY3T-4*&8f3DUBCn@Bs4VDaZ3(3V^Y=b6o*Mn3k1eVHdZBF?Qr(UtpR>Bde2S3?c5 zJkLLcaet73x=P}RBDwM9c5WhL#VRCH=E;=Rh#11-SIs6L&Vc0Z7vsPq+nzf8kyAoN zA~*9t6u6u`pVTqd(0hIPN2`3b@0SpDy0@iMPWq~rAN=SDiE0Um0MQrH{35rp;{dYT zAc{=-(FcsOv|2>u04aGPBQ*Lqu>J;*EyWQDaUm@wx@cEaCzS~pIi2DVP|~N~0ZDe` z^~z?3S%5y1oXW?co-{&Sjo(4zn)9;Dt#x!gIvLJu0=p>PyfDVM{wktFP&t*rKzo8R zmx~_{PM@2(3OL9W6M%3Om`gl?H@iVMcNvIQO_=Bvb9QGtQ1e z7Gf8vvg^!T4_GE9M5|)Ww;(v57*y=a>u)vpBe1KMVn9rP%O__>M_y`bIyJg~8@t*8-j1Fk*HYm*uH` z^`|#se<2{-?in)3T^{h2$)guFHBJnU6LpP0tt{bn$uiF-c54VCvmNw`e%}-l8_x)|-em!!_Z+qAe?5qrUnR*X(=u9JG{jr!icNG&RUbW4+S_R)DaYQ%cY*h7berAp?l zH21aWre|)SQ&gAo(cuEV41QW>e+`DWQ43!uq({}4PrfeQ@#0eo^~bwt{9uyR6Z8uGm5 zosuhdIzM4tH*!eBpd9+<*wp>vnl!0rz4MzbrF#1?_8HRjq`nuqqLb{Y?KS-1*XPr834{B>HJ#c{WM+w9WXaAnBhNLB*X!HYOBaNQ%`2nH#A?~kJ$r!TF=Fgx8+&gyg)utWH7Z-( z$u%|{$9^otC1>Dq6}TtMrTy6aa^q=thf$P^@bWac{JnF|()%WnFo}tuOoYQ^l;ro) z!qS;RNv}#@Px^EG2~G_%-oT>3tV(SPnp2FiGN~Y}Y&3C$>^IuavFQp*3i>2tE!cq; zL=w|&?0aUaLFcmu-(gmAZ~rjfU$5M4%4G(>wObv~Y`!bL>zfL?F!~YLIdao9Uz4&g zJJBS7l@LFa@79GVnlRu?ZuvSd3VS&c+Atsok%I?+HgDKOraY43$xJet_=4GLo?Y$s zpDEYCuW*`O=B#*y`BT1|1dB>fP7r7x1@BrV2@8*`2uG9k&y*M6_P$b5dLUV^`aHC^ z*TDZgRff{$!BapXIR0MOfn*N^9-pHU1F}uXS8QM*>jt_BNL$okeVQhE-^eFgP@bwZ zJ;el_IqV^-pgGml5hO#=aM5c~u%KFbe%+cr*cJ;s{DJDv*3_1{rmD23uzZe2Di*1M z94JMKg`)-9GXI$ss}|HM>nfoOQCM#INQSQBlDHqQCqney|Mz|ka;*Q+xku`oAhG0| z5*N*WyfEJ|eiZshvy>vtaU{W>j!I-!G6D)eW~L&z-S7r#9L+d7F27_aN@xf--vIe2 z0Jc4FZ~iJ<(wkIRC#2pCSr(@?dtc>aayACE`sH!>o|UkS@}r#++xGs*Ik{ruWj_X6 z^lmwwfZ5`GLNnK{&6RHThdjcfA<9N-F>P#tu3ZtKN#fIxDwE%Pb^EjrB&{k<*J4`< zJT&mn)#d}8hJfj}ESmQl2XuT>Ne7Fb{Fu0Xf|zzMj)DCS947F&?gB@PZczprqiRBb zS5!)dIRJ*sq_Xp~!>F6}lu364hp0L%J-&g$@0YL@mjI+zP1F@#f-znu( zL+P_Y-)LxHq@mkCNnwzT|^@niK_+ARnxse8!JctG`8TYbD$r!>qv zOPe)9Mu=_oenKiL;jUaNtjGIyI%%S7gq?zF6>H~>+L6SAoa8NNmDR^a7d2`qz_q!r z{KLTHW10{JEkLDYqcxu$s`EDhbQ2n4mnFY`=4mv?gsJy{5Y2mo%6AWSS@p^lC(qQt zMK0PQ;!gPal3b!NWe%g30jm8DV+(zPpP}Ag7Gd3;)nRlfR7t6NG5pR28uSYIK;rIC z=;y!`BEnPKMv4mC_~f#32Noq|cM1!kUZ2n)RI#B}%vLOe?C~!{U z05NiR_KMWVf^v;ox~|{uPlKYnSJiR~LGu+IFL7RY{Ql;3PQ{{SmooAD1K-;v5xnOn z;wi}mLXAEn+`DQ?0R1k5Lr6j$(h|qfa@~BFUB2&!M|NGXf>dtgZl|7j&D!>OP#XSB z^Tt<^W1zixS`8diEEdF&MuvoPw(DW9w$J6@lA~2Mhe&Gx@8o_L&Kq-n;7uU~ATowr zfJFR0nwlBW5F{?3D8>Z5u!~j=*X!!t5SCXr;XcM3Nc^l0;nLzz&PIUG)zK)rS$vcd zld1-?b9DJLf}nf?KSop)*@(5x^W`ZRutdf}&JxMS5ZeQ)r%&sHBVEgGnCF8 zLa$8JBipD5wzw50Q7jK4ddl6wGJmu?OfKaiLS?D(c0w>+dm;4txQ=pAx%+}l_Ybbr zL-OInl%jvQzdV)<#hc&0dG{m=-6$R#UjH3JOo-**n8CxAg3|V+v6=8w_{h}0-|acJ zgIUMtuC~7YQx*RxGklqAGduCnXburVObvEoLaT_MF9*QvCBTOb5k+lc&&n6tL0AI= z*JjcfCzl)_FDEXnD#dGdWlqnPA615lS^ASoQU#UtUyuTk+Qe2c(VRai<$1{E2*r7! zG_eW-odPqT3Ifv1`7sYR_{R52G+bVF*{c5KAv^vA_WWFHZEMv5nSsv_a%LoWdtw{v z*`Fs0j6M&eeOIbv8E?&R;q<=857wU%{%#;&t39?bB`b&gxIm`lPmPJ0Wz8Iqd;>Ii zZ?+G14k{=~yOAlHgD3Z^mvz9dlGpYKXDF!aHAhDWuGp$`IG9)WHCGf23y-4<2c<5mKE8izARu~C3U}1)-XtnWO#Eaf|+j7HB3}j)M z4x6Y?4n(L?-w5mpQab{{JkX*iCCLJLZKTuu=JA=a%aVFlijxnG&j7d%m_DIc;;LBK z5PA9D0|J|!ZX~w|Y_I*XT$e&Rs5y1fX2IL6^UgaN&k8yV=JT?i%q@N&a63E8&4~_- zSpRfF)roqdV{}1*M7ffxXw^bEBsF(7Wx5XK&I#1>zE0e6wvv4wB~ukjA6D?!`$LiR zuLoJ);sm6>LedwN_}Qy@bbeL!WwpX4n4A+(UZBrWTqN=aH&Pr^8{;JMz*UeP^sgE)R+9QJnQZ0qpKyt?D9c2GGXw z(P=pOI$zRm_UcA`fyk=aX)frM<%~R-iGvsWf!lGtTn7oidMN)2lHDDum7~qE^{Ch_ zhwG^2VB@xMkRcp5q2?*0ta;e*D&Su(!Xjek42AJpriz=`=84yAVe7S=R`cH^KVqtV z`07~VQYAeLn#pm5r7}7AyM2HJhB!DulGb!g)o-_uCoa}o_g2PYY|twbgMTglEb4np zCw70N5*14r1lHsy2c`B{s?KE$tGGblXE>$zysR`fP0`K_;UjOe!`wRxLiG%WO_GLQ zWdDjg9MFhb>q0sL9%OvFMVzEEJI-B;khi6CBJ<{wHh){UtdWyDhZpw1#!uziam z&M$h%|Jz++iFOfN6g#>H_C0e z(;&F5(z$c?{+;q(47D=-{eQgm;zbXGG*z+FvPs!}NB!5o*>mK9S{d}@!BbfUiSk*N zd=vi9=*e7f8L{p)I7*`@%h`GW+Xji)o@L}3%*UX$4q>4TzG?1fQI*hR-;4nKOV{*e z-2QAs2wt4!dd|oSf?^nazkb!mCL`UC7OJOgErB^At)%f%9Ps?9P3jmPDusc-leM0~ zwy^>Ek1M(Hse-d;_~uq(&|eq+oo5ax zM)SN!0^gUOd`|ms;%t*8k?a;4&hLC~$Hquz2xHpibupXAmJICo;34t&i`CkEXu(!2 zd2-I?bLAZVtgd5~f^}L3YaT7PMekc7lmp3wJ~u|TzZ`9#te!~S^)bI4iLcdY-^hO4 zAP*#VC-ughLyJC4bWQx=aS%2DYCHxlHa`1a(!#wY2#YYIc?4p*_h}yPEj?F1Hx@_K zPtvW3!$@p<#PW(>^#@6SW2FvftR>q}#h0)-F=gUkkzk~kQD6UsUAkrXx~_}ed32^o zOXkg^k!5^i_^yQ5ija4x)xHl$p>p@QB29-|aG^X|I9CHcS#i>-FsUzkz9hQYaWAIV`OVOyOa6eoON2Orn|pw0wbjFgex=X!5>V9UB~QV-S=;xBQmtx`>p^oAh%>(P=`j>z_tmZxAUK4CQ77qlWB#5H`Abr+-^ z1cU*v;hT}bc)#-m@YR@vfV2#v*n8_=S06-UpKk-8kx=Tt8uc@=Sx6*T+7-8vVwh8` zxBwg)7W(=d-yX$dP=L*P!H|=!@g|FR# zWokTVPK*C^(t;efgbKK{QN1KJV~*!>V>W1d9Fq#736RhH`O@ejOOd{DCeWOv-t$F$C3Xr;(Q;e+veuo&H5w7l<6k^4-_doeRx~#vc;her(ZcW6!NbbD zHP=#*%ZYi1F!0E_0qmx34}KLR1xJA#!}0~;6o132l@^ienb-77qZ|>@bLFsRFJtW$6Mcb*zz>ew-$-?gL`OpOubGd&E-6(WYo)PA zB{!nHOeZX@CDQELi78bnBhvfjLT9hTjQd9J?BihM%A7ndrlA9&*!u!vP z#C{hv@MYejZ~M4M9$f5B+T)KeetJq&JKD{Tp6pmld6 zy?bkB@XdMHZJNOwn2qcc)gbH$XB`Tu;?116k)eNjY}Efz>OCJ*VOjNL=YT@wsE+EG z#8~68fk)Z(SRt~ZV|>^e`AOR8lBD#B(@Xy;fwclO&JQ^H4*U7M)d$6(xwOzrXnFwM zc=?@ry2Gph_q!tB`0S&C$uY|F62H8hRnrS7w(Cj?!WD#@O~L6WH8uU<%^Em#VQtXz z@F9Y-uA@lP?sYL}JFi2yb<$GSclsTfNCTA-;Y2WBO5E8f8MuF!_+o#gCk*2fb%*;R~r6?aY6>F+q%+q}(v)i&(*e>%LrOt&^I z`E>~+WM3YS#KC_1t@n#HAFui`{)jl15?x(sN#D#3&nLGNJl$H)ekJH=zsi=rLkN~+ zW33!s{O9&2f0-{RW#Q|I|cTSvZqEur#YpMdj;9r6)9x9cjFyVse#zRKAE$ zd0x&>kUv+4eZ#dp}?k4}OM_crN%%?C%GA1;oN8@Q4QXw)MeMtS-r z4E9RfpenuF6yCRD);Y$@4I84e<$rC)Xa<*laQpQG?S48z=DKWBN?S^7U5GIWqd+*z z;O-$8?<{g*G)Ly9b@=K2bSb%U`E1=%+88(`(%6ajWhVUso#7&wNqCpjKk}=kItV%x3o(_(e$0v!+0M@d0t?pcq z2SVx)m6jGLhYdcSdg0_CJ}PN>B4~n&H^BEn;NvG}4AZ%np$Wp@qtr{6^n|!ew(;In z4ahPcoy{f?wLl+gy?Wl&3_PZot<|pIE}gfI*5HXkSK3&i0j37wxn&&9e4})T`aM`= zIsC)nJy>04aRyu)>?PDZO{BiIB~iS_pu7exaexXf%c0N;?a?2!DwAKYl3$-u!fUaD zR>f4I59!=%dcsdNoiQx|g?YnB??Wj|tDnU*7X+6n9sY12r#uHNqCQQ6haQf1V2E`~ znCH?sO0~GTMX0^3_b9J=O*gBhqlOG+O6lzOv}NfiYnG&e=A2vzmMvXQ0>3@#SEP#j z1*=Q_;}`=@pVEiEH`9H6vx))qpRntudKjz&w+gzx@}SXuZnUTkb*)_!0Q#R>m_uvOTX7HaHJ?uR6jYD?&f~!bYrenxb`LLT5h1W; zCOFPNqDQ5|N=fr>77ht|0J0`$&4MRR&5Ez`KOI%X{o)N^pSlwoUww5G6Jlw*4Gfpt zHoLy9o4iLv4T5s`h3J+{5Nwc<6=0c&jk{=zxU^3oe!u<^8BxHkA66951J z+M+6mE8yQH2=)Kh?PVfhWMl;OkGR|YfP}`CX1r&`IFa-yuUGqpnJc5DKyG zPOe`+&AfeT)(epw_|KQXrxb3GlN4areNm6&naAEpR_ooszyL9U;g{Q+#jE}CoR%P( zdVCu3nff%AOHu>{?cdPqf;J=|WoBmb4G$07jOR%qO2JmY3pLC3y$3C~I@`?Gn#6$- zN-}#i5~n-Nu!DquBj4$sgaXxYRIo$imwwwXx?AUrU$Cdg98(#8NWGZPdBHDao~^U- zs3s?wSeX4VY?=_X1Zr58d9c-mD-s7yf7Qxa)UEr7>o%1}R~gVbf9U6-oIkFC=0*fs zMte^c-vYicGZ-B@dkSPZX*)WD*IpaEdup8uJBCcdVh}ZTGC2>d;&^UbdyPhGe`=SR z@E>c36NT1!O*8qH;PPwd`^387a53>eV5h=hMrlbG&4{sk>yYRau zT)SLoW!$>`{xBr!oN&5r)!;lIQGEJg)c+m|x`aKBrcFLF8>_Yim_Tb_x8#fzQb^z8 zWlq5hr@*J_I?z07!Mt7+pXBw3hmF{lx5;8#@RaxH=x*>+%+hY!F64N=?3Bge&NCIK zg7fjA`tXr_Ab@2|F6;lF3Tu=9=x(_Yzu zw4WsI$s=K^X<$-oNsWF-DI{a%v0RC-R+$J+u%L9YJ?3{_iZ}ilx6aHHoii5~7X!!H z=tWkKp|o>akL~rv+S6npKYpz5LpP0e^QQraTnl%{@Bu1U!4t3P^?X#%%MXN4CWHC6 zW+S&};DZJ5TV564CZG}suC#dOxE*35oOBI*d9PkGP>k<6b?0@q=KKcX-{wlEmu~jp z=h#P|Nmxg2j_0L-k2F|3K)*P7O-JZ5M}Ycb=!wkb5aZf*)3|gF)}x&8jcZ^af|m%J z5Alz!1pk}41sLZI5##7?wP0rk@bUjub}i6Qt?hq^B#EMwVsvpSGTr3U$xKp5QLdpF zmvSGsj!*`{`Tl{zVm%+egFS| z)}FoIwddLUeP=(<^Lu{JyVmG^XV0zhwA~ljI53`RGY6W?S_BSz$xV#ELr&#xSYzkXq zP%C^BUrRvRg@X{0M<3pQ$dgYT~E5ic!8QDC;~csT{& zTjOX9U_(@-G)PbpxarR1ug>-Ak%+(bT7*;Kc@C~cB{ko_RwL2OtaE~U19k%?b_zDB`0JSKDc>nP(T7)nFXbJ%)@EDQRV3vRO zJwn8EPj$zXS|Z@BDp$%(ERq3<7bZIf#k8F9+jpz-EzJozomhpL`n2mZXTq+cyjxKD1{Go5I#^5E3sT8v6*zkqy3EraK z`4oMD$lK#oh(cx+p9m)^ba}VOrijf1frV%OG9VrY*0k%~XSbt$&2Zj}WHiGIvDtDZ z7>ZWQ$x8y#@+n2q`d^zzHP^>k2kI&Xo_h0)K{9mi8vPatlEv@&=Pf_J1nPILcyvSL zo@sWR`em0D{abVa9b_8nsuVW}rG{iq`2__Tu;ZEnJn*I%aou@W*T85SQX{uQjZ@y@ z@H5CQ&NahVdS1NPXaIv{nnv>ux|2YKc1o|qiGl~J)7?msM&gD@X2umpWh#!Jhggyv z7y{kKTiMfyvg$JeeQr?adLPkE2VA8R8YPrNuZ<8P43z0Ra`v8&!NB6ho zM3s2OrIyOrF{kUTX_>z)#rW<%3Klv3F8W3v^OOS74Kd85GiPegjFhu#*PKZH)+b^~ zcQkrr8d5huHa*5(Ay+qUD80FKF&LO716>4KTZ{EEh$Zf z_K!fnS`0Cj`o*K2rorrSA--e&?|}rBf5n@&(voImjFaQRP&j9o5ro(2H%h>KT|e|J z;DnLu2CY6bsKePK%6n%oZ^txizP-!=$;3>s%XBn?t5)`~=BC(f))v=iGC69Q22 z`TLFhS`{jo9V-gV{a@XfNk3k{sg_W-a5(!@M4Q(0PC+QL7jT94^JcoaVLm6hp|^N)D1cs* z5qf!xV$yT>6_c#};xKp0hwz47y^IebCw!1Ccu{-@&|^GZ9P_;4kVDaN1fYu)+o!O@ z27fP7XKS7**~@FBaO&Vd=i#uK&n6mgwwi=J`|b1@^UmK}%ST9+q57|z?x?l%`Bz6H z&aCKqAu?k{vKIuwQwdlNY{qRqZd_e=AFD;7O69)kwrk1V9S^73Eq6q*+y!f4nlDWV zcWxV#C&5G%WuRwn6Rqha*S_PjFXDmt(5Z?HSmne9M+}bL%SNjaEc0XU73+}b)NR>- zMjv!S2(Fw6a$ixG{E5aA2oX2ta4t#3!&SSK)1vYN#ei?a7fi_A24eI=NCkl~BCC(W z;j9Gpwzf7||F}@u*weg3hpnsWD}- zKr6f4O0jja!mlHvsHmuAEeP9+8UnDI=lz%pAFJra?>v>fX~|d{5(&A1F_(%s)z`N3 zcha%nT`$ra&|_cUr}{=k9WKw@zNVD9aIE=}qGN&;&JfFMe@fr{=I*gQs2@0hxk`s| z!x}Z8515s(|FIv|%ZuK&MQqvmfmlAGg5l^cJ1C-U4p(dP1)peG9WvO@qjI?sWtYqb zl-Ih*BdJOb@;bV@;8bjO%v@gAQ<1?+d(Kb10C&{nhHY;%bJ0kuSpSj$edpU}nw$4r z#_2B+0-g03BIBcF)~AK632R~ul8mb%Acy#Y*Z)GysdKo-tw)}#48oz>3SmBEJVXC^ zvYp<~KZ5`lgN~>g%ou7hyr6<*G{&#dUIF4R_PQiB_&??c%ejP>lKj!as?@})XBX^w zZn)wJwnSTikS}j?8d4ja(5Y}dI!?)6o+i@e%u|6MEbGFqyUn6C%?{;aGwK6L2O z)$9L5X@EzIh1V*ot9y7ux#o#W{R&a%zV7x)-oCwY-rfCBG>;Kb7dhQi zlDk3APyi+d2S|}jln~AAH)8b#=)%5@fzbqAoddarDwyKmwq-#G>dP5Q zN31Y+SU%3@2iZ4}kbT>4YQnH%5>>S!2fQd-aJ@tK9vU_L#9}-B(Q;<-ms>o&c6lSzJ12NAQj3#saat?g3gT>rq4BULm z%EQ0up`YTru<`WhY9IIyat zxfYh=8UZco5YKTADDFDL4&9BT$<^oV5ZvdozKlLuD%>W{Zb=oHaaoQzW*n%maP+uZ zHj(?)(OB)39?wm11oVT1-5xdci@qCC9qnhiT?g^E7(xfvbsay6|GlCBJ$1(|)oc(* zZKTy;?gvLlN0WMu6i+tujBA|`B6#cgyJ&hl0lOKSmBA+w zX}<}#sBNB3gcWf;AoJb`O96{sEJA`@QV*ee$3Bqm&_v6Ub|^W=Z7x_%<+v-NLlwy$WjLPYi3lhoMU9-FU z-NhS`1N9g}+ys!!yeRITrC{ZwL4ZB?@vo0MSs8_fC%x@+G%8(|lopNHxHpk!hL z5vG+#9B%C?aUFn@8X9ICXPyM>$(hQ7kT$k+uZhXznb(tFQ=v&4XZ%)MeUE znssj6D<@y!dE!%QoW9^f(9J=WBdx-Lr_Iar2^81ZmTS_=593!}*z!6}-??q5KHBSY zTa_rJ#R-uFYh8={PJ;?7gtl=quRLlRof<>%$q!^n1ey&`qo-L<)o2+>Sa7lJu*|Cn z?CaQlj6mwgwRhLNUn^mwT2d0?xn6Sm|25+dvU!*o^0fLS1v9&$XR91|f82IAA=B@q zv}D3X%TEo!LWNJJ#|t#k4|guZ>+Nth5x)&2yrAgTT!rYzn#;iVYo`uNSDX&)yz-A{2d_>a6AymQE;G= zW{Q${3g$7Z3Cwh3v^Ghu*s6-fQ1YZHY7Hom0y%2N&(0=)F%@48NcUX6;NE#VHWaha zc(Z_yH4B84uhx>V_pdwU`F|40Rk;CiB?d$MmgqVMk^dNaJ9c~fjzx=7$?vC5SRXGv=9%zM9op~l diff --git a/nano/templates/rpd.tmpl b/nano/templates/rpd.tmpl index bd92b91c979..6c380b3c046 100644 --- a/nano/templates/rpd.tmpl +++ b/nano/templates/rpd.tmpl @@ -11,93 +11,96 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm

Pipe type:

{{for data.pipemenu}} - {{:helper.link(String(value.pipecategory), null, {"pipetype": Number(value.pipemode)}, data.pipetype == Number(value.pipemode) ? "linkOn" : null)}} + {{:helper.link(String(value.pipecategory), null, {pipetype: Number(value.pipemode)}, data.pipetype == Number(value.pipemode) ? "linkOn" : null)}} {{/for}}

Available pipes:

{{for data.pipelist}} - {{if value.category == data.pipetype}} -
{{:helper.link(String(value.pipename), "arrow-right", {"whatpipe": Number(value.id)}, data.whatpipe == Number(value.id) ? "linkOn" : null)}}
+ {{if value.atmosordisposals == 1 && value.category == data.pipetype}} +
{{:helper.link(String(value.pipename), "arrow-right", {"whatpipe": Number(value.pipeid)}, data.whatpipe == Number(value.pipeid) ? "linkOn" : null)}}
{{/if}} {{/for}}
{{for data.pipelist}} + {{if value.atmosordisposals != 1 || value.pipeid != data.whatpipe || value.orientations == 1}} + {{continue;}} + {{/if}}
- {{if value.id == data.whatpipe && value.orientations != 1}} -
- {{:helper.link("Orient automatically", null, {"iconrotation": 0}, data.iconrotation == 0 ? "linkOn" : null)}} -
- {{/if}} - {{if value.id == data.whatpipe && value.orientations != 1 && value.bendy != 1}} +
+ {{:helper.link("Orient automatically", null, {iconrotation: 0}, data.iconrotation == 0 ? "linkOn" : null)}} +
+ {{if value.bendy}}
- {{:helper.link("", "arrow-right", {"iconrotation": 1}, data.iconrotation == 1 ? "linkOn" : null)}} - -
-
- {{:helper.link("", "arrow-right", {"iconrotation": 4}, data.iconrotation == 4 ? "linkOn" : null)}} - -
- {{/if}} - {{if value.id == data.whatpipe && value.orientations == 4 && value.bendy != 1}} -
- {{:helper.link("", "arrow-right", {"iconrotation": 2}, data.iconrotation == 2 ? "linkOn" : null)}} - -
-
- {{:helper.link("", "arrow-right", {"iconrotation": 8}, data.iconrotation == 8 ? "linkOn" : null)}} - -
- {{/if}} - {{if value.id == data.whatpipe && value.bendy == 1}} -
- {{:helper.link("", "arrow-right", {"iconrotation": 1}, data.iconrotation == 1 ? "linkOn" : null)}} + {{:helper.link("", "arrow-right", {iconrotation: 1}, data.iconrotation == 1 ? "linkOn" : null)}}
- {{:helper.link("", "arrow-right", {"iconrotation": 4}, data.iconrotation == 4 ? "linkOn" : null)}} + {{:helper.link("", "arrow-right", {iconrotation: 4}, data.iconrotation == 4 ? "linkOn" : null)}}
- {{:helper.link("", "arrow-right", {"iconrotation": 2}, data.iconrotation == 2 ? "linkOn" : null)}} + {{:helper.link("", "arrow-right", {iconrotation: 2}, data.iconrotation == 2 ? "linkOn" : null)}}
- {{:helper.link("", "arrow-right", {"iconrotation": 8}, data.iconrotation == 8 ? "linkOn" : null)}} + {{:helper.link("", "arrow-right", {iconrotation: 8}, data.iconrotation == 8 ? "linkOn" : null)}}
+ {{else}} +
+ {{:helper.link("", "arrow-right", {iconrotation: 1}, data.iconrotation == 1 ? "linkOn" : null)}} + +
+
+ {{:helper.link("", "arrow-right", {iconrotation: 4}, data.iconrotation == 4 ? "linkOn" : null)}} + +
+ {{if value.orientations == 4}} +
+ {{:helper.link("", "arrow-right", {iconrotation: 2}, data.iconrotation == 2 ? "linkOn" : null)}} + +
+
+ {{:helper.link("", "arrow-right", {iconrotation: 8}, data.iconrotation == 8 ? "linkOn" : null)}} + +
+ {{/if}} {{/if}}
{{/for}} {{else data.mode == 2}}

Available pipes:

- {{for data.dpipelist}} -
{{:helper.link(String(value.pipename), "arrow-right", {"whatdpipe": Number(value.id)}, data.whatdpipe == Number(value.id) ? "linkOn" : null)}}
+ {{for data.pipelist}} + {{if value.atmosordisposals == 2}} +
{{:helper.link(String(value.pipename), "arrow-right", {"whatdpipe": Number(value.pipeid)}, data.whatdpipe == Number(value.pipeid) ? "linkOn" : null)}}
+ {{/if}} {{/for}}
- {{for data.dpipelist}} + {{for data.pipelist}} + {{if value.atmosordisposals != 2 || value.pipeid != data.whatdpipe || value.orientations == 1}} + {{continue;}} + {{/if}}
- {{if value.id == data.whatdpipe && value.orientations != 1}} -
- {{:helper.link("Orient automatically", null, {"iconrotation": 0}, data.iconrotation == 0 ? "linkOn" : null)}} -
+
+ {{:helper.link("Orient automatically", null, {iconrotation: 0}, data.iconrotation == 0 ? "linkOn" : null)}} +
+
+ {{:helper.link("", "arrow-right", {iconrotation: 1}, data.iconrotation == 1 ? "linkOn" : null)}} + +
+
+ {{:helper.link("", "arrow-right", {iconrotation: 4}, data.iconrotation == 4 ? "linkOn" : null)}} + +
+ {{if value.orientations == 4}}
- {{:helper.link("", "arrow-right", {"iconrotation": 1}, data.iconrotation == 1 ? "linkOn" : null)}} - -
-
- {{:helper.link("", "arrow-right", {"iconrotation": 4}, data.iconrotation == 4 ? "linkOn" : null)}} - -
- {{/if}} - {{if value.id == data.whatdpipe && value.orientations == 4}} -
- {{:helper.link("", "arrow-right", {"iconrotation": 2}, data.iconrotation == 2 ? "linkOn" : null)}} + {{:helper.link("", "arrow-right", {iconrotation: 2}, data.iconrotation == 2 ? "linkOn" : null)}}
- {{:helper.link("", "arrow-right", {"iconrotation": 8}, data.iconrotation == 8 ? "linkOn" : null)}} + {{:helper.link("", "arrow-right", {iconrotation: 8}, data.iconrotation == 8 ? "linkOn" : null)}}
{{/if}} @@ -109,4 +112,4 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm

Device ready to flip loose pipes...

{{else data.mode == 5}}

Device ready to eat loose pipes...

-{{/if}} +{{/if}} \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 62908577586..cf4ebc2bb56 100644 --- a/paradise.dme +++ b/paradise.dme @@ -45,6 +45,7 @@ #include "code\__DEFINES\misc.dm" #include "code\__DEFINES\mobs.dm" #include "code\__DEFINES\pda.dm" +#include "code\__DEFINES\pipes.dm" #include "code\__DEFINES\preferences.dm" #include "code\__DEFINES\process_scheduler.dm" #include "code\__DEFINES\qdel.dm" @@ -229,6 +230,7 @@ #include "code\datums\mixed.dm" #include "code\datums\mutable_appearance.dm" #include "code\datums\periodic_news.dm" +#include "code\datums\pipe_datums.dm" #include "code\datums\progressbar.dm" #include "code\datums\recipe.dm" #include "code\datums\ruins.dm" From a8527fca1913027c4088785a213bff60444430ad Mon Sep 17 00:00:00 2001 From: Citinited Date: Fri, 4 May 2018 18:01:34 +0100 Subject: [PATCH 14/99] span class formatting --- code/game/turfs/simulated/walls.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 545cf857d6d..a9ece2355e2 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -171,7 +171,7 @@ /turf/simulated/wall/rpd_act(mob/user, obj/item/rpd/our_rpd) if(our_rpd.mode == RPD_ATMOS_MODE) playsound(src, "sound/weapons/circsawhit.ogg", 50, 1) - user.visible_message("[user] starts drilling a hole in [src]...", "You start drilling a hole in [src]...", "You hear drilling.") + user.visible_message("[user] starts drilling a hole in [src]...", "You start drilling a hole in [src]...", "You hear drilling.") if(!do_after(user, our_rpd.walldelay, target = src)) //Drilling into walls takes time return our_rpd.create_atmos_pipe(user, src) From 14ba039d81e2eef99b4e43de67add90ce660b1d5 Mon Sep 17 00:00:00 2001 From: Citinited Date: Wed, 30 May 2018 21:45:23 +0100 Subject: [PATCH 15/99] GLOB --- code/__HELPERS/global_lists.dm | 13 ++++++------- code/_globalvars/lists/objects.dm | 2 -- code/datums/pipe_datums.dm | 2 ++ code/game/objects/items/weapons/rpd.dm | 2 +- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 2af41d294db..367028b3936 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -49,14 +49,13 @@ whitelisted_species += S.name init_subtypes(/datum/crafting_recipe, crafting_recipes) - -//RPD stuff - var/list/pipe_list = list() - init_subtypes(/datum/pipes/atmospheric, pipe_list) - init_subtypes(/datum/pipes/disposal, pipe_list) - for(var/I in pipe_list) + var/list/temp_pipe_list = list() + init_subtypes(/datum/pipes/atmospheric, temp_pipe_list) + init_subtypes(/datum/pipes/disposal, temp_pipe_list) + for(var/I in temp_pipe_list) var/datum/pipes/P = I - construction_pipe_list += list(list("pipename" = P.pipename, "pipeid" = P.pipeid, "atmosordisposals" = P.pipetype, "category" = P.category, "orientations" = P.orientations, "icon" = P.previewicon, "bendy" = P.bendy)) + GLOB.construction_pipe_list += list(list("pipename" = P.pipename, "pipeid" = P.pipeid, "atmosordisposals" = P.pipetype, "category" = P.category, "orientations" = P.orientations, "icon" = P.previewicon, "bendy" = P.bendy)) + return 1 /* // Uncomment to debug chemical reaction list. diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 62bc1716c36..82d4c113997 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -44,5 +44,3 @@ var/global/list/poi_list = list() //list of points of interest for observe/f var/global/list/active_jammers = list() // List of active radio jammers var/global/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing. - -var/global/list/construction_pipe_list = list() //List of all pipe datums diff --git a/code/datums/pipe_datums.dm b/code/datums/pipe_datums.dm index 95850555a6e..14d42510fb6 100644 --- a/code/datums/pipe_datums.dm +++ b/code/datums/pipe_datums.dm @@ -3,6 +3,8 @@ #define RPD_ATMOS 1 #define RPD_DISPOSAL 2 +GLOBAL_LIST_EMPTY(construction_pipe_list) //List of all pipe datums + /datum/pipes var/pipename //What the pipe is called in the interface var/pipeid //Use the pipe define for this diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index b74ff4ba594..98639030b3a 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -144,7 +144,7 @@ var/list/pipemenu = list( data["iconrotation"] = iconrotation data["mainmenu"] = mainmenu data["mode"] = mode - data["pipelist"] = construction_pipe_list + data["pipelist"] = GLOB.construction_pipe_list data["pipemenu"] = pipemenu data["pipetype"] = pipetype data["whatdpipe"] = whatdpipe From d978472d272c2ea68862ac852427d10c1f717290 Mon Sep 17 00:00:00 2001 From: Citinited Date: Thu, 31 May 2018 22:44:10 +0100 Subject: [PATCH 16/99] RPD nanoUI improvement; misc. code tweaks --- code/__HELPERS/global_lists.dm | 5 +++-- code/datums/pipe_datums.dm | 8 ++++---- code/game/objects/items/weapons/rpd.dm | 24 ++++++++++++++++-------- nano/templates/rpd.tmpl | 10 +++++----- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 367028b3936..c11fd98f433 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -49,11 +49,12 @@ whitelisted_species += S.name init_subtypes(/datum/crafting_recipe, crafting_recipes) + + //RPD pipe list building var/list/temp_pipe_list = list() init_subtypes(/datum/pipes/atmospheric, temp_pipe_list) init_subtypes(/datum/pipes/disposal, temp_pipe_list) - for(var/I in temp_pipe_list) - var/datum/pipes/P = I + for(var/datum/pipes/P in temp_pipe_list) //Yes I know the list(list(...)) thing looks weird, but it allows us to group pipe metadata into ordered lists instead of being one big list GLOB.construction_pipe_list += list(list("pipename" = P.pipename, "pipeid" = P.pipeid, "atmosordisposals" = P.pipetype, "category" = P.category, "orientations" = P.orientations, "icon" = P.previewicon, "bendy" = P.bendy)) return 1 diff --git a/code/datums/pipe_datums.dm b/code/datums/pipe_datums.dm index 14d42510fb6..43cda53a4a9 100644 --- a/code/datums/pipe_datums.dm +++ b/code/datums/pipe_datums.dm @@ -29,11 +29,12 @@ GLOBAL_LIST_EMPTY(construction_pipe_list) //List of all pipe datums orientations = 2 previewicon = "simple" -/datum/pipes/atmospheric/simple/bent +/datum/pipes/atmospheric/bent //Why is this not atmospheric/simple/bent you ask? Because otherwise the ordering of the pipes in the UI menu gets weird pipename = "Bent pipe" pipeid = PIPE_SIMPLE_BENT orientations = 4 bendy = TRUE + previewicon = "simple" /datum/pipes/atmospheric/manifold pipename = "T-manifold" @@ -77,13 +78,12 @@ GLOBAL_LIST_EMPTY(construction_pipe_list) //List of all pipe datums //Supply pipes - /datum/pipes/atmospheric/simple/supply pipename = "Straight supply pipe" pipeid = PIPE_SUPPLY_STRAIGHT category = RPD_SUPPLY_PIPING -/datum/pipes/atmospheric/simple/bent/supply +/datum/pipes/atmospheric/bent/supply pipename = "Bent supply pipe" pipeid = PIPE_SUPPLY_BENT category = RPD_SUPPLY_PIPING @@ -110,7 +110,7 @@ GLOBAL_LIST_EMPTY(construction_pipe_list) //List of all pipe datums pipeid = PIPE_SCRUBBERS_STRAIGHT category = RPD_SCRUBBERS_PIPING -/datum/pipes/atmospheric/simple/bent/scrubbers +/datum/pipes/atmospheric/bent/scrubbers pipename = "Bent scrubbers pipe" pipeid = PIPE_SCRUBBERS_BENT category = RPD_SCRUBBERS_PIPING diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index 98639030b3a..5efa881b861 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -37,6 +37,10 @@ spark_system.set_up(1, 0, src) spark_system.attach(src) +/obj/item/rcd/Destroy() + QDEL_NULL(spark_system) + return ..() + //Procs /obj/item/rpd/proc/activate_rpd(delay) //Maybe makes sparks and activates cooldown if there is a delay @@ -53,17 +57,17 @@ else if(whatpipe == PIPE_METER) P = new /obj/item/pipe_meter(T) else - P = new(T, pipe_type = whatpipe, dir = user.dir) //Make the pipe, BUT WAIT! There's more! + P = new(T, whatpipe, iconrotation) //Make the pipe, BUT WAIT! There's more! if(!iconrotation && P.is_bent_pipe()) //Automatically rotates dispensed pipes if the user selected auto-rotation P.dir = turn(user.dir, 135) else if(!iconrotation && P.pipe_type in list(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_CAP, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_INJECTOR, PIPE_PASV_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction P.flip() else if(iconrotation && P.is_bent_pipe()) //If user selected a rotation and the pipe is bent P.dir = turn(iconrotation, -45) - else if(iconrotation) //If user selected a rotation - P.dir = iconrotation - to_chat(user, "[src] rapidly dispenses [P]!") - activate_rpd(1) + else if(!iconrotation) //If user selected a rotation + P.dir = user.dir + to_chat(user, "[src] rapidly dispenses [P]!") + activate_rpd(TRUE) /obj/item/rpd/proc/create_disposals_pipe(mob/user, turf/T) //Make a disposals pipe / construct var/obj/structure/disposalconstruct/P = new(T, whatdpipe, iconrotation) @@ -71,8 +75,8 @@ P.dir = user.dir if(!iconrotation && whatdpipe != PIPE_DISPOSALS_JUNCTION) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though P.flip() - to_chat(user, "[src] rapidly dispenses [P]!") - activate_rpd(1) + to_chat(user, "[src] rapidly dispenses [P]!") + activate_rpd(TRUE) /obj/item/rpd/proc/rotate_all_pipes(mob/user, turf/T) //Rotate all pipes on a turf for(var/obj/item/pipe/P in T) @@ -169,7 +173,11 @@ var/list/pipemenu = list( /obj/item/rpd/afterattack(atom/target, mob/user, proximity) ..() - if(loc != user || !proximity || world.time < lastused + spawndelay) + if(loc != user) + return + if(!proximity) + return + if(world.time < lastused + spawndelay) return target.rpd_act(user, src) //Handle RPD effects in separate procs diff --git a/nano/templates/rpd.tmpl b/nano/templates/rpd.tmpl index 6c380b3c046..f08a5ff02b4 100644 --- a/nano/templates/rpd.tmpl +++ b/nano/templates/rpd.tmpl @@ -4,21 +4,21 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm

Mode:

{{for data.mainmenu}} - {{:helper.link(String(value.category), String(value.icon), {"mode": Number(value.mode)}, data.mode == Number(value.mode) ? "linkOn" : null)}} + {{:helper.link(value.category, value.icon, {mode: value.mode}, data.mode == value.mode ? "linkOn" : null)}} {{/for}}
{{if data.mode == 1}}

Pipe type:

{{for data.pipemenu}} - {{:helper.link(String(value.pipecategory), null, {pipetype: Number(value.pipemode)}, data.pipetype == Number(value.pipemode) ? "linkOn" : null)}} + {{:helper.link(value.pipecategory, null, {pipetype: value.pipemode}, data.pipetype == value.pipemode ? "linkOn" : null)}} {{/for}}

Available pipes:

{{for data.pipelist}} {{if value.atmosordisposals == 1 && value.category == data.pipetype}} -
{{:helper.link(String(value.pipename), "arrow-right", {"whatpipe": Number(value.pipeid)}, data.whatpipe == Number(value.pipeid) ? "linkOn" : null)}}
+
{{:helper.link(value.pipename, "arrow-right", {whatpipe: value.pipeid}, data.whatpipe == value.pipeid ? "linkOn" : null)}}
{{/if}} {{/for}}
@@ -74,12 +74,12 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm
{{for data.pipelist}} {{if value.atmosordisposals == 2}} -
{{:helper.link(String(value.pipename), "arrow-right", {"whatdpipe": Number(value.pipeid)}, data.whatdpipe == Number(value.pipeid) ? "linkOn" : null)}}
+
{{:helper.link(value.pipename, "arrow-right", {whatdpipe: value.pipeid}, data.whatdpipe == value.pipeid ? "linkOn" : null)}}
{{/if}} {{/for}}
{{for data.pipelist}} - {{if value.atmosordisposals != 2 || value.pipeid != data.whatdpipe || value.orientations == 1}} + {{if value.atmosordisposals != 2 || value.pipeid != data.whatdpipe || value.orientations == 1}} {{continue;}} {{/if}}
From 2a310f3539e333fdbd4fc95c8dc2be7410ae0a6e Mon Sep 17 00:00:00 2001 From: Citinited Date: Sat, 2 Jun 2018 08:52:31 +0100 Subject: [PATCH 17/99] Renames a bunch of variables; prevents possible exploit --- code/__HELPERS/global_lists.dm | 2 +- code/datums/pipe_datums.dm | 318 ++++++++++++------------- code/game/objects/items/weapons/rpd.dm | 31 ++- nano/templates/rpd.tmpl | 38 +-- 4 files changed, 201 insertions(+), 188 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index c11fd98f433..2c36a04eab9 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -55,7 +55,7 @@ init_subtypes(/datum/pipes/atmospheric, temp_pipe_list) init_subtypes(/datum/pipes/disposal, temp_pipe_list) for(var/datum/pipes/P in temp_pipe_list) //Yes I know the list(list(...)) thing looks weird, but it allows us to group pipe metadata into ordered lists instead of being one big list - GLOB.construction_pipe_list += list(list("pipename" = P.pipename, "pipeid" = P.pipeid, "atmosordisposals" = P.pipetype, "category" = P.category, "orientations" = P.orientations, "icon" = P.previewicon, "bendy" = P.bendy)) + GLOB.construction_pipe_list += list(list("pipe_name" = P.pipe_name, "pipe_id" = P.pipe_id, "pipe_type" = P.pipe_type, "pipe_category" = P.pipe_category, "orientations" = P.orientations, "pipe_icon" = P.pipe_icon, "bendy" = P.bendy)) return 1 diff --git a/code/datums/pipe_datums.dm b/code/datums/pipe_datums.dm index 43cda53a4a9..ea6d2f016f8 100644 --- a/code/datums/pipe_datums.dm +++ b/code/datums/pipe_datums.dm @@ -6,308 +6,308 @@ GLOBAL_LIST_EMPTY(construction_pipe_list) //List of all pipe datums /datum/pipes - var/pipename //What the pipe is called in the interface - var/pipeid //Use the pipe define for this - var/pipetype //Atmos, disposals etc. - var/category //What category of pipe + var/pipe_name //What the pipe is called in the interface + var/pipe_id //Use the pipe define for this + var/pipe_type //Atmos, disposals etc. + var/pipe_category //What category of pipe var/bendy = FALSE//Is this pipe bendy? var/orientations //Number of orientations (for interface purposes) - var/previewicon //icon_state of the dispensed pipe (for interface purposes) + var/pipe_icon //icon_state of the dispensed pipe (for interface purposes) /datum/pipes/atmospheric - pipetype = RPD_ATMOS - category = RPD_ATMOS_PIPING + pipe_type = RPD_ATMOS + pipe_category = RPD_ATMOS_PIPING /datum/pipes/disposal - pipetype = RPD_DISPOSAL + pipe_type = RPD_DISPOSAL //Normal pipes /datum/pipes/atmospheric/simple - pipename = "Straight pipe" - pipeid = PIPE_SIMPLE_STRAIGHT + pipe_name = "Straight pipe" + pipe_id = PIPE_SIMPLE_STRAIGHT orientations = 2 - previewicon = "simple" + pipe_icon = "simple" /datum/pipes/atmospheric/bent //Why is this not atmospheric/simple/bent you ask? Because otherwise the ordering of the pipes in the UI menu gets weird - pipename = "Bent pipe" - pipeid = PIPE_SIMPLE_BENT + pipe_name = "Bent pipe" + pipe_id = PIPE_SIMPLE_BENT orientations = 4 bendy = TRUE - previewicon = "simple" + pipe_icon = "simple" /datum/pipes/atmospheric/manifold - pipename = "T-manifold" - pipeid = PIPE_MANIFOLD + pipe_name = "T-manifold" + pipe_id = PIPE_MANIFOLD orientations = 4 - previewicon = "manifold" + pipe_icon = "manifold" /datum/pipes/atmospheric/manifold4w - pipename = "4-way manifold" - pipeid = PIPE_MANIFOLD4W + pipe_name = "4-way manifold" + pipe_id = PIPE_MANIFOLD4W orientations = 1 - previewicon = "manifold4w" + pipe_icon = "manifold4w" /datum/pipes/atmospheric/cap - pipename = "Pipe cap" - pipeid = PIPE_CAP + pipe_name = "Pipe cap" + pipe_id = PIPE_CAP orientations = 4 - previewicon = "cap" + pipe_icon = "cap" /datum/pipes/atmospheric/valve - pipename = "Manual valve" - pipeid = PIPE_MVALVE + pipe_name = "Manual valve" + pipe_id = PIPE_MVALVE orientations = 2 - previewicon = "mvalve" + pipe_icon = "mvalve" /datum/pipes/atmospheric/valve/digital - pipename = "Digital valve" - pipeid = PIPE_DVALVE - previewicon = "dvalve" + pipe_name = "Digital valve" + pipe_id = PIPE_DVALVE + pipe_icon = "dvalve" /datum/pipes/atmospheric/tvalve - pipename = "Manual T-valve" - pipeid = PIPE_TVALVE + pipe_name = "Manual T-valve" + pipe_id = PIPE_TVALVE orientations = 4 - previewicon = "tvalve" + pipe_icon = "tvalve" /datum/pipes/atmospheric/tvalve/digital - pipename = "Digital T-valve" - pipeid = PIPE_DTVALVE - previewicon = "dtvalve" + pipe_name = "Digital T-valve" + pipe_id = PIPE_DTVALVE + pipe_icon = "dtvalve" //Supply pipes /datum/pipes/atmospheric/simple/supply - pipename = "Straight supply pipe" - pipeid = PIPE_SUPPLY_STRAIGHT - category = RPD_SUPPLY_PIPING + pipe_name = "Straight supply pipe" + pipe_id = PIPE_SUPPLY_STRAIGHT + pipe_category = RPD_SUPPLY_PIPING /datum/pipes/atmospheric/bent/supply - pipename = "Bent supply pipe" - pipeid = PIPE_SUPPLY_BENT - category = RPD_SUPPLY_PIPING + pipe_name = "Bent supply pipe" + pipe_id = PIPE_SUPPLY_BENT + pipe_category = RPD_SUPPLY_PIPING /datum/pipes/atmospheric/manifold/supply - pipename = "Supply T-manifold" - pipeid = PIPE_SUPPLY_MANIFOLD - category = RPD_SUPPLY_PIPING + pipe_name = "Supply T-manifold" + pipe_id = PIPE_SUPPLY_MANIFOLD + pipe_category = RPD_SUPPLY_PIPING /datum/pipes/atmospheric/manifold4w/supply - pipename = "4-way supply manifold" - pipeid = PIPE_SUPPLY_MANIFOLD4W - category = RPD_SUPPLY_PIPING + pipe_name = "4-way supply manifold" + pipe_id = PIPE_SUPPLY_MANIFOLD4W + pipe_category = RPD_SUPPLY_PIPING /datum/pipes/atmospheric/cap/supply - pipename = "Supply pipe cap" - pipeid = PIPE_SUPPLY_CAP - category = RPD_SUPPLY_PIPING + pipe_name = "Supply pipe cap" + pipe_id = PIPE_SUPPLY_CAP + pipe_category = RPD_SUPPLY_PIPING //Scrubbers pipes /datum/pipes/atmospheric/simple/scrubbers - pipename = "Straight scrubbers pipe" - pipeid = PIPE_SCRUBBERS_STRAIGHT - category = RPD_SCRUBBERS_PIPING + pipe_name = "Straight scrubbers pipe" + pipe_id = PIPE_SCRUBBERS_STRAIGHT + pipe_category = RPD_SCRUBBERS_PIPING /datum/pipes/atmospheric/bent/scrubbers - pipename = "Bent scrubbers pipe" - pipeid = PIPE_SCRUBBERS_BENT - category = RPD_SCRUBBERS_PIPING + pipe_name = "Bent scrubbers pipe" + pipe_id = PIPE_SCRUBBERS_BENT + pipe_category = RPD_SCRUBBERS_PIPING /datum/pipes/atmospheric/manifold/scrubbers - pipename = "Scrubbers T-manifold" - pipeid = PIPE_SCRUBBERS_MANIFOLD - category = RPD_SCRUBBERS_PIPING + pipe_name = "Scrubbers T-manifold" + pipe_id = PIPE_SCRUBBERS_MANIFOLD + pipe_category = RPD_SCRUBBERS_PIPING /datum/pipes/atmospheric/manifold4w/scrubbers - pipename = "4-way scrubbers manifold" - pipeid = PIPE_SCRUBBERS_MANIFOLD4W - category = RPD_SCRUBBERS_PIPING + pipe_name = "4-way scrubbers manifold" + pipe_id = PIPE_SCRUBBERS_MANIFOLD4W + pipe_category = RPD_SCRUBBERS_PIPING /datum/pipes/atmospheric/cap/scrubbers - pipename = "Scrubbers pipe cap" - pipeid = PIPE_SCRUBBERS_CAP - category = RPD_SCRUBBERS_PIPING + pipe_name = "Scrubbers pipe cap" + pipe_id = PIPE_SCRUBBERS_CAP + pipe_category = RPD_SCRUBBERS_PIPING //Devices /datum/pipes/atmospheric/upa - pipename = "Universal pipe adapter" - pipeid = PIPE_UNIVERSAL + pipe_name = "Universal pipe adapter" + pipe_id = PIPE_UNIVERSAL orientations = 2 - previewicon = "universal" - category = RPD_DEVICES + pipe_icon = "universal" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/connector - pipename = "Connector" - pipeid = PIPE_CONNECTOR + pipe_name = "Connector" + pipe_id = PIPE_CONNECTOR orientations = 4 - previewicon = "connector" - category = RPD_DEVICES + pipe_icon = "connector" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/unaryvent - pipename = "Unary vent" - pipeid = PIPE_UVENT + pipe_name = "Unary vent" + pipe_id = PIPE_UVENT orientations = 4 - previewicon = "uvent" - category = RPD_DEVICES + pipe_icon = "uvent" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/scrubber - pipename = "Scrubber" - pipeid = PIPE_SCRUBBER + pipe_name = "Scrubber" + pipe_id = PIPE_SCRUBBER orientations = 4 - previewicon = "scrubber" - category = RPD_DEVICES + pipe_icon = "scrubber" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/pump - pipename = "Gas pump" - pipeid = PIPE_PUMP + pipe_name = "Gas pump" + pipe_id = PIPE_PUMP orientations = 4 - previewicon = "pump" - category = RPD_DEVICES + pipe_icon = "pump" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/volume_pump - pipename = "Volume pump" - pipeid = PIPE_VOLUME_PUMP + pipe_name = "Volume pump" + pipe_id = PIPE_VOLUME_PUMP orientations = 4 - previewicon = "volumepump" - category = RPD_DEVICES + pipe_icon = "volumepump" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/gate - pipename = "Passive gate" - pipeid = PIPE_PASSIVE_GATE + pipe_name = "Passive gate" + pipe_id = PIPE_PASSIVE_GATE orientations = 4 - previewicon = "passivegate" - category = RPD_DEVICES + pipe_icon = "passivegate" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/filter - pipename = "Gas filter" - pipeid = PIPE_GAS_FILTER + pipe_name = "Gas filter" + pipe_id = PIPE_GAS_FILTER orientations = 4 - previewicon = "filter" - category = RPD_DEVICES + pipe_icon = "filter" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/mixer - pipename = "Gas mixer" - pipeid = PIPE_GAS_MIXER + pipe_name = "Gas mixer" + pipe_id = PIPE_GAS_MIXER orientations = 4 - previewicon = "mixer" - category = RPD_DEVICES + pipe_icon = "mixer" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/sensor - pipename = "Gas sensor" - pipeid = PIPE_GAS_SENSOR + pipe_name = "Gas sensor" + pipe_id = PIPE_GAS_SENSOR orientations = 1 - previewicon = "sensor" - category = RPD_DEVICES + pipe_icon = "sensor" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/meter - pipename = "Gas meter" - pipeid = PIPE_METER + pipe_name = "Gas meter" + pipe_id = PIPE_METER orientations = 1 - previewicon = "meter" - category = RPD_DEVICES + pipe_icon = "meter" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/passive_vent - pipename = "Passive vent" - pipeid = PIPE_PASV_VENT + pipe_name = "Passive vent" + pipe_id = PIPE_PASV_VENT orientations = 4 - previewicon = "passive vent" - category = RPD_DEVICES + pipe_icon = "passive vent" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/dual_vent_pump - pipename = "Dual-port vent pump" - pipeid = PIPE_DP_VENT + pipe_name = "Dual-port vent pump" + pipe_id = PIPE_DP_VENT orientations = 2 - previewicon = "dual-port vent" - category = RPD_DEVICES + pipe_icon = "dual-port vent" + pipe_category = RPD_DEVICES /datum/pipes/atmospheric/injector - pipename = "Air injector" - pipeid = PIPE_INJECTOR + pipe_name = "Air injector" + pipe_id = PIPE_INJECTOR orientations = 4 - previewicon = "injector" - category = RPD_DEVICES + pipe_icon = "injector" + pipe_category = RPD_DEVICES //Heat exchange pipes /datum/pipes/atmospheric/he - pipename = "Straight pipe" - pipeid = PIPE_HE_STRAIGHT + pipe_name = "Straight pipe" + pipe_id = PIPE_HE_STRAIGHT orientations = 2 - previewicon = "he" - category = RPD_HEAT_PIPING + pipe_icon = "he" + pipe_category = RPD_HEAT_PIPING /datum/pipes/atmospheric/he/bent - pipename = "Bent pipe" - pipeid = PIPE_HE_BENT + pipe_name = "Bent pipe" + pipe_id = PIPE_HE_BENT orientations = 4 bendy = TRUE /datum/pipes/atmospheric/he_junction - pipename = "Junction" - pipeid = PIPE_JUNCTION + pipe_name = "Junction" + pipe_id = PIPE_JUNCTION orientations = 4 - previewicon = "junction" - category = RPD_HEAT_PIPING + pipe_icon = "junction" + pipe_category = RPD_HEAT_PIPING /datum/pipes/atmospheric/heat_exchanger - pipename = "Heat exchanger" - pipeid = PIPE_HEAT_EXCHANGE + pipe_name = "Heat exchanger" + pipe_id = PIPE_HEAT_EXCHANGE orientations = 4 - previewicon = "heunary" - category = RPD_HEAT_PIPING + pipe_icon = "heunary" + pipe_category = RPD_HEAT_PIPING //DISPOSALS PIPES /datum/pipes/disposal/straight - pipename = "Straight pipe" - pipeid = PIPE_DISPOSALS_STRAIGHT + pipe_name = "Straight pipe" + pipe_id = PIPE_DISPOSALS_STRAIGHT orientations = 2 - previewicon = "conpipe-s" + pipe_icon = "conpipe-s" /datum/pipes/disposal/bent - pipename = "Bent pipe" - pipeid = PIPE_DISPOSALS_BENT + pipe_name = "Bent pipe" + pipe_id = PIPE_DISPOSALS_BENT orientations = 4 - previewicon = "conpipe-c" + pipe_icon = "conpipe-c" /datum/pipes/disposal/junction - pipename = "Junction" - pipeid = PIPE_DISPOSALS_JUNCTION + pipe_name = "Junction" + pipe_id = PIPE_DISPOSALS_JUNCTION orientations = 4 - previewicon = "conpipe-j1" + pipe_icon = "conpipe-j1" /datum/pipes/disposal/y_junction - pipename = "Y-junction" - pipeid = PIPE_DISPOSALS_Y_JUNCTION + pipe_name = "Y-junction" + pipe_id = PIPE_DISPOSALS_Y_JUNCTION orientations = 4 - previewicon = "conpipe-y" + pipe_icon = "conpipe-y" /datum/pipes/disposal/trunk - pipename = "Trunk" - pipeid = PIPE_DISPOSALS_TRUNK + pipe_name = "Trunk" + pipe_id = PIPE_DISPOSALS_TRUNK orientations = 4 - previewicon = "conpipe-t" + pipe_icon = "conpipe-t" /datum/pipes/disposal/bin - pipename = "Bin" - pipeid = PIPE_DISPOSALS_BIN + pipe_name = "Bin" + pipe_id = PIPE_DISPOSALS_BIN orientations = 1 - previewicon = "condisposal" + pipe_icon = "condisposal" /datum/pipes/disposal/outlet - pipename = "Outlet" - pipeid = PIPE_DISPOSALS_OUTLET + pipe_name = "Outlet" + pipe_id = PIPE_DISPOSALS_OUTLET orientations = 4 - previewicon = "outlet" + pipe_icon = "outlet" /datum/pipes/disposal/chute - pipename = "Chute" - pipeid = PIPE_DISPOSALS_CHUTE + pipe_name = "Chute" + pipe_id = PIPE_DISPOSALS_CHUTE orientations = 4 - previewicon = "intake" + pipe_icon = "intake" #undef RPD_ATMOS #undef RPD_DISPOSAL diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index 5efa881b861..c7f16776a57 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -25,7 +25,7 @@ var/lastused var/iconrotation = 0 //Used to orient icons and pipes var/mode = RPD_ATMOS_MODE //Disposals, atmospherics, etc. - var/pipetype = RPD_ATMOS_PIPING//For nanoUI menus, this is a subtype of pipes e.g. scrubbers pipes, devices + var/pipe_category = RPD_ATMOS_PIPING//For nanoUI menus, this is a subtype of pipes e.g. scrubbers pipes, devices var/whatpipe = PIPE_SIMPLE_STRAIGHT //What kind of atmos pipe is it? var/whatdpipe = PIPE_DISPOSALS_STRAIGHT //What kind of disposals pipe is it? var/spawndelay = RPD_COOLDOWN_TIME @@ -50,7 +50,17 @@ if(delay) lastused = world.time +/obj/item/rpd/proc/can_dispense_pipe(var/pipe_id, var/pipe_type) //Returns TRUE if this is a legit pipe we can dispense, otherwise returns FALSE + for(var/list/L in GLOB.construction_pipe_list) + if(pipe_type != L["pipe_type"]) //Sometimes pipes in different categories have the same pipe_id, so we need to skip anything not in the category we want + continue + if(pipe_id == L["pipe_id"]) //Found the pipe, we can dispense it + return TRUE + /obj/item/rpd/proc/create_atmos_pipe(mob/user, turf/T) //Make an atmos pipe, meter, or gas sensor + if(!can_dispense_pipe(whatpipe, RPD_ATMOS_MODE)) + to_chat(user, "[src] beeps, \"ERROR\" ") //Damn dirty apes -- I mean hackers + return var/obj/item/pipe/P if(whatpipe == PIPE_GAS_SENSOR) P = new /obj/item/pipe_gsensor(T) @@ -70,6 +80,9 @@ activate_rpd(TRUE) /obj/item/rpd/proc/create_disposals_pipe(mob/user, turf/T) //Make a disposals pipe / construct + if(!can_dispense_pipe(whatdpipe, RPD_DISPOSALS_MODE)) + to_chat(user, "[src] beeps, \"ERROR\" ") + return var/obj/structure/disposalconstruct/P = new(T, whatdpipe, iconrotation) if(!iconrotation) //Automatic rotation P.dir = user.dir @@ -125,11 +138,11 @@ var/list/mainmenu = list( list("category" = "Flip", "mode" = RPD_FLIP_MODE, "icon" = "exchange"), list("category" = "Recycle", "mode" = RPD_DELETE_MODE, "icon" = "trash")) var/list/pipemenu = list( - list("pipecategory" = "Normal", "pipemode" = RPD_ATMOS_PIPING), - list("pipecategory" = "Supply", "pipemode" = RPD_SUPPLY_PIPING), - list("pipecategory" = "Scrubber", "pipemode" = RPD_SCRUBBERS_PIPING), - list("pipecategory" = "Devices", "pipemode" = RPD_DEVICES), - list("pipecategory" = "Heat exchange", "pipemode" = RPD_HEAT_PIPING)) + list("category" = "Normal", "pipemode" = RPD_ATMOS_PIPING), + list("category" = "Supply", "pipemode" = RPD_SUPPLY_PIPING), + list("category" = "Scrubber", "pipemode" = RPD_SCRUBBERS_PIPING), + list("category" = "Devices", "pipemode" = RPD_DEVICES), + list("category" = "Heat exchange", "pipemode" = RPD_HEAT_PIPING)) //NanoUI stuff @@ -150,7 +163,7 @@ var/list/pipemenu = list( data["mode"] = mode data["pipelist"] = GLOB.construction_pipe_list data["pipemenu"] = pipemenu - data["pipetype"] = pipetype + data["pipe_category"] = pipe_category data["whatdpipe"] = whatdpipe data["whatpipe"] = whatpipe return data @@ -163,8 +176,8 @@ var/list/pipemenu = list( whatpipe = text2num(sanitize(href_list["whatpipe"])) else if(href_list["whatdpipe"]) whatdpipe = text2num(sanitize(href_list["whatdpipe"])) - else if(href_list["pipetype"]) - pipetype = text2num(sanitize(href_list["pipetype"])) + else if(href_list["pipe_category"]) + pipe_category = text2num(sanitize(href_list["pipe_category"])) else if(href_list["mode"]) mode = text2num(sanitize(href_list["mode"])) else diff --git a/nano/templates/rpd.tmpl b/nano/templates/rpd.tmpl index f08a5ff02b4..6a9c2ccb517 100644 --- a/nano/templates/rpd.tmpl +++ b/nano/templates/rpd.tmpl @@ -11,19 +11,19 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm

Pipe type:

{{for data.pipemenu}} - {{:helper.link(value.pipecategory, null, {pipetype: value.pipemode}, data.pipetype == value.pipemode ? "linkOn" : null)}} + {{:helper.link(value.category, null, {pipe_category: value.pipemode}, data.pipe_category == value.pipemode ? "linkOn" : null)}} {{/for}}

Available pipes:

{{for data.pipelist}} - {{if value.atmosordisposals == 1 && value.category == data.pipetype}} -
{{:helper.link(value.pipename, "arrow-right", {whatpipe: value.pipeid}, data.whatpipe == value.pipeid ? "linkOn" : null)}}
+ {{if value.pipe_type == 1 && value.pipe_category == data.pipe_category}} +
{{:helper.link(value.pipe_name, "arrow-right", {whatpipe: value.pipe_id}, data.whatpipe == value.pipe_id ? "linkOn" : null)}}
{{/if}} {{/for}}
{{for data.pipelist}} - {{if value.atmosordisposals != 1 || value.pipeid != data.whatpipe || value.orientations == 1}} + {{if value.pipe_type != 1 || value.pipe_id != data.whatpipe || value.orientations == 1}} {{continue;}} {{/if}}
@@ -33,37 +33,37 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm {{if value.bendy}}
{{:helper.link("", "arrow-right", {iconrotation: 1}, data.iconrotation == 1 ? "linkOn" : null)}} - +
{{:helper.link("", "arrow-right", {iconrotation: 4}, data.iconrotation == 4 ? "linkOn" : null)}} - +
{{:helper.link("", "arrow-right", {iconrotation: 2}, data.iconrotation == 2 ? "linkOn" : null)}} - +
{{:helper.link("", "arrow-right", {iconrotation: 8}, data.iconrotation == 8 ? "linkOn" : null)}} - +
{{else}}
{{:helper.link("", "arrow-right", {iconrotation: 1}, data.iconrotation == 1 ? "linkOn" : null)}} - +
{{:helper.link("", "arrow-right", {iconrotation: 4}, data.iconrotation == 4 ? "linkOn" : null)}} - +
{{if value.orientations == 4}}
{{:helper.link("", "arrow-right", {iconrotation: 2}, data.iconrotation == 2 ? "linkOn" : null)}} - +
{{:helper.link("", "arrow-right", {iconrotation: 8}, data.iconrotation == 8 ? "linkOn" : null)}} - +
{{/if}} {{/if}} @@ -73,13 +73,13 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm

Available pipes:

{{for data.pipelist}} - {{if value.atmosordisposals == 2}} -
{{:helper.link(value.pipename, "arrow-right", {whatdpipe: value.pipeid}, data.whatdpipe == value.pipeid ? "linkOn" : null)}}
+ {{if value.pipe_type == 2}} +
{{:helper.link(value.pipe_name, "arrow-right", {whatdpipe: value.pipe_id}, data.whatdpipe == value.pipe_id ? "linkOn" : null)}}
{{/if}} {{/for}}
{{for data.pipelist}} - {{if value.atmosordisposals != 2 || value.pipeid != data.whatdpipe || value.orientations == 1}} + {{if value.pipe_type != 2 || value.pipe_id != data.whatdpipe || value.orientations == 1}} {{continue;}} {{/if}}
@@ -88,20 +88,20 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm
{{:helper.link("", "arrow-right", {iconrotation: 1}, data.iconrotation == 1 ? "linkOn" : null)}} - +
{{:helper.link("", "arrow-right", {iconrotation: 4}, data.iconrotation == 4 ? "linkOn" : null)}} - +
{{if value.orientations == 4}}
{{:helper.link("", "arrow-right", {iconrotation: 2}, data.iconrotation == 2 ? "linkOn" : null)}} - +
{{:helper.link("", "arrow-right", {iconrotation: 8}, data.iconrotation == 8 ? "linkOn" : null)}} - +
{{/if}}
From b6272b50fc2f1f4977589266d7435412651b2c3b Mon Sep 17 00:00:00 2001 From: Anasari <13087574+Anasari@users.noreply.github.com> Date: Wed, 13 Jun 2018 13:41:27 +0800 Subject: [PATCH 18/99] Changes the code to work more flexibly --- code/game/objects/items/stacks/medical.dm | 38 ++++++++++++++--------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 846da0b61aa..c8852dd2d3a 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -89,21 +89,29 @@ var/nrembrute = rembrute var/nremburn = remburn affecting.heal_damage(heal_brute, heal_burn) - if(affecting.body_part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, UPPER_TORSO, LOWER_TORSO)) - for(var/obj/item/organ/external/E in affecting.children) - if(rembrute <= 0 && remburn <= 0) // Make sure there's actually overheal left and the organ is damaged before bothering - break - else if(E.status && ORGAN_ROBOT || E.open) // Ignore robotic or open limb - continue - else if(!E.brute_dam && !E.burn_dam) // Ignore undamaged limb - continue - nrembrute = rembrute - E.brute_dam // Deduct the healed damage from the remain - nremburn = remburn - E.burn_dam - E.heal_damage(rembrute, remburn) - rembrute = nrembrute - remburn = nremburn - user.visible_message("[user] [healverb]s the wounds on [H]'s [E.name] with the remaining medication.", \ - "You [healverb] the wounds on [H]'s [E.name] with the remaining medication." ) + var/list/achildlist = affecting.children.Copy() + var/parenthealed = 0 + while(rembrute + remburn > 0): // Don't bother if there's not enough leftover heal + var/obj/item/organ/external/E + if(achildlist.len): + E = pick(achildlist) // Pick a random children + achildlist -= E + else if(affecting.parent && !parenthealed): // If there's a parent and no healing attempt was made on it + E = affecting.parent + parenthealed = 1 + else: + break // If the organ have no child left and no parent / parent healed, break + if(E.status & ORGAN_ROBOT || E.open) // Ignore robotic or open limb + continue + else if(!E.brute_dam && !E.burn_dam) // Ignore undamaged limb + continue + nrembrute = rembrute - E.brute_dam // Deduct the healed damage from the remain + nremburn = remburn - E.burn_dam + E.heal_damage(rembrute, remburn) + rembrute = nrembrute + remburn = nremburn + user.visible_message("[user] [healverb]s the wounds on [H]'s [E.name] with the remaining medication.", \ + "You [healverb] the wounds on [H]'s [E.name] with the remaining medication." ) //Bruise Packs// From 1beb0c275ed32645c16a5f6332fad9c734fe4268 Mon Sep 17 00:00:00 2001 From: Anasari <13087574+Anasari@users.noreply.github.com> Date: Sun, 1 Jul 2018 15:38:05 +0800 Subject: [PATCH 19/99] Fixes colons and other things --- code/game/objects/items/stacks/medical.dm | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index c8852dd2d3a..856e2c9a0eb 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -84,22 +84,21 @@ user.visible_message("[user] [healverb]s the wounds on [H]'s [affecting.name].", \ "You [healverb] the wounds on [H]'s [affecting.name]." ) - var/rembrute = max(0, heal_brute - affecting.brute_dam) - var/remburn = max(0, heal_burn - affecting.burn_dam) + var/rembrute = max(0, heal_brute - affecting.brute_dam) // Maxed with 0 since heal_damage let you pass in a negative value + var/remburn = max(0, heal_burn - affecting.burn_dam) // And deduct it from their health (aka deal damage) var/nrembrute = rembrute - var/nremburn = remburn + var/nremburn = remburn affecting.heal_damage(heal_brute, heal_burn) var/list/achildlist = affecting.children.Copy() - var/parenthealed = 0 - while(rembrute + remburn > 0): // Don't bother if there's not enough leftover heal + var/parenthealed = FALSE + while(rembrute + remburn > 0) // Don't bother if there's not enough leftover heal var/obj/item/organ/external/E - if(achildlist.len): - E = pick(achildlist) // Pick a random children - achildlist -= E - else if(affecting.parent && !parenthealed): // If there's a parent and no healing attempt was made on it + if(achildlist.len) + E = pick_n_take(achildlist) // Pick a random children and then remove it from the list + else if(affecting.parent && !parenthealed) // If there's a parent and no healing attempt was made on it E = affecting.parent - parenthealed = 1 - else: + parenthealed = TRUE + else break // If the organ have no child left and no parent / parent healed, break if(E.status & ORGAN_ROBOT || E.open) // Ignore robotic or open limb continue From 0fbec396c84183cd23b56142f990a9fd7d0f3904 Mon Sep 17 00:00:00 2001 From: Anasari <13087574+Anasari@users.noreply.github.com> Date: Sun, 1 Jul 2018 16:54:06 +0800 Subject: [PATCH 20/99] Fixes --- code/game/objects/items/stacks/medical.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 856e2c9a0eb..92faa5cebfb 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -104,8 +104,8 @@ continue else if(!E.brute_dam && !E.burn_dam) // Ignore undamaged limb continue - nrembrute = rembrute - E.brute_dam // Deduct the healed damage from the remain - nremburn = remburn - E.burn_dam + nrembrute = max(0, rembrute - E.brute_dam) // Deduct the healed damage from the remain + nremburn = max(0, remburn - E.burn_dam) E.heal_damage(rembrute, remburn) rembrute = nrembrute remburn = nremburn From edbac20f4adcdab1d8c2ab8c0048ca7bbdccf90a Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Mon, 2 Jul 2018 17:03:02 -0400 Subject: [PATCH 21/99] maybe dis? --- code/modules/events/carp_migration.dm | 11 +++++--- code/modules/events/event_container.dm | 2 +- code/modules/events/koi_mirgration.dm | 28 ++++++++----------- .../simple_animal/hostile/retaliate/fish.dm | 9 ++++-- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index abab5c39254..34a7743b082 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -2,6 +2,10 @@ announceWhen = 50 endWhen = 900 + var/list/spawned_mobs = list( + /mob/living/simple_animal/hostile/carp = 95, + /mob/living/simple_animal/hostile/carp/megacarp = 5, + ) var/list/spawned_carp = list() /datum/event/carp_migration/setup() @@ -17,6 +21,7 @@ event_announcement.Announce(announcement, "Lifesign Alert") /datum/event/carp_migration/start() + if(severity == EVENT_LEVEL_MAJOR) spawn_fish(landmarks_list.len) else if(severity == EVENT_LEVEL_MODERATE) @@ -32,14 +37,12 @@ spawn_locations.Add(C.loc) spawn_locations = shuffle(spawn_locations) num_groups = min(num_groups, spawn_locations.len) - + var/i = 1 while(i <= num_groups) var/group_size = rand(group_size_min, group_size_max) for(var/j = 1, j <= group_size, j++) - var/carptype = /mob/living/simple_animal/hostile/carp - if(prob(5)) - carptype = /mob/living/simple_animal/hostile/carp/megacarp + var/carptype = pickweight(spawned_mobs) spawned_carp.Add(new carptype(spawn_locations[i])) i++ diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 45bf962178b..888e2b38dd1 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -140,7 +140,7 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Sentience", /datum/event/sentience, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 15, is_one_shot = TRUE), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Koi School", /datum/event/koi_migration, 80,) + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Koi School", /datum/event/carp_migration/koi, 80,) ) /datum/event_container/moderate diff --git a/code/modules/events/koi_mirgration.dm b/code/modules/events/koi_mirgration.dm index bb986a0f899..6372d0ea1cd 100644 --- a/code/modules/events/koi_mirgration.dm +++ b/code/modules/events/koi_mirgration.dm @@ -1,20 +1,14 @@ -/datum/event/koi_migration - announceWhen = 50 - endWhen = 900 +/datum/event/carp_migration + spawned_mobs = list( + /mob/living/simple_animal/hostile/retaliate/carp/koi = 95, + /mob/living/simple_animal/hostile/retaliate/carp/koi/honk = 2, + ) - var/list/spawned_koi = list() -/datum/event/koi_migration/setup() - announceWhen = rand(40, 60) - endWhen = rand(600,1200) - -/datum/event/koi_migration/announce() - event_announcement.Announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") - -/datum/event/koi_migration/start() +/datum/event/carp_migration/koi/start() spawn_fish(landmarks_list.len) -/datum/event/koi_migration/proc/spawn_fish(var/num_groups, var/group_size_min=3, var/group_size_max=5) +/datum/event/carp_migration/koi/spawn_fish(var/num_groups, var/group_size_min=3, var/group_size_max=5) var/list/spawn_locations = list() for(var/obj/effect/landmark/C in landmarks_list) @@ -27,12 +21,12 @@ while(i <= num_groups) var/group_size = rand(group_size_min, group_size_max) for(var/j = 1, j <= group_size, j++) - var/mob/living/simple_animal/hostile/retaliate/carp/koi/K = new(spawn_locations[i]) - spawned_koi.Add(K) + var/carptype = pickweight(spawned_mobs) + spawned_carp.Add(new carptype(spawn_locations[i])) i++ -/datum/event/koi_migration/end() - for(var/mob/living/simple_animal/hostile/retaliate/carp/koi/C in spawned_koi) +/datum/event/carp_migration/koi/end() + for(var/mob/living/simple_animal/hostile/retaliate/carp/koi/C in spawned_carp) if(!C.stat) var/turf/T = get_turf(C) if(istype(T, /turf/space)) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm index 28a8826362f..7b10c0e828a 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm @@ -53,12 +53,15 @@ /mob/living/simple_animal/hostile/retaliate/carp/koi/New() ..() var/koinum = rand(1, 4) - if(prob(1)) - koinum = 5 icon_state = "koi[koinum]" icon_living = "koi[koinum]" icon_dead = "koi[koinum]-dead" /mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(var/movement_dir) - return TRUE \ No newline at end of file + return TRUE + +/mob/living/simple_animal/hostile/retaliate/carp/koi/honk + icon_state = "koi5" + icon_living = "koi5" + icon_dead = "koi5-dead" \ No newline at end of file From 9422d3a846ed753482b4f1939f4e58dfa0bc4be8 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 4 Jul 2018 00:12:54 -0400 Subject: [PATCH 22/99] Suggested changes --- code/modules/events/carp_migration.dm | 2 +- code/modules/events/koi_mirgration.dm | 26 +------------------------- 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 34a7743b082..cd9b0c02206 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -47,7 +47,7 @@ i++ /datum/event/carp_migration/end() - for(var/mob/living/simple_animal/hostile/carp/C in spawned_carp) + for(var/mob/living/simple_animal/hostile/C in spawned_carp) if(!C.stat) var/turf/T = get_turf(C) if(istype(T, /turf/space)) diff --git a/code/modules/events/koi_mirgration.dm b/code/modules/events/koi_mirgration.dm index 6372d0ea1cd..868457721b2 100644 --- a/code/modules/events/koi_mirgration.dm +++ b/code/modules/events/koi_mirgration.dm @@ -6,28 +6,4 @@ /datum/event/carp_migration/koi/start() - spawn_fish(landmarks_list.len) - -/datum/event/carp_migration/koi/spawn_fish(var/num_groups, var/group_size_min=3, var/group_size_max=5) - var/list/spawn_locations = list() - - for(var/obj/effect/landmark/C in landmarks_list) - if(C.name == "carpspawn") - spawn_locations.Add(C.loc) - spawn_locations = shuffle(spawn_locations) - num_groups = min(num_groups, spawn_locations.len) - - var/i = 1 - while(i <= num_groups) - var/group_size = rand(group_size_min, group_size_max) - for(var/j = 1, j <= group_size, j++) - var/carptype = pickweight(spawned_mobs) - spawned_carp.Add(new carptype(spawn_locations[i])) - i++ - -/datum/event/carp_migration/koi/end() - for(var/mob/living/simple_animal/hostile/retaliate/carp/koi/C in spawned_carp) - if(!C.stat) - var/turf/T = get_turf(C) - if(istype(T, /turf/space)) - qdel(C) + spawn_fish(landmarks_list.len) \ No newline at end of file From dd09a6b905d71fc777c2db3c99962bad7e8ababf Mon Sep 17 00:00:00 2001 From: datlo Date: Thu, 12 Jul 2018 15:06:30 +0100 Subject: [PATCH 23/99] Add sterile surgery gear to abductors Fixes #9199 Provides abductors with two sterile masks, two pairs of combat gloves, and one space cleaner (scientist only). Updates the dissection guide to remind abductors to keep their work area sterile. --- code/game/gamemodes/miniantags/abduction/abduction.dm | 4 +++- code/game/gamemodes/miniantags/abduction/abduction_gear.dm | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 1c6dc7d3022..dacab9344c0 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -232,6 +232,8 @@ agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes) agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit agent.equip_to_slot_or_del(new /obj/item/storage/backpack(agent), slot_back) + agent.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat, slot_gloves) + agent.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical, slot_in_backpack) /datum/game_mode/abduction/proc/get_team_console(team) var/obj/machinery/abductor/console/console @@ -269,7 +271,7 @@ console.gizmo = G G.console = console scientist.equip_to_slot_or_del(G, slot_in_backpack) - + scientist.equip_to_slot_or_del(new /obj/item/reagent_containers/spray/cleaner, slot_in_backpack) var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(scientist) beamplant.implant(scientist) scientist.update_icons() diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 9a43df56926..82614843882 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -258,7 +258,7 @@ name = "Dissection Guide" icon_state = "alienpaper_words" info = {"Dissection for Dummies
- + Always keep your dissection area sterile, and wear gloves and mask while dissection is in-progress.

1.Acquire fresh specimen.
2.Put the specimen on operating table.
From 8b984494e14d80e5cb4a812f74b0d275b7f3af8b Mon Sep 17 00:00:00 2001 From: Citinited Date: Mon, 2 Jul 2018 21:30:34 +0100 Subject: [PATCH 24/99] In-game explosion logging --- code/game/machinery/doppler_array.dm | 107 ++++++++++++++++++++++----- nano/templates/doppler_array.tmpl | 23 ++++++ 2 files changed, 112 insertions(+), 18 deletions(-) create mode 100644 nano/templates/doppler_array.tmpl diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 527ed23639c..debb041e3fc 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -8,6 +8,21 @@ var/list/doppler_arrays = list() density = 1 anchored = 1 atom_say_verb = "states coldly" + var/list/logged_explosions = list() + +/datum/explosion_log + var/logged_time + var/epicenter + var/actual_size_message + var/theoretical_size_message + +/datum/explosion_log/New(var/log_time, var/log_epicenter, var/log_actual_size_message, var/log_theoretical_size_message) + ..() + logged_time = log_time + epicenter = log_epicenter + actual_size_message = log_actual_size_message + theoretical_size_message = log_theoretical_size_message + UID() /obj/machinery/doppler_array/New() ..() @@ -34,53 +49,76 @@ var/list/doppler_arrays = list() else return ..() -/obj/machinery/doppler_array/verb/rotate() +/obj/machinery/doppler_array/attack_hand(mob/user) + if(..()) + return + ui_interact(user) + +/obj/machinery/doppler_array/attack_ghost(mob/user) + ui_interact(user) + +/obj/machinery/doppler_array/AltClick(mob/user) + rotate(user) + +/obj/machinery/doppler_array/verb/rotate(mob/user) set name = "Rotate Tachyon-doppler Dish" set category = "Object" set src in oview(1) - if(!usr || !isturf(usr.loc)) + if(user.incapacitated()) return - if(usr.stat || usr.restrained() || !usr.canmove) + if(!Adjacent(user)) return - src.dir = turn(src.dir, 90) - return + if(!user.IsAdvancedToolUser()) + to_chat(user, "You don't have the dexterity to do that!") + return + dir = turn(dir, 90) + to_chat(user, "You rotate [src].") /obj/machinery/doppler_array/proc/sense_explosion(var/x0,var/y0,var/z0,var/devastation_range,var/heavy_impact_range,var/light_impact_range, var/took,var/orig_dev_range,var/orig_heavy_range,var/orig_light_range) - if(stat & NOPOWER) return - if(z != z0) return + if(stat & NOPOWER) + return + if(z != z0) + return var/dx = abs(x0-x) var/dy = abs(y0-y) var/distance var/direct + var/capped = FALSE if(dx > dy) distance = dx - if(x0 > x) direct = EAST - else direct = WEST + if(x0 > x) + direct = EAST + else + direct = WEST else distance = dy - if(y0 > y) direct = NORTH - else direct = SOUTH - - if(distance > 100) return - if(!(direct & dir)) return + if(y0 > y) + direct = NORTH + else + direct = SOUTH + if(distance > 100) + return + if(!(direct & dir)) + return var/list/messages = list("Explosive disturbance detected.", \ "Epicenter at: grid ([x0],[y0]). Temporal displacement of tachyons: [took] seconds.", \ "Factual: Epicenter radius: [devastation_range]. Outer radius: [heavy_impact_range]. Shockwave radius: [light_impact_range].") - // If the bomb was capped, say it's theoretical size. + // If the bomb was capped, say its theoretical size. if(devastation_range < orig_dev_range || heavy_impact_range < orig_heavy_range || light_impact_range < orig_light_range) + capped = TRUE messages += "Theoretical: Epicenter radius: [orig_dev_range]. Outer radius: [orig_heavy_range]. Shockwave radius: [orig_light_range]." - + logged_explosions.Insert(1, new /datum/explosion_log(station_time_timestamp(), "[x0],[y0]", "[devastation_range], [heavy_impact_range], [light_impact_range]", capped ? "[orig_dev_range], [orig_heavy_range], [orig_light_range]" : "n/a")) //Newer logs appear first + messages += "Event successfully logged in internal database." for(var/message in messages) atom_say(message) - /obj/machinery/doppler_array/power_change() if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" @@ -90,4 +128,37 @@ var/list/doppler_arrays = list() stat &= ~NOPOWER else icon_state = "[initial(icon_state)]-off" - stat |= NOPOWER \ No newline at end of file + stat |= NOPOWER + +/obj/machinery/doppler_array/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "doppler_array.tmpl", "Tachyon-doppler array", 500, 650) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/doppler_array/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) + var/data[0] + var/list/explosion_data = list() + for(var/datum/explosion_log/E in logged_explosions) + explosion_data += list(list( + "logged_time" = E.logged_time, + "epicenter" = E.epicenter, + "actual_size_message" = E.actual_size_message, + "theoretical_size_message" = E.theoretical_size_message, + "unique_datum_id" = E.unique_datum_id)) + data["explosion_data"] = explosion_data + return data + +/obj/machinery/doppler_array/Topic(href, href_list) + if(..()) + return + if(href_list["log_to_delete"]) + var/log_to_delete = sanitize(href_list["log_to_delete"]) + for(var/datum/D in logged_explosions) + if(D.unique_datum_id == log_to_delete) + logged_explosions -= D + qdel(D) + to_chat(usr, "Log deletion successful.") + break + SSnanoui.update_uis(src) diff --git a/nano/templates/doppler_array.tmpl b/nano/templates/doppler_array.tmpl new file mode 100644 index 00000000000..2a523a33c7c --- /dev/null +++ b/nano/templates/doppler_array.tmpl @@ -0,0 +1,23 @@ +

Logged explosions:

+{{if data.explosion_data == 0}} +

No explosions logged this shift.

+{{else}} +
+ Time logged + Epicenter + Actual size + Theoretical size +
+
+ {{for data.explosion_data}} +
+ + {{:value.logged_time}} + {{:value.epicenter}} + {{:value.actual_size_message}} + {{:value.theoretical_size_message}} + {{:helper.link("Delete", "trash", {"log_to_delete": value.unique_datum_id})}} + +
+ {{/for}} +{{/if}} \ No newline at end of file From 8702b9ffc835a9ce6391d505cb181bce49e5a71c Mon Sep 17 00:00:00 2001 From: Citinited Date: Mon, 2 Jul 2018 23:48:20 +0100 Subject: [PATCH 25/99] Printable tachyon-doppler array logs --- code/game/machinery/doppler_array.dm | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index debb041e3fc..8b2c315b910 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -9,6 +9,7 @@ var/list/doppler_arrays = list() anchored = 1 atom_say_verb = "states coldly" var/list/logged_explosions = list() + var/printer_timer /datum/explosion_log var/logged_time @@ -30,6 +31,8 @@ var/list/doppler_arrays = list() /obj/machinery/doppler_array/Destroy() doppler_arrays -= src + for(var/datum/D in logged_explosions) + qdel(D) return ..() /obj/machinery/doppler_array/process() @@ -75,6 +78,53 @@ var/list/doppler_arrays = list() dir = turn(dir, 90) to_chat(user, "You rotate [src].") +/obj/item/paper/explosive_log + name = "explosive log" + info = "

Explosive Log Report

\ + \ + \ + \ + \ + \ + \ + " //NB: the
Time loggedEpicenterActualTheoretical
tag is left open, it is closed later on, when the doppler array adds its data + +/obj/machinery/doppler_array/verb/print_logs(mob/user) + set name = "Print Explosive Logs" + set category = "Object" + set src in oview(1) + + if(user.incapacitated()) + return + if(!Adjacent(user)) + return + if(!user.IsAdvancedToolUser()) + to_chat(user, "You don't have the dexterity to do that!") + return + if(!logged_explosions.len) + atom_say("No logs currently stored in internal database.") + return + if(printer_timer) + to_chat(user, "[src] is already printing something, please wait.") + return + atom_say("Printing explosive log. Standby...") + printer_timer = addtimer(CALLBACK(src, .proc/print), 50) + +/obj/machinery/doppler_array/proc/print() + printer_timer = FALSE + visible_message("[src] rattles off a sheet of paper!") + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) + var/obj/item/paper/explosive_log/P = new(get_turf(src)) + for(var/datum/explosion_log/E in logged_explosions) + P.info += "\ + \ + \ + \ + \ + " + P.info += "
[E.logged_time][E.epicenter][E.actual_size_message][E.theoretical_size_message]

\ + Printed at [station_time_timestamp()]." + /obj/machinery/doppler_array/proc/sense_explosion(var/x0,var/y0,var/z0,var/devastation_range,var/heavy_impact_range,var/light_impact_range, var/took,var/orig_dev_range,var/orig_heavy_range,var/orig_light_range) if(stat & NOPOWER) From 50a96f13c74f0225fdbd79db45451d9ec9889612 Mon Sep 17 00:00:00 2001 From: Citinited Date: Tue, 3 Jul 2018 00:41:11 +0100 Subject: [PATCH 26/99] Explosive log printing is now done via nanoui --- code/game/machinery/doppler_array.dm | 43 ++++++++++++---------------- nano/templates/doppler_array.tmpl | 6 ++-- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 8b2c315b910..9c957954dd9 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -55,6 +55,7 @@ var/list/doppler_arrays = list() /obj/machinery/doppler_array/attack_hand(mob/user) if(..()) return + add_fingerprint(user) ui_interact(user) /obj/machinery/doppler_array/attack_ghost(mob/user) @@ -78,29 +79,7 @@ var/list/doppler_arrays = list() dir = turn(dir, 90) to_chat(user, "You rotate [src].") -/obj/item/paper/explosive_log - name = "explosive log" - info = "

Explosive Log Report

\ - \ - \ - \ - \ - \ - \ - " //NB: the
Time loggedEpicenterActualTheoretical
tag is left open, it is closed later on, when the doppler array adds its data - -/obj/machinery/doppler_array/verb/print_logs(mob/user) - set name = "Print Explosive Logs" - set category = "Object" - set src in oview(1) - - if(user.incapacitated()) - return - if(!Adjacent(user)) - return - if(!user.IsAdvancedToolUser()) - to_chat(user, "You don't have the dexterity to do that!") - return +/obj/machinery/doppler_array/proc/print_explosive_logs(mob/user) if(!logged_explosions.len) atom_say("No logs currently stored in internal database.") return @@ -198,6 +177,7 @@ var/list/doppler_arrays = list() "theoretical_size_message" = E.theoretical_size_message, "unique_datum_id" = E.unique_datum_id)) data["explosion_data"] = explosion_data + data["printer_timer"] = printer_timer return data /obj/machinery/doppler_array/Topic(href, href_list) @@ -211,4 +191,19 @@ var/list/doppler_arrays = list() qdel(D) to_chat(usr, "Log deletion successful.") break - SSnanoui.update_uis(src) + else if(href_list["print_logs"]) + print_explosive_logs(usr) + else + return + SSnanoui.update_uis(src) + +/obj/item/paper/explosive_log + name = "explosive log" + info = "

Explosive Log Report

\ +
\ + \ + \ + \ + \ + \ + " //NB: the
Time loggedEpicenterActualTheoretical
tag is left open, it is closed later on, when the doppler array adds its data diff --git a/nano/templates/doppler_array.tmpl b/nano/templates/doppler_array.tmpl index 2a523a33c7c..49aef551c09 100644 --- a/nano/templates/doppler_array.tmpl +++ b/nano/templates/doppler_array.tmpl @@ -1,4 +1,4 @@ -

Logged explosions:

+

Logged explosions:

{{if data.explosion_data == 0}}

No explosions logged this shift.

{{else}} @@ -20,4 +20,6 @@ {{/for}} -{{/if}} \ No newline at end of file +
+ {{:helper.link("Print all logs", "print", {"print_logs": 'yes'}, data.printer_timer ? 'disabled' : null)}} +{{/if}} From 83f33163cea54a6279fb780fca18eb64f3901a76 Mon Sep 17 00:00:00 2001 From: Citinited Date: Tue, 3 Jul 2018 02:32:44 +0100 Subject: [PATCH 27/99] Better way of handling timers --- code/game/machinery/doppler_array.dm | 10 ++++------ nano/templates/doppler_array.tmpl | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 9c957954dd9..2d48845fe06 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -9,7 +9,6 @@ var/list/doppler_arrays = list() anchored = 1 atom_say_verb = "states coldly" var/list/logged_explosions = list() - var/printer_timer /datum/explosion_log var/logged_time @@ -83,15 +82,14 @@ var/list/doppler_arrays = list() if(!logged_explosions.len) atom_say("No logs currently stored in internal database.") return - if(printer_timer) + if(active_timers) to_chat(user, "[src] is already printing something, please wait.") return atom_say("Printing explosive log. Standby...") - printer_timer = addtimer(CALLBACK(src, .proc/print), 50) + addtimer(CALLBACK(src, .print), 50) /obj/machinery/doppler_array/proc/print() - printer_timer = FALSE - visible_message("[src] rattles off a sheet of paper!") + visible_message("[src] prints a piece of paper!") playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/paper/explosive_log/P = new(get_turf(src)) for(var/datum/explosion_log/E in logged_explosions) @@ -177,7 +175,7 @@ var/list/doppler_arrays = list() "theoretical_size_message" = E.theoretical_size_message, "unique_datum_id" = E.unique_datum_id)) data["explosion_data"] = explosion_data - data["printer_timer"] = printer_timer + data["printing"] = active_timers return data /obj/machinery/doppler_array/Topic(href, href_list) diff --git a/nano/templates/doppler_array.tmpl b/nano/templates/doppler_array.tmpl index 49aef551c09..d3bb40744b2 100644 --- a/nano/templates/doppler_array.tmpl +++ b/nano/templates/doppler_array.tmpl @@ -21,5 +21,5 @@ {{/for}}
- {{:helper.link("Print all logs", "print", {"print_logs": 'yes'}, data.printer_timer ? 'disabled' : null)}} + {{:helper.link("Print all logs", "print", {"print_logs": 'yes'}, data.printing ? 'disabled' : null)}} {{/if}} From 2e77d024afb21ca6488a22fcb5c3e62f483fbaf8 Mon Sep 17 00:00:00 2001 From: Citinited Date: Wed, 4 Jul 2018 12:57:43 +0100 Subject: [PATCH 28/99] UID now occurs at the point the nanoUI menu is opened --- code/game/machinery/doppler_array.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 2d48845fe06..0f98e45066d 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -22,7 +22,6 @@ var/list/doppler_arrays = list() epicenter = log_epicenter actual_size_message = log_actual_size_message theoretical_size_message = log_theoretical_size_message - UID() /obj/machinery/doppler_array/New() ..() @@ -168,6 +167,7 @@ var/list/doppler_arrays = list() var/data[0] var/list/explosion_data = list() for(var/datum/explosion_log/E in logged_explosions) + E.UID() explosion_data += list(list( "logged_time" = E.logged_time, "epicenter" = E.epicenter, From b2b4377b7fa0b8066a0489568be392519f93c22d Mon Sep 17 00:00:00 2001 From: Citinited Date: Sat, 7 Jul 2018 02:10:15 +0100 Subject: [PATCH 29/99] Moves UID check --- code/game/machinery/doppler_array.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 0f98e45066d..7e32b468ecf 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -167,13 +167,12 @@ var/list/doppler_arrays = list() var/data[0] var/list/explosion_data = list() for(var/datum/explosion_log/E in logged_explosions) - E.UID() explosion_data += list(list( "logged_time" = E.logged_time, "epicenter" = E.epicenter, "actual_size_message" = E.actual_size_message, "theoretical_size_message" = E.theoretical_size_message, - "unique_datum_id" = E.unique_datum_id)) + "unique_datum_id" = E.UID())) data["explosion_data"] = explosion_data data["printing"] = active_timers return data From 2c0e9154d6c5ca1c1be5f54238eba03cb4226984 Mon Sep 17 00:00:00 2001 From: Citinited Date: Tue, 10 Jul 2018 18:46:44 +0100 Subject: [PATCH 30/99] Adds another UID check, speeds up for loops slightly --- code/game/machinery/doppler_array.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 7e32b468ecf..fedbf0d9c9a 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -166,7 +166,8 @@ var/list/doppler_arrays = list() /obj/machinery/doppler_array/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/data[0] var/list/explosion_data = list() - for(var/datum/explosion_log/E in logged_explosions) + for(var/D in logged_explosions) + var/datum/explosion_log/E = D explosion_data += list(list( "logged_time" = E.logged_time, "epicenter" = E.epicenter, @@ -182,10 +183,11 @@ var/list/doppler_arrays = list() return if(href_list["log_to_delete"]) var/log_to_delete = sanitize(href_list["log_to_delete"]) - for(var/datum/D in logged_explosions) - if(D.unique_datum_id == log_to_delete) - logged_explosions -= D - qdel(D) + for(var/D in logged_explosions) + var/datum/explosion_log/E = D + if(E.UID() == log_to_delete) + logged_explosions -= E + qdel(E) to_chat(usr, "Log deletion successful.") break else if(href_list["print_logs"]) From d17366a2b91a48744f0ae11d07185064023b35fd Mon Sep 17 00:00:00 2001 From: Citinited Date: Thu, 12 Jul 2018 19:38:42 +0100 Subject: [PATCH 31/99] Uses Cut() instead of a loop --- code/game/machinery/doppler_array.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index fedbf0d9c9a..f06f7ac1b37 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -29,8 +29,7 @@ var/list/doppler_arrays = list() /obj/machinery/doppler_array/Destroy() doppler_arrays -= src - for(var/datum/D in logged_explosions) - qdel(D) + logged_explosions.Cut() return ..() /obj/machinery/doppler_array/process() @@ -91,7 +90,8 @@ var/list/doppler_arrays = list() visible_message("[src] prints a piece of paper!") playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/paper/explosive_log/P = new(get_turf(src)) - for(var/datum/explosion_log/E in logged_explosions) + for(var/D in logged_explosions) + var/datum/explosion_log/E = D P.info += "
\ \ \ From 67d12c0aa6f7a53f8304fa069419cdf0b9dfcff4 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 12 Jul 2018 19:30:48 -0400 Subject: [PATCH 32/99] Full Positronic Brain to Robotic Brain Refactor --- _maps/map_files/cyberiad/cyberiad.dmm | 2 +- code/game/machinery/computer/ai_core.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/mecha/mecha.dm | 16 ++--- code/modules/admin/admin_verbs.dm | 26 -------- .../spacesuits/rig/modules/computer.dm | 2 +- code/modules/mob/living/carbon/brain/MMI.dm | 2 - .../brain/{posibrain.dm => robotic_brain.dm} | 62 ++++++++---------- code/modules/mob/living/carbon/brain/say.dm | 6 +- .../living/carbon/human/species/station.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 6 +- .../simple_animal/friendly/spiderbot.dm | 2 +- code/modules/mob/transform_procs.dm | 2 +- .../research/designs/medical_designs.dm | 8 +-- code/modules/surgery/organs/mmi_holder.dm | 36 ++++++++++ .../surgery/organs/subtypes/machine.dm | 62 ++---------------- icons/obj/module.dmi | Bin 15135 -> 16573 bytes paradise.dme | 3 +- 18 files changed, 98 insertions(+), 143 deletions(-) rename code/modules/mob/living/carbon/brain/{posibrain.dm => robotic_brain.dm} (78%) create mode 100644 code/modules/surgery/organs/mmi_holder.dm diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 9924d4708ad..b7cedf65c09 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -4948,7 +4948,7 @@ "bRi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bRj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bRk" = (/obj/structure/table,/obj/item/FixOVein,/obj/item/surgicaldrill,/obj/item/bonegel,/obj/item/bonesetter,/obj/item/retractor,/obj/item/hemostat,/obj/item/cautery,/obj/item/stack/medical/bruise_pack/advanced{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics) -"bRl" = (/obj/effect/decal/warning_stripes/east,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/table,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi/posibrain,/obj/item/robotanalyzer,/turf/simulated/floor/plasteel,/area/assembly/robotics) +"bRl" = (/obj/effect/decal/warning_stripes/east,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/table,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi/robotic_brain,/obj/item/robotanalyzer,/turf/simulated/floor/plasteel,/area/assembly/robotics) "bRm" = (/obj/structure/table,/obj/item/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/healthanalyzer,/obj/item/healthanalyzer,/obj/item/healthanalyzer,/obj/machinery/newscaster{pixel_x = 26; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bRn" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"}) "bRo" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Research Hallway Entrance"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"}) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 2b3c338fa3d..1a32e8a94ee 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -117,7 +117,7 @@ return laws = M.laws - if(istype(P, /obj/item/mmi) || istype(P, /obj/item/mmi/posibrain)) + if(istype(P, /obj/item/mmi) || istype(P, /obj/item/mmi/robotic_brain)) if(!P:brainmob) to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.") return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 0f09d337897..332dc2854e1 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -239,7 +239,7 @@ ) // These items will NOT be preserved var/list/do_not_preserve_items = list ( - /obj/item/mmi/posibrain + /obj/item/mmi/robotic_brain ) /obj/machinery/cryopod/right diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index d054c163732..a2fa4220c3c 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1206,10 +1206,10 @@ occupant = brainmob brainmob.forceMove(src) //should allow relaymove brainmob.canmove = 1 - if(istype(mmi_as_oc, /obj/item/mmi/posibrain)) - var/obj/item/mmi/posibrain/P = mmi_as_oc - if(P.imprinted_master) - to_chat(brainmob, "Your imprint to [P.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.") + if(istype(mmi_as_oc, /obj/item/mmi/robotic_brain)) + var/obj/item/mmi/robotic_brain/R = mmi_as_oc + if(R.imprinted_master) + to_chat(brainmob, "Your imprint to [R.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.") mmi_as_oc.loc = src mmi_as_oc.mecha = src verbs -= /obj/mecha/verb/eject @@ -1309,10 +1309,10 @@ mmi.mecha = null mmi.update_icon() L.canmove = 0 - if(istype(mmi, /obj/item/mmi/posibrain)) - var/obj/item/mmi/posibrain/P = mmi - if(P.imprinted_master) - to_chat(L, "Imprint re-enabled, you are once again bound to [P.imprinted_master]'s commands.") + if(istype(mmi, /obj/item/mmi/robotic_brain)) + var/obj/item/mmi/robotic_brain/R = mmi + if(R.imprinted_master) + to_chat(L, "Imprint re-enabled, you are once again bound to [R.imprinted_master]'s commands.") icon_state = initial(icon_state)+"-open" dir = dir_in diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 91c237a0328..44075d06548 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -823,19 +823,6 @@ var/list/admin_verbs_ticket = list( if(!check_rights(R_ADMIN)) return - if(!istype(H)) - if(istype(H, /mob/living/carbon/brain)) - var/mob/living/carbon/brain/B = H - if(istype(B.container, /obj/item/mmi/posibrain/ipc)) - var/obj/item/mmi/posibrain/ipc/C = B.container - var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc - if(istype(P.owner, /mob/living/carbon/human)) - H = P.owner - else - return - else - return - if(holder) admin_log_and_message_admins("is altering the appearance of [H].") H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0) @@ -849,19 +836,6 @@ var/list/admin_verbs_ticket = list( if(!check_rights(R_ADMIN)) return - if(!istype(H)) - if(istype(H, /mob/living/carbon/brain)) - var/mob/living/carbon/brain/B = H - if(istype(B.container, /obj/item/mmi/posibrain/ipc)) - var/obj/item/mmi/posibrain/ipc/C = B.container - var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc - if(istype(P.owner, /mob/living/carbon/human)) - H = P.owner - else - return - else - return - if(!H.client) to_chat(usr, "Only mobs with clients can alter their own appearance.") return diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 49991df72d7..74af696e76e 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -116,7 +116,7 @@ return 1 // Okay, it wasn't a terminal being touched, check for all the simple insertions. - if(input_device.type in list(/obj/item/paicard, /obj/item/mmi, /obj/item/mmi/posibrain)) + if(input_device.type in list(/obj/item/paicard, /obj/item/mmi, /obj/item/mmi/robotic_brain)) if(integrated_ai) integrated_ai.attackby(input_device,user) // If the transfer was successful, we can clear out our vars. diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 7b0e58ba5eb..e3069f4d5d3 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -265,8 +265,6 @@ forceMove(holder) holder.stored_mmi = src holder.update_from_mmi() - if(istype(src, /obj/item/mmi/posibrain)) - holder.robotize() if(brainmob && brainmob.mind) brainmob.mind.transfer_to(H) holder.insert(H) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/robotic_brain.dm similarity index 78% rename from code/modules/mob/living/carbon/brain/posibrain.dm rename to code/modules/mob/living/carbon/brain/robotic_brain.dm index 9ab4a153f4d..f46613527b2 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/robotic_brain.dm @@ -1,8 +1,8 @@ -/obj/item/mmi/posibrain +/obj/item/mmi/robotic_brain name = "robotic brain" - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." - icon = 'icons/obj/assemblies.dmi' - icon_state = "posibrain" + desc = "An advanced circuit, capable of housing an advanced non-sentient synthetic intelligence." + icon = 'icons/obj/module.dmi' + icon_state = "boris_blank" w_class = WEIGHT_CLASS_NORMAL origin_tech = "biotech=3;programming=3;plasmatech=2" @@ -17,11 +17,11 @@ var/requires_master = TRUE var/mob/living/carbon/human/imprinted_master = null -/obj/item/mmi/posibrain/Destroy() +/obj/item/mmi/robotic_brain/Destroy() imprinted_master = null return ..() -/obj/item/mmi/posibrain/attack_self(mob/user) +/obj/item/mmi/robotic_brain/attack_self(mob/user) if(requires_master && !imprinted_master) to_chat(user, "You press your thumb on [src] and imprint your user information.") imprinted_master = user @@ -29,7 +29,7 @@ if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. to_chat(user, "You carefully locate the manual activation switch and start [src]'s boot process.") - icon_state = "posibrain-searching" + icon_state = "boris_recharging" ghost_volunteers.Cut() searching = 1 request_player() @@ -47,12 +47,12 @@ if(brainmob && brainmob.key) to_chat(brainmob, "Your internal speaker has been toggled [silenced ? "off" : "on"].") -/obj/item/mmi/posibrain/proc/request_player() +/obj/item/mmi/robotic_brain/proc/request_player() for(var/mob/dead/observer/O in player_list) if(check_observer(O)) to_chat(O, "\A [src] has been activated. (Teleport | Sign Up)") -/obj/item/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O) +/obj/item/mmi/robotic_brain/proc/check_observer(var/mob/dead/observer/O) if(cannotPossess(O)) return 0 if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept")) @@ -63,7 +63,7 @@ return 1 return 0 -/obj/item/mmi/posibrain/proc/question(var/client/C) +/obj/item/mmi/robotic_brain/proc/question(var/client/C) spawn(0) if(!C) return var/response = alert(C, "Someone is requesting a personality for a [src]. Would you like to play as one?", "[src] request", "Yes", "No", "Never for this round") @@ -74,11 +74,11 @@ C.prefs.be_special -= ROLE_POSIBRAIN // This should not ever happen, but let's be safe -/obj/item/mmi/posibrain/dropbrain(var/turf/dropspot) +/obj/item/mmi/robotic_brain/dropbrain(var/turf/dropspot) log_runtime(EXCEPTION("[src] at [loc] attempted to drop brain without a contained brain."), src) return -/obj/item/mmi/posibrain/transfer_identity(var/mob/living/carbon/H) +/obj/item/mmi/robotic_brain/transfer_identity(var/mob/living/carbon/H) name = "[src] ([H])" if(isnull(brainmob.dna)) brainmob.dna = H.dna.Clone() @@ -90,51 +90,51 @@ brainmob.mind.assigned_role = "Positronic Brain" if(H.mind) H.mind.transfer_to(brainmob) - to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a metal cube.") - become_occupied("posibrain-occupied") + to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a circuit.") + become_occupied("boris") if(radio) radio_action.ApplyIcon() return -/obj/item/mmi/posibrain/attempt_become_organ(obj/item/organ/external/parent, mob/living/carbon/human/H) +/obj/item/mmi/robotic_brain/attempt_become_organ(obj/item/organ/external/parent, mob/living/carbon/human/H) if(..()) if(imprinted_master) to_chat(H, "You are permanently imprinted to [imprinted_master], obey [imprinted_master]'s every order and assist [imprinted_master.p_them()] in completing [imprinted_master.p_their()] goals at any cost.") -/obj/item/mmi/posibrain/proc/transfer_personality(mob/candidate) +/obj/item/mmi/robotic_brain/proc/transfer_personality(mob/candidate) searching = 0 brainmob.key = candidate.key name = "[src] ([brainmob.name])" to_chat(brainmob, "You are a [src], brought into existence on [station_name()].") - to_chat(brainmob, "As a synthetic intelligence, you answer to [imprinted_master], unless otherwise placed inside of a lawed synthetic structure or mech.") + to_chat(brainmob, "As a non-sentient synthetic intelligence, you answer to [imprinted_master], unless otherwise placed inside of a lawed synthetic structure or mech.") to_chat(brainmob, "Remember, the purpose of your existence is to serve [imprinted_master]'s every word, unless lawed or placed into a mech in the future.") brainmob.mind.assigned_role = "Positronic Brain" var/turf/T = get_turf_or_move(loc) for(var/mob/M in viewers(T)) M.show_message("[src] chimes quietly.") - become_occupied("posibrain-occupied") + become_occupied("boris") -/obj/item/mmi/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. +/obj/item/mmi/robotic_brain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. if(src.brainmob && src.brainmob.key) return src.searching = 0 - icon_state = "posibrain" + icon_state = "boris_blank" var/turf/T = get_turf_or_move(src.loc) for(var/mob/M in viewers(T)) - M.show_message("The [src] buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + M.show_message("[src] buzzes quietly as the red light fades out. Perhaps you could try again?") -/obj/item/mmi/posibrain/Topic(href,href_list) +/obj/item/mmi/robotic_brain/Topic(href,href_list) if("signup" in href_list) var/mob/dead/observer/O = locate(href_list["signup"]) if(!O) return volunteer(O) -/obj/item/mmi/posibrain/proc/volunteer(var/mob/dead/observer/O) +/obj/item/mmi/robotic_brain/proc/volunteer(var/mob/dead/observer/O) if(!searching) to_chat(O, "Not looking for a ghost, yet.") return @@ -158,7 +158,7 @@ ghost_volunteers.Add(O) -/obj/item/mmi/posibrain/examine(mob/user) +/obj/item/mmi/robotic_brain/examine(mob/user) to_chat(user, "Its speaker is turned [silenced ? "off" : "on"].") to_chat(user, "*---------*") . = ..() @@ -179,7 +179,7 @@ msg += "*---------*" to_chat(user, msg.Join("")) -/obj/item/mmi/posibrain/emp_act(severity) +/obj/item/mmi/robotic_brain/emp_act(severity) if(!src.brainmob) return else @@ -192,7 +192,7 @@ src.brainmob.emp_damage += rand(0,10) ..() -/obj/item/mmi/posibrain/New() +/obj/item/mmi/robotic_brain/New() src.brainmob = new(src) src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" src.brainmob.real_name = src.brainmob.name @@ -204,7 +204,7 @@ ..() -/obj/item/mmi/posibrain/attack_ghost(var/mob/dead/observer/O) +/obj/item/mmi/robotic_brain/attack_ghost(var/mob/dead/observer/O) if(searching) volunteer(O) return @@ -215,10 +215,4 @@ playsound(get_turf(src), 'sound/items/posiping.ogg', 80, 0) var/turf/T = get_turf_or_move(src.loc) for(var/mob/M in viewers(T)) - M.show_message("[src] pings softly.") - -/obj/item/mmi/posibrain/ipc - name = "positronic brain" - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." - silenced = 1 - requires_master = FALSE + M.show_message("[src] pings softly.") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 4a34d2d1b05..907a2e4862d 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -22,9 +22,9 @@ if(!istype(container, /obj/item/mmi)) . = FALSE - else if(istype(container, /obj/item/mmi/posibrain)) - var/obj/item/mmi/posibrain/P = container - if(P && P.silenced) + else if(istype(container, /obj/item/mmi/robotic_brain)) + var/obj/item/mmi/robotic_brain/R = container + if(R && R.silenced) if(warning) to_chat(usr, "You cannot speak, as your internal speaker is turned off.") . = FALSE diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 6b692601226..f0f9b359252 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -958,7 +958,7 @@ butt_sprite = "machine" has_organ = list( - "brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain, + "brain" = /obj/item/organ/internal/brain/posibrain, "cell" = /obj/item/organ/internal/cell, "optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2. "charger" = /obj/item/organ/internal/cyberimp/arm/power_cord diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4f6707e93f0..755b874667a 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -131,8 +131,8 @@ var/list/robot_verbs_default = list( camera.status = 0 if(mmi == null) - mmi = new /obj/item/mmi/posibrain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a posibrain, but it works) - mmi.icon_state="posibrain-occupied" + mmi = new /obj/item/mmi/robotic_brain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a robotic brain, but it works) + mmi.icon_state = "boris" initialize_components() //if(!unfinished) @@ -210,7 +210,7 @@ var/list/robot_verbs_default = list( if(prefix) modtype = prefix if(mmi) - if(istype(mmi, /obj/item/mmi/posibrain)) + if(istype(mmi, /obj/item/mmi/robotic_brain)) braintype = "Android" else braintype = "Cyborg" diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index b98d4181475..37ed25f15e8 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -157,7 +157,7 @@ if(istype(mmi, /obj/item/mmi)) icon_state = "spiderbot-chassis-mmi" icon_living = "spiderbot-chassis-mmi" - if(istype(mmi, /obj/item/mmi/posibrain)) + if(istype(mmi, /obj/item/mmi/robotic_brain)) icon_state = "spiderbot-chassis-posi" icon_living = "spiderbot-chassis-posi" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 82aebda3a42..a1ed4f0bde9 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -86,7 +86,7 @@ if(O.mind && O.mind.assigned_role == "Cyborg") if(O.mind.role_alt_title == "Android") - O.mmi = new /obj/item/mmi/posibrain(O) + O.mmi = new /obj/item/mmi/robotic_brain(O) else if(O.mind.role_alt_title == "Robot") O.mmi = null //Robots do not have removable brains. else diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 5782d9f19c8..638a614fc85 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -103,15 +103,15 @@ build_path = /obj/item/mass_spectrometer category = list("Medical") -/datum/design/posibrain +/datum/design/robotic_brain name = "Robotic Brain" - desc = "The latest in Artificial Intelligences." - id = "mmi_posi" + desc = "The latest in non-sentient Artificial Intelligences." + id = "mmi_robotic" req_tech = list("programming" = 5, "biotech" = 4, "plasmatech" = 3) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 1700, MAT_GLASS = 1350, MAT_GOLD = 500) //Gold, because SWAG. construction_time = 75 - build_path = /obj/item/mmi/posibrain + build_path = /obj/item/mmi/robotic_brain category = list("Misc","Medical") /datum/design/mmi_radio_upgrade diff --git a/code/modules/surgery/organs/mmi_holder.dm b/code/modules/surgery/organs/mmi_holder.dm new file mode 100644 index 00000000000..8b5834bd8fc --- /dev/null +++ b/code/modules/surgery/organs/mmi_holder.dm @@ -0,0 +1,36 @@ +// Used for an MMI or robotic brain being installed into a human. +/obj/item/organ/internal/brain/mmi_holder + name = "Man-Machine Interface" + parent_organ = "chest" + status = ORGAN_ROBOT + var/obj/item/mmi/stored_mmi + +/obj/item/organ/internal/brain/mmi_holder/Destroy() + QDEL_NULL(stored_mmi) + return ..() + +/obj/item/organ/internal/brain/mmi_holder/insert(mob/living/target, special = 0) + ..() + // To supersede the over-writing of the MMI's name from `insert` + update_from_mmi() + +/obj/item/organ/internal/brain/mmi_holder/remove(mob/living/user, special = 0) + if(!special) + if(stored_mmi) + . = stored_mmi + if(owner.mind) + owner.mind.transfer_to(stored_mmi.brainmob) + stored_mmi.forceMove(get_turf(owner)) + stored_mmi = null + ..() + if(!QDELETED(src)) + qdel(src) + +/obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi() + if(!stored_mmi) + return + name = stored_mmi.name + desc = stored_mmi.desc + icon = stored_mmi.icon + icon_state = stored_mmi.icon_state + set_dna(stored_mmi.brainmob.dna) \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 15f0bc5c118..cbcf2217b66 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -136,60 +136,12 @@ . = ..() -// Used for an MMI or posibrain being installed into a human. -/obj/item/organ/internal/brain/mmi_holder - name = "brain" - organ_tag = "brain" +/obj/item/organ/internal/brain/posibrain + name = "positronic brain" + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." + icon = 'icons/obj/assemblies.dmi' + icon_state = "posibrain-occupied" + dead_icon = "posibrain" parent_organ = "chest" - vital = TRUE - max_damage = 200 - slot = "brain" status = ORGAN_ROBOT - species = "Machine" - var/obj/item/mmi/stored_mmi - -/obj/item/organ/internal/brain/mmi_holder/Destroy() - QDEL_NULL(stored_mmi) - return ..() - -/obj/item/organ/internal/brain/mmi_holder/insert(var/mob/living/target,special = 0) - ..() - // To supersede the over-writing of the MMI's name from `insert` - update_from_mmi() - -/obj/item/organ/internal/brain/mmi_holder/remove(var/mob/living/user,special = 0) - if(!special) - if(stored_mmi) - . = stored_mmi - if(owner.mind) - owner.mind.transfer_to(stored_mmi.brainmob) - stored_mmi.forceMove(get_turf(owner)) - stored_mmi = null - ..() - if(!QDELETED(src)) - qdel(src) - -/obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi() - if(!stored_mmi) - return - name = stored_mmi.name - desc = stored_mmi.desc - icon = stored_mmi.icon - icon_state = stored_mmi.icon_state - set_dna(stored_mmi.brainmob.dna) - -/obj/item/organ/internal/brain/mmi_holder/posibrain/New() - robotize() - stored_mmi = new /obj/item/mmi/posibrain/ipc(src) - ..() - spawn(1) - if(!QDELETED(src)) - if(owner) - stored_mmi.name = "positronic brain ([owner.real_name])" - stored_mmi.brainmob.real_name = owner.real_name - stored_mmi.brainmob.name = stored_mmi.brainmob.real_name - stored_mmi.icon_state = "posibrain-occupied" - update_from_mmi() - else - stored_mmi.loc = get_turf(src) - qdel(src) + species = "Machine" \ No newline at end of file diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index 0a269e0d8b7cc7b522441e8c8ad4add36322e0e4..ab76789a0f0dda010c9819d3e328b1b63ed778ba 100644 GIT binary patch literal 16573 zcmcJ%2UJsCv@V)ZgLFZ96I4)o5m1nT2&jO7^csrvF1;k7qf`;4Ly+D<=^!0J>AiOZ zLhmg=xSRh!
08}Gd{?zq=6_AuG*z1LbZbIm!wZ+_d4s&5oXZ!z2gfk33MUcPt> z0)eG(4hR8oruS2J0SJU6<*lLP`oi4B?7g*uioff9^R3&M|u3B zeDZeBCUXq7`fKZj=%`JmR=24Zho;*G)HEQ-Cey+6M;*~gPJ-@Io~Vsl&j|_X$*!Zp zdNb>bEO6Ybs>L84_E!%e+1pCDgp`*9&J~`|hb77pT2`u^dW3hc8D@YF%t3wpV+jjX zglnG;JNnEQUVGU8GInNfO!&>uc~JQA@@cn%h;rHB$b>X|EcBhJQ*)$z=mY1ycc!Ah zLz-i8O3Ke3{chc+*Jm3uX+i~E^sgWLfU%mM@bH*iUlw~#6OoC`58;LqTCLsOZQ3S3 z9?(nYC$eD46-bn|=FNsUO?##-%BbIc+3Fz}aWbkRsES*XA?e~V7`RPKkUDHp^cf1~ zM0bgp_YTBne6?M;rCUwYUKE&<;)lFGXR}agKTl?pFJyMQ&n{<^VYn?bn4{P2+A}>} zKhX6%?hj{6DyEC58&BMt>Zd~NbEA4!<_;PX9O0DvT8L%JhC46y?PRkwLSSCB5W;tc zgqHXhlrhoghX<+75J@bO{-Q=*ei%XfLRoY{8M+0xvYfxfI`Bb!7?O*o06hM^ZN zDkK6knwWuW{t?ZRAD*rC# zeHC2|h35MaJ{e)zY7dQLnRuWYnWs8b_qo~1faBiX7i$-tTT1S+%0I}3>+c?V8ETg# zrq-74`naDW`q!{C!Y=jHaxxTnEgyaPX75no$-JaB^$TDVrxBEvpb$&sj1 z;B~SSa6tmhC~>LrTE2e(-wIgJ>By?b2@ueO?C6zjPfWUz;vRJz5+#>%KGp89p%nW;3G zu2gjNRaAWcJ2|nX;{bnZsEauR8gQIV%oFiC=S^zY{dfaY29pd8zGIsw^a3tp_uju3 zIx-JwY5_o6=W3n61S?FTGmj8zCHC4OZTWKby$+9Oe) zmY%314C7+hISY9wg1%NTtF;AeULu7MMT#H7 z`7ZW|FBf}G|Mc~(hH;k|@6I(4ZE68CnZx%Mi4o=|pHNvGO8nc~lWyKLH^DN2Gx}Og zc#wnK?`I-?k^Z=8WB=Ph*6$cuhV(+wF8O5z78{bs()okpw{6$<*U9A`9Yrof-{RtD zkANJ_<2I-J!g;2Ygk5-ww7g#C9;Cjukz63WMC_>q9vpTpO6F}9RlKxc*k5akgKk}m zzy|FSrO>NlZW|goDyY6hqWA`=a`t5Zl=E*Hlr+*?^LC2EUo2&v$m$D^HLm@A7W_Vs~MI)o?B25Ms;`$cSm5EnVAFQcF|~b zI5qEpSb`M%sn6-oN*(ei8Dg~k#tJK6wGSSZwyL3b#xnh(Dd$p5m(Lt~&hVlF=66+I zd(6`Oa#Q)Jeds;S#nU5L?U+9&S1I%{B_**ZB{4K(t2ud4UY*zi`%n_+p^5;xXbQGS z*XZEjVB*KhdIj32K{4^M?Srph$+P5;>qB>_X=vU8>(+smK*~hyW*eqS>tzg!PVALD z@T>$WF~43gp`0)IG`fTr^K;W$m-iDC{Z?21W_+_E5b-&+W5^XtqBNG_!s+Sn&-Jn_ zxBjFhFtOI;I4{N5cxHOCJx$oG$lrkH*S}VNDfS8YJ)f+lv`srU_4?xyim$O+?l1b| zGKo9+Whz7;Y=4d3>umbjFE?p;IUZj5Q*fCoisjjBd3pJvDevX(^fCd?5&YqYcIA?xoS3K1DlVRuhX?087|Ls+lzWwl?XVGbD0=f6 zx(XR+n2y{~BjmMZFyX1qp!=vWPey=t)INp?{8Zw?sbD;H5My>l=R9Rb)J*m+mBmI| zSBWC9HOJ$$Fkk0(Aspgk@Q?EHCr%5XH55_`RN9EKX~#mbEATfd=+(%meLt39spAp# zB7<5X>+P;cqbiNvrS&eF^x!Io-$dsdJ*^~Ko`K&wCVO#DEB2b}B;(@Sq9W~I*@h!* zj?AJ!qqR2e(Gu(jxQg|Xfg8CA-+&F~asEwm7|XZURQRYmno$9Pkct#Z!pPH#L!mIS zmhHz2+>zLjSLi|)%^BXEyYt0H6 z>HAh$`88yI9K6Tk?QxzVi&~4MuY2+!JSH%pO0`K81? ze1+h?uHRJBRut(U*e&|gA`2dz&Qo1xBcAo2jPQ6P2cMv;{;5@x#X6e&w?w-(uzf2!b{=fm7@BpSpQ?xJ-t^7J#@F zi~@Eqzl!*485wZ@vr~iCe^QCh&Yy6)U_35ewU;I)#NFfDgls_QddgbiwN5B-8D9`NXMCcbaZnl9Tu6vWjC3jdK0jqClCROF;X&0>=YTt zRw?wJ=!*})zD@r;x2(NZKZG<*% zf?#Rs3SP6bv#V}?z-(`lM~;QcuiaD5J4CDRDC*{lf~ z$Jq|ZCl7h>Z(t+;JVp#w!{)~zsuU^h`DY^3xtrntlmmaQ1^%0bLpumx#);>@U1$7z zd7RYkYYkuaA~bP;%f~;U-G}=&AY6cgqUfpJQf;TL>$u*gtg5pXi<%O+w0 zM$v`_fJT_|!RfAg`A-O)+C{cPUR5>Edd&AWT}?OXe&c~u31)$-+{{F!%q&iLN9zGs zg;bRJ8j3x6BK+{-!*6xohE`hcWi}RPI>&{Dg%2O@=O{yGJ5jN*vg)y>wFo>GuH&FB zzVz!m$29v#r$(k2YO5P}=&28k+lroJX&&^}BxbKgXy_c1Fa_nj*Rv{wI zZu&=0o;1vf-XeDC*#ABBPV_ixwshi>-|_eRHIuM_AFf4By^jN(*&i~25DdC;7BhY1$&Ng7UzEw*q|E%9e3oeB^>c3ytxaq*WhMUqt5$(rk$e{ z&E%Lbul-Dp#k9(u&D=0Y!|=$0ql^pGaCgVv)!UuHU zO{#4P4yzsxA1_3afb{hAq`_|pt4hKBY(zcc0==GY@1AAc9_Xf4`%WdRChuDJ1au|Ci(<+hE`G0pWd2I#OFuYqT&PkHztP*gpqR zJp}76V61-!RTp~W(HZ4{8V|_+uB_~LkCTD-Qn@XT?r=4-p4?{z%O~tR-P^5pULOZ# z2POt6W6n!g6nMvdALfoJ!kMxHS&ytpX@z&n1;J#S$hqcmDd|BAEcY4v7L4{|1L#quZ3}qz#Lj+|OGi zMv`@?!8Ui7-HN03S#jEEU%iALB?cv@2~w=gZL#b1!Ev=y;iy=z2=<=r#lD>~UbNe{^9ckGu;NWN*en=GodQ;JrjE?1Jq{F2^5F zKScZ#XD5evSC4LS|hf3{I*a1C1%Z76~^ms_d zqIAL{{e-da;L(0_Db4z9_Y-}Se)fdr&}aCVA&09yF0r4Ss%h5FcnPsGXzy|wV9Gyi zGl2}CuTBgg7_W3ZmWdyzjSaV+tjNUj3|MF!n(JK==KlS;ijCZhv+1dm=?q8X%Y|D} zAcbZq>4SNZNs$bkraAolQ-3{jsX8e{8Ddx_)QJ_UL%ngOBMIkP zmmp=nnM(ygWSjuc;m>|Un2PZQX%wQ5>pv-A3t$rpp4+LSf~~GYNa1RwlsKb z$VsVbRz){%;#yln!wQuA2AcZ$-sWu=va)&0N|QDM9RI(v7 zn`#mLG*^0OA=8m{*%Knzx6!v!zfyAgvxkL@vYu#(f7mtBkXx^(b?fY?%5rSGeRZ^% zOv|K@c})%lmFrvLieqv9hK1eQ9#mk>uBj2XuMYT#9l!|E8y96=Sl`QVjBc!+DxH&Riywq)U7`dHl@a;mKXXrLwT`R{C|Mp|D{~^&x7OcuHjL-hWOs| zg_!Hwps+lU=La9a9nY=i!jlGiG@!2JDSmYs8PC-HRC8hB-xlp#{Ze@Pf6Rn!C>a97in~ z$6}3wnc+PgrT{NpxFHNE%v@ZA&(F_Se>gjsz1}ocqIyCnHs{IFFL_9^va+I~rFD?W zdc~zVsz_v1T73`>yIg9Td*99LyRHaZYB-(ao~W=MCI$ZK)>&f)mtp4je@3u1YzLWT zIXiGDh03?af%CG2%wx?NL+tuUr;%h+-C|ie?AFbj$0dovmVHenMhy(r)4gKEO(fE7 zqsYZ?p)8LIOG|gbT?+cl@~zI%t98G*_9$v>I4rYD_tRC{e@+*dGETphZWH`9+9cKN zN7SXjVN~jIIq}_0o8RbX!pVudhNk%;H>uslGAo22aK?35SqUX|1#2+ceUh2~&kTJG zO`|})XtT#(P`Qk@D-vHvJe$eSt`<-ZMJ&XuswR~7C|(^?7Zdw+7T;zDyU`JKJ}UsW3mzQ{TticH{Ub76Y5uB2fX zb-HLXIIfucb;-T{nD$q;-A`|hi?Qu;C9(E173kHMrmJm7$wmuaHWv)zu~4;nvcD4hywa#4t< z0D;4E+4tVa_d?Duo>x;D`Hv@U)U`8%u|DYA;g^@bppjn~TMitNs`7>hQOopcd;g4# zgy(HCPhF3V&rusQlb!k>3Db89qzo6k}4%yX|*pWv79Q{qg0Q%Z@Ial9oKVz z_Ln<}2m-e*uTf_GY0vTs^s>3a?DsvNZV23t@~IfVzXK@~9RVdLC!5rcSLiq;lZ zR=WABsHjX{C%F;n#dQEP{d4x5&yfj{c`NUSo>S0>$vvjiykf;30;?o{@|ooFeNRad zZ-$5WMWiWczyvtpk=pD5+gY~XDSJ-+xY<%{P8Fqo3QaonY^Q798c9Xop7H9bg(q^A zzp}lv=$m_jqo~7fNj>HdYRsu;v<;DNZA3<6nM-xP2V^(tbuCUG_tru?FO?8!*Dm22 z7pl}N>c-jQn^!1u=w%rR7bwY})Blm2nl}&af9#Z`&84^0_aC%;upO{z*>=z5)9Qr` zu!ez1sot&?Py^-jf8wW&H-6yE=0V6VmY_@tIpO2aJHn9vA_9jzc%NB(L74Il{Kl{A zDZZFD|M(4G!|jf+H@S$=FZY##4aJ)=Nx+;RGZC+MelW+#x;aP2tkGO$-|2jMTd?W6 z-t?N4y9p^%7MQ>x&B>t>NEtNv@n1UCA(-laa;X37>Epk{(3+-EKV&ldk&G?Ut9-rs zi-PCZ#Y-!xID{}(&TjMiX;I31?e{K~HwEqXgS)sQtJq`DBMvf{3jUmTY0ml4L!q|# zjvn(2XxLHYd74M)ss%wG)U&a1*ZAFFwHG7kbf+<2cYA>UBJ{^^q3d-10<6~8w^s$W zC4(@>={TCJYa(TQFKc)M93x6q4fft_(DSl5PrukoW41Sn)0Svj^tBL04?BnO&!@#R zT>TjC(mB8PB~`xt$Hwr;Mmd_nKp}mr!rpq2zs8H+r4IP)t$#fFtANEk=z$TTm7`-c zm$28t-`@uUN3J=qHu_OeXhu(8s)Tw8w5hP$Glu1gL*Z=(Yj;ruWjm#pUNUY4+Ap+K zvygv!dYS_(9sT@mHWZ1y{LtizcHG!7RoB*@I@*2qKFBAU=~XI%q^XoaLV}&+#r%iM zIBM#$taLV0eSoC>?RcoE{r$Y4kiBX$8z`GBPIe{*OFLg*63}5N0Ls$d;TEhq`5Qyx zptwRk)|iw{6BGCtq<@5qA)iKTkt*b?Aprj5O_%8v5Z98DlZSIyBh_+Q3vki-RS9Fu zY*;2^boy9{q3!Bb&oOlt*s#(&UW~z;r3(RA=*Vrk6ChAfZ{aj@^YM?a0+Q7WS&NB9 zxmZ-yc&~WLavXhk^T+t7t4LS-Eo0{$;~q{|MHW!6!}MU}him0$U$uLL;>X69t6#B_ z=cP6Jn(}OZ|LjDo!!F$b4iXE{SZ92-tBh!xgmhKeD<(F^92s49aa(ZIR5Z@9z{!F1 zuhbI!&{@drM9QyK^o!90MOkPN0WX+Z^BKyx|mV44c>akFqgW3Sjl(c_j4!8C)35 z!h5iZq?i8!|AS?bgEnB?V+YIyXkE3IxIyDu12q2K*~b44(ntSs4=>iz{tu$w^GZ z^HLw4`oYc!4$horN2$E2Sd@E-hR0g4I$>O~GSg3op~F(*zO6}V;@HnDqDppzG<5+I#-eaH*YqTzg0u4yr3}ly_UjE1rk=^oOu(Ah>9-llMK_n(UkNa zvBX2fK2Q#upyd~&PhTC5w`e1#y=9Cb0>&Gu-SE3c?opDvx$SH7nZU^@<*n(QesDBf zJbMl#TnfK+Ox*u7X_P1->v4rjQH*?xWnOFI#)f@laoa6 zaP}rGpS`o#*yL16yC*Ch3)HLKoBMMeH|L@(U7ezeb{I|ljFTVF(T!^~MkNwi$ z9bFoXhT@Pc&J~5G4{!A`2jb`|J(qS@a~B zI7lG1#LPM(aE<#5;T?9Cr~1($2H%HT&&u~cislq_p zrojEfjf5q;q>^C92Xy~tX6V4SqF@WP$~tGhLO{1EUkkxesBN^3T9 zE3<{BlF2vw%fDjm`R};tkhb(RN-}{j*qb1B;*Do6ek^(5hW+5Wdcd{Hi#CYp)g9j5 zv!Ih>Z_k`}pA%frX}_MQg*c7rTGo!0!cb1kt@+@S(EFx$-JUdun1w0o=9F^h$GkXf zS*hMNZVABmlw>jBqveb5jyQ?9gsG@RClXJ8HzU+Gbo*-V1`$i^>FLRnmzZ$p9`r3c z_@kw#uTQvTYh_h-l+gAOf@5P+FdaFiZNThYV}0DO34w zrC#*%x7U!Y%0!3W>o6uzWdPMcO{YCj*}G4ri7VxCO7wn{6J&~FtSYLiq&O8}(r-mLJKY<(Er`Hk#A`2#rGw;dE~oHkzg zm}|fPg=xG5mKdR~!I#?6W2?@@f5 z1pQC{4hNDX(1&KmSXj>2Wy_Qg(964gV~k z911}>TsdKq1<^^7B4o7=cLcL>Ta}LyimsssK z-q>U`2rYG%^WB@SvNxHo;w2*Dd>)ulWAF=up^xo6z_1$q?Oh#D+?VrcC)v+m(6?-A zSt9m18=G{@(xAlvRB-jQh*TR1T*nM?<-9xQ2GqjfvqcM!c7$2|Xw3M_!Es-B2+60^ z)Ms0DUjh0j(sCxmxo7TK@?^cGEZb3?n10>O>XG|~uCA{4j-~e3K)4h= zBuQ#8@rQzUlN)C|&-(*u!Hz+3EsJ6LVU*yc?Lp>qL!Gab=D9=SxBl@Wm{CgOKDz6y6FoV%-b#ZO2 zuGmcNm61xdmQUH!qj8n{7WbG66f)dCOoG471|$zWZq6*JyxauB_|tL%rID&-rL(Nz-$BA44{!d z>|3SGb^yya`>AM1u zyNSVvpLzFcV=b<&M3|pQvzdajkn!U?0L#t%Ha-59L0CpsJy|Q)O$78g8dM;{!+B?6 zk+Y&DE^*XwY-B&c7ax;JCJhkvTI=L=_$;p(eFDCI+c56Tb9wZM_#6K8{<-hS=x8Lv zl}_)?Gs<5#Ehdy$%T@1clmw2x#Jdqd#dMkw0otekJ@M^7lvVw>)NdY+l_K@@Yv0!r zFI*h!PN~E(yByCuaGIT7dZS+r%BG~a96mhvQ_a0gnJ%!T+l005)giNZ&#lep5gcEh z$pT!bC*itaA97(ka~huz`SvBhsUOjvu1fR?a9lR4|K{xX;*i?i9k;ZWLNziKq-fHu ziZQkHu{(WT~X@0ZR@*Y3zJn6cnnA{W{z#$p0v3+oAJ`}n<6r4 z1*J{e%Mn+@Q{^64<`X6MMJr2pjSgKbEp_hmw*L;bx7RxpVtGe#kIcr_wsJa-KYF4H zesKb3^=6}JUORksdj^L@c=|*Ux_AF(!4l%@sQvTi-OvD>21Z}^J!edO`J>w@&VA>C zUnSg+9JPKEIlu4t`^R@|I5Sny>;23%H-Qy+(WS-R&26&8(zOBVfmzR-dq+y8-^60S z(zU|Jak_Te)*(@9u^tWU*d@G$O+@iXtO|AM>V^U+7v$kiV53mIqPCFq*mfz*Zl~!Q zp%{%^Yz=0R?i?a>Fi}Du(Dw>Cbtq*WUzxl*vDz9rtcOOk7i2GUShg*tplz| zd6WL+GtaKN!>{ZmT|SQ+m0LufjFuuEuO5{CJb8bRapk!fOl#mc?o&B5u(=gExn&w} z;%hEXpLy9DOkAmvu#ouV2_FYtf~1!aKr*kM=**kx;NGa=SR^ar0K(J>TjbCYK~LzL zHe2e7Q%7%;ByVA1@tly7{3>!{puev#2Urg58Z(|(5LQs2GYd)WWA>Q&=I`M2{R@2S zdneEN<%NfTWQX|+=E+^7UKK<}lTq1%o_<~PVo>soaZK8GsP0&iZl+=N->0B7&mRwL z67$t_%AE$EgG8n3{fVf4WX37Ry%pe;-PM_rQB$O>ci+azV}BPw;GPHrfMmPlZe1|3 zU|mDVxjzfN9u2t8#-y0@y}sivQAfn!^M?#Sykt*W1859ufKZixRRl~bHHJlTX-)vm6A z$ir6R6puMC%IP#u%z6#tx{V=yHIT46^j4@6;ere5f(fX^@zTr7h1tn12nQqR*fU!+ z_Akr(aX!5q8nw9sis3JRnOS|d1jlbo`}mDx#EgkA=eH2SdN)xmIV6GnxcgGn@9k_b z`ns?@lbB?%zG3iYwyWC6-gla}_2jEhmlrxgJ;`E@13y>^p{xDM^=BKSznGv1Nutpf z=h2hmdXIXwXOBS4+O7#E+K~#^QZ|xKYaLr(+yW&eB+m01QZL3zR$4|2m$BC-q-FnL zK9K>ACRf1(%Fs17^%jNg?Z2@1M7=(z2WmbNW}Q*lnVEqAQcdCv(%4|+L;*B$ZaW0L z*9@@#zx(?`wVrJp0laXZeUO%IHhX>ZB&Fdr1NjVnWlE*tf@fWQWiN`OEkN*-=XH^e)j;T`O4q!*@|>CyY}=HC4WTA+;sY6c-lo zfB>wn)=eU(^rTr^hqyV}r(gej+g`Pt`L!%*Ms024)|Q=yW;7(hw!z4gmM+b*Giq%T z@R~c#e}_QZlLB5qsNjw`a5sREwtpGE7=;P@|8+s8C+qQS&D0JX?Cw;_*Fyn}5D)Yg z6K7%M12}$^;J9q|DPn>^rDV~__2G*l@ZxqUAj>iqpd0t;_=+nD@D%`f7Gz8j+%x%$ z>*MX6(HMG%j&k9fZ0Me+BxT3=|OT`?(1Yb=8B?cjdwY`WpCu9Bzd-vwVT*^ zly27&U|R^BN&Ctjub*T4_W%&eQ~*jcAt50Gy2$UnU7(_dhG!dp9;X0dBEeiGP4W-W zWLsay_SC%&qOw5j^g6hwPMB{AHb&c+1dHeW0ao?f?*sHiT4ueWn_o=5Ti3yz>Tm#fILA8;bc;N5N(sBCS04tn10?(P4)fw9VVoG+lItxBF15asoy zUr3$*r2_0@nm7jFb%2AI$b2GE+D^A~s5BbfzX*tUdy>D!md?>6Q+cBj*qdD$$>S}7=>?g|nmzGTRHwT**b3Z%5IroA5RP*!Lh}TD3bbO^D$XTt#*)pJhuvgK{ z=($%*W9%R&%C{9zhcZ8YTL1U6V$X3=QBhXqjrpBT(J~4gK+OEP6Y=w?Vm_epcR*}BKy8Sb|LWTF9(K7jHl+d%&%7>usT2pm$C>S~xS zj(#0bTM^sW_Xc1Zp$i3pB_(`MB_w*stLG8*_a8{6fI}4E`!B+uv&PL6+x^8aX~KFJ z&g(fnW$F144ay6bjei#u{bnkNa+LIrIq*l<6d}*TKc+Sda5XoY@2GgAtb^QZ?H#`` zTrau+r!E2Gh5KDYB_n>CYKD^SE}Fp!FjD{;wnFaFk-P^83Q~Q7g(eubH~|(=LoN5p zgBec-l6mQKeS3VlwEgn7!oPC%=yuxwZCx0}o_^e)CcUPIl+S`EwdHur3zzSJ(i-M5 zf4ql^kv_WL^P$T>OXYZ7(5ds_y~Bd-xJ}q;v4qkUcS#gBrDog+D*7yTO0J6Q*Zj zD~%#}e*W?J@U!pyMOFT;ZpAa3#AYoxUkZwAO}_-Wmgt>SjrSoIGKI_cw zS*~3Q16lGU_C?&sWVN5pz{SMoeT9)vl^0i&9it{#9kjGQJ6!$fDd*~z=x^GO z^4INiA)so<;SQ2riv3EJn#j{{yEucufstt*51;Z(oR|><@IhhdD*IAF>VOoK6-X(F1qc>aai{2S~e+VvJVoK-NnS zNvt^PIHfN-j%k%J`ThCe=eC*CR%+3oLk@0N1fxi&MZ%mDa?zE8+F_r!1+0!twd-zmJ2*?`obyUz(K2-dscYelLAz<&S+-gF`U_JLHYEiEeapOBxm@Har(Aw+zEh^W`RDFMZzTomUq{NCn z*!c07fAP()GA0T4h~v%i*souI0cA*t!BhaN)`hmLecQ#{Ub=N9wx9mYiJ%(!O=}s#xWc%`M@R2t)IQ04 zlHuax8+-5Kk|mHfx_gHNNmu6X@Ap zj)qzQ_~s`Tv$@*n(*KNhfJ4$u`W-Nv6rY`1i+2#G^OgAFk&$;v>6$U=3p~IIT}L-K zrEoB)LYl5Of#-*7!t);-fQIc_U#gYV8K$7|RNVctrU9c6m8FR~KXmi@pbukjzMCNK zoMCOcmgZApjUcd$W~AMp;)+d9R#aD~0;;QuhNx)hK7W<%2L$FQ67m5=efDhuvM?C= zZ6nDRr1Ms_`Evk{^gPX+;m_R?>DJl)#iMJ>Ngg?A@EzLV1FU7b| z)$fSX9m5rFMg=59M&k11fBERdqELw1z}+iKG8TLMh2FWwm(w3W#iA{Rj^aIY4P`rv zp_w~A=aUAC#{?8lQ>-vbcv4l`bJiFOyb6X(eE76srSy@;yBByz3mhyz$|dZ9zW$R2 z%wyS0l_JbX`h`hL+ncZm1R`*=>^Q7_?ai)#Afftjuf&Dj_KxM;; z{&FSc#mP2bCZpX8zYdUsN?uRea_9LRt4V+RpH(RiDM`d-jWr^aoV8b*;VD2-*cjq*QrzCfEIgM)l zDndEodG5M6l8B_M1(^gir>muSsku@|v{2N)NA9vp*(EK|zIUlz-JD;k_wel|%SZdh z`V)M4ok2gqmBmj;fDoX%lqa(ToWer8#%@~l5ZTI+URQTabWLD3C|1`B^zn1$=Fzvr zfB;yG>~i;Kt;1$~fK>2{mWS;5f7i)h0v#^H7wS|{1mt%FqE%je{5m#mcPMAQ`}mupOo2@sdzo}I;%XoBUZw8n zG>Ffis3A%LYJyua?HAJ42XW0)Tkv%8bC1ShT-C;;vSy3oD2b7Mlx}k|mOmP9EJ>AS z^V{4HKZaMr&1dRofu@kt<}}NZXCBp+%&Q&{Ig2Zt>?Uhm9s4-mKN2N!`8Sy;&4v=I z1O^iF#uKsPzY!s{B3z7_^VmJ30e*AE;`4@(v^}x+MvI&ILt?INu-vy$xlTuUX$9kc zpwDW*Qwr9Jy$}v)N!L9Q+{w+%ls#Hr__B?Yi^G9qXJfOp9DTglFjLkNiha`D_N@id zdopL~^NDsr`@)Mc}>!$vFGzDv(p} zeON*x$1;U^G>gb=++5V*T! z0x>G3l~V(8)jK^>oVy&DnY;c*W5)-mj|gX&O$SCs?yYiWMJ7Ac{b7nx>>Sp4a|iwr zWVUd|c6xg?70u*|V#|tkP3X(d_E6+Wg|9t)QUkdi2a5I5<>9bf( z6gvh`N=W{DMOF_8Hd$+Z_B>MuMiCSf`r^Ml)1LPEjR^TBx7p~iL?t-Dfu@#J8^Zzs z@(4^~V~=Esl|z`m8<5Jajy>wqgMseOpvdY1*H9oyP19_#uy0;zr&8`d3ljFj6_A>@EvrE16QIrt!mR zl9H{b^uJOEV)Qt#ZmXMO90*gjx3dBF!2i5~Aj`gPA;e^^q2MRFX}}>pZ;=fsLo(w{ zNL3Gy*TxFDA=g;65V>dxYzlqb8=r!6+lXq2)>lFWU zG$?dt*7^{AU-dBx(fj?Z# z4{1f;KY{E)wkAtTOM9;#gKXa;%)pyYwpe4~tWDz-z!arURsVw@iK7s18*?=~V@w zGheBVjoZ6HIr{(1(BMh)%!8|_9}Csvw@F%q&*O!yhwcG7mVDYOh5+#yIe5?n$O+#$FJhu|LE-GbA& z)6m_w_>0SE*le61*}0Ro{( z1C0q68#vQ#R&)#kp)-Ddr{gMX?qcd}?dWRlU=IR$rl!TK*e~!Cf0>zn8fvCTexep= zUu^};JZ6@0kdAzA8pbd8;MJcpZ#XYGt2^13oR_qC*Vosp1RJ*r^sw=G7b)w&G9A8!3oQp(`e35%ldD`=KG ze}v3KJ~GJ(ina+?9ujwz1lA_|LvAl#4W@H%qc8=s-P>wH$qU2YyMg2)!uu{0>*_qR zzQ@w*WniKvEmddP+FqxuN+yw?&d0%?x*Ovru5nkMhD2|uGeu2)vC^dQ+cqGk3w0x- zdoayH%6N9W>AjBY3HM8CG$tXmu?7b0+ z44v2Ht*z@e(+8sgc65<%iZ>mimZ>kM9a5KyLh?)Jr4GYeCnzhtv)(+1fIv*3*RnG2 zJW~&vA)e%$%~vR0R??TMnSC$69nO$F;FK?Rl=IPm2uz9KXyUgsDlkm4T%5c?m+U25 zFx8sRUbU7j7CxAH`OUOcXD~rZ_r~eRtAlpclG=0WWGIbH)=xK9|3U#-#h0XMM~qd1 zNh%`!_U;yV#_Kf zt5GRCCaC%GGPU2#B9CU^ohhW7RBlDRQd*RD1!*9^QE9D&uX5Xzn2M3|=TRtR^(r^XU_30_5Dw zFvZhKI>|TNgH*L#q+k%U4WM56x5fL_Gi9EWg5m!f>198|3rfqvFr=AZe;bm#rlyLWomXH zA%e(K3~KR0Dikx72XU@0RX;Ob@miCkwcgOcDb{*4Ug%jKPz0Jpb8~wuO8;k=EAT8c zJE!AujsJGWt^8pHYQobz#}sayxKeFB(f8-i-~E-0)trHeh9D&?d;6{IPDrl}8BuI< z@*f+zzsWHcrw2(!!LM33Ysy}2Y;FqJ%~zAy)VY2XZsCb*0?lePL}ZWqWQLjBH1!Rp z61E{9&900-f{*ksLLd+C7kYfWJMR}3Jb*Pxc^D#+cW7J5-NB-!NI z{G5x6>nW#({7>L<_quz=ZE>}vUxPX^U*>6(a>7>j6;kr4X)ThT@0K%?slptH4!9pS zU%IXjMx3ptd#nwMADIm$3zz8DgbUkDckvCkof)?JN#-9u$D*Q4`wN=fq`vrYf1*q{ zy5R;{S64@*+tS?J%%|Zhz4C;ME27!^%6T2UggYX9Jhr*3?>41%7roLhu(S6p+y8zE z>EJvLBiESGG6n_)`i(Yq1ueG`As|<($(5}i9Cge{|XXwvCvdMd8=`r!2OgJ49>`AHt&K9$U#|a z-B9-6eQdkR={mtVlFZJaT}o1Szpb0wQ4Xa*%XF_`X(nSHG#c9Vh+t;w(ZwZ~!jYmn z=C4Sosug zY+D958e`vps^1nK=I5G&I6JFsQvoNL4KNh z=ew#^?-T@gt$`1BmD>rT*TL2Zc$SX?{B)BzeSLkatL=fQ5abQ$?$DzZUmO`yC$%wI z$h&Nx0isgh5gd`|45#4wJ6$&Wvm)1-a^$@bno6~+j76We<#xVCQS}!ZOG=`pm9AGd zE;{eA0qg84<$;Hd0i&DTvi@jvSkXsBcW_Ejlwlk^E;_QJjbmCU7j0^5XlMw=vo8<$`>l_UDx^h3t#f6A@fZF+_QAoyz4`n;{lj%X%KKwF2~T3E zX>at&7bnIO%V7(5rYItQf-}HqU7w(H>t$zi6moM7;6+I5(j?E;6n}Z+_AKrbWt@4T zM72mhA9{bJk={934x{fwelwqih+56-cWY1*Fv@~O!g0KSd6)eg67F5JHhXz|R{o%^ z=}8&Btvpm~wz17?w0>f)Jp>Jo=4r3al3@QuGJ>kUBv8_;XZ&?zW8-trVa1 zF^;gqAt+fEIQ-ti~AFEzer%cKQPW6E;SXi%;k|oNdMT(z{nyxV`2U6 zs~kH#FzOo=o1S8g5<1ExjfORtCQhkBJLhdS!}k;$wMBsL54!OG{D%MYx|>(e$>O4Z zKs(dCgk^Rs5)PX29U+Pk?%Y5})Cvp|JKmX0EiMkSCg^wcW}y-DH+J-JRKy;^_V)gs z#z>9SS^6chKSadOuraXk@x@RYdVcI`yrO&xM_g?OMZH8PkK6j5vC{Rc<`xZbTv7Ar zO3w2ySz?DH10I%_kB>h~5pyA*#1_Vbr_8oOL~?VlG(R+m;KAbxivGm&aLUR32|dq= z0R`6DJL2Bf(#p>oK@{~vi965nWmp=v%ZDa9_KdIc;a(T~Bfg0C;gzU`%r?(&>-Rw| zhF)BLZ>~@udE0UeGD@+M^#WF6+7}A=nO5-at2}e%oU$_BGDUvDxKV_K3NX+ro9|AH zx=OFefH37*fXgs%lDKNCn<&YC>TAV9j}`U4HP;-Xalyqk!=}|*ph#WWGBWf!_Rqk; zMK2>H)tFyVS65eqp_|m#VXs`jK||CbBW&BLKAg2@X!Q@e={qMNG!}@%zwK9@MXA3z zdyVNb>ICd(9y_~gVHt^-z_6AkINpsw5a38e>=zSppN>)bw)LSgh`VziTKW%&P;e#K-nrMKWAmKSZgs>Y1|5r|MBTNM(1rb!4 zOt|TC|85TP?_aI}Aw{{~$?1$yVjhvkp)DKz+;MT%u(sZ178HyN&MQNUDz=+><~zfi zbCT5B-&$zv&v29q%FggX=se})n-NxdH6a8%DhC^Pq;4?c^n58Y8HN1?QKRawtObjZ(XF0q-IqH*kJo>2MT~lHd ziC0^jmsmpNF{UiI0sav)YtM=T#5$o=A_ncu`zWgN3-7S$ND6tdf*is#mvM}GOjwbN zUwo1zSaly^)UBmP0aG$Gblc9dj7b?|W$u;TPmfWz@)hRj;7U^axMVytG zmu$Zc1evA1lO(QBy}y3{-Z`@JoS;p#EOksf^H^q<5`sx((bGxNy3+I02DO8xb?D7-Nof=+Q=EHBn~Xh-SVj|?e;%Ll$<>(t81scU?AA5ZqkzgkGB(ncFU zZqJN!ikEXh!^_G})dvU|WrkjW!b>+6_SCE2xC& zZIWgBV`ALnLBSE(i^k3^&`~Rx-Ikm*vp^{0?v5?Kbg2u8sCvrNoB?bx?tW|hDA^Z+ z55#`^u@)8mGLLwp9{UXwVV2SQMrpuyYf$|y?YrI!l|gwUQF_?GQe$nLF@ImTngLxr zr4Vh#x>(z%#I38Gi$}U{#||QUx#{^dVqn@&$!}yF&|J2MYiN`tbS&tUf8TuB)egyC z%N#mZ*5_|ggk!EY$jM)wj+a(glIZK=c%Me*F2FB2W|qk~lw6*p4=S^|wtgU!%e~p3 zH(Lyu9v_vRK=Lwh287h^=l^o%sj>#3PTy5llq>l&T|_oBYauYbsQ7q9*-lELQT^|n zHuZv(hnn^&Ce-SNX=7N0WrETEf(EM<^4hpGx;iYPQ6PThQB^Bc#vZJ}a=yAAW|CAH z;Z<93e&Du~aDL@*iGeYJ6%E4x!m&f5TAPk#Wlyf&?bHYl0<>QkY`XBO87-3&boAE| zQ>XUzg%-EEt2^{pCKtKEK9M(R);oa=Sw*>}G18OQL9xv6{;9eh)R%|GOZZkA=o@R? zHSCeSh{;@*Th!^PGyQ6J)o?b)aHDJ*#{QL|-E4)wF+XyYd*6h3cN4A$K*?w$ z8F12&ZA3V8gRs(jz_ZSWXEmx$;!eVmX{>|z$oM62HeF6@s>M>>!}e3ytpN9!T1$&t zr_&QSi91B4jB#l4O1~gcvgb=<+MmdMXYalZ zVQwEj!XQ^Aq7#;u0o5PWE|i3-6TGDw`WNQipv?N;K<~dFu>Qfw|J~&TV(g*D{2OW= zA#W4dE@v{ZWI`DQ+N^Mgywxd^llHuk{$y_x5)xp^dHo}8_#M_k#n_3qnvNPPt#czw z>kCm)m+n1BbVO~Zn*)VA1&+4Qjy?G;Wdyg|Rcfi5PHwouovAD6u9+Q)J>P3h(X0Nx zv?}YgdVW-?Lm37NG4}gxG$TrkJ32e7Xm4LuQ<9;bG1{0oA^WhWv~Ky&*$7ze!v|^# z3W~c`9I)cM3(|mW4ho~|4oc)jwD{p_gwY){qtCI-as*$CXGAs!%-^B7XkP3QjGt!M zyJT99fd9?j_SCCKlcsvuSpnfeD)DwSzl23?QDRo*vtJX#pP24n~Q4vG{t%6 z2R0f&k%DSwes{CPNc{SpmzPJ&L2KhiMYt^)4`a@0d$n5pFeA2w6DmM*X5U(Af2ahi zVSi_Yf`c&FI2a>1!k;~6Wi_Ar+Z|zTXD0_l`BuY$0m!waot@pH`+}XBxjCXZo1>~n zgI>PVE9Rn6mL5%ate2BRe1v~G{ED;Sfi(SFZ5+1=yWSU^fPu-fQ-z&lgr_HndY)qh z(aJ#UFG}Zjv}FW(ydGh2Pe)#iHn0cW?1tMJspI>!Dj)TUc$Hs$tOqFCv4_7$)4pUZ7ViFv4caMM+W8ulrp0PHlUa ziyb968>;P%fvmNPM@5qWLEq5+0r838yJ*7Yg)H$?^t<`&9MEqKQF;J|)-8YL0-2ll z$o2KpWg2*|fR8$7%t{iJ`Pz@JXlcK&+BRB{-A*66D2sLlseutcTJJXbBx*hrIy7HA zA|xaf5)wKF(wWmz@%XW&B|`po>$N8{AB9q{63dh(NiwN@m79ju#1A4@_|r9K(mPrg zh|r<{9E;2Em+v(A`f|gc0?j1RaOuTtAjuak5TBxnd>TOPjV6Wq&y2KTrv)T7+{91`6sZkMc1iR0q@*{NU+$N2ED;r@{thFqvy zs~oJ|ZuNan=mL^eGs;cP{ul4k3#ZgE2`*T$|DihPiMSHpu>5>1eG|Vkb487!` za9dB0eBU$X@)!KfZ4y?CbI-rI&^+?K@3~;XK9QlV$s+6PW4Z>~=sT?UNKPpgZ%irz z8ouS(Su37W4pEsv;!a6B4S<1b)%9Te+P~nSE2ClXR!ipyW14p+laIdp*B(iRnE z7jfq1<`#?;K76X@li$$b_0q%R>J();%(}Dtf?X~B$;H{+Z{LlBi?+}CSPHNI*+FxS zvUbpTYVtsc3%0*B6fP~v8ib8&OJdAVC7Ys+-aJegp#O>J3jM7H0cOkv1um5+7ls+C zEA-8}R-K1fjhC*`J3So}*<_g#{T-_;rXx+5{0^+C(a{38>+%LCa-_bx`UmR>&syJ7 z&*6TCaWgx(9})Jd$hV*f{l-O@999_z(-@o+^z0aLm_KGD* z#$!l(&qMb9CbNvF^yHCkzo4mEw;QI{409|`r zsSND}BTrk67!0?LqPpR&C29poIILW>*2qunDI7(X{NVIgGR@Vw0hzb)tYcLebnuV@4#e zV(Ab$3S`-gLnV2)I8LSK^RLJn$Xf)T8*P~F3-hWq=< z$w&-^nA5hgoUn!AuUTI|e~BUh(_VU+!}=OBMz479zuyWndi)#UDsx!Zr#-=1I3mlUAp?N&Lz_ zW8!yboz}|A*q)xApSubsgS#PnAo(Jmq6?}}NgS#dg#hEJ;{~>nM6;GQsu|mi3W^PJ zHiFzF^)%jWjtmW{6i7udGb;T6rY3AEW)h3`2gu4Q+K&=vLKJ)@3*&>_nAczG8kQ7S z{ow|Vr`Z)zz(N409d1P0Zj#I~(0&w?I^1IXw!85~ zF$wU;&7j?s*GJvut@gqJ1D`%EjuExx*@zHYz17T9#=DKU2J`M6Ej9@5^HIY^RTA4& z$k?8!pkj9?yv*RP9v8bdE|t7F?fFHYl;hMHG|zvXF%t#6bA7k!PHI>vfGxvZiMqik ziwWWs?qQOCGL6W%z?(V(KS;DfAakJhJ9>D>im^th1%76_h^t!;Afxn1Az8w9kx{_v z_F7$d0B1g)lA(BFMl5Sk1mB|M`i#=!_n8W7ApGZhzQS}X>ll1uX1zGrt$#ejc<0DT z6H?JL1%aS^RedSt0ITOE^TwQoD9-z3`;Q%6ckFf>Q_{NN1v0w)U6vhFD{EPZ>;tK7 zlRd(e;SZYw3Lik3v=!Lj=DIzT`?fm@w_)YbP znt5YAy_6b=`q*7!tAjfA>YZ!OSjrhRnB>VR!3i2iCet*$zHDV~j#^vt+~l})&w~jB zZq9aav6%>Em1jMhpzv)E5SGrE1I85{AOC0oQ%_g7Z*UMZGbbky3;)rR(iX$6-~5z9 z6#Vhtl7CFYTj0MK&l;XS1^L*AGeTqZyx%ftx?YG^stnM^p#@WqycKN0VLn14J^rS! zNg4Wn_jK^Doat;`P-7y_lqzO`I<#2t*U@ItCX#9C&GLcj$$a5OA5|1{^7BLR$k;{~ z76!DitbOt_&{v06o)>bQvvcF}gHa~%`Bwl*aUH@|P+rbXOqC~)T80@}FhX$0rj}0U z&iy|7nRN54jxON{FL@W7_^t_IbykgrLLHl;iP%RrJF`p^5nKGoL+cesx1C}kN5c-3 z>3cT4BqBv-BupGMm4KjvP9`-kYTw%VeU5NijM~xU3l6EHg*|=R6IYj$gQ1AAS~b%6 zT1jx)`}1c-C8eC2nyHh|KF94iA1V2(76|1NBv@IyFAlHnT;*1-5BWOIhwLHzR2zH6 za^$OMd1&X(Le$6YVIvG*Y&x~8I*4R-_hW;F!X)*~6r-2T_2mp1 zDc@dNTJm8M*wrc5Uk2?3&fv(7Wb9_>!q$7JjaVmwQZ4)%v%x-|gn|}>6_;t?{0OJ@ z9*l}@58s}Bi>rmuU?M@&9s(uE$k8BvfcH+f^owgh^2SkznMmAGLpE}>#%|#0W?HdY z90-4dQrK*3@bhaZrq8zxchTQ=(@W zY%3_$udT?7^3Qq-ICf4x>IWA(X$aHzmZ(I9ZSY5W)Go!LLVyM4?DTZc8rY^TE%7As?nnDuA--WFTw|LwH*yJG^=G;5(a&v(}8Z zT_R%;FZ_#dZ*@1#ya}OETCvtn@v8zcy#sEv<^x@=iyPb6qwTz($6H56YiT{ANhesX zV-yd&3=>Ecpz|g?i*|Mmxah$$Uza?tV<06Hs2S8BT6HVB2*15SL#8if!!4TL*Oj2n zO&0Zs`M@-5ej;B&K6Z7#L=PK4OD0*}kH&c_;DNmuC3PUyc6ew%`~t?^6Ghv*45rF6 zl?C?{RM3tw26=Se8`A67l?1r(#w>fcR+asu?q!3F@reo3sa}-JChMK?92y|J(PQgKpI^7OP9$^d2TH>(VCp)@gqe1 znJS3A1BtqAXWCA6iFR0ObYm$COye|elpLxOJqN zh}*W$*3NE9tVRY=ZXOtI{f%GHLPv)ZhFi{^_;oZB#AJKjj3M<*)l_(kT3j1-9R=yFQY%X)G>2@i&Hv z-dNw+)wb5BM=hlSlovvo+elwJT$_~gU0ISA$?AavLqpcig@pz%GklI@U>E`pfnLvv znW6;}(SBf}F%T?V4H=DlFlGko=Aan~Z`9Vv*`CJ&CDVrkL(lys(f4?NSpdUMi|#Yw zcG4!%#i^^BktT<>>4XW1h>+#nED`MnlkdxWvp*3OOx z1e-2(*_XU$C~lGl(13a_O|`y@i=g+_;l;kntSMrb9mvwOEs37tj-MD0vW%+BL3=ou z5)I0&?wM{;+gam9UQ(R?X-X48K~d(%IWX%IB8sr&Etpo%JeeZKPJ&_83cxf}w(7rR z_`=1@YhfxOik`j&e|bkRby2-;A^J{HYR}`{$}~^S=byA$roIm_v-i>Qfk-5`v0VXZ z1^%BZfd4tR{TI=|zkPXp&>$YO=XbM_xAC^VAJ16;Jp%7zYza6CMr7bkc=k+D<%q0X zBfqiK)*4${?T8c&K!qV)rzm@*OrR{Xh3c-7)sb$`EELWuijV}Pw%zQhp-Rtd``daXL!KkSEryqR|zhC#2bVC)u0@Rs^z!)L%+wANc zQxTfIk%Z;O;DJ_5qt9F?^Wi2w52pZrH5pqvZe_&(=FBa01=n|KZ2`dO+mrP9AP&5j zPN2P0sPWEhO^*P2kb-G`VGBJMje+@Z)PgiNE3` zcKv^vcS*~B@ATmQsHpfYuo8_aY|p`y$1@T_qdt$Fu*6tzD^fR2b7Qaq;yld zpIsz5u)m{(1BkYD<(bq3L4;G!9ejPoZbwK&1pT;q2wAbd<(JP=K9*fhc}4w9T3)`V z0;c-6_@QX}32hIMZ0m0wrsKDdx}WK9iHy)oY41tX!(r?+XH`}X4lyvddry|dQ#uq5 z-+$5-qz`vA-2@XEVE(4pttHf6R3F40{S<>d9_c8g%WQ5(H03#6U7x&n&EXLtnAr~i zC>I*G>gEUGN~vFClpq)8zRf|Cc+Jt%Skfu^SyT)`kJ87oe~kfsgWMA6nJ(qE~`$2RaFg-PPN-Bydg433!2r^K~uB9EPe8RyX`BV=RZmKa80h9Y477b1iP?G8aHf9(ihWFd*1hyuSu4qYu)?Qc`q# zjO{ZG9&87< zXyoh!x;G5cxe-73jPLjc(#CQ8cD|mhgg^^NR6dQ&e-W3bUe(D-fEJ*T1mR=JN?u+K zhd=xd@Lo-X*{|&CRAV##pxfEgk8v~NzeTf-BLO>`SiO(HR=ah~4{9P0Y$zQ@wL(&fUkPNbpWu8|J~I_o&w4_VNH@`5Y)$ zJ2_Q8X{T=!s!D(u;`qe6!P2LQRFIb85m{vqPfsK5j|Xe>cZ`M$6&-s@&T=?C{>~bu zekC*6aM8>={@_uEYiOND%vNhp|IhSU9F~_o z6j|~nRPwu~adVSi2A_3}lSx&jes>FHL&rR}{FzCung(s>bHO`9X83^|eK=#HyWVNtzt!{#Mi2cM z+*tNKK3*jId*~OWyzQQ)nc3*vTtA=R3BJ&M{XEq^$Z$K|`*5tCzuxMP)Xm2C=-((r zQ=7&5vz+M2tMaul_Q(S)e0#@SeA`}o=Rmp7TPL0$nm^b0t*eNlAD@pDF~=u~2uFO0 zc!XZDn?RfRT!6)-!SgAa&9n1M)&p`OiVB+ ze&$!b%+f}}C3rzcumee8*gdTlzyKE(Xrtci%ZixHo;8ur)F|KwZZZizdj^CAoW&t9 z9N{Nw=&rbLuu3m(_`pUVtUo^7oDzxckn|VbQo)~yQNoxyZRtGtnM`SOMB6t=Oz}ha zvxQnW+KD_1Id0436^AJ!7Z|GLJI{h)q=E=DfO8G_M1HpkwG+P|=b>I&HL_di@!C$K ztUcPb%!t~(1(yJVx8vi>w`*T_L8(qX)Bx57jgF0x#N)UGD#{bAjTvWq?k2Qi8b5ih zoqsVgK2G}0!{@Z0-S=wICB`sAi_x#`PWdIFsr{LLYB*APuv+GsXotO^iZ%L0 zH5hsz)+c-HWW&{vp#O4xxfzIDZvcPWL;>W>BsK##PQsZ|E6I*m*GRuby%ak zbG+6W7_Su6V%=s;6{|PTrnQjuWRi)7mbSmIPkJIU6zVk$n`>%2CKY%8-4#vG7l*F- zCZO7)?Z+2<%J}5XrFs&YP|p0T#f%B)wF|^JQCDbxv0*~@XwO-`2@I5_GJs(7{z?=i zgk~%c9Uvn)0C0_fFWmLlFZejx<>k!cqB6iiDwk7hKCA$k3II2MARMN<=0EcX>H{Q3 zop^(|$G{jd(f#??VLLk&r(bg~E+pteN44FdwY4ILx-F^sGv)bCM~3%@u(BrJl0ii& z%>47EN$ecj5(x{TAWe_d0H*gIiuj-2Q;Sx6?0bd*Thh2UIw9Wl$uh)R{5OM6i*Y+4 z?EV)Du6VILo2}D(VG*EE($Lhzp^9o4=?9h6)Cm9Wo*Is%7A*NCDJco8_vq3^l1p5L zsUVfrw* zG8zSvXtDA3#>u*Veo~+;bFOCTmNCMG8XHPGI|cnHDGNZxx>KnpbrY1M5c48$YGR_( zGDD7WsKJZ9$MMKA+uo-Z(C)Gv1@X4X>)Fzc!DK1W*cLq7tUT)$pSdOh1#{odU_$ao zj~aDjkc8ma*^B0`dyfzBJC^%@R(n#l1swheXDA=f+AaxEr9dQgu?^lxU}KAdU|v9PNp3-UoeS-F1Z$-;%(*tyjV}c6CEYd-JKodjvzdY z!xzB9{>;hgoNu{3Y@!!fTO$}{xacP3dEomT$z72|S%0&YlICaK4#TWqmI}z^dARiL zBV(E?o?sCz=btxfY93v8gA#_-IgNmh_g?8uU*7VvI|gawh0ck+(MudO5sZexM-p$J zi=7(2XYx3{iL>iYJ{VA&MZTP$pMMUJ6Tv(f$1CLs-9d+->vviz?(~>473!Czkg(nD za^TwNe<{=aNR9sgtHG$F7*=_TDfPf(-!q)tx}G)78{w=b5WN6@Q2TXpWN2u$JM#Rf zm}G#???@DMXNGX^y>PgLOU5JPW@M3R^`eHiT%cCC+ID^(_w5!~2Mz(-$aFn}h}C02 z!!wZcPKc(%#)0wH;|_e5cp%7lfIQ*5`Sdf|Eu}i}2=oZ%_&FM(JpZ>Dj(&#U9Jp|} z5pCHABm+V&~-^^fqYT_ZA*4sh5F{lYfZr`)|CGND1fPGTlK3=>D zl&M`xt^-3|O73?FXOtO31H?JeueZ0g@_Y#RyX&{}b5~gYE=x0N%c<$Zi#JX?BYCaD z^;6@bF$+WE>NkH)!XqL&&ja=FdH&a=gHpLg#Ofu z?{$jw#@YSHV9JT6_Ju?J8ulKx7wZ1g@bfOK_QedH!K)>v?bfXwn)fP3n?=a6woXT( z(`|^*G5s}K_gAL^45$Gj83^PFp5i}^3zDPyQU>5XB)Uq}~PTIy4}|M#uu#umU2e5otF zh=q@Y67tVs|FFeSJ;&jNXY;{*C5}55Fj(41h&?c8EoDj3!drGCkh|TX1dg4s($q5t z%i{kQ6lYY z*x0?Q=k!VF|5vH%-{ruR044%J{L)_*@PDDh|MJF+8S#@hhX&WezFXHPbb!u-(cZgT zbkY46j0?BpxQ{4XzP%a0H4kD6f5&@whq-)H@qK1NYHhC{BD!-q5`$DxejECL8cUUz z6ir@c;#$bh@7!U~R*+c&G@rQ>K=c8niXEbw_IGqlbNVFj#JazgdXl=t{}GJ0Zn-(7_>3!2dw%?zl7bHl-&&_F12R z46!`e1p4Z&j!wbVipS~3>t&!~213Gqxzry*Xh6?_3^nPwlZj44N5@NF0NO>%`iuG@ z7>aqd4P8{bo;m!!)CT!oWT?Gh@Zucdh(~6x-@B+6ONpc^21Vg5j=D^B?F27Be#}Zw zOB(_fQOxV~=fxHB_UL%CO~ zt`hAH4#s9vN#6KOpYa)Pq(4K97%S%M3ZYshmJJ8-(OF_TQ${k5#I#Hf*C9b6(ZU$V zst!gYy^)|ak#-wuNefl5ZwVC~-V1&eLOL;&BBt4TbaQpTaY6Sx*Xw-xjBWyW4WwygANwi>)bz^y zGF74<=+>J}r7}8=_Ju_ZD27ffU}9-y!J##6#PW)IDMTR}RN=59#cqym4r|t1qgb`c zqThnk;>C)ds~Ff`DE{;#9Wio@CLs#A_W=^lXL9!~o+O&J)?wvP+<5~R01=yC(a7*&Z17k9~aTDlW?~+B^%m6WSPp#0jaS&6vV+ z56zPIHyuK2lzd>DY}7C6*Cu*&(@0C2L)LV{CWwB}%A5Kgm^mW)(=;@RWJq2mqP=N& zisKCe@IckBjDS0ONbjuAHqPN#A|@?bu?=tW8kw1^b1*U)IwFh=YE3%(RnGoqWwOSB zT?3r7&G$Sw5}nAO8cjq<$nmaT;CF%@tZ?TlF;HG6x6s@j{CvDq7o9-kBkTppFGVe_fk|G;g(Et5@adw?pX_syh)VbA;dEb#N#En-;r?l7IVM@7F89cKI7gFzB!aAN+Pq zC2|=i;y*;Yi**inK&%B;_};sRG(&@Iu*`EpVvNWD{N9^TA@;u8gNgdj&g|6!#;U~s z+VbkgL-6Tohe!2~Yrh*<$`A)D*awmXJz=hEe?r*+2w48#?*rbUc%?ep5JpuWfEQmu NujN!_%U&7>{4e-+$`k+q diff --git a/paradise.dme b/paradise.dme index 85bf34aeeac..27b83d130fb 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1621,7 +1621,7 @@ #include "code\modules\mob\living\carbon\brain\login.dm" #include "code\modules\mob\living\carbon\brain\MMI.dm" #include "code\modules\mob\living\carbon\brain\MMI_radio.dm" -#include "code\modules\mob\living\carbon\brain\posibrain.dm" +#include "code\modules\mob\living\carbon\brain\robotic_brain.dm" #include "code\modules\mob\living\carbon\brain\say.dm" #include "code\modules\mob\living\carbon\brain\update_status.dm" #include "code\modules\mob\living\carbon\human\appearance.dm" @@ -2191,6 +2191,7 @@ #include "code\modules\surgery\organs\kidneys.dm" #include "code\modules\surgery\organs\liver.dm" #include "code\modules\surgery\organs\lungs.dm" +#include "code\modules\surgery\organs\mmi_holder.dm" #include "code\modules\surgery\organs\organ.dm" #include "code\modules\surgery\organs\organ_external.dm" #include "code\modules\surgery\organs\organ_icon.dm" From d3b06b5318d22606432079df621e444c8ab769a1 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 12 Jul 2018 20:00:50 -0400 Subject: [PATCH 33/99] fixed a icon name it is now ded --- icons/obj/fish_items.dmi | Bin 34359 -> 34359 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/fish_items.dmi b/icons/obj/fish_items.dmi index 47b62af97f751c7817dc6a33f89ac34a9f3e07bc..76a9486fee604f8137f5cd307b79c70521c3ddc8 100644 GIT binary patch delta 336 zcmV-W0k8hIi~_fe0+2d3O>5&Y5Qfk8uMq83yCk-=(1R~aO39)93u0o8Wub{xWVI&$ zeh-0lwoRf@VDZI<=Y8kHqmPkrRDTI}9W_2vVSdp8~OKHYeP&H zN?z8+ljf7G8b^#t#(!c^dq0!vKZsOE2xG2D+YpccTQmUmIq9J>m%(cJWofmnzo>fe zwOa8a^xkWg-f$MS;<1F_xH%AlyOzVvLJ7fLOXy6vmep6GWjBZ{yFU>|mpy@tC}Wr+ zj4pea7Ewl|87O~MEu!2=xiu{!UZe@=;M3kGjJK0b0|dvTxQ4+VnAe2}qf1YdtN}C{ i?Z3Ipe{<9SQ9QqG#rAbq{sABsL%~3>lP8hov3aA delta 336 zcmV-W0k8hIi~_fe0+2d3&uZf^5XR5;Q;7DeT@u?_=)spIrR31Qf|yuiS!iMvS*^+2 z?;)_xwn;P!EWX(A`@Z=!*1wT(RDS_G^7EL1vJ#*%YU;dCcav2Z3A-3;Lx>$9hRy6kmh*uNIPjr{v8Ha()oz;83FZM~fa)qAg#q#=LZu{q1WIyK{) zl9$?e(tMIN#t~zZ@t+vf-p{1^4>0R-GA2`m z(PdAjMU+u#2FhPmizv5J?wA%4uhIl`@M-T8#@orJ0fOUET*F`w%8enXCf< From 3c8d94a7c66c0a84fd9fcdc814f22c154667504d Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 12 Jul 2018 20:15:08 -0400 Subject: [PATCH 34/99] preventing installation of robotic brain in organic chest --- code/modules/surgery/organs/organ.dm | 1 + code/modules/surgery/organs/subtypes/machine.dm | 3 ++- code/modules/surgery/organs_internal.dm | 13 +++++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 6cca1117b28..c2487503bfa 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -30,6 +30,7 @@ var/tough = FALSE //can organ be easily damaged? var/emp_proof = FALSE //is the organ immune to EMPs? var/hidden_pain = FALSE //will it skip pain messages? + var/requires_robotic_bodypart = FALSE /obj/item/organ/Destroy() diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index cbcf2217b66..f803d51cc04 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -144,4 +144,5 @@ dead_icon = "posibrain" parent_organ = "chest" status = ORGAN_ROBOT - species = "Machine" \ No newline at end of file + species = "Machine" + requires_robotic_bodypart = TRUE // Can't stick this in someone's chest, unless their chest is robotic \ No newline at end of file diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 11e16d10b1a..32270c329c2 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -101,6 +101,9 @@ if(is_int_organ(tool)) current_type = "insert" I = tool + if(I.requires_robotic_bodypart) + to_chat(user, "[I] is an organ that requires a robotic interface[target].") + return -1 if(target_zone != I.parent_organ || target.get_organ_slot(I.slot)) to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") return -1 @@ -257,12 +260,14 @@ else if(current_type == "insert") I = tool - user.drop_item() - I.insert(target) - spread_germs_to_organ(I, user, tool) - if(!user.canUnEquip(I, 0)) + if(I.requires_robotic_bodypart) + to_chat(user, "[I] is an organ that requires a robotic interface[target].") + return FALSE + if(!user.drop_item()) to_chat(user, "[I] is stuck to your hand, you can't put it in [target]!") return 0 + I.insert(target) + spread_germs_to_organ(I, user, tool) if(affected) user.visible_message(" [user] has transplanted [tool] into [target]'s [affected.name].", From 26ad6f9fbde8103215ebe9b2d7a5d510b1ccf195 Mon Sep 17 00:00:00 2001 From: datlo Date: Fri, 13 Jul 2018 15:02:03 +0100 Subject: [PATCH 35/99] Removes space cleaner and mask, add spaceacilin Add spaceaccilin to the reagents injected by the surgery table, preventing infection. Removing space cleaner and mask as they are no longer necessary. --- code/game/gamemodes/miniantags/abduction/abduction.dm | 2 -- code/game/gamemodes/miniantags/abduction/abduction_gear.dm | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index dacab9344c0..ece500e6267 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -233,7 +233,6 @@ agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit agent.equip_to_slot_or_del(new /obj/item/storage/backpack(agent), slot_back) agent.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat, slot_gloves) - agent.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical, slot_in_backpack) /datum/game_mode/abduction/proc/get_team_console(team) var/obj/machinery/abductor/console/console @@ -271,7 +270,6 @@ console.gizmo = G G.console = console scientist.equip_to_slot_or_del(G, slot_in_backpack) - scientist.equip_to_slot_or_del(new /obj/item/reagent_containers/spray/cleaner, slot_in_backpack) var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(scientist) beamplant.implant(scientist) scientist.update_icons() diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 82614843882..9b2a0ca621b 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -258,7 +258,6 @@ name = "Dissection Guide" icon_state = "alienpaper_words" info = {"Dissection for Dummies
- Always keep your dissection area sterile, and wear gloves and mask while dissection is in-progress.

1.Acquire fresh specimen.
2.Put the specimen on operating table.
@@ -593,7 +592,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon = 'icons/obj/abductor.dmi' icon_state = "bed" no_icon_updates = 1 //no icon updates for this; it's static. - injected_reagents = list("corazone") + injected_reagents = list("corazone","spaceacillin") /obj/structure/closet/abductor name = "alien locker" From 5ad5b7382be7b7b15b92b93c7c88188b2e2726b2 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Fri, 13 Jul 2018 13:30:33 -0700 Subject: [PATCH 36/99] Adds a var_edited update so it leaves fingerprints --- code/datums/datumvars.dm | 26 +++++++++++++++++++++++++- code/game/machinery/machinery.dm | 5 ++--- code/game/objects/objs.dm | 20 ++++++++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 9526a3e671a..485d0f1165a 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -781,6 +781,30 @@ log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") message_admins("[key_name_admin(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") + else if(href_list["makespeedy"]) + if(!check_rights(R_DEBUG|R_ADMIN)) + return + var/obj/A = locateUID(href_list["makespeedy"]) + if(!istype(A)) + return + A.var_edited = TRUE + A.makeSpeedProcess() + log_admin("[key_name(usr)] has made [A] speed process") + message_admins("[key_name(usr)] has made [A] speed process") + return TRUE + + else if(href_list["makenormalspeed"]) + if(!check_rights(R_DEBUG|R_ADMIN)) + return + var/obj/A = locateUID(href_list["makenormalspeed"]) + if(!istype(A)) + return + A.var_edited = TRUE + A.makeNormalProcess() + log_admin("[key_name(usr)] has made [A] process normally") + message_admins("[key_name(usr)] has made [A] process normally") + return TRUE + else if(href_list["addreagent"]) /* Made on /TG/, credit to them. */ if(!check_rights(R_DEBUG|R_ADMIN)) return @@ -1327,4 +1351,4 @@ if(href_list["listrefresh"]) debug_variables(locate(href_list["listrefresh"])) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index a29dcb9e274..8994d1eccbd 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -117,7 +117,6 @@ Class Procs: var/use_log = list() var/list/settagwhitelist = list()//WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST. atom_say_verb = "beeps" - var/speed_process = 0 // Process as fast as possible? var/defer_process = 0 /obj/machinery/Initialize() @@ -138,7 +137,7 @@ Class Procs: isprocessing = TRUE // all of these isprocessing = TRUE can be removed when the PS is dead // gotta go fast -/obj/machinery/proc/makeSpeedProcess() +/obj/machinery/makeSpeedProcess() if(speed_process) return speed_process = 1 @@ -147,7 +146,7 @@ Class Procs: isprocessing = TRUE // gotta go slow -/obj/machinery/proc/makeNormalProcess() +/obj/machinery/makeNormalProcess() if(!speed_process) return speed_process = 0 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index fe9e8444378..3e546d6afe8 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -24,6 +24,7 @@ var/burntime = 10 //How long it takes to burn to ashes, in seconds var/burn_world_time //What world time the object will burn up completely var/being_shocked = 0 + var/speed_process = FALSE var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart? var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created. @@ -65,6 +66,7 @@ /obj/Destroy() machines -= src processing_objects -= src + fast_processing -= src SSnanoui.close_uis(src) return ..() @@ -279,6 +281,24 @@ a { /obj/proc/on_mob_move(dir, mob/user) return +/obj/proc/makeSpeedProcess() + if(speed_process) + return + speed_process = TRUE + processing_objects.Remove(src) + fast_processing.Add(src) + +/obj/proc/makeNormalProcess() + if(!speed_process) + return + speed_process = FALSE + processing_objects.Add(src) + fast_processing.Remove(src) + /obj/vv_get_dropdown() . = ..() .["Delete all of type"] = "?_src_=vars;delall=[UID()]" + if(!speed_process) + .["Make speed process"] = "?_src_=vars;makespeedy=[UID()]" + else + .["Make normal process"] = "?_src_=vars;makenormalspeed=[UID()]" From 5f31b0397205295e9450818010894aff9d21099d Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 13 Jul 2018 18:09:16 -0400 Subject: [PATCH 37/99] splitting --- code/game/machinery/computer/ai_core.dm | 2 +- code/modules/admin/admin_verbs.dm | 26 ++++ .../mob/living/carbon/brain/robotic_brain.dm | 133 ++++++++++-------- code/modules/mob/living/carbon/human/human.dm | 3 +- .../living/carbon/human/species/station.dm | 2 +- .../surgery/organs/subtypes/machine.dm | 24 ++-- 6 files changed, 117 insertions(+), 73 deletions(-) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 1a32e8a94ee..67f1dba85f0 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -117,7 +117,7 @@ return laws = M.laws - if(istype(P, /obj/item/mmi) || istype(P, /obj/item/mmi/robotic_brain)) + if(istype(P, /obj/item/mmi)) if(!P:brainmob) to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.") return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 44075d06548..fd860e6c448 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -823,6 +823,19 @@ var/list/admin_verbs_ticket = list( if(!check_rights(R_ADMIN)) return + if(!istype(H)) + if(istype(H, /mob/living/carbon/brain)) + var/mob/living/carbon/brain/B = H + if(istype(B.container, /obj/item/mmi/robotic_brain/positronic)) + var/obj/item/mmi/robotic_brain/positronic/C = B.container + var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc + if(ishuman(P.owner)) + H = P.owner + else + return + else + return + if(holder) admin_log_and_message_admins("is altering the appearance of [H].") H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0) @@ -836,6 +849,19 @@ var/list/admin_verbs_ticket = list( if(!check_rights(R_ADMIN)) return + if(!istype(H)) + if(istype(H, /mob/living/carbon/brain)) + var/mob/living/carbon/brain/B = H + if(istype(B.container, /obj/item/mmi/robotic_brain/positronic)) + var/obj/item/mmi/robotic_brain/positronic/C = B.container + var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc + if(istype(P.owner, /mob/living/carbon/human)) + H = P.owner + else + return + else + return + if(!H.client) to_chat(usr, "Only mobs with clients can alter their own appearance.") return diff --git a/code/modules/mob/living/carbon/brain/robotic_brain.dm b/code/modules/mob/living/carbon/brain/robotic_brain.dm index f46613527b2..ea83ab90206 100644 --- a/code/modules/mob/living/carbon/brain/robotic_brain.dm +++ b/code/modules/mob/living/carbon/brain/robotic_brain.dm @@ -1,21 +1,25 @@ /obj/item/mmi/robotic_brain name = "robotic brain" - desc = "An advanced circuit, capable of housing an advanced non-sentient synthetic intelligence." + desc = "An advanced circuit, capable of housing a non-sentient synthetic intelligence." icon = 'icons/obj/module.dmi' icon_state = "boris_blank" + var/blank_icon = "boris_blank" + var/searching_icon = "boris_recharging" + var/occupied_icon = "boris" w_class = WEIGHT_CLASS_NORMAL origin_tech = "biotech=3;programming=3;plasmatech=2" - var/searching = 0 + var/searching = FALSE var/askDelay = 10 * 60 * 1 //var/mob/living/carbon/brain/brainmob = null var/list/ghost_volunteers[0] req_access = list(access_robotics) mecha = null//This does not appear to be used outside of reference in mecha.dm. - var/silenced = 0 //if set to 1, they can't talk. + var/silenced = FALSE //if TRUE, they can't talk. var/next_ping_at = 0 var/requires_master = TRUE var/mob/living/carbon/human/imprinted_master = null + var/ejected_flavor_text = "circuit" /obj/item/mmi/robotic_brain/Destroy() imprinted_master = null @@ -26,12 +30,12 @@ to_chat(user, "You press your thumb on [src] and imprint your user information.") imprinted_master = user return - if(brainmob && !brainmob.key && searching == 0) + if(brainmob && !brainmob.key && !searching) //Start the process of searching for a new user. to_chat(user, "You carefully locate the manual activation switch and start [src]'s boot process.") - icon_state = "boris_recharging" + icon_state = searching_icon ghost_volunteers.Cut() - searching = 1 + searching = TRUE request_player() spawn(600) if(ghost_volunteers.len) @@ -52,33 +56,34 @@ if(check_observer(O)) to_chat(O, "\A [src] has been activated. (Teleport | Sign Up)") -/obj/item/mmi/robotic_brain/proc/check_observer(var/mob/dead/observer/O) +/obj/item/mmi/robotic_brain/proc/check_observer(mob/dead/observer/O) if(cannotPossess(O)) - return 0 + return FALSE if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept")) - return 0 + return FALSE if(!O.can_reenter_corpse) - return 0 + return FALSE if(O.client) - return 1 - return 0 + return TRUE + return FALSE -/obj/item/mmi/robotic_brain/proc/question(var/client/C) +/obj/item/mmi/robotic_brain/proc/question(client/C) spawn(0) - if(!C) return + if(!C) + return var/response = alert(C, "Someone is requesting a personality for a [src]. Would you like to play as one?", "[src] request", "Yes", "No", "Never for this round") - if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. + if(!C || brainmob.key || !searching) + return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. if(response == "Yes") transfer_personality(C.mob) else if(response == "Never for this round") C.prefs.be_special -= ROLE_POSIBRAIN // This should not ever happen, but let's be safe -/obj/item/mmi/robotic_brain/dropbrain(var/turf/dropspot) +/obj/item/mmi/robotic_brain/dropbrain(turf/dropspot) log_runtime(EXCEPTION("[src] at [loc] attempted to drop brain without a contained brain."), src) - return -/obj/item/mmi/robotic_brain/transfer_identity(var/mob/living/carbon/H) +/obj/item/mmi/robotic_brain/transfer_identity(mob/living/carbon/H) name = "[src] ([H])" if(isnull(brainmob.dna)) brainmob.dna = H.dna.Clone() @@ -90,11 +95,10 @@ brainmob.mind.assigned_role = "Positronic Brain" if(H.mind) H.mind.transfer_to(brainmob) - to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a circuit.") - become_occupied("boris") + to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a [ejected_flavor_text].") + become_occupied(occupied_icon) if(radio) radio_action.ApplyIcon() - return /obj/item/mmi/robotic_brain/attempt_become_organ(obj/item/organ/external/parent, mob/living/carbon/human/H) if(..()) @@ -103,7 +107,7 @@ /obj/item/mmi/robotic_brain/proc/transfer_personality(mob/candidate) - searching = 0 + searching = FALSE brainmob.key = candidate.key name = "[src] ([brainmob.name])" @@ -112,29 +116,27 @@ to_chat(brainmob, "Remember, the purpose of your existence is to serve [imprinted_master]'s every word, unless lawed or placed into a mech in the future.") brainmob.mind.assigned_role = "Positronic Brain" - var/turf/T = get_turf_or_move(loc) - for(var/mob/M in viewers(T)) - M.show_message("[src] chimes quietly.") - become_occupied("boris") + visible_message("[src] chimes quietly.") + become_occupied(occupied_icon) /obj/item/mmi/robotic_brain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. - if(src.brainmob && src.brainmob.key) return + if(brainmob && brainmob.key) + return - src.searching = 0 - icon_state = "boris_blank" + searching = FALSE + icon_state = blank_icon - var/turf/T = get_turf_or_move(src.loc) - for(var/mob/M in viewers(T)) - M.show_message("[src] buzzes quietly as the red light fades out. Perhaps you could try again?") + visible_message("[src] buzzes quietly as the light fades out. Perhaps you could try again?") -/obj/item/mmi/robotic_brain/Topic(href,href_list) +/obj/item/mmi/robotic_brain/Topic(href, href_list) if("signup" in href_list) var/mob/dead/observer/O = locate(href_list["signup"]) - if(!O) return + if(!O) + return volunteer(O) -/obj/item/mmi/robotic_brain/proc/volunteer(var/mob/dead/observer/O) +/obj/item/mmi/robotic_brain/proc/volunteer(mob/dead/observer/O) if(!searching) to_chat(O, "Not looking for a ghost, yet.") return @@ -171,40 +173,41 @@ if(brainmob && brainmob.key) switch(brainmob.stat) if(CONSCIOUS) - if(!brainmob.client) msg += "It appears to be in stand-by mode.\n" //afk - if(UNCONSCIOUS) msg += "It doesn't seem to be responsive.\n" - if(DEAD) msg += "It appears to be completely inactive.\n" + if(!brainmob.client) + msg += "It appears to be in stand-by mode.\n" //afk + if(UNCONSCIOUS) + msg += "It doesn't seem to be responsive.\n" + if(DEAD) + msg += "It appears to be completely inactive.\n" else msg += "It appears to be completely inactive.\n" msg += "*---------*" to_chat(user, msg.Join("")) /obj/item/mmi/robotic_brain/emp_act(severity) - if(!src.brainmob) + if(!brainmob) return - else - switch(severity) - if(1) - src.brainmob.emp_damage += rand(20,30) - if(2) - src.brainmob.emp_damage += rand(10,20) - if(3) - src.brainmob.emp_damage += rand(0,10) + switch(severity) + if(1) + brainmob.emp_damage += rand(20, 30) + if(2) + brainmob.emp_damage += rand(10, 20) + if(3) + brainmob.emp_damage += rand(0, 10) ..() /obj/item/mmi/robotic_brain/New() - src.brainmob = new(src) - src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" - src.brainmob.real_name = src.brainmob.name - src.brainmob.loc = src - src.brainmob.container = src - src.brainmob.stat = 0 - src.brainmob.SetSilence(0) - dead_mob_list -= src.brainmob - + brainmob = new(src) + brainmob.name = "[pick(list("PBU", "HIU", "SINA", "ARMA", "OSI"))]-[rand(100, 999)]" + brainmob.real_name = brainmob.name + brainmob.forceMove(src) + brainmob.container = src + brainmob.stat = CONSCIOUS + brainmob.SetSilence(0) + dead_mob_list -= brainmob ..() -/obj/item/mmi/robotic_brain/attack_ghost(var/mob/dead/observer/O) +/obj/item/mmi/robotic_brain/attack_ghost(mob/dead/observer/O) if(searching) volunteer(O) return @@ -213,6 +216,16 @@ if(check_observer(O) && (world.time >= next_ping_at)) next_ping_at = world.time + (20 SECONDS) playsound(get_turf(src), 'sound/items/posiping.ogg', 80, 0) - var/turf/T = get_turf_or_move(src.loc) - for(var/mob/M in viewers(T)) - M.show_message("[src] pings softly.") \ No newline at end of file + visible_message("[src] pings softly.") + +/obj/item/mmi/robotic_brain/positronic + name = "positronic brain" + icon = 'icons/obj/assemblies.dmi' + icon_state = "posibrain" + blank_icon = "posibrain" + searching_icon = "posibrain-searching" + occupied_icon = "posibrain-occupied" + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." + silenced = TRUE + requires_master = FALSE + ejected_flavor_text = "metal cube" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 06a287e1645..dbc788cd0bb 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -123,7 +123,8 @@ /mob/living/carbon/human/machine/created/Initialize(mapload) ..() - real_name = "Integrated Robotic Chassis ([rand(1, 9999)])" + rename_character(null, "Integrated Robotic Chassis ([rand(1, 9999)])") + update_dna() for(var/obj/item/organ/external/E in bodyparts) if(istype(E, /obj/item/organ/external/chest) || istype(E, /obj/item/organ/external/groin)) continue diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index f0f9b359252..6b692601226 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -958,7 +958,7 @@ butt_sprite = "machine" has_organ = list( - "brain" = /obj/item/organ/internal/brain/posibrain, + "brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain, "cell" = /obj/item/organ/internal/cell, "optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2. "charger" = /obj/item/organ/internal/cyberimp/arm/power_cord diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index f803d51cc04..589ade0e7de 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -136,13 +136,17 @@ . = ..() -/obj/item/organ/internal/brain/posibrain - name = "positronic brain" - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." - icon = 'icons/obj/assemblies.dmi' - icon_state = "posibrain-occupied" - dead_icon = "posibrain" - parent_organ = "chest" - status = ORGAN_ROBOT - species = "Machine" - requires_robotic_bodypart = TRUE // Can't stick this in someone's chest, unless their chest is robotic \ No newline at end of file +/obj/item/organ/internal/brain/mmi_holder/posibrain/New() + stored_mmi = new /obj/item/mmi/robotic_brain/positronic(src) + ..() + spawn(1) + if(!QDELETED(src)) + if(owner) + stored_mmi.name = "positronic brain ([owner.real_name])" + stored_mmi.brainmob.real_name = owner.real_name + stored_mmi.brainmob.name = stored_mmi.brainmob.real_name + stored_mmi.icon_state = "posibrain-occupied" + update_from_mmi() + else + stored_mmi.loc = get_turf(src) + qdel(src) \ No newline at end of file From 25b53a8a6e196b49bd89b427208e069ee50974bd Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 13 Jul 2018 18:17:42 -0400 Subject: [PATCH 38/99] eh --- code/modules/admin/admin_verbs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index fd860e6c448..72334496ea5 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -855,7 +855,7 @@ var/list/admin_verbs_ticket = list( if(istype(B.container, /obj/item/mmi/robotic_brain/positronic)) var/obj/item/mmi/robotic_brain/positronic/C = B.container var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc - if(istype(P.owner, /mob/living/carbon/human)) + if(ishuman(P.owner)) H = P.owner else return From 8286638816472cb00f60da150fbd3a5cebbb6c71 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 14 Jul 2018 00:35:21 -0400 Subject: [PATCH 39/99] Automatic changelog generation for PR #9168 [ci skip] --- html/changelogs/AutoChangeLog-pr-9168.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9168.yml diff --git a/html/changelogs/AutoChangeLog-pr-9168.yml b/html/changelogs/AutoChangeLog-pr-9168.yml new file mode 100644 index 00000000000..ec7e8f79200 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9168.yml @@ -0,0 +1,4 @@ +author: "Citinited" +delete-after: True +changes: + - tweak: "The tachyon-doppler array now has a logging interface, and can print off stored explosive logs. Brag to your friends about your bomb-making skills!" From ab40b943de359327ee804f8646cecdd50372a044 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 14 Jul 2018 00:41:32 -0400 Subject: [PATCH 40/99] Automatic changelog generation for PR #9204 [ci skip] --- html/changelogs/AutoChangeLog-pr-9204.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9204.yml diff --git a/html/changelogs/AutoChangeLog-pr-9204.yml b/html/changelogs/AutoChangeLog-pr-9204.yml new file mode 100644 index 00000000000..2791b7d6e66 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9204.yml @@ -0,0 +1,5 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "Robotic brains have their own unique sprite and full flavortext's now" + - bugfix: "Fixed a bug where IRC's would have IPC names" From f0b73e39d0867b4c06136f1e8623494d4c808898 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 14 Jul 2018 00:52:38 -0400 Subject: [PATCH 41/99] Automatic changelog generation for PR #9045 [ci skip] --- html/changelogs/AutoChangeLog-pr-9045.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9045.yml diff --git a/html/changelogs/AutoChangeLog-pr-9045.yml b/html/changelogs/AutoChangeLog-pr-9045.yml new file mode 100644 index 00000000000..6dfd20c3656 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9045.yml @@ -0,0 +1,4 @@ +author: "Anasari" +delete-after: True +changes: + - tweak: "Assuming there is heal left, bandages and ointments used on limbs now heal both the limb and the hand / foot. Bandages and ointments used on the torso now heal head, arms, and lower body. The one on lower body heals the legs too." From 3b581db2d24581c412647cde07c64a1e18d57b8b Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 14 Jul 2018 02:04:54 -0400 Subject: [PATCH 42/99] Automatic changelog generation for PR #9060 [ci skip] --- html/changelogs/AutoChangeLog-pr-9060.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9060.yml diff --git a/html/changelogs/AutoChangeLog-pr-9060.yml b/html/changelogs/AutoChangeLog-pr-9060.yml new file mode 100644 index 00000000000..acc584be206 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9060.yml @@ -0,0 +1,4 @@ +author: "Aurorablade" +delete-after: True +changes: + - rscadd: "Adds Spess Koi and related event." From 2754abffe3ebc135b22372c2765056cd1804b4e2 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 14 Jul 2018 09:09:05 +0000 Subject: [PATCH 43/99] Automatic changelog compile, [ci skip] --- html/changelog.html | 19 +++++++++++++++++++ html/changelogs/.all_changelog.yml | 13 +++++++++++++ html/changelogs/AutoChangeLog-pr-9045.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9060.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9168.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9204.yml | 5 ----- 6 files changed, 32 insertions(+), 17 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9045.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9060.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9168.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9204.yml diff --git a/html/changelog.html b/html/changelog.html index 2d6490402bc..d3996a85a40 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,25 @@ -->
+

14 July 2018

+

Anasari updated:

+
    +
  • Assuming there is heal left, bandages and ointments used on limbs now heal both the limb and the hand / foot. Bandages and ointments used on the torso now heal head, arms, and lower body. The one on lower body heals the legs too.
  • +
+

Aurorablade updated:

+
    +
  • Adds Spess Koi and related event.
  • +
+

Citinited updated:

+
    +
  • The tachyon-doppler array now has a logging interface, and can print off stored explosive logs. Brag to your friends about your bomb-making skills!
  • +
+

Fox McCloud updated:

+
    +
  • Robotic brains have their own unique sprite and full flavortext's now
  • +
  • Fixed a bug where IRC's would have IPC names
  • +
+

11 July 2018

Alffd updated:

[E.logged_time][E.epicenter]