v0.7.5: fixed some rare concurrency errors with sparsearray

This commit is contained in:
Evan Debenham 2019-09-10 23:05:51 -04:00
parent 6ec6aadafc
commit 8d4bc19dc0
10 changed files with 18 additions and 14 deletions

View File

@ -32,7 +32,11 @@ public class SparseArray<T> extends IntMap<T> {
return keys().toArray().toArray();
}
public List<T> toList() {
public T[] valueArray(){
return values().toArray().toArray();
}
public List<T> valueList() {
return Arrays.asList(values().toArray().toArray());
}
}

View File

@ -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 );

View File

@ -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();

View File

@ -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();

View File

@ -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

View File

@ -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) {

View File

@ -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) {

View File

@ -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;
}

View File

@ -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;

View File

@ -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 );
}