/** * Muestra los datos del personaje * * - Nick del jugador * - Tipo del personaje * - Nivel del personaje * - Aficion a la que pertenece * - Recursos del personaje * - Valores de control de recursos * - Habilidades pasivas desbloqueadas * * Nota: Los datos del usuario se recogen de la variable de sesion * * @route jugadorNum12/usuarios/perfil * @return void */ public function actionPerfil() { /* Actualizar datos de usuario (recuros,individuales y grupales) */ Usuarios::model()->actualizaDatos(Yii::app()->user->usIdent); /* Fin de actualización */ //Busco el id del usuario actual y saco los datos el usuario $id = Yii::app()->user->usIdent; $modeloUsuario = Usuarios::model()->findByPk($id); //Saca la lista de las acciones desbloqueadas por el usuario $modeloDesbloqueadas = Desbloqueadas::model()->findAllByAttributes(array('usuarios_id_usuario' => $id)); //Prepara los datos de las acciones. Solo queremos enseñar las habilidades pasivas y las de partido $accionesPas = array(); $accionesPar = array(); foreach ($modeloDesbloqueadas as $desbloqueada) { $infoDesbloqueada = Habilidades::model()->findAllByAttributes(array('id_habilidad' => $desbloqueada->habilidades_id_habilidad)); if ($infoDesbloqueada[0]['tipo'] == Habilidades::TIPO_PASIVA) { $accionesPas[] = $infoDesbloqueada[0]; } if ($infoDesbloqueada[0]['tipo'] == Habilidades::TIPO_PARTIDO) { $accionesPar[] = $infoDesbloqueada[0]; } } //Saco los recursos disponibles del usuario $recursos = Recursos::model()->findByPk($id); // Cargar css de ver perfil //$uri = Yii::app()->request->baseUrl.'/less/infoperfil.less'; //Yii::app()->clientScript->registerLinkTag('stylesheet/less', 'text/css', $uri); $this->render('perfil', array('modeloU' => $modeloUsuario, 'accionesPas' => $accionesPas, 'accionesPar' => $accionesPar, 'recursos' => $recursos)); }
/** * Comprueba que el usuario puede desbloquear la habilidad. * * Las restricciones actuales son: * * - Nivel del jugador * - Lista de habilidades requeridas * * @param int $id_usuario usuario que quiere desbloquear la habilidad * @param int $id_habilidad habilidad que quiere ser desbloqueada * @return boolean flag si la habilidad puede ser desbloqueada (true si es capaz, false cc) */ public function puedeDesbloquear($id_usuario, $id_habilidad) { //Obtenemos los datos del usuario (para consultar el nivel) $usuario = Usuarios::model()->findByPk($id_usuario); //Obtenemos los datos de la habilidad (para consultar su codigo) $habilidad = Habilidades::model()->findByPk($id_habilidad); $puedeDesbloquear = true; $comentarioFlash = ""; //1) comprobamos que el usario tenga un nivel igual o superior al requisito para desbloquear la habilidad y que tenga puntos de desbloqueo if ($usuario->nivel < RequisitosDesbloquearHabilidades::$datos_acciones[$habilidad->codigo]['nivel'] || $usuario->puntos_desbloqueo == 0) { $comentarioFlash .= "Nivel insuficiente. "; $puedeDesbloquear = false; } //2) Comprobamos que el usuario haya desbloqueado las habilidades requisito antes de intentar desbloquear esta //sacamos las habilidades requisito $habilidadesRequisito = RequisitosDesbloquearHabilidades::$datos_acciones[$habilidad->codigo]['desbloqueadas_previas']; if ($habilidadesRequisito !== null) { //Comprobamos que las haya desbloqueado foreach ($habilidadesRequisito as $habilidadReq) { //Con el codigo de la habilidad saco la habilidad requisito $habilidadAux = Habilidades::model()->findByAttributes(array('codigo' => $habilidadReq)); //miro si el usuario tiene esa habilidad desbloqueada $desbloqueada = Desbloqueadas::model()->findByAttributes(array('habilidades_id_habilidad' => $habilidadAux->id_habilidad, 'usuarios_id_usuario' => $id_usuario)); if ($desbloqueada === null) { $puedeDesbloquear = false; $comentarioFlash .= "Desbloquea antes " . $habilidadReq . ". "; } } } if ($puedeDesbloquear == false) { //Yii::app()->user->setFlash('desbloqueada', $comentarioFlash); } return $puedeDesbloquear; }
/** * Muestra la pantalla para jugar un partido * * Comprobaciones realizadas: * * - acceso correcto al partido, equipos en la BD * - el partido esta jugandose (turnos €[1, 11]) * - un usuario solo puede asistir al proximo partido de un equipo * * @param int $id_partido id del partido al que se va a asistir * * @route jugadorNum12/partidos/asistir/{$id_partido} * @return void */ public function actionAsistir($id_partido) { /* Actualizar datos de usuario (recuros,individuales y grupales) */ Usuarios::model()->actualizaDatos(Yii::app()->user->usIdent); /* Fin de actualización */ Yii::import('application.components.Partido'); // Obtener el equipo del usuario $id_equipo_usuario = Yii::app()->user->usAfic; $equipoUsuario = Equipos::model()->findByPk($id_equipo_usuario); // Obtener la informacion del partido, // En $partido participan $equipo_local y $equipo_visitante $partido = Partidos::model()->findByPk($id_partido); $equipoLocal = Equipos::model()->findByPk($partido->equipos_id_equipo_1); $equipoVisitante = Equipos::model()->findByPk($partido->equipos_id_equipo_2); //Comprobacion de datos if ($partido === null || $equipoUsuario === null || $equipoLocal === null || $equipoVisitante === null) { Yii::app()->user->setFlash('datos', 'Datos suministrados incorrectos - partido/equipo/local/visitante -. (actionActPartido).'); $this->redirect(array('partidos/index')); } if ($partido->turno <= Partido::PRIMER_TURNO || $partido->turno > Partido::ULTIMO_TURNO) { Yii::app()->user->setFlash('partido', 'El partido no está en juego.'); $this->redirect(array('partidos/index')); } // Un usuario no puede asisitir a un partido en el que su equipo no participa // TODO eliminar esta restriccion if ($partido->equipos_id_equipo_1 != $id_equipo_usuario && $partido->equipos_id_equipo_2 != $id_equipo_usuario) { Yii::app()->user->setFlash('partido', 'No puedes acceder a un partido en el que no participe tu equipo.'); $this->redirect(array('partidos/index')); } else { // Un usuario solo puede asistir al próximo partido de su equipo if ($equipoUsuario->partidos_id_partido != $id_partido) { Yii::app()->user->setFlash('partido', 'Este no es el próximo partido de tu equipo.'); $this->redirect(array('partidos/index')); } else { //Saca la lista de las acciones desbloqueadas por el usuario $modeloDesbloqueadas = Desbloqueadas::model()->findAllByAttributes(array('usuarios_id_usuario' => Yii::app()->user->usIdent)); //Prepara los datos de las acciones de partido $accionesPar = array(); $desblPar = array(); foreach ($modeloDesbloqueadas as $desbloqueada) { $infoDesbloqueada = Habilidades::model()->findAllByAttributes(array('id_habilidad' => $desbloqueada->habilidades_id_habilidad)); if ($infoDesbloqueada[0]['tipo'] == Habilidades::TIPO_PARTIDO) { $accionesPar[] = $infoDesbloqueada[0]; $desblPar[] = $desbloqueada; } } //pasar los datos del partido y los equipos $datosVista = array('eqLoc' => $equipoLocal, 'eqVis' => $equipoVisitante, 'partido' => $partido, 'l_acciones' => $accionesPar, 'l_desbl' => $desblPar); $this->render('asistir', $datosVista); /* PARTE DE MASTER // un usuario no puede asisitir a un partido en el que su equipo no participa if ( ($equipoLocal->id_equipo != $id_equipo_usuario) && ($equipoVisitante->id_equipo != $id_equipo_usuario) ) { // TODO Yii::app()->user->setFlash('propio_equipo', 'No puedes asistir a un partido que no sea de tu propio equipo.'); $this-> redirect(array('partidos/index')); } // un usuario solo puede asistir al próximo partido de su equipo else if( $equipoUsuario->partidos_id_partido != $partido->id_partido ) { // TODO Yii::app()->user->setFlash('sig_partido', 'Ese no es el proximo partido de tu equipo.'); $this-> redirect(array('partidos/index')); } */ } } }
/** * Dado un id de una habilidad comprueba si esa habilidad está desbloqueada para el usuario * * @param int $habilidad id de la habilidad * @return boolean $desbloqueada true si la habilidad está desbloqueada por el usuario, false si no está desbloqueada */ public function estaDesbloqueada($habilidad) { $habilidadesDesbloqueadas = Desbloqueadas::model()->findAllByAttributes(array('usuarios_id_usuario' => $this->id_usuario)); $desbloqueada = false; foreach ($habilidadesDesbloqueadas as $d) { if ($d->habilidades_id_habilidad == $habilidad) { $desbloqueada = true; } } return $desbloqueada; }
/** * Muestra un formulario de confirmacion para adquirir una habilidad * * > Si hay datos en $_POST procesa el formulario y registra la habilidad como desbloqueada * * @param int $id_habilidad id de la habilidad que se va a adquirir * * @route jugadorNum12/habilidades/adquirir/{$id_habilidad} * @redirect jugadorNum12/acciones si la habilidad es una accion * @redirect jugadorNum12/usuarios/perfil si la habilidad es pasiva * * @throws \Exception Fallo al guardar la nueva habilidad en la BD * @return void */ public function actionAdquirir($id_habilidad) { /* Actualizar datos de usuario (recuros,individuales y grupales) */ Usuarios::model()->actualizaDatos(Yii::app()->user->usIdent); /* Fin de actualización */ //empezamos la transaccion $trans = Yii::app()->db->beginTransaction(); //obtenemos la habilidad para pasarsela a la vista $habilidad = Habilidades::model()->findByPk($id_habilidad); //vemos si una habilidad esta desbloqueada para el usuario $desbloqueada = Desbloqueadas::model()->findByAttributes(array('usuarios_id_usuario' => Yii::app()->user->usIdent, 'habilidades_id_habilidad' => $id_habilidad)); //realizar transaccion con la base de datos if ($habilidad === null) { //si la habilidad que quieres desbloquear existe como tal $trans->rollback(); Yii::app()->user->setFlash('habilidad', 'Habilidad inexistente.'); } if ($desbloqueada != null) { //si esta desbloqueada $trans->rollback(); Yii::app()->user->setFlash('desbloqueada', 'La habilidad ya ha sido desbloqueada.'); $this->redirect(array('habilidades/index')); } else { // comprobamos que pueda desbloquedar la habilidad. Nivel necesario, hab necesarias desbloqueadas etc if ($habilidad->puedeDesbloquear(Yii::app()->user->usIdent, $id_habilidad)) { //si no esta desbloqueada y existe //si el usuario acepta guardamos el id de la habilidad y el id de usuario en Desbloqueadas if (isset($_POST['aceptarBtn'])) { try { $desbloqueada = new Desbloqueadas(); $desbloqueada['habilidades_id_habilidad'] = $id_habilidad; $desbloqueada['usuarios_id_usuario'] = Yii::app()->user->usIdent; $desbloqueada->save(); //Al desbloquear la habilidad se gasta un punto de desbloqueo $usuario = Usuarios::model()->findByPk(Yii::app()->user->usIdent); $usuario->puntos_desbloqueo -= 1; $usuario->save(); //Si es pasiva, debemos aplicar el beneficio de la misma if ($habilidad->tipo == Habilidades::TIPO_PASIVA) { Yii::import('application.components.Acciones.*'); //Tomar nombre de habilidad $nombreHabilidad = $habilidad->codigo; //Llamar al singleton correspondiente y ejecutar dicha acción $nombreHabilidad::getInstance()->ejecutar(Yii::app()->user->usIdent); } $trans->commit(); $this->redirect(array('habilidades/')); } catch (Exception $exc) { $trans->rollback(); throw $exc; } } //si el usuario cancela, rollback if (isset($_POST['cancelarBtn'])) { $trans->rollback(); $this->redirect(array('habilidades/index')); } //pasar la habilidad a la vista para mostrar que habilidad se esta desboqueando $this->render('adquirir', array('habilidad' => $habilidad)); } else { //el ususario, no puede desbloquear la habilidad Yii::app()->user->setFlash('desbloqueada', 'No cumples los requisitos para desbloquear la habilidad.'); $this->redirect(array('habilidades/index')); } } }
/** * Ejecuta la accion de partido pulsada. Este método será llamado por Ajax durante el partido, * de modo que lo único que hará será devolver los datos de éxito o fallo para informar al * usuario. * * Cualquier habilidad resta los recursos iniciales al jugador, además, * * - Por ser una habilidad de partido se ejecuta al momento * * > El id del jugador y la aficion a la que pertence se recogen de la variable de sesion * * - CODIGOS DEVUELTOS - * * 0 -> Habilidad no encontrada * 1 -> Habilidad no desbloqueada * 2 -> Habilidad en cooldown * 3 -> Recursos insuficientes * 4 -> Error de equipo * 5 -> Error de partido, puede ser que no esté en juego o que no sea el siguiente del equipo * 6 -> La acción no es de partido * 7 -> Acción ejecutada con éxito * 8 -> Error general * * @param int $id_accion id de la habilidad que se ejecuta * * @return void */ public function actionUsarPartido($id_accion) { // Actualizar recursos de usuario Recursos::model()->actualizaRecursos(Yii::app()->user->usIdent); //Comenzar transaccion $trans = Yii::app()->db->beginTransaction(); try { // Importar elementos necesarios Yii::import('application.components.Acciones.*'); Yii::import('application.components.Partido'); //Cojo el id_usuario $id_usuario = Yii::app()->user->usIdent; //Obtener modelo de Habilidades $habilidad = Habilidades::model()->findByPk($id_accion); //Habilidad no encontrada if ($habilidad === null) { $trans->rollback(); // Devolver error de acción no encontrada $data = array('ok' => false, 'error' => 'Habilidad incorrecta'); echo CJavaScript::jsonEncode($data); Yii::app()->end(); } //Habilidad encontrada //Obtener modelo de Desbloqueadas $desbloqueada = Desbloqueadas::model()->findByAttributes(array('usuarios_id_usuario' => $id_usuario, 'habilidades_id_habilidad' => $id_accion)); //Si no esta desbloqueada para el usuario, error if ($desbloqueada === null) { $trans->rollback(); // Devolver error de habilidad no desbloqueada $data = array('ok' => false, 'error' => 'Acción no desbloqueada'); echo CJavaScript::jsonEncode($data); Yii::app()->end(); } //Si esta desbloqueada //Comprovar que no esta en cooldown if ($desbloqueada['fin_del_cooldown'] > ($now = time())) { $trans->rollback(); // Devolver error de cooldown $data = array('ok' => false, 'error' => 'Habilidad en cooldown', 'cooldownEnd' => $desbloqueada['fin_del_cooldown']); echo CJavaScript::jsonEncode($data); Yii::app()->end(); } else { //se actualiza el cooldown $desbloqueada['fin_del_cooldown'] = $now + $habilidad['cooldown_fin']; $desbloqueada->save(); } //Si esta disponible //Obtener modelo de Recursos $res = Recursos::model()->findByAttributes(array('usuarios_id_usuario' => $id_usuario)); //Si no son suficientes recursos cancelar transaccion y notificar al usuario if ($res['dinero'] < $habilidad['dinero'] || $res['animo'] < $habilidad['animo'] || $res['influencias'] < $habilidad['influencias']) { $trans->rollback(); // Devolver error de recursos insuficientes $data = array('ok' => false, 'error' => 'Recursos insuficientes'); echo CJavaScript::jsonEncode($data); Yii::app()->end(); } $usuario = Usuarios::model()->findByPk($id_usuario); //Si tenemos suficientes recursos comprobamos el tipo de acción if ($habilidad['tipo'] == Habilidades::TIPO_PARTIDO) { //Sacar id de equipo y partido para poder ejecutar la accion $id_equipo = Yii::app()->user->usAfic; $equipo = Equipos::model()->findByAttributes(array('id_equipo' => $id_equipo)); if ($equipo === null) { $trans->rollback(); // Devolver error de equipo incorrecto $data = array('ok' => false, 'error' => 'Equipo incorrecto'); echo CJavaScript::jsonEncode($data); Yii::app()->end(); } $siguientepartido = $equipo->sigPartido; $id_partido = $siguientepartido->id_partido; // Comprobar si el partido está en juego if ($siguientepartido->turno <= Partido::PRIMER_TURNO || $siguientepartido->turno > Partido::ULTIMO_TURNO) { $trans->rollback(); // Devolver error de partido incorrecto $data = array('ok' => false, 'error' => 'Partido incorrecto'); echo CJavaScript::jsonEncode($data); Yii::app()->end(); } // Todo correcto, ejecutar acción de partido AccionesTurno::usarPartido($id_usuario, $id_equipo, $id_partido, $habilidad, $res); // EXP: sumar experencia al usuario $usuario->sumarExp(Usuarios::MEDIA_EXP); } else { // Tipo inválido $trans->rollback(); // Devolver error de tipo inválido $data = array('ok' => false, 'error' => 'Acción incorrecta'); echo CJavaScript::jsonEncode($data); Yii::app()->end(); } // Finalizar transacción $trans->commit(); // Todo correcto $data = array('ok' => true, 'message' => 'Acción ejecutada correctamente', 'cooldownEnd' => $desbloqueada['fin_del_cooldown']); echo CJavaScript::jsonEncode($data); Yii::app()->end(); } catch (Exception $e) { $trans->rollback(); // Devolver error general $data = array('ok' => false, 'error' => 'Error al ejecutar la acción '); echo CJavaScript::jsonEncode($data); Yii::app()->end(); } }