diff --git a/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameactors/FixtureHomeComputer.kt b/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameactors/FixtureHomeComputer.kt index a06d01182..fae458b86 100644 --- a/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameactors/FixtureHomeComputer.kt +++ b/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameactors/FixtureHomeComputer.kt @@ -70,7 +70,7 @@ class FixtureHomeComputer : FixtureBase { vmRunner.executeCommand(vm.roms[0]!!.readAll()) } - App.disposables.add(Disposable { + INGAME.disposables.add(Disposable { vmRunner.close() coroutineJob.cancel("fixture disposal") vm.dispose() diff --git a/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameitems/ItemWearableWorldRadar.kt b/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameitems/ItemWearableWorldRadar.kt index 3cfd5adc8..24b155eb2 100644 --- a/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameitems/ItemWearableWorldRadar.kt +++ b/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameitems/ItemWearableWorldRadar.kt @@ -9,10 +9,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.cancel import kotlinx.coroutines.launch -import net.torvald.terrarum.App -import net.torvald.terrarum.CommonResourcePool -import net.torvald.terrarum.ModMgr -import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.* import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.gameitems.ItemID @@ -51,6 +48,7 @@ class ItemWearableWorldRadar(originalID: String) : GameItem(originalID) { private val coroutineJob: Job private val ui = WearableWorldRadarUI(vm) + // FIXME initialise computer stuff when the Item is first used, not when it's registered by the Modmgr init { super.equipPosition = EquipPosition.HAND_GRIP @@ -69,7 +67,7 @@ class ItemWearableWorldRadar(originalID: String) : GameItem(originalID) { vmRunner.executeCommand(vm.roms[0]!!.readAll()) } - App.disposables.add(Disposable { + INGAME.disposables.add(Disposable { vmRunner.close() coroutineJob.cancel("item disposal") vm.dispose() diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 704ea64b2..b8e60e627 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -1,6 +1,8 @@ package net.torvald.terrarum import com.badlogic.gdx.graphics.g2d.SpriteBatch +import com.badlogic.gdx.utils.Disposable +import com.badlogic.gdx.utils.GdxRuntimeException import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.gameactors.Actor @@ -26,6 +28,7 @@ import java.io.FileNotFoundException import java.io.IOException import java.util.* import java.util.concurrent.locks.Lock +import java.util.function.Consumer /** * Although the game (as product) can have infinitely many stages/planets/etc., those stages must be manually managed by YOU; @@ -50,6 +53,8 @@ open class IngameInstance(val batch: SpriteBatch, val isMultiplayer: Boolean = f } } + val disposables = HashSet() + lateinit var worldDisk: VirtualDisk; internal set lateinit var playerDisk: VirtualDisk; internal set lateinit var worldSavefileName: String; internal set @@ -179,6 +184,14 @@ open class IngameInstance(val batch: SpriteBatch, val isMultiplayer: Boolean = f actorContainerActive.forEach { it.dispose() } actorContainerInactive.forEach { it.dispose() } world.dispose() + + disposables.forEach(Consumer { + try { it.dispose() } + catch (_: NullPointerException) { } + catch (_: IllegalArgumentException) { } + catch (_: GdxRuntimeException) { } + catch (_: ConcurrentModificationException) { } + }) } ////////////