diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 5ce08a47ad4..e0a0297d521 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -1,170 +1,285 @@ -/turf/simulated/floor/mech_bay_recharge_floor // Whose idea it was - name = "Mech Bay Recharge Station" // Recharging turfs - icon = 'icons/turf/floors.dmi' // That are set in stone to check the west turf for recharge port - icon_state = "recharge_floor" // Some people just want to watch the world burn i guess - -/turf/simulated/floor/mech_bay_recharge_floor/break_tile() - src.ChangeTurf(/turf/simulated/floor/plating) - +/turf/simulated/floor/mech_bay_recharge_floor + name = "Mech Bay Recharge Station" + icon = 'icons/mecha/mech_bay.dmi' + icon_state = "recharge_floor" + var/obj/machinery/mech_bay_recharge_port/recharge_port + var/obj/machinery/computer/mech_bay_power_console/recharge_console + var/obj/mecha/recharging_mecha = null + /turf/simulated/floor/mech_bay_recharge_floor/airless icon_state = "recharge_floor_asteroid" oxygen = 0.01 nitrogen = 0.01 temperature = TCMB + +/turf/simulated/floor/mech_bay_recharge_floor/Destroy() + recharge_console.recharge_floor = null + recharge_port.recharge_floor = null + ..() + +/turf/simulated/floor/mech_bay_recharge_floor/Entered(var/obj/mecha/mecha) + . = ..() + if(istype(mecha)) + mecha.occupant_message("Initializing power control devices.") + init_devices() + if(recharge_console && recharge_port) + recharging_mecha = mecha + recharge_console.mecha_in(mecha) + return + else if(!recharge_console) + mecha.occupant_message("Control console not found. Terminating.") + else if(!recharge_port) + mecha.occupant_message("Power port not found. Terminating.") + return + +/turf/simulated/floor/mech_bay_recharge_floor/Exited(atom) + . = ..() + if(atom == recharging_mecha) + recharging_mecha = null + if(recharge_console) + recharge_console.mecha_out() + return + +/turf/simulated/floor/mech_bay_recharge_floor/proc/init_devices() + if(!recharge_console) + recharge_console = locate() in range(1,src) + if(!recharge_port) + recharge_port = locate() in get_step(src, WEST) + + if(recharge_console) + recharge_console.recharge_floor = src + if(recharge_port) + recharge_console.recharge_port = recharge_port + if(recharge_port) + recharge_port.recharge_floor = src + if(recharge_console) + recharge_port.recharge_console = recharge_console + return + +/* // temporary fix for broken icon until somebody gets around to make these player-buildable +/turf/simulated/floor/mech_bay_recharge_floor/attackby(obj/item/C as obj, mob/user as mob) + ..() + if(floor_type) + icon_state = "recharge_floor" + else + icon_state = "support_lattice" */ /obj/machinery/mech_bay_recharge_port name = "Mech Bay Power Port" density = 1 anchored = 1 - dir = 4 + dir = EAST icon = 'icons/mecha/mech_bay.dmi' icon_state = "recharge_port" - var/obj/mecha/recharging_mech + var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor var/obj/machinery/computer/mech_bay_power_console/recharge_console - var/max_charge = 50 - var/on = 0 - var/repairability = 0 - var/turf/recharging_turf = null + var/datum/global_iterator/mech_bay_recharger/pr_recharger /obj/machinery/mech_bay_recharge_port/New() ..() component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/mech_recharger(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) - component_parts += new /obj/item/stack/cable_coil(src, 1) + component_parts += new /obj/item/weapon/circuitboard/mech_recharger(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() - locate_recharge_turf() + + pr_recharger = new /datum/global_iterator/mech_bay_recharger(null,0) /obj/machinery/mech_bay_recharge_port/upgraded/New() ..() component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/mech_recharger(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src) - component_parts += new /obj/item/stack/cable_coil(src, 1) + component_parts += new /obj/item/weapon/circuitboard/mech_recharger(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() -/obj/machinery/mech_bay_recharge_port/proc/locate_recharge_turf() - recharging_turf = get_step(loc, dir) - /obj/machinery/mech_bay_recharge_port/RefreshParts() var/MC for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) MC += C.rating - max_charge = MC * 25 - -/obj/machinery/mech_bay_recharge_port/process() - if(stat & NOPOWER || !recharge_console) - return - if(!recharging_mech) - recharging_mech = locate(/obj/mecha) in recharging_turf - if(recharging_mech) - recharge_console.update_icon() - if(recharging_mech && recharging_mech.cell) - if(recharging_mech.cell.charge < recharging_mech.cell.maxcharge) - var/delta = min(max_charge, recharging_mech.cell.maxcharge - recharging_mech.cell.charge) - recharging_mech.give_power(delta) - use_power(delta*150) - else - recharge_console.update_icon() - if(recharging_mech.loc != recharging_turf) - recharging_mech = null - recharge_console.update_icon() - - + pr_recharger.max_charge = MC * 10 + recharge_console.voltage = MC * 10 + +/obj/machinery/mech_bay_recharge_port/Destroy() + recharge_console.recharge_port = null + recharge_floor.recharge_port = null + ..() + /obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "recharge_port-o", "recharge_port", I)) return if(default_change_direction_wrench(user, I)) - locate_recharge_turf() return if(exchange_parts(user, I)) return default_deconstruction_crowbar(I) + +/obj/machinery/mech_bay_recharge_port/proc/start_charge(var/obj/mecha/recharging_mecha) + if(stat&(NOPOWER|BROKEN)) + recharging_mecha.occupant_message("Power port not responding. Terminating.") + return 0 + else + if(recharging_mecha.cell) + recharging_mecha.occupant_message("Now charging...") + pr_recharger.start(list(src,recharging_mecha)) + return 1 + else + return 0 + +/obj/machinery/mech_bay_recharge_port/proc/stop_charge() + if(recharge_console && !recharge_console.stat) + update_icon() + pr_recharger.stop() + return + +/obj/machinery/mech_bay_recharge_port/proc/active() + if(pr_recharger.active()) + return 1 + else + return 0 + + +/obj/machinery/mech_bay_recharge_port/power_change() + if(powered()) + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + stat |= NOPOWER + pr_recharger.stop() + return + +/obj/machinery/mech_bay_recharge_port/proc/set_voltage(new_voltage) + if(new_voltage && isnum(new_voltage)) + pr_recharger.max_charge = new_voltage + return 1 + else + return 0 + +/datum/global_iterator/mech_bay_recharger + delay = 20 + var/max_charge = 50 + check_for_null = 0 //since port.stop_charge() must be called. The checks are made in process() + +/datum/global_iterator/mech_bay_recharger/process(var/obj/machinery/mech_bay_recharge_port/port, var/obj/mecha/mecha) + if(!port) + return 0 + if(mecha && mecha in port.recharge_floor) + if(!mecha.cell) + return + var/delta = min(max_charge, mecha.cell.maxcharge - mecha.cell.charge) + if(delta>0) + mecha.give_power(delta) + port.use_power(delta*150) + else + mecha.occupant_message("Fully charged.") + port.stop_charge() + else + port.stop_charge() + return /obj/machinery/computer/mech_bay_power_console name = "Mech Bay Power Control Console" - desc = "Used to control mechbay power ports." density = 1 anchored = 1 icon = 'icons/obj/computer.dmi' icon_keyboard = "tech_key" icon_screen = "recharge_comp" - light_color = LIGHT_COLOR_FADEDPURPLE + light_color = "#a97faa" circuit = /obj/item/weapon/circuitboard/mech_bay_power_console + var/autostart = 1 + var/voltage = 50 + var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor var/obj/machinery/mech_bay_recharge_port/recharge_port + +/obj/machinery/computer/mech_bay_power_console/Destroy() + recharge_port.recharge_console = null + recharge_floor.recharge_console = null + ..() -/obj/machinery/computer/mech_bay_power_console/attack_ai(mob/user) - return interact(user) - -/obj/machinery/computer/mech_bay_power_console/attack_hand(mob/user) - if(..()) +/obj/machinery/computer/mech_bay_power_console/proc/mecha_in(var/obj/mecha/mecha) + if(stat&(NOPOWER|BROKEN)) + mecha.occupant_message("Control console not responding. Terminating...") return - interact(user) - -/obj/machinery/computer/mech_bay_power_console/interact(mob/user) - var/data - if(!recharge_port) - data += "