From 8d4bc19dc044c4ec07ac1fa481dc8a4fba50f710 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 10 Sep 2019 23:05:51 -0400 Subject: [PATCH] v0.7.5: fixed some rare concurrency errors with sparsearray --- .../src/main/java/com/watabou/utils/SparseArray.java | 6 +++++- .../shatteredpixel/shatteredpixeldungeon/Dungeon.java | 2 +- .../actors/mobs/npcs/ImpShopkeeper.java | 2 +- .../actors/mobs/npcs/Shopkeeper.java | 2 +- .../shatteredpixeldungeon/items/bombs/Bomb.java | 2 +- .../shatteredpixeldungeon/items/bombs/Noisemaker.java | 2 +- .../items/scrolls/ScrollOfRage.java | 2 +- .../shatteredpixeldungeon/levels/Level.java | 10 +++++----- .../shatteredpixeldungeon/scenes/CellSelector.java | 2 +- .../shatteredpixeldungeon/scenes/GameScene.java | 2 +- 10 files changed, 18 insertions(+), 14 deletions(-) diff --git a/SPD-classes/src/main/java/com/watabou/utils/SparseArray.java b/SPD-classes/src/main/java/com/watabou/utils/SparseArray.java index 1d16cba4a..f28e9767a 100644 --- a/SPD-classes/src/main/java/com/watabou/utils/SparseArray.java +++ b/SPD-classes/src/main/java/com/watabou/utils/SparseArray.java @@ -32,7 +32,11 @@ public class SparseArray extends IntMap { return keys().toArray().toArray(); } - public List toList() { + public T[] valueArray(){ + return values().toArray().toArray(); + } + + public List valueList() { return Arrays.asList(values().toArray().toArray()); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java index 490ef932c..5c314f17d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java @@ -772,7 +772,7 @@ public class Dungeon { } if (hero.buff(Awareness.class) != null){ - for (Heap h : level.heaps.values()){ + for (Heap h : level.heaps.valueArray()){ BArray.or( level.visited, level.heroFOV, h.pos - 1 - level.width(), 3, level.visited ); BArray.or( level.visited, level.heroFOV, h.pos - 1, 3, level.visited ); BArray.or( level.visited, level.heroFOV, h.pos - 1 + level.width(), 3, level.visited ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/ImpShopkeeper.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/ImpShopkeeper.java index 7650f11d0..819350cc0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/ImpShopkeeper.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/ImpShopkeeper.java @@ -50,7 +50,7 @@ public class ImpShopkeeper extends Shopkeeper { @Override public void flee() { - for (Heap heap: Dungeon.level.heaps.values()) { + for (Heap heap: Dungeon.level.heaps.valueArray()) { if (heap.type == Heap.Type.FOR_SALE) { CellEmitter.get( heap.pos ).burst( ElmoParticle.FACTORY, 4 ); heap.destroy(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java index 194cace02..26583351a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java @@ -71,7 +71,7 @@ public class Shopkeeper extends NPC { @Override public void destroy() { super.destroy(); - for (Heap heap: Dungeon.level.heaps.values()) { + for (Heap heap: Dungeon.level.heaps.valueArray()) { if (heap.type == Heap.Type.FOR_SALE) { CellEmitter.get( heap.pos ).burst( ElmoParticle.FACTORY, 4 ); heap.destroy(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java index 484979c10..b2d692b82 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java @@ -273,7 +273,7 @@ public class Bomb extends Item { } //look for our bomb, remove it from its heap, and blow it up. - for (Heap heap : Dungeon.level.heaps.values()) { + for (Heap heap : Dungeon.level.heaps.valueArray()) { if (heap.items.contains(bomb)) { //FIXME this is a bit hacky, might want to generalize the functionality diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Noisemaker.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Noisemaker.java index 892204e61..6194661eb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Noisemaker.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Noisemaker.java @@ -52,7 +52,7 @@ public class Noisemaker extends Bomb { mob.beckon( cell ); } - for (Heap heap : Dungeon.level.heaps.values()) { + for (Heap heap : Dungeon.level.heaps.valueArray()) { if (heap.type == Heap.Type.MIMIC) { Mimic m = Mimic.spawnAt( heap.pos, heap.items ); if (m != null) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRage.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRage.java index fdab631c7..80df648ae 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRage.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRage.java @@ -51,7 +51,7 @@ public class ScrollOfRage extends Scroll { } } - for (Heap heap : Dungeon.level.heaps.values()) { + for (Heap heap : Dungeon.level.heaps.valueArray()) { if (heap.type == Heap.Type.MIMIC) { Mimic m = Mimic.spawnAt( heap.pos, heap.items ); if (m != null) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java index 5a0087fae..74b30607f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java @@ -399,9 +399,9 @@ public abstract class Level implements Bundlable { bundle.put( ENTRANCE, entrance ); bundle.put( EXIT, exit ); bundle.put( LOCKED, locked ); - bundle.put( HEAPS, heaps.toList() ); - bundle.put( PLANTS, plants.toList() ); - bundle.put( TRAPS, traps.toList() ); + bundle.put( HEAPS, heaps.valueList() ); + bundle.put( PLANTS, plants.valueList() ); + bundle.put( TRAPS, traps.valueList() ); bundle.put( CUSTOM_TILES, customTiles ); bundle.put( CUSTOM_WALLS, customWalls ); bundle.put( MOBS, mobs ); @@ -980,7 +980,7 @@ public abstract class Level implements Bundlable { } if (c.buff( Awareness.class ) != null) { - for (Heap heap : heaps.values()) { + for (Heap heap : heaps.valueArray()) { int p = heap.pos; for (int i : PathFinder.NEIGHBOURS9) fieldOfView[p+i] = true; @@ -1005,7 +1005,7 @@ public abstract class Level implements Bundlable { } if (c == Dungeon.hero) { - for (Heap heap : heaps.values()) + for (Heap heap : heaps.valueArray()) if (!heap.seen && fieldOfView[heap.pos]) heap.seen = true; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java index 46ba7b289..5720f4ecd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java @@ -65,7 +65,7 @@ public class CellSelector extends PointerArea { } } - for (Heap heap : Dungeon.level.heaps.values()){ + for (Heap heap : Dungeon.level.heaps.valueArray()){ if (heap.sprite != null && heap.sprite.overlapsPoint( p.x, p.y)){ select( heap.pos ); return; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index 49f89bfdf..50843a2bc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -229,7 +229,7 @@ public class GameScene extends PixelScene { heaps = new Group(); add( heaps ); - for ( Heap heap : Dungeon.level.heaps.values() ) { + for ( Heap heap : Dungeon.level.heaps.valueArray() ) { addHeapSprite( heap ); }