From 6cb047e3a213d4bad50f6c29bbf80bd2eed8b38f Mon Sep 17 00:00:00 2001 From: Felipe Isusi Date: Wed, 27 Nov 2024 04:33:30 -0300 Subject: [PATCH 1/6] Movimiento update --- mapa.wlk | 1 + personaBase.wlk | 16 ++++++++++++---- posiciones.wlk | 25 ++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/mapa.wlk b/mapa.wlk index 38cc0647..d8590a4e 100644 --- a/mapa.wlk +++ b/mapa.wlk @@ -27,6 +27,7 @@ object teclas{ keyboard.right().onPressDo({remy.mover(derecha)}) keyboard.left().onPressDo({remy.mover(izquierda)}) keyboard.r().onPressDo({remy.cambiarModo()}) //correr/caminar + keyboard.p().onPressDo({remy.decirPosicion()}) } //LAS INTERACCIONES SI ANDAN SOLO QUE UNICO DETALLITO QUE SE PODRÍA CAMBIAR DESPUÉS SI PUEDO ES QUE EL MUEBLE SE TRABAJE CON UN AREA MÁS QUE CON UNA POSICION ESPECIICA PORQUE TENES QUE DARLE CLICK EN UN LUGAR MEDIO ESPECIFICO A LOS OBJETOS PARA INTERACTUAR diff --git a/personaBase.wlk b/personaBase.wlk index a770ddba..850b47d8 100644 --- a/personaBase.wlk +++ b/personaBase.wlk @@ -10,16 +10,16 @@ class Persona { const property ubicacion = restaurante1 const name = "Remy" //por default var velocidad = 1 - const velocidadMaxima = 5 + method mover(direccion) { orientacion = direccion orientacion.moverse(self, velocidad) - } + } method dondeApunta() { return orientacion.dondeMoverse(self.position(), velocidad) - } + } method name(){ return name @@ -27,7 +27,15 @@ class Persona { method cambiarModo(){ //corre -> camina / camina -> corre velocidad = - if(velocidad == 1) velocidadMaxima else 1 + if(velocidad == 1) self.velocidadMaxima() else 1 + } + + method velocidadMaxima() { + return 5 + } + + method decirPosicion() { + game.say(self, position.toString()) } } diff --git a/posiciones.wlk b/posiciones.wlk index 70d7c2f4..2a48c704 100644 --- a/posiciones.wlk +++ b/posiciones.wlk @@ -15,11 +15,18 @@ class Direccion{ } method validarMoverse(persona, distancia){ - if(persona.ubicacion().hayMuebleAqui(self.dondeMoverse(persona.position(), distancia))){ + if(not self.puedoMover(persona, distancia)){ self.error("no se puede mover ahí") } } + method puedoMover(persona, distancia) { + return not persona.ubicacion().hayMuebleAqui(self.dondeMoverse(persona.position(), distancia)) and + self.estoyEnCocina(persona.position(), distancia) + } + + method estoyEnCocina(posicion, distancia) + method mover(persona, distancia){ persona.position(self.dondeMoverse(persona.position(), distancia)) } @@ -39,6 +46,10 @@ object arriba inherits Direccion { override method dondeMoverse(positionPersona, distancia){ return positionPersona.up(distancia) } + + override method estoyEnCocina(posicion, distancia) { + return self.dondeMoverse(posicion, distancia).y() <= 70 + } } @@ -52,6 +63,10 @@ object abajo inherits Direccion { override method dondeMoverse(positionPersona, distancia) { return positionPersona.down(distancia) } + + override method estoyEnCocina(posicion, distancia) { + return self.dondeMoverse(posicion, distancia).y() >= 26 + } } object izquierda inherits Direccion { @@ -63,6 +78,10 @@ object izquierda inherits Direccion { override method dondeMoverse(positionPersona, distancia) { return positionPersona.left(distancia) } + + override method estoyEnCocina(posicion, distancia) { + return self.dondeMoverse(posicion, distancia).x() >= 2 + } } object derecha inherits Direccion { @@ -74,4 +93,8 @@ object derecha inherits Direccion { override method dondeMoverse(positionPersona, distancia) { return positionPersona.right(distancia) } + + override method estoyEnCocina(posicion, distancia) { + return self.dondeMoverse(posicion, distancia).x() <= 122 + } } From fe3a5c1710c29bb17f8280b89b2183da78e714c2 Mon Sep 17 00:00:00 2001 From: Felipe Isusi Date: Wed, 27 Nov 2024 06:49:38 -0300 Subject: [PATCH 2/6] tests listos --- adminClientes.wlk | 5 +- chefsTest.wtest | 68 ++++++++++------- clientes.wlk | 28 +++++-- clientesTest.wtest | 171 ++++++++++++++++++++++++++++++++++++++++++- objetosParaTests.wlk | 26 ++++--- objetosRecepcion.wlk | 10 ++- personaBase.wlk | 7 +- restaurante.wlk | 4 + 8 files changed, 271 insertions(+), 48 deletions(-) diff --git a/adminClientes.wlk b/adminClientes.wlk index 38bce016..27fc55f6 100644 --- a/adminClientes.wlk +++ b/adminClientes.wlk @@ -9,8 +9,11 @@ import wollok.game.* object adminCliente { const factories = #{factoryNormal, factoryPaciente, factoryQuisquilloso} var hayCliente = false - const ubicacion = restaurante1 + var ubicacion = restaurante1 + method ubicacion(_ubicacion) { + ubicacion = _ubicacion + } method crearCliente() { const nuevoCliente = self.clienteRandom() diff --git a/chefsTest.wtest b/chefsTest.wtest index 6d7961d2..c790d9bc 100644 --- a/chefsTest.wtest +++ b/chefsTest.wtest @@ -5,27 +5,41 @@ import objetosParaTests.* import wollok.game.* describe "chefs test" { - test "remy puede moverse porque no hay ningun mueble en el medio y se mueve" { + test "remy puede caminar y correr porque no hay ningun mueble en el medio y se mueve" { remy.mover(abajo) - assert.equals(game.at(0,3), remy.position()) + assert.equals(game.at(95,48), remy.position()) remy.mover(derecha) - assert.equals(game.at(1,3), remy.position()) + assert.equals(game.at(96,48), remy.position()) + + remy.cambiarModo() + + remy.mover(abajo) + assert.equals(game.at(96,43), remy.position()) + + remy.mover(derecha) + assert.equals(game.at(101,43), remy.position()) } - test "remy no puede moverse porque hay un mueble arriba suyo y a su izquiera está el límite del mapa" { - remy.position(game.at(2,4)) - assert.that(restaurantest.hayMuebleAqui(game.at(2,5))) //esto es arriba de remy + test "remy no puede caminar ni correr porque hay un mueble arriba suyo y a su izquiera está el límite del mapa" { + remy.position(game.at(2,53)) + assert.that(restaurantest.hayMuebleAqui(game.at(2,54))) //esto es arriba de remy + + assert.throwsException({ remy.moverse(arriba) }) + assert.throwsException({ remy.moverse(izquierda) }) + + remy.cambiarModo() assert.throwsException({ remy.moverse(arriba) }) assert.throwsException({ remy.moverse(izquierda) }) } test "remy agarra un ingrediente (tomate) que esta abajo suyo en donde mira, en la mesada4" { - remy.mover(abajo) + remy.position(game.at(6,34)) + remy.mover(izquierda) assert.that(remy.tengoBandejaVacia()) - assert.equals(abajo, remy.orientacion()) //a donde esta "mirando" - assert.equals(game.at(0,2), remy.dondeApunta()) + assert.equals(izquierda, remy.orientacion()) //a donde esta "mirando" + assert.equals(game.at(4,34), remy.dondeApunta()) assert.equals(mesada4, restaurantest.muebleAqui(remy.dondeApunta())) remy.interactuar() @@ -37,8 +51,8 @@ describe "chefs test" { assert.that(remy.tengoBandejaVacia()) assert.equals(derecha, remy.orientacion()) //a donde esta "mirando" - assert.equals(game.at(1,4), remy.position()) - assert.equals(game.at(2,4), remy.dondeApunta()) + assert.equals(game.at(96,49), remy.position()) + assert.equals(game.at(97,49), remy.dondeApunta()) assert.notThat(restaurantest.hayMuebleAqui(remy.dondeApunta())) assert.that(remy.tengoBandejaVacia()) @@ -46,8 +60,9 @@ describe "chefs test" { } test "remy no puede agarrar un ingrediente porque tiene algo en las manos ya" { - remy.bandeja(queso) - remy.mover(abajo) + remy.position(game.at(6,34)) + remy.bandeja(queso) + remy.mover(izquierda) assert.that(restaurantest.hayMuebleAqui(remy.dondeApunta())) assert.equals(tomate, restaurantest.muebleAqui(remy.dondeApunta()).contenido()) @@ -60,14 +75,13 @@ describe "chefs test" { } test "remy puede soltar ingrediente porque hay una mesada en donde esta mirando" { - remy.position( game.at(5,4) ) - remy.bandeja(tomate) - assert.notThat(remy.tengoBandejaVacia()) - remy.mover(abajo) + remy.position( game.at(6,31) ) + remy.bandeja(tomate) + assert.notThat(remy.tengoBandejaVacia()) + remy.mover(izquierda) - assert.that(restaurantest.hayMuebleAqui(remy.dondeApunta())) - assert.that(restaurantest.muebleAqui(remy.dondeApunta()).estoyLibre()) - assert.equals(bandejaVacia, restaurantest.muebleAqui(remy.dondeApunta()).contenido()) //-> igual que en el tomate + assert.that(restaurantest.hayMuebleAqui(remy.dondeApunta())) + assert.that(restaurantest.muebleAqui(remy.dondeApunta()).estoyLibre()) remy.interactuar() @@ -87,7 +101,8 @@ describe "chefs test" { } test "remy puede procesar el tomate porque hay una mesada allí" { - remy.mover(abajo) + remy.position( game.at(6,34) ) + remy.mover(izquierda) assert.equals(tomate, restaurantest.muebleAqui(remy.dondeApunta()).contenido()) assert.notThat(restaurantest.muebleAqui(remy.dondeApunta()).contenido().fueProcesado()) @@ -98,7 +113,8 @@ describe "chefs test" { } test "remy no puede procesar porque no hay nada que procesar en el mueble" { - remy.position(game.at(5,3)) + remy.position(game.at(6,31)) + remy.mover(izquierda) assert.that(restaurantest.hayMuebleAqui(remy.dondeApunta())) assert.that(restaurantest.muebleAqui(remy.dondeApunta()).estoyLibre()) @@ -107,8 +123,8 @@ describe "chefs test" { } test "remi va a tirar el queso que agarro a la basura y se puede porque hay un tacho" { - remy.position(game.at(3,3)) - remy.mover(arriba) + remy.position(game.at(6,28)) + remy.mover(izquierda) remy.bandeja(queso) game.addVisualCharacter(queso) @@ -123,13 +139,13 @@ describe "chefs test" { game.addVisual(masa) game.addVisual(queso) - remy.position( game.at(5,3) ) + remy.position( game.at(6,30) ) masa.serProcesado() //es importante primero procesar todos los ingredientes para poder integrarlos todos :) queso.serProcesado() masa.recibirIngrediente(queso) remy.bandeja(masa) - remy.mover(arriba) + remy.mover(izquierda) assert.notThat(remy.tengoBandejaVacia()) assert.equals(horno, restaurantest.muebleAqui(remy.dondeApunta())) diff --git a/clientes.wlk b/clientes.wlk index 9b987521..0ac6abf2 100644 --- a/clientes.wlk +++ b/clientes.wlk @@ -12,7 +12,19 @@ class Cliente inherits Persona(position = game.at(88,20)){ var pedidoQueEspero = [] var emocion = neutral var nivelDePaciencia = null - var manos = bandejaVacia + var property manos = bandejaVacia + + method emocion() { + return emocion + } + + method pedidoQueEspero(_pedidoQueEspero) { + pedidoQueEspero = _pedidoQueEspero + } + + method ubicacion(_ubicacion) { + ubicacion = _ubicacion + } method hacerPedido() { self.generarPedido() @@ -59,10 +71,16 @@ class Cliente inherits Persona(position = game.at(88,20)){ game.removeTickEvent(self) manos = pizza game.removeVisual(manos) - manos.ocultarIngredientes() + self.ocultarIngredientesDisponibles() game.schedule(1000, {self.reaccionarAPedido()}) } + method ocultarIngredientesDisponibles() { + if(self.esUnaPizza()) { + manos.ocultarIngredientes() + } + } + method ingredienteRandom() { return [ingredienteAceituna, ingredienteQueso, ingredienteAtun, ingredienteHongo].anyOne() } @@ -102,7 +120,7 @@ class Cliente inherits Persona(position = game.at(88,20)){ method reaccionMala() method plataAPagarPorPedido() { - return manos.precio() * nivelDePaciencia / 100 + return manos.precio() } method pagarPedido() { @@ -113,7 +131,7 @@ class Cliente inherits Persona(position = game.at(88,20)){ } -class ClienteNormal inherits Cliente(nivelDePaciencia = 75000, image = "cliente_normal.png", name = "cliente_normal"){ +class ClienteNormal inherits Cliente(nivelDePaciencia = 90000, image = "cliente_normal.png", name = "cliente_normal"){ const disponibilidadParaTip = 50 override method reaccionBuena(){ @@ -148,7 +166,7 @@ class ClientePaciente inherits ClienteNormal(nivelDePaciencia = 120000, image = } } -class ClienteQuisquilloso inherits Cliente(nivelDePaciencia = 50000, image = "cliente_quisquilloso.png", name = "cliente_quisquilloso"){ +class ClienteQuisquilloso inherits Cliente(nivelDePaciencia = 90000, image = "cliente_quisquilloso.png", name = "cliente_quisquilloso"){ override method reaccionBuena(){ emocion = neutral diff --git a/clientesTest.wtest b/clientesTest.wtest index c1da700b..ee8780a9 100644 --- a/clientesTest.wtest +++ b/clientesTest.wtest @@ -1,8 +1,177 @@ +import objetosRecepcion.* +import comestibles.* import adminClientes.* import clientes.* import restaurante.* import objetosParaTests.* + import wollok.game.* -//se necesitan hacer los tests \ No newline at end of file +describe "adminClientes" { + test "El admin crea y retira un cliente" { + const nuevoCliente = adminCliente.clienteRandom() + + adminCliente.ubicacion(restaurantest) + nuevoCliente.ubicacion(restaurantest) + game.addVisual(nuevoCliente) + + assert.equals([nuevoCliente], game.getObjectsIn(restaurantest.mostrador())) + + adminCliente.eliminar(nuevoCliente) + + assert.equals([], game.getObjectsIn(restaurantest.mostrador())) + } + + test "El cliente genera un pedido con 3 ingredientes random mas la salsa como ingrediente fijo" { + const nuevoCliente = adminCliente.clienteRandom() + + adminCliente.ubicacion(restaurantest) + nuevoCliente.ubicacion(restaurantest) + game.addVisual(nuevoCliente) + + nuevoCliente.generarPedido() + + assert.that(nuevoCliente.pedidoQueEspero().size() == 4) + assert.that(nuevoCliente.pedidoQueEspero().any({i => i == ingredienteSalsa })) + + } + + test "El mostrador recibe una pizza y el cliente la recoge" { + const nuevoCliente = adminCliente.clienteRandom() + adminCliente.ubicacion(restaurantest) + restaurantest.clientes().add(nuevoCliente) + mostrador.ubicacion(restaurantest) + nuevoCliente.ubicacion(restaurantest) + game.addVisual(nuevoCliente) + + const pizza = new Masa(ingredientes = [ingredienteSalsa, ingredienteHongo, ingredienteQueso, ingredienteTomate]) + mostrador.contenido(pizza) + + mostrador.avisarACliente() + + assert.equals(pizza, nuevoCliente.manos()) + } + + test "Un cliente Normal/Paciente recibe el pedido correcto, tiene una buena reaccion" { + const nuevoCliente = factoryNormal.crearCliente() + + adminCliente.ubicacion(restaurantest) + nuevoCliente.ubicacion(restaurantest) + game.addVisual(nuevoCliente) + + assert.equals([nuevoCliente], game.getObjectsIn(restaurantest.mostrador())) + + nuevoCliente.pedidoQueEspero([ingredienteSalsa, ingredienteHongo, ingredienteQueso, ingredienteTomate]) + nuevoCliente.manos(new Masa(ingredientes = [new Tomate(tipo = ingredienteSalsa), + new Hongo(), new Queso(), new Tomate()])) + + assert.that(nuevoCliente.esLaPizzaQuePedi()) + + nuevoCliente.reaccionBuena() + + assert.that(caja.plata() >= 920) + assert.equals(feliz, nuevoCliente.emocion()) + + } + + test "Un cliente Normal recibe el pedido incorrecto y tiene una mala reaccion" { + const nuevoCliente = factoryNormal.crearCliente() + + adminCliente.ubicacion(restaurantest) + nuevoCliente.ubicacion(restaurantest) + game.addVisual(nuevoCliente) + + assert.equals([nuevoCliente], game.getObjectsIn(restaurantest.mostrador())) + + nuevoCliente.pedidoQueEspero([ingredienteSalsa, ingredienteHongo, ingredienteQueso, ingredienteTomate]) + nuevoCliente.manos(new Masa(ingredientes = [new Tomate(), new Hongo(), new Queso(), new Tomate()])) + + assert.notThat(nuevoCliente.esLaPizzaQuePedi()) + + nuevoCliente.reaccionMala() + + assert.equals(decepcionado, nuevoCliente.emocion()) + } + + test "Un cliente Paciente recibe el pedido incorrecto y tiene una mala reaccion" { + const nuevoCliente = factoryPaciente.crearCliente() + + adminCliente.ubicacion(restaurantest) + nuevoCliente.ubicacion(restaurantest) + game.addVisual(nuevoCliente) + + assert.equals([nuevoCliente], game.getObjectsIn(restaurantest.mostrador())) + + nuevoCliente.pedidoQueEspero([ingredienteSalsa, ingredienteHongo, ingredienteQueso, ingredienteTomate]) + nuevoCliente.manos(new Masa(ingredientes = [new Tomate(), new Hongo(), new Queso(), new Tomate()])) + + assert.notThat(nuevoCliente.esLaPizzaQuePedi()) + + nuevoCliente.reaccionMala() + + assert.equals(neutral, nuevoCliente.emocion()) + } + + test "Un cliente Quisquilloso recibe el pedido correcto y tiene una buena reaccion" { + const nuevoCliente = factoryQuisquilloso.crearCliente() + + adminCliente.ubicacion(restaurantest) + nuevoCliente.ubicacion(restaurantest) + game.addVisual(nuevoCliente) + + assert.equals([nuevoCliente], game.getObjectsIn(restaurantest.mostrador())) + + nuevoCliente.pedidoQueEspero([ingredienteSalsa, ingredienteHongo, ingredienteQueso, ingredienteTomate]) + nuevoCliente.manos(new Masa(ingredientes = [new Tomate(tipo = ingredienteSalsa), new Hongo(), new Queso(), new Tomate()])) + + assert.that(nuevoCliente.esLaPizzaQuePedi()) + + nuevoCliente.reaccionBuena() + + assert.equals(900, caja.plata()) + assert.equals(neutral, nuevoCliente.emocion()) + } + + test "Un cliente Quisquilloso recibe el pedido incorrecto y tiene una mala reaccion" { + const nuevoCliente = factoryQuisquilloso.crearCliente() + + adminCliente.ubicacion(restaurantest) + nuevoCliente.ubicacion(restaurantest) + game.addVisual(nuevoCliente) + caja.recibir(1000) + + assert.equals([nuevoCliente], game.getObjectsIn(restaurantest.mostrador())) + + nuevoCliente.pedidoQueEspero([ingredienteSalsa, ingredienteHongo, ingredienteQueso, ingredienteTomate]) + nuevoCliente.manos(new Masa(ingredientes = [new Tomate(), new Hongo(), new Queso(), new Tomate()])) + + assert.notThat(nuevoCliente.esLaPizzaQuePedi()) + + nuevoCliente.reaccionMala() + + assert.equals(900, caja.plata()) + assert.equals(enojado, nuevoCliente.emocion()) + } + + test "Un cliente Normal recibe un ingrediente en vez de una pizza y tiene una mala reaccion" { + const nuevoCliente = factoryNormal.crearCliente() + adminCliente.ubicacion(restaurantest) + restaurantest.clientes().add(nuevoCliente) + mostrador.ubicacion(restaurantest) + nuevoCliente.ubicacion(restaurantest) + game.addVisual(nuevoCliente) + + + mostrador.contenido(new Tomate()) + + mostrador.avisarACliente() + + assert.notThat(nuevoCliente.esUnaPizza()) + + nuevoCliente.reaccionarAPedido() + + assert.equals(decepcionado, nuevoCliente.emocion()) + } + + } diff --git a/objetosParaTests.wlk b/objetosParaTests.wlk index 5d9e2491..2422a3db 100644 --- a/objetosParaTests.wlk +++ b/objetosParaTests.wlk @@ -7,31 +7,33 @@ import objetosCocina.* import ingredientesBase.* import comestibles.* import clientes.* +import objetosRecepcion.* import wollok.game.* const restaurantest = new Restaurante(muebles = [mesada, tacho, mesada2, horno, mesada3, horno2, mesada4, mesada5, mesada6, estacionTomate, estacionQueso, estacionMasa, estacionHuevo, estacionAtun, estacionAceituna,estacionHongo]) -const remy = new Chef( name = "remy", position = game.at(0,4), image = "remy_abajo.png", ubicacion = restaurantest) +const remy = new Chef( name = "remy", position = game.at(95,49), image = "remy_abajo.png", ubicacion = restaurantest) //tomates factory //masas factory -const mesada = new Mesada(position = game.at(2,5), contenido = masa) -const tacho = new Tacho(position = game.at(3,5)) -const mesada2 = new Mesada(position = game.at(4,5), contenido = queso) -const horno = new Horno(position = game.at(5,5)) -const mesada3 = new Mesada(position = game.at(6,5)) -const horno2 = new Horno(position = game.at(7,5)) -const mesadaX = new Mesada(position = game.at(10,10)) - -const mesada4 = new Mesada(position = game.at(0,2), contenido = tomate) +const mesada = new Mesada(position = game.at(4,27), contenido = masa) +const tacho = new Tacho(position = game.at(4,28)) +const mesada2 = new Mesada(position = game.at(4,29), contenido = queso) +const horno = new Horno(position = game.at(4,30)) +const mesada3 = new Mesada(position = game.at(4,31)) +const horno2 = new Horno(position = game.at(4,32)) +const mesadaX = new Mesada(position = game.at(4,33)) +const mostrador = new Mostrador(position = game.at(86,25)) + +const mesada4 = new Mesada(position = game.at(4,34), contenido = tomate) //aceitunas factory //queso factory //hongos factory //huevos factory -const mesada5 = new Mesada(position = game.at(5,2)) -const mesada6 = new Mesada(position = game.at(6,2)) +const mesada5 = new Mesada(position = game.at(2,54)) +const mesada6 = new Mesada(position = game.at(4,36)) //atun factory diff --git a/objetosRecepcion.wlk b/objetosRecepcion.wlk index e259f953..0c677483 100644 --- a/objetosRecepcion.wlk +++ b/objetosRecepcion.wlk @@ -8,6 +8,11 @@ object caja { const property position = game.at(76, 25) var plata = 0 + + method plata() { + return plata + } + method recibir(_plata){ plata += _plata self.decirPlata() @@ -34,8 +39,11 @@ class MuebleSeparador inherits Mueble(image = "separador_recepcion.png"){ } class Mostrador inherits MuebleParaCocinar(image = "mueble_entrega.png") { - const ubicacion = restaurante1 + var ubicacion = restaurante1 + method ubicacion(_ubicacion) { + ubicacion = _ubicacion + } override method accionDeRecibir() { self.validarAccionRecibir() diff --git a/personaBase.wlk b/personaBase.wlk index 850b47d8..e18602af 100644 --- a/personaBase.wlk +++ b/personaBase.wlk @@ -7,10 +7,13 @@ class Persona { var property orientacion = abajo //en donde está mirando, property para los tests var property position = game.at(0,0) var property image = "Remy_down.png" //por default - const property ubicacion = restaurante1 + var ubicacion = restaurante1 const name = "Remy" //por default var velocidad = 1 - + + method ubicacion() { + return ubicacion + } method mover(direccion) { orientacion = direccion diff --git a/restaurante.wlk b/restaurante.wlk index cc8b686b..f78d95de 100644 --- a/restaurante.wlk +++ b/restaurante.wlk @@ -35,6 +35,10 @@ class Restaurante { method llegoCliente() { return not clientes.isEmpty() } + + method mostrador() { + return game.at(88,20) + } } From c75215c9f97bc6963bcc3a4b6cf2d5cf7c1b60de Mon Sep 17 00:00:00 2001 From: RomaSof Date: Wed, 27 Nov 2024 14:09:00 -0300 Subject: [PATCH 3/6] Update restaurante.wlk --- restaurante.wlk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/restaurante.wlk b/restaurante.wlk index f78d95de..1a663e84 100644 --- a/restaurante.wlk +++ b/restaurante.wlk @@ -4,6 +4,8 @@ import factoryIngredientes.* import objetosParaTests.* import clientes.* +import wollok.game.* + class Restaurante { From 2d737fddbc9f234cb0caccf34761dd4d69a35612 Mon Sep 17 00:00:00 2001 From: Felipe Isusi Date: Wed, 27 Nov 2024 15:19:21 -0300 Subject: [PATCH 4/6] tests y cambios varios --- README.md | 1 + adminClientes.wlk | 5 +---- assets/cartel.png | Bin 0 -> 30263 bytes chefs.wlk | 6 +++++- clientes.wlk | 16 +++------------- clientesTest.wtest | 2 +- mapa.wlk | 8 +++++++- mapaObjetos.wlk | 33 ++++++++++++++++++++++++++++++++- objetosRecepcion.wlk | 3 ++- personaBase.wlk | 4 ---- restaurante.wlk | 2 +- restauranteTest.wtest | 10 +++++----- 12 files changed, 58 insertions(+), 32 deletions(-) create mode 100644 assets/cartel.png diff --git a/README.md b/README.md index d2f04b13..573f38ae 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ TECLAS: - ←/↑/→/↓ : moverse - Q : interactuar con los objetos - W : procesar ingredientes +- E : preguntar pedido - R : cambiar modo de correr a caminar/ caminar a correr diff --git a/adminClientes.wlk b/adminClientes.wlk index 27fc55f6..d57bc443 100644 --- a/adminClientes.wlk +++ b/adminClientes.wlk @@ -4,8 +4,6 @@ import mapaObjetos.* import wollok.game.* -//se necesitan comentarios sobre los onTick y Schedules, no los entiendo - object adminCliente { const factories = #{factoryNormal, factoryPaciente, factoryQuisquilloso} var hayCliente = false @@ -17,11 +15,10 @@ object adminCliente { method crearCliente() { const nuevoCliente = self.clienteRandom() + ubicacion.clientes().add(nuevoCliente) game.addVisual(nuevoCliente) - nuevoCliente.hacerPedido() - } method retirarCliente(cliente) { diff --git a/assets/cartel.png b/assets/cartel.png new file mode 100644 index 0000000000000000000000000000000000000000..a1732c0167a16c53589d24b57c7cd346eb24475d GIT binary patch literal 30263 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 O0000= 920) + assert.that(caja.plata() >= 905) assert.equals(feliz, nuevoCliente.emocion()) } diff --git a/mapa.wlk b/mapa.wlk index d8590a4e..57a2a6d6 100644 --- a/mapa.wlk +++ b/mapa.wlk @@ -27,7 +27,7 @@ object teclas{ keyboard.right().onPressDo({remy.mover(derecha)}) keyboard.left().onPressDo({remy.mover(izquierda)}) keyboard.r().onPressDo({remy.cambiarModo()}) //correr/caminar - keyboard.p().onPressDo({remy.decirPosicion()}) + keyboard.e().onPressDo({remy.preguntarPedido()}) } //LAS INTERACCIONES SI ANDAN SOLO QUE UNICO DETALLITO QUE SE PODRÍA CAMBIAR DESPUÉS SI PUEDO ES QUE EL MUEBLE SE TRABAJE CON UN AREA MÁS QUE CON UNA POSICION ESPECIICA PORQUE TENES QUE DARLE CLICK EN UN LUGAR MEDIO ESPECIFICO A LOS OBJETOS PARA INTERACTUAR @@ -87,6 +87,12 @@ object imagenes { game.addVisual(sep10) game.addVisual(deco1) game.addVisual(deco2) + /*game.addVisual(cartel1) + game.addVisual(cartel2) + game.addVisual(texto1) + game.addVisual(texto2) + game.addVisual(texto3) + game.addVisual(texto4)*/ } } diff --git a/mapaObjetos.wlk b/mapaObjetos.wlk index c617638b..8b13bf84 100644 --- a/mapaObjetos.wlk +++ b/mapaObjetos.wlk @@ -63,4 +63,35 @@ const sep10 = new MuebleSeparador(position = game.at(6,25)) //decoracion: const deco1 = new MesaDeco(position = game.at(22,12)) -const deco2 = new MesaDeco(position = game.at(49,12)) \ No newline at end of file +const deco2 = new MesaDeco(position = game.at(49,12)) + +/*Interfaz +const cartel1 = new Cartel(position = game.at(0,0)) +const cartel2 = new Cartel(position = game.at(0,6)) +const texto1 = new Text(position = game.at(7,2), textoAMostrar = caja.plata().toString() + "$") +const texto2 = new Text(position = game.at(7,8), textoAMostrar = caja.objetivo().toString() + "$") +const texto3 = new Text(position = game.at(3,11), textoAMostrar = "Objetivo:") +const texto4 = new Text(position = game.at(6,5), textoAMostrar = "Total Acumulado:") + +class Cartel { + const property position = null + const property image = "cartel.png" + +} + +class Text { + const objetoFuente = caja + const property position = null + var textoAMostrar = null //caja.plata().toString() + "$" + + method text() { + return textoAMostrar + } + + method textColor(){ + return "FF000FFF" + } + +} + +//class TextObjetivo inherits Text() {}*/ \ No newline at end of file diff --git a/objetosRecepcion.wlk b/objetosRecepcion.wlk index 0c677483..f9bb0dc4 100644 --- a/objetosRecepcion.wlk +++ b/objetosRecepcion.wlk @@ -6,6 +6,7 @@ import personaBase.* object caja { const property image = "caja.png" const property position = game.at(76, 25) + var property objetivo = 5000 var plata = 0 @@ -58,7 +59,7 @@ class Mostrador inherits MuebleParaCocinar(image = "mueble_entrega.png") { } method avisarACliente() { - ubicacion.cliente().recibirPedido(contenido) + ubicacion.clienteActual().recibirPedido(contenido) contenido = bandejaVacia } } diff --git a/personaBase.wlk b/personaBase.wlk index e18602af..e92061b7 100644 --- a/personaBase.wlk +++ b/personaBase.wlk @@ -37,10 +37,6 @@ class Persona { return 5 } - method decirPosicion() { - game.say(self, position.toString()) - } - } object bandejaVacia { diff --git a/restaurante.wlk b/restaurante.wlk index 1a663e84..cb268f3b 100644 --- a/restaurante.wlk +++ b/restaurante.wlk @@ -30,7 +30,7 @@ class Restaurante { } - method cliente() { + method clienteActual() { return clientes.head() } diff --git a/restauranteTest.wtest b/restauranteTest.wtest index b276e137..acdc5934 100644 --- a/restauranteTest.wtest +++ b/restauranteTest.wtest @@ -8,13 +8,13 @@ import wollok.game.* describe "restaurante" { test "busca objetos que hay y te devuelve el objeto en esa dirección" { assert.notThat(restaurantest.hayMuebleAqui( game.at(1, 0) )) - assert.equals(horno, restaurantest.muebleAqui( game.at(5, 5) )) + assert.equals(horno, restaurantest.muebleAqui( game.at(4,30) )) - assert.that(restaurantest.hayMuebleAqui( game.at(2, 5) )) - assert.equals(mesada, restaurantest.muebleAqui( game.at(2, 5) )) + assert.that(restaurantest.hayMuebleAqui( game.at(4,27) )) + assert.equals(mesada, restaurantest.muebleAqui( game.at(4,27) )) - assert.that(restaurantest.hayMuebleAqui( game.at(4, 5) )) - assert.equals(mesada2, restaurantest.muebleAqui( game.at(4, 5) )) + assert.that(restaurantest.hayMuebleAqui( game.at(4,29) )) + assert.equals(mesada2, restaurantest.muebleAqui( game.at(4,29) )) } test "busca objetos que no hay entonces no da error cuando te devuelve los objetos en esa dirección sino que te devuelve el mueble fantasma" { From 8d515a8e9429df18df6882b3bf158386a696f05a Mon Sep 17 00:00:00 2001 From: Felipe Isusi Date: Wed, 27 Nov 2024 17:03:40 -0300 Subject: [PATCH 5/6] cambios varios --- README.md | 1 + adminDeVictoria.wlk | 21 +++++++++++++++++++++ assets/derrota.png | Bin 0 -> 40668 bytes assets/victoria.png | Bin 0 -> 9905 bytes chefs.wlk | 6 ++++++ mapa.wlk | 8 ++------ mapaObjetos.wlk | 32 ++++++-------------------------- objetosRecepcion.wlk | 17 +++++++++++------ wollocook.wpgm | 2 ++ 9 files changed, 49 insertions(+), 38 deletions(-) create mode 100644 adminDeVictoria.wlk create mode 100644 assets/derrota.png create mode 100644 assets/victoria.png diff --git a/README.md b/README.md index 573f38ae..5291536e 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ TECLAS: - W : procesar ingredientes - E : preguntar pedido - R : cambiar modo de correr a caminar/ caminar a correr +- T : indica cuanto dinero falta para ganar ## Otros diff --git a/adminDeVictoria.wlk b/adminDeVictoria.wlk new file mode 100644 index 00000000..1cfb196a --- /dev/null +++ b/adminDeVictoria.wlk @@ -0,0 +1,21 @@ +import mapaObjetos.* +import wollok.game.* +import objetosRecepcion.* + + +object adminWinCon { + const cajaFondos = caja + + method ganar() { + game.addVisual(youWin) + game.schedule(3000, {game.stop()}) + } + + method perder() { + if(caja.plata() <= caja.objetivo()) { + game.addVisual(youLose) + game.schedule(3000, {game.stop()}) + } + + } +} \ No newline at end of file diff --git a/assets/derrota.png b/assets/derrota.png new file mode 100644 index 0000000000000000000000000000000000000000..0d70642eebec98e16ac25beb920b7fbc02648267 GIT binary patch literal 40668 zcmW(+1z3|^8>YKKy1QF)bT<-`(nw3g=p5ap(v1jG64G5F4bt5`BsOyYzW=)RuCBd1 z=R9%F6ZajjtF3~IMTv!gfPkx}s;Gy6fM^GQ--Lk%fA+<0sYE~sM^ICgGXPqg7x)KL zFSbJ-VBIW;YZb zfCw^XTx~JZtvR=@{{6bbI{v&l?fvn+sZ?ji`_*h7D%kZ)ZL?%mk+}Dv(~;O9 zzlU(i+2bhI=4;8elS<}j2`d3ck_#|o0(7MB6dKh(`nZR2m8l07u9zcD(dQ?xC6~S* z@=PeTs(okZt4XdUo?H2*zn&u-;jY2;P4?iOM$UzEHmt1k^`_H zRV1bP{vXW{Fly=ZV7<)T&V}S0c^wT162q*fFmP4jtlL8KZzmjkC{{lOTt(PlPrZc+IgVn1$N^py`XU=hRIL@O)9pXVl*U=@xIDXj8Z)tMhw>T z#g>(9#9~`aH->)}HwE_WB{zQKoAwq418Pt$gVg)ysej;f(1)4t)DvX)-PDmt1NU$( zww(K(nkm78Bg9=gHM4Di`q_aS8eH4-BVe)Vjf-wN>Xyyt$SMlF!X7=~D|}46w_Vck zyJ`8rfkcZWbl`s@$XzLWG!`)R?EoXJ=`gsk@L3kWj}}YX_0+JV>Ijhl+}>{6dqD3F z`fkW|z#X)>V38bWm$%s*@Ub$cQM5EVLf6~#y21xXP zG@oN}(WYUJF_0x-X+vRf5+?|vzyc1Wv$Z3+w{IDV{Vb5yN+~@JHxWxbKx+E_@I20_XJ{`SbzL7j`YQ>|75I^EZ>Imq zi~~rCM>jnvUfD&vhiS3o+&4k)0_F7*13s$nJfxQ66n+wmS!ei+ZFzvtR&hFbHX&}V z11lrkge;bt+Jhh8V{OUNVgYGl;LBVGKPES)0NgmBUs8vErM`*cy!$68`ugJ0i;MR8 zzz}P?ml8Zh0hjx~S8`myv;v~LQ9C#okIi-^HaKadskRJL+EQ840a%2Osxz?zH_$Y7 zsZdYa(2aByckEcpu%v%GA>x$4!o`@+qVSgh=-H`p{{#&_SRy5>|KIjOmcov4cBj}s zfHKl_O$MNbv56i!&w$^XvRzMH20AjsDvVjf#B&e=CY|<;vfvl-MNNK9AGoRgxM_=9 z@6B>|w8y`>eMjSFhJC}`RfR73)wXLBGJ4IX*X|()^8nv2hJO}-|KLSTclp)pjSqF< zk?y`f>GP8UW?iB@apQTp+r}O6Z1sEao zBCQSXA?E>X$&U>3#x6m0`_DYt*}04Ak+b{OL`<>He*5=RZ??kiMMhvh(j2cVjfrBj z^%|vU2<}C-Ojn6J+j|l@wtvn{In43C##$O-)a!Eqa~q4-A5-3RO~M@mYbQjS9Pr^S zg+cWw*SjBB*Ik?uOJ4`;k9;{$b@VaeUNdl0kJk0_pX;G5@3_ey+D( zyVM}on~D2Ua{+_k^WKN=N?3)ht2iABhmwivJM}p5o8jO1@dG=q(df#Y`zJUI4?PZU zd=~e0b9}{iF1X>IMjrgh2-yOye$DYz+}Pq7;ygGpp@1z4yVMnQuGsYOu)ed3gs79N zy*{h?Gkb}xzFQ9K(wR8f@~Wf2vY3L)nmRP3B1;H@RZoRim@>E~MAE#syJd(}KLHG1 zYBUE*2mGdpYP6f7@nQ%*lQH$_&Lvs8*+U4MOMTn*JcwANvIiQF_!qhd7BQR?DI857 z>OYg*+=vU_jaqgNvK6FhrW3_dxZbF9kV7F% z5m#0*Q8EH4cEGg}s;(aRiS!;m1-N41YZwvgx>OyQoA~8isxDn}CY-jqd+v_05B8GR87saT8o1#on7u(d+>wl>ZzR z!(E|*dbG$iU%e>q8B>?THrt)n0#=s!nik#l65GVbE^NcETJ*pl&wJ}%NOYpUv;Vd= z8Yv$klI3(@9KyE6klj(a3htn`4c1RzG28h)6;^}t8ZD6p?trVPmq@X&2`O85AyggU zgkDUNl8R&U?n6u+oqJ*>`-~xK$CFnM8e5XV(LiQ{@&&Ho-J7ixJ1BE)^y$G7uW167!YpA< z6b2V1PGiG63ZG0;`K|U}iTU3t82K7!W|2;Lzbh;X!18!CFf?eR-{K>6Abk)mK0&i% zLecR+EAKOK3`EFP_AU|b_^wc;qZM0ng5f9;iG+)27*iLpp(IT|gCkFNtcYo{ZbjY^ zfp9>KA&;dQVW$a_zgTj#rc#}ScCuey#njO|vSX0bl6T-J%v;SscITZmXgSTW7874} zZ^uhhqk)ql;5gI*X;e<6gy=xf;{x^vqmtQfgHoy6f>J6ll{NIPI<4igM_~U>W^UV! z=0BTevF)M1p~{DEMGsz3t`%TKeh&pjf~=8UGz%`9#+{hUUp3VA33J@gVxd z=>eP1N{Kn!3jq_wB7Y)k(S~>pxHDKD+ei#T$F7FE(&)%|zoguJ=IxvFp6bu|nX{{Z zWFGgZv@{@kps#y}b{uHs(HsGz3PeEU2}e^JKADd+?r@Ztl5!Bp;gO`9$SH`mKPrgz zo|eHsnmYuSO=HnQmU=lNG{=#-(s5 z{ARndOWf#sg2XL(#LX?~5dRb~g^*MDljMfC3#s2^qL}<=$(bCv1kWj+L~=84ughfgh$wUg+`;tN`RQ}iBeis0qVFIMJ^#XWepQy=oR%i zxHUQJdptMBYtVmZb?+;Az%g2m6}z-BwCl^>_0EcW7+&()ro4tXac-VjqNB4jp|FU^ z-uTuhxxue(12vivj2vk%x4-kr_;5C^Y<9p4+bK7P);BeX#z z3GQ30vVF?ym36uCYZkupc2d;Pzd^{&Gi|VjgqnNIcc(>SmyDtLtiIGV3$c2}q8R$o zrw{L|!6MP!JF(VYUy*Y2{7M_+S1;y{=N6*7C$*OUcF^&KHjp{+!We`5+jn{P~hkgpxD_kJbr|WIUYlWX3?@TrVIbamF{l_ThT*z@g+~!*aK5 zA=JlVj{gEDcOLz^MW%)6mlf{wZv*l`jEFvZat0JsIR@=9Z}knu;HOG#f|Yyk;H>4; zsP|Y>CpaBKCU)K?`(EvY^97S7qVrM6D;B|LOIHe#AuL@Zc8-WN9eu}x1UI#o)vB<} zFN$x4zai4FeJ2K&QIXO2?AhPi*&L6T&t|H{PhV=HZLGM`t+?V{RpISsz@T`|9AxtP zkuxMRK8BGc9P$f&Lq1LrgEL_!5x_lVyPpDfO%!%Y(l2&R;^kiAK6kgflPTOe zwV@b2V8(Bzs(%unsV7p&daFhvOU1pCq=A;%kyYbD@Q?;OU!18sR16q8%B~2i{Dv`x zRT=bReEc;|Cd8j*mxn4n&YzK1=a!Jk25;6FDczA;Cd6JQ^5zvD*yC zE1mTb*ejF|JY^cM=1d-{6v^z7?fz-&e$mKRk*vIS0S8xkrZ4^ zNwIu_B@)P-0BkOD6i!)^^fnHjAN*2Yh+MA%I$1ogd`(kq{|SI4(Y+qo zFT-|j;zmprB~d{a32Zajs-@%VdpgN#e@tF+HD^fs*eH-Mi_`&jsR9xSSM#CJ7SPho z)eR1Z!r|IIJPcsxjtvV-LQ-X@q{QGv)4u&~yj$JRwPlHT)_2x0$<94b^yNKbC8*q< z$vF=?{zw{qxP_MLo@<xIdydDZ+>bDBs6Ao zDr8LAR&|)TAp?^+Q;k`RxYB7rozv>oQ5{+aS z{=93Hy;(zTsOwsceN~!j)$k`+HZn!N=gZ(XOzxOkw8T;8FF`*{!A+bXzK{P;GB@wj z`RBUOKBNUG!#^L^?>W>AIrn!8Z?>R z9OOtveOHxL{toCg<51-9)ZyP}22A9I2S!y4`3GeXVL?0G)W9dTTV{VI zH&;%DsgNfp5M&`6V2?IhH-UP>fJFXnNeQ^Lj*r+ z){HvI$@By~wH!mYA;%}q%B-{?t;Fw6rBcqNKbT_f@3nneTgra4pk6$g&4zA=Yf!DO zuFh_B2dmv%rPPVn>x;Z1<16S_*42t z4A75V%)wwSM>Io%^48Ee3&j_gfe_z#l=`Z7yQ-+0xiyAk0H`ZGeT| zBn7k&qx7zS5@DrCWXLv7OFT+OrkjVSl}1SL01x~;3XfSqI2=vv(e6JcB91(h)II#h z5lu#MQX`doGr|8LpJYqzrHC3uhHMGtxM}5>X_bUw9WJah&cop4iJ+1hJd<3U4_
&A-yIX!c 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 literal 0 HcmV?d00001 diff --git a/chefs.wlk b/chefs.wlk index bdfddc5d..d881a5ff 100644 --- a/chefs.wlk +++ b/chefs.wlk @@ -1,10 +1,12 @@ import personaBase.* import posiciones.* +import objetosRecepcion.* import wollok.game.* class Chef inherits Persona { var property bandeja = bandejaVacia + const fondos = caja method tengoBandejaVacia() { return bandeja.esVacio() @@ -45,5 +47,9 @@ class Chef inherits Persona { method preguntarPedido() { ubicacion.clienteActual().anunciarPedido() } + + method decirCuantoFalta() { + game.say(self, "Todavia falta recolectar " + fondos.cuantoFalta() + "$") + } } diff --git a/mapa.wlk b/mapa.wlk index 57a2a6d6..bbb0f66b 100644 --- a/mapa.wlk +++ b/mapa.wlk @@ -1,3 +1,4 @@ +import adminDeVictoria.* import factoryIngredientes.* import objetosRecepcion.* import posiciones.* @@ -28,6 +29,7 @@ object teclas{ keyboard.left().onPressDo({remy.mover(izquierda)}) keyboard.r().onPressDo({remy.cambiarModo()}) //correr/caminar keyboard.e().onPressDo({remy.preguntarPedido()}) + keyboard.t().onPressDo({remy.decirCuantoFalta()}) } //LAS INTERACCIONES SI ANDAN SOLO QUE UNICO DETALLITO QUE SE PODRÍA CAMBIAR DESPUÉS SI PUEDO ES QUE EL MUEBLE SE TRABAJE CON UN AREA MÁS QUE CON UNA POSICION ESPECIICA PORQUE TENES QUE DARLE CLICK EN UN LUGAR MEDIO ESPECIFICO A LOS OBJETOS PARA INTERACTUAR @@ -87,12 +89,6 @@ object imagenes { game.addVisual(sep10) game.addVisual(deco1) game.addVisual(deco2) - /*game.addVisual(cartel1) - game.addVisual(cartel2) - game.addVisual(texto1) - game.addVisual(texto2) - game.addVisual(texto3) - game.addVisual(texto4)*/ } } diff --git a/mapaObjetos.wlk b/mapaObjetos.wlk index 8b13bf84..5d018eee 100644 --- a/mapaObjetos.wlk +++ b/mapaObjetos.wlk @@ -65,33 +65,13 @@ const sep10 = new MuebleSeparador(position = game.at(6,25)) const deco1 = new MesaDeco(position = game.at(22,12)) const deco2 = new MesaDeco(position = game.at(49,12)) -/*Interfaz -const cartel1 = new Cartel(position = game.at(0,0)) -const cartel2 = new Cartel(position = game.at(0,6)) -const texto1 = new Text(position = game.at(7,2), textoAMostrar = caja.plata().toString() + "$") -const texto2 = new Text(position = game.at(7,8), textoAMostrar = caja.objetivo().toString() + "$") -const texto3 = new Text(position = game.at(3,11), textoAMostrar = "Objetivo:") -const texto4 = new Text(position = game.at(6,5), textoAMostrar = "Total Acumulado:") - -class Cartel { - const property position = null - const property image = "cartel.png" +object youWin { + const property image = "victoria.png" + const property position = game.at(52,40) } -class Text { - const objetoFuente = caja - const property position = null - var textoAMostrar = null //caja.plata().toString() + "$" - - method text() { - return textoAMostrar - } - - method textColor(){ - return "FF000FFF" - } - +object youLose { + const property image = "derrota.png" + const property position = game.at(53,41) } - -//class TextObjetivo inherits Text() {}*/ \ No newline at end of file diff --git a/objetosRecepcion.wlk b/objetosRecepcion.wlk index f9bb0dc4..8fa46804 100644 --- a/objetosRecepcion.wlk +++ b/objetosRecepcion.wlk @@ -2,11 +2,12 @@ import mueblesBase.* import mapaObjetos.* import wollok.game.* import personaBase.* +import adminDeVictoria.* object caja { const property image = "caja.png" const property position = game.at(76, 25) - var property objetivo = 5000 + var property objetivo = 3100 var plata = 0 @@ -16,21 +17,25 @@ object caja { method recibir(_plata){ plata += _plata - self.decirPlata() + self.considerarVictoria() + } + + method considerarVictoria() { + if(plata >= objetivo) { + adminWinCon.ganar() + } } method gastar(_plata){ plata -= _plata - self.decirPlata() } - method decirPlata(){ - game.say(self, plata) + method cuantoFalta() { + return (objetivo - plata).max(0).toString() } method recibirTip(tip){ self.recibir(tip) - self.decirPlata() } } diff --git a/wollocook.wpgm b/wollocook.wpgm index 17b1e399..ad5e13bb 100644 --- a/wollocook.wpgm +++ b/wollocook.wpgm @@ -1,3 +1,4 @@ +import adminDeVictoria.* import mapaObjetos.* import mapa.* import adminClientes.* @@ -30,6 +31,7 @@ program wollocook { imagenes.mueblesRes() game.schedule(1000, {adminCliente.crearCliente()}) + game.schedule(500000, {adminWinCon.perder()}) game.start() } From 2d2f32957c2632e7ed7dae4e87ba46e07dbc5b30 Mon Sep 17 00:00:00 2001 From: Felipe Isusi Date: Wed, 27 Nov 2024 18:26:38 -0300 Subject: [PATCH 6/6] ultimos cambios done --- adminClientes.wlk | 10 +++++----- adminDeVictoria.wlk | 2 +- clientes.wlk | 3 +-- clientesTest.wtest | 17 ++++++++++------- restaurante.wlk | 12 ++++++++++++ 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/adminClientes.wlk b/adminClientes.wlk index d57bc443..e1bde78e 100644 --- a/adminClientes.wlk +++ b/adminClientes.wlk @@ -6,7 +6,6 @@ import wollok.game.* object adminCliente { const factories = #{factoryNormal, factoryPaciente, factoryQuisquilloso} - var hayCliente = false var ubicacion = restaurante1 method ubicacion(_ubicacion) { @@ -14,23 +13,24 @@ object adminCliente { } method crearCliente() { + const nuevoCliente = self.clienteRandom() - ubicacion.clientes().add(nuevoCliente) + ubicacion.addCliente(nuevoCliente) game.addVisual(nuevoCliente) nuevoCliente.hacerPedido() + + } method retirarCliente(cliente) { game.removeTickEvent(cliente) - cliente.mover(abajo) game.schedule(500, {self.eliminar(cliente)}) } method eliminar(cliente) { - ubicacion.clientes().remove(cliente) + ubicacion.quitarCliente(cliente) game.removeVisual(cliente) - hayCliente = false game.schedule(1500, {self.crearCliente()}) } diff --git a/adminDeVictoria.wlk b/adminDeVictoria.wlk index 1cfb196a..696cdbea 100644 --- a/adminDeVictoria.wlk +++ b/adminDeVictoria.wlk @@ -12,7 +12,7 @@ object adminWinCon { } method perder() { - if(caja.plata() <= caja.objetivo()) { + if(cajaFondos.plata() <= cajaFondos.objetivo()) { game.addVisual(youLose) game.schedule(3000, {game.stop()}) } diff --git a/clientes.wlk b/clientes.wlk index 7f6f426e..92e0c4e2 100644 --- a/clientes.wlk +++ b/clientes.wlk @@ -9,7 +9,7 @@ import wollok.game.* class Cliente inherits Persona(position = game.at(88,20)){ var pedidoQueEspero = [] var emocion = neutral - var nivelDePaciencia = null + var nivelDePaciencia = null var property manos = bandejaVacia method emocion() { @@ -37,7 +37,6 @@ class Cliente inherits Persona(position = game.at(88,20)){ method anunciarPedido() { game.say(self, self.pedidoAString()) - //self.text() } method pedidoAString() { diff --git a/clientesTest.wtest b/clientesTest.wtest index 841c5bdc..57ba0cd2 100644 --- a/clientesTest.wtest +++ b/clientesTest.wtest @@ -9,6 +9,9 @@ import objetosParaTests.* import wollok.game.* describe "adminClientes" { + + + test "El admin crea y retira un cliente" { const nuevoCliente = adminCliente.clienteRandom() @@ -51,10 +54,11 @@ describe "adminClientes" { mostrador.avisarACliente() assert.equals(pizza, nuevoCliente.manos()) + } test "Un cliente Normal/Paciente recibe el pedido correcto, tiene una buena reaccion" { - const nuevoCliente = factoryNormal.crearCliente() + const nuevoCliente = new ClienteNormal() adminCliente.ubicacion(restaurantest) nuevoCliente.ubicacion(restaurantest) @@ -76,7 +80,7 @@ describe "adminClientes" { } test "Un cliente Normal recibe el pedido incorrecto y tiene una mala reaccion" { - const nuevoCliente = factoryNormal.crearCliente() + const nuevoCliente = new ClienteNormal() adminCliente.ubicacion(restaurantest) nuevoCliente.ubicacion(restaurantest) @@ -95,8 +99,7 @@ describe "adminClientes" { } test "Un cliente Paciente recibe el pedido incorrecto y tiene una mala reaccion" { - const nuevoCliente = factoryPaciente.crearCliente() - + const nuevoCliente = new ClientePaciente() adminCliente.ubicacion(restaurantest) nuevoCliente.ubicacion(restaurantest) game.addVisual(nuevoCliente) @@ -114,7 +117,7 @@ describe "adminClientes" { } test "Un cliente Quisquilloso recibe el pedido correcto y tiene una buena reaccion" { - const nuevoCliente = factoryQuisquilloso.crearCliente() + const nuevoCliente = new ClienteQuisquilloso() adminCliente.ubicacion(restaurantest) nuevoCliente.ubicacion(restaurantest) @@ -134,7 +137,7 @@ describe "adminClientes" { } test "Un cliente Quisquilloso recibe el pedido incorrecto y tiene una mala reaccion" { - const nuevoCliente = factoryQuisquilloso.crearCliente() + const nuevoCliente = new ClienteQuisquilloso() adminCliente.ubicacion(restaurantest) nuevoCliente.ubicacion(restaurantest) @@ -155,7 +158,7 @@ describe "adminClientes" { } test "Un cliente Normal recibe un ingrediente en vez de una pizza y tiene una mala reaccion" { - const nuevoCliente = factoryNormal.crearCliente() + const nuevoCliente = new ClienteNormal() adminCliente.ubicacion(restaurantest) restaurantest.clientes().add(nuevoCliente) mostrador.ubicacion(restaurantest) diff --git a/restaurante.wlk b/restaurante.wlk index cb268f3b..e46cb408 100644 --- a/restaurante.wlk +++ b/restaurante.wlk @@ -41,6 +41,18 @@ class Restaurante { method mostrador() { return game.at(88,20) } + + method personaFrenteAMostrador() { + return game.getObjectsIn(self.mostrador()) + } + + method addCliente(cliente) { + clientes.add(cliente) + } + + method quitarCliente(cliente) { + clientes.remove(cliente) + } }