|
| 1 | +/obj/item/circuitboard/machine/ltsrbt |
| 2 | + name = "LTSRBT (Machine Board)" |
| 3 | + icon_state = "bluespacearray" |
| 4 | + build_path = /obj/machinery/ltsrbt |
| 5 | + req_components = list( |
| 6 | + /obj/item/stack/ore/bluespace_crystal = 2, |
| 7 | + /obj/item/stock_parts/subspace/ansible = 1, |
| 8 | + /obj/item/stock_parts/micro_laser = 1, |
| 9 | + /obj/item/stock_parts/scanning_module = 2) |
| 10 | + def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) |
| 11 | + |
| 12 | +/obj/machinery/ltsrbt |
| 13 | + name = "Long-To-Short-Range-Bluespace-Transciever" |
| 14 | + desc = "The LTSRBT is a compact teleportation machine for recieving and sending items outside the station and inside the station.\nUsing teleportation frequencies stolen from NT it is near undetectable.\nEssential for any illegal market operations on NT stations.\n" |
| 15 | + icon_state = "exonet_node" |
| 16 | + circuit = /obj/item/circuitboard/machine/ltsrbt |
| 17 | + density = TRUE |
| 18 | + |
| 19 | + idle_power_usage = 200 |
| 20 | + |
| 21 | + /// Divider for power_usage_per_teleport. |
| 22 | + var/power_efficiency = 1 |
| 23 | + /// Power used per teleported which gets divided by power_efficiency. |
| 24 | + var/power_usage_per_teleport = 10000 |
| 25 | + /// The time it takes for the machine to recharge before being able to send or recieve items. |
| 26 | + var/recharge_time = 0 |
| 27 | + /// Current recharge progress. |
| 28 | + var/recharge_cooldown = 0 |
| 29 | + /// Base recharge time which is used to get recharge_time. |
| 30 | + var/base_recharge_time = 100 |
| 31 | + /// Current /datum/blackmarket_purchase being recieved. |
| 32 | + var/recieving |
| 33 | + /// Current /datum/blackmarket_purchase being sent to the target uplink. |
| 34 | + var/transmitting |
| 35 | + /// Queue for purchases that the machine should recieve and send. |
| 36 | + var/list/datum/blackmarket_purchase/queue = list() |
| 37 | + |
| 38 | +/obj/machinery/ltsrbt/Initialize() |
| 39 | + . = ..() |
| 40 | + SSblackmarket.telepads += src |
| 41 | + |
| 42 | +/obj/machinery/ltsrbt/examine(mob/user) |
| 43 | + . = ..() |
| 44 | + if(queue.len) |
| 45 | + . += span_notice("It is currently recharging. Progress: [recharge_cooldown]%") |
| 46 | + |
| 47 | +/obj/machinery/ltsrbt/Destroy() |
| 48 | + SSblackmarket.telepads -= src |
| 49 | + // Bye bye orders. |
| 50 | + if(SSblackmarket.telepads.len) |
| 51 | + for(var/datum/blackmarket_purchase/P in queue) |
| 52 | + SSblackmarket.queue_item(P) |
| 53 | + . = ..() |
| 54 | + |
| 55 | +/obj/machinery/ltsrbt/RefreshParts() |
| 56 | + recharge_time = base_recharge_time |
| 57 | + // On tier 4 recharge_time should be 20 and by default it is 80 as scanning modules should be tier 1. |
| 58 | + for(var/obj/item/stock_parts/scanning_module/scan in component_parts) |
| 59 | + recharge_time -= scan.rating * 10 |
| 60 | + recharge_cooldown = recharge_time |
| 61 | + |
| 62 | + power_efficiency = 0 |
| 63 | + for(var/obj/item/stock_parts/micro_laser/laser in component_parts) |
| 64 | + power_efficiency += laser.rating |
| 65 | + // Shouldn't happen but you never know. |
| 66 | + if(!power_efficiency) |
| 67 | + power_efficiency = 1 |
| 68 | + |
| 69 | +/// Adds /datum/blackmarket_purchase to queue unless the machine is free, then it sets the purchase to be instantly recieved |
| 70 | +/obj/machinery/ltsrbt/proc/add_to_queue(datum/blackmarket_purchase/purchase) |
| 71 | + if(!recharge_cooldown && !recieving && !transmitting) |
| 72 | + recieving = purchase |
| 73 | + return |
| 74 | + queue += purchase |
| 75 | + |
| 76 | +/obj/machinery/ltsrbt/process() |
| 77 | + if(stat & NOPOWER) |
| 78 | + return |
| 79 | + |
| 80 | + if(recharge_cooldown) |
| 81 | + recharge_cooldown-- |
| 82 | + return |
| 83 | + |
| 84 | + var/turf/T = get_turf(src) |
| 85 | + if(recieving) |
| 86 | + var/datum/blackmarket_purchase/P = recieving |
| 87 | + |
| 88 | + if(!P.item || ispath(P.item)) |
| 89 | + P.item = P.entry.spawn_item(T) |
| 90 | + else |
| 91 | + var/atom/movable/M = P.item |
| 92 | + M.forceMove(T) |
| 93 | + |
| 94 | + use_power(power_usage_per_teleport / power_efficiency) |
| 95 | + var/datum/effect_system/spark_spread/sparks = new |
| 96 | + sparks.set_up(5, 1, get_turf(src)) |
| 97 | + sparks.attach(P.item) |
| 98 | + sparks.start() |
| 99 | + |
| 100 | + recieving = null |
| 101 | + transmitting = P |
| 102 | + |
| 103 | + recharge_cooldown = recharge_time |
| 104 | + return |
| 105 | + else if(transmitting) |
| 106 | + var/datum/blackmarket_purchase/P = transmitting |
| 107 | + if(!P.item) |
| 108 | + QDEL_NULL(transmitting) |
| 109 | + if(!P.item in T.contents) |
| 110 | + QDEL_NULL(transmitting) |
| 111 | + return |
| 112 | + do_teleport(P.item, get_turf(P.uplink)) |
| 113 | + use_power(power_usage_per_teleport / power_efficiency) |
| 114 | + QDEL_NULL(transmitting) |
| 115 | + |
| 116 | + recharge_cooldown = recharge_time |
| 117 | + return |
| 118 | + |
| 119 | + if(queue.len) |
| 120 | + recieving = pick_n_take(queue) |
0 commit comments