Skip to content

Commit

Permalink
wip - no compile
Browse files Browse the repository at this point in the history
  • Loading branch information
autosquash committed Jan 2, 2024
1 parent 41f625d commit 676a1b9
Show file tree
Hide file tree
Showing 12 changed files with 193 additions and 97 deletions.
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ FetchContent_MakeAvailable(googletest)

add_executable(pizzeria
src/main.cpp
src/aplicador.cpp
src/controlador_clicks.cpp
src/datos_niveles.cpp
src/debug_sfml.cpp
Expand All @@ -32,7 +33,9 @@ add_executable(pizzeria
src/modelo/encargos.cpp
src/modelo/estado_modelo.cpp
src/modelo/modelo.cpp
src/modelo_amplio.cpp
src/nivel.cpp
src/realizador.cpp
src/setup_juego.cpp
src/textos.cpp
src/tiempo.cpp
Expand Down Expand Up @@ -96,8 +99,10 @@ add_executable(
src/tests/test_timer.cpp

# archivos del proyecto
src/aplicador.cpp
src/debug_sfml.cpp
src/estado_nivel.cpp
src/modelo_amplio.cpp
src/modelo/control_pizzas.cpp
src/modelo/dominio.cpp
src/modelo/encargos.cpp
Expand Down
40 changes: 40 additions & 0 deletions src/aplicador.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#include "aplicador.h"
#include "comandos.h"
#include "general.h"
#include "realizador_base.h"
#include <variant>

#define SWITCH(variante) \
using T = std::decay_t<decltype(comando_data)>; \
if (false) { /* Para inicializar los bloques if else */ \
}
#define CASE(comando, accion) \
else if constexpr (std::is_same_v<T, Comando::comando>) { \
return accion; \
}

/*
Aplica un comando y devuelve la nueva
fase, si correspondiera cambiar
*/
std::optional<FaseNivel> herramientas_modelo_amplio::aplica_comando( //
RealizadorBase &realizador, //
const Comando &comando //

) {
return std::visit(
[&realizador](auto &&comando_data) -> std::optional<FaseNivel> {
SWITCH(comando_data)
CASE(Empezar, realizador.empezar())
CASE(Salir, FaseNivel::Saliendo)
CASE(Reiniciar, FaseNivel::Reiniciando)
CASE(AlternarGrid, realizador.alternar_grid())
CASE(Encargar, realizador.encargar_pizza(comando_data.tp))
CASE(Despachar, realizador.despachar_pizza(comando_data.tp))
return std::nullopt;
},
comando.comando_data
);
}
#undef SWITCH
#undef CASE
19 changes: 19 additions & 0 deletions src/aplicador.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once

#include <optional>

enum class FaseNivel;
class RealizadorBase;
class Comando;

namespace herramientas_modelo_amplio {
/*
Aplica un comando y devuelve la nueva
fase, si correspondiera cambiar
*/
std::optional<FaseNivel> aplica_comando( //
RealizadorBase &realizador, //
const Comando &comando //

);
} // namespace herramientas_modelo_amplio
31 changes: 0 additions & 31 deletions src/controlador_clicks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,34 +58,3 @@ std::optional<Comando> ControladorClicks::procesa_click(
);
return comando;
}

#define SWITCH(variante) \
using T = std::decay_t<decltype(comando_data)>; \
if (false) { /* Para inicializar los bloques if else */ \
}
#define CASE(comando, accion) \
else if constexpr (std::is_same_v<T, Comando::comando>) { \
return accion; \
}
/* Aplica un comando y devuelve la nueva fase, si correspondiera cambiar */
std::optional<FaseNivel> aplica_comando( //
RealizadorBase &realizador, //
const Comando &comando //

) {
return std::visit(
[&realizador](auto &&comando_data) -> std::optional<FaseNivel> {
SWITCH(comando_data)
CASE(Empezar, realizador.empezar())
CASE(Salir, FaseNivel::Saliendo)
CASE(Reiniciar, FaseNivel::Reiniciando)
CASE(AlternarGrid, realizador.alternar_grid())
CASE(Encargar, realizador.encargar_pizza(comando_data.tp))
CASE(Despachar, realizador.despachar_pizza(comando_data.tp))
return std::nullopt;
},
comando.comando_data
);
}
#undef SWITCH
#undef CASE
10 changes: 6 additions & 4 deletions src/controlador_clicks.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ struct ControladorClicks {
);
};

std::optional<FaseNivel> aplica_comando(
RealizadorBase &, //
const Comando & //
);
namespace herramientas_modelo_amplio {
std::optional<FaseNivel> aplica_comando(
RealizadorBase &, //
const Comando & //
);
}
17 changes: 17 additions & 0 deletions src/modelo_amplio.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include "modelo_amplio.h"
#include "aplicador.h"
#include "realizador.h"

ModeloAmplio::ModeloAmplio(const DatosNivel &datos_nivel)
: estado(FaseNivel::MostrandoInstrucciones, datos_nivel) {
realizador.emplace(Realizador{estado});
}

std::optional<FaseNivel> ModeloAmplio::aplica_comando( //
const Comando &comando //
) {
assert(realizador.has_value());
return herramientas_modelo_amplio::aplica_comando(
realizador.value(), comando
);
}
15 changes: 7 additions & 8 deletions src/modelo_amplio.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,20 @@

#include "estado_nivel.h"
#include "general.h"
#include "realizador.h"

struct DatosNivel;
struct Comando;

class ModeloAmplio {
private:

public:
std::optional<Realizador> realizador;
Estado estado;
FaseNivel get_fase_actual() { return estado.fase_actual; }
ModeloAmplio(const DatosNivel &datos_nivel)
: estado(FaseNivel::MostrandoInstrucciones, datos_nivel) {}
ModeloAmplio(const DatosNivel &datos_nivel);

FaseNivel aplica_comando( //
const Comando &comando //
) {
return FaseNivel::Saliendo;
}
std::optional<FaseNivel> aplica_comando( //
const Comando &comando //
);
};
52 changes: 6 additions & 46 deletions src/nivel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#include "estado_nivel.h"
#include "general.h"
#include "modelo_amplio.h"
#include "realizador_base.h"
#include "tiempo.h"
#include "vista/enlace_vista.h"
#include "vista/vista.h"
Expand All @@ -18,47 +17,6 @@ namespace tiempos {
const auto ESPERA_ENTRE_NIVELES = Tiempo::desde_segundos(2);
} // namespace tiempos

class Realizador : public RealizadorBase {
private:
Estado &estado;

public:
Realizador(Estado &estado) : estado(estado) {}

/* Encarga una pizza a la cocina del tipo indicado */
NuevaFase encargar_pizza( //
const dominio::TipoPizza tp
) {
assert(estado.fase_actual == FaseNivel::Activa);
estado.estado_modelo.anadir_encargo(tp);
return std::nullopt;
}

/*
* Despacha una pizza a los clientes del tipo indicado. Devuelve la nueva
* fase si corresponde.
*/
NuevaFase despachar_pizza( //
const dominio::TipoPizza tp
) {
assert(estado.fase_actual == FaseNivel::Activa);
const auto pedidos_cubiertos = estado.estado_modelo.despachar_pizza(tp);
if (pedidos_cubiertos) {
return FaseNivel::EsperaAntesDeResultado;
}
return std::nullopt;
}
NuevaFase alternar_grid() {
assert(MODO_DESARROLLO);
estado.mostrando_grid = !estado.mostrando_grid;
return std::nullopt;
}
NuevaFase empezar() {
assert(estado.fase_actual == FaseNivel::MostrandoInstrucciones);
return FaseNivel::Activa;
}
};

Nivel::Nivel(
Globales &globales, //
const DatosNivel &datos_nivel, //
Expand Down Expand Up @@ -96,15 +54,16 @@ std::optional<FaseNivel> Nivel::procesarEvento(
break;
case sf::Event::MouseButtonPressed:
{
Realizador realizador{estado};

const sf::Vector2i mouse_pos = sf::Mouse::getPosition(ventana);
const auto comando = controlador_clicks->procesa_click(
globales, botones, estado, mouse_pos
);
if (!comando) {
return std::nullopt;
}
return aplica_comando(realizador, comando.value());
assert(modelo_amplio.has_value());
return modelo_amplio.value().aplica_comando(comando.value());
}
break;
default:
Expand Down Expand Up @@ -187,8 +146,9 @@ EnlaceVista Nivel::crear_enlace_vista(

AccionGeneral Nivel::ejecutar() {
std::optional<int> objetivo_estatico; // Solo se define en estaticos
ModeloAmplio modelo_amplio(datos_nivel);
auto &estado = modelo_amplio.estado;
modelo_amplio.emplace(ModeloAmplio{datos_nivel});
assert(modelo_amplio.has_value());
auto &estado = modelo_amplio.value().estado;
assert(estado.establecido);
modelo::ControlPizzas &control_pizzas = estado.estado_modelo.control_pizzas;
modelo::PizzasAContadores &contadores = control_pizzas.contadores;
Expand Down
2 changes: 2 additions & 0 deletions src/nivel.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "globales.h"
#include "modelo_amplio.h"
#include "shared.h"
#include "tiempo.h"
#include "vista/grid.h"
Expand All @@ -21,6 +22,7 @@ enum class AccionGeneral { SiguienteNivel, Reiniciar, Salir };

struct Nivel {
private:
std::optional<ModeloAmplio> modelo_amplio;
std::optional<FaseNivel> procesarEvento(
sf::Event, //
const BotonesApp &, //
Expand Down
41 changes: 41 additions & 0 deletions src/realizador.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#include "realizador.h"
#include "estado_nivel.h"
#include "general.h"
#include <cassert>

Realizador::Realizador(Estado &estado) : estado(estado) {}

/* Encarga una pizza a la cocina del tipo indicado */
NuevaFase Realizador::encargar_pizza( //
const dominio::TipoPizza tp
) {
assert(estado.fase_actual == FaseNivel::Activa);
estado.estado_modelo.anadir_encargo(tp);
return std::nullopt;
}

/*
* Despacha una pizza a los clientes del tipo indicado. Devuelve la nueva
* fase si corresponde.
*/
NuevaFase Realizador::despachar_pizza( //
const dominio::TipoPizza tp
) {
assert(estado.fase_actual == FaseNivel::Activa);
const auto pedidos_cubiertos = estado.estado_modelo.despachar_pizza(tp);
if (pedidos_cubiertos) {
return FaseNivel::EsperaAntesDeResultado;
}
return std::nullopt;
}

NuevaFase Realizador::alternar_grid() {
assert(MODO_DESARROLLO);
estado.mostrando_grid = !estado.mostrando_grid;
return std::nullopt;
}

NuevaFase Realizador::empezar() {
assert(estado.fase_actual == FaseNivel::MostrandoInstrucciones);
return FaseNivel::Activa;
}
31 changes: 31 additions & 0 deletions src/realizador.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#pragma once

#include "modelo/dominio.h"
#include "realizador_base.h"

struct Estado;
using NuevaFase = std::optional<FaseNivel>;

class Realizador : public RealizadorBase {
private:
Estado &estado;

public:
Realizador(Estado &estado);

/* Encarga una pizza a la cocina del tipo indicado */
NuevaFase encargar_pizza( //
const dominio::TipoPizza tp
);

/*
* Despacha una pizza a los clientes del tipo indicado. Devuelve la nueva
* fase si corresponde.
*/
NuevaFase despachar_pizza( //
const dominio::TipoPizza tp
);

NuevaFase alternar_grid();
NuevaFase empezar();
};
Loading

0 comments on commit 676a1b9

Please sign in to comment.