From 009f95db4210ff3ad5adbe7ae22275685f095574 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 19 Mar 2018 21:11:23 -0500 Subject: [PATCH] [MIRROR] Electronic assembly changes and additions (#6014) * Electronic assembly changes and additions * Electronic assembly changes and additions (#36394) * the rainbow of mediocrity rides again * whoops that wasn't supposed to be there --- code/__DEFINES/colors.dm | 17 ++ .../subsystem/processing/circuit.dm | 18 +- code/game/turfs/simulated/walls.dm | 7 +- .../integrated_electronics/core/assemblies.dm | 189 ++++++++++++++++-- .../integrated_electronics/core/detailer.dm | 47 +++++ .../core/saved_circuits.dm | 15 +- icons/obj/assemblies/electronic_setups.dmi | Bin 7411 -> 16484 bytes icons/obj/assemblies/electronic_tools.dmi | Bin 2179 -> 2390 bytes tgstation.dme | 1 + 9 files changed, 268 insertions(+), 26 deletions(-) create mode 100644 code/modules/integrated_electronics/core/detailer.dm diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 824f5b3e61..4811d0041f 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -37,3 +37,20 @@ #define COLOR_PALE_RED_GRAY "#D59998" #define COLOR_PALE_PURPLE_GRAY "#CBB1CA" #define COLOR_PURPLE_GRAY "#AE8CA8" + +//Color defines used by the assembly detailer. +#define COLOR_ASSEMBLY_BLACK "#545454" +#define COLOR_ASSEMBLY_BGRAY "#9497AB" +#define COLOR_ASSEMBLY_WHITE "#E2E2E2" +#define COLOR_ASSEMBLY_RED "#CC4242" +#define COLOR_ASSEMBLY_ORANGE "#E39751" +#define COLOR_ASSEMBLY_BEIGE "#AF9366" +#define COLOR_ASSEMBLY_BROWN "#97670E" +#define COLOR_ASSEMBLY_GOLD "#AA9100" +#define COLOR_ASSEMBLY_YELLOW "#CECA2B" +#define COLOR_ASSEMBLY_GURKHA "#999875" +#define COLOR_ASSEMBLY_LGREEN "#789876" +#define COLOR_ASSEMBLY_GREEN "#44843C" +#define COLOR_ASSEMBLY_LBLUE "#5D99BE" +#define COLOR_ASSEMBLY_BLUE "#38559E" +#define COLOR_ASSEMBLY_PURPLE "#6F6192" \ No newline at end of file diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm index a9abacd934..9fc3683266 100644 --- a/code/controllers/subsystem/processing/circuit.dm +++ b/code/controllers/subsystem/processing/circuit.dm @@ -48,21 +48,35 @@ PROCESSING_SUBSYSTEM_DEF(circuit) /obj/item/device/electronic_assembly/calc, /obj/item/device/electronic_assembly/clam, /obj/item/device/electronic_assembly/simple, + /obj/item/device/electronic_assembly/hook, + /obj/item/device/electronic_assembly/pda, /obj/item/device/electronic_assembly/medium/default, /obj/item/device/electronic_assembly/medium/box, /obj/item/device/electronic_assembly/medium/clam, /obj/item/device/electronic_assembly/medium/medical, + /obj/item/device/electronic_assembly/medium/gun, + /obj/item/device/electronic_assembly/medium/radio, /obj/item/device/electronic_assembly/large/default, /obj/item/device/electronic_assembly/large/scope, /obj/item/device/electronic_assembly/large/terminal, /obj/item/device/electronic_assembly/large/arm, + /obj/item/device/electronic_assembly/large/tall, + /obj/item/device/electronic_assembly/large/industrial, /obj/item/device/electronic_assembly/drone/default, - /obj/item/device/electronic_assembly/drone/arms + /obj/item/device/electronic_assembly/drone/arms, + /obj/item/device/electronic_assembly/drone/secbot, + /obj/item/device/electronic_assembly/drone/medbot, + /obj/item/device/electronic_assembly/drone/genbot, + /obj/item/device/electronic_assembly/drone/android, + /obj/item/device/electronic_assembly/wallmount/light, + /obj/item/device/electronic_assembly/wallmount, + /obj/item/device/electronic_assembly/wallmount/heavy ///obj/item/weapon/implant/integrated_circuit ) circuit_fabricator_recipe_list["Tools"] = list( /obj/item/device/integrated_electronics/wirer, /obj/item/device/integrated_electronics/debugger, - /obj/item/device/integrated_electronics/analyzer + /obj/item/device/integrated_electronics/analyzer, + /obj/item/device/integrated_electronics/detailer ) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index ff113f8cd9..a060b030a1 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -218,6 +218,11 @@ else if(istype(W, /obj/item/poster)) place_poster(W,user) return TRUE + //wall mounted IC assembly stuff + else if(istype(W, /obj/item/device/electronic_assembly/wallmount)) + var/obj/item/device/electronic_assembly/wallmount/A = W + A.mount_assembly(src, user) + return TRUE return FALSE @@ -303,5 +308,5 @@ cut_overlay(dent_decals) LAZYADD(dent_decals, decal) add_overlay(dent_decals) - + #undef MAX_DENT_DECALS diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 71605fc0dc..e62e26d576 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -30,6 +30,34 @@ hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD, DIAG_CIRCUIT_HUD) //diagnostic hud overlays max_integrity = 50 armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) + anchored = FALSE + var/can_anchor = TRUE + var/detail_color = COLOR_ASSEMBLY_BLACK + var/list/color_whitelist = list( //This is just for checking that hacked colors aren't in the save data. + COLOR_ASSEMBLY_BLACK, + COLOR_FLOORTILE_GRAY, + COLOR_ASSEMBLY_BGRAY, + COLOR_ASSEMBLY_WHITE, + COLOR_ASSEMBLY_RED, + COLOR_ASSEMBLY_ORANGE, + COLOR_ASSEMBLY_BEIGE, + COLOR_ASSEMBLY_BROWN, + COLOR_ASSEMBLY_GOLD, + COLOR_ASSEMBLY_YELLOW, + COLOR_ASSEMBLY_GURKHA, + COLOR_ASSEMBLY_LGREEN, + COLOR_ASSEMBLY_GREEN, + COLOR_ASSEMBLY_LBLUE, + COLOR_ASSEMBLY_BLUE, + COLOR_ASSEMBLY_PURPLE + ) + +/obj/item/device/electronic_assembly/examine(mob/user) + . = ..() + if(can_anchor) + to_chat(user, "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintainence panel [opened ? "can be" : "is"] screwed in place.") + else + to_chat(user, "The maintainence panel [opened ? "can be" : "is"] screwed in place.") /obj/item/device/electronic_assembly/proc/check_interactivity(mob/user) return user.canUseTopic(src, BE_CLOSE) @@ -233,6 +261,12 @@ icon_state = initial(icon_state) + "-open" else icon_state = initial(icon_state) + cut_overlays() + if(detail_color == COLOR_ASSEMBLY_BLACK) //Black colored overlay looks almost but not exactly like the base sprite, so just cut the overlay and avoid it looking kinda off. + return + var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/assemblies/electronic_setups.dmi', "[icon_state]-color") + detail_overlay.color = detail_color + add_overlay(detail_overlay) /obj/item/device/electronic_assembly/examine(mob/user) ..() @@ -357,24 +391,38 @@ return TRUE /obj/item/device/electronic_assembly/attackby(obj/item/I, mob/living/user) + if(can_anchor && default_unfasten_wrench(user, I, 20)) + return if(istype(I, /obj/item/integrated_circuit)) if(!user.canUnEquip(I)) return FALSE if(try_add_component(I, user)) interact(user) return TRUE + else + for(var/obj/item/integrated_circuit/input/S in assembly_components) + S.attackby_react(I,user,user.a_intent) + return ..() else if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger)) if(opened) interact(user) + return TRUE else to_chat(user, "[src]'s hatch is closed, so you can't fiddle with the internal components.") + for(var/obj/item/integrated_circuit/input/S in assembly_components) + S.attackby_react(I,user,user.a_intent) + return ..() else if(istype(I, /obj/item/stock_parts/cell)) if(!opened) - to_chat(user, "[src]'s hatch is closed, so you can't put anything inside.") - return FALSE + to_chat(user, "[src]'s hatch is closed, so you can't access \the [src]'s power supplier.") + for(var/obj/item/integrated_circuit/input/S in assembly_components) + S.attackby_react(I,user,user.a_intent) + return ..() if(battery) to_chat(user, "[src] already has \a [battery] installed. Remove it first if you want to replace it.") - return FALSE + for(var/obj/item/integrated_circuit/input/S in assembly_components) + S.attackby_react(I,user,user.a_intent) + return ..() var/obj/item/stock_parts/cell = I user.transferItemToLoc(I, loc) cell.forceMove(src) @@ -384,6 +432,10 @@ to_chat(user, "You slot \the [cell] inside \the [src]'s power supplier.") interact(user) return TRUE + else if(istype(I, /obj/item/device/integrated_electronics/detailer)) + var/obj/item/device/integrated_electronics/detailer/D = I + detail_color = D.detail_color + update_icon() else for(var/obj/item/integrated_circuit/input/S in assembly_components) S.attackby_react(I,user,user.a_intent) @@ -471,6 +523,17 @@ return acting_object.drop_location() +/obj/item/device/electronic_assembly/attack_tk(mob/user) + if(anchored) + return + ..() + +/obj/item/device/electronic_assembly/attack_hand(mob/user) + if(anchored) + attack_self(user) + return + ..() + /obj/item/device/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves. name = "type-a electronic assembly" @@ -489,6 +552,16 @@ icon_state = "setup_small_simple" desc = "It's a case, for building small electronics with. This one has a simple design." +/obj/item/device/electronic_assembly/hook + name = "type-e electronic assembly" + icon_state = "setup_small_hook" + desc = "It's a case, for building small electronics with. This one looks like it has a belt clip, but it's purely decorative." + +/obj/item/device/electronic_assembly/pda + name = "type-f electronic assembly" + icon_state = "setup_small_pda" + desc = "It's a case, for building small electronics with. This one resembles a PDA." + /obj/item/device/electronic_assembly/medium name = "electronic mechanism" icon_state = "setup_medium" @@ -515,6 +588,16 @@ icon_state = "setup_medium_med" desc = "It's a case, for building medium-sized electronics with. This one resembles some type of medical apparatus." +/obj/item/device/electronic_assembly/medium/gun + name = "type-e electronic mechanism" + icon_state = "setup_medium_gun" + desc = "It's a case, for building medium-sized electronics with. This one resembles a gun, or some type of tool, if you're feeling optimistic." + +/obj/item/device/electronic_assembly/medium/radio + name = "type-f electronic mechanism" + icon_state = "setup_medium_radio" + desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio." + /obj/item/device/electronic_assembly/large name = "electronic machine" icon_state = "setup_large" @@ -522,23 +605,6 @@ w_class = WEIGHT_CLASS_BULKY max_components = IC_MAX_SIZE_BASE * 4 max_complexity = IC_COMPLEXITY_BASE * 4 - anchored = FALSE - -/obj/item/device/electronic_assembly/large/attackby(obj/item/O, mob/user) - if(default_unfasten_wrench(user, O, 20)) - return - ..() - -/obj/item/device/electronic_assembly/large/attack_tk(mob/user) - if(anchored) - return - ..() - -/obj/item/device/electronic_assembly/large/attack_hand(mob/user) - if(anchored) - attack_self(user) - return - ..() /obj/item/device/electronic_assembly/large/default name = "type-a electronic machine" @@ -558,6 +624,16 @@ icon_state = "setup_large_arm" desc = "It's a case, for building large electronics with. This one resembles a robotic arm." +/obj/item/device/electronic_assembly/large/tall + name = "type-e electronic machine" + icon_state = "setup_large_tall" + desc = "It's a case, for building large electronics with. This one has a tall design." + +/obj/item/device/electronic_assembly/large/industrial + name = "type-f electronic machine" + icon_state = "setup_large_industrial" + desc = "It's a case, for building large electronics with. This one resembles some kind of industrial machinery." + /obj/item/device/electronic_assembly/drone name = "electronic drone" icon_state = "setup_drone" @@ -566,6 +642,7 @@ max_components = IC_MAX_SIZE_BASE * 3 max_complexity = IC_COMPLEXITY_BASE * 3 allowed_circuit_action_flags = IC_ACTION_MOVEMENT | IC_ACTION_COMBAT | IC_ACTION_LONG_RANGE + can_anchor = FALSE /obj/item/device/electronic_assembly/drone/can_move() return TRUE @@ -577,3 +654,75 @@ name = "type-b electronic drone" icon_state = "setup_drone_arms" desc = "It's a case, for building mobile electronics with. This one is armed and dangerous." + +/obj/item/device/electronic_assembly/drone/secbot + name = "type-c electronic drone" + icon_state = "setup_drone_secbot" + desc = "It's a case, for building mobile electronics with. This one resembles a Securitron." + +/obj/item/device/electronic_assembly/drone/medbot + name = "type-d electronic drone" + icon_state = "setup_drone_medbot" + desc = "It's a case, for building mobile electronics with. This one resembles a Medibot." + +/obj/item/device/electronic_assembly/drone/genbot + name = "type-e electronic drone" + icon_state = "setup_drone_genbot" + desc = "It's a case, for building mobile electronics with. This one has a generic bot design." + +/obj/item/device/electronic_assembly/drone/android + name = "type-f electronic drone" + icon_state = "setup_drone_android" + desc = "It's a case, for building mobile electronics with. This one has a hominoid design." + +/obj/item/device/electronic_assembly/wallmount + name = "wall-mounted electronic assembly" + icon_state = "setup_wallmount_medium" + desc = "It's a case, for building medium-sized electronics with. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on." + w_class = WEIGHT_CLASS_NORMAL + max_components = IC_MAX_SIZE_BASE * 2 + max_complexity = IC_COMPLEXITY_BASE * 2 + +/obj/item/device/electronic_assembly/wallmount/heavy + name = "heavy wall-mounted electronic assembly" + icon_state = "setup_wallmount_large" + desc = "It's a case, for building large electronics with. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on." + w_class = WEIGHT_CLASS_BULKY + max_components = IC_MAX_SIZE_BASE * 4 + max_complexity = IC_COMPLEXITY_BASE * 4 + +/obj/item/device/electronic_assembly/wallmount/light + name = "light wall-mounted electronic assembly" + icon_state = "setup_wallmount_small" + desc = "It's a case, for building small electronics with. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on." + w_class = WEIGHT_CLASS_SMALL + max_components = IC_MAX_SIZE_BASE + max_complexity = IC_COMPLEXITY_BASE + +/obj/item/device/electronic_assembly/wallmount/proc/mount_assembly(turf/on_wall, mob/user) //Yeah, this is admittedly just an abridged and kitbashed version of the wallframe attach procs. + if(get_dist(on_wall,user)>1) + return + var/ndir = get_dir(on_wall, user) + if(!(ndir in GLOB.cardinals)) + return + var/turf/T = get_turf(user) + if(!isfloorturf(T)) + to_chat(user, "You cannot place [src] on this spot!") + return + if(gotwallitem(T, ndir)) + to_chat(user, "There's already an item on this wall!") + return + playsound(src.loc, 'sound/machines/click.ogg', 75, 1) + user.visible_message("[user.name] attaches [src] to the wall.", + "You attach [src] to the wall.", + "You hear clicking.") + user.dropItemToGround(src) + switch(ndir) + if(NORTH) + pixel_y = -31 + if(SOUTH) + pixel_y = 31 + if(EAST) + pixel_x = -31 + if(WEST) + pixel_x = 31 \ No newline at end of file diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm new file mode 100644 index 0000000000..ef2cd3a138 --- /dev/null +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -0,0 +1,47 @@ +/obj/item/device/integrated_electronics/detailer + name = "assembly detailer" + desc = "A combination autopainter and flash anodizer designed to give electronic assemblies a colorful, wear-resistant finish." + icon = 'icons/obj/assemblies/electronic_tools.dmi' + icon_state = "detailer" + flags_1 = CONDUCT_1 | NOBLUDGEON_1 + w_class = WEIGHT_CLASS_SMALL + var/data_to_write = null + var/accepting_refs = FALSE + var/detail_color = COLOR_ASSEMBLY_WHITE + var/list/color_list = list( + "black" = COLOR_ASSEMBLY_BLACK, + "gray" = COLOR_FLOORTILE_GRAY, + "machine gray" = COLOR_ASSEMBLY_BGRAY, + "white" = COLOR_ASSEMBLY_WHITE, + "red" = COLOR_ASSEMBLY_RED, + "orange" = COLOR_ASSEMBLY_ORANGE, + "beige" = COLOR_ASSEMBLY_BEIGE, + "brown" = COLOR_ASSEMBLY_BROWN, + "gold" = COLOR_ASSEMBLY_GOLD, + "yellow" = COLOR_ASSEMBLY_YELLOW, + "gurkha" = COLOR_ASSEMBLY_GURKHA, + "light green" = COLOR_ASSEMBLY_LGREEN, + "green" = COLOR_ASSEMBLY_GREEN, + "light blue" = COLOR_ASSEMBLY_LBLUE, + "blue" = COLOR_ASSEMBLY_BLUE, + "purple" = COLOR_ASSEMBLY_PURPLE + ) + +/obj/item/device/integrated_electronics/detailer/Initialize() + .=..() + update_icon() + +/obj/item/device/integrated_electronics/detailer/update_icon() + cut_overlays() + var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/assemblies/electronic_tools.dmi', "detailer-color") + detail_overlay.color = detail_color + add_overlay(detail_overlay) + +/obj/item/device/integrated_electronics/detailer/attack_self(mob/user) + var/color_choice = input(user, "Select color.", "Assembly Detailer") as null|anything in color_list + if(!color_list[color_choice]) + return + if(!in_range(src, user)) + return + detail_color = color_list[color_choice] + update_icon() \ No newline at end of file diff --git a/code/modules/integrated_electronics/core/saved_circuits.dm b/code/modules/integrated_electronics/core/saved_circuits.dm index e0395d6ede..1fd3212a82 100644 --- a/code/modules/integrated_electronics/core/saved_circuits.dm +++ b/code/modules/integrated_electronics/core/saved_circuits.dm @@ -129,16 +129,21 @@ if(opened) assembly_params["opened"] = TRUE + // Save modified color + if(initial(detail_color) != detail_color) + assembly_params["detail_color"] = detail_color + return assembly_params // Verifies a list of assembly parameters // Returns null on success, error name on failure /obj/item/device/electronic_assembly/proc/verify_save(list/assembly_params) - // Validate name + // Validate name and color if(assembly_params["name"] && !reject_bad_name(assembly_params["name"], TRUE)) return "Bad assembly name." - + if(assembly_params["detail_color"] && !(assembly_params["detail_color"] in color_whitelist)) + return "Bad assembly color." // Loads assembly parameters from a list // Doesn't verify any of the parameters it loads, this is the job of verify_save() @@ -150,7 +155,11 @@ // Load panel status if(assembly_params["opened"]) opened = TRUE - update_icon() + + if(assembly_params["detail_color"]) + detail_color = assembly_params["detail_color"] + + update_icon() diff --git a/icons/obj/assemblies/electronic_setups.dmi b/icons/obj/assemblies/electronic_setups.dmi index 643d652be1ac011b5f69192da307db10c09d605c..f18018c0aec049c54e4dc8fdf8079be0f9a26508 100644 GIT binary patch literal 16484 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%0Aa3;Pa&IU(?slP5lOlIF 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 UK{)d!Egqn+ZLC$P;Sl+M03(fh>;M1& literal 7411 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 diff --git a/icons/obj/assemblies/electronic_tools.dmi b/icons/obj/assemblies/electronic_tools.dmi index 5c0b2faaa91a63c0ee40ef3ed0a7fbb7ea3c2e12..975f2fc9a812829918c18a4602e109bfd00a69f0 100644 GIT binary patch delta 2246 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 diff --git a/tgstation.dme b/tgstation.dme index 443d286b4d..bfcc32cf67 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1618,6 +1618,7 @@ #include "code\modules\integrated_electronics\core\analyzer.dm" #include "code\modules\integrated_electronics\core\assemblies.dm" #include "code\modules\integrated_electronics\core\debugger.dm" +#include "code\modules\integrated_electronics\core\detailer.dm" #include "code\modules\integrated_electronics\core\helpers.dm" #include "code\modules\integrated_electronics\core\integrated_circuit.dm" #include "code\modules\integrated_electronics\core\pins.dm"