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() + }) +})