summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt45
1 files changed, 41 insertions, 4 deletions
diff --git a/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt b/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt
index b69cc42..4a4f087 100644
--- a/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt
+++ b/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt
@@ -1,6 +1,7 @@
 package space.autistic.radio.client.sound
 
 import net.fabricmc.fabric.api.client.sound.v1.FabricSoundInstance
+import net.minecraft.client.MinecraftClient
 import net.minecraft.client.network.ClientPlayerEntity
 import net.minecraft.client.sound.*
 import net.minecraft.sound.SoundCategory
@@ -8,8 +9,10 @@ import net.minecraft.sound.SoundEvents
 import net.minecraft.util.Identifier
 import space.autistic.radio.PirateRadioEntityTypes
 import space.autistic.radio.client.PirateRadioClient
+import space.autistic.radio.client.fmsim.FmSimulatorMode
 import space.autistic.radio.entity.DisposableTransmitterEntity
 import java.util.concurrent.CompletableFuture
+import kotlin.math.PI
 
 class PirateRadioSoundInstance(private val player: ClientPlayerEntity) : MovingSoundInstance(
     SoundEvents.INTENTIONALLY_EMPTY, SoundCategory.MUSIC, SoundInstance.createRandom()
@@ -32,10 +35,35 @@ class PirateRadioSoundInstance(private val player: ClientPlayerEntity) : MovingS
             player.clientWorld.entities.filter { it.type == PirateRadioEntityTypes.DISPOSABLE_TRANSMITTER }
                 .filter { (it as DisposableTransmitterEntity).frequency <= PirateRadioClient.frequency + 1 && it.frequency >= PirateRadioClient.frequency - 1 }
                 .sortedByDescending { player.pos.squaredDistanceTo(it.pos) } as List<DisposableTransmitterEntity>
-        val main = trackedEntities.filter { it.frequency == PirateRadioClient.frequency }.take(2)
-        val lower = trackedEntities.find { it.frequency == PirateRadioClient.frequency - 1 }
-        val upper = trackedEntities.find { it.frequency == PirateRadioClient.frequency + 1 }
-        // TODO implement
+        val main = trackedEntities.filter { it.frequency == PirateRadioClient.frequency }
+            .take(if (PirateRadioClient.mode == FmSimulatorMode.FAST) 1 else 2)
+        val lower = trackedEntities.filter { it.frequency == PirateRadioClient.frequency - 1 }
+            .take(if (PirateRadioClient.mode == FmSimulatorMode.FAST) 0 else 1)
+        val upper = trackedEntities.filter { it.frequency == PirateRadioClient.frequency + 1 }
+            .take(if (PirateRadioClient.mode == FmSimulatorMode.FAST) 0 else 1)
+        val mainNoise = trackedEntities.filter { it.frequency == PirateRadioClient.frequency }.drop(main.size)
+            .fold(0f) { noise, entity ->
+                noise + getPowerReceived(entity.pos.squaredDistanceTo(player.pos))
+            }
+        val lowerNoise = trackedEntities.filter { it.frequency == PirateRadioClient.frequency - 1 }.drop(lower.size)
+            .fold(0f) { noise, entity ->
+                noise + getPowerReceived(entity.pos.squaredDistanceTo(player.pos))
+            }
+        val upperNoise = trackedEntities.filter { it.frequency == PirateRadioClient.frequency + 1 }.drop(upper.size)
+            .fold(0f) { noise, entity ->
+                noise + getPowerReceived(entity.pos.squaredDistanceTo(player.pos))
+            }
+        val mainLevels = main.map { getPowerReceived(it.pos.squaredDistanceTo(player.pos)) }
+        val lowerLevels = lower.map { getPowerReceived(it.pos.squaredDistanceTo(player.pos)) }
+        val upperLevels = upper.map { getPowerReceived(it.pos.squaredDistanceTo(player.pos)) }
+        // TODO
+    }
+
+    private fun getPowerReceived(rsq: Double): Float {
+        // https://www.antenna-theory.com/basics/friis.php
+        // also fudge results if too close to transmitter
+        if (rsq < 1.0) return (FRIIS_FACTOR * rsq).toFloat()
+        return (FRIIS_FACTOR / rsq).toFloat()
     }
 
     override fun getAudioStream(
@@ -65,4 +93,13 @@ class PirateRadioSoundInstance(private val player: ClientPlayerEntity) : MovingS
             16
         )
     }
+
+    companion object {
+        private const val TRANSMIT_POWER = 0.01
+
+        // for 100MHz
+        private const val WAVELENGTH = 3.0
+        private const val UNIT_SPHERE = 4.0 * PI
+        private const val FRIIS_FACTOR = TRANSMIT_POWER * WAVELENGTH / (UNIT_SPHERE * UNIT_SPHERE)
+    }
 }