From 82791a04ef5c697f5b05658962ee6f33af9bb732 Mon Sep 17 00:00:00 2001 From: Holdelta Date: Tue, 12 May 2020 00:43:22 -0700 Subject: [PATCH 1/3] RMS RMS --- code/game/machinery/vending_vr.dm | 1 + code/game/objects/items/weapons/RMS_vr.dm | 231 ++++++++++++++++++ .../silicon/robot/robot_modules/station_vr.dm | 1 + icons/mob/items/lefthand_vr.dmi | Bin 2549 -> 2649 bytes icons/mob/items/righthand_vr.dmi | Bin 2412 -> 2511 bytes icons/obj/tools_vr.dmi | Bin 15256 -> 16053 bytes vorestation.dme | 1 + 7 files changed, 234 insertions(+) create mode 100644 code/game/objects/items/weapons/RMS_vr.dm diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm index 83db8f713e5..e0b92809020 100644 --- a/code/game/machinery/vending_vr.dm +++ b/code/game/machinery/vending_vr.dm @@ -15,6 +15,7 @@ /obj/machinery/vending/engivend/New() products += list(/obj/item/clothing/glasses/omnihud/eng = 6) + contraband += list(/obj/item/weapon/rms = 5) ..() /obj/machinery/vending/medical/New() diff --git a/code/game/objects/items/weapons/RMS_vr.dm b/code/game/objects/items/weapons/RMS_vr.dm new file mode 100644 index 00000000000..82a8876cd27 --- /dev/null +++ b/code/game/objects/items/weapons/RMS_vr.dm @@ -0,0 +1,231 @@ +#define RMS_STEEL "Steel" +#define RMS_GLASS "Glass" +#define RMS_BATT "Battery" +#define RMS_RAND "Random Material" + +/obj/item/weapon/rms + name = "Rapid Material Synthesizer" + desc = "A tool that converts battery charge to materials." + icon = 'icons/obj/tools_vr.dmi' + icon_state = "rms" + item_state = "rms" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi', + ) + force = 7 + throwforce = 10 + throw_speed = 1 + throw_range = 5 + w_class = ITEMSIZE_NORMAL + origin_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 3) + matter = list(DEFAULT_WALL_MATERIAL = 5000) + preserve_item = FALSE + + var/mode_index = 1 //start at steel creation + var/list/modes = list(RMS_STEEL, RMS_GLASS, RMS_BATT, RMS_RAND) + var/stored_charge = 0 + var/max_charge = 1000000 //large storage, equivalent to 50 steel sheets + var/charge_cost = 20000 + var/charge_cost_r = 50000 + var/charge_cost_m = 100000 + var/charge_stage = 0 + var/emagged = 0 + var/datum/effect/effect/system/spark_spread/spark_system + +/obj/item/weapon/rms/Initialize() + . = ..() + src.spark_system = new /datum/effect/effect/system/spark_spread + spark_system.set_up(5, 0, src) + spark_system.attach(src) + update_icon() + +/obj/item/weapon/pipe_dispenser/Destroy() + qdel_null(spark_system) + return ..() + +/obj/item/weapon/rms/update_icon() + charge_stage = round((stored_charge/max_charge)*4) + if(charge_stage >= 4) + charge_stage = 4 + add_overlay("rms_charge[charge_stage]") + +/obj/item/weapon/rms/examine(mob/user) + . = ..() + . += display_resources() + +/obj/item/weapon/rms/proc/display_resources() + return "It currently holds [round(stored_charge/1000)]/[max_charge/1000] kW charge." + +/obj/item/weapon/rms/proc/drain_battery(user, battery) + var/obj/item/weapon/cell.C = battery + if(stored_charge == max_charge) + to_chat(user, "The Rapid Material Synthesizer is full on charge!.") + update_icon() + return + if(C.charge == 0) + to_chat(user, "The battery has no charge.") + update_icon() + return + else + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + if(do_after(user, 2,target = C)) + stored_charge += C.charge + C.charge = 0 + C.update_icon() + to_chat(user, "You drain [C].") + if(stored_charge > max_charge) + stored_charge = max_charge + update_icon() + return + +/obj/item/weapon/rms/proc/consume_resources(amount) + stored_charge -= amount + update_icon() + return + + +/obj/item/weapon/rms/proc/can_afford(amount) + if(mode_index != modes.len) + if(stored_charge >= charge_cost) + return TRUE + else + return FALSE + else + if(stored_charge >= charge_cost_r) + return TRUE + else + return FALSE + +/obj/item/weapon/rms/proc/use_rms(atom/A, mob/living/user) + var/obj/product + if(!can_afford()) + to_chat(user, "There is not enough charge to use this mode.") + return + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + if(do_after(user, 5, target = A)) + switch(mode_index) + if(1) + if(charge_stage >= 4) + product = new /obj/item/stack/material/plasteel // can only create one sheet at max charge, and uses five times more charge + consume_resources(charge_cost_m) + spark_system.start() + else + product = new /obj/item/stack/material/steel + consume_resources(charge_cost) + if(2) + if(charge_stage >= 4) + product= new /obj/item/stack/material/glass/phoronglass // can only create one sheet at max charge, and uses five times more charge + consume_resources(charge_cost_m) + spark_system.start() + else + product = new /obj/item/stack/material/glass + consume_resources(charge_cost) + if(3) + switch(charge_stage) + if(4) + product = pick(50; new /obj/item/weapon/cell/secborg/empty, + 20; new /obj/item/weapon/cell/high/empty, + 15; new /obj/item/weapon/cell/super/empty, + 10; new /obj/item/weapon/cell/hyper/empty, + 4; new /obj/item/device/fbp_backup_cell, + 100; new /obj/item/weapon/cell/infinite) + if(3) + product = pick(50; new /obj/item/weapon/cell/secborg/empty, + 20; new /obj/item/weapon/cell/high/empty, + 15; new /obj/item/weapon/cell/super/empty, + 10; new /obj/item/weapon/cell/hyper/empty, + 5; new /obj/item/device/fbp_backup_cell) + if(2) + product = pick(50; new /obj/item/weapon/cell/secborg/empty, + 20; new /obj/item/weapon/cell/high/empty, + 20; new /obj/item/weapon/cell/super/empty, + 5; new /obj/item/weapon/cell/hyper/empty, + 5; new /obj/item/device/fbp_backup_cell) + if(1) + product = pick(50; new /obj/item/weapon/cell/secborg/empty, + 25; new /obj/item/weapon/cell/high/empty, + 20; new /obj/item/weapon/cell/super/empty, + 5; new /obj/item/device/fbp_backup_cell) + if(0) + product = pick(50; new /obj/item/weapon/cell/secborg/empty, + 30; new /obj/item/weapon/cell/high/empty, + 15; new /obj/item/weapon/cell/super/empty, + 5; new /obj/item/device/fbp_backup_cell) + if(istype(product,/obj/item/weapon/cell/infinite)) + consume_resources(max_charge) + spark_system.start() + else + consume_resources(charge_cost) + if(4) + if(!emagged) + product = pick(30;new /obj/item/stack/material/steel, + 20;new /obj/item/stack/material/glass, + 10;new /obj/item/stack/cable_coil/random, + 10;new /obj/item/stack/material/plastic, + 10;new /obj/item/stack/material/wood, + 10;new /obj/item/stack/material/wood/sif, + 10;new /obj/item/stack/material/log, + 10;new /obj/item/stack/material/log/sif, + 10;new /obj/item/stack/material/cloth, + 10;new /obj/item/stack/material/cardboard, + 10;new /obj/item/trash/rkibble) + consume_resources(charge_cost_r) + spark_system.start() + else + product = pick(10;new /obj/item/stack/cable_coil/random, + 10;new /obj/item/stack/material/plastic, + 10;new /obj/item/stack/material/wood, + 10;new /obj/item/stack/material/wood/sif, + 10;new /obj/item/stack/material/log, + 10;new /obj/item/stack/material/log/sif, + 10;new /obj/item/stack/material/cloth, + 10;new /obj/item/stack/material/cardboard, + 10;new /obj/item/trash/rkibble, + 10;new /obj/item/weapon/reagent_containers/spray/waterflower, + 10;new /obj/item/weapon/bikehorn, + 10;new /obj/item/weapon/storage/backpack/clown, + 10;new /obj/item/clothing/under/rank/clown, + 10;new /obj/item/clothing/shoes/clown_shoes, + 10;new /obj/item/clothing/mask/gas/clown_hat, + 1;new /mob/living/simple_mob/vore/catgirl) + consume_resources(charge_cost) + spark_system.start() + product.loc = get_turf(A) + +//Start of attack functions + +/obj/item/weapon/rms/afterattack(atom/target, mob/user, proximity) + if(!proximity) + return + if(istype(target, /obj/item/weapon/cell)) //Check for a battery on-click + drain_battery(user, target) + return + if(istype(target, /turf/simulated)) // Check for a proper area on-click to spawn items + use_rms(target, user) + return + else + to_chat(user, "Invalid target for the device.") + return + +/obj/item/weapon/rms/attack_self(mob/user) + if(mode_index >= modes.len) + mode_index = 1 + else + mode_index++ + + to_chat(user, span("notice", "Changed mode to '[modes[mode_index]]'.")) + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) + return ..() + +/obj/item/weapon/rms/emag_act(var/remaining_charges, var/mob/user) + emagged = !emagged + playsound(src.loc, "sparks", 100, 1) + return 1 + + + +#undef RMS_STEEL +#undef RMS_GLASS +#undef RMS_BATT +#undef RMS_RAND \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index a46b71306ee..8f8d1db31d1 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -509,6 +509,7 @@ src.modules += new /obj/item/weapon/gripper/circuit(src) src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) + src.modules += new /obj/item/weapon/rms(src) src.emag = new /obj/item/weapon/dogborg/pounce(src) //Painfully slow charger regen but high capacity. Also starts with low amount. diff --git a/icons/mob/items/lefthand_vr.dmi b/icons/mob/items/lefthand_vr.dmi index 39a6e5bdbdde517b60e068d07712602f3be830be..f96555c99bf2a8e3ad1d867cc7991667b1b7951f 100644 GIT binary patch delta 2170 zcmY*bdpHvc8{bTmB-!Rvgw1us=_oYDT!!2wQaU0m%Pp6M(Pl#_moQ7ZxL?xEQ5-d8 zu8ku1TN0bgETx7d_w94O^F8PLzUO(L_j%sm`_KFSe!us5-eu?q7+no`rb-@$(1YUJ_G;&z(`kT zH-I^Rgs@%I-b@2Np;=z5n!Js&9(SKVO$M@-YbaUQJ|zPH5?}1BEKbJceaqeQgq(rB zL0Czn`a9uiM<^e7e4JkIY~3X#d< zQ+npcCS%K&*Y=8A{1s)gjfJAM+bOjBN<+sRY%eqOt7t!0)d;^n-a28QMXSGYO|W`W zrPqCVVWUors2Wb-2HZ+ju4t8sHZ^@Y${iZ=aw@7ztHBX3KNlEPxL#5NUTH1}+AQ#K zF{M7MU$s)}9U6B~+!S&`tHp?2#@`BFBcI!-Q5S+9%9}+RAQc;jvDZ(8W(I7KpDaK^x6AP&LFF1iT~ zzpyH(pPZZ|ljg@|&mNf6hl|O;GHZh3&6CmUvpn%J#0*z;Sw>2sDO-1cii3D6`W&%% zZFXJ3Z2H|OTU%JMlY0?1rbZ})6>vKryH4tpTOHd z2(i>))bYE{q|;}dqw@h4%Ij)7VrL@!ZR^a6%`3g$PTpXd0H(i`3}}eCyuMqnuayUj zlq`R6;Se4~_{8TEEKYlOuYZ$UZIwxkr4e^`&N<_>Ye5T_CaM#Siv$Pnsr!G znsR$Ra07{}YU$PuAjb>DAcBQPUapPXPb}|MR)FQKO1v5)U44J%zV!31DoHTfqVu1G z$DoKpFAv7fwpVDZ<*br9j6vu)gS)3zV1E~)Sj2gEV`w;`mT4dwK8g0R>-D)3*>s}i zh|`#({n(Dd4N1ILPGHl3nOEC=xflviTLtx+`9)_^(uv|e1=n}G=4*oQ)WrDBt}&|z zM}SGoX@}((@_As2A+OAeo4$$bHJlT@4JzI zivk@%;~Yq<|JaOqTB}e**x`doSNGsu>d3AIC9lk(LqJWKQFN1g;xhla`WlrpgcB;y=;2dk&UhoqzNl*xF}tmu(<6 zx2sZ0$2$R8PZkNcj1yY5;WYJe>5-AKv9Y}#EHT%P2nD(uqv>+A!$|x=CNO9!EF=^t zzkqm?2V|G40Y~E-*^77e%-tz2Aj->&1kj5i_DWnQK_o?-MIQ|Dlj4#F+3Bkx%Y%cc$B-A{kaeLhP&=fR$ z1@Xq&yiaPK^-?`AUaab&_14aTMe!Wef+aL?HmO+om=g+bB%EyC3ZxR zjiXZc=Hn*oKK`h80kr+YHuq0-6z3j|-M0m{l z*208M3M{Htv}9&3&Lk-sDWW{7JG6SFklTwgO{%{x_j^T(8zjjN67qThWFl=4t0 zuV2>ag?6i9c*vo73(#_SxqR(~~!*B=0f5N}gSc_AvQ8t9Fd~tj!kW$GaWe`GlmHiIKO1L5C=Kp5{%` oJfyi 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 delta 1952 zcmYjRc|6ql8=o=K%C)lEGC6W35lOCbObj)yagQ@c3FTUA+3+amD~;+A+3R-f{UNsq_`$LR&LJOWPu5DqZB^~LGFeAb!E1!H@B}BO4E&~)xFoUL zrr)NN%1!UFsoMo$ZH&NSW+?Z57*fxCJ`Nd*9I}wZG(C-hb4=i$%_`tIz#W3P+B7fg zv9x0+&VZKOAF4|H5=aygrxMXFoe_eJ{S^&RnkaII%&UF&%h&}+E8~N*{@3cAZO2Wj z1ub%BGnfEW9cFlCu9+^F-Hv)c-I0-leSLuuF3dIZO${=*lN7$s4Bp5Q8$24KVggq7 zBsnSmqlw@FzB^n)>{A>oT`?$rq|R1lgxY&e&ZU5a<9a0*>491c*HBd>&vH>pS3?-SI7Wun6lKgu)7N2D#xFc^$?K9?k%mRG`5!62g}|n0q7tCW+ceeB|U_ z98LQot+3mnsk;DjYM_4ByAbyF_N&Rs$yeLk>^;nOBh^gm4DFqcmKLzn+Cq*Ng)14G zn#V6cynQk;_nhR4o}xZsdiBJYGq7EGd|eutk%(D6X8DUSsB7gs^0iHyRg?d|U?d3s zTIE`j#!&PIz49yk+w4vlslDd8_u28I;?^lEG`ZzitZq8H8~Gb~p5FFU+|GeIHoKS7 zaRb4TwO87RHqHk&#`Vg092e~;jG7VQq~AWD=sGX6l@eJn2a(s%$a=zm6j;Q+n*yi% z)t8N@r&M{m;SN+Dlu!6+08hnORsz92U>N!K=em0%o%>=)FcR&o+Z{<$i9-C4yBB!n zI74wn7_oihbEIFiO25}aWDzFoN124Yx1VmQ6>E=pcsvI_!No3arRlTLa!#70({$l< zcFbeXN!ekKVUOa_g-nMWM38lrrzcJNcniL;K7%e?V}|Yi<{6;mE5vqg!QCZ5)pL?P zH8wR&4cil}l)L27RZb=DLwKHyEX!v)>v(~!~Kw9a9<9ob|b8Q%3oGubhsZrhj$)K5gHsCfQ)ZinAO!4@W zL~C&1EZ)b1^EfFCl1wphD|+hhEFfN@kln-;ONhPSa-7)@E0!FMO4?BCV)*SytZAY| zR#O%JLw3Nf9XF@z({%O}>qOC|w+3M|5#=t@`T)K^Z)vcfvavGWxuEaUgg(WI>{_SM zvIB%>!EI|ayTGa2fE-|uKcFX&0HEd4g8QWvxjN_ct#4^bCjeS*boX3 z4xq+bryb?~v#P+wznFMtm)ZBkEXjVHxBcnu&#AE3hET%rbN|k?p^-m`*2#_9C*<#O zB?kV*Ak3Clo>ADsi#UBKkGE^}pcztJ&EL(_J0#UhD7<+tN^y3hPt?fBNVgbLU~UYR zpQS9xYy%q;`#E#;UM%t)Zw8B}c$4qHJq_%``Tzfi`o0)fY{*-KwYlUXVLg!%J>Rx| zm}=M+HO098NVz=EF-$$CmQ*DBhJe)8Zk9ciy`JE~-`eo$^*ggit656kF81o>j*7%A zg*5(-LvRz}rB_MsdD}YFN(?YP%R`uM$5oPIvm0TZ=-8ky%EsnA=TAk3YilDD^`vs% z)U4+zrM#ODiKSCX9p{HS&VnYkSofVTgISSCE$Nd(#5UJoxl!*eK4`M4iW~iw!Ub71 zS{TRJq1;->^7&;G+&lxrTHcK9LMfXZru%BDc;7=OUT?Da`UaotfpRN5RcE{vUcs?E z^}1~xUxm`IG(=JdQ^dlR%g?8}y17R{FJ#?37kpX0yUJtGS{iDVbyHWtF)q-jB;@mW Z!ww9Qn6DW`^}y{4g|>D?)ma8){12QZx|09^ diff --git a/icons/obj/tools_vr.dmi b/icons/obj/tools_vr.dmi index 53cf6041567bb5e8c33e91a2d02e49c4a3a58074..09ea41426af705c0888ab767098e44977fa67719 100644 GIT binary patch literal 16053 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 literal 15256 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 xljDg+mc*xCDNBTXgEqQL()?= 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 Date: Tue, 12 May 2020 01:00:45 -0700 Subject: [PATCH 2/3] Small update - changing debug probability --- code/game/objects/items/weapons/RMS_vr.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/RMS_vr.dm b/code/game/objects/items/weapons/RMS_vr.dm index 82a8876cd27..e201b5a79b7 100644 --- a/code/game/objects/items/weapons/RMS_vr.dm +++ b/code/game/objects/items/weapons/RMS_vr.dm @@ -129,7 +129,7 @@ 15; new /obj/item/weapon/cell/super/empty, 10; new /obj/item/weapon/cell/hyper/empty, 4; new /obj/item/device/fbp_backup_cell, - 100; new /obj/item/weapon/cell/infinite) + 1; new /obj/item/weapon/cell/infinite) if(3) product = pick(50; new /obj/item/weapon/cell/secborg/empty, 20; new /obj/item/weapon/cell/high/empty, @@ -228,4 +228,4 @@ #undef RMS_STEEL #undef RMS_GLASS #undef RMS_BATT -#undef RMS_RAND \ No newline at end of file +#undef RMS_RAND From 4b08adaf23e37b68f19220d453bccd39f598c5de Mon Sep 17 00:00:00 2001 From: Holdelta Date: Fri, 15 May 2020 01:38:48 -0700 Subject: [PATCH 3/3] First rework of the RMS. Removing battery function, adding more reliable material production and putting in an "Overcharge" feature. --- code/game/objects/items/weapons/RMS_vr.dm | 230 +++++++++++++--------- icons/mob/radial_vr.dmi | Bin 456 -> 3916 bytes 2 files changed, 132 insertions(+), 98 deletions(-) diff --git a/code/game/objects/items/weapons/RMS_vr.dm b/code/game/objects/items/weapons/RMS_vr.dm index 82a8876cd27..9dbdce39b23 100644 --- a/code/game/objects/items/weapons/RMS_vr.dm +++ b/code/game/objects/items/weapons/RMS_vr.dm @@ -1,7 +1,9 @@ -#define RMS_STEEL "Steel" -#define RMS_GLASS "Glass" -#define RMS_BATT "Battery" -#define RMS_RAND "Random Material" +#define RMS_STEEL 1 +#define RMS_GLASS 2 +#define RMS_CLOTH 3 +#define RMS_PLASTIC 4 +#define RMS_STONE 5 +#define RMS_RAND 6 /obj/item/weapon/rms name = "Rapid Material Synthesizer" @@ -22,23 +24,32 @@ matter = list(DEFAULT_WALL_MATERIAL = 5000) preserve_item = FALSE - var/mode_index = 1 //start at steel creation - var/list/modes = list(RMS_STEEL, RMS_GLASS, RMS_BATT, RMS_RAND) + var/mode_index = RMS_STEEL //start at steel creation + var/list/modes = list(RMS_STEEL, RMS_GLASS, RMS_CLOTH, RMS_PLASTIC, RMS_STONE, RMS_RAND) var/stored_charge = 0 var/max_charge = 1000000 //large storage, equivalent to 50 steel sheets var/charge_cost = 20000 - var/charge_cost_r = 50000 - var/charge_cost_m = 100000 + var/charge_cost_o = 50000 + var/charge_cost_r = 100000 var/charge_stage = 0 + var/overcharge = 0 var/emagged = 0 var/datum/effect/effect/system/spark_spread/spark_system + var/static/image/radial_image_steel = image(icon = 'icons/mob/radial_vr.dmi', icon_state = "sheet-metal") + var/static/image/radial_image_glass = image(icon= 'icons/mob/radial_vr.dmi', icon_state = "sheet-glass") + var/static/image/radial_image_cloth = image(icon = 'icons/mob/radial_vr.dmi', icon_state = "sheet-cloth") + var/static/image/radial_image_plastic = image(icon = 'icons/mob/radial_vr.dmi', icon_state = "sheet-plastic") + var/static/image/radial_image_stone = image(icon = 'icons/mob/radial_vr.dmi', icon_state = "sheet-sandstone") + var/static/image/radial_image_random = image(icon = 'icons/mob/radial_vr.dmi', icon_state = "sheet-random") + + /obj/item/weapon/rms/Initialize() . = ..() src.spark_system = new /datum/effect/effect/system/spark_spread spark_system.set_up(5, 0, src) spark_system.attach(src) - update_icon() + add_overlay("rms_charge[charge_stage]") /obj/item/weapon/pipe_dispenser/Destroy() qdel_null(spark_system) @@ -48,6 +59,7 @@ charge_stage = round((stored_charge/max_charge)*4) if(charge_stage >= 4) charge_stage = 4 + cut_overlays() add_overlay("rms_charge[charge_stage]") /obj/item/weapon/rms/examine(mob/user) @@ -58,15 +70,11 @@ return "It currently holds [round(stored_charge/1000)]/[max_charge/1000] kW charge." /obj/item/weapon/rms/proc/drain_battery(user, battery) - var/obj/item/weapon/cell.C = battery + var/obj/item/weapon/cell/C = battery if(stored_charge == max_charge) to_chat(user, "The Rapid Material Synthesizer is full on charge!.") - update_icon() - return if(C.charge == 0) to_chat(user, "The battery has no charge.") - update_icon() - return else playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 2,target = C)) @@ -74,10 +82,8 @@ C.charge = 0 C.update_icon() to_chat(user, "You drain [C].") - if(stored_charge > max_charge) - stored_charge = max_charge - update_icon() - return + stored_charge = CLAMP(stored_charge, 0, max_charge) + update_icon() /obj/item/weapon/rms/proc/consume_resources(amount) stored_charge -= amount @@ -86,113 +92,108 @@ /obj/item/weapon/rms/proc/can_afford(amount) - if(mode_index != modes.len) - if(stored_charge >= charge_cost) - return TRUE - else - return FALSE + if(stored_charge < amount) + return FALSE else - if(stored_charge >= charge_cost_r) - return TRUE - else - return FALSE + return TRUE /obj/item/weapon/rms/proc/use_rms(atom/A, mob/living/user) var/obj/product - if(!can_afford()) - to_chat(user, "There is not enough charge to use this mode.") - return + if(!overcharge) + if(!can_afford(charge_cost)) + to_chat(user, "There is not enough charge to use this mode.") + return + else + consume_resources(charge_cost) + else + if(!can_afford(charge_cost_o)) + to_chat(user, "There is not enough charge to use the overcharged mode.") + return + else + consume_resources(charge_cost_o) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 5, target = A)) switch(mode_index) - if(1) - if(charge_stage >= 4) + if(RMS_STEEL) + if(overcharge) product = new /obj/item/stack/material/plasteel // can only create one sheet at max charge, and uses five times more charge - consume_resources(charge_cost_m) spark_system.start() else product = new /obj/item/stack/material/steel - consume_resources(charge_cost) - if(2) - if(charge_stage >= 4) + if(RMS_GLASS) + if(overcharge) product= new /obj/item/stack/material/glass/phoronglass // can only create one sheet at max charge, and uses five times more charge - consume_resources(charge_cost_m) spark_system.start() else product = new /obj/item/stack/material/glass - consume_resources(charge_cost) - if(3) - switch(charge_stage) - if(4) - product = pick(50; new /obj/item/weapon/cell/secborg/empty, - 20; new /obj/item/weapon/cell/high/empty, - 15; new /obj/item/weapon/cell/super/empty, - 10; new /obj/item/weapon/cell/hyper/empty, - 4; new /obj/item/device/fbp_backup_cell, - 100; new /obj/item/weapon/cell/infinite) - if(3) - product = pick(50; new /obj/item/weapon/cell/secborg/empty, - 20; new /obj/item/weapon/cell/high/empty, - 15; new /obj/item/weapon/cell/super/empty, - 10; new /obj/item/weapon/cell/hyper/empty, - 5; new /obj/item/device/fbp_backup_cell) - if(2) - product = pick(50; new /obj/item/weapon/cell/secborg/empty, - 20; new /obj/item/weapon/cell/high/empty, - 20; new /obj/item/weapon/cell/super/empty, - 5; new /obj/item/weapon/cell/hyper/empty, - 5; new /obj/item/device/fbp_backup_cell) - if(1) - product = pick(50; new /obj/item/weapon/cell/secborg/empty, - 25; new /obj/item/weapon/cell/high/empty, - 20; new /obj/item/weapon/cell/super/empty, - 5; new /obj/item/device/fbp_backup_cell) - if(0) - product = pick(50; new /obj/item/weapon/cell/secborg/empty, - 30; new /obj/item/weapon/cell/high/empty, - 15; new /obj/item/weapon/cell/super/empty, - 5; new /obj/item/device/fbp_backup_cell) - if(istype(product,/obj/item/weapon/cell/infinite)) - consume_resources(max_charge) + if(RMS_CLOTH) + if(overcharge) + product= new /obj/item/stack/material/leather // can only create one sheet at max charge, and uses five times more charge spark_system.start() else - consume_resources(charge_cost) - if(4) - if(!emagged) - product = pick(30;new /obj/item/stack/material/steel, - 20;new /obj/item/stack/material/glass, + product = new /obj/item/stack/material/cloth + if(RMS_PLASTIC) + if(overcharge) + product= new /obj/item/stack/material/cardboard // can only create one sheet at max charge, and uses five times more charge + spark_system.start() + else + product = new /obj/item/stack/material/plastic + if(RMS_STONE) + if(overcharge) + product= new /obj/item/stack/material/marble // can only create one sheet at max charge, and uses five times more charge + spark_system.start() + else + product = new /obj/item/stack/material/sandstone + if(RMS_RAND) + if(!overcharge && !emagged) + product = pick(10;new /obj/item/trash/material/metal, + 10;new /obj/item/weapon/material/shard, 10;new /obj/item/stack/cable_coil/random, - 10;new /obj/item/stack/material/plastic, 10;new /obj/item/stack/material/wood, 10;new /obj/item/stack/material/wood/sif, - 10;new /obj/item/stack/material/log, - 10;new /obj/item/stack/material/log/sif, - 10;new /obj/item/stack/material/cloth, - 10;new /obj/item/stack/material/cardboard, - 10;new /obj/item/trash/rkibble) - consume_resources(charge_cost_r) + 10;new /obj/item/stack/material/snow) + if(overcharge && !emagged) + product = pick(1;new /obj/item/stack/rods, + 5;new /obj/item/device/fbp_backup_cell, + 5;new /obj/item/trash/rkibble, + 10;new /obj/item/stack/tile/grass, + 10;new /obj/item/stack/tile/carpet) spark_system.start() - else - product = pick(10;new /obj/item/stack/cable_coil/random, - 10;new /obj/item/stack/material/plastic, + if(!overcharge && emagged) + product = pick(10;new /obj/item/trash/material/metal, + 10;new /obj/item/weapon/material/shard, + 10;new /obj/item/stack/cable_coil/random, 10;new /obj/item/stack/material/wood, 10;new /obj/item/stack/material/wood/sif, - 10;new /obj/item/stack/material/log, - 10;new /obj/item/stack/material/log/sif, - 10;new /obj/item/stack/material/cloth, - 10;new /obj/item/stack/material/cardboard, - 10;new /obj/item/trash/rkibble, + 10;new /obj/item/stack/material/snow, + 5;new /obj/item/stack/material/phoron, + 5;new /obj/item/stack/material/silver, + 5;new /obj/item/stack/material/gold, + 1;new /obj/item/stack/material/diamond) + if(overcharge && emagged) + product = pick(1;new /obj/item/stack/rods, + 5;new /obj/item/device/fbp_backup_cell, + 5;new /obj/item/trash/rkibble, + 10;new /obj/item/stack/tile/grass, + 10;new /obj/item/stack/tile/carpet, 10;new /obj/item/weapon/reagent_containers/spray/waterflower, 10;new /obj/item/weapon/bikehorn, 10;new /obj/item/weapon/storage/backpack/clown, 10;new /obj/item/clothing/under/rank/clown, 10;new /obj/item/clothing/shoes/clown_shoes, 10;new /obj/item/clothing/mask/gas/clown_hat, + 10;new /obj/item/device/pda/clown, 1;new /mob/living/simple_mob/vore/catgirl) - consume_resources(charge_cost) spark_system.start() product.loc = get_turf(A) +/obj/item/weapon/rms/proc/check_menu(mob/living/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + //Start of attack functions /obj/item/weapon/rms/afterattack(atom/target, mob/user, proximity) @@ -209,12 +210,35 @@ return /obj/item/weapon/rms/attack_self(mob/user) - if(mode_index >= modes.len) - mode_index = 1 - else - mode_index++ + var/list/choices = list( + "Steel" = radial_image_steel, + "Glass" = radial_image_glass, + "Cloth" = radial_image_cloth, + "Plastic" = radial_image_plastic, + "Stone" = radial_image_stone, + "Random" = radial_image_random + ) - to_chat(user, span("notice", "Changed mode to '[modes[mode_index]]'.")) + var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) + return + switch(choice) + if("Steel") + mode_index = modes.Find(RMS_STEEL) + if("Glass") + mode_index = modes.Find(RMS_GLASS) + if("Cloth") + mode_index = modes.Find(RMS_CLOTH) + if("Plastic") + mode_index = modes.Find(RMS_PLASTIC) + if("Stone") + mode_index = modes.Find(RMS_STONE) + if("Random") + mode_index = modes.Find(RMS_RAND) + else + return + + to_chat(user, span("notice", "Changed mode to '[choice]'.")) playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) return ..() @@ -223,9 +247,19 @@ playsound(src.loc, "sparks", 100, 1) return 1 +/obj/item/weapon/rms/attackby(obj/item/W, mob/user) + if(W.is_multitool()) + overcharge = !overcharge + if(overcharge) + to_chat(user, "The Rapid Material Synthesizer quietly whirrs...") + else + to_chat(user, "The Rapid Material Synthesizer resumes normal operation.") + return ..() #undef RMS_STEEL #undef RMS_GLASS -#undef RMS_BATT +#undef RMS_CLOTH +#undef RMS_PLASTIC +#undef RMS_STONE #undef RMS_RAND \ No newline at end of file diff --git a/icons/mob/radial_vr.dmi b/icons/mob/radial_vr.dmi index d5ecf5c8cc45c2fefb1d565839cee58857793d85..b2e185c78562f1ddd487a67b9602c18e8e3a7a71 100644 GIT binary patch literal 3916 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 v8Em?S;}rfsg-}SM literal 456 zcmV;(0XP1MP)i2; z-cX5)GbOXA7|1o`;!G<_%uR)`krf#cqsW*TMJB{3G9^Zl88M0qa!QMdQCFN=LZq_% zJX{Ku6?=&hvSTxQ*2Muimt{tZ%+3w*LwES6m>?EMHLim0_Ysop{O;FDmZJRfPz%0l;+_chnIyW3A4ixOpX{e zImY+!B?{c01x4BB1qB5^g3N!U+X$|9_e^L3s!YK2lX~Cx+_*eUV4)%M^#GoQVTcVx y7ui=`E&#Ek^^;>Q>a}@_@?9=`9(VPE+rtz8$Tdd-^=X{|0000