diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 7ec0dac07e2..53a52f093ba 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -26568,6 +26568,7 @@ layer = 3; pixel_x = 32 }, +/obj/machinery/aug_manipulator, /turf/open/floor/plasteel/white, /area/science/robotics/lab) "bkp" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index d6357cc5583..a6b334314c1 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -93138,6 +93138,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/aug_manipulator, /turf/open/floor/plasteel, /area/science/robotics/lab) "dxQ" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 9fb29795ae4..70ed4505f1e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -71169,6 +71169,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/aug_manipulator, /turf/open/floor/plasteel, /area/science/robotics/lab) "cFe" = ( diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 758ff6f496e..2b0e8ee74ad 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -43,7 +43,7 @@ #define BODYPART_ROBOTIC 2 #define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi' -#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augments.dmi' +#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' #define MONKEY_BODYPART "monkey" #define ALIEN_BODYPART "alien" diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm new file mode 100644 index 00000000000..05d6a480641 --- /dev/null +++ b/code/game/machinery/aug_manipulator.dm @@ -0,0 +1,135 @@ +/obj/machinery/aug_manipulator + name = "\improper augment manipulator" + desc = "A machine for custom fitting augmentations, with in-built spraypainter." + icon = 'icons/obj/pda.dmi' + icon_state = "pdapainter" + density = TRUE + anchored = TRUE + obj_integrity = 200 + max_integrity = 200 + var/obj/item/bodypart/storedpart + var/initial_icon_state + var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', "security" = 'icons/mob/augmentation/augments_security.dmi', "mining" = 'icons/mob/augmentation/augments_mining.dmi') + + +/obj/machinery/aug_manipulator/Initialize() + initial_icon_state = initial(icon_state) + return ..() + +/obj/machinery/aug_manipulator/update_icon() + cut_overlays() + + if(stat & BROKEN) + icon_state = "[initial_icon_state]-broken" + return + + if(storedpart) + add_overlay("[initial_icon_state]-closed") + + if(powered()) + icon_state = initial_icon_state + else + icon_state = "[initial_icon_state]-off" + +/obj/machinery/aug_manipulator/Destroy() + QDEL_NULL(storedpart) + return ..() + +/obj/machinery/aug_manipulator/on_deconstruction() + if(storedpart) + storedpart.forceMove(loc) + storedpart = null + +/obj/machinery/aug_manipulator/contents_explosion(severity, target) + if(storedpart) + storedpart.ex_act(severity, target) + +/obj/machinery/aug_manipulator/handle_atom_del(atom/A) + if(A == storedpart) + storedpart = null + update_icon() + +/obj/machinery/aug_manipulator/attackby(obj/item/O, mob/user, params) + if(default_unfasten_wrench(user, O)) + power_change() + return + + else if(istype(O, /obj/item/bodypart)) + var/obj/item/bodypart/B = O + if(B.status != BODYPART_ROBOTIC) + to_chat(user, "The machine only accepts cybernetics!") + return + if(storedpart) + to_chat(user, "There is already something inside!") + return + else + O = user.get_active_held_item() + if(!user.transferItemToLoc(O, src)) + return + storedpart = O + O.add_fingerprint(user) + update_icon() + + else if(istype(O, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM) + var/obj/item/weapon/weldingtool/WT = O + if(obj_integrity < max_integrity) + if(WT.remove_fuel(0,user)) + user.visible_message("[user] begins repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + playsound(src, WT.usesound, 40, 1) + if(do_after(user,40*WT.toolspeed, TRUE, target = src)) + if(!WT.isOn() || !(stat & BROKEN)) + return + to_chat(user, "You repair [src].") + playsound(src, 'sound/items/welder2.ogg', 50, 1) + stat &= ~BROKEN + obj_integrity = max(obj_integrity, max_integrity) + update_icon() + else + to_chat(user, "[src] does not need repairs.") + else + return ..() + +/obj/machinery/aug_manipulator/obj_break(damage_flag) + if(!(flags & NODECONSTRUCT)) + if(!(stat & BROKEN)) + stat |= BROKEN + update_icon() + +/obj/machinery/aug_manipulator/attack_hand(mob/user) + if(!..()) + add_fingerprint(user) + + if(storedpart) + var/augstyle = input(user, "Select style.", "Augment Custom Fitting") as null|anything in style_list_icons + if(!augstyle) + return + if(!in_range(src, user)) + return + if(!storedpart) + return + storedpart.icon = style_list_icons[augstyle] + eject_part(user) + + else + to_chat(user, "\The [src] is empty.") + +/obj/machinery/aug_manipulator/proc/eject_part(mob/living/user) + if(storedpart) + storedpart.forceMove(get_turf(src)) + storedpart = null + update_icon() + else + to_chat(user, "[src] is empty.") + +/obj/machinery/aug_manipulator/AltClick(mob/living/user) + ..() + if(!user.canUseTopic(src)) + return + else + eject_part(user) + +/obj/machinery/aug_manipulator/power_change() + ..() + update_icon() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 70f7a809af0..2981ffe8494 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -241,6 +241,10 @@ var/dynamic_hair_suffix = "" //if this is non-null, and hair+suffix matches an iconstate, then we render that hair instead var/dynamic_fhair_suffix = "" + //for augmented heads + if(HD.status == BODYPART_ROBOTIC) + return + //we check if our hat or helmet hides our facial hair. if(H.head) var/obj/item/I = H.head diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index d93fc658ddb..b239e395761 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -306,7 +306,7 @@ else limb.icon_state = "[animal_origin]_[body_zone]" else - limb.icon = 'icons/mob/augments.dmi' + limb.icon = 'icons/mob/augmentation/augments.dmi' limb.icon_state = "[animal_origin]_[body_zone]" return diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 00a01e2d2e4..c956380d200 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -165,27 +165,27 @@ /obj/item/bodypart/l_arm/robot/surplus name = "surplus prosthetic left arm" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." - icon = 'icons/mob/surplus_augments.dmi' + icon = 'icons/mob/augmentation/surplus_augments.dmi' icon_state = "l_arm" max_damage = 20 /obj/item/bodypart/r_arm/robot/surplus name = "surplus prosthetic right arm" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." - icon = 'icons/mob/surplus_augments.dmi' + icon = 'icons/mob/augmentation/surplus_augments.dmi' icon_state = "r_arm" max_damage = 20 /obj/item/bodypart/l_leg/robot/surplus name = "surplus prosthetic left leg" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." - icon = 'icons/mob/surplus_augments.dmi' + icon = 'icons/mob/augmentation/surplus_augments.dmi' icon_state = "l_leg" max_damage = 20 /obj/item/bodypart/r_leg/robot/surplus name = "surplus prosthetic right leg" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." - icon = 'icons/mob/surplus_augments.dmi' + icon = 'icons/mob/augmentation/surplus_augments.dmi' icon_state = "r_leg" max_damage = 20 diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index 32b4f7c8c6b..c965640ade5 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -57,6 +57,7 @@ qdel(tool) target.update_body_parts() target.updatehealth() + target.update_hair() add_logs(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]") else to_chat(user, "[target] has no organic [parse_zone(target_zone)] there!") diff --git a/icons/mob/augmentation/augments.dmi b/icons/mob/augmentation/augments.dmi new file mode 100644 index 00000000000..a532348d6d1 Binary files /dev/null and b/icons/mob/augmentation/augments.dmi differ diff --git a/icons/mob/augmentation/augments_engineer.dmi b/icons/mob/augmentation/augments_engineer.dmi new file mode 100644 index 00000000000..8aeaaf04e08 Binary files /dev/null and b/icons/mob/augmentation/augments_engineer.dmi differ diff --git a/icons/mob/augmentation/augments_mining.dmi b/icons/mob/augmentation/augments_mining.dmi new file mode 100644 index 00000000000..b79c54e9c89 Binary files /dev/null and b/icons/mob/augmentation/augments_mining.dmi differ diff --git a/icons/mob/augmentation/augments_security.dmi b/icons/mob/augmentation/augments_security.dmi new file mode 100644 index 00000000000..8f57f77c4b8 Binary files /dev/null and b/icons/mob/augmentation/augments_security.dmi differ diff --git a/icons/mob/surplus_augments.dmi b/icons/mob/augmentation/surplus_augments.dmi similarity index 100% rename from icons/mob/surplus_augments.dmi rename to icons/mob/augmentation/surplus_augments.dmi diff --git a/icons/mob/augments.dmi b/icons/mob/augments.dmi deleted file mode 100644 index 7124c35105e..00000000000 Binary files a/icons/mob/augments.dmi and /dev/null differ diff --git a/tgstation.dme b/tgstation.dme index 579a827bff7..8c13f0dfb52 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -515,6 +515,7 @@ #include "code\game\machinery\ai_slipper.dm" #include "code\game\machinery\airlock_control.dm" #include "code\game\machinery\announcement_system.dm" +#include "code\game\machinery\aug_manipulator.dm" #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\bank_machine.dm" #include "code\game\machinery\Beacon.dm"