From d06b2a0a1242faac62ce7bc05135a6a8b2bf3dc7 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 26 Feb 2015 00:05:04 -0500 Subject: [PATCH 01/34] EMP briefly blocks switching/engaging modules --- code/modules/clothing/spacesuits/rig/rig.dm | 14 +++++++++++--- code/modules/clothing/spacesuits/rig/rig_verbs.dm | 15 +++++++++++++++ .../clothing/spacesuits/rig/suits/light.dm | 3 +++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index c66f2a986c..5d1addd471 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -493,6 +493,8 @@ return 1 if(istype(user)) + if(malfunction_check(user)) + return 0 if(user.back != src) return 0 if(locked_dna) @@ -509,10 +511,10 @@ return 1 +//TODO: Fix Topic vulnerabilities for malfunction and AI override. /obj/item/weapon/rig/Topic(href,href_list) - if(!check_suit_access(usr)) - return + return 0 if(href_list["toggle_piece"]) if(ishuman(usr) && (usr.stat || usr.stunned || usr.lying)) @@ -545,7 +547,7 @@ usr.set_machine(src) src.add_fingerprint(usr) - return 1 + return 0 /obj/item/weapon/rig/proc/notify_ai(var/message) if(!message || !installed_modules || !installed_modules.len) @@ -724,6 +726,12 @@ wearer << "The [source] has [dam_module.damage >= 2 ? "destroyed" : "damaged"] your [dam_module.interface_name]!" dam_module.deactivate() +/obj/item/weapon/rig/proc/malfunction_check(var/mob/living/carbon/human/user) + if(malfunctioning) + user << "ERROR: Hardware fault. Rebooting interface..." + return 1 + return 0 + /*/obj/item/weapon/rig/proc/forced_move(dir) if(locked_down) return 0 diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index ce20244734..09db9b0325 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -141,6 +141,9 @@ set category = "Hardsuit" set src = usr.contents + if(malfunction_check(usr)) + return + if(!check_power_cost(usr, 0, 0, 0, 0)) return @@ -168,6 +171,9 @@ set category = "Hardsuit" set src = usr.contents + if(malfunction_check(usr)) + return + if(canremove) usr << "The suit is not active." return @@ -189,6 +195,9 @@ set category = "Hardsuit" set src = usr.contents + if(malfunction_check(usr)) + return + if(!check_power_cost(usr, 0, 0, 0, 0)) return @@ -222,6 +231,9 @@ set category = "Hardsuit" set src = usr.contents + if(malfunction_check(usr)) + return + if(!check_power_cost(usr, 0, 0, 0, 0)) return @@ -257,6 +269,9 @@ set category = "Hardsuit" set src = usr.contents + if(malfunction_check(usr)) + return + if(canremove) usr << "The suit is not active." return diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index 0a18f3c640..6c89a0058b 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -75,6 +75,9 @@ ..() +/obj/item/weapon/rig/light/ninja/malfunction_check() + return 0 //even as strong as ninjas are, they may not be able to afford being blocked from switching modules for 20 seconds + /obj/item/weapon/rig/light/stealth name = "stealth suit control module" suit_type = "stealth" From 1aa156963479afe263fc189171dc00489f88ee1a Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 26 Feb 2015 10:49:50 +0300 Subject: [PATCH 02/34] Fixes #8284 --- interface/skin.dmf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/skin.dmf b/interface/skin.dmf index 7ba4d10788..5069e5c5e0 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1828,7 +1828,7 @@ window "infowindow" elem "info" type = INFO pos = 0,0 - size = 636x451 + size = 638x477 anchor1 = 0,0 anchor2 = 100,100 font-family = "" From 728d90d06fe83da09bc8a715b0fc85369c88943c Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 26 Feb 2015 11:07:25 +0300 Subject: [PATCH 03/34] Now airflow knockout uses proper Weaken proc to doublecheck for flags. Should fix #8254 Also cleans up it a bit and adds span classes. --- code/ZAS/Airflow.dm | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 7b0d3afa98..a31a2494e5 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -2,17 +2,18 @@ Contains helper procs for airflow, handled in /connection_group. */ - mob/var/tmp/last_airflow_stun = 0 mob/proc/airflow_stun() if(stat == 2) return 0 if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 + if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) - src << "\blue You stay upright as the air rushes past you." + src << "You stay upright as the air rushes past you." return 0 - if(weakened <= 0) src << "\red The sudden rush of air knocks you over!" - weakened = max(weakened,5) + if(!lying) + src << "The sudden rush of air knocks you over!" + SetWeakened(max(5,weakened)) last_airflow_stun = world.time mob/living/silicon/airflow_stun() @@ -22,16 +23,9 @@ mob/living/carbon/metroid/airflow_stun() return mob/living/carbon/human/airflow_stun() - if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 - if(buckled) return 0 if(shoes) if(shoes.flags & NOSLIP) return 0 - if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) - src << "\blue You stay upright as the air rushes past you." - return 0 - if(weakened <= 0) src << "\red The sudden rush of air knocks you over!" - weakened = max(weakened,rand(1,5)) - last_airflow_stun = world.time + ..() atom/movable/proc/check_airflow_movable(n) @@ -84,10 +78,8 @@ obj/item/check_airflow_movable(n) if(istype(src, /mob/living/carbon/human)) if(src:buckled) return - if(src:shoes) - if(istype(src:shoes, /obj/item/clothing/shoes/magboots)) - if(src:shoes:magpulse) - return + if(src:shoes && src:shoes.flags & NOSLIP) + return src << "\red You are sucked away by airflow!" var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2) if(airflow_falloff < 1) From 3ba56d7f76b3bedffa1d3da2824ddf24de984d6f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 26 Feb 2015 11:56:43 +0300 Subject: [PATCH 04/34] Alt-arrow in same direction you are set to face now resets facing direction. --- code/modules/mob/mob.dm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 850a4147dd..db14807a06 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1180,7 +1180,9 @@ mob/proc/yank_out_object() usr << "You are now facing [dir2text(facing_dir)]." /mob/proc/set_face_dir(var/newdir) - if(newdir) + if(newdir == facing_dir) + facing_dir = null + else if(newdir) set_dir(newdir) facing_dir = newdir else if(facing_dir) @@ -1200,20 +1202,16 @@ mob/proc/yank_out_object() /mob/verb/northfaceperm() set hidden = 1 - facing_dir = null set_face_dir(NORTH) /mob/verb/southfaceperm() set hidden = 1 - facing_dir = null set_face_dir(SOUTH) /mob/verb/eastfaceperm() set hidden = 1 - facing_dir = null set_face_dir(EAST) /mob/verb/westfaceperm() set hidden = 1 - facing_dir = null set_face_dir(WEST) From 100d8e9fb8f4428796c1b9f5f6e8579a983c566e Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 26 Feb 2015 12:09:23 +0300 Subject: [PATCH 05/34] Fixed buckling into chair not changing mob's facing if he had permafacing set. --- code/game/objects/buckling.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 00e3999332..d64857d004 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -24,6 +24,7 @@ return 0 M.buckled = src + M.facing_dir = null M.set_dir(dir) M.update_canmove() buckled_mob = M From 612e60e167e8fc1e5cc03cecccfcb1360cffcdba Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 26 Feb 2015 12:30:38 +0300 Subject: [PATCH 06/34] Moonwalkig hotkeys now work in hotkey mode. --- interface/skin.dmf | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/interface/skin.dmf b/interface/skin.dmf index 5069e5c5e0..d068054731 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -249,6 +249,23 @@ macro "hotkeymode" name = "SOUTH+REP" command = ".south" is-disabled = false + elem + name = "ALT+WEST" + command = "westfaceperm" + is-disabled = false + is-disabled = false + elem + name = "ALT+NORTH" + command = "northfaceperm" + is-disabled = false + elem + name = "ALT+EAST" + command = "eastfaceperm" + is-disabled = false + elem + name = "ALT+SOUTH" + command = "southfaceperm" + is-disabled = false elem name = "INSERT" command = "a-intent right" From 98f6a4cae5b4bc7a105139e6dad4a6bfe5dde744 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 26 Feb 2015 11:39:41 +0100 Subject: [PATCH 07/34] Camera coverage fixes. Fixes issues with AI cameras coverage not updating properly in several instances during EMPs, destruction, etc., --- code/game/machinery/camera/camera.dm | 40 +++++++++++++------ code/game/machinery/camera/camera_assembly.dm | 5 +-- code/game/objects/items/devices/spy_bug.dm | 1 - code/global.dm | 2 +- .../modules/clothing/spacesuits/spacesuits.dm | 1 - .../living/silicon/ai/freelook/cameranet.dm | 14 ++++--- .../mob/living/silicon/ai/freelook/chunk.dm | 16 +++----- .../silicon/ai/freelook/update_triggers.dm | 12 ++---- .../modules/mob/living/silicon/robot/robot.dm | 1 - 9 files changed, 46 insertions(+), 46 deletions(-) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 50a814b8de..1a20fd29ef 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -31,13 +31,13 @@ var/alarm_on = 0 var/busy = 0 + var/on_open_network = 0 + /obj/machinery/camera/New() wires = new(src) assembly = new(src) assembly.state = 4 - invalidateCameraCache() - /* // Use this to look for cameras that have the same c_tag. for(var/obj/machinery/camera/C in cameranet.cameras) var/list/tempnetwork = C.network&src.network @@ -56,18 +56,18 @@ /obj/machinery/camera/emp_act(severity) if(!isEmpProof()) if(prob(100/severity)) - invalidateCameraCache() stat |= EMPED SetLuminosity(0) kick_viewers() - triggerCameraAlarm(10 * severity) + triggerCameraAlarm(30 / severity) update_icon() + update_coverage() spawn(900) stat &= ~EMPED cancelCameraAlarm() update_icon() - invalidateCameraCache() + update_coverage() ..() /obj/machinery/camera/bullet_act(var/obj/item/projectile/P) @@ -114,7 +114,7 @@ destroy() /obj/machinery/camera/attackby(obj/W as obj, mob/living/user as mob) - invalidateCameraCache() + update_coverage() // DECONSTRUCTION if(isscrewdriver(W)) //user << "You start to [panel_open ? "close" : "open"] the camera's panel." @@ -195,7 +195,7 @@ //legacy support, if choice is != 1 then just kick viewers without changing status kick_viewers() else - invalidateCameraCache() + update_coverage() set_status( !src.status ) if (!(src.status)) visible_message("\red [user] has deactivated [src]!") @@ -215,11 +215,11 @@ //Used when someone breaks a camera /obj/machinery/camera/proc/destroy() - invalidateCameraCache() stat |= BROKEN kick_viewers() triggerCameraAlarm() update_icon() + update_coverage() //sparks var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() @@ -364,7 +364,7 @@ network_added = 1 if(network_added) - invalidateCameraCache() + update_coverage(1) /obj/machinery/camera/proc/remove_networks(var/list/networks) var/network_removed @@ -375,24 +375,24 @@ network_removed = 1 if(network_removed) - invalidateCameraCache() + update_coverage(1) /obj/machinery/camera/proc/replace_networks(var/list/networks) if(networks.len != network.len) network = networks - invalidateCameraCache() + update_coverage(1) return for(var/new_network in networks) if(!(new_network in network)) network = networks - invalidateCameraCache() + update_coverage(1) return /obj/machinery/camera/proc/clear_all_networks() if(network.len) network.Cut() - invalidateCameraCache() + update_coverage(1) /obj/machinery/camera/proc/nano_structure() var/cam[0] @@ -403,3 +403,17 @@ cam["y"] = y cam["z"] = z return cam + +/obj/machinery/camera/proc/update_coverage(var/network_change = 0) + if(network_change) + var/list/open_networks = difflist(network, restricted_camera_networks) + // Add or remove camera from the camera net as necessary + if(on_open_network && !open_networks.len) + cameranet.removeCamera(src) + else if(!on_open_network && open_networks.len) + on_open_network = 1 + cameranet.addCamera(src) + else + cameranet.updateVisibility(src, 0) + + invalidateCameraCache() diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 8be7f6ebe5..4ece6594f0 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -78,7 +78,7 @@ if(isscrewdriver(W)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 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")) + var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) if(!input) usr << "No input found please hang up and try your call again." return @@ -100,9 +100,6 @@ C.auto_turn() C.replace_networks(uniquelist(tempnetwork)) - tempnetwork = difflist(C.network,restricted_camera_networks) - if(!tempnetwork.len)//Camera isn't on any open network - remove its chunk from AI visibility. - cameranet.removeCamera(C) C.c_tag = input diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index 70e3628f67..2ad3df7ae5 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -140,7 +140,6 @@ ..() name = "DV-136ZB #[rand(1000,9999)]" c_tag = name - cameranet.removeCamera(src) // Sorry, no AI spying. /obj/machinery/camera/spy/check_eye(var/mob/user as mob) return 1 diff --git a/code/global.dm b/code/global.dm index 13a62b38ce..7bb7da4531 100644 --- a/code/global.dm +++ b/code/global.dm @@ -10,7 +10,7 @@ var/global/list/med_hud_users = list() // List of all entities using var/global/list/sec_hud_users = list() // List of all entities using a security HUD. // Those networks can only be accessed by pre-existing terminals. AIs and new terminals can't use them. -var/list/restricted_camera_networks = list("thunder","ERT","NUKE") +var/list/restricted_camera_networks = list("thunder","ERT","NUKE","Secret") var/global/list/global_mutations = list() // List of hidden mutation things. var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called manually after an event. diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index b7db5da591..7bf622b539 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -33,7 +33,6 @@ camera = new /obj/machinery/camera(src) camera.replace_networks(camera_networks) - cameranet.removeCamera(camera) camera.c_tag = user.name user << "\blue User scanned as [camera.c_tag]. Camera activated." return 1 diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index d94f705320..f05fdda45f 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -120,12 +120,14 @@ var/datum/cameranet/cameranet = new() for(var/y = y1; y <= y2; y += 16) if(chunkGenerated(x, y, T.z)) var/datum/camerachunk/chunk = getCameraChunk(x, y, T.z) - if(choice == 0) - // Remove the camera. - chunk.cameras -= c - else if(choice == 1) - // You can't have the same camera in the list twice. - chunk.cameras |= c + // Only add actual cameras to the list of cameras + if(istype(c, /obj/machinery/camera)) + if(choice == 0) + // Remove the camera. + chunk.cameras -= c + else if(choice == 1) + // You can't have the same camera in the list twice. + chunk.cameras |= c chunk.hasChanged() // Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index 33dbfd0966..11c8715979 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -64,7 +64,7 @@ else changed = 1 -// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists. +// The actual updating. It gathers the visible turfs from cameras and puts them into the appropriate lists. /datum/camerachunk/proc/update() @@ -76,14 +76,14 @@ var/obj/machinery/camera/c = camera if(!c) - continue + cameras -= c if(!c.can_use()) continue var/turf/point = locate(src.x + 8, src.y + 8, src.z) if(get_dist(point, c) > 24) - continue + cameras -= c for(var/turf/t in c.can_see()) newVisibleTurfs[t] = t @@ -143,14 +143,8 @@ if(t.x >= x && t.y >= y && t.x < x + 16 && t.y < y + 16) turfs[t] = t - for(var/camera in cameras) - var/obj/machinery/camera/c = camera - if(!c) - continue - - if(!c.can_use()) - continue - + // At this point we only have functional cameras + for(var/obj/machinery/camera/c in cameras) for(var/turf/t in c.can_see()) visibleTurfs[t] = t diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm index e6311e7a00..5bcec964a7 100644 --- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm +++ b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm @@ -84,6 +84,7 @@ /obj/machinery/camera/deactivate(user as mob, var/choice = 1) ..(user, choice) + invalidateCameraCache() if(src.can_use()) cameranet.addCamera(src) else @@ -98,16 +99,11 @@ cameranet.cameras_unsorted = 1 else dd_insertObjectList(cameranet.cameras, src) - - var/list/open_networks = difflist(network,restricted_camera_networks) //...but if all of camera's networks are restricted, it only works for specific camera consoles. - if(open_networks.len) //If there is at least one open network, chunk is available for AI usage. - cameranet.addCamera(src) + update_coverage(1) /obj/machinery/camera/Del() cameranet.cameras -= src - var/list/open_networks = difflist(network,restricted_camera_networks) - if(open_networks.len) - cameranet.removeCamera(src) + clear_all_networks() ..() -#undef BORG_CAMERA_BUFFER \ No newline at end of file +#undef BORG_CAMERA_BUFFER diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index d5ff0f1c09..3539e683af 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1143,7 +1143,6 @@ var/list/robot_verbs_default = list( //Disconnect it's camera so it's not so easily tracked. if(src.camera) src.camera.clear_all_networks() - cameranet.removeCamera(src.camera) /mob/living/silicon/robot/proc/ResetSecurityCodes() From 4db51c68ef2956d04fa4df941e61d8739275c251 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 26 Feb 2015 13:55:27 +0300 Subject: [PATCH 08/34] Missed a spot in airflow fixes. --- code/ZAS/Airflow.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index a31a2494e5..6331ee272e 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -199,7 +199,8 @@ mob/airflow_hit(atom/A) for(var/mob/M in hearers(src)) M.show_message("\red \The [src] slams into \a [A]!",1,"\red You hear a loud slam!",2) playsound(src.loc, "smash.ogg", 25, 1, -1) - weakened = max(weakened, (istype(A,/obj/item) ? A:w_class : rand(1,5))) //Heheheh + var/weak_amt = istype(A,/obj/item) ? A:w_class : rand(1,5) //Heheheh + SetWeakened(max(weakened, weak_amt)) . = ..() obj/airflow_hit(atom/A) From 9e07708cb3ddd592aa9b600e43a0938c615b3c1d Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 26 Feb 2015 14:40:50 +0300 Subject: [PATCH 09/34] Fixes #8241 rollerbeds not collapsing due to a runtime --- code/game/objects/structures/stool_bed_chair_nest/bed.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index a53ceff7cb..6d50066a74 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -138,8 +138,8 @@ density = 1 icon_state = "up" else - buckled_mob.pixel_y = 0 - buckled_mob.old_y = 0 + M.pixel_y = 0 + M.old_y = 0 density = 0 icon_state = "down" From 8483d7c679018e213dd809ee81a32c991c9fe010 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Thu, 26 Feb 2015 18:46:10 +0000 Subject: [PATCH 10/34] Changes grid logic to be slightly less convoluted, clamp position to inside the object's icon --- .../reagents/reagent_containers/food.dm | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm index 99261d81d9..1b94dfcdae 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/reagents/reagent_containers/food.dm @@ -1,3 +1,6 @@ +#define CELLS 4 +#define CELLSIZE (32/CELLS) + //////////////////////////////////////////////////////////////////////////////// /// Food. //////////////////////////////////////////////////////////////////////////////// @@ -6,7 +9,7 @@ volume = 50 //Sets the default container amount for all food items. var/filling_color = "#FFFFFF" //Used by sandwiches. - var/list/center_of_mass = newlist() //Center of mass + var/list/center_of_mass = list() // Used for table placement /obj/item/weapon/reagent_containers/food/New() ..() @@ -18,17 +21,18 @@ if(proximity && params && istype(A, /obj/structure/table) && center_of_mass.len) //Places the item on a grid var/list/mouse_control = params2list(params) - var/cellnumber = 4 var/mouse_x = text2num(mouse_control["icon-x"]) var/mouse_y = text2num(mouse_control["icon-y"]) - var/grid_x = round(mouse_x, 32/cellnumber) - var/grid_y = round(mouse_y, 32/cellnumber) + if(!isnum(mouse_x) || !isnum(mouse_y)) + return - if(mouse_control["icon-x"]) - var/sign = mouse_x - grid_x != 0 ? sign(mouse_x - grid_x) : -1 //positive if rounded down, else negative - pixel_x = grid_x - center_of_mass["x"] + sign*16/cellnumber //center of the cell - if(mouse_control["icon-y"]) - var/sign = mouse_y - grid_y != 0 ? sign(mouse_y - grid_y) : -1 - pixel_y = grid_y - center_of_mass["y"] + sign*16/cellnumber \ No newline at end of file + var/cell_x = max(0, min(CELLS-1, round(mouse_x/CELLSIZE))) + var/cell_y = max(0, min(CELLS-1, round(mouse_y/CELLSIZE))) + + pixel_x = (CELLSIZE * (0.5 + cell_x)) - center_of_mass["x"] + pixel_y = (CELLSIZE * (0.5 + cell_y)) - center_of_mass["y"] + +#undef CELLS +#undef CELLSIZE From d258a476f8086584555320572d00237b54dca5a3 Mon Sep 17 00:00:00 2001 From: Mustafa Kalash Date: Thu, 26 Feb 2015 16:37:27 -0500 Subject: [PATCH 11/34] Adds paramedic to the medical category. Fixes #8255 --- code/game/jobs/jobs.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index e1c42254a6..135da6bb60 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -72,7 +72,8 @@ var/list/medical_positions = list( "Medical Doctor", "Geneticist", "Psychiatrist", - "Chemist" + "Chemist", + "Paramedic" ) From 12024f07aaef210703106f5daf9035a869cace6d Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Thu, 26 Feb 2015 15:32:10 -0800 Subject: [PATCH 12/34] gets rid of MC tab. Returns it back to status tab. --- code/modules/mob/mob.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 850a4147dd..c7237e83b9 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -797,7 +797,7 @@ note dizziness decrements automatically in the mob's Life() proc. stat(null,"Location:\t([x], [y], [z])") stat(null,"CPU:\t[world.cpu]") stat(null,"Instances:\t[world.contents.len]") - if(statpanel("MC") && master_controller) + if(statpanel("Status") && master_controller) stat(null,"MasterController-[last_tick_duration] ([master_controller.processing?"On":"Off"]-[controller_iteration])") stat(null,"Air-[master_controller.air_cost]\tSun-[master_controller.sun_cost]") stat(null,"Mob-[master_controller.mobs_cost]\t#[mob_list.len]") From 55027796523544e167f58f377ca26b22108e883f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 27 Feb 2015 13:09:40 +0300 Subject: [PATCH 13/34] That should be it for procs there. --- code/ZAS/Airflow.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 6331ee272e..62a6daea16 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -13,7 +13,7 @@ mob/proc/airflow_stun() return 0 if(!lying) src << "The sudden rush of air knocks you over!" - SetWeakened(max(5,weakened)) + Weaken(5) last_airflow_stun = world.time mob/living/silicon/airflow_stun() @@ -200,7 +200,7 @@ mob/airflow_hit(atom/A) M.show_message("\red \The [src] slams into \a [A]!",1,"\red You hear a loud slam!",2) playsound(src.loc, "smash.ogg", 25, 1, -1) var/weak_amt = istype(A,/obj/item) ? A:w_class : rand(1,5) //Heheheh - SetWeakened(max(weakened, weak_amt)) + Weaken(weak_amt) . = ..() obj/airflow_hit(atom/A) @@ -232,10 +232,10 @@ mob/living/carbon/human/airflow_hit(atom/A) apply_damage(b_loss/3, BRUTE, "groin", blocked, 0, "Airflow") if(airflow_speed > 10) - paralysis += round(airflow_speed * vsc.airflow_stun) - stunned = max(stunned,paralysis + 3) + Paralyse(round(airflow_speed * vsc.airflow_stun)) + Stun(paralysis + 3) else - stunned += round(airflow_speed * vsc.airflow_stun/2) + Stun(round(airflow_speed * vsc.airflow_stun/2)) . = ..() zone/proc/movables() From 3d9598139414dce7fca55be3055afe79b4dccdd3 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 26 Feb 2015 13:25:38 +0300 Subject: [PATCH 14/34] Fixes #8270 Fixes part where alcohol potency was doubled and halves drinking glass volume so it won't hold a half of a bottle. Also set bottle/shaker volumes to new 30u base most reagent containers like beakers/bottles use nowdays as requested. --- code/modules/reagents/Chemistry-Reagents.dm | 2 +- .../reagents/reagent_containers/food/drinks.dm | 2 +- .../reagent_containers/food/drinks/bottle.dm | 2 +- .../food/drinks/drinkingglass.dm | 14 +++++++------- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 8fea9c74c6..f58a39bd6c 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -3242,7 +3242,7 @@ datum // make all the beverages work together for(var/datum/reagent/ethanol/A in holder.reagent_list) - if(isnum(A.data)) d += A.data + if(A != src && isnum(A.data)) d += A.data if(alien && alien == IS_SKRELL) //Skrell get very drunk very quickly. d*=5 diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index ceabea1e50..e42ef09ac1 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -271,7 +271,7 @@ desc = "A metal shaker to mix drinks in." icon_state = "shaker" amount_per_transfer_from_this = 10 - volume = 100 + volume = 120 center_of_mass = list("x"=17, "y"=10) /obj/item/weapon/reagent_containers/food/drinks/flask diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 63a34ec90c..52a4ba12ba 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -6,7 +6,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle amount_per_transfer_from_this = 10 - volume = 100 + volume = 120 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm index bde3854727..0dc3012493 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm @@ -4,8 +4,8 @@ name = "glass" desc = "Your standard drinking glass." icon_state = "glass_empty" - amount_per_transfer_from_this = 10 - volume = 50 + amount_per_transfer_from_this = 5 + volume = 30 center_of_mass = list("x"=16, "y"=10) on_reagent_change() @@ -16,24 +16,24 @@ /*else if(reagents.reagent_list.len == 1) for(var/datum/reagent/R in reagents.reagent_list) switch(R.id)*/ - if (reagents.reagent_list.len > 0) + if (reagents.reagent_list.len > 0) var/datum/reagent/R = reagents.get_master_reagent() - + if(R.glass_icon_state) icon_state = R.glass_icon_state else icon_state = "glass_brown" - + if(R.glass_name) name = R.glass_name else name = "Glass of.. what?" - + if(R.glass_desc) desc = R.glass_desc else desc = "You can't really tell what this is." - + if(R.glass_center_of_mass) center_of_mass = R.glass_center_of_mass else From 14f76324b963daca76878d260abb02b8da81336f Mon Sep 17 00:00:00 2001 From: Mustafa Kalash Date: Fri, 27 Feb 2015 17:18:47 -0500 Subject: [PATCH 15/34] Fixes #8231. Adds on_hear_radio proc for observers to add tracking. --- code/modules/mob/hear_say.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 8b39a00aa5..e5e91c4bdc 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -199,6 +199,9 @@ /mob/proc/on_hear_radio(part_a, speaker_name, track, part_b, formatted) src << "[part_a][speaker_name][part_b][formatted]" +/mob/dead/observer/on_hear_radio(part_a, speaker_name, track, part_b, formatted) + src << "[part_a][track][part_b][formatted]" + /mob/living/silicon/on_hear_radio(part_a, speaker_name, track, part_b, formatted) var/time = say_timestamp() src << "[time][part_a][speaker_name][part_b][formatted]" From 5d2f492386317d577e35825af9a906b707686163 Mon Sep 17 00:00:00 2001 From: Mustafa Kalash Date: Fri, 27 Feb 2015 18:09:09 -0500 Subject: [PATCH 16/34] Fixes #8265. Moves the print report link being added to the window to after the data is saved for printing. --- code/modules/hydroponics/trays/tray_tools.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index cd7d0daf9a..64e0fe4369 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -198,10 +198,10 @@ if(grown_seed.get_trait(TRAIT_TELEPORTING)) dat += "
The fruit is temporal/spatially unstable." - dat += "

