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}}

+
+ {{temporizador}} +

{{temporizador_texto}}

+
00:00:00.000
+
{{mapa}}

{{mapa_texto}}

@@ -85,6 +90,14 @@ + @@ -135,7 +148,7 @@ {{nombre}} - {{nombre}} + {{nombre}}