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 d5ecf5c8cc4..b2e185c7856 100644 Binary files a/icons/mob/radial_vr.dmi and b/icons/mob/radial_vr.dmi differ