From 4b08adaf23e37b68f19220d453bccd39f598c5de Mon Sep 17 00:00:00 2001 From: Holdelta Date: Fri, 15 May 2020 01:38:48 -0700 Subject: [PATCH] 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 zcmai1c{tQv*#6DN$YAVa>=Y`=9!17BmLw#~E)^2Si?PI*EThGsgfP~!We?f66e&xD zv1N&}XY66{&3k?CU*A99bv@5{&UMax-RE5AzW;d66Ejl-wiDOqJv2>&N`pKU#2*^aZ z`$E6!>2r(fORJa4Yf-&BO1AOXMeZh;KT+8igyf2wS)8QpAa>{Z*eO z*Ss9>Nr~QbtF2rZ-U@P&uHucb|wg8R1jM;7tlm#GIPtE#J8;!U!L%{%_T@rGg9p-rRjWJe21 z$osxZWA@&+_zp)F4$!Ne_d=&v{mMlQu2BZlxpdB(H5{)ViKHKCrWd!!7k!%|7tcRm z3@!a}j1P;m(wbVpy$XWXCKkF*j49OEx>b3z=@Ym3J@X1=xhs0c45cwWTNMe#$+E8f z`N0Px=MJtSq1yj{=uw@^%zms4tcE_zgD8!QdlLT;bQ+KJ67AxN`i8RgCY zPUysbeV2FrF3uR7mgUgZFj;R}-86~(W_s`v`u;ORG5?D!D?=9neWL2ZozK$$>G_|q zpJPkQ97QjO+*Inws%DxOib;_hr&<`hm2m2FhD=4j@mLZ z-ZlY<8gubXHJ0aLGdp-wU0iXkuhgZ_u0lsEsujh|EtGt8xGCDx z$Sv@F2pn%A)lq}>_f>y9XeO2zK8$uoip3;bpXJ46tk%gj#2z}`pPF-U%gs^&m}oE8 zs|S1{6~Ch9Tig3g?StzZ^uG;(arXQO;MT!ibT#p4_qg}{@iYLO{e zVuL6F&tMUeDJ=J$5+SC{J@H{;!nD)PZFD^HeqIpukU3+7kG%M6T;Xy(itwoDs}edi+BrX z>X9Y@^rB8=05#z94r|P*$63nq72X{8deftm*ha;SRKmdI{jDF=;)O^dDxao%0 z=Cn1nCn{JMh=oWK;M6EdXyD3>jWJ_Zq>>{a$^A_73J9|}hwDO5aU%984Ok#iOsC)1 zY=;a7FhyyS#Oue~gZdpolRlJej;oW&0Tdw=E%JXR&Jgh0Uan5^9gnSSSK8`{iYmo0DTGXMxTOl+|^PZPk98gaSaoU zNYJ8pK8wY*sxiBKZirQ?3YZGrqa;Ki!J&t?<(_^*6qe$bR|E;x3|G*neTMr`YA)03 z<{%|Oz(yDDOo$oztHEbtg}dOr58(!>xgsYtTBJ3V{`Bo5g^&{`!)=ySGCh;mG6Ly2 zIKAeZGVH4pb<&xe8V`iWz#VF}(+qtN4{cl34dko=2s1x8N=Nk1L^Jn!jpM_5^Q|0-~@KU{x&y6 zN7vkT!of4F^-2DVbrV81{(lRACxyr8bp_xrhO=`%sBsZ zPTpRzH@tkQeOK2K%yL@!ZFV7SPKdpY44-`V4^B7>U}uXpRGecKiCk9wF?m7s;N8*R z&SL}w65)iXZ4MMpc9ol<+q$klj}uXj&O|s((;C63*_#fxbllf94F$9z@robnE*yzA zJ9=))Ojql!-c{H=uD^TbB-l{khtwUL<&WQQP~4YmWg-K;#Lk-Rr9?b{?W984|)aO#~iyCglglQS)a^)DNzOnXDD}DAUcemnQBXp{4`omV5 znXwL>xpet9RkOk8sDygqL0JX-+gr|Yo@+e%9R(H6i7(B3{N=;XFL<=GTz)DgvEu?iKw7dG}JNbh5d(*SS}J7_q|3h54+I`+V~AE=sF z%)FKfH{lK90kZuS#qUtZqhpIAZaI?@EprM%xuD$c_CEzrOp185g|#jW@wvQ8OY7YD z2X=|6M&}D0au_-ti^;XoKdEb%_K-iA~|FdGLO);U27c~L816jWA$vtMs#`@ zK?p{;5%RmOtkjm@+YTrb9`HbTJLa=_>c>A?2PyH3xw!0W1FiI0b*hRA_$;7w5G@8r zlEialbWo&QejuO~76&U&jdOz;GRZWhzS4m_AB?xqJ>yBrlVa7jS;YDHaE68kb$2&L z=ti?^pC&st?z779-u^SzH+_-)M6D4C8$8}@kM=D)qTet{SC62~i$4Vi zW;|Vr({oDY*xO76Fbn$^OWYfWP_s#Nvz|7pd1Y`>YM zAANo@aJG6Ou%K9O2#?c^ZD=35f42#c?nh(9s| zr8al|1kKeY2~GdJ&f(t#Q4Y0lrO{}4~LeB4SXu_uXozmQCGfW z@4LO&{&FC7{mAOQcT&|%`cD}^>`Y&__c%fCS6wU?>QwS5jo08p|DdPxz~oxcBwJkY z_}!kZE1g@6tfF2BZ}vO@q1qcDHrI~H=$#K`wXq&Y^yxwI7w#lSi za>g(9!0m$VzXcl63><)a`Wk+v^2z#YW$4J`czxya4%3H+3D;U;q%#S1(vsR&z=nd& z_@H5(0{$iI()6p1q8N$D4l>P_5TAc;ME@PD4SnDOYQw22k}x4 z`L!hQ_v|KZAIsJ5ou<4@PkeCHbme^T9@g*2P+Rq_rtRRcyO)h<#bSU9{mYP27ye3e z8BiNe|E9+DN5}}_o#cA0Njy7w;S6YGt{2UXxlJ3RS|Od?`2hKYv`jFtp*vgP(DDK` zwJg}xec-KMZw$lJ20!Y`W`S{A3;&DtWUGue$!gBk-Vp_-_RFY|3s8 zwMleA5ftM&6oU)TYsc?so{HFBJj3t{jac^@t0~SPF)9$H zpd4ps@S(xAhGomprj@;( zK0Mvl5n$|*GLDBAs1SmKF5QfP5Fd6zJNC~4L|l*v?F33l*i@%sJ1|YU@p$K!Wm($F z6gy0t#mIq{@3?P7z1AIqtWtsAvEQm-ajMne_{)nhjd5}J0?A?J)h<#_68O%N1{yX! zV!|pBQ(rT@-HicOR#v0*Fv;1Pi-Ljvcsv=N^gD(MX&smVGtItk_Y;@#3~|~H%+zRB zK=Wbh?7V)35c61)=Myx6ofu(Gf(dj4GGqXzc) 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