diff --git a/code/datums/sun.dm b/code/datums/sun.dm index 81e6a720600..c69369912c6 100644 --- a/code/datums/sun.dm +++ b/code/datums/sun.dm @@ -1,5 +1,3 @@ -/* - /datum/sun var/angle var/dx @@ -73,7 +71,6 @@ S.obscured = 0 // if hit the edge or stepped 20 times, not obscured S.update_solar_exposure() -*/ //returns the north-zero clockwise angle in degrees, given a direction diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm index cc08bced985..4fa0a665a04 100644 --- a/code/defines/obj/machinery.dm +++ b/code/defines/obj/machinery.dm @@ -515,6 +515,13 @@ density = 1 directwired = 1 var/health = 10.0 + var/id = 1 + var/obscured = 0 + var/sunfrac = 0 + var/adir = SOUTH + var/ndir = SOUTH + var/turn_angle = 0 + var/obj/machinery/power/solar_control/control use_power = 0 idle_power_usage = 0 active_power_usage = 0 diff --git a/code/game/cellautomata.dm b/code/game/cellautomata.dm index 472fb963be3..5e776224594 100644 --- a/code/game/cellautomata.dm +++ b/code/game/cellautomata.dm @@ -87,7 +87,7 @@ makepowernets() - //sun = new /datum/sun() --no, seriously, no sun. It's really retarded to have so many extra calculations take place for something that doesn't even do anything. -Errorage + sun = new /datum/sun() vote = new /datum/vote() diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm index 78632e4a624..884a1de5dca 100644 --- a/code/game/master_controller.dm +++ b/code/game/master_controller.dm @@ -79,7 +79,7 @@ datum/controller/game_controller sleep(1) - //sun.calc_position() + sun.calc_position() sleep(-1) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ccb92baf469..b8cd243ae78 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -26,26 +26,37 @@ var/obj/cable/NC = new(T) - var/color = "red" - if(coil.color) - color = coil.color - NC.color = coil.color - switch(color) - if("red") - NC.icon = 'power_cond_red.dmi' - if("yellow") - NC.icon = 'power_cond_yellow.dmi' - if("green") - NC.icon = 'power_cond_green.dmi' - if("blue") - NC.icon = 'power_cond_blue.dmi' + NC.cableColor(coil.color) NC.d1 = 0 NC.d2 = dirn NC.add_fingerprint() NC.updateicon() - NC.update_network() + + NC.mergeConnectedNetworks(NC.d2) + NC.mergeConnectedNetworksOnTurf() + if(netnum == 0 && NC.netnum == 0) + var/datum/powernet/PN = new() + + PN.number = powernets.len + 1 + powernets += PN + NC.netnum = PN.number + netnum = PN.number + PN.cables += NC + PN.nodes += src + powernet = PN + else if(netnum == 0) + netnum = NC.netnum + var/datum/powernet/PN = powernets[netnum] + powernet = PN + PN.nodes += src + NC.mergeConnectedNetworksOnTurf() + coil.use(1) + if (NC.shock(user, 50)) + if (prob(50)) //fail + new/obj/item/weapon/cable_coil(NC.loc, 1, NC.color) + del(NC) return else ..() @@ -134,8 +145,6 @@ else if(istype(W, /obj/item/weapon/cable_coil)) - if (shock(user, 50)) - return var/obj/item/weapon/cable_coil/coil = W coil.cable_join(src, user) @@ -297,29 +306,27 @@ var/obj/cable/C = new(F) - var/color_n = "red" - if(color) - color_n = color - C.color = color_n - switch(color) - if("red") - C.icon = 'power_cond_red.dmi' - if("yellow") - C.icon = 'power_cond_yellow.dmi' - if("green") - C.icon = 'power_cond_green.dmi' - if("blue") - C.icon = 'power_cond_blue.dmi' + C.cableColor(color) C.d1 = 0 C.d2 = dirn C.add_fingerprint(user) C.updateicon() - C.update_network() + + var/datum/powernet/PN = new() + PN.number = powernets.len + 1 + powernets += PN + C.netnum = PN.number + PN.cables += C + + C.mergeConnectedNetworks(C.d2) + C.mergeConnectedNetworksOnTurf() + + use(1) if (C.shock(user, 50)) - if (prob(50)) - new/obj/item/weapon/cable_coil(C.loc, C.d1 ? 2 : 1, C.color) + if (prob(50)) //fail + new/obj/item/weapon/cable_coil(C.loc, 1, C.color) del(C) //src.laying = 1 //last = C @@ -329,7 +336,6 @@ /obj/item/weapon/cable_coil/proc/cable_join(obj/cable/C, mob/user) - var/turf/U = user.loc if(!isturf(U)) return @@ -365,39 +371,30 @@ return var/obj/cable/NC = new(U) - - var/color_n = "red" - if(color) - color_n = color - NC.color = color_n - switch(color) - if("red") - NC.icon = 'power_cond_red.dmi' - if("yellow") - NC.icon = 'power_cond_yellow.dmi' - if("green") - NC.icon = 'power_cond_green.dmi' - if("blue") - NC.icon = 'power_cond_blue.dmi' + NC.cableColor(color) NC.d1 = 0 NC.d2 = fdirn NC.add_fingerprint() NC.updateicon() - NC.update_network() + + NC.netnum = C.netnum + var/datum/powernet/PN = powernets[C.netnum] + PN.cables += NC + NC.mergeConnectedNetworksOnTurf() use(1) if (NC.shock(user, 50)) - if (prob(50)) - new/obj/item/weapon/cable_coil(NC.loc, NC.d1 ? 2 : 1, NC.color) + if (prob(50)) //fail + new/obj/item/weapon/cable_coil(NC.loc, 1, NC.color) del(NC) return else if(C.d1 == 0) // exisiting cable doesn't point at our position, so see if it's a stub // if so, make it a full cable pointing from it's old direction to our dirn - var/nd1 = C.d2 // these will be the new directions var/nd2 = dirn + if(nd1 > nd2) // swap directions to match icons/states nd1 = dirn nd2 = C.d2 @@ -409,49 +406,166 @@ if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction user << "There's already a cable at that position." return - C.shock(user, 25) - del(C) - var/obj/cable/NC = new(T) - var/color_n = "red" - if(color) - color_n = color - NC.color = color_n - switch(color) - if("red") - NC.icon = 'power_cond_red.dmi' - if("yellow") - NC.icon = 'power_cond_yellow.dmi' - if("green") - NC.icon = 'power_cond_green.dmi' - if("blue") - NC.icon = 'power_cond_blue.dmi' - NC.d1 = nd1 - NC.d2 = nd2 - NC.add_fingerprint() - NC.updateicon() - NC.update_network() + C.cableColor(color) + + C.d1 = nd1 + C.d2 = nd2 + + C.add_fingerprint() + C.updateicon() + + + C.mergeConnectedNetworks(C.d1) + C.mergeConnectedNetworks(C.d2) use(1) - if (NC.shock(user, 50)) - if (prob(50)) - new/obj/item/weapon/cable_coil(NC.loc, NC.d1 ? 2 : 1, NC.color) - del(NC) + if (C.shock(user, 50)) + if (prob(50)) //fail + new/obj/item/weapon/cable_coil(C.loc, 2, C.color) + del(C) return +/obj/cable/proc/mergeConnectedNetworks(var/direction) + var/turf/TB + if((d1 == direction || d2 == direction) != 1) + return + TB = get_step(src, direction) -// called when a new cable is created -// can be 1 of 3 outcomes: -// 1. Isolated cable (or only connects to isolated machine) -> create new powernet -// 2. Joins to end or bridges loop of a single network (may also connect isolated machine) -> add to old network -// 3. Bridges gap between 2 networks -> merge the networks (must rebuild lists also) + for(var/obj/cable/TC in TB) + if(src == TC) + continue + var/fdir = (!direction)? 0 : turn(direction, 180) + if(TC.d1 == fdir || TC.d2 == fdir) -/obj/cable/proc/update_network() - // easy way: do /makepowernets again - makepowernets() - // do things more logically if this turns out to be too slow - // may just do this for case 3 anyway (simpler than refreshing list) + if(!netnum) + var/datum/powernet/PN = powernets[TC.netnum] + netnum = TC.netnum + PN = powernets[netnum] + PN.cables += src + continue + + if(TC.netnum != netnum) + var/datum/powernet/PN = powernets[netnum] + var/datum/powernet/TPN = powernets[TC.netnum] + var/kingNetnum = netnum + if(PN.cables.len + PN.nodes.len < TPN.cables.len + TPN.nodes.len) + kingNetnum = TC.netnum + var/datum/powernet/temp = PN + PN = TPN + TPN = temp + for(var/obj/cable/C in TPN.cables) + TPN.cables -= C + PN.cables += C + C.netnum = kingNetnum + for(var/obj/machinery/power/M in TPN.nodes) + if(M.netnum < 0) // APCs have netnum=-1 so they don't count as network nodes directly + continue + TPN.nodes -= M + PN.nodes += M + M.netnum = kingNetnum + M.powernet = powernets[M.netnum] + TC.netnum = kingNetnum + TPN.cables -= TC + PN.cables += TC + for(var/obj/machinery/power/M in TB) + if(!netnum) + if(!M.netnum) + continue + else + netnum = M.netnum + var/datum/powernet/PN = powernets[netnum] + PN.nodes += src + +/obj/cable/proc/mergeConnectedNetworksOnTurf() + var/turf/TB + TB = loc + + for(var/obj/cable/C in TB) + if(C == src) + continue + if(netnum == 0) + var/datum/powernet/PN = powernets[C.netnum] + netnum = C.netnum + PN.cables += src + continue + var/datum/powernet/PN = powernets[netnum] + var/datum/powernet/TPN = powernets[C.netnum] + var/kingNetnum = netnum + if(PN.cables.len + PN.nodes.len < TPN.cables.len + TPN.nodes.len) + kingNetnum = C.netnum + var/datum/powernet/temp = PN + PN = TPN + TPN = temp + + TPN.cables -= C + PN.cables += C + C.netnum = kingNetnum + for(var/obj/machinery/power/M in TB) + + if(M.netnum < 0) + continue + if(M.netnum == 0) + var/datum/powernet/PN = powernets[netnum] + PN.nodes += M + M.netnum = netnum + M.powernet = powernets[M.netnum] + + var/datum/powernet/PN = powernets[netnum] + var/datum/powernet/TPN = powernets[M.netnum] + var/kingNetnum = netnum + if(PN.cables.len + PN.nodes.len < TPN.cables.len + TPN.nodes.len) + kingNetnum = M.netnum + var/datum/powernet/temp = PN + PN = TPN + TPN = temp + + TPN.nodes -= M + PN.nodes += M + M.netnum = kingNetnum + M.powernet = powernets[M.netnum] + for(var/obj/machinery/power/apc/N in TB) + var/obj/machinery/power/M + M = N.terminal + + if(M.netnum == 0) + if(netnum == 0) + continue + var/datum/powernet/PN = powernets[netnum] + PN.nodes += M + M.netnum = netnum + M.powernet = powernets[M.netnum] + continue + + var/datum/powernet/PN = powernets[netnum] + var/datum/powernet/TPN = powernets[M.netnum] + var/kingNetnum = netnum + if(PN.cables.len + PN.nodes.len < TPN.cables.len + TPN.nodes.len) + kingNetnum = M.netnum + var/datum/powernet/temp = PN + PN = TPN + TPN = temp + + TPN.nodes -= M + PN.nodes += M + M.netnum = kingNetnum + M.powernet = powernets[M.netnum] + +obj/cable/proc/cableColor(var/colorC) + var/color_n = "red" + if(colorC) + color_n = colorC + color = color_n + switch(colorC) + if("red") + icon = 'power_cond_red.dmi' + if("yellow") + icon = 'power_cond_yellow.dmi' + if("green") + icon = 'power_cond_green.dmi' + if("blue") + icon = 'power_cond_blue.dmi' \ No newline at end of file diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 38058a2b70c..0a121e65281 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -1,19 +1,13 @@ -/obj/machinery/power/solar - var/id - var/net_set = 0 - /obj/machinery/power/solar/New() ..() spawn(10) updateicon() + update_solar_exposure() if(powernet) - add_avail(700) - net_set = 1 - else - net_set = 0 - - + for(var/obj/machinery/power/solar_control/SC in powernet.nodes) + if(SC.id == id) + control = SC /obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user) ..() @@ -45,9 +39,9 @@ overlays += image('power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER) else overlays += image('power.dmi', icon_state = "solar_panel", layer = FLY_LAYER) + src.dir = angle2dir(adir) return -/* /obj/machinery/power/solar/proc/update_solar_exposure() if(!sun) return @@ -64,22 +58,31 @@ #define SOLARGENRATE 1500 -*/ - /obj/machinery/power/solar/process() if(stat & BROKEN) return - add_avail(700) + //return //TODO: FIX + if(!obscured) + var/sgen = SOLARGENRATE * sunfrac + add_avail(sgen) + if(powernet && control) + if(control in powernet.nodes) //this line right here... + 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() /obj/machinery/power/solar/proc/broken() stat |= BROKEN updateicon() return - /obj/machinery/power/solar/meteorhit() if(stat & !BROKEN) broken() @@ -90,14 +93,19 @@ switch(severity) if(1.0) del(src) + if(prob(15)) + new /obj/item/weapon/shard( src.loc ) return if(2.0) if (prob(25)) new /obj/item/weapon/shard( src.loc ) del(src) return + if (prob(50)) + broken() if(3.0) - return + if (prob(25)) + broken() return /obj/machinery/power/solar/blob_act() @@ -110,7 +118,7 @@ -/* + /obj/machinery/power/solar_control/New() ..() spawn(15) @@ -323,4 +331,3 @@ if (prob(75)) broken() src.density = 0 -*/ \ No newline at end of file diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index d452fe0cdd5..9fc73c98b35 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -3,8 +3,6 @@ //Machine that tracks the sun and reports it's direction to the solar controllers //As long as this is working, solar panels on same powernet will track automatically - - /obj/machinery/power/tracker name = "solar tracker" desc = "A solar directional tracker." @@ -17,8 +15,6 @@ var/sun_angle = 0 // sun angle as set by sun datum -/* - // called by datum/sun/calc_position() as sun's angle changes proc/set_angle(var/angle) sun_angle = angle @@ -38,8 +34,6 @@ C.tracker_update(angle) - - // timed process // make sure we can draw power from the powernet process() @@ -53,6 +47,4 @@ // override power change to do nothing since we don't care about area power power_change() - return - -*/ \ No newline at end of file + return \ No newline at end of file