diff --git a/package-lock.json b/package-lock.json index de37926..2d7b717 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pilas-bloques-exercises", - "version": "1.2.19", + "version": "1.2.22", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index eade3e1..a26fa51 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pilas-bloques-exercises", - "version": "1.2.19", + "version": "1.2.22", "description": "Exercises for Pilas Bloques", "homepage": "http://pilasbloques.program.ar", "author": { diff --git a/src/actores/PelotaAnimada.ts b/src/actores/PelotaAnimada.ts index 5923fe6..5bec426 100644 --- a/src/actores/PelotaAnimada.ts +++ b/src/actores/PelotaAnimada.ts @@ -1,10 +1,12 @@ /// class PelotaAnimada extends ActorAnimado { + static _grilla = 'pelotaAnimada.png' constructor(x: number, y: number) { - super(x, y, { grilla: 'pelotaAnimada.png', cantColumnas: 16 }) + super(x, y, { cantColumnas: 17 }) this.definirAnimacion("patear", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 12) + this.definirAnimacion("desaparecer", [16],12) } } \ No newline at end of file diff --git a/src/actores/segundoCiclo/Chuy/Chuy.ts b/src/actores/segundoCiclo/Chuy/Chuy.ts new file mode 100644 index 0000000..c1c75f7 --- /dev/null +++ b/src/actores/segundoCiclo/Chuy/Chuy.ts @@ -0,0 +1,39 @@ +/// +/// + +class Chuy extends ActorAnimado { + static _grilla = 'actor.chuy.png' + + constructor() { + super(0,0,{ + cantColumnas: 10,cantFilas: 11}); + this.definirAnimacion("parado", + new Cuadros(5).repetirVeces(16) + .concat([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 11, 11, 16, 17, 18, 18, 18, 18, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50]) + .concat(new Cuadros(5).repetirVeces(30)) + .concat([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 11, 11, 16, 17, 18, 18, 18, 18, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50]) + .concat(new Cuadros(5).repetirVeces(30)) + .concat([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 11, 11, 16, 17, 18, 18, 18, 18, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50]) + .concat(new Cuadros(5).repetirVeces(16)), + 20, true); + this.definirAnimacion("correr", [68, 69, 70, 71, 72, 73, 74, 75, 76], 12); + this.definirAnimacion("correrChocando", [68, 69, 70, 71, 72, 73, 74, 75, 76], 12) + this.definirAnimacion("obstaculo", [0, 1, 1, 2, 2, 3, 3, 4, 4, 4], 12) + this.definirAnimacion("error", [101, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105] + , 12) + this.definirAnimacion("recoger", [97, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 100, 97], 12); + this.definirAnimacion("usarPaleta", [51, 52, 53, 54, 55, 56, 57, 58, 57, 56, 55, 56, 57, 58, 57, 56, 55, 56, 57, 58, 57, 56, 55, 56, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67], 12); + this.definirAnimacion("rebotarPelota", [87, 88, 89, 90, 91, 92, 93, 92, 91, 90, 94, 95, 90, 91, 92, 93, 91, 94, 91, 93, 90, 94, 96, 87, 87, 87, 87], 12); + this.definirAnimacion("patear", [87, 88, 89, 90, 91, 92, 93, 92, 91, 90, 94, 95, 90, 91, 92, 93, 91, 94, 91, 93, 90, 94, 96, 87, 87, 87, 87], 12) + this.definirAnimacion("rebotarPulpito", [77, 78, 79, 80, 81, 82, 83, 82, 81, 80, 84, 85, 80, 81, 82, 83, 81, 84, 81, 83, 80, 84, 86, 77, 77, 77, 77], 12); + } + + + puedeMoverseAbajo(){ + return this.tocandoFlechaAbajo() && !this.tieneEnLaCasillaDeAbajo("Obstaculo") + } + + puedeMoverseDerecha(){ + return this.tocandoFlechaDerecha() && !this.tieneEnLaCasillaASuDerecha("Obstaculo") + } +} diff --git a/src/actores/segundoCiclo/Chuy/Paleta.ts b/src/actores/segundoCiclo/Chuy/Paleta.ts new file mode 100644 index 0000000..46be352 --- /dev/null +++ b/src/actores/segundoCiclo/Chuy/Paleta.ts @@ -0,0 +1,9 @@ +/// + +class Paleta extends ActorAnimado { + static _grilla = 'actor.paleta.png' + + constructor() { + super(0, 0, {cantColumnas:1, cantFilas: 1}); + } +} \ No newline at end of file diff --git a/src/actores/segundoCiclo/Chuy/Pelotas.ts b/src/actores/segundoCiclo/Chuy/Pelotas.ts new file mode 100644 index 0000000..9541232 --- /dev/null +++ b/src/actores/segundoCiclo/Chuy/Pelotas.ts @@ -0,0 +1,19 @@ +/// + +class Pulpito extends ActorAnimado { + static _grilla = 'actor.pelota.png' + + constructor() { + super(0, 0, { cantColumnas: 2 }); + this.definirAnimacion("desaparecer", [1], 12); + } +} + +class PingPong extends ActorAnimado { + static _grilla = 'actor.pelotita.png' + + constructor() { + super(0, 0, { cantColumnas: 2 }); + this.definirAnimacion("desaparecer", [1], 12); + } +} \ No newline at end of file diff --git a/src/actores/segundoCiclo/Chuy/Trofeo.ts b/src/actores/segundoCiclo/Chuy/Trofeo.ts new file mode 100644 index 0000000..6174747 --- /dev/null +++ b/src/actores/segundoCiclo/Chuy/Trofeo.ts @@ -0,0 +1,9 @@ +/// + +class Trofeo extends ActorAnimado { + static _grilla = 'actor.trofeo.png' + + constructor() { + super(0, 0, {cantColumnas:1, cantFilas: 1}); + } +} \ No newline at end of file diff --git a/src/actores/segundoCiclo/Yvoty/Celular.ts b/src/actores/segundoCiclo/Yvoty/Celular.ts index 5b9106f..995cf75 100644 --- a/src/actores/segundoCiclo/Yvoty/Celular.ts +++ b/src/actores/segundoCiclo/Yvoty/Celular.ts @@ -3,10 +3,11 @@ class Celular extends ActorAnimado { static _grilla = 'actor.celular.png' constructor(prendido = false) { - super(0, 0, {cantColumnas: 2}); + super(0, 0, {cantColumnas: 3}); this.definirAnimacion("cargado", [1], 1); this.definirAnimacion("prendido", [1], 1); this.definirAnimacion("descargado", [0], 1); + this.definirAnimacion("desaparecer", [2], 1); if(prendido) this.cargarAnimacion("prendido") } diff --git a/src/actores/segundoCiclo/Yvoty/Yvoty.ts b/src/actores/segundoCiclo/Yvoty/Yvoty.ts index d594d46..6ac15bc 100644 --- a/src/actores/segundoCiclo/Yvoty/Yvoty.ts +++ b/src/actores/segundoCiclo/Yvoty/Yvoty.ts @@ -8,23 +8,30 @@ class Yvoty extends ActorAnimado { super(0, 0, { cantColumnas: 10, cantFilas: 8 }); this.definirAnimacion("parado", - new Cuadros(0).repetirVeces(16) - .concat([4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, 12, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14]) - .concat(new Cuadros(0).repetirVeces(30)) - .concat([4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, 12, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14]) - .concat(new Cuadros(0).repetirVeces(30)) - .concat([4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, 12, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14]) - .concat(new Cuadros(0).repetirVeces(16)) - .concat([14]) - .concat(new Cuadros(0).repetirVeces(5)), - 20, true); + new Cuadros(4).repetirVeces(1). + concat([5, 6, 7, 8, 7, 6, 5]). + concat(new Cuadros(9).repetirVeces(7)). + concat([4, 5, 6, 7, 8, 7, 6, 5]). + concat(new Cuadros(9).repetirVeces(16)). + concat([10, 11, 12]). + concat([4, 5, 6, 7, 8, 7, 6, 5]). + concat(new Cuadros(9).repetirVeces(7)). + concat([4, 5, 6, 7, 8, 7, 6, 5]). + concat(new Cuadros(9).repetirVeces(16)). + concat([10, 11, 12]). + concat(new Cuadros(9).repetirVeces(11)). + concat([13, 14, 14]). + concat(new Cuadros(15).repetirVeces(15)). + concat([14, 14, 13, 12]). + concat(new Cuadros(9).repetirVeces(9)) + , 20, true); this.definirAnimacion("correr", [52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 20); this.definirAnimacion("correrChocando", [52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 20) this.definirAnimacion("obstaculo", [20, 21, 21, 22, 23, 24, 24, 24, 24, 25, 26, 27, 28, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], 12) this.definirAnimacion("error", [30, 30, 30, 30, 30, 30, 30, 31, 32, 33, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37], 12) - this.definirAnimacion("recoger", [0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 20); + this.definirAnimacion("recoger", [0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0], 12); this.definirAnimacion("usarCelu", [38, 38, 38, 39, 39, 40, 40, 40, 41, 42, 43, 41, 43, 42, 42, 42, 44, 45, 46, 47, 46, 42, 42, 42, 45, 46, 46, 46, 45, 44, 48, 48, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 38, 38, 38, 38, 38, 38, 38], 20); - this.definirAnimacion("sacarFoto", [38, 38, 38, 39, 39, 40, 40, 40, 41, 42, 43, 41, 43, 42, 42, 42, 44, 45, 46, 47, 46, 42, 42, 42, 45, 46, 46, 46, 45, 44, 48, 48, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 38, 38, 38, 38, 38, 38, 38], 20); + this.definirAnimacion("sacarFoto", [38, 38, 38, 39, 39, 40, 40, 40, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 40, 40, 40, 40], 20); this.definirAnimacion("escribir", [16, 16, 17, 17, 18, 18, 18, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18], 20); } } diff --git a/src/assets/actor.celular.png b/src/assets/actor.celular.png index 83c0926..bff42e1 100644 Binary files a/src/assets/actor.celular.png and b/src/assets/actor.celular.png differ diff --git a/src/assets/actor.chuy.png b/src/assets/actor.chuy.png new file mode 100644 index 0000000..c2f0fe6 Binary files /dev/null and b/src/assets/actor.chuy.png differ diff --git a/src/assets/actor.paleta.png b/src/assets/actor.paleta.png new file mode 100644 index 0000000..3720c03 Binary files /dev/null and b/src/assets/actor.paleta.png differ diff --git a/src/assets/actor.pelota.png b/src/assets/actor.pelota.png new file mode 100644 index 0000000..069e9b3 Binary files /dev/null and b/src/assets/actor.pelota.png differ diff --git a/src/assets/actor.pelotita.png b/src/assets/actor.pelotita.png new file mode 100644 index 0000000..0fcfbd9 Binary files /dev/null and b/src/assets/actor.pelotita.png differ diff --git a/src/assets/actor.trofeo.png b/src/assets/actor.trofeo.png new file mode 100644 index 0000000..1dd833a Binary files /dev/null and b/src/assets/actor.trofeo.png differ diff --git a/src/assets/actor.yvoty.png b/src/assets/actor.yvoty.png index c8475c4..627b815 100644 Binary files a/src/assets/actor.yvoty.png and b/src/assets/actor.yvoty.png differ diff --git a/src/assets/casilla.futbolChuy1.png b/src/assets/casilla.futbolChuy1.png new file mode 100644 index 0000000..734ecf6 Binary files /dev/null and b/src/assets/casilla.futbolChuy1.png differ diff --git a/src/assets/casilla.futbolChuy2.png b/src/assets/casilla.futbolChuy2.png new file mode 100644 index 0000000..1d54a1b Binary files /dev/null and b/src/assets/casilla.futbolChuy2.png differ diff --git a/src/assets/casillas.chuy.png b/src/assets/casillas.chuy.png new file mode 100644 index 0000000..1518d94 Binary files /dev/null and b/src/assets/casillas.chuy.png differ diff --git a/src/assets/fondo.chuy.png b/src/assets/fondo.chuy.png new file mode 100644 index 0000000..a723046 Binary files /dev/null and b/src/assets/fondo.chuy.png differ diff --git a/src/assets/obstaculo.chuy1.png b/src/assets/obstaculo.chuy1.png new file mode 100644 index 0000000..dd9ba95 Binary files /dev/null and b/src/assets/obstaculo.chuy1.png differ diff --git a/src/assets/obstaculo.chuy2.png b/src/assets/obstaculo.chuy2.png new file mode 100644 index 0000000..78e838c Binary files /dev/null and b/src/assets/obstaculo.chuy2.png differ diff --git a/src/assets/obstaculo.chuy3.png b/src/assets/obstaculo.chuy3.png new file mode 100644 index 0000000..ad17819 Binary files /dev/null and b/src/assets/obstaculo.chuy3.png differ diff --git a/src/assets/obstaculo.chuy4.png b/src/assets/obstaculo.chuy4.png new file mode 100644 index 0000000..62abd04 Binary files /dev/null and b/src/assets/obstaculo.chuy4.png differ diff --git a/src/assets/pelotaAnimada.png b/src/assets/pelotaAnimada.png index b64edd5..6ce8c54 100644 Binary files a/src/assets/pelotaAnimada.png and b/src/assets/pelotaAnimada.png differ diff --git a/src/escenas/EscenaActividad.ts b/src/escenas/EscenaActividad.ts index 5ac8325..fd9c9a5 100644 --- a/src/escenas/EscenaActividad.ts +++ b/src/escenas/EscenaActividad.ts @@ -91,6 +91,14 @@ class EscenaActividad extends Base { return this.obtenerActoresConEtiqueta(etiqueta).length; } + noHay(actor): boolean { + return this.contarActoresConEtiqueta(actor) == 0 + } + + todosLosActoresCumplen(actor, estado) { + return this.obtenerActoresConEtiqueta(actor).every(o => o.nombreAnimacionActual() == estado); + } + /** * Computa un multiplicador que crece según la cantidad de filas y columnas de la cuadrícula. * El multiplicador es 1 si la cuadrícula es de 1x1, y crece acotado por maxRatio. diff --git a/src/escenas/FutbolAlSur.ts b/src/escenas/FutbolAlSur.ts new file mode 100644 index 0000000..92c79e8 --- /dev/null +++ b/src/escenas/FutbolAlSur.ts @@ -0,0 +1,39 @@ +/// + +class FutbolAlSur extends FutbolRobots { + + static clasesDeActoresInvolucrados(): typeof ActorAnimado[] { + return [Chuy, PelotaAnimada]; + }; + + static imagenesAdicionales(): string[] { + return ['casilla.futbolChuy1.png', 'casilla.futbolChuy2.png'].concat(Obstaculo.imagenesPara('chuy')); + } + + static pathFondo(): string { + return 'fondo.chuy.png'; + } + + ajustarAutomata() { + this.automata.traer_al_frente() + this.automata.escala *= this.escalaSegunCuadricula(3.3); + this.automata.setY(this.automata.getY() + this.automata.getAlto() / 4); + this.automata.setX(this.automata.getX() + 10) + } + + obtenerAutomata() { + return new Chuy(); + } + + obtenerFondo() { + return new Fondo('fondo.chuy.png', 0, 0); + } + + imagenCasillas() { + return 'casilla.futbolChuy1.png' + } + + imagenCasillasInicio() { + return 'casilla.futbolChuy2.png' + } +} diff --git a/src/escenas/FutbolRobots.ts b/src/escenas/FutbolRobots.ts index 45810c8..47da8af 100644 --- a/src/escenas/FutbolRobots.ts +++ b/src/escenas/FutbolRobots.ts @@ -3,35 +3,55 @@ /// /// -class FutbolRobots extends EscenaActividad{ - automata : ActorAnimado; +class FutbolRobots extends EscenaActividad { + automata: ActorAnimado; fondo; - cuadricula : CuadriculaMultiple; + cuadricula: CuadriculaMultiple; cantPateadas; cantidadFilas; iniciar() { - this.fondo = new Fondo('fondos.futbolRobots.png',0,0); - this.cantidadFilas=8; - - this.cuadricula = new CuadriculaMultiple( - new DefinidorColumnasRandom(this.cantidadFilas,6), - 0,-50, - {separacionEntreCasillas: 5}, - {grilla:'casilla.futbolRobots2.png', alto:40,ancho:40}) - this.cuadricula.cambiarImagenInicio('casilla.futbolRobots1.png'); - - this.automata = new RobotAnimado(0, 0); - this.cuadricula.agregarActor(this.automata,0,0); - var casilla = this.cuadricula.casilla(0, 0); - this.automata.escalarAAlto(3.5 * casilla.alto); - this.automata.abajo = casilla.y - (0.25 * casilla.alto); - this.automata.radio_de_colision = this.automata.alto / 2.5; - - for (var fila=0;fila + +class EscenaChuy extends EscenaDesdeMapa { + automata: Chuy; + xFinal: number; + yFinal: number; + + static clasesDeActoresInvolucrados(): typeof ActorAnimado[] { + return [Chuy, Trofeo, Paleta, PelotaAnimada, Pulpito, PingPong]; + }; + + static pathFondo(): string { + return 'fondo.chuy.png'; + } + + static imagenesAdicionales(): string[] { + return Casilla.imagenesPara('chuy').concat(Obstaculo.imagenesPara('chuy')); + } + + constructor(especificacion: Spec, opciones?: opcionesMapaAleatorio, posFinal?: [number, number]) { + super(); + this.initDesdeUnaOVariasDescripciones(especificacion, opciones); + + if (posFinal) { + this.xFinal = posFinal[0]; + this.yFinal = posFinal[1]; + } + } + + ajustarGraficos() { + this.automata.escala *= this.escalaSegunCuadricula(2); + this.automata.setY(this.automata.getY() + this.automata.getAlto() / 4); + this.automata.setX(this.automata.getX() + 12) + + this.obtenerActoresConEtiquetas(["Trofeo", "Paleta", "Pulpito"]).forEach(actor => { + actor.aprender(Flotar, { Desvio: 4 }); + actor.escala *= this.escalaSegunCuadricula(0.5); + }); + + this.obtenerActoresConEtiqueta("PelotaAnimada").forEach(actor => { + actor.aprender(Flotar, { Desvio: 4 }); + actor.escala *= this.escalaSegunCuadricula(1) * 0.25; + }); + + this.obtenerActoresConEtiqueta("PingPong").forEach(actor => { + actor.aprender(Flotar, { Desvio: 4 }); + actor.escala *= this.escalaSegunCuadricula(1) * 0.15; + }); + + + this.obtenerActoresConEtiqueta("Obstaculo").forEach(actor => { + actor.escala *= this.escalaSegunCuadricula(0.7); + }); + + } + + mapearIdentificadorAActor(id, nroFila, nroColumna): ActorAnimado { + switch (id) { + case 'A': return this.automata; + case 'O': return this.obtenerObstaculo(nroFila, nroColumna); + case 'T': return new Trofeo(); + case 'E': return new Paleta(); + case 'U': return new Pulpito(); + case 'P': return new PingPong(); + case 'G': return new PelotaAnimada(0,0); + default: throw new Error("El identificador '" + id + + "' no es válido en una escena de Chuy."); + } + } + + obtenerAutomata(): Chuy { + return new Chuy(); + } + + obtenerObstaculo(fila: number, columna: number): Obstaculo { + let archivosObstaculos = ["obstaculo.chuy1.png", "obstaculo.chuy2.png", "obstaculo.chuy3.png", "obstaculo.chuy4.png"]; + return new Obstaculo(archivosObstaculos, (fila + 1) + (fila + 1) * (columna + 1)); + } + + estaEnPosicionFinalSiLaTiene(): boolean { + return this.xFinal === undefined || this.automata.casillaActual().sos(this.yFinal, this.xFinal) || this.automata.alFinalDelCamino(); + } + + noHayPelotas(): boolean { + return this.noHay("Pulpito") && this.noHay("PingPong") && this.todosLosActoresCumplen("PelotaAnimada", "patear") + } + + estaResueltoElProblema(): boolean { + return this.estaEnPosicionFinalSiLaTiene() && this.noHayPelotas() && this.noHay("Trofeo") + } + + archivoFondo() { + return "fondo.chuy.png"; + } + cuadriculaX() { + return 0; + } + cuadriculaY() { + return -20; + } + opsCuadricula() { + return { ancho: 400, alto: 380 }; + } + opsCasilla() { + return { + grilla: 'casillas.chuy.png', + cantFilas: 1, + cantColumnas: 16, + bordesDecorados: true, + relAspecto: 1, + }; + } +} \ No newline at end of file diff --git a/src/escenas/libroPrimaria/EscenaDesdeMapa.ts b/src/escenas/libroPrimaria/EscenaDesdeMapa.ts index a75cee4..348a140 100644 --- a/src/escenas/libroPrimaria/EscenaDesdeMapa.ts +++ b/src/escenas/libroPrimaria/EscenaDesdeMapa.ts @@ -94,11 +94,13 @@ abstract class EscenaDesdeMapa extends EscenaActividad { llenarCasilla(cuadricula : Cuadricula, casilla : Casilla, mapa : MapaEscena) : void { let nroFila : number = casilla.nroFila; let nroColumna : number = casilla.nroColumna; - let id : string = mapa[nroFila][nroColumna]; - if (id != '' && id != ' ' && id != '-') { // si no es casilla libre - let actor = this.mapearIdentificadorAActor(id, nroFila, nroColumna); - cuadricula.agregarActorEnCasilla(actor, casilla, true); - } + let ids : string[] = mapa[nroFila][nroColumna].split("&"); + ids.forEach(id => { + if (id != '' && id != ' ' && id != '-') { // si no es casilla libre + let actor = this.mapearIdentificadorAActor(id, nroFila, nroColumna); + cuadricula.agregarActorEnCasilla(actor, casilla, true); + } + }) } /** @@ -267,7 +269,9 @@ class GeneradorDeMapasAleatorios implements GeneradorDeMapas { var semillasEncoladas = this._semillasEncoladas; this._semillasEncoladas = []; semillasEncoladas.forEach(e => { - mapa[e.pos[0]][e.pos[1]] = e.semilla.germinar(this, e.pos); + const contenidoOriginal = mapa[e.pos[0]][e.pos[1]] + const nuevoContenido = e.semilla.germinar(this, e.pos) + mapa[e.pos[0]][e.pos[1]] = `${contenidoOriginal}&${nuevoContenido}`; }, this); } this.vaciarAnotadosParaColecciones(); @@ -362,7 +366,7 @@ interface GeneradorDeCasilla { } /** - * Contenedor temporario para la string que representará el contenido de una casilla + * Contenedor temporal para la string que representará el contenido de una casilla * de un mapa. Se utiliza durante el proceso de generación de un mapa aleatorio. */ class SemillaDeCasilla { @@ -386,6 +390,23 @@ class SemillaDeCasilla { }; } +class SemillaCompuesta extends SemillaDeCasilla { + semillas: SemillaDeCasilla[] + + constructor(semillas: SemillaDeCasilla[]) { + super(); + this.semillas = semillas; + } + + public seraVacia(): boolean { + return this.semillas.every(semilla => semilla.seraVacia()) + } + + public germinar(generador: GeneradorDeMapasAleatorios, pos: [number, number]): string { + return this.semillas.map(semilla => semilla.germinar(generador,pos)).join("&") + } +} + /** Corresponde a identificadores de la forma `[a-zA-Z0-9]+`. */ class GeneradorDeCasillaSimple implements GeneradorDeCasilla { constructor(private id : string) {} @@ -440,6 +461,19 @@ class GeneradorDeCasillaMaybe implements GeneradorDeCasilla { return 0 < proba && proba < 1; } } +class GeneradorDeCasillaAnd implements GeneradorDeCasilla { + constructor(private generador1 : GeneradorDeCasilla, private generador2: GeneradorDeCasilla) {} + + generarSemillaDeCasilla(generador : GeneradorDeMapasAleatorios) : SemillaDeCasilla { + const semilla1: SemillaDeCasilla = this.generador1.generarSemillaDeCasilla(generador) + const semilla2: SemillaDeCasilla = this.generador2.generarSemillaDeCasilla(generador) + return new SemillaCompuesta([semilla1, semilla2]) + } + + esAleatorioPara(generador): boolean { + return this.generador1.esAleatorioPara(generador) || this.generador2.esAleatorioPara(generador) + } +} /** Corresponde al modificador `|` (recursivo). */ class GeneradorDeCasillaOpcion implements GeneradorDeCasilla { diff --git a/src/escenas/libroPrimaria/EscenaYvoty.ts b/src/escenas/libroPrimaria/EscenaYvoty.ts index cde27b2..b363933 100644 --- a/src/escenas/libroPrimaria/EscenaYvoty.ts +++ b/src/escenas/libroPrimaria/EscenaYvoty.ts @@ -22,7 +22,7 @@ class EscenaYvoty extends EscenaDesdeMapa { } ajustarGraficos() { - this.automata.escala *= this.escalaSegunCuadricula(1.8); + this.automata.escala *= this.escalaSegunCuadricula(1.75); this.automata.setY(this.automata.getY() + this.automata.getAlto() / 4); this.obtenerActoresConEtiqueta("Luciernaga").forEach(actor => { @@ -69,10 +69,6 @@ class EscenaYvoty extends EscenaDesdeMapa { return new Obstaculo(archivosObstaculos, (fila + 1) + (fila + 1) * (columna + 1)); } - todosLosActoresCumplen(actor, estado) { - return this.obtenerActoresConEtiqueta(actor).every(o => o.nombreAnimacionActual() == estado); - } - luciernagasDespiertas(): boolean { return this.todosLosActoresCumplen("Luciernaga", "despierta") } @@ -89,10 +85,6 @@ class EscenaYvoty extends EscenaDesdeMapa { return this.todosLosActoresCumplen("CompuAnimada", "prendida") } - noHay(actor): boolean { - return this.contarActoresConEtiqueta(actor) == 0 - } - estaResueltoElProblema(): boolean { return this.luciernagasDespiertas() && this.celularResuelto() && this.noHay("Mariposa") && this.computadorasPrendidas() } diff --git a/src/gramaticaAleatoria.ne b/src/gramaticaAleatoria.ne index bb8d5a6..994bb5d 100644 --- a/src/gramaticaAleatoria.ne +++ b/src/gramaticaAleatoria.ne @@ -33,6 +33,8 @@ Option -> Subterm2 _ "|" _ Subterm2 Subterm2 -> Atom {% id %} | Maybe {% id %} + | And {% id %} + Maybe -> Atom _ "?" {% d => new GeneradorDeCasillaMaybe(d[0]) %} | Atom _ "?" _ "(" _ decimal _ ")" {% d => new GeneradorDeCasillaMaybe(d[0],d[6]) %} @@ -50,3 +52,5 @@ Col -> "*" {% d => new GeneradorDeCasillaColeccion() %} 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