From 59844c5553c6ea40443793857ece5956905f3fe6 Mon Sep 17 00:00:00 2001 From: Cameron653 Date: Thu, 22 Mar 2018 12:50:50 -0400 Subject: [PATCH] Xenoarch Multitool & Xenoarch Excavation Drill (#5058) * Xenoarch Multitool & Xenoarch Excavation Drill * Makes the tool work better * Cuts down on lines & left comments * change to m --- .../objects/items/weapons/storage/belt.dm | 4 +- code/modules/mining/mine_turfs.dm | 30 +++++++---- code/modules/research/designs.dm | 16 ++++++ code/modules/xenoarcheaology/boulder.dm | 19 +++++-- code/modules/xenoarcheaology/tools/tools.dm | 48 +++++++++++++++--- .../xenoarcheaology/tools/tools_pickaxe.dm | 40 +++++++++++++++ .../Cameron - Xenoarch Upgrades.yml | 37 ++++++++++++++ icons/obj/xenoarchaeology.dmi | Bin 68454 -> 69275 bytes 8 files changed, 173 insertions(+), 21 deletions(-) create mode 100644 html/changelogs/Cameron - Xenoarch Upgrades.yml diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 48593c7b21..e4482932b1 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -373,7 +373,9 @@ /obj/item/weapon/storage/excavation, /obj/item/weapon/anobattery, /obj/item/device/ano_scanner, - /obj/item/weapon/pickaxe/hand + /obj/item/weapon/pickaxe/hand, + /obj/item/device/xenoarch_multi_tool, + /obj/item/weapon/pickaxe/excavationdrill ) /obj/item/weapon/storage/belt/fannypack diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index ced8b13843..b59909376f 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -243,7 +243,7 @@ var/list/mining_overlay_cache = list() /turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob) if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") return if(!density) @@ -263,19 +263,19 @@ var/list/mining_overlay_cache = list() if(valid_tool) if (sand_dug) - user << "This area has already been dug." + to_chat(user, "This area has already been dug.") return var/turf/T = user.loc if (!(istype(T))) return - user << "You start digging." + to_chat(user, "You start digging.") playsound(user.loc, 'sound/effects/rustle1.ogg', 50, 1) if(!do_after(user,40)) return - user << "You dug a hole." + to_chat(user, "You dug a hole.") GetDrilled() else if(istype(W,/obj/item/weapon/storage/bag/ore)) @@ -298,7 +298,7 @@ var/list/mining_overlay_cache = list() return var/obj/item/stack/rods/R = W if (R.use(1)) - user << "Constructing support lattice ..." + to_chat(user, "Constructing support lattice ...") playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) new /obj/structure/lattice(get_turf(src)) @@ -314,7 +314,7 @@ var/list/mining_overlay_cache = list() S.use(1) return else - user << "The plating is going to need some support." + to_chat(user, "The plating is going to need some support.") return @@ -334,7 +334,17 @@ var/list/mining_overlay_cache = list() var/obj/item/device/measuring_tape/P = W user.visible_message("\The [user] extends \a [P] towards \the [src].","You extend \the [P] towards \the [src].") if(do_after(user, 15)) - user << "\The [src] has been excavated to a depth of [excavation_level]cm." + to_chat(user, "\The [src] has been excavated to a depth of [excavation_level]cm.") + return + + if(istype(W, /obj/item/device/xenoarch_multi_tool)) + var/obj/item/device/xenoarch_multi_tool/C = W + if(C.mode) //Mode means scanning + C.depth_scanner.scan_atom(user, src) + else + user.visible_message("\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!", "You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!") + if(do_after(user, 15)) + to_chat(user, "\The [src] has been excavated to a depth of [excavation_level]cm.") return if (istype(W, /obj/item/weapon/pickaxe)) @@ -356,7 +366,7 @@ var/list/mining_overlay_cache = list() if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably) fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]" - user << "You start [P.drill_verb][fail_message]." + to_chat(user, "You start [P.drill_verb][fail_message].") if(fail_message && prob(90)) if(prob(25)) @@ -375,7 +385,7 @@ var/list/mining_overlay_cache = list() else if(newDepth > F.excavation_required - F.clearance_range) // Not quite right but you still extract your find, the closer to the bottom the better, but not above 80% excavate_find(prob(80 * (F.excavation_required - newDepth) / F.clearance_range), F) - user << "You finish [P.drill_verb] \the [src]." + to_chat(user, "You finish [P.drill_verb] \the [src].") if(newDepth >= 200) // This means the rock is mined out fully var/obj/structure/boulder/B @@ -480,7 +490,7 @@ var/list/mining_overlay_cache = list() if(prob(50)) pain = 1 for(var/mob/living/M in range(src, 200)) - M << "[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!" + to_chat(M, "[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!") if(pain) flick("pain",M.pain) if(prob(50)) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 649d041db2..f90fd1c313 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1802,6 +1802,22 @@ CIRCUITS BELOW build_path = /obj/item/device/universal_translator/ear sort_string = "HABQB" +/datum/design/obj/item/device/xenoarch_multi_tool + name = "xenoarcheology multitool" + id = "xenoarch_multitool" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) + build_path = /obj/item/device/xenoarch_multi_tool + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500) + sort_string = "HABQC" + +/datum/design/excavationdrill + name = "Excavation Drill" + id = "excavationdrill" + req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/weapon/pickaxe/excavationdrill + /* Uncomment if someone makes these buildable /datum/design/circuit/general_alert name = "general alert console" diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm index 4c0bafd707..09b9d398ea 100644 --- a/code/modules/xenoarcheaology/boulder.dm +++ b/code/modules/xenoarcheaology/boulder.dm @@ -29,11 +29,22 @@ C.scan_atom(user, src) return + if(istype(I, /obj/item/device/xenoarch_multi_tool)) + var/obj/item/device/xenoarch_multi_tool/C = I + if(C.mode) //Mode means scanning. + C.depth_scanner.scan_atom(user, src) + return + else + user.visible_message("\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!", "You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!") + if(do_after(user, 15)) + to_chat(user, "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm.") + return + if(istype(I, /obj/item/device/measuring_tape)) var/obj/item/device/measuring_tape/P = I user.visible_message("\The [user] extends \the [P] towards \the [src].", "You extend \the [P] towards \the [src].") if(do_after(user, 15)) - user << "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm." + to_chat(user, "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm.") return if(istype(I, /obj/item/weapon/pickaxe)) @@ -43,12 +54,12 @@ return last_act = world.time - user << "You start [P.drill_verb] [src]." + to_chat(user, "You start [P.drill_verb] [src].") if(!do_after(user, P.digspeed)) return - user << "You finish [P.drill_verb] [src]." + to_chat(user, "You finish [P.drill_verb] [src].") excavation_level += P.excavation_amount if(excavation_level > 100) @@ -87,4 +98,4 @@ else if(istype(AM,/obj/mecha)) var/obj/mecha/M = AM if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) - M.selected.action(src) \ No newline at end of file + M.selected.action(src) diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index 17412b4a8b..5f8c30ecad 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -80,13 +80,13 @@ SSxenoarch.digsite_spawning_turfs.Remove(T) if(nearestTargetDist >= 0) - user << "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]" + to_chat(user, "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]") else if(nearestSimpleTargetDist >= 0) - user << "Small anomaly detected in a radius of [nearestSimpleTargetDist]m." + to_chat(user, "Small anomaly detected in a radius of [nearestSimpleTargetDist]m.") else - user << "Background radiation levels detected." + to_chat(user, "Background radiation levels detected.") else - user << "Scanning array is recharging." + to_chat(user, "Scanning array is recharging.") /obj/item/device/depth_scanner name = "depth analysis scanner" @@ -133,7 +133,7 @@ positive_locations.Add(D) - user << "\icon[src] [src] pings." + to_chat(user, "\icon[src] [src] pings.") else if(istype(A, /obj/structure/boulder)) var/obj/structure/boulder/B = A @@ -151,7 +151,7 @@ positive_locations.Add(D) - user << "\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!" + to_chat(user, "\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!") /obj/item/device/depth_scanner/attack_self(var/mob/living/user) interact(user) @@ -310,3 +310,39 @@ usr << browse(null, "window=locater") updateSelfDialog() + +/obj/item/device/xenoarch_multi_tool + name = "xenoarcheology multitool" + desc = "Has the features of the Alden-Saraspova counter, a measuring tape, and a depth analysis scanner all in one!" + icon_state = "ano_scanner2" + item_state = "lampgreen" + icon = 'icons/obj/xenoarchaeology.dmi' + origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2) + matter = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000) + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT + var/mode = 1 //Start off scanning. 1 = scanning, 0 = measuring + var/obj/item/device/ano_scanner/anomaly_scanner = null + var/obj/item/device/depth_scanner/depth_scanner = null + +/obj/item/device/xenoarch_multi_tool/New() + anomaly_scanner = new/obj/item/device/ano_scanner(src) + depth_scanner = new/obj/item/device/depth_scanner(src) + +/obj/item/device/xenoarch_multi_tool/attack_self(var/mob/living/user) + depth_scanner.interact(user) + +/obj/item/device/xenoarch_multi_tool/verb/swap_settings(var/mob/living/user) + set name = "Swap Functionality" + set desc = "Swap between the scanning and measuring functionality.." + mode = !mode + if(mode) + to_chat(user, "The device will now scan for artifacts.") + else + to_chat(user, "The device will now measure depth dug.") + +/obj/item/device/xenoarch_multi_tool/verb/scan_for_anomalies(var/mob/living/user) + set name = "Scan for Anomalies" + set desc = "Scan for artifacts and anomalies within your vicinity." + anomaly_scanner.interact(user) + diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm index b954d5eb05..d911843cca 100644 --- a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm +++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm @@ -149,3 +149,43 @@ smallest.loc = src picksToSort -= smallest orient2hud() + +/obj/item/weapon/pickaxe/excavationdrill + name = "excavation drill" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "excavationdrill2" + item_state = "syringe_0" + excavation_amount = 15 + digspeed = 30 + desc = "Advanced archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The tip is adjustable from 1 to 30 cm." + drill_sound = 'sound/weapons/thudswoosh.ogg' + drill_verb = "drilling" + force = 5 + w_class = 2 + attack_verb = list("drilled") + +/obj/item/weapon/pickaxe/excavationdrill/attack_self(mob/user as mob) + var/depth = input("Put the desired depth (1-30 centimeters).", "Set Depth", 30) as num + if(depth>30 || depth<1) + to_chat(user, "Invalid depth.") + return + excavation_amount = depth + to_chat(user, "You set the depth to [depth]cm.") + switch(depth) + if(1 to 5) + icon_state = "excavationdrill0" + if(6 to 10) + icon_state = "excavationdrill1" + if(11 to 15) + icon_state = "excavationdrill2" + if(16 to 20) + icon_state = "excavationdrill3" + if(21 to 25) + icon_state = "excavationdrill4" + if(25 to 30) + icon_state = "excavationdrill5" //The other 2 sprites are comically long. Let's just cut it at 5. + +/obj/item/weapon/pickaxe/excavationdrill/examine(mob/user) + ..() + var/depth = excavation_amount + to_chat(user, "It is currently set at [depth]cms.") \ No newline at end of file diff --git a/html/changelogs/Cameron - Xenoarch Upgrades.yml b/html/changelogs/Cameron - Xenoarch Upgrades.yml new file mode 100644 index 0000000000..b352e0d3b7 --- /dev/null +++ b/html/changelogs/Cameron - Xenoarch Upgrades.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Cameron653 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Adds a xenoarch excavation tool, craftable in R&D. Allows depth selection of 1-30" + - rscadd: "Adds a xenoarch multitool, craftable in R&D. Has xenoarch counter, measure tool, and depth scanner all in one." diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi index 6ece09b46ed4dad3df6fb3f284dcf68ffc0be6f3..e0baa63cffdd9029210a36a49e89df5d5e6c9d56 100644 GIT binary patch delta 5643 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 Mwux4y#>1%p0`zCH1^@s6 delta 4816 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