power bullshit

This commit is contained in:
2026-04-11 21:48:45 +02:00
parent f5b5a30299
commit 71b6d3a606
8 changed files with 213 additions and 39 deletions

View File

@@ -36,45 +36,53 @@ object Networking {
val reachability = Visibility.NETWORK
var reachableCache: Set<Node>? = null
open fun isProducer(): Boolean = false
open fun isConsumer(): Boolean = false
open fun getEnergy(): Double = 0.0
open fun setEnergy(energy: Double) {}
open fun maxEnergyCapacity(): Double = 0.0
open fun getChargerNodes(): Set<Node> = getReachable().plus(this)
fun getChargerNodes(): Set<Node> = getReachable().filter { it.isProducer() }.toSet()
fun totalEnergyInConnections(): Double = getChargerNodes().fold(0.0) { acc, node -> acc + node.getEnergy() }
fun maxEnergyInConnections(): Double = getChargerNodes().fold(0.0) { acc, node -> acc + node.maxEnergyCapacity() }
// the algorithm for balancing energy levels
fun balanceEnergyLevels() {
// basic algorithm: ensure equal percentages
val cap = this.maxEnergyInConnections();
val total = this.totalEnergyInConnections();
val percentage = total / cap;
getChargerNodes().forEach {
it.setEnergy(percentage * it.maxEnergyCapacity());
}
fun consumeFromNodeAsMuchAsPossible(energy: Double): Double {
val consumed = min(energy, getEnergy())
setEnergy(getEnergy() - consumed)
return consumed
}
// attempts to consume
fun consumeEnergy(energy: Double): Boolean {
// consumes energy, returns false if not enough
val total = this.totalEnergyInConnections()
val total = totalEnergyInConnections() + getEnergy()
if(energy > total) return false
val percentageConsumed = energy / total
var remaining = energy
remaining -= consumeFromNodeAsMuchAsPossible(remaining)
if(remaining <= 0.0) return true
getChargerNodes().forEach {
it.setEnergy(it.getEnergy() * (1.0 - percentageConsumed));
for (charger in getChargerNodes()) {
if(remaining <= 0.0) break
remaining -= charger.consumeFromNodeAsMuchAsPossible(remaining)
}
return true
}
fun tryToChargeFully() {
var remaining = maxEnergyCapacity() - getEnergy()
if(remaining <= 0.0) return
for (charger in getChargerNodes()) {
if(remaining <= 0.0) break
val amount = charger.consumeFromNodeAsMuchAsPossible(remaining)
setEnergy(getEnergy() + amount)
remaining -= amount
}
}
open fun tick() {
// rationale: the other ones can figure it out
if(this.maxEnergyCapacity() > 0) this.balanceEnergyLevels()
if(isConsumer()) tryToChargeFully()
}
// processes a received message
open fun received(message: Message) {}
@@ -132,7 +140,7 @@ object Networking {
other.directConnectTo(this);
}
fun disconnectTo(other: Node) {
fun disconnectFrom(other: Node) {
this.directDisconnectFrom(other);
other.directDisconnectFrom(this);
}
@@ -158,6 +166,7 @@ object Networking {
}
class DebugBatteryNode(var power: Double, val capacity: Double): Node() {
override fun isProducer() = true
override fun maxEnergyCapacity() = capacity
override fun getEnergy() = power
override fun setEnergy(energy: Double) { power = energy }
@@ -230,6 +239,10 @@ object Networking {
if(node is WirelessEndpoint) {
wirelessNodes.remove(node);
}
// toList() in order to copy it
node.connections.toList().forEach {
node.disconnectFrom(it)
}
allNodes.forEach { it.onNodeRemoved(node) }
}