diff --git a/Artbook/MinMpas.xcf b/Artbook/MinMpas.xcf
new file mode 100644
index 0000000..262d996
Binary files /dev/null and b/Artbook/MinMpas.xcf differ
diff --git a/Public/ecma/Mapeate.Base.ecma.js b/Public/ecma/Mapeate.Base.ecma.js
index 2047133..2a3007a 100644
--- a/Public/ecma/Mapeate.Base.ecma.js
+++ b/Public/ecma/Mapeate.Base.ecma.js
@@ -102,6 +102,59 @@ Mapeate.Base = function(mapeate, entradas){
this.capturar_cursor = (elemento, evento) => [posicion_de_raton.x, posicion_de_raton.y] = self.coger_posicion_del_cursor(evento);
this.coger_posicion_del_raton = () => ({...posicion_de_raton});
+
+ this.abrir_dialogo = (mensaje, datos, acciones) => {
+
+ const dialogo = mapeate.si_mismo.querySelector(".dialogo");
+ let botones = ``;
+
+ dialogo.setAttribute("data-visible", true);
+ with(dialogo.querySelector("legend")){
+ setAttribute("data-i18n", mensaje);
+ innerText = mapeate.i18n(mensaje);
+ };
+ dialogo.querySelector("section").innerHTML = datos && typeof datos == "string" ? datos : (
+ `
` + mapeate.i18n(mensaje + "_texto", datos) + `
`
+ );
+
+ if(acciones){
+ dialogo.setAttribute("data-solo-mensaje", false);
+ acciones.forEach((accion, i) => {
+
+ const texto = mapeate.i18n(accion.i18n),
+ hash = mapeate.hash();
+
+ botones += (``);
+
+ ((accion, i) => mapeate.precargar("[data-precarga=" + hash + "]", boton => {
+ console.log(boton);
+ boton.removeAttribute("data-precarga");
+ boton.onclick = accion.accion;
+ !i && boton.focus();
+ }))(accion, i);
+
+ });
+ }else
+ dialogo.setAttribute("data-solo-mensaje", true);
+
+ dialogo.querySelector(".grupo").innerHTML = botones;
+
+ };
+
+ this.ocultar_dialogo = (elemento, evento) => {
+ if(elemento && elemento.parentNode && (elemento = elemento.parentNode).classList.contains("dialogo"))
+ elemento.getAttribute("data-solo-mensaje") == "true" &&
+ elemento.getAttribute("data-visible") == "true" &&
+ elemento.setAttribute("data-visible", false);
+ else
+ with(mapeate.si_mismo.querySelector(".dialogo"))
+ getAttribute("data-visible") == "true" && setAttribute("data-visible", false);
+ };
constructor();
diff --git a/Public/ecma/Mapeate.Mapas.ecma.js b/Public/ecma/Mapeate.Mapas.ecma.js
index 94bcc08..8ef7d10 100644
--- a/Public/ecma/Mapeate.Mapas.ecma.js
+++ b/Public/ecma/Mapeate.Mapas.ecma.js
@@ -9,7 +9,8 @@ Mapeate.Mapas = function(mapeate, entradas){
let iniciado = false,
sobreescribir_por_defecto,
sobreescribir_tipos_por_defecto,
- mapas_hilo_de_proceso;
+ mapas_hilo_de_proceso,
+ fecha_inicio_juego;
let selector = this.selector;
let global = this.global;
@@ -75,15 +76,9 @@ Mapeate.Mapas = function(mapeate, entradas){
if(svg){
- const ancho_real = Number(svg.getAttribute("data-ancho")),
- alto_real = Number(svg.getAttribute("data-alto"));
-
- // const [x, y, ancho, alto] = mapeate.porcentuar(
- // ancho_real, alto_real, mapa.offsetWidth, mapa.offsetHeight
- // ),
-
const limites = {},
- final = {};
+ final = {},
+ tiempo = Date.now() - fecha_inicio_juego;
[limites.x, limites.y, limites.ancho, limites.alto] = svg.getAttribute("data-caja").split(" ").map(valor => Number(valor));
[final.x, final.y, final.ancho, final.alto] = mapeate.porcentuar(
@@ -111,6 +106,13 @@ Mapeate.Mapas = function(mapeate, entradas){
};
+ mapeate.si_mismo.querySelector(".juego .temporizador>section").innerText = (
+ ("00" + (tiempo / 3600000 >> 0)).slice(-2) + ":" +
+ ("00" + (tiempo / 60000 % 60 >> 0)).slice(-2) + ":" +
+ ("00" + (tiempo / 1000 % 60 >> 0)).slice(-2) + "." +
+ ("00" + (tiempo % 1000 >> 0)).slice(-3)
+ );
+
};
};
@@ -288,6 +290,8 @@ Mapeate.Mapas = function(mapeate, entradas){
});
mapeate.si_mismo.querySelectorAll(".juego fieldset:not(.mapa)").forEach(campo => campo.innerHTML += mapeate.vistas.coger("posicionador"));
+ fecha_inicio_juego = Date.now();
+
});
};
@@ -315,7 +319,7 @@ Mapeate.Mapas = function(mapeate, entradas){
seleccionado = mapeate.si_mismo.querySelector(".juego .objetivos [data-seleccionado=true][data-ok=false]");
if(!seleccionado)
- mapeate.alerta("Seleccionad objetivo.");
+ mapeate.alerta("mapeate_mapas_seleccionar_objetivo");
else if(seleccionado.getAttribute("data-clave") == clave){
const opciones = [...seleccionado.parentNode.querySelectorAll("li")];
@@ -341,11 +345,11 @@ Mapeate.Mapas = function(mapeate, entradas){
siguiente.setAttribute("data-seleccionado", true);
seleccionado.parentNode.parentNode.scrollTop = siguiente.offsetTop - (siguiente.offsetHeight / 2) - (siguiente.parentNode.parentNode.offsetHeight / 2);
}else
- mapeate.alerta("¡Has ganado!", () => self.volver_al_menu(elemento, evento));
+ mapeate.alerta("mapeate_mapas_ganaste", () => self.volver_al_menu(elemento, evento));
}else{
with(mapeate.si_mismo.querySelector(".juego .puntos section"))innerText = Number(innerText) - 1;
- mapeate.alerta("Has elegido mal.");
+ mapeate.alerta("mapeate_mapas_mal_elegido");
};
};
diff --git a/Public/ecma/Mapeate.Vistas.ecma.js b/Public/ecma/Mapeate.Vistas.ecma.js
index 84e6b8c..a4d8eff 100644
--- a/Public/ecma/Mapeate.Vistas.ecma.js
+++ b/Public/ecma/Mapeate.Vistas.ecma.js
@@ -49,7 +49,12 @@ Mapeate.Vistas = function(mapeate, entradas){
const cursor = mapeate.base.coger_posicion_del_raton();
elemento_de_arrastre.elemento.style.marginTop = (cursor.y + elemento_de_arrastre.y) + "px";
- elemento_de_arrastre.elemento.style.marginLeft = (cursor.x + elemento_de_arrastre.x) + "px";
+ if(elemento_de_arrastre.left)
+ elemento_de_arrastre.elemento.style.marginLeft = (cursor.x + elemento_de_arrastre.x) + "px";
+ else
+ elemento_de_arrastre.elemento.style.marginRight = (
+ elemento_de_arrastre.elemento.parentNode.offsetWidth - cursor.x - elemento_de_arrastre.x
+ ) + "px";
};
@@ -185,13 +190,18 @@ Mapeate.Vistas = function(mapeate, entradas){
const [x, y] = mapeate.base.coger_posicion_del_cursor(evento),
caja = elemento.parentNode.parentNode.getBoundingClientRect(),
- limites = elemento.parentNode.getBoundingClientRect();
+ limites = elemento.parentNode.getBoundingClientRect(),
+ is_left = elemento.parentNode.getAttribute("data-posicion").includes("_izquierda");
let z = 0;
elemento_de_arrastre = {
elemento : elemento.parentNode,
- x : limites.x - x - caja.x,
- y : limites.y - y - caja.y
+ x : (
+ is_left ? limites.x - x - caja.x :
+ limites.x + elemento.parentNode.offsetWidth - x - caja.x
+ ),
+ y : limites.y - y - caja.y,
+ left : is_left
};
elemento.parentNode.parentNode.childNodes.forEach(hijo => {
diff --git a/Public/ecma/Mapeate.ecma.js b/Public/ecma/Mapeate.ecma.js
index 99fdabd..f54e313 100644
--- a/Public/ecma/Mapeate.ecma.js
+++ b/Public/ecma/Mapeate.ecma.js
@@ -173,7 +173,7 @@ Mapeate = function(entradas){
nuevas_claves_padre.length && (claves_padre_por_defecto = nuevas_claves_padre);
- intervalo_de_procesos = setInterval(ejecutar_hilos_de_proceso, 1000 / self.configuracion("ejecutar_hilos_de_proceso"));
+ intervalo_de_procesos = setInterval(ejecutar_hilos_de_proceso, 1000 / self.configuracion("fotogramas_por_segundo"));
self.print("info", "cargando_i18n");
self.ejecutar_array_asincrono([
@@ -693,12 +693,23 @@ Mapeate = function(entradas){
return (elemento && elemento.hasAttribute && elemento) || null;
};
- this.alerta = (mensaje, callback) => {
- alert(self.i18n(mensaje));
- self.ejecutar(callback);
- };
+ this.alerta = (mensaje, callback, datos) => base.abrir_dialogo(mensaje, datos, [
+ {i18n : "aceptar", accion : () => {
+ base.ocultar_dialogo();
+ self.ejecutar(callback);
+ }}
+ ]);
- this.confirmar = (mensaje, si, no) => self.ejecutar(confirm(self.i18n(mensaje)) ? si : no);
+ this.confirmar = (mensaje, si, no, datos) => base.abrir_dialogo(mensaje, datos, [
+ {i18n : "aceptar", accion : () => {
+ base.ocultar_dialogo();
+ self.ejecutar(si);
+ }},
+ {i18n : "cancelar", accion : () => {
+ base.ocultar_dialogo();
+ self.ejecutar(no);
+ }}
+ ]);
constructor();
diff --git a/Public/html/vistas.html b/Public/html/vistas.html
index 53ca8ba..6232d23 100644
--- a/Public/html/vistas.html
+++ b/Public/html/vistas.html
@@ -67,6 +67,11 @@
{{consola_texto}}
+