From 697c8fdc4071e7d060ce77bbe6323aac78a7bffb Mon Sep 17 00:00:00 2001 From: zxaber <37497534+zxaber@users.noreply.github.com> Date: Sat, 15 Apr 2023 18:23:02 -0700 Subject: [PATCH] Adds a Material Stack manipulation apparatus for Engineer Cyborgs, replaces the R-Glass tool (#74297) ## About The Pull Request - Adds a new apparatus for Engineer Cyborgs that can pick up and manipulate material sheet stacks. Once holding a stack, interactions are passed to the stack. - Sheets in the new apparatus will always show as single sheets while held, regardless of the actual count. - Removes the R-Glass tool from Engineer Cyborgs. - Sabotage borgs have the same changes ## Why It's Good For The Game Allows Engiborgs to repair or build with various materials, without (further) destroying the concept of material economy. The R-Glass tool, in my experience, is generally unused, as the RCD can create R-Windows and that's the main use for the sheets. So the tool has been removed to keep the Engineer Borg Toolkit from exploding. The new tool can also pick up R-Glass, if a need for it arises. ## Changelog :cl: balance: Engineer Borgs now have a tool to manipulate material stacks (and also tile stacks). This replaces the R-Glass tool. /:cl: Pictured: Apparatus carrying titanium. ![image](https://user-images.githubusercontent.com/37497534/228021045-0f5a6c76-9caa-47de-ad0a-d20e7e1f4eb2.png) --- .../game/objects/items/robot/items/storage.dm | 35 ++++++++++++++++++ .../game/objects/items/stacks/sheets/glass.dm | 23 ------------ .../mob/living/silicon/robot/inventory.dm | 2 + .../mob/living/silicon/robot/robot_model.dm | 9 +---- icons/mob/silicon/robot_items.dmi | Bin 1981 -> 2139 bytes 5 files changed, 39 insertions(+), 30 deletions(-) diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm index 93ef7562b2a..c67aa202089 100644 --- a/code/game/objects/items/robot/items/storage.dm +++ b/code/game/objects/items/robot/items/storage.dm @@ -230,6 +230,41 @@ to_chat(user, span_notice("[src] is empty.")) return +///Apparatus to allow Engineering/Sabo borgs to manipulate any material sheets. +/obj/item/borg/apparatus/sheet_manipulator + name = "material manipulation apparatus" + desc = "An apparatus for carrying, deploying, and manipulating sheets of material. The device can also carry custom floor tiles." + icon_state = "borg_stack_apparatus" + storable = list(/obj/item/stack/sheet, + /obj/item/stack/tile) + +/obj/item/borg/apparatus/sheet_manipulator/Initialize(mapload) + update_appearance() + return ..() + +/obj/item/borg/apparatus/sheet_manipulator/update_overlays() + . = ..() + var/mutable_appearance/arm = mutable_appearance(icon, "borg_stack_apparatus_arm1") + if(stored) + stored.pixel_x = 0 + stored.pixel_y = 0 + arm.icon_state = "borg_stack_apparatus_arm2" + var/mutable_appearance/stored_copy = new /mutable_appearance(stored) + var/underscore = findtext(stored_copy.icon_state, "_") + if(underscore) + stored_copy.icon_state = initial(stored.icon_state) //how we use the icon_state of single sheets, even with full stacks + stored_copy.layer = FLOAT_LAYER + stored_copy.plane = FLOAT_PLANE + . += stored_copy + . += arm + +/obj/item/borg/apparatus/sheet_manipulator/examine() + . = ..() + if(stored) + . += "The apparatus currently has [stored] secured." + . += span_notice(" Alt-click will drop the currently stored sheets. ") + +///Apparatus allowing Engineer/Sabo borgs to manipulate Machine and Computer circuit boards /obj/item/borg/apparatus/circuit name = "circuit manipulation apparatus" desc = "A special apparatus for carrying and manipulating circuit boards." diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 41c6d790fcd..301021e33e5 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -167,29 +167,6 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ add_fingerprint(user) ..() -/obj/item/stack/sheet/rglass/cyborg - mats_per_unit = null - cost = 250 - source = /datum/robot_energy_storage/iron - - /// What energy storage this draws glass from as a robot module. - var/datum/robot_energy_storage/glasource = /datum/robot_energy_storage/glass - /// The amount of energy this draws from the glass source per stack unit. - var/glacost = 500 - -/obj/item/stack/sheet/rglass/cyborg/get_amount() - return min(round(source.energy / cost), round(glasource.energy / glacost)) - -/obj/item/stack/sheet/rglass/cyborg/use(used, transfer = FALSE, check = TRUE) // Requires special checks, because it uses two storages - if(get_amount(used)) //ensure we still have enough energy if called in a do_after chain - source.use_charge(used * cost) - glasource.use_charge(used * glacost) - return TRUE - -/obj/item/stack/sheet/rglass/cyborg/add(amount) - source.add_charge(amount * cost) - glasource.add_charge(amount * glacost) - /obj/item/stack/sheet/rglass/get_main_recipes() . = ..() . += GLOB.reinforced_glass_recipes diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index e86ca257f12..1d55351b02f 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -282,6 +282,8 @@ /mob/living/silicon/robot/proc/activated(obj/item/item_module) if(item_module in held_items) return TRUE + if(item_module.loc in held_items) //Apparatus check + return TRUE return FALSE /** diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 43cb65ab54a..ecaac0431de 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -89,11 +89,6 @@ if(ispath(sheet_module.source, /datum/robot_energy_storage)) sheet_module.source = get_or_create_estorage(sheet_module.source) - if(istype(sheet_module, /obj/item/stack/sheet/rglass/cyborg)) - var/obj/item/stack/sheet/rglass/cyborg/rglass_module = sheet_module - if(ispath(rglass_module.glasource, /datum/robot_energy_storage)) - rglass_module.glasource = get_or_create_estorage(rglass_module.glasource) - if(istype(sheet_module.source)) sheet_module.cost = max(sheet_module.cost, 1) // Must not cost 0 to prevent div/0 errors. sheet_module.is_cyborg = TRUE @@ -333,7 +328,7 @@ /obj/item/electroadaptive_pseudocircuit, /obj/item/stack/sheet/iron, /obj/item/stack/sheet/glass, - /obj/item/stack/sheet/rglass/cyborg, + /obj/item/borg/apparatus/sheet_manipulator, /obj/item/stack/rods/cyborg, /obj/item/stack/tile/iron/base/cyborg, /obj/item/stack/cable_coil, @@ -862,7 +857,7 @@ /obj/item/multitool/cyborg, /obj/item/stack/sheet/iron, /obj/item/stack/sheet/glass, - /obj/item/stack/sheet/rglass/cyborg, + /obj/item/borg/apparatus/sheet_manipulator, /obj/item/stack/rods/cyborg, /obj/item/stack/tile/iron/base/cyborg, /obj/item/dest_tagger/borg, diff --git a/icons/mob/silicon/robot_items.dmi b/icons/mob/silicon/robot_items.dmi index 0806c74ad8c140c2431d0b5cb610462f82d97dad..f409a5c38b15c19ccbefd62a7bab0bfbf340f3df 100644 GIT binary patch delta 1963 zcmV;c2UPgI58Dt;iBL{Q4GJ0x0000DNk~Le0002M0001>2m=5B0B!b@ZvX%RJ5Wqi zMZmzo{{R30SIr z`*pR;jpV@g>NJ8)T4&X(bS07*&@!UTWYS?sQ?w|7++*EasiK9$sr+0G;@vh6f>RoY;!X+qO0+y<(vEyAui ze}|?4f|TRmsH*c7?#Z$#)dJzzi9fm1%=v%d#W1*JayQoQ9W=u01G3ZTRIE13^EYq= zE($wTPfbB8000HDNklJCh|}q~|^deTJM+HG+`wM5l7t`#f*{!;m(V;jA@gT} z*XQJfJSg$x=jA7|ln*&}7y)7P<-)w2jQ)@YpnQ2=l?zbPN7}*&ZG!mt{F>%h5H{aN zRtqweGzM!1QQR}Xvgi{KHs3X%X@CJm|9GibEH3GKaY<21rIJ6sY#7F}t{cm&f4Jw| zPn4C%0!aQUMb}qXh56d7FMnu&02!e2i@N?Pc`kicd_04qQ~8Fje@>oDx%}h!+KjH3 zXUcS5rSz0#VBOKbzP`Fa4Lr)hsB{q_1n9msbbfHgp? zOmm({4JnKP1o5>p)nBb@RdT{2<0>M^->gvm^}1FE@*M-RJO>#F&qx}}e}6RjE9yM> zIgkaKs-`x{NAXVDLMElD$%UL$$gqJGX{9OUGpk=}lAl~6-{#_itU%fl5ClOG1VIo4 zMAW;U_PD73KJ9T)|9#ry!v6cT$NByD48*zp_e{jOy~ixXIsNyH#NqyXCgPI3-N-@x zcP9?_=cCJq8*ifgX!a<2-?)zYmD|?`|BNVwew|5iB2eFd82`!R^0;0tEeeHx3I7mM_)^o*?MI2aLl4 z1LjW}7xv$sIA@6i#ly}I$Ho2kX^$faf*=TjAaU}|ZrTdM(b#?Ve=Ob^V!pS%VVb*u zgFO$EP7wS3`IZF)_P+HXaIjBcy&n7h`Btk1I3NbvZLWa>f^)RL-yyIp#C?ChrCQ{{ z3=sp*yF3F2hc8~fv>ohsUcKtr7JMg(`|lwMu>!sR;fsTwG^W4PIr5#w>A$=GmmtL_iY0s{VW5#-ekT&#HricP=8nym$)m??mmA`9CX`VuYr@3 zlke!GcR(EU$U$eMzq9Xizvh;vPBZbYKIV{(DY-GOwzxKwjK6Nb#Ap%vQ?;e+`ftAio|Nczt$$?mT(~ zdN7jz{hJG)0ZxB^j$WeNEy7xX@i=<~>cE0N2=>}^1JOdT9gGZ|ygohkK8Estxcu?T zzlAt8khgaiyvamy!ho*8fNg;89E~ZAf4#n86mhKg=S!+( znwH88k*kn>e;p;IK=;zvRp{_HKW~4({Nv``pMC?e-k;wZnDi=S4q9vjwgY=1y6rIo z$A>P*W87R_UtIh33;XY(uuO}tfW<6h?{^`Ff#YN8_U`=dmb`LwboK7y&5>Wfxc?ps zlf3gS`eO3AT z-=9CQ*8sQ-1>(){h_vf*=Tj#Ls=&0>YB0 zfrl8zypLm0kQgQd446Zro$Vod2lxL(J|t(d2V!BI2*%u*%)n$TJCj4SeW)N!CCn$i9IQX)6gqro~e-Zva6M1VIo4L6Fpl=&w)dfd|y|0;``_5%_M#kNp4u002ovPDHLkV1k`3(&qpG delta 1787 zcmV0001>2m=5B0K5^G9{>OWJ5Wqi zMZmzo0ORBT0A@fyK#@%|2LAv6%m4t9fE6}-|1keBGXR5w0JP7U05e$sDgQ+&qyPXb zD>bF1rI`Q#nVFe@fPiLZfLU2_|Nj90|1&x|I+3{~16Ed6k=-5xkdTm(`(1y)z`(e; z0NSlbZ2$lO0d!JMQvg8b*k%9#0RehcSad{Xb7OL8aCB*JZU6vyoTZb^Y63A3$Ir=A z1iebBwg)f06s35muds}p=_WKE%Vgr>+Zz=GTi4Z=9Oi@nZ)TVwWA(oLSgqCKb0xP( z$;P1G)a%o;6rI&gmV+dGtq~T5H#z&o9?_g)8i_Y0Lwu8b=q^8;+e3!|gZGnJu`Wt^$^~2i`1^@sBBS}O-RCt{2nhRIrMihXfX(Sa) zr7cKRTA($HQKW9nNmXoWZm`bJG@ij$J)?`^(qs1Ldy`(IE3a_cpl9N4%GSO3H`Ez(pWwMj;jU`#mE#*kRV(Nbjn&4*NZ*w!fMFc1E zx0hu(znt&qOL>Z5GWlf^X5Z2j$t`g9AS%jN3dAi`Q=G|iI#5}Lf(q_b+Yg08bML4_&16|i*MvMz^_nPDM(TRmXLb}ibX4bt5~Gv zZ|AqcuT)woG4g-ODwg^$utr5n1CRJdj`$S{QUMwysJoDxznv$3rIJ))x1VIo4L6F5K6Z80v%5O98cvgL;3fcI^1+~1Z#yKviyP8^#aU5D`Wi`%mL6sza z2Xl@KDiG_qwzsEoTFg5xsQa19KCgrQN`@bgHh(s2>>z(YoUDNzA8}?MR-7|}uQ;#4 zy0*)G4)x>g4hH$m2EOt+epOAZ6;fW!L|K;R{hE=ZVeD&eGfuqN!_bd z_SAB<>i#c|gLo#hr!v<`g!R3Q`fOLz1_HeJ-~tGgi?Hf<>_4o7)cy` zoDux2F<$wMlb^NjK6?>(#rp&JsNZo5kRJ8Lz>t6X98bVs{V+QE^*K&)XIS5xG9H*w z{V$?;V21U(sN#VMr#=|6lmo2qAqavX2*T&v!+9I)@&r#>?Up4t@*4|Yo`RyCsSVjPXg1Ey zz_4L9oPt+ZSKpDNc>;z_IH`~P>c>OF%Sj_ILq?o8gCJ;{4RSaHJ6G4&9db0uCTYS+ zz3xNMZRBf)4ZT*=nS!te;n#%Vo9mmK{?UH~$jM0W`?t6L1$|-|tOwzdNp3J%h?e0< z@aj#c<2;6XKivIzAGTnZ%wU%;NbW8yKky`m<2C3K?9}hx{q*xMcfUS7+BZokXojvE z8eQ;(X+39PDUy3_+r{U}L32LDyh>h`(U$*I?{-aqMsLf(qg%iEnU|1Z7b-NqmU? dCP9#y@Gqh(Og^yk04)Fj002ovPDHLkV1h=@UT**Z