From b119b0e113886b7ca4a0317fbf5ef1e10b2c4736 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Thu, 17 Sep 2015 15:56:39 +0100 Subject: [PATCH 1/2] Added a self-repair module for cyborgs. --- code/game/machinery/rechargestation.dm | 2 ++ .../objects/items/robot/robot_upgrades.dm | 34 +++++++++++++++++- .../designs/mechfabricator_designs.dm | 10 ++++++ icons/obj/module.dmi | Bin 1350 -> 1406 bytes 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 48962ff51a7..9c069b9a75f 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -135,6 +135,8 @@ R.heal_organ_damage(repairs, repairs - 1) if(R.cell) R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge) + for(var/obj/item/borg/upgrade/U in occupant) + U.recharge_action(occupant) /obj/machinery/recharge_station/proc/restock_modules() if(occupant) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index e8e91caf7ac..9a0c1ea5f50 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -16,6 +16,7 @@ return 1 return 0 +/obj/item/borg/upgrade/proc/recharge_action(mob/living/silicon/robot/R) /obj/item/borg/upgrade/reset name = "cyborg module reset board" @@ -197,7 +198,7 @@ R.module.rebuild() return 1 -/obj/item/borg/upgrade/syndicate/ +/obj/item/borg/upgrade/syndicate name = "illegal equipment module" desc = "Unlocks the hidden, deadlier functions of a cyborg" icon_state = "cyborg_upgrade3" @@ -211,3 +212,34 @@ R.SetEmagged(1) return 1 + +/obj/item/borg/upgrade/selfrepair + name = "self-repair module" + desc = "This module will repair the cyborg when it is in a cyborg recharger." + icon_state = "cyborg_upgrade5" + require_module = 1 + var/repair_amount = -1 + var/repair_cooldown = 0 + var/msg_cooldown = 0 + +/obj/item/borg/upgrade/selfrepair/action(mob/living/silicon/robot/R) + if(..()) + return 0 + var/obj/item/borg/upgrade/selfrepair/U = locate() in R + if(U) + usr << "This unit is already equipped with a self-repair module." + return 0 + R << "Self-repair module detected. You will be repaired when inside an active recharge station." + return 1 + +/obj/item/borg/upgrade/selfrepair/recharge_action(mob/living/silicon/robot/R) + if(R.stat != DEAD) + if( (world.time - 10) > repair_cooldown ) + if(R.health < R.maxHealth) + R.adjustBruteLoss(repair_amount) + R.adjustFireLoss(repair_amount) + R.updatehealth() + repair_cooldown = world.time + if( (world.time - 500) > msg_cooldown ) + R << "You are being repaired." + msg_cooldown = world.time diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 6f349b66ad1..b480ed8ab8c 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -695,6 +695,16 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") +/datum/design/borg_upgrade_selfrepair + name = "Cyborg Upgrade (Self-repair)" + id = "borg_upgrade_selfrepair" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/selfrepair + req_tech = list("materials" = 4, "engineering" = 4) + materials = list(MAT_METAL=15000, MAT_GLASS=15000) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + //Misc /datum/design/mecha_tracking name = "Exosuit Tracking Beacon" diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index e7fc43e610945c8bc592b14dafa4637b8aab8883..e285e380d19e9c54a9af45a18897f26424c8c7d9 100644 GIT binary patch delta 1272 zcmVV=-0C=30)6I$kF$@6U^Ykf--o@Xe7g5B6zQT}c<4mw^B&{p^ z_7;VOJxHgwqwiDG@l9*o>s<{ey{KS8*a}aK$qyZV%^3G3`QIf_r^gyBG{C!y(4oTQKl=3{k z9ZTOn?!AD;O1`M{%Sykh^y{LJX!5S38PG!_Q}jRr4#cnWd`W{}h{V zeyR_b{re7HD`)DLlX-s~SO5S6%Sl8*RCt{2TZ?w0KnxWyk(Dx4u%(t&x7yeK{||0v z29!zyQtP^Bo7-dUF_YoWoj^?pqme?PP$+l=VRTjd-zP90140EvgyR8&?UP~tBl|g7 z0AfGxc!0Avz}gXiKsXV^0$6e>xBjvMS?Cl9GsfQzFckqOCbL4*qku`Q|E);CWEmPF zKyQKq=oX2{Npy+=-e25;oD=}sf-qa~3IN=>gB!yu06hx8#QMuYnA6f}3m{_&*jbH# zu>=6R3D9RrpTBCR^DbV=@2G<9O0N&r%LxSSV3E1O4)Zp^>k=Rg8ZfoK)2Rz>m1rcN$#hf05e))pM<1Lbkc93OrU22-pdv7&z1iDgvDf2=#$2x*yoGTY%sN zNTnEnovjbZTL6t3OJ{um*dmgTfz`~rb1_iY2Ye8=&w^eBdh&OxfHkIZ%2-?e&o6BS zItm;uwDW&=uv?z_W>I3^Th+g6Om*U~|fu_Xg6F3uevA8Y)g+ifF zC=`nCfbZA9pae#ZDh*$v`2u^Rhk_$er9HlfgBftB;>dQWn>bi|qlZFLAg+2i`0SPl ztfG}rL8+@WzKMgiH(D431q@Uz6x@JA4TDYJoqvA2-wUw1`}f}Zvj*fNqm;Twky9U1#UdL6?n6WEgu6`#2ws6(SqwA zs28wfFDZ*Bkpc$}5e!3x4K3;@vc`V~d*;?%1bQN)A(!pPdV1=~i_ zs`&R71+VRHNq9+U=v?m($J0gc&nNXniNrx~^=7eD&5LXrbFyBkW<-A)#`H^Kf`mDo z#bi6rcBUFj5_6?h%~inTFaEpULAX^(15!8g&M%ZINp%A~Q0O_YFH6HA2|I^Ue$TsS z8M?=P5U@Crw-fzpqF+z+o1%|s@~xv8(L*9r^gsd*#CPb>7qil`>W6%evOB)?>T>|ACu%pi~m5 zuVv3R*JJHzCUChkP;Ur>fkL5BD0oEiu-EwCComcTLI5Jd;eey#$#MAu`*(@}q<-At z02i-;jU)bmbnFmiO#KLG*pV)SUc4tgH%WQxC?RYYsOs9tgY)(P( z8~Wh3AC3@>p*OdK0|kV*&6gD@Vy8e{F!^?X2?U&&%n_On1x#l1Z$$#8D9{iA`VbUA zcaVsjL|;+B=ZjNNk^(?e5Epm60s!}J=f>~~K!*a5*nD{rmUQSe1yHaA>{g9`vjhOz z3DDoNu6z>%DFA;l7k7&!Ksv&!#v6zx_r1nxK*y!@%5jB4p-?Ck3Pt~D|JK_1o%R|8 zf-y?11v;O=(e(i$fDaGVkm&K^1nhpFDscXN;C*8>8_l8?1w4H&zk`5P;A!ab%vmQQ zfO#&IC+hV9oD(qmc_aa+z;H2KEFK@9S?lDCI|Kz9Q?P%p56oYd%a{3~IdvTOlgw5~ z%n=GS2#kJJ^?~{F^>sOC6!>KDc?F&W1Oj#g(i+&;2Lgds1%&#*3f&7<>=Yn)0di># zz}nUa98AR{+{7doi^?|y?=My*+bg}4{fI^{AC=?3C zcfj{+U{C^sT9t+`(Oe*2>!IKX1l!|#IG6$ZDvlh7s)>V**Lo-<1=7&N!Mj@`uoy0c z3QAR_@l70Tyw<`XC}1G8P;dkGH4N6iyZj774+Vc4ueC5p3REo=!V$tsE@15PK~$jD z!XPN%7mzWM0jQRy-Q6Mg_(?RAz!?g(`2T(HL6^0^2%7$Vck{k4Yv22S eLxn=|zv2%mnL(~ImrKb20000 Date: Thu, 17 Sep 2015 15:56:39 +0100 Subject: [PATCH 2/2] Added a self-repair module for cyborgs. empty line Changelog Changed the module to heal more when cyborg is in critical. --- code/game/machinery/rechargestation.dm | 2 - .../objects/items/robot/robot_upgrades.dm | 79 ++++++++++++++---- html/changelogs/xxalpha-nanites.yml | 6 ++ icons/obj/module.dmi | Bin 1406 -> 4088 bytes 4 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 html/changelogs/xxalpha-nanites.yml diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 9c069b9a75f..48962ff51a7 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -135,8 +135,6 @@ R.heal_organ_damage(repairs, repairs - 1) if(R.cell) R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge) - for(var/obj/item/borg/upgrade/U in occupant) - U.recharge_action(occupant) /obj/machinery/recharge_station/proc/restock_modules() if(occupant) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 9a0c1ea5f50..66cbfef59cb 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -16,8 +16,6 @@ return 1 return 0 -/obj/item/borg/upgrade/proc/recharge_action(mob/living/silicon/robot/R) - /obj/item/borg/upgrade/reset name = "cyborg module reset board" desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the cyborg." @@ -215,12 +213,15 @@ /obj/item/borg/upgrade/selfrepair name = "self-repair module" - desc = "This module will repair the cyborg when it is in a cyborg recharger." + desc = "This module will repair the cyborg over time." icon_state = "cyborg_upgrade5" require_module = 1 var/repair_amount = -1 - var/repair_cooldown = 0 + var/repair_tick = 1 var/msg_cooldown = 0 + var/on = 0 + var/powercost = 10 + var/mob/living/silicon/robot/cyborg /obj/item/borg/upgrade/selfrepair/action(mob/living/silicon/robot/R) if(..()) @@ -229,17 +230,65 @@ if(U) usr << "This unit is already equipped with a self-repair module." return 0 - R << "Self-repair module detected. You will be repaired when inside an active recharge station." + cyborg = R + icon_state = "selfrepair_off" + action_button_name = "Toggle Self-Repair" return 1 -/obj/item/borg/upgrade/selfrepair/recharge_action(mob/living/silicon/robot/R) - if(R.stat != DEAD) - if( (world.time - 10) > repair_cooldown ) - if(R.health < R.maxHealth) - R.adjustBruteLoss(repair_amount) - R.adjustFireLoss(repair_amount) - R.updatehealth() - repair_cooldown = world.time - if( (world.time - 500) > msg_cooldown ) - R << "You are being repaired." +/obj/item/borg/upgrade/selfrepair/ui_action_click() + on = !on + if(on) + cyborg << "You activate the self-repair module." + SSobj.processing |= src + else + cyborg << "You deactivate the self-repair module." + SSobj.processing -= src + update_icon() + +/obj/item/borg/upgrade/selfrepair/update_icon() + if(cyborg) + icon_state = "selfrepair_[on ? "on" : "off"]" + else + icon_state = "cyborg_upgrade5" + +/obj/item/borg/upgrade/selfrepair/proc/deactivate() + SSobj.processing -= src + on = 0 + update_icon() + +/obj/item/borg/upgrade/selfrepair/process() + if(!repair_tick) + repair_tick = 1 + return + + if( cyborg && (cyborg.stat != DEAD) && on) + if(cyborg.cell.charge < powercost*2) + cyborg << "Self-repair module deactivated. Please recharge." + deactivate() + return + + if(cyborg.health < cyborg.maxHealth) + if(cyborg.health < 0) + repair_amount = -2.5 + powercost = 30 + else + repair_amount = -1 + powercost = 10 + cyborg.adjustBruteLoss(repair_amount) + cyborg.adjustFireLoss(repair_amount) + cyborg.updatehealth() + cyborg.cell.use(powercost) + else + cyborg.cell.use(5) + repair_tick = 0 + + if( (world.time - 2000) > msg_cooldown ) + var/msgmode = "standby" + if(cyborg.health < 0) + msgmode = "critical" + else if(cyborg.health < cyborg.maxHealth) + msgmode = "normal" + cyborg << "Self-repair is active in [msgmode] mode." msg_cooldown = world.time + else + deactivate() diff --git a/html/changelogs/xxalpha-nanites.yml b/html/changelogs/xxalpha-nanites.yml new file mode 100644 index 00000000000..478a2163140 --- /dev/null +++ b/html/changelogs/xxalpha-nanites.yml @@ -0,0 +1,6 @@ +author: xxalpha + +delete-after: True + +changes: + - rscadd: "Added a researchable cyborg self-repair module to the robotics fabricator." \ No newline at end of file diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index e285e380d19e9c54a9af45a18897f26424c8c7d9..fb68f0bcc653ae3132a4c2db12cae72871804d06 100644 GIT binary patch literal 4088 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 B)Z+jE literal 1406 zcmV-^1%djBP)C0001fP)t-sz`(#p zMn*9)F&rEm|I7dYW&i+60L%aYnPvb0GnsI3Z~y=RW@Z30GXND875|w4($dmYR8$8C z2bll>005b`wziownW(6!Dk>`GxBw0g4nROa07`%E?(TqqfS{nD|JVROWPi+=0RL(L z{{R4R78aqQp|uwm024{jBqXmMYt{e&00DGTPE!Ct=GbNc007r|R9JLGWpiV4X>fFD zZ*Bkpc$}5f&58ms3;^Ks^eKwo#owbBQN)A3!jNg>Ot5VvttqK|0uuA>>yLn2f3KmrcLx9HI1odz4qhu~>X(yw z9asPW1ItN7K~#90?OTg>qCgB4Fp-rqRj{R&RkzyL{{IhdW(Jf>0#fU`XPet&?J<+# z&YeI_2&0igp-?Dz1YvYl``;%p9s@!JM1xBjvMS?Cl9GsfQzFckqOCbL4*qku`Q|E);CWEmPFKyQKq=oX2{Npy+=-e25; zoD=}sf-qa~3IN=>gB!yu06hx8#QMuYnA6f}3m{_&*jbH#u>=6R3D9RrpT7x#6o8Pk zyCA6`t?;7u7J}K`RqZsO=TdrMyF#H*C=?2X;`-?R*4q1>_7ViD#3;5Y(D?)g*9V9I z-rv_lg5t{w*yBFb;PUs8&l`i~co}pk;OTSzJp`-*50S?smpTyvOjDse(X0<(Nx}GYRo4f~&C}DS zWEA+2;PVPRRuBl-38WY})CVd8oeBu`fi1cp*s@!I-~~vf7=WFv56D{pjT%d5eE`@Z zl8=Ga%)4_jP}c{15Vp^PUIlvccdLLkrg6$xTmH{4Z3Q|C94)l-cd%PP^QXWOX!$>L z3hXK3C+Y+HGl*W{`IqA1^?|0u=My*+bg{TD0fj=LP$(3N?||>uz@P+1jVcXaqWJ=Q zqlbbcP^CS-hl3e#sN%?WsGB%gd!vU!QXsB+IQZG4Gf*vvNu6JsoI z0aOo3e3rnrE59cNZalgbc(aKu9|Kmz9o$FJg6kis7qEk!WwGS8AhkDd(;fxj%?JvR zbw&z>5f(Fc605*&GMVIDeZV(J^u~aDNJ1b$YbZ*OLaYx=@_h2b)dy&DcNTP=hIJEz zumv=IS*+*fd|j}&_niXy3juMtWu6ak*8!ZKaOeH~J^bDN_!I@?`hX3v#R9pR^OvOdpXndC_J2c#Lh--i57XjC$#;p&{Qv*} M07*qoM6N<$f&iL-6aWAK