Skip to content

Commit

Permalink
wip - compile!
Browse files Browse the repository at this point in the history
  • Loading branch information
autosquash committed Jan 2, 2024
1 parent 41f625d commit b08923b
Show file tree
Hide file tree
Showing 14 changed files with 189 additions and 101 deletions.
6 changes: 6 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,13 +99,16 @@ 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
src/modelo/estado_modelo.cpp
src/modelo/modelo.cpp
src/realizador.cpp
src/textos.cpp
src/tiempo.cpp
src/vista/cadenas.cpp
Expand Down
44 changes: 44 additions & 0 deletions src/aplicador.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#include "aplicador.h"
#include "comandos.h"
#include "controlador_clicks.h"
#include "estado_nivel.h"
#include "general.h"
#include "globales.h"

#include "vista/botones_app.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> aplicar_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
15 changes: 15 additions & 0 deletions src/aplicador.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#pragma once

#include "comandos.h"
#include "general.h"
#include "realizador_base.h"
#include <optional>

/*
Aplica un comando y devuelve la nueva
fase, si correspondiera cambiar
*/
std::optional<FaseNivel> aplicar_comando( //
RealizadorBase &realizador, //
const Comando &comando //
);
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
5 changes: 0 additions & 5 deletions src/controlador_clicks.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,3 @@ struct ControladorClicks {
const sf::Vector2i &mouse_pos //
);
};

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 "comandos.h"
#include "general.h"
#include "realizador.h"

ModeloAmplio::ModeloAmplio(const DatosNivel &datos_nivel)
: estado(FaseNivel::MostrandoInstrucciones, datos_nivel) {}

std::optional<FaseNivel> ModeloAmplio::aplica_comando( //
const Comando &comando //
) {

Realizador r{estado};
auto result = aplicar_comando(r, comando);
return result;
}
14 changes: 6 additions & 8 deletions src/modelo_amplio.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,19 @@

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

struct DatosNivel;
struct Comando;

class ModeloAmplio {
private:

public:
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;
}
30 changes: 30 additions & 0 deletions src/realizador.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#pragma once

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

struct Estado;

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();
};
4 changes: 2 additions & 2 deletions src/realizador_base.h
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
#pragma once

#include "modelo/dominio.h"
#include <optional>

enum class FaseNivel;
using NuevaFase = std::optional<FaseNivel>;

class RealizadorBase {
public:
using NuevaFase = std::optional<FaseNivel>;

virtual ~RealizadorBase() = default; // Destructor virtual

// Metodos virtuales puros
Expand Down
2 changes: 1 addition & 1 deletion src/shared.h
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
#pragma once

#include <SFML/Graphics.hpp>
#include <cassert>
#include <map>
#include <tuple>
#include <vector>

namespace sf {
class Font;
class RenderWindow;
} // namespace sf

constexpr bool MODO_DESARROLLO = true;
Expand Down
Loading

0 comments on commit b08923b

Please sign in to comment.