\[print report\]" if(dat) - user << browse(dat,"window=plant_analyzer") last_data = dat + dat += "

\[print report\]" + user << browse(dat,"window=plant_analyzer") return From 0f6a3adf6812ea228f115de2bf786c9639ae754e Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 16:28:54 +1030 Subject: [PATCH 17/34] Fixes #8256 --- code/__HELPERS/global_lists.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 68c74c614e..6de12ac074 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -45,7 +45,7 @@ var/global/list/skin_styles_female_list = list() //unused var/global/list/underwear_m = list("White" = "m1", "Grey" = "m2", "Green" = "m3", "Blue" = "m4", "Black" = "m5", "Mankini" = "m6", "None") //Curse whoever made male/female underwear diffrent colours var/global/list/underwear_f = list("Red" = "f1", "White" = "f2", "Yellow" = "f3", "Blue" = "f4", "Black" = "f5", "Thong" = "f6", "Black Sports" = "f7","White Sports" = "f8","None") //undershirt -var/global/list/undershirt_t = list("Black Tank top" = "u1", "White Tank top" = "u2", "Black shirt" = "u3", "White shirt" = "u4", "None") +var/global/list/undershirt_t = list("White Tank top" = "u1", "Black Tank top" = "u2", "Black shirt" = "u3", "White shirt" = "u4", "None") //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") From d0451eaa2d339241472d2126c1c30efc03cc5584 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 16:30:34 +1030 Subject: [PATCH 18/34] Fixes #8249 --- code/modules/hydroponics/seed_datums.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 561210537d..1ee86c22f4 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -685,7 +685,7 @@ name = "wheat" seed_name = "wheat" display_name = "wheat stalks" - chems = list("nutriment" = list(1,25)) + chems = list("nutriment" = list(1,25), "flour" = list(1,25)) kitchen_tag = "wheat" /datum/seed/wheat/New() From 3bf7d1446ca902569b406360bca49aec42feee54 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 16:45:18 +1030 Subject: [PATCH 19/34] Fixes #8285 --- code/modules/hydroponics/seed_controller.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm index e914ce7c3d..84cbc727de 100644 --- a/code/modules/hydroponics/seed_controller.dm +++ b/code/modules/hydroponics/seed_controller.dm @@ -2,7 +2,7 @@ // Processes vines/spreading plants. #define PLANTS_PER_TICK 500 // Cap on number of plant segments processed. -#define PLANT_TICK_TIME 25 // Number of ticks between the plant processor cycling. +#define PLANT_TICK_TIME 75 // Number of ticks between the plant processor cycling. // Debug for testing seed genes. /client/proc/show_plant_genes() From 53e59cbf942311541fa418bd70d6415538ca1eb1 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 16:47:08 +1030 Subject: [PATCH 20/34] Fixes #8126 --- code/modules/organs/organ_external.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 4dcc006df6..5aeb4c8bd7 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -84,8 +84,8 @@ if(istype(owner,/mob/living/carbon/human)) var/mob/living/carbon/human/H = owner if(H.species && H.species.flags & IS_SYNTHETIC) - brmod = H.species.brute_mod - bumod = H.species.burn_mod + brmod = (!isnull(H.species.brute_mod) ? H.species.brute_mod : 1) + bumod = (!isnull(H.species.burn_mod) ? H.species.burn_mod : 1) brute *= brmod //~2/3 damage for ROBOLIMBS burn *= bumod //~2/3 damage for ROBOLIMBS From c659ebefdefa85efef0ed0f5564c79674d3b3d0f Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 16:47:27 +1030 Subject: [PATCH 21/34] Fixes #8176 --- .../living/silicon/robot/drone/drone_items.dm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 10b11648d1..68df16d020 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -69,7 +69,7 @@ wrapped = null return - src.loc << "\red You drop \the [wrapped]." + src.loc << "You drop \the [wrapped]." wrapped.loc = get_turf(src) wrapped = null //update_icon() @@ -79,6 +79,9 @@ /obj/item/weapon/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params) + if(!proximity) + return // This will prevent them using guns at range but adminbuse can add them directly to modules, so eh. + //There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z if(!wrapped) for(var/obj/item/thing in src.contents) @@ -123,7 +126,7 @@ wrapped = I return else - user << "\red Your gripper cannot hold \the [target]." + user << "Your gripper cannot hold \the [target]." else if(istype(target,/obj/machinery/power/apc)) var/obj/machinery/power/apc/A = target @@ -140,7 +143,7 @@ A.charging = 0 A.update_icon() - user.visible_message("\red [user] removes the power cell from [A]!", "You remove the power cell.") + user.visible_message("[user] removes the power cell from [A]!", "You remove the power cell.") //TODO: Matter decompiler. /obj/item/weapon/matter_decompiler @@ -173,7 +176,7 @@ for(var/mob/M in T) if(istype(M,/mob/living/simple_animal/lizard) || istype(M,/mob/living/simple_animal/mouse)) - src.loc.visible_message("\red [src.loc] sucks [M] into its decompiler. There's a horrible crunching noise.","\red It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.") + src.loc.visible_message("[src.loc] sucks [M] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.") new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) del(M) if(wood) @@ -270,16 +273,16 @@ grabbed_something = 1 if(grabbed_something) - user << "\blue You deploy your decompiler and clear out the contents of \the [T]." + user << "You deploy your decompiler and clear out the contents of \the [T]." else - user << "\red Nothing on \the [T] is useful to you." + user << "Nothing on \the [T] is useful to you." return //PRETTIER TOOL LIST. /mob/living/silicon/robot/drone/installed_modules() if(weapon_lock) - src << "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]" + src << "Weapon lock active, unable to use modules! Count:[weaponlock_time]" return if(!module) From 4b15f1a24959f55e0e9fa5206da206f9a7b1cd43 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 16:47:41 +1030 Subject: [PATCH 22/34] Fixes #7877 --- code/game/objects/structures/door_assembly.dm | 4 ++++ code/game/objects/structures/girders.dm | 10 +++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index b4281a6033..ec55e6549e 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -248,6 +248,10 @@ glass = 1 else if(istype(S, /obj/item/stack/sheet/mineral) && S.sheettype) var/M = S.sheettype + // Ugly hack, will suffice for now. Need to fix it upstream as well, may rewrite mineral walls. ~Z + if(M in list("mhydrogen","osmium","tritium","platinum","iron")) + user << "You cannot make an airlock out of that material." + return if(S.get_amount() >= 2) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.") diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 0512b814b2..85415cd162 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -26,7 +26,7 @@ var/damage = Proj.damage if(!istype(Proj, /obj/item/projectile/beam)) damage *= 0.4 //non beams do reduced damage - + health -= damage ..() if(health <= 0) @@ -144,6 +144,10 @@ if(S.sheettype) var/M = S.sheettype + // Ugly hack, will suffice for now. Need to fix it upstream as well, may rewrite mineral walls. ~Z + if(M in list("mhydrogen","osmium","tritium","platinum","iron")) + user << "You cannot plate the girder in that material." + return if(!anchored) if(S.amount < 2) return S.use(2) @@ -271,11 +275,11 @@ //Girders only provide partial cover. There's a chance that the projectiles will just pass through. (unless you are trying to shoot the girder) if(Proj.original != src && !prob(cover)) return -1 //pass through - + //Tasers and the like should not damage cultgirders. if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) return - + health -= Proj.damage ..() if(health <= 0) From 71ecceec9edb319385a37985e16740832fc78728 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 16:51:37 +1030 Subject: [PATCH 23/34] Fixes #8226 --- code/modules/reagents/reagent_containers/food/snacks.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index df5a1f0dbf..9ab669b4bb 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -481,14 +481,14 @@ user.drop_from_inventory(src) del(src) -/obj/item/weapon/reagent_containers/food/snacks/throw_impact(atom/hit_atom) +/obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) ..() new/obj/effect/decal/cleanable/egg_smudge(src.loc) src.reagents.reaction(hit_atom, TOUCH) src.visible_message("\red [src.name] has been squashed.","\red You hear a smack.") del(src) -/obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype( W, /obj/item/toy/crayon )) var/obj/item/toy/crayon/C = W var/clr = C.colourName From 227fda7b4c3a578eb90f0ee66861207938e9d8c7 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 16:59:37 +1030 Subject: [PATCH 24/34] Fixes #8245 --- code/modules/hydroponics/seed_datums.dm | 2 +- icons/obj/hydroponics_products.dmi | Bin 12618 -> 12610 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 1ee86c22f4..d47a6582a9 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -916,7 +916,7 @@ set_trait(TRAIT_PRODUCTION,5) set_trait(TRAIT_YIELD,3) set_trait(TRAIT_POTENCY,10) - set_trait(TRAIT_PRODUCT_ICON,"treefruit") + set_trait(TRAIT_PRODUCT_ICON,"cherry") set_trait(TRAIT_PRODUCT_COLOUR,"#8C0101") set_trait(TRAIT_PLANT_ICON,"tree2") diff --git a/icons/obj/hydroponics_products.dmi b/icons/obj/hydroponics_products.dmi index 4f9911debeae35441836ef48d3e741dac76ff042..7708c4896aa348c9e443aec5759ff89816ab741b 100644 GIT binary patch delta 12102 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 QxPL`aR!yc#$|Cgt0S1Sn(f|Me From a0452f34234af5ea9e1dad6baa9d97006742413a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 17:08:30 +1030 Subject: [PATCH 25/34] Alternative fix for golem damage. --- code/modules/mob/living/carbon/human/species/species.dm | 4 ++-- code/modules/organs/organ_external.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 943f90bcca..ea4f9f9d41 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -35,8 +35,8 @@ /datum/unarmed_attack/bite ) var/list/unarmed_attacks = null // For empty hand harm-intent attack - var/brute_mod = null // Physical damage reduction/malus. - var/burn_mod = null // Burn damage reduction/malus. + var/brute_mod = 1 // Physical damage multiplier. + var/burn_mod = 1 // Burn damage multiplier. // Death vars. var/gibber_type = /obj/effect/gibspawner/human diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 5aeb4c8bd7..4dcc006df6 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -84,8 +84,8 @@ if(istype(owner,/mob/living/carbon/human)) var/mob/living/carbon/human/H = owner if(H.species && H.species.flags & IS_SYNTHETIC) - brmod = (!isnull(H.species.brute_mod) ? H.species.brute_mod : 1) - bumod = (!isnull(H.species.burn_mod) ? H.species.burn_mod : 1) + brmod = H.species.brute_mod + bumod = H.species.burn_mod brute *= brmod //~2/3 damage for ROBOLIMBS burn *= bumod //~2/3 damage for ROBOLIMBS From b572763f7793c4546fefc1d929262ce2bf2a83d5 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 17:19:21 +1030 Subject: [PATCH 26/34] Fixes #8253 --- code/modules/hydroponics/spreading/spreading_response.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index ccf74e4ef7..1f8a0cc468 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -63,8 +63,8 @@ victim.buckled = src victim.update_canmove() buckled_mob = victim - - if(victim.loc != src.loc) + var/turf/T = get_turf(src) + if(victim.loc != T && T.Enter(victim, get_turf(victim))) src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in!") victim.loc = src.loc victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" From 273a9e24801c4d0c276e033a9c1619445b792d21 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 17:19:38 +1030 Subject: [PATCH 27/34] Should stop plants spreading through diagonal windows. --- .../hydroponics/spreading/spreading_growth.dm | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index 0729b2b343..64ef1b55c6 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -1,9 +1,17 @@ #define NEIGHBOR_REFRESH_TIME 100 +/obj/effect/plant/proc/get_cardinal_neighbors() + var/list/cardinal_neighbors = list() + for(var/check_dir in cardinal) + var/turf/simulated/T = get_step(get_turf(src), check_dir) + if(istype(T)) + cardinal_neighbors |= T + return cardinal_neighbors + /obj/effect/plant/proc/update_neighbors() // Update our list of valid neighboring turfs. neighbors = list() - for(var/turf/simulated/floor/floor in range(1,src)) + for(var/turf/simulated/floor in get_cardinal_neighbors()) if(get_dist(parent, floor) > spread_distance) continue if((locate(/obj/effect/plant) in floor.contents) || (locate(/obj/effect/dead_plant) in floor.contents) ) @@ -80,10 +88,12 @@ // Kill off our plant. if(plant) plant.die() // This turf is clear now, let our buddies know. - var/turf/T = get_turf(src) - for(var/obj/effect/plant/neighbor in range(1,src)) - neighbor.neighbors |= T - plant_controller.add_plant(neighbor) + for(var/turf/simulated/check_turf in get_cardinal_neighbors()) + if(!istype(check_turf)) + continue + for(var/obj/effect/plant/neighbor in check_turf.contents) + neighbor.neighbors |= check_turf + plant_controller.add_plant(neighbor) spawn(1) if(src) del(src) #undef NEIGHBOR_REFRESH_TIME \ No newline at end of file From 0beb6259f639f27083ca5fd1a482b8ac7977f56c Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 17:29:26 +1030 Subject: [PATCH 28/34] Partial fix for #8068. --- code/game/machinery/bots/secbot.dm | 7 ++++++- code/game/objects/items/weapons/handcuffs.dm | 18 +++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index 6aa43c1b39..b7809c4460 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -350,7 +350,12 @@ Auto Patrol: []"}, if(istype(src.target,/mob/living/carbon)) var/mob/living/carbon/C = target - if(!C.handcuffed && !src.arrest_type) + var/wearing_hardsuit + if(istype(C,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = C + if(istype(H.back, /obj/item/weapon/rig) && istype(H.gloves,/obj/item/clothing/gloves/rig)) + wearing_hardsuit = 1 + if(!wearing_hardsuit && !C.handcuffed && !src.arrest_type) playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2) mode = SECBOT_ARREST visible_message("\red [src] is trying to put handcuffs on [src.target]!") diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 246636890d..5ed83d086b 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -28,7 +28,7 @@ if (C == user) place_handcuffs(user, user) return - + //check for an aggressive grab for (var/obj/item/weapon/grab/G in C.grabbed_by) if (G.loc == user && G.state >= GRAB_AGGRESSIVE) @@ -41,11 +41,15 @@ if (ishuman(target)) var/mob/living/carbon/human/H = target - + if (!H.has_organ_for_slot(slot_handcuffed)) - user << "\red \The [H] needs at least two wrists before you can cuff them together!" + user << "\The [H] needs at least two wrists before you can cuff them together!" return - + + if(istype(H.gloves,/obj/item/clothing/gloves/rig)) // Can't cuff someone who's in a deployed hardsuit. + user << "The cuffs won't fit around \the [H.gloves]!" + return + H.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [H.name] ([H.ckey])") msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(H)]") @@ -62,7 +66,7 @@ feedback_add_details("handcuffs","H") O.process() return - + if (ismonkey(target)) var/mob/living/carbon/monkey/M = target var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( ) @@ -155,13 +159,13 @@ var/last_chew = 0 var/turf/p_loc_m = C.loc playsound(src.loc, cuff_sound, 30, 1, -2) user.visible_message("\red [user] is trying to put handcuffs on [C]!") - + if (ishuman(C)) var/mob/living/carbon/human/H = C if (!H.has_organ_for_slot(slot_handcuffed)) user << "\red \The [H] needs at least two wrists before you can cuff them together!" return - + spawn(30) if(!C) return if(p_loc == user.loc && p_loc_m == C.loc) From 38d959e9f8c3fad97f53db5341164b34cf6dd744 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 28 Feb 2015 17:34:31 +1030 Subject: [PATCH 29/34] Should fix light level reporting. --- code/modules/hydroponics/trays/tray.dm | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index d915a116c5..19f181d03e 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -592,15 +592,20 @@ if(!environment) //We're in a crate or nullspace, bail out. return - var/area/A = T.loc - var/light_available - if(A) - if(A.lighting_use_dynamic) - light_available = max(0,min(10,T.lighting_lumcount)-5) - else - light_available = 5 + var/light_string + if(closed_system && mechanical) + light_string = "that the internal lights are set to [tray_light] lumens" + else + var/area/A = T.loc + var/light_available + if(A) + if(A.lighting_use_dynamic) + light_available = max(0,min(10,T.lighting_lumcount)-5) + else + light_available = 5 + light_string = "a light level of [light_available] lumens" - usr << "The tray's sensor suite is reporting a light level of [light_available] lumens and a temperature of [environment.temperature]K." + usr << "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K." /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb() set name = "Toggle Tray Lid" From a8c315ad525929acb6e95fe03c222bb09414710d Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 26 Feb 2015 00:41:46 -0500 Subject: [PATCH 30/34] Updates rig emp_act EMPing hardsuits drains a bit of charge. Module damage is dealt to damaged modules first. Various other adjustments. --- .../spacesuits/rig/modules/computer.dm | 30 +++++++++- code/modules/clothing/spacesuits/rig/rig.dm | 60 ++++++++++++++----- .../clothing/spacesuits/rig/rig_pieces.dm | 4 +- .../clothing/spacesuits/rig/suits/light.dm | 5 +- .../clothing/spacesuits/rig/suits/station.dm | 1 + 5 files changed, 80 insertions(+), 20 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 3d66c64602..a6c549b666 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -441,4 +441,32 @@ drain_loc = null interfaced_with = null - total_power_drained = 0 \ No newline at end of file + total_power_drained = 0 + +/* +//Maybe make this use power when active or something +/obj/item/rig_module/emp_shielding + name = "\improper EMP dissipation module" + desc = "A bewilderingly complex bundle of fiber optics and chips." + toggleable = 1 + usable = 0 + + activate_string = "Enable active EMP shielding" + deactivate_string = "Disable active EMP shielding" + + interface_name = "active EMP shielding system" + interface_desc = "A highly experimental system that augments the hardsuit's existing EM shielding." + var/protection_amount = 20 + +/obj/item/rig_module/emp_shielding/activate() + if(!..()) + return + + holder.emp_protection += protection_amount + +/obj/item/rig_module/emp_shielding/deactivate() + if(!..()) + return + + holder.emp_protection = max(0,(holder.emp_protection - protection_amount)) +*/ diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 5d1addd471..6ce4c07293 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -72,6 +72,8 @@ var/vision_restriction var/offline_vision_restriction = 1 // 0 - none, 1 - welder vision, 2 - blind. Maybe move this to helmets. + var/emp_protection = 0 + // Wiring! How exciting. var/datum/wires/rig/wires var/datum/effect/effect/system/spark_spread/spark_system @@ -336,6 +338,7 @@ for(var/obj/item/rig_module/module in installed_modules) module.deactivate() offline = 2 + malfunction_delay = 0 //ensures that people aren't stuck in their suit if the cell runs out while malfunctioning. chest.slowdown = offline_slowdown return @@ -416,7 +419,7 @@ data["aicontrol"] = control_overridden data["aioverride"] = ai_override_enabled data["securitycheck"] = security_check_enabled - data["malf"] = malfunctioning + data["malf"] = malfunction_delay var/list/module_list = list() @@ -686,13 +689,20 @@ //Todo /obj/item/weapon/rig/proc/malfunction() - return 0 - -/obj/item/weapon/rig/emp_act(severity) - malfunctioning += severity*10 - if(malfunction_delay <= 0) - malfunction_delay = 20 - take_hit(severity*10,"electrical pulse") + return 0 + +/obj/item/weapon/rig/emp_act(severity_class) + //set malfunctioning + if(emp_protection < 40) + malfunctioning += 10 + if(malfunction_delay <= 0) + malfunction_delay = max(malfunction_delay, round(30/severity_class)) + + //drain some charge + if(cell) cell.emp_act(severity_class + 15) + + //possibly damage some modules + take_hit((100/severity_class), "electrical pulse", 1) /obj/item/weapon/rig/proc/shock(mob/user) if (electrocute_mob(user, cell, src)) @@ -705,29 +715,49 @@ if(!installed_modules.len) return - if(!prob(max(0,(damage-(chest ? chest.breach_threshold : 0))))) + var/chance + if(!is_emp) + chance = 2*max(0, damage - (chest? chest.breach_threshold : 0)) + else + //Want this to be roughly independant of the number of modules, that way people designing hardsuits + //don't have to worry (as much) about how adding that extra module will affect emp resiliance. + chance = max(0, damage - emp_protection)*min(installed_modules.len/15, 1) + + if(!prob(chance)) return + //deal addition damage to already damaged module first. + //This way the chances of a module being disabled aren't so remote. var/list/valid_modules = list() + var/list/damaged_modules = list() for(var/obj/item/rig_module/module in installed_modules) if(module.damage < 2) valid_modules |= module + if(module.damage > 0) + damaged_modules |= module - if(!valid_modules.len) - return + var/obj/item/rig_module/dam_module = null + if(damaged_modules.len) + dam_module = pick(damaged_modules) + else if(valid_modules.len) + dam_module = pick(valid_modules) + + if(!dam_module) return - var/obj/item/rig_module/dam_module = pick(valid_modules) dam_module.damage++ if(!source) source = "hit" - if(wearer) - wearer << "The [source] has [dam_module.damage >= 2 ? "destroyed" : "damaged"] your [dam_module.interface_name]!" + if(wearer) + if(dam_module.damage >= 2) + wearer << "The [source] has disabled your [dam_module.interface_name]!" + else + wearer << "The [source] has damaged your [dam_module.interface_name]!" dam_module.deactivate() /obj/item/weapon/rig/proc/malfunction_check(var/mob/living/carbon/human/user) - if(malfunctioning) + if(malfunction_delay) user << "ERROR: Hardware fault. Rebooting interface..." return 1 return 0 diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index fd802ecb63..4a51960524 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -39,7 +39,9 @@ flags_inv = HIDEJUMPSUIT|HIDETAIL flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT slowdown = 0 - breach_threshold = 35 + //With 0.05 resiliance, will reach 10 breach damage after 18 laser carbine blasts. Completely immune to smg hits. + breach_threshold = 28 + resilience = 0.05 can_breach = 1 sprite_sheets = list("Tajara" = 'icons/mob/species/tajaran/suit.dmi',"Unathi" = 'icons/mob/species/unathi/suit.dmi') supporting_limbs = list() diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index 6c89a0058b..3471fa0473 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -6,6 +6,7 @@ suit_type = "light suit" allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/cell) armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + emp_protection = 10 slowdown = 0 flags = STOPPRESSUREDAMAGE | THICKMATERIAL offline_slowdown = 0 @@ -54,6 +55,7 @@ desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins." icon_state = "ninja_rig" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + emp_protection = 40 slowdown = 0 req_access = list(access_syndicate) @@ -75,9 +77,6 @@ ..() -/obj/item/weapon/rig/light/ninja/malfunction_check() - return 0 //even as strong as ninjas are, they may not be able to afford being blocked from switching modules for 20 seconds - /obj/item/weapon/rig/light/stealth name = "stealth suit control module" suit_type = "stealth" diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 44959068eb..ea2c5fc982 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -7,6 +7,7 @@ slowdown = 3 offline_slowdown = 10 offline_vision_restriction = 2 + emp_protection = -20 allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) From 55a3b94995400e9f00ee6ea862d36f5027385e63 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 28 Feb 2015 03:33:16 -0500 Subject: [PATCH 31/34] Hardsuit adjustments, fixes Default inherited offline_slowdown set to 3, as most hardsuits use this value. ERT no longer get rad immunity, they have enough advantages - instead only ERT engineers get that. ERT engineer gauntlets are also now insulated, allowing them to do wiring work in space. Fixed a compile error. Fixed mounted laser cannons taking too long to recharge. --- code/modules/clothing/spacesuits/rig/rig.dm | 4 ++-- code/modules/clothing/spacesuits/rig/suits/alien.dm | 3 ++- code/modules/clothing/spacesuits/rig/suits/combat.dm | 1 - code/modules/clothing/spacesuits/rig/suits/ert.dm | 9 +++++++-- code/modules/clothing/spacesuits/rig/suits/merc.dm | 1 - code/modules/clothing/spacesuits/rig/suits/station.dm | 3 --- code/modules/projectiles/guns/energy/laser.dm | 2 +- 7 files changed, 12 insertions(+), 11 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 6ce4c07293..e9dd834356 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -68,7 +68,7 @@ var/sealing // Keeps track of seal status independantly of canremove. var/offline = 1 // Should we be applying suit maluses? - var/offline_slowdown = 10 // If the suit is deployed and unpowered, it sets slowdown to this. + var/offline_slowdown = 3 // If the suit is deployed and unpowered, it sets slowdown to this. var/vision_restriction var/offline_vision_restriction = 1 // 0 - none, 1 - welder vision, 2 - blind. Maybe move this to helmets. @@ -710,7 +710,7 @@ return 1 return 0 -/obj/item/weapon/rig/proc/take_hit(damage,source) +/obj/item/weapon/rig/proc/take_hit(damage, source, is_emp=0) if(!installed_modules.len) return diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm index 5b35d6a139..cb64d2be44 100644 --- a/code/modules/clothing/spacesuits/rig/suits/alien.dm +++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm @@ -4,6 +4,7 @@ suit_type = "NT breacher" icon_state = "breacher_rig_cheap" armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 70, bio = 100, rad = 50) + emp_protection = -20 slowdown = 6 offline_slowdown = 10 vision_restriction = 1 @@ -16,4 +17,4 @@ icon_state = "breacher_rig" armor = list(melee = 90, bullet = 90, laser = 90, energy = 90, bomb = 90, bio = 100, rad = 80) vision_restriction = 0 - slowdown = 4 \ No newline at end of file + slowdown = 4 diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm index 55716179c6..9be2576838 100644 --- a/code/modules/clothing/spacesuits/rig/suits/combat.dm +++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm @@ -8,7 +8,6 @@ suit_type = "combat hardsuit" armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60) slowdown = 1 - offline_slowdown = 3 offline_vision_restriction = 1 helm_type = /obj/item/clothing/head/helmet/space/rig/combat diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index d3db4baf84..121f028686 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -7,13 +7,12 @@ desc = "A suit worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights. Armoured and space ready." suit_type = "ERT commander" icon_state = "ert_commander_rig" - offline_slowdown = 3 helm_type = /obj/item/clothing/head/helmet/space/rig/ert req_access = list(access_cent_specops) - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) + armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60) allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \ /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \ /obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse_rifle, \ @@ -30,6 +29,9 @@ desc = "A suit worn by the engineering division of a NanoTrasen Emergency Response Team. Has orange highlights. Armoured and space ready." suit_type = "ERT engineer" icon_state = "ert_engineer_rig" + armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) + + glove_type = /obj/item/clothing/gloves/rig/ert_engineer initial_modules = list( /obj/item/rig_module/ai_container, @@ -38,6 +40,9 @@ /obj/item/rig_module/device/rcd ) +/obj/item/clothing/gloves/rig/ert_engineer + siemens_coefficient = 0 + /obj/item/weapon/rig/ert/medical name = "ERT-M suit control module" desc = "A suit worn by the medical division of a NanoTrasen Emergency Response Team. Has white highlights. Armoured and space ready." diff --git a/code/modules/clothing/spacesuits/rig/suits/merc.dm b/code/modules/clothing/spacesuits/rig/suits/merc.dm index 22add92014..8e7b70d5f2 100644 --- a/code/modules/clothing/spacesuits/rig/suits/merc.dm +++ b/code/modules/clothing/spacesuits/rig/suits/merc.dm @@ -9,7 +9,6 @@ suit_type = "crimson hardsuit" armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60) slowdown = 1 - offline_slowdown = 3 offline_vision_restriction = 1 helm_type = /obj/item/clothing/head/helmet/space/rig/merc diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index ea2c5fc982..74fd7a16fe 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -57,7 +57,6 @@ icon_state = "science_rig" armor = list(melee = 15, bullet = 15, laser = 80, energy = 80, bomb = 60, bio = 100, rad = 100) slowdown = 1 - offline_slowdown = 3 offline_vision_restriction = 1 helm_type = /obj/item/clothing/head/helmet/space/rig/ert @@ -80,7 +79,6 @@ icon_state = "medical_rig" armor = list(melee = 30, bullet = 15, laser = 20, energy = 60, bomb = 30, bio = 100, rad = 100) slowdown = 1 - offline_slowdown = 3 offline_vision_restriction = 1 allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/roller ) @@ -101,7 +99,6 @@ icon_state = "hazard_rig" armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) slowdown = 1 - offline_slowdown = 3 offline_vision_restriction = 1 helm_type = /obj/item/clothing/head/helmet/space/rig/ert diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 28f95d8211..45cd4b0664 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -52,7 +52,7 @@ obj/item/weapon/gun/energy/laser/retro /obj/item/weapon/gun/energy/lasercannon/mounted self_recharge = 1 use_external_power = 1 - recharge_time = 25 + recharge_time = 8 /obj/item/weapon/gun/energy/xray name = "xray laser gun" From a026922115f1ce182b002ee5fd8b5fc4a41c39c8 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 28 Feb 2015 04:10:04 -0500 Subject: [PATCH 32/34] More hardsuit fixes, ion rifle fix Fixes modules being usable when destroyed. Fixes charge display for fractional charge values. Fixes ion rifles EMPing themselves. --- code/modules/clothing/spacesuits/rig/modules/modules.dm | 5 +++-- code/modules/clothing/spacesuits/rig/rig.dm | 6 +++--- code/modules/projectiles/guns/energy/special.dm | 4 +--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 830e0d784c..17498a31b2 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -138,6 +138,7 @@ if(damage >= 2) usr << "The [interface_name] is damaged beyond use!" + return 0 if(world.time < next_use) usr << "You cannot use the [interface_name] again so soon." @@ -147,7 +148,7 @@ usr << "The suit is not initialized." return 0 - if(usr.lying || usr.stat || usr.stunned || usr.paralysis) + if(usr.lying || usr.stat || usr.stunned || usr.paralysis || usr.weakened) usr << "You cannot use the suit in this state." return 0 @@ -157,7 +158,7 @@ if(holder.security_check_enabled && !holder.check_suit_access(usr)) usr << "Access denied." - return + return 0 if(!holder.check_power_cost(usr, use_power_cost, 0, src, (istype(usr,/mob/living/silicon ? 1 : 0) ) ) ) return 0 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 7a09fe5bc7..2f5d1f5474 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -313,8 +313,9 @@ if(!istype(wearer) || loc != wearer || wearer.back != src || canremove || !cell || cell.charge <= 0) if(!cell || cell.charge <= 0) - if(electrified >0) + if(electrified > 0) electrified = 0 + malfunction_delay = 0 //ensures that people aren't stuck in their suit if the cell runs out while malfunctioning. if(!offline) if(istype(wearer)) if(!canremove) @@ -338,7 +339,6 @@ for(var/obj/item/rig_module/module in installed_modules) module.deactivate() offline = 2 - malfunction_delay = 0 //ensures that people aren't stuck in their suit if the cell runs out while malfunctioning. chest.slowdown = offline_slowdown return @@ -409,7 +409,7 @@ data["boots"] = (boots ? "[boots.name]" : "None.") data["chest"] = (chest ? "[chest.name]" : "None.") - data["charge"] = cell ? cell.charge : 0 + data["charge"] = cell ? round(cell.charge,1) : 0 data["maxcharge"] = cell ? cell.maxcharge : 0 data["chargestatus"] = cell ? Floor((cell.charge/cell.maxcharge)*50) : 0 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 76bcebac3c..31480de9c8 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -13,9 +13,7 @@ projectile_type = /obj/item/projectile/ion /obj/item/weapon/gun/energy/ionrifle/emp_act(severity) - if(severity > 2) - return //so it doesn't EMP itself, I guess - ..() + ..(max(severity, 2)) //so it doesn't EMP itself, I guess /obj/item/weapon/gun/energy/ionrifle/update_icon() ..() From 8d1a92a0f5ab9fb61a86afadffd892a87364d559 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 28 Feb 2015 04:36:43 -0500 Subject: [PATCH 33/34] Hardsuit tweaks Spider fang blade uses power faster. Light hardsuits (minus ninja suit) have voidsuit-level breach thresholds. If the suit is malfunctioning when it runs out of power then you will need someone to cut you out. --- .../clothing/spacesuits/rig/modules/combat.dm | 2 +- code/modules/clothing/spacesuits/rig/rig.dm | 14 ++++++++------ code/modules/clothing/spacesuits/rig/suits/ert.dm | 1 + .../modules/clothing/spacesuits/rig/suits/light.dm | 10 +++++++++- code/modules/projectiles/guns/energy/laser.dm | 2 +- 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index 605bff6be8..b106e41255 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -151,7 +151,7 @@ selectable = 1 toggleable = 1 use_power_cost = 50 - active_power_cost = 5 + active_power_cost = 10 passive_power_cost = 0 gun_type = /obj/item/weapon/gun/energy/crossbow/ninja diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 2f5d1f5474..d003d64d59 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -315,14 +315,13 @@ if(!cell || cell.charge <= 0) if(electrified > 0) electrified = 0 - malfunction_delay = 0 //ensures that people aren't stuck in their suit if the cell runs out while malfunctioning. if(!offline) if(istype(wearer)) if(!canremove) if (offline_slowdown < 3) wearer << "Your suit beeps stridently, and suddenly goes dead." else - wearer << "Your suit beeps stridently, and suddenly you're wearing a leaden mass of metal and plastic instead of a powered suit." + wearer << "Your suit beeps stridently, and suddenly you're wearing a leaden mass of metal and plastic composites instead of a powered suit." if(offline_vision_restriction == 1) wearer << "The suit optics flicker and die, leaving you with restricted vision." else if(offline_vision_restriction == 2) @@ -693,7 +692,7 @@ /obj/item/weapon/rig/emp_act(severity_class) //set malfunctioning - if(emp_protection < 40) + if(emp_protection < 30) //for ninjas, really. malfunctioning += 10 if(malfunction_delay <= 0) malfunction_delay = max(malfunction_delay, round(30/severity_class)) @@ -719,8 +718,8 @@ if(!is_emp) chance = 2*max(0, damage - (chest? chest.breach_threshold : 0)) else - //Want this to be roughly independant of the number of modules, that way people designing hardsuits - //don't have to worry (as much) about how adding that extra module will affect emp resiliance. + //Want this to be roughly independant of the number of modules, meaning that X emp hits will disable Y% of the suit's modules on average. + //that way people designing hardsuits don't have to worry (as much) about how adding that extra module will affect emp resiliance by 'soaking' hits for other modules chance = max(0, damage - emp_protection)*min(installed_modules.len/15, 1) if(!prob(chance)) @@ -758,7 +757,10 @@ /obj/item/weapon/rig/proc/malfunction_check(var/mob/living/carbon/human/user) if(malfunction_delay) - user << "ERROR: Hardware fault. Rebooting interface..." + if(offline) + user << "The suit is completely unresponsive." + else + user << "ERROR: Hardware fault. Rebooting interface..." return 1 return 0 diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index 121f028686..feec1f5810 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -41,6 +41,7 @@ ) /obj/item/clothing/gloves/rig/ert_engineer + name = "insulated gauntlets" siemens_coefficient = 0 /obj/item/weapon/rig/ert/medical diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index 3471fa0473..55442c0a02 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -19,6 +19,8 @@ /obj/item/clothing/suit/space/rig/light name = "suit" + breach_threshold = 18 //comparable to voidsuits + resilience = 0.2 /obj/item/clothing/gloves/rig/light name = "gloves" @@ -55,9 +57,11 @@ desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins." icon_state = "ninja_rig" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) - emp_protection = 40 + emp_protection = 40 //change this to 30 if too high. slowdown = 0 + chest_type = /obj/item/clothing/suit/space/rig/light/ninja + req_access = list(access_syndicate) initial_modules = list( @@ -77,6 +81,10 @@ ..() +/obj/item/clothing/suit/space/rig/light/ninja + breach_threshold = 28 //comparable to regular hardsuits + resilience = 0.05 + /obj/item/weapon/rig/light/stealth name = "stealth suit control module" suit_type = "stealth" diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 622c23d0ce..2bc36508d8 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -59,7 +59,7 @@ obj/item/weapon/gun/energy/retro /obj/item/weapon/gun/energy/lasercannon/mounted self_recharge = 1 use_external_power = 1 - recharge_time = 8 + recharge_time = 10 /obj/item/weapon/gun/energy/xray name = "xray laser gun" From 65e01c50c1d31026eef4971515d2776283c0e0ff Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Sat, 28 Feb 2015 20:47:27 +0100 Subject: [PATCH 34/34] Fixes issue with borg remote access. Borgs had better remote access than even the AI, ignoring all distances if viewing through cameras. Introducing view limit. --- code/modules/nano/nanointeraction.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/nano/nanointeraction.dm b/code/modules/nano/nanointeraction.dm index 5b0a7ec01a..a9025ea70e 100644 --- a/code/modules/nano/nanointeraction.dm +++ b/code/modules/nano/nanointeraction.dm @@ -28,8 +28,10 @@ return STATUS_CLOSE if(lockcharge || stunned || weakened) return STATUS_DISABLED + if(custom_state.flags & NANO_IGNORE_DISTANCE) + return STATUS_INTERACTIVE // robots can interact with things they can see within their view range - if(!(custom_state.flags & NANO_IGNORE_DISTANCE) && (src_object in view(src))) + if((src_object in view(src)) && get_dist(src_object, src) <= src.client.view) return STATUS_INTERACTIVE // interactive (green visibility) return STATUS_DISABLED // no updates, completely disabled (red visibility)