From eca72b69aa7427d24da5a65398f00dee032d104f Mon Sep 17 00:00:00 2001 From: "giacomand@gmail.com" Date: Sun, 16 Dec 2012 19:51:23 +0000 Subject: [PATCH] -Added constructable solar arrays. -Added a solar pack crate to order. -Machines that have a use_power of 0 will no longer be turned off due to lack of power in the area. -Fixed a bug with the solar computer not reconnecting to the powernet when dismantled and remantled. -Increased the cap of crates to 30. -Some performance tweaks. -Some standardization. -All objects of type /obj/machinery/power will try to disconnect from the powernet before deleting, this will help reduce the node list size. -Added a heat_proof variable for doors. It will effect glass airlocks and it'll determine whether they can block heat or not. Research glass airlocks will always have it enabled. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5344 316c924e-a436-60f5-8080-3fe189b3f50e --- code/__HELPERS/unsorted.dm | 5 + code/datums/sun.dm | 17 +- code/datums/supplypacks.dm | 30 ++ code/game/machinery/doors/airlock.dm | 17 +- .../machinery/doors/airlock_electronics.dm | 2 +- .../structures/crates_lockers/closets.dm | 2 +- code/modules/power/port_gen.dm | 68 ++- code/modules/power/power.dm | 7 + code/modules/power/smes.dm | 1 + code/modules/power/solar.dm | 508 +++++++++++------- code/modules/power/tracker.dm | 40 +- html/changelog.html | 8 +- 12 files changed, 444 insertions(+), 261 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index bd82753d59b..48de32b4758 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1256,6 +1256,11 @@ var/global/list/common_tools = list( return 1 return 0 +/proc/iswire(O) + if(istype(O, /obj/item/weapon/cable_coil)) + return 1 + return 0 + proc/is_hot(obj/item/W as obj) switch(W.type) if(/obj/item/weapon/weldingtool) diff --git a/code/datums/sun.dm b/code/datums/sun.dm index e26517c8810..47355c2f64f 100644 --- a/code/datums/sun.dm +++ b/code/datums/sun.dm @@ -41,12 +41,19 @@ dy = c / abs(s) - for(var/obj/machinery/power/tracker/T in machines) - T.set_angle(angle) + for(var/M in machines) + + // Solar Tracker + if(istype(M, /obj/machinery/power/tracker)) + var/obj/machinery/power/tracker/T = M + T.set_angle(angle) + + // Solar Panel + else if(istype(M, /obj/machinery/power/solar)) + var/obj/machinery/power/solar/S = M + if(S.control) + occlusion(S) - for(var/obj/machinery/power/solar/S in machines) - if(S.control) - occlusion(S) // for a solar panel, trace towards sun to see if we're in shadow diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 18b83717c0a..cf0be27646a 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -364,6 +364,36 @@ containertype = /obj/structure/largecrate containername = "fuel tank crate" +/datum/supply_packs/solar + name = "Solar Pack crate" + contains = list(/obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, // 21 Solar Assemblies. 1 Extra for the controller + /obj/item/weapon/circuitboard/solar_control, + /obj/item/weapon/tracker_electronics, + /obj/item/weapon/paper/solar) + cost = 20 + containertype = /obj/structure/closet/crate + containername = "solar pack crate" + /datum/supply_packs/engine name = "Emitter crate" contains = list(/obj/machinery/emitter, diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b6c0e64fe18..0d670fc755c 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -92,6 +92,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. normalspeed = 1 var/obj/item/weapon/airlock_electronics/electronics = null var/hasShocked = 0 //Prevents multiple shocks from happening + var/heat_proof = 0 // For glass airlocks /obj/machinery/door/airlock/command name = "Airlock" @@ -216,14 +217,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. opacity = 0 doortype = 21 glass = 1 - - -/obj/machinery/door/airlock/update_heat_protection(var/turf/simulated/source) - if(istype(source)) - if(src.density) - source.thermal_conductivity = DOOR_HEAT_TRANSFER_COEFFICIENT - else - source.thermal_conductivity = initial(source.thermal_conductivity) + heat_proof = 1 /obj/machinery/door/airlock/glass_mining name = "Maintenance Hatch" @@ -639,6 +633,13 @@ About the new airlock wires panel: return 0 +/obj/machinery/door/airlock/update_heat_protection(var/turf/simulated/source) + if(istype(source)) + if(src.density && (src.opacity || src.heat_proof)) + source.thermal_conductivity = DOOR_HEAT_TRANSFER_COEFFICIENT + else + source.thermal_conductivity = initial(source.thermal_conductivity) + /obj/machinery/door/airlock/update_icon() if(overlays) overlays = null if(density) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 6a57e7cc5ed..2310e85c07c 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -1,7 +1,7 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 /obj/item/weapon/airlock_electronics - name = "Airlock Electronics" + name = "airlock electronics" icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" w_class = 2.0 //It should be tiny! -Agouri diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index f360d942fd4..c6bce45ebb2 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -12,7 +12,7 @@ var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 var/lastbang - var/storage_capacity = 20 //This is so that someone can't pack hundreds of items in a locker/crate + var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate //then open it in a populated area to crash clients. /obj/structure/closet/New() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 7ef8626512b..423fd04bf5c 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -57,44 +57,42 @@ display round(lastgen) and plasmatank amount var/recent_fault = 0 var/power_output = 1 - proc/HasFuel() //Placeholder for fuel check. - return 1 +/obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check. + return 1 - proc/UseFuel() //Placeholder for fuel use. +/obj/machinery/power/port_gen/proc/UseFuel() //Placeholder for fuel use. + return + +/obj/machinery/power/port_gen/proc/handleInactive() + return + +/obj/machinery/power/port_gen/process() + if(active && HasFuel() && !crit_fail && anchored) + if(prob(reliability)) + add_avail(power_gen * power_output) + else if(!recent_fault) + recent_fault = 1 + else crit_fail = 1 + UseFuel() + src.updateDialog() + + else + active = 0 + icon_state = initial(icon_state) + handleInactive() + +/obj/machinery/power/port_gen/attack_hand(mob/user as mob) + if(..()) + return + if(!anchored) return - proc/handleInactive() - return - - process() - if(active && HasFuel() && !crit_fail && anchored) - if(prob(reliability)) - add_avail(power_gen * power_output) - else if(!recent_fault) - recent_fault = 1 - else crit_fail = 1 - UseFuel() - for(var/mob/M in viewers(1, src)) - if (M.client && M.machine == src) - src.updateUsrDialog() - - else - active = 0 - icon_state = initial(icon_state) - handleInactive() - - attack_hand(mob/user as mob) - if(..()) - return - if(!anchored) - return - - examine() - set src in oview(1) - if(active) - usr << "\blue The generator is on." - else - usr << "\blue The generator is off." +/obj/machinery/power/port_gen/examine() + set src in oview(1) + if(active) + usr << "\blue The generator is on." + else + usr << "\blue The generator is off." /obj/machinery/power/port_gen/pacman name = "P.A.C.M.A.N.-type Portable Generator" diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 8fff49211e6..0d74119f2e0 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -9,6 +9,10 @@ idle_power_usage = 0 active_power_usage = 0 +/obj/machinery/power/Del() + disconnect_from_network() + ..() + // common helper procs for all power machines /obj/machinery/power/proc/add_avail(var/amount) if(powernet) @@ -38,6 +42,9 @@ if(!src.loc) return 0 + if(!use_power) + return 1 + var/area/A = src.loc.loc // make sure it's in an area if(!A || !isarea(A) || !A.master) return 0 // if not, then not powered diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index fed1cb5e7f4..8c2b91d4563 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -10,6 +10,7 @@ icon_state = "smes" density = 1 anchored = 1 + use_power = 0 var/output = 50000 var/lastout = 0 var/loaddemand = 0 diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 49e10ad35dc..1d09cf7d265 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -1,5 +1,6 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 +#define SOLAR_MAX_DIST 50 #define SOLARGENRATE 1500 /obj/machinery/power/solar name = "solar panel" @@ -12,8 +13,8 @@ use_power = 0 idle_power_usage = 0 active_power_usage = 0 + var/id = 0 var/health = 10 - var/id = 1 var/obscured = 0 var/sunfrac = 0 var/adir = SOUTH @@ -21,25 +22,35 @@ var/turn_angle = 0 var/obj/machinery/power/solar_control/control = null - -/obj/machinery/power/solar/New() - ..() - spawn(10) - updateicon() - update_solar_exposure() - if(powernet) - for(var/obj/machinery/power/solar_control/SC in powernet.nodes) - if(SC.id == id) - control = SC +/obj/machinery/power/solar/New(var/turf/loc, var/obj/item/solar_assembly/S) + ..(loc) + if(!S) + S = new /obj/item/solar_assembly(src) + S.glass_type = /obj/item/stack/sheet/glass + S.anchored = 1 + S.loc = src + update_icon() + connect_to_network() /obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user) - ..() - if (W) + + if(iscrowbar(W)) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + if(do_after(user, 50)) + var/obj/item/solar_assembly/S = locate() in src + if(S) + S.loc = src.loc + S.give_glass() + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + user.visible_message("[user] takes the glass off the solar panel.") + del(src) + return + else if (W) src.add_fingerprint(user) src.health -= W.force src.healthcheck() - return + ..() /obj/machinery/power/solar/blob_act() @@ -60,7 +71,8 @@ return -/obj/machinery/power/solar/proc/updateicon() +/obj/machinery/power/solar/update_icon() + ..() overlays = null if(stat & BROKEN) overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER) @@ -95,15 +107,14 @@ control.gen += sgen if(adir != ndir) - spawn(10+rand(0,15)) - adir = (360+adir+dd_range(-10,10,ndir-adir))%360 - updateicon() - update_solar_exposure() + adir = (360+adir+dd_range(-10,10,ndir-adir))%360 + update_icon() + update_solar_exposure() /obj/machinery/power/solar/proc/broken() stat |= BROKEN - updateicon() + update_icon() return @@ -145,7 +156,79 @@ return +// +// Solar Assembly - For construction of solar arrays. +// +/obj/item/solar_assembly + name = "solar panel assembly" + desc = "A solar panel assembly kit, allows constructions of a solar panel, or with a tracking circuit board, a solar tracker" + icon = 'icons/obj/power.dmi' + icon_state = "sp_base" + item_state = "electropack" + w_class = 4 // Pretty big! + anchored = 0 + var/tracker = 0 + var/glass_type = null + +/obj/item/solar_assembly/attack_hand(var/mob/user) + if(!anchored && isturf(loc)) // You can't pick it up + ..() + +// Give back the glass type we were supplied with +/obj/item/solar_assembly/proc/give_glass() + if(glass_type) + var/obj/item/stack/sheet/S = new glass_type(src.loc) + S.amount = 2 + glass_type = null + + +/obj/item/solar_assembly/attackby(var/obj/item/weapon/W, var/mob/user) + + if(!anchored && isturf(loc)) + if(iswrench(W)) + anchored = 1 + user.visible_message("[user] wrenches the solar assembly into place.") + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + return 1 + else + if(iswrench(W)) + anchored = 0 + user.visible_message("[user] unwrenches the solar assembly from it's place.") + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + return 1 + + if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass)) + var/obj/item/stack/sheet/S = W + if(S.amount >= 2) + glass_type = W.type + S.use(2) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + user.visible_message("[user] places the glass on the solar assembly.") + if(tracker) + new /obj/machinery/power/tracker(get_turf(src), src) + else + new /obj/machinery/power/solar(get_turf(src), src) + return 1 + + if(!tracker) + if(istype(W, /obj/item/weapon/tracker_electronics)) + tracker = 1 + user.drop_item() + del(W) + user.visible_message("[user] inserts the electronics into the solar assembly.") + return 1 + else + if(iscrowbar(W)) + new /obj/item/weapon/tracker_electronics(src.loc) + tracker = 0 + user.visible_message("[user] takes out the electronics from the solar assembly.") + return 1 + ..() + +// +// Solar Control Computer +// /obj/machinery/power/solar_control name = "solar panel control" @@ -158,7 +241,7 @@ use_power = 1 idle_power_usage = 5 active_power_usage = 20 - var/id = 1 + var/id = 0 var/cdir = 0 var/gen = 0 var/lastgen = 0 @@ -166,227 +249,236 @@ var/trackrate = 600 // 300-900 seconds var/trackdir = 1 // 0 =CCW, 1=CW var/nexttime = 0 - proc - updateicon() - tracker_update(var/angle) - set_panels(var/cdir) - broken() - New() - ..() - spawn(15) - if(!powernet) return - for(var/obj/machinery/power/solar/S in powernet.nodes) - if(S.id != id) continue - cdir = S.adir//The hell is this even doing? - S.control = src - updateicon() +/obj/machinery/power/solar_control/New() + ..() + if(ticker) + initialize() + connect_to_network() - updateicon() - if(stat & BROKEN) - icon_state = "broken" - overlays = null - return - if(stat & NOPOWER) - icon_state = "c_unpowered" - overlays = null - return - icon_state = "solar" +/obj/machinery/power/solar_control/initialize() + ..() + if(!powernet) return + for(var/obj/machinery/power/solar/S in powernet.nodes) + if(get_dist(S, src) < SOLAR_MAX_DIST) + cdir = S.adir//The hell is this even doing? + S.control = src + update_icon() + + +/obj/machinery/power/solar_control/update_icon() + if(stat & BROKEN) + icon_state = "broken" overlays = null - if(cdir > 0) - overlays += image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir)) + return + if(stat & NOPOWER) + icon_state = "c_unpowered" + overlays = null + return + icon_state = "solar" + overlays = null + if(cdir > 0) + overlays += image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir)) + return + + +/obj/machinery/power/solar_control/attack_ai(mob/user) + add_fingerprint(user) + if(stat & (BROKEN | NOPOWER)) return + interact(user) + + +/obj/machinery/power/solar_control/attack_hand(mob/user) + add_fingerprint(user) + if(stat & (BROKEN | NOPOWER)) return + interact(user) + + +/obj/machinery/power/solar_control/attackby(I as obj, user as mob) + if(istype(I, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if (src.stat & BROKEN) + user << "\blue The broken glass falls out." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + new /obj/item/weapon/shard( src.loc ) + var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 3 + A.icon_state = "3" + A.anchored = 1 + del(src) + else + user << "\blue You disconnect the monitor." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 4 + A.icon_state = "4" + A.anchored = 1 + del(src) + else + src.attack_hand(user) + return + + +/obj/machinery/power/solar_control/process() + lastgen = gen + gen = 0 + + if(stat & (NOPOWER | BROKEN)) return + use_power(250) + if(track==1 && nexttime < world.timeofday && trackrate) + nexttime = world.timeofday + 3600/abs(trackrate) + cdir = (cdir+trackrate/abs(trackrate)+360)%360 + set_panels(cdir) + update_icon() - attack_ai(mob/user) - add_fingerprint(user) - if(stat & (BROKEN | NOPOWER)) return - interact(user) - - - attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN | NOPOWER)) return - interact(user) - - - attackby(I as obj, user as mob) - if(istype(I, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - new /obj/item/weapon/shard( src.loc ) - var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src) - else - src.attack_hand(user) - return - - - process() - lastgen = gen - gen = 0 - - if(stat & (NOPOWER | BROKEN)) - return - - use_power(250) - if(track==1 && nexttime < world.timeofday && trackrate) - nexttime = world.timeofday + 3600/abs(trackrate) - cdir = (cdir+trackrate/abs(trackrate)+360)%360 - set_panels(cdir) - updateicon() - - src.updateDialog() + src.updateDialog() // called by solar tracker when sun position changes - tracker_update(var/angle) - if(track != 2 || stat & (NOPOWER | BROKEN)) +/obj/machinery/power/solar_control/proc/tracker_update(var/angle) + if(track != 2 || stat & (NOPOWER | BROKEN)) + return + cdir = angle + set_panels(cdir) + update_icon() + src.updateDialog() + + +/obj/machinery/power/solar_control/interact(mob/user) + if(stat & (BROKEN | NOPOWER)) return + if ( (get_dist(src, user) > 1 )) + if (!istype(user, /mob/living/silicon/ai)) + user.unset_machine() + user << browse(null, "window=solcon") return - cdir = angle - set_panels(cdir) - updateicon() - src.updateDialog() + + add_fingerprint(user) + user.set_machine(src) + + var/t = "Solar Generator Control
"
+	t += "Generated power : [round(lastgen)] W

" + t += "Orientation: [rate_control(src,"cdir","[cdir]°",1,15)] ([angle2text(cdir)])


" + t += "



" + t += "Tracking: " + switch(track) + if(0) + t += "Off Timed Auto
" + if(1) + t += "Off Timed Auto
" + if(2) + t += "Off Timed Auto
" + + t += "Tracking Rate: [rate_control(src,"tdir","[trackrate] deg/h ([trackrate<0 ? "CCW" : "CW"])",5,30,180)]

" + t += "Close
" + user << browse(t, "window=solcon") + onclose(user, "solcon") + return - interact(mob/user) - if(stat & (BROKEN | NOPOWER)) return - if ( (get_dist(src, user) > 1 )) - if (!istype(user, /mob/living/silicon/ai)) - user.unset_machine() - user << browse(null, "window=solcon") - return - - add_fingerprint(user) - user.set_machine(src) - - var/t = "Solar Generator Control
"
-		t += "Generated power : [round(lastgen)] W

" - t += "Orientation: [rate_control(src,"cdir","[cdir]°",1,15)] ([angle2text(cdir)])


" - t += "



" - t += "Tracking: " - switch(track) - if(0) - t += "Off Timed Auto
" - if(1) - t += "Off Timed Auto
" - if(2) - t += "Off Timed Auto
" - - t += "Tracking Rate: [rate_control(src,"tdir","[trackrate] deg/h ([trackrate<0 ? "CCW" : "CW"])",5,30,180)]

" - t += "Close
" - user << browse(t, "window=solcon") - onclose(user, "solcon") +/obj/machinery/power/solar_control/Topic(href, href_list) + if(..()) + usr << browse(null, "window=solcon") + usr.unset_machine() + return + if(href_list["close"] ) + usr << browse(null, "window=solcon") + usr.unset_machine() return + if(href_list["dir"]) + cdir = text2num(href_list["dir"]) + set_panels(cdir) + update_icon() - Topic(href, href_list) - if(..()) - usr << browse(null, "window=solcon") - usr.unset_machine() - return - if(href_list["close"] ) - usr << browse(null, "window=solcon") - usr.unset_machine() - return - - if(href_list["dir"]) - cdir = text2num(href_list["dir"]) + if(href_list["rate control"]) + if(href_list["cdir"]) + src.cdir = dd_range(0,359,(360+src.cdir+text2num(href_list["cdir"]))%360) spawn(1) set_panels(cdir) - updateicon() - - if(href_list["rate control"]) - if(href_list["cdir"]) - src.cdir = dd_range(0,359,(360+src.cdir+text2num(href_list["cdir"]))%360) - spawn(1) - set_panels(cdir) - updateicon() - if(href_list["tdir"]) - src.trackrate = dd_range(-7200,7200,src.trackrate+text2num(href_list["tdir"])) - if(src.trackrate) nexttime = world.timeofday + 3600/abs(trackrate) - - if(href_list["track"]) + update_icon() + if(href_list["tdir"]) + src.trackrate = dd_range(-7200,7200,src.trackrate+text2num(href_list["tdir"])) if(src.trackrate) nexttime = world.timeofday + 3600/abs(trackrate) - track = text2num(href_list["track"]) - if(powernet && (track == 2)) - var/obj/machinery/power/tracker/T = locate() in powernet.nodes - if(T) - cdir = T.sun_angle - set_panels(cdir) - updateicon() - src.updateUsrDialog() - return + if(href_list["track"]) + if(src.trackrate) nexttime = world.timeofday + 3600/abs(trackrate) + track = text2num(href_list["track"]) + if(powernet && (track == 2)) + var/obj/machinery/power/tracker/T = locate() in powernet.nodes + if(T) + cdir = T.sun_angle + + set_panels(cdir) + update_icon() + src.updateUsrDialog() + return - set_panels(var/cdir) - if(!powernet) return - for(var/obj/machinery/power/solar/S in powernet.nodes) - if(S.id != id) continue +/obj/machinery/power/solar_control/proc/set_panels(var/cdir) + if(!powernet) return + for(var/obj/machinery/power/solar/S in powernet.nodes) + if(get_dist(S, src) < SOLAR_MAX_DIST) if(!S.control) S.control = src S.ndir = cdir - power_change() - if(powered()) - stat &= ~NOPOWER - updateicon() - else - spawn(rand(0, 15)) - stat |= NOPOWER - updateicon() +/obj/machinery/power/solar_control/power_change() + if(powered()) + stat &= ~NOPOWER + update_icon() + else + spawn(rand(0, 15)) + stat |= NOPOWER + update_icon() +/obj/machinery/power/solar_control/proc/broken() + stat |= BROKEN + update_icon() + + +/obj/machinery/power/solar_control/meteorhit() broken() - stat |= BROKEN - updateicon() + return - meteorhit() +/obj/machinery/power/solar_control/ex_act(severity) + switch(severity) + if(1.0) + //SN src = null + del(src) + return + if(2.0) + if (prob(50)) + broken() + if(3.0) + if (prob(25)) + broken() + return + + +/obj/machinery/power/solar_control/blob_act() + if (prob(75)) broken() - return + src.density = 0 - ex_act(severity) - switch(severity) - if(1.0) - //SN src = null - del(src) - return - if(2.0) - if (prob(50)) - broken() - if(3.0) - if (prob(25)) - broken() - return +// +// MISC +// - - blob_act() - if (prob(75)) - broken() - src.density = 0 +/obj/item/weapon/paper/solar + name = "paper- 'Going green! Setup your own solar array instructions.'" + info = "

Welcome

At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.

You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!.

Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.

Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.

That's all to it, be safe, be green!

" diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 9c9f1398a38..307c592e5c2 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -14,6 +14,15 @@ var/sun_angle = 0 // sun angle as set by sun datum +/obj/machinery/power/tracker/New(var/turf/loc, var/obj/item/solar_assembly/S) + ..(loc) + if(!S) + S = new /obj/item/solar_assembly(src) + S.glass_type = /obj/item/stack/sheet/glass + S.tracker = 1 + S.anchored = 1 + S.loc = src + connect_to_network() // called by datum/sun/calc_position() as sun's angle changes /obj/machinery/power/tracker/proc/set_angle(var/angle) @@ -31,12 +40,29 @@ // ***TODO: better communication system using network if(powernet) for(var/obj/machinery/power/solar_control/C in powernet.nodes) - C.tracker_update(angle) + if(get_dist(C, src) < SOLAR_MAX_DIST) + C.tracker_update(angle) +/obj/machinery/power/tracker/attackby(var/obj/item/weapon/W, var/mob/user) + + if(iscrowbar(W)) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + if(do_after(user, 50)) + var/obj/item/solar_assembly/S = locate() in src + if(S) + S.loc = src.loc + S.give_glass() + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + user.visible_message("[user] takes the glass off the tracker.") + del(src) + return + ..() + // timed process // make sure we can draw power from the powernet /obj/machinery/power/tracker/process() + var/avail = surplus() if(avail > 500) @@ -47,4 +73,14 @@ // override power change to do nothing since we don't care about area power /obj/machinery/power/tracker/power_change() - return \ No newline at end of file + return + + +// Tracker Electronic + +/obj/item/weapon/tracker_electronics + + name = "tracker electronics" + icon = 'icons/obj/doors/door_assembly.dmi' + icon_state = "door_electronics" + w_class = 2.0 \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 98b6c56cae1..f665d099b1c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -48,7 +48,13 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit tho. Thanks. --> - +
+

16 December 2012

+

Giacom updated:

+
    +
  • You can now create your own solar arrays! Order the solar pack crate and you'll receive 21 solar assemblies, 1 electronic which you can put into an assembly to make it a solar tracker and finally the solar computer circuit board. You will get more detailed instructions in the crate, on a piece of paper.
  • +
+

15 December 2012

Ikarrus updated: