class Juego { constructor(jugador, url) { this.jugador = new Jugador(jugador, this); // Las blancas si soy observador this.rival; // Jugador rival, las negras si soy observador this.timer; this.hora_ultimo_movimiento; // Es necesario para poder descontar el tiempo aunque la pestaña no esté activa en el navegador // Los observadores no tienen color pero sí tienen turno this.turno; // Color del jugador que tiene el turno. Al empezar es null, cuando envía la táctica el turno es del rival, a menos que lleve las blancas y sea el 2º en enviar la táctica this.color; // Color del jugador, si está en una partida pero no como observador this.movimientos = []; // Lista de movimientos del turno this.tiempo = []; // { 'blancas', 'negras' } // En segundos this.duracion; // Para usarla al jugar un nuevo partido (en minutos) this.estado; // 0: sin iniciar // 1: táctica mandada // 2: saque inicial, turno blancas // 3: partido iniciado, turno blancas // 4: partido iniciado, turno negras // null: partido finalizado this.sala = new Sala(this, url); this.wakeLock = null; // Lock para que no se apague la pantalla en el móvil } async requestWakelock() { if ('wakeLock' in navigator) { try { this.wakeLock = await navigator.wakeLock.request("screen"); } catch (err) { console.log(`, `); } } } iniciar_cronometros() { if (this.tiempo['blancas'] || this.tiempo['negras']) { $('#tiempo_blancas').css("color", ""); $('#tiempo_negras').css("color", ""); this.hora_ultimo_movimiento = new Date(); this.pintar_tiempos(); if (!this.timer) { this.timer = setInterval(() => { if (this.turno) { this.pintar_tiempos(); if (this.tiempo_turno() <= 0) { clearInterval(this.timer); this.timer = null; this.sala.conexion.enviar("tiempo_agotado", null); } } }, 1000); } } } tiempo_turno() { if (this.hora_ultimo_movimiento) { return this.tiempo[this.turno] - parseInt((new Date().getTime() - this.hora_ultimo_movimiento.getTime()) / 1000); } else { return this.tiempo[this.turno]; } } actualizar_tiempos(tiempo_blancas, tiempo_negras) { if (this.duracion) { $('#span_tiempo_blancas').show(); $('#span_tiempo_negras').show(); this.tiempo['blancas'] = tiempo_blancas; this.tiempo['negras'] = tiempo_negras; if (this.estado && this.estado >= 2) { this.hora_ultimo_movimiento = new Date(); } } else { $('#span_tiempo_blancas').hide(); $('#span_tiempo_negras').hide(); } } pintar_tiempos() { if (this.turno && this.tiempo_turno() <= 60) { if (this.turno == 'blancas') { $('#tiempo_blancas').css("color", "red"); } else { $('#tiempo_negras').css("color", "red"); } } if (!this.turno) { $('#tiempo_blancas').text(secondsToTime(this.tiempo['blancas'])); $('#tiempo_negras').text(secondsToTime(this.tiempo['negras'])); } else if (this.turno == 'blancas') { $('#tiempo_blancas').text(secondsToTime(this.tiempo_turno())); $('#tiempo_negras').text(secondsToTime(this.tiempo['negras'])); } else { $('#tiempo_blancas').text(secondsToTime(this.tiempo['blancas'])); $('#tiempo_negras').text(secondsToTime(this.tiempo_turno())); } } cambiar_color(c) { return c == 'blancas' ? 'negras' : 'blancas'; } traducir(texto) { switch (texto) { case 'blancas': return '???room.white???'.toLowerCase(); case 'negras': return '???room.black???'.toLowerCase(); case 'principiante': return '???levels.apprentice???'; case 'aficionado': return '???levels.amateur???'; case 'experto': return '???levels.expert???'; case 'maestro': return '???levels.master???'; case 'maestro_internacional': return '???levels.international_master???'; case 'gran_maestro': return '???levels.great_master???'; case 'campeon_del_mundo': return '???levels.world_champion???'; case 'no_registrado': return '???levels.not_registered???'; } } actualizar_turno(c, mostrar_mensaje) { this.turno = c; if (!this.soy_observador() && this.estado) { if (this.turno == this.color && mostrar_mensaje) { showToast.show("???msg.yourTurn???"); } } this.actualizar_texto_turno(); } // Si estoy observando un partido, ninguno de los dos tendrá mi nombre, pero en especial el jugador, que debería ser yo en caso contrario soy_observador() { return this.jugador.nombre != ''; } // Tb se llama al reconectar observar_partido(blancas, negras, tiempo_blancas, tiempo_negras, duracion, estado, tablero) { this.duracion = duracion; this.estado = estado; this.actualizar_tiempos(tiempo_blancas, tiempo_negras); if (negras == '') { this.jugador = this.sala.usuarios[negras]; this.rival = this.sala.usuarios[blancas]; this.color = 'negras'; } else { // El observador tb tendrá las blancas this.jugador = this.sala.usuarios[blancas]; this.rival = this.sala.usuarios[negras]; this.color = 'blancas'; } if (blancas == '_Bot_' || negras == '_Bot_') { this.crear_bot(); } this.pintar_ui(); switch (this.estado) { case 2: this.iniciar_cronometros(); this.actualizar_turno('blancas', !this.soy_observador() && this.color == 'blancas'); this.habilitar_color(this.color == 'blancas'); break; case 3: this.iniciar_cronometros(); this.actualizar_turno('blancas', !this.soy_observador() && this.color == 'blancas'); this.habilitar_color(this.color == 'blancas'); break; case 4: this.iniciar_cronometros(); this.actualizar_turno('negras', !this.soy_observador() && this.color == 'negras'); this.habilitar_color(this.color == 'negras'); break; default: /* 0, 1 y null */ // Hasta que no empieza el partido no hay turno this.pintar_tiempos(); this.habilitar_color(this.estado == 0); this.actualizar_texto_turno(); } // Si el partido aún no ha empezado no decimos nada. Lo escribiremos cuando se manden las tácticas y empiece de verdad if (this.estado >= 2) { if (!this.soy_observador()) { this.escribir_servidor(null, '???connection.resuming??? ' + blancas + ' vs ' + negras); } else { this.escribir_servidor(null, '???msg.watching??? ' + blancas + ' vs ' + negras); } } this.pintar_movimientos(tablero, 0, 0, null); } accion_mostrar_ranking(ranking) { var mensaje = '