From bf52fdd23dfa03da2a4130583145bff0075d0300 Mon Sep 17 00:00:00 2001 From: Cameron Lennox Date: Mon, 21 Apr 2025 17:20:31 -0400 Subject: [PATCH] RMS Adjustments (#17490) * RMS Adjustments Makes the RMS more useful Including MATH this time! * Update RMS.dm --- .../items/weapons/{RMS_vr.dm => RMS.dm} | 204 ++++++++++-------- .../xenoarcheaology/finds/find_spawning.dm | 7 +- vorestation.dme | 2 +- 3 files changed, 121 insertions(+), 92 deletions(-) rename code/game/objects/items/weapons/{RMS_vr.dm => RMS.dm} (51%) diff --git a/code/game/objects/items/weapons/RMS_vr.dm b/code/game/objects/items/weapons/RMS.dm similarity index 51% rename from code/game/objects/items/weapons/RMS_vr.dm rename to code/game/objects/items/weapons/RMS.dm index fb321546d18..d162a3e5e2f 100644 --- a/code/game/objects/items/weapons/RMS_vr.dm +++ b/code/game/objects/items/weapons/RMS.dm @@ -5,6 +5,23 @@ #define RMS_STONE 5 #define RMS_RAND 6 +var/list/RMS_random_malfunction = list(/obj/item/fbp_backup_cell, + /obj/item/trash/rkibble, + /obj/item/clothing/gloves/bluespace/deluxe, + /obj/item/flame/lighter/supermatter/syndismzippo, + /obj/item/instrument/trumpet/spectral, + /obj/item/storage/smolebrickcase, + /obj/item/stack/tile/grass, + /obj/item/stack/tile/carpet, + /obj/item/reagent_containers/spray/waterflower, + /obj/item/bikehorn, + /obj/item/storage/backpack/clown, + /obj/item/clothing/under/rank/clown, + /obj/item/clothing/shoes/clown_shoes, + /obj/item/clothing/mask/gas/clown_hat, + /obj/item/pda/clown, + /mob/living/simple_mob/vore/catgirl) + /obj/item/rms name = "Rapid Material Synthesizer" desc = "A tool that converts battery charge to materials." @@ -27,13 +44,14 @@ 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_o = 50000 - var/charge_cost_r = 100000 + var/max_charge = 1000000 //large storage, equivalent to a little over 33 GIGA batteries. + var/charge_cost = 1000 + /// Cost of 'basic' things such as glass or steel. Un-upgraded chargers charge at ~40 charge a second, meaning 15 seconds per sheet. 22.5 for 'advanced' sheets (overcharged). This becomes ~10 seconds and ~15 seconds with a heavily upgraded charger. + var/charge_cost_basic = 1000 + var/charge_cost_random = 3333 //Cost of 'random' things. Used by RMS_RAND. This takes ~85 seconds a sheet on a basic charger and ~33 seconds a sheet on an upgraded charger. var/charge_stage = 0 var/overcharge = 0 - var/emagged = 0 + var/overcharge_modifier = 1.5 //Multiplier in price for using the overcharge mode. 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") @@ -71,6 +89,7 @@ /obj/item/rms/proc/drain_battery(user, battery) var/obj/item/cell/C = battery + var/charge_needed = max_charge - stored_charge if(stored_charge == max_charge) to_chat(user, span_notice("The Rapid Material Synthesizer is full on charge!.")) if(C.charge == 0) @@ -79,7 +98,10 @@ playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 2,target = C)) stored_charge += C.charge - C.charge = 0 + if(C.charge > charge_needed) //We only drain what we need! + C.use(charge_needed) + else + C.use(C.charge) C.update_icon() to_chat(user, span_notice("You drain [C].")) stored_charge = CLAMP(stored_charge, 0, max_charge) @@ -103,90 +125,95 @@ if(!can_afford(charge_cost)) to_chat(user, span_notice("There is not enough charge to use this mode.")) return - else - consume_resources(charge_cost) + consume_resources(charge_cost) else - if(!can_afford(charge_cost_o)) + if(!can_afford(charge_cost * overcharge_modifier)) to_chat(user, span_notice("There is not enough charge to use the overcharged mode.")) return - else - consume_resources(charge_cost_o) + consume_resources(charge_cost * overcharge_modifier) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 5, target = A)) - switch(mode_index) - 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 - spark_system.start() - else - product = new /obj/item/stack/material/steel - 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 - spark_system.start() - else - product = new /obj/item/stack/material/glass - 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 - 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/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/snow) - if(overcharge && !emagged) - product = pick(1;new /obj/item/stack/rods, - 5;new /obj/item/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() - if(!overcharge && emagged) - product = pick(10;new /obj/item/trash/material/metal, - 10;new /obj/item/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/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/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/reagent_containers/spray/waterflower, - 10;new /obj/item/bikehorn, - 10;new /obj/item/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/pda/clown, - 1;new /mob/living/simple_mob/vore/catgirl) - spark_system.start() + if(overcharge) + if(prob(5)) //5% chance for malfunction + var/thing_to_spawn = pick(RMS_random_malfunction) + product = new thing_to_spawn + else + product = choose_overcharge(user) + else + product = choose_normal(user) + + spark_system.start() product.loc = get_turf(A) +/obj/item/rms/proc/choose_overcharge(mob/living/user) + var/final_product + switch(mode_index) + if(RMS_STEEL) + final_product = new /obj/item/stack/material/plasteel + if(RMS_GLASS) + final_product = new /obj/item/stack/material/glass/phoronglass + if(RMS_CLOTH) + final_product = new /obj/item/stack/material/leather + if(RMS_PLASTIC) + final_product = new /obj/item/stack/material/cardboard + if(RMS_STONE) + final_product = new /obj/item/stack/material/marble + if(RMS_RAND) + final_product = randomize(user) + return final_product + +/obj/item/rms/proc/choose_normal(mob/living/user) + var/final_product + switch(mode_index) + if(RMS_STEEL) + final_product = new /obj/item/stack/material/steel + if(RMS_GLASS) + final_product = new /obj/item/stack/material/glass + if(RMS_CLOTH) + final_product = new /obj/item/stack/material/cloth + if(RMS_PLASTIC) + final_product = new /obj/item/stack/material/plastic + if(RMS_STONE) + final_product = new /obj/item/stack/material/sandstone + if(RMS_RAND) + final_product = randomize(user) + return final_product + +/obj/item/rms/proc/randomize(mob/living/user) + var/obj/item/stack/final_product + var/possible_object_paths = list() + possible_object_paths += subtypesof(/obj/item/stack/material) + possible_object_paths -= typesof(/obj/item/stack/material/cyborg) + //I looked through the code for any materials that should be banned...Most of the "DO NOT EVER GIVE THESE TO ANYONE EVER" materials are only in their /datum form and the ones that have sheets spawn in as normal sheets (ex: hull datums) so...This is here in case it's needed in the future. + var/list/banned_sheet_materials = list( + /obj/item/stack/material/supermatter, + /obj/item/stack/material/glamour, + /obj/item/stack/material/morphium + // Include if you enable in the .dme /obj/item/stack/material/debug + ) + var/obj/item/stack/new_metal = /obj/item/stack/material/supermatter + for(var/x=1;x<=10;x++) //You got 10 chances to hit a metal that is NOT banned. + var/picked_metal = pick(possible_object_paths) //We select + if(picked_metal in banned_sheet_materials) + continue + else + new_metal = picked_metal + break + if(prob(1) && prob(1) && prob(1)) //1 in a million...Feeling lucky? + if(prob(50)) + new_metal = /obj/item/stack/material/morphium + else + new_metal = /obj/item/stack/material/supermatter + visible_message(span_giganteus(span_boldwarning("The [src] glows blazing hot for a moment before spitting out a glowing material!"))) + if(overcharge) //uh oh... + to_chat(user, span_extramassive(span_boldwarning("The [src] heats up to the point that you are immediately vaporized!"))) + user.dust() + final_product = new new_metal + if(overcharge && (charge_cost_random > 0)) //We use ALL our energy in one go while overcharged! Also has a charge_cost_random sanity check in case of badmins. + final_product.amount = max(1, 1+round(stored_charge/charge_cost_random)) + consume_resources(stored_charge) + return final_product + /obj/item/rms/proc/check_menu(mob/living/user) if(!istype(user)) return FALSE @@ -225,16 +252,22 @@ switch(choice) if("Steel") mode_index = modes.Find(RMS_STEEL) + charge_cost = charge_cost_basic if("Glass") mode_index = modes.Find(RMS_GLASS) + charge_cost = charge_cost_basic if("Cloth") mode_index = modes.Find(RMS_CLOTH) + charge_cost = charge_cost_basic if("Plastic") mode_index = modes.Find(RMS_PLASTIC) + charge_cost = charge_cost_basic if("Stone") mode_index = modes.Find(RMS_STONE) + charge_cost = charge_cost_basic if("Random") mode_index = modes.Find(RMS_RAND) + charge_cost = charge_cost_random else return @@ -242,11 +275,6 @@ playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) return ..() -/obj/item/rms/emag_act(var/remaining_charges, var/mob/user) - emagged = !emagged - playsound(src.loc, "sparks", 100, 1) - return 1 - /obj/item/rms/attackby(obj/item/W, mob/user) if(W.has_tool_quality(TOOL_MULTITOOL)) overcharge = !overcharge diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm index 99c4e06c5e0..d62cdbd6623 100644 --- a/code/modules/xenoarcheaology/finds/find_spawning.dm +++ b/code/modules/xenoarcheaology/finds/find_spawning.dm @@ -208,7 +208,7 @@ var/list/banned_sheet_materials = list( // Include if you enable in the .dme /obj/item/stack/material/debug ) - var/new_metal = /obj/item/stack/material/supermatter + var/obj/item/stack/new_metal = /obj/item/stack/material/supermatter for(var/x=1;x<=10;x++) //You got 10 chances to hit a metal that is NOT banned. var/picked_metal = pick(possible_object_paths) //We select if(picked_metal in banned_sheet_materials) @@ -216,8 +216,9 @@ else new_metal = picked_metal break - new_item = new new_metal(src.loc) - new_item:amount = rand(5,45) + new_metal = new new_metal(src.loc) + new_metal.amount = rand(5,45) + new_item = new_metal if(ARCHAEO_PEN) var/new_pen = pick(/obj/item/pen, /obj/item/pen/blade/fountain, /obj/item/pen/reagent/sleepy) //There are WAY too many pen blade variants that it'd drown out the others in this list. new_item = new new_pen(src.loc) diff --git a/vorestation.dme b/vorestation.dme index 8cdd7f68c70..949d7ae595f 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1486,7 +1486,7 @@ #include "code\game\objects\items\weapons\policetape.dm" #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RCD_vr.dm" -#include "code\game\objects\items\weapons\RMS_vr.dm" +#include "code\game\objects\items\weapons\RMS.dm" #include "code\game\objects\items\weapons\RPD_vr.dm" #include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\scrolls.dm"