mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-27 18:01:51 +00:00
* coefficient balancing * damage and meltdowns * meltdown stuff * alert stuff * lots of work - whew * some enrichment code * rod encrichmnt * working on enrichment * more fabrication * rod fab * start to the nuke * overload sprites * overload code work * some overload tweaking * small tweak * coolant ejections and QOL things * overheat events + ripley gripper * rebase + venting code * save before rebase * some pre-work for rods * finishing the base rods * fixed my dme * de linting * tiny lint fix * more lint fixes * linting * linting * linting * linting * linting * temp delint * temp delint * undo TM stuff + minor fix * didnt save * some fixes * fixes * fixes and engine repair * fixed broken durability decay * LOTS of things * tgui * lint * linter * linter * minor shit * Update boxstation.dmm * major refactors and fixes * saved this * critical testing tweaks and fixes * fixes and tweaks * smithing start * forgot to save * craftables + grill start * saved * fix * more grill work * Update tgui.bundle.js * linter * linter * fixes * rod fabricator initial * cooking work * push * soundwork * sound work tweak * comments + sounds + toxins gen rework * lots of work * sprite stuff * deconflicting * delinting * bundle rebuild * prettier * feex * fuck you OD * who asked? * update to tgui * another edit to tgui * finish tgui * remove debug metadata button * rod tweaks for tgui * Update code/datums/uplink_items/uplink_traitor.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/mecha/equipment/tools/work_tools.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/mecha/equipment/tools/work_tools.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/objects/items/robot/cyborg_gripper.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/parrot.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/parrot.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/parrot.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/parrot.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/nuclear_misc.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/nuclear_misc.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/nuclear_misc.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/nuclear_rods.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/nuclear_rods.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/reactor.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/reactor.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/nuclear_rods.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/nuclear_rods.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/nuclear_rods.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/reactor.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/smithing/components/misc_components.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/nuclear_rods.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update tgui/packages/tgui/interfaces/NuclearRodFabricator.jsx Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Spans * tgui build * rod redo * improve tgui for fabricator * sprites and centrifuge/fab work * tgui update * spritework * cyberiad + hydrogen conversion * kerberos + counter * Update code/modules/power/engines/fission/nuclear_rods.dm Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * sprite + fab tweak * tgui bundle * lintering * bugfixing * linting * linting * event tweak * add missing gases to fission monitor * issue fixing * sprite/overlay fixes * mapping * stations again * space lattice * tine tweak * linter * no rod alerts * buttons * loose wire * make it so you can interact through rod casings and the uhh big thing in the center, what's that called again * fixes * door fix * many bug fixes + crates * fab ghost touch * water convert + maint sprite + fixes * pack changes + neighbor fix * doors rename * didnt save * hydrogen fix * map tweaks * repair fixes + corium LETHALITY * upped broken rad damage * pipe rename + overload icons * more roundstart moderators * rod tree tweaks * tweaks * pack and enrichment fixes * misc tweaks and fixes * fixes: Density, circuits, coolant offline negation * Apply suggestions from code review Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * review changes * linter + fix * reviews and fixes * LOTS of tweaks and changes * supermatter kit * spacematter balance * tgui * fixes and tweaks * didnt save this * mapping + smith fix * cargo rods arnt radioactive til opened * Apply suggestions from code review Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * review items * fixes * linters * moving components out of nullspace * examine fix * Update tgui.bundle.js * explosion nerf and minor fix * Apply suggestions from code review Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * reviews * map fix + ripley rad immune * Apply suggestions from code review Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * review * fix chamber examine * tweaks + rod fab disk drop * Apply suggestions from code review Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * review changes * Update code/modules/power/engines/fission/nuclear_rods.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * fixes * tgui bundle * small rod tweaks * Update code/game/machinery/computer/buildandrepair.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/smithing/components/reactor_components.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/reactor_machines.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/power/engines/fission/reactor_machines.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * reviews * Update code/modules/power/engines/fission/reactor_machines.dm Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --------- Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: Paul <pmerkamp@gmail.com> Co-authored-by: Pooble <90473506+poobsie@users.noreply.github.com> Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
451 lines
16 KiB
Plaintext
451 lines
16 KiB
Plaintext
/obj/machinery/smithing/kinetic_assembler
|
|
name = "kinetic assembler"
|
|
desc = "A smart assembler that takes components and combines them at the strike of a hammer."
|
|
icon = 'icons/obj/machines/smithing_machines.dmi'
|
|
icon_state = "assembler"
|
|
max_integrity = 100
|
|
pixel_y = 0
|
|
bound_height = 32
|
|
bound_width = 32
|
|
bound_y = 0
|
|
operation_sound = 'sound/items/welder.ogg'
|
|
/// Primary component
|
|
var/obj/item/smithed_item/component/primary
|
|
/// Secondary component
|
|
var/obj/item/smithed_item/component/secondary
|
|
/// Trim component
|
|
var/obj/item/smithed_item/component/trim
|
|
/// Finished product
|
|
var/obj/item/finished_product
|
|
/// Products that are produced in batches
|
|
var/list/batched_item_types = list(
|
|
/obj/item/smithed_item/lens,
|
|
/obj/item/smithed_item/tool_bit
|
|
)
|
|
/// Amount of extra items made in batches
|
|
var/batch_extras = 1
|
|
/// Products that can not be affected by productivity bits
|
|
var/list/no_productivity_types = list(
|
|
/obj/item/kitchen/knife/smithed,
|
|
)
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/Initialize(mapload)
|
|
. = ..()
|
|
// Stock parts
|
|
component_parts = list()
|
|
component_parts += new /obj/item/circuitboard/kinetic_assembler(null)
|
|
component_parts += new /obj/item/stock_parts/manipulator(null)
|
|
component_parts += new /obj/item/stock_parts/manipulator(null)
|
|
component_parts += new /obj/item/stock_parts/manipulator(null)
|
|
component_parts += new /obj/item/stock_parts/micro_laser(null)
|
|
component_parts += new /obj/item/stack/sheet/glass(null)
|
|
batched_item_types = typecacheof(batched_item_types)
|
|
no_productivity_types = typecacheof(no_productivity_types)
|
|
RefreshParts()
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/Destroy()
|
|
if(primary)
|
|
primary.forceMove(src.loc)
|
|
if(secondary)
|
|
secondary.forceMove(src.loc)
|
|
if(trim)
|
|
trim.forceMove(src.loc)
|
|
. = ..()
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/examine(mob/user)
|
|
. = ..()
|
|
if(primary || secondary || trim)
|
|
. += SPAN_NOTICE("You can activate the machine with your hand, or remove a component by alt-clicking.")
|
|
if(primary)
|
|
. += SPAN_NOTICE("There is a [primary] in the primary slot.")
|
|
if(secondary)
|
|
. += SPAN_NOTICE("There is a [secondary] in the secondary slot.")
|
|
if(trim)
|
|
. += SPAN_NOTICE("There is a [trim] in the trim slot.")
|
|
if(finished_product)
|
|
. += SPAN_NOTICE("There is a nearly-complete [finished_product] on the assembler. To complete the product, strike it with your hammer!")
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/RefreshParts()
|
|
var/operation_mult = 0
|
|
for(var/obj/item/stock_parts/component in component_parts)
|
|
operation_mult += OPERATION_SPEED_MULT_PER_RATING * component.rating
|
|
// Update our values
|
|
operation_time = operation_time = max(ROUND_UP(initial(operation_time) * (1.3 - operation_mult)), 2)
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/update_icon_state()
|
|
. = ..()
|
|
if(panel_open)
|
|
icon_state = "assembler_wires"
|
|
else
|
|
icon_state = "assembler"
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I)
|
|
. = ..()
|
|
update_icon(UPDATE_ICON_STATE)
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/update_overlays()
|
|
. = ..()
|
|
overlays.Cut()
|
|
if(panel_open)
|
|
icon_state = "assembler_wires"
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/AltClick(mob/living/user)
|
|
if(!Adjacent(user))
|
|
return
|
|
if(!primary && !secondary && !trim)
|
|
to_chat(user, SPAN_WARNING("There is no component to remove."))
|
|
return
|
|
var/list/components = list("Primary", "Secondary", "Trim")
|
|
var/removed = tgui_input_list(user, "Select a component to remove", src, components)
|
|
if(!removed)
|
|
return
|
|
switch(removed)
|
|
if("Primary")
|
|
if(!primary)
|
|
to_chat(user, SPAN_WARNING("There is no primary component to remove."))
|
|
return
|
|
to_chat(user, SPAN_NOTICE("You remove [primary] from the primary component slot of [src]."))
|
|
if(primary.burn_check(user))
|
|
primary.burn_user(user)
|
|
primary.forceMove(user.loc)
|
|
primary = null
|
|
return
|
|
user.put_in_hands(primary)
|
|
primary = null
|
|
return
|
|
if("Secondary")
|
|
if(!secondary)
|
|
to_chat(user, SPAN_WARNING("There is no secondary component to remove."))
|
|
return
|
|
to_chat(user, SPAN_NOTICE("You remove [secondary] from the secondary component slot of [src]."))
|
|
if(secondary.burn_check(user))
|
|
secondary.burn_user(user)
|
|
secondary.forceMove(user.loc)
|
|
secondary = null
|
|
return
|
|
user.put_in_hands(secondary)
|
|
secondary = null
|
|
return
|
|
if("Trim")
|
|
if(!trim)
|
|
to_chat(user, SPAN_WARNING("There is no trim component to remove."))
|
|
return
|
|
to_chat(user, SPAN_NOTICE("You remove [trim] from the trim component slot of [src]."))
|
|
if(trim.burn_check(user))
|
|
trim.burn_user(user)
|
|
trim.forceMove(user.loc)
|
|
trim = null
|
|
return
|
|
user.put_in_hands(trim)
|
|
trim = null
|
|
return
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
|
if(istype(used, /obj/item/storage/part_replacer))
|
|
return ..()
|
|
|
|
if(operating)
|
|
to_chat(user, SPAN_WARNING("[src] is still operating!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
if(istype(used, /obj/item/hammer))
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
if(!istype(used, /obj/item/smithed_item/component))
|
|
to_chat(user, SPAN_WARNING("You feel like there's no reason to process [used]."))
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
if(finished_product)
|
|
to_chat(user, SPAN_WARNING("There is an almost finished [finished_product] in [src]!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
var/obj/item/smithed_item/component/comp = used
|
|
if(comp.hammer_time)
|
|
to_chat(user, SPAN_WARNING("[used] is not complete yet!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
if(comp.part_type == PART_PRIMARY)
|
|
if(primary)
|
|
to_chat(user, SPAN_NOTICE("You remove [primary] from the primary component slot of [src]."))
|
|
primary.forceMove(src.loc)
|
|
primary = null
|
|
if(comp.flags & NODROP || !user.transfer_item_to(used, src))
|
|
to_chat(user, SPAN_WARNING("[comp] is stuck to your hand!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
to_chat(user, SPAN_NOTICE("You insert [comp] into the primary component slot of [src]."))
|
|
primary = comp
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
if(comp.part_type == PART_SECONDARY)
|
|
if(secondary)
|
|
to_chat(user, SPAN_NOTICE("You remove [secondary] from the secondary component slot of [src]."))
|
|
secondary.forceMove(src.loc)
|
|
secondary = null
|
|
if(comp.flags & NODROP || !user.transfer_item_to(used, src))
|
|
to_chat(user, SPAN_WARNING("[comp] is stuck to your hand!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
to_chat(user, SPAN_NOTICE("You insert [comp] into the secondary component slot of [src]."))
|
|
secondary = comp
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
if(comp.part_type == PART_TRIM)
|
|
if(trim)
|
|
to_chat(user, SPAN_NOTICE("You remove [trim] from the trim component slot of [src]."))
|
|
trim.forceMove(src.loc)
|
|
trim = null
|
|
if(comp.flags & NODROP || !user.transfer_item_to(used, src))
|
|
to_chat(user, SPAN_WARNING("[comp] is stuck to your hand!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
to_chat(user, SPAN_NOTICE("You insert [comp] into the trim component slot of [src]."))
|
|
trim = comp
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/attack_hand(mob/user)
|
|
if(!allowed(user) && !isobserver(user))
|
|
to_chat(user, SPAN_WARNING("Access denied."))
|
|
return FINISH_ATTACK
|
|
if(finished_product)
|
|
to_chat(user, SPAN_WARNING("[src] has a nearly-complete product!"))
|
|
return FINISH_ATTACK
|
|
|
|
if(!primary)
|
|
to_chat(user, SPAN_WARNING("[src] lacks a primary component!"))
|
|
return FINISH_ATTACK
|
|
|
|
if(!secondary)
|
|
to_chat(user, SPAN_WARNING("[src] lacks a secondary component!"))
|
|
return FINISH_ATTACK
|
|
|
|
if(!trim)
|
|
to_chat(user, SPAN_WARNING("[src] lacks a trim component!"))
|
|
return FINISH_ATTACK
|
|
|
|
if(primary.finished_product != secondary.finished_product)
|
|
to_chat(user, SPAN_WARNING("[primary] does not match [secondary]!"))
|
|
return FINISH_ATTACK
|
|
|
|
operate(operation_time, user)
|
|
return FINISH_ATTACK
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/operate(loops, mob/living/user)
|
|
..()
|
|
finished_product = new primary.finished_product(src)
|
|
var/quality_list = list(primary.quality, secondary.quality, trim.quality)
|
|
var/datum/smith_quality/lowest = quality_list[1]
|
|
for(var/datum/smith_quality/quality in quality_list)
|
|
if(quality.stat_mult < lowest.stat_mult)
|
|
lowest = quality
|
|
if(istype(finished_product, /obj/item/smithed_item))
|
|
var/obj/item/smithed_item/product = finished_product
|
|
product.quality = lowest
|
|
product.material = trim.material
|
|
product.set_stats()
|
|
product.update_appearance(UPDATE_NAME)
|
|
finished_product = product
|
|
else if(istype(finished_product, /obj/item/kitchen/knife/smithed)) // We need to separate these because of their different paths
|
|
var/obj/item/kitchen/knife/smithed/product = finished_product
|
|
product.quality = lowest
|
|
product.material = trim.material
|
|
product.set_stats()
|
|
product.update_appearance(UPDATE_NAME)
|
|
product.update_icon(UPDATE_OVERLAYS)
|
|
finished_product = product
|
|
qdel(primary)
|
|
qdel(secondary)
|
|
qdel(trim)
|
|
primary = null
|
|
secondary = null
|
|
trim = null
|
|
|
|
/obj/machinery/smithing/kinetic_assembler/hammer_act(mob/user, obj/item/i)
|
|
if(operating)
|
|
to_chat(user, SPAN_WARNING("[src] is still operating!"))
|
|
return
|
|
if(!finished_product)
|
|
to_chat(user, SPAN_WARNING("There is no finished product ready!"))
|
|
return
|
|
playsound(src, 'sound/magic/fellowship_armory.ogg', 50, TRUE)
|
|
finished_product.forceMove(src.loc)
|
|
SSblackbox.record_feedback("tally", "smith_assembler_production", 1, "[finished_product.type]")
|
|
// Modify based on productivity
|
|
var/total_extras = clamp(round(1 * i.bit_productivity_mod / 2), 0, 2)
|
|
if(is_type_in_typecache(finished_product, batched_item_types))
|
|
total_extras += clamp(round(batch_extras * i.bit_productivity_mod / 2), 1, 4)
|
|
if(is_type_in_typecache(finished_product, no_productivity_types))
|
|
total_extras = 0
|
|
for(var/iterator in 1 to total_extras)
|
|
var/obj/item/product
|
|
if(istype(finished_product, /obj/item/smithed_item))
|
|
var/obj/item/smithed_item/current_product = finished_product
|
|
var/obj/item/smithed_item/extra_product = new finished_product.type(src.loc)
|
|
extra_product.quality = current_product.quality
|
|
extra_product.material = current_product.material
|
|
extra_product.set_stats()
|
|
product = extra_product
|
|
else if(istype(finished_product, /obj/item/kitchen/knife/smithed)) // We need to separate these because of their different paths
|
|
var/obj/item/kitchen/knife/smithed/current_product = finished_product
|
|
var/obj/item/kitchen/knife/smithed/extra_product = new finished_product.type(src.loc)
|
|
extra_product.quality = current_product.quality
|
|
extra_product.material = current_product.material
|
|
extra_product.set_stats()
|
|
product = extra_product
|
|
else if(istype(finished_product, /obj/item/nuclear_rod))
|
|
product = new finished_product.type(get_turf(src))
|
|
product.update_appearance(UPDATE_NAME)
|
|
product.scatter_atom()
|
|
|
|
finished_product = null
|
|
|
|
// MARK: Scientific Assembler
|
|
|
|
/obj/machinery/smithing/scientific_assembler
|
|
name = "scientific assembler"
|
|
desc = "A smart assembler that takes slime cores, energy cells, and energy gun parts to produce energy guns."
|
|
icon = 'icons/obj/machines/smithing_machines.dmi'
|
|
icon_state = "assembler"
|
|
max_integrity = 100
|
|
pixel_y = 0
|
|
bound_height = 32
|
|
bound_width = 32
|
|
bound_y = 0
|
|
operation_sound = 'sound/items/welder.ogg'
|
|
req_one_access = list(ACCESS_TOX, ACCESS_XENOBIOLOGY, ACCESS_SMITH)
|
|
/// Slime extract for the egun
|
|
var/obj/item/slime_extract/slime_core
|
|
/// The gun frame
|
|
var/obj/item/smithed_item/component/egun_parts/parts
|
|
/// The battery
|
|
var/obj/item/stock_parts/cell/cell
|
|
|
|
/obj/machinery/smithing/scientific_assembler/Initialize(mapload)
|
|
. = ..()
|
|
// Stock parts
|
|
component_parts = list()
|
|
component_parts += new /obj/item/circuitboard/scientific_assembler(null)
|
|
component_parts += new /obj/item/stock_parts/manipulator(null)
|
|
component_parts += new /obj/item/stock_parts/manipulator(null)
|
|
component_parts += new /obj/item/stock_parts/manipulator(null)
|
|
component_parts += new /obj/item/stock_parts/micro_laser(null)
|
|
component_parts += new /obj/item/stack/sheet/glass(null)
|
|
RefreshParts()
|
|
|
|
/obj/machinery/smithing/scientific_assembler/examine(mob/user)
|
|
. = ..()
|
|
if(slime_core || parts || cell)
|
|
. += SPAN_NOTICE("You can activate the machine with your hand, or remove a component by alt-clicking.")
|
|
if(slime_core)
|
|
. += SPAN_NOTICE("There is a [slime_core] in the core slot.")
|
|
if(parts)
|
|
. += SPAN_NOTICE("There is a [parts] in the gun frame slot.")
|
|
if(cell)
|
|
. += SPAN_NOTICE("There is a [cell] in the power cell slot.")
|
|
|
|
/obj/machinery/smithing/scientific_assembler/RefreshParts()
|
|
var/operation_mult = 0
|
|
for(var/obj/item/stock_parts/component in component_parts)
|
|
operation_mult += OPERATION_SPEED_MULT_PER_RATING * component.rating
|
|
// Update our values
|
|
operation_time = operation_time = max(ROUND_UP(initial(operation_time) * (1.3 - operation_mult)), 2)
|
|
|
|
/obj/machinery/smithing/scientific_assembler/update_icon_state()
|
|
. = ..()
|
|
if(panel_open)
|
|
icon_state = "assembler_wires"
|
|
else
|
|
icon_state = "assembler"
|
|
|
|
/obj/machinery/smithing/scientific_assembler/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I)
|
|
. = ..()
|
|
update_icon(UPDATE_ICON_STATE)
|
|
|
|
/obj/machinery/smithing/scientific_assembler/update_overlays()
|
|
. = ..()
|
|
overlays.Cut()
|
|
if(panel_open)
|
|
icon_state = "assembler_wires"
|
|
|
|
/obj/machinery/smithing/scientific_assembler/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
|
if(istype(used, /obj/item/storage/part_replacer))
|
|
return ..()
|
|
|
|
if(operating)
|
|
to_chat(user, SPAN_WARNING("[src] is still operating!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
if(istype(used, /obj/item/slime_extract))
|
|
var/obj/item/slime_extract/core = used
|
|
if(!core.associated_gun_type)
|
|
to_chat(user, SPAN_NOTICE("[core] is not capable of producing an energy gun!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
if(slime_core)
|
|
to_chat(user, SPAN_NOTICE("You remove [slime_core] from the core component slot of [src]."))
|
|
slime_core.forceMove(src.loc)
|
|
slime_core = null
|
|
if(used.flags & NODROP || !user.transfer_item_to(used, src))
|
|
to_chat(user, SPAN_WARNING("[used] is stuck to your hand!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
to_chat(user, SPAN_NOTICE("You insert [used] into the core component slot of [src]."))
|
|
slime_core = used
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
if(istype(used, /obj/item/smithed_item/component/egun_parts))
|
|
if(parts)
|
|
to_chat(user, SPAN_NOTICE("You remove [parts] from the gun parts component slot of [src]."))
|
|
parts.forceMove(src.loc)
|
|
parts = null
|
|
if(used.flags & NODROP || !user.transfer_item_to(used, src))
|
|
to_chat(user, SPAN_WARNING("[used] is stuck to your hand!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
var/obj/item/smithed_item/component/egun_parts/new_parts = used
|
|
if(new_parts.hammer_time)
|
|
to_chat(user, SPAN_WARNING("[new_parts] is not complete yet!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
to_chat(user, SPAN_NOTICE("You insert [used] into the gun parts component slot of [src]."))
|
|
parts = used
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
if(istype(used, /obj/item/stock_parts/cell))
|
|
if(cell)
|
|
to_chat(user, SPAN_NOTICE("You remove [cell] from the power cell component slot of [src]."))
|
|
cell.forceMove(src.loc)
|
|
cell = null
|
|
if(used.flags & NODROP || !user.transfer_item_to(used, src))
|
|
to_chat(user, SPAN_WARNING("[used] is stuck to your hand!"))
|
|
return ITEM_INTERACT_COMPLETE
|
|
to_chat(user, SPAN_NOTICE("You insert [used] into the power cell component slot of [src]."))
|
|
cell = used
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
to_chat(user, SPAN_WARNING("You feel like there's no reason to process [used]."))
|
|
return ITEM_INTERACT_COMPLETE
|
|
|
|
/obj/machinery/smithing/scientific_assembler/attack_hand(mob/user)
|
|
if(!allowed(user) && !isobserver(user))
|
|
to_chat(user, SPAN_WARNING("Access denied."))
|
|
return FINISH_ATTACK
|
|
if(!slime_core)
|
|
to_chat(user, SPAN_WARNING("[src] lacks a slime core!"))
|
|
return FINISH_ATTACK
|
|
|
|
if(!parts)
|
|
to_chat(user, SPAN_WARNING("[src] lacks an energy gun frame!"))
|
|
return FINISH_ATTACK
|
|
|
|
if(!cell)
|
|
to_chat(user, SPAN_WARNING("[src] lacks a power cell!"))
|
|
return FINISH_ATTACK
|
|
|
|
operate(operation_time, user)
|
|
return FINISH_ATTACK
|
|
|
|
/obj/machinery/smithing/scientific_assembler/operate(loops, mob/living/user)
|
|
..()
|
|
var/obj/item/gun/energy/finished_product = new slime_core.associated_gun_type(src)
|
|
finished_product.forceMove(src.loc)
|
|
qdel(slime_core)
|
|
qdel(parts)
|
|
qdel(cell)
|
|
slime_core = null
|
|
parts = null
|
|
cell = null
|