//Baseline portable generator. Has all the default handling. Not intended to be used on it's own (since it generates unlimited power). /obj/machinery/power/port_gen name = "portable generator" desc = "A portable generator for emergency backup power." icon = 'icons/obj/power.dmi' icon_state = "portgen0_0" density = TRUE anchored = FALSE use_power = NO_POWER_USE var/active = 0 var/power_gen = 5000 var/recent_fault = 0 var/power_output = 1 var/consumption = 0 var/base_icon = "portgen0" var/datum/looping_sound/generator/soundloop interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_REQUIRES_ANCHORED /obj/machinery/power/port_gen/Initialize() . = ..() soundloop = new(list(src), active) /obj/machinery/power/port_gen/Destroy() QDEL_NULL(soundloop) return ..() /obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check. return 1 /obj/machinery/power/port_gen/proc/UseFuel() //Placeholder for fuel use. return /obj/machinery/power/port_gen/proc/DropFuel() return /obj/machinery/power/port_gen/proc/handleInactive() return /obj/machinery/power/port_gen/update_icon() icon_state = "[base_icon]_[active]" /obj/machinery/power/port_gen/process() if(active && HasFuel() && !crit_fail && anchored && powernet) add_avail(power_gen * power_output) UseFuel() src.updateDialog() soundloop.start() else active = 0 handleInactive() update_icon() soundloop.stop() /obj/machinery/power/port_gen/examine(mob/user) ..() to_chat(user, "It is[!active?"n't":""] running.") /obj/machinery/power/port_gen/pacman name = "\improper P.A.C.M.A.N.-type portable generator" circuit = /obj/item/circuitboard/machine/pacman var/sheets = 0 var/max_sheets = 100 var/sheet_name = "" var/sheet_path = /obj/item/stack/sheet/mineral/plasma var/sheet_left = 0 // How much is left of the sheet var/time_per_sheet = 260 var/current_heat = 0 /obj/machinery/power/port_gen/pacman/Initialize() . = ..() if(anchored) connect_to_network() /obj/machinery/power/port_gen/pacman/Initialize() . = ..() var/obj/sheet = new sheet_path(null) sheet_name = sheet.name /obj/machinery/power/port_gen/pacman/Destroy() DropFuel() return ..() /obj/machinery/power/port_gen/pacman/RefreshParts() var/temp_rating = 0 var/consumption_coeff = 0 for(var/obj/item/stock_parts/SP in component_parts) if(istype(SP, /obj/item/stock_parts/matter_bin)) max_sheets = SP.rating * SP.rating * 50 else if(istype(SP, /obj/item/stock_parts/capacitor)) temp_rating += SP.rating else consumption_coeff += SP.rating power_gen = round(initial(power_gen) * temp_rating * 2) consumption = consumption_coeff /obj/machinery/power/port_gen/pacman/examine(mob/user) ..() to_chat(user, "The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle.") if(crit_fail) to_chat(user, "The generator seems to have broken down.") /obj/machinery/power/port_gen/pacman/HasFuel() if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) return 1 return 0 /obj/machinery/power/port_gen/pacman/DropFuel() if(sheets) new sheet_path(drop_location(), sheets) sheets = 0 /obj/machinery/power/port_gen/pacman/UseFuel() var/needed_sheets = 1 / (time_per_sheet * consumption / power_output) var/temp = min(needed_sheets, sheet_left) needed_sheets -= temp sheet_left -= temp sheets -= round(needed_sheets) needed_sheets -= round(needed_sheets) if (sheet_left <= 0 && sheets > 0) sheet_left = 1 - needed_sheets sheets-- var/lower_limit = 56 + power_output * 10 var/upper_limit = 76 + power_output * 10 var/bias = 0 if (power_output > 4) upper_limit = 400 bias = power_output - consumption * (4 - consumption) if (current_heat < lower_limit) current_heat += 4 - consumption else current_heat += rand(-7 + bias, 7 + bias) if (current_heat < lower_limit) current_heat = lower_limit if (current_heat > upper_limit) current_heat = upper_limit if (current_heat > 300) overheat() qdel(src) return /obj/machinery/power/port_gen/pacman/handleInactive() if (current_heat > 0) current_heat = max(current_heat - 2, 0) src.updateDialog() /obj/machinery/power/port_gen/pacman/proc/overheat() explosion(src.loc, 2, 5, 2, -1) /obj/machinery/power/port_gen/pacman/attackby(obj/item/O, mob/user, params) if(istype(O, sheet_path)) var/obj/item/stack/addstack = O var/amount = min((max_sheets - sheets), addstack.amount) if(amount < 1) to_chat(user, "The [src.name] is full!") return to_chat(user, "You add [amount] sheets to the [src.name].") sheets += amount addstack.use(amount) updateUsrDialog() return else if(!active) if(istype(O, /obj/item/wrench)) if(!anchored && !isinspace()) connect_to_network() to_chat(user, "You secure the generator to the floor.") anchored = TRUE else if(anchored) disconnect_from_network() to_chat(user, "You unsecure the generator from the floor.") anchored = FALSE playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) return else if(istype(O, /obj/item/screwdriver)) panel_open = !panel_open O.play_tool_sound(src) if(panel_open) to_chat(user, "You open the access panel.") else to_chat(user, "You close the access panel.") return else if(default_deconstruction_crowbar(O)) return return ..() /obj/machinery/power/port_gen/pacman/emag_act(mob/user) if(obj_flags & EMAGGED) return obj_flags |= EMAGGED emp_act(EMP_HEAVY) /obj/machinery/power/port_gen/pacman/attack_ai(mob/user) interact(user) /obj/machinery/power/port_gen/pacman/attack_paw(mob/user) interact(user) /obj/machinery/power/port_gen/pacman/ui_interact(mob/user) . = ..() if (get_dist(src, user) > 1 ) if(!isAI(user)) user.unset_machine() user << browse(null, "window=port_gen") return var/dat = text("[name]
") if (active) dat += text("Generator: On
") else dat += text("Generator: Off
") dat += text("[capitalize(sheet_name)]: [sheets] - Eject
") var/stack_percent = round(sheet_left * 100, 1) dat += text("Current stack: [stack_percent]%
") dat += text("Power output: - [power_gen * power_output] +
") dat += text("Power current: [(powernet == null ? "Unconnected" : "[DisplayPower(avail())]")]
") dat += text("Heat: [current_heat]
") dat += "
Close" user << browse(dat, "window=port_gen") onclose(user, "port_gen") /obj/machinery/power/port_gen/pacman/Topic(href, href_list) if(..()) return src.add_fingerprint(usr) if(href_list["action"]) if(href_list["action"] == "enable") if(!active && HasFuel() && !crit_fail) active = 1 src.updateUsrDialog() update_icon() if(href_list["action"] == "disable") if (active) active = 0 src.updateUsrDialog() update_icon() if(href_list["action"] == "eject") if(!active) DropFuel() src.updateUsrDialog() if(href_list["action"] == "lower_power") if (power_output > 1) power_output-- src.updateUsrDialog() if (href_list["action"] == "higher_power") if (power_output < 4 || (obj_flags & EMAGGED)) power_output++ src.updateUsrDialog() if (href_list["action"] == "close") usr << browse(null, "window=port_gen") usr.unset_machine() /obj/machinery/power/port_gen/pacman/super name = "\improper S.U.P.E.R.P.A.C.M.A.N.-type portable generator" icon_state = "portgen1_0" base_icon = "portgen1" circuit = /obj/item/circuitboard/machine/pacman/super sheet_path = /obj/item/stack/sheet/mineral/uranium power_gen = 15000 time_per_sheet = 85 /obj/machinery/power/port_gen/pacman/super/overheat() explosion(src.loc, 3, 3, 3, -1) /obj/machinery/power/port_gen/pacman/mrs name = "\improper M.R.S.P.A.C.M.A.N.-type portable generator" base_icon = "portgen2" icon_state = "portgen2_0" circuit = /obj/item/circuitboard/machine/pacman/mrs sheet_path = /obj/item/stack/sheet/mineral/diamond power_gen = 40000 time_per_sheet = 80 /obj/machinery/power/port_gen/pacman/mrs/overheat() explosion(src.loc, 4, 4, 4, -1)