diff --git a/src/escenas/libroPrimaria/EscenaDesdeMapa.ts b/src/escenas/libroPrimaria/EscenaDesdeMapa.ts
index 348a140..ae58749 100644
--- a/src/escenas/libroPrimaria/EscenaDesdeMapa.ts
+++ b/src/escenas/libroPrimaria/EscenaDesdeMapa.ts
@@ -85,8 +85,8 @@ abstract class EscenaDesdeMapa extends EscenaActividad {
}
protected construirCuadricula(mapa : MapaEscena) : Cuadricula {
- let cuadricula = new Cuadricula(this.cuadriculaX(), this.cuadriculaY(), mapa.length,
- mapa[0].length, this.opsCuadricula(), this.opsCasilla());
+ const matrizBooleana = mapa.map(fila => fila.map(casilla => casilla === '_' ? 'F' : 'T'))
+ const cuadricula: CuadriculaEsparsa = new CuadriculaEsparsa(this.cuadriculaX(), this.cuadriculaY(), this.opsCuadricula(), this.opsCasilla(), matrizBooleana);
cuadricula.forEachCasilla(casilla => this.llenarCasilla(cuadricula, casilla, mapa));
return cuadricula;
}
@@ -96,7 +96,7 @@ abstract class EscenaDesdeMapa extends EscenaActividad {
let nroColumna : number = casilla.nroColumna;
let ids : string[] = mapa[nroFila][nroColumna].split("&");
ids.forEach(id => {
- if (id != '' && id != ' ' && id != '-') { // si no es casilla libre
+ if (id != '' && id != ' ' && id != '-' && id != '_') { // si no es casilla libre
let actor = this.mapearIdentificadorAActor(id, nroFila, nroColumna);
cuadricula.agregarActorEnCasilla(actor, casilla, true);
}
@@ -446,6 +446,13 @@ class GeneradorDeCasillaVacia implements GeneradorDeCasilla {
esAleatorioPara(generador : GeneradorDeMapasAleatorios): boolean { return false; }
}
+/** Corresponde a las casillas indicadas con `_`. */
+class GeneradorDeCasillaNula implements GeneradorDeCasilla {
+ generarSemillaDeCasilla(generador : GeneradorDeMapasAleatorios) : SemillaDeCasilla
+ { return new SemillaDeCasilla('_'); }
+ esAleatorioPara(generador : GeneradorDeMapasAleatorios): boolean { return false; }
+}
+
/** Corresponde al modificador `?` (recursivo). */
class GeneradorDeCasillaMaybe implements GeneradorDeCasilla {
constructor(private generadorInterno : GeneradorDeCasilla, private proba? : number) {}
diff --git a/src/gramaticaAleatoria.ne b/src/gramaticaAleatoria.ne
index 994bb5d..603d034 100644
--- a/src/gramaticaAleatoria.ne
+++ b/src/gramaticaAleatoria.ne
@@ -43,6 +43,7 @@ Atom -> Id {% d => new GeneradorDeCasillaSimple(d[0]) %}
| Bag {% id %}
| Col {% id %}
| Nil {% id %}
+ | Void {% id %}
| "(" _ Term _ ")" {% d => d[2] %}
Id -> [a-zA-Z0-9]:+ {% d => d[0].join("") %}
Bag -> "$" {% d => new GeneradorDeCasillaBolsa() %}
@@ -53,4 +54,6 @@ Nil -> "-" {% d => new GeneradorDeCasillaVacia() %}
Macro -> "#" _ Id {% d => new GeneradorDeCasillaMacro(d[2]) %}
-And -> Atom _ "&" _ Atom {% d => new GeneradorDeCasillaAnd(d[0], d[4]) %}
\ No newline at end of file
+And -> Atom _ "&" _ Atom {% d => new GeneradorDeCasillaAnd(d[0], d[4]) %}
+
+Void -> "_" {% d => new GeneradorDeCasillaNula() %}
\ No newline at end of file
diff --git a/tests/EscenaDesdeMapa.spec.ts b/tests/EscenaDesdeMapa.spec.ts
new file mode 100644
index 0000000..043da03
--- /dev/null
+++ b/tests/EscenaDesdeMapa.spec.ts
@@ -0,0 +1,31 @@
+///
+///
+// @ts-ignore
+const { EscenaDuba, objectTypes, pilas, Lita } = global.win
+
+describe("EscenaDesdeMapa", () => {
+
+ let escena: EscenaDesdeMapa
+
+ beforeAll(() => {
+ pilas.onready = () => { }
+ pilas.iniciar({
+ imagenesExtra: ['actor.duba.png', 'casillas.duba.png', 'actor.churrasco.png', 'fondo.duba.png'],
+ opciones: { canvas_id: 'canvas' },
+ cargar_imagenes_estandar: false
+ })
+
+ escena = new EscenaDuba(["[[A,P,_],[-,_,-],[_,-,-]]"])
+ pilas.mundo.gestor_escenas.cambiar_escena(escena)
+ escena.iniciar()
+ })
+
+ test("No se crea casilla en posicion de casilla nula", () =>{
+ expect(escena.cuadricula.casilla(0,2)).toBeFalsy()
+ })
+
+ test("Al tener una casilla nula en un borde no se eliminan las casillas en la misma fila y columna", () =>{
+ expect(escena.cuadricula.casilla(0,1)).toBeTruthy()
+ expect(escena.cuadricula.casilla(1,2)).toBeTruthy()
+ })
+})