public function finalizar($id_usuario, $id_habilidad) { //Validar usuario $us = Usuarios::model()->findByPk($id_usuario); if ($us === null) { throw new Exception("Usuario incorrecto.", 404); } //Tomar y validar habilidad $hab = Habilidades::model()->findByPk($id_habilidad); if ($hab === null) { throw new Exception("Habilidad incorrecta.", 404); } //Coger influencias a devolver $influencias = $hab->influencias; //Aumentar ánimo if (Recursos::aumentar_recursos($id_usuario, "influencias", $influencias) == 0) { return 0; } else { return -1; } }
/** * 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')); } */ } } }
/** * Usar una accion grupal * * @static * @param $usuario * @param $id_accion * @param $id_equipo * @param $res : recursos del jugador * @param $habilidad * @return int id de la nueva accion grupal */ public static function usarGrupal($usuario, $id_accion, $id_equipo, $res, $habilidad) { $id_usuario = $usuario->id_usuario; /* Se deberia obtener la accion grupal mediante su PK (id_accion_grupal) Como $id_accion equivale $id_habilidad por como se redirige desde acciones/index para obtener la accion grupal debo buscar por id_equipo y id_habilidad NOTA: no se contempla la posibilidad de en un mismo equipo haya varias acciones iguales pero con distinto creador (aunque dicha posibilidad existe) ya que debe arreglarse la redireccion */ $res['dinero'] -= $habilidad['dinero']; $res['animo'] -= $habilidad['animo']; $res['influencias'] -= $habilidad['influencias']; $res['influencias_bloqueadas'] += $habilidad['influencias']; //sumarselos al crear nueva accion grupal $accion_grupal = new AccionesGrupales(); $accion_grupal->setAttributes(array('usuarios_id_usuario' => $id_usuario, 'habilidades_id_habilidad' => $id_accion, 'equipos_id_equipo' => $id_equipo, 'influencias_acc' => $habilidad['influencias'], 'animo_acc' => $habilidad['animo'], 'dinero_acc' => $habilidad['dinero'], 'jugadores_acc' => 1, 'finalizacion' => $habilidad['cooldown_fin'] + time(), 'completada' => 0)); //guardar en los modelos $res->save(); $accion_grupal->save(); //Crear participación del creador $participacion = new Participaciones(); $participacion->acciones_grupales_id_accion_grupal = $accion_grupal->id_accion_grupal; $participacion->usuarios_id_usuario = $id_usuario; $participacion->dinero_aportado = $habilidad['dinero']; $participacion->influencias_aportadas = $habilidad['influencias']; $participacion->animo_aportado = $habilidad['animo']; if (!$participacion->save()) { Yii::app()->user->setFlash('error', 'Participación no creada. (AccionesController,actionUsar.'); throw new Exception("Participación no creada. (AccionesController,actionUsar)"); } //Enviamos la notificación correspondiente $notificacion = new Notificaciones(); $notificacion->fecha = time(); $notificacion->mensaje = Usuarios::model()->findByPk($id_usuario)->nick . " ha abierto la acción " . Habilidades::model()->findByPk($id_accion)->nombre; $notificacion->imagen = "images/iconos/notificaciones/nueva_grupal.png"; $notificacion->save(); //Enviamos la notificación a la afición $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo' => $id_equipo)); foreach ($componentes as $componente) { $usrnotif = new Usrnotif(); $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $componente->id_usuario; $usrnotif->save(); } // EXP: sumar experencia al usuario $usuario->sumarExp(Usuarios::MEDIA_EXP); return $accion_grupal['id_accion_grupal']; }
/** * Devuelve los recursos de las acciones individuales * * Selecciona las acciones individuales pendientes de devolución * de recursos (finalización) y ejecuta el método oportuno de cada * una de ellas. * * @route JugadorNum12/scripts/finalizaIndividuales * * @throws \Exception excepcion interna * @return void */ public function actionFinalizaIndividuales() { Yii::import('application.components.Acciones.*'); $tiempo = time(); $busqueda = new CDbCriteria(); $busqueda->addCondition(':bTiempo >= cooldown'); $busqueda->addCondition('devuelto = :bDevuelto'); $busqueda->params = array(':bTiempo' => $tiempo, ':bDevuelto' => 0); $individuales = AccionesIndividuales::model()->findAll($busqueda); //Iterar sobre cada individual y finalizarla foreach ($individuales as $ind) { $transaction = Yii::app()->db->beginTransaction(); try { //Tomar nombre de habilidad para instanciación dinámica $hab = Habilidades::model()->findByPk($ind->habilidades_id_habilidad); if ($hab === null) { Yii::app()->user->setFlash('habilidad', 'Error: habilidad no encontrada. (actionFinalizaIndividuales,ScriptsController).'); //throw new CHttpException(404,"Error: habilidad no encontrada. (actionFinalizaIndividuales,ScriptsController)"); } $nombreHabilidad = $hab->codigo; //Llamar al singleton correspondiente y finalizar dicha acción $nombreHabilidad::getInstance()->finalizar($ind->usuarios_id_usuario, $ind->habilidades_id_habilidad); //Actualizar la base de datos para permitir un nuevo uso de la acción $ind->devuelto = 1; if (!$ind->save()) { Yii::app()->user->setFlash('guardar', 'Error: no se ha podido guardar el modelo de acciones individuales. (actionFinalizaIndividuales,ScriptsController).'); //throw new CHttpException(404,"Error: no se ha podido guardar el modelo de acciones individuales. (actionFinalizaIndividuales,ScriptsController)"); } //Finalizar correctamente la transacción $transaction->commit(); } catch (Exception $ex) { //Rollback de la transacción en caso de error $transaction->rollback(); throw $ex; } } }
/** * Devuelve el modelo de datos basado en la clave primaria dada por la variable GET * * > Funcion predeterminada de Yii * * @param int $id id del modelo que se va a cargar * @throws \CHttpException El modelo de datos no se encuentra * @return \AccionesGrupales modelo de datos */ public function loadModel($id) { $model = Habilidades::model()->findByPk($id); if ($model === null) { throw new CHttpException(404, 'The requested page does not exist.'); } return $model; }
/** * Permite participar en una accion grupal abierta por tu aficion. * * Muestra el formulario que define que recursos va a aportar a la accion que se recogen por $_POST * * > El id del jugador se recoge de la variable de sesion * * @param int $id_accion id de la accion en la que se va a participar * * @route jugadorNum12/acciones/participar/{$id} * @redirect jugadorNum12/accion/participar/{$id_accion} * * @throws \Exception accion inexistente * @throws \Exception habilidad inexistente * @throws \Excepcion la accion no permite mas participantes * @throws \Excepcion fallo en la transaccion * * @return void */ public function actionParticipar($id_accion) { // TODO: pasar logica al modelo /* Actualizar datos de usuario (recuros,individuales y grupales) */ Usuarios::model()->actualizaDatos(Yii::app()->user->usIdent); /* Fin de actualización */ // Saco el usuario $usuario = Yii::app()->user->usIdent; // Cojo la acción de la tabla acciones_grupales $accionGrupal = AccionesGrupales::model()->with('habilidades')->with('participaciones')->with('usuarios')->findByPk($id_accion); // Saco el propietario de la acción $propietarioAccion = $accionGrupal['usuarios_id_usuario']; //Iniciamos la transacción $transaccion = Yii::app()->db->beginTransaction(); try { //Recojo los datos de la acción $accion = AccionesGrupales::model()->findByPK($id_accion); if ($accion === null) { Yii::app()->user->setFlash('accion', 'Acción inexistente.'); throw new Exception('Acción inexistente.'); } //Recojo los datos de la habilidad $habilidad = Habilidades::model()->findByPk($accion['habilidades_id_habilidad']); if ($habilidad == null) { Yii::app()->user->setFlash('habilidad', 'Habilidad inexistente.'); throw new Exception('La habilidad no existe.'); } //Saco el usuario que quiere participar en la acción $id_user = Yii::app()->user->usIdent; //Compuebo si el jugador ya ha participado en la acción $participacion = Participaciones::model()->findByAttributes(array('acciones_grupales_id_accion_grupal' => $id_accion, 'usuarios_id_usuario' => $id_user)); $nuevo_participante = $participacion === null; if ($nuevo_participante) { //Compruebo que no se sobrepase el límite de jugadores if ($accion['jugadores_acc'] >= $habilidad['participantes_max']) { Yii::app()->user->setFlash('participantes', 'La acción no permite más participantes.'); //$this-> redirect(array('acciones/index')); throw new Exception('La acción no permite más participantes.'); } //Saco el modelo que le voy a pasar a la vista $participacion = new Participaciones(); $participacion['acciones_grupales_id_accion_grupal'] = $id_accion; $participacion['usuarios_id_usuario'] = $id_user; } $participacion->setScenario('participar'); // Comprobar si hay recursos a aportar if (!isset($_POST['Participaciones'])) { $transaccion->rollback(); //Petición GET: Muestro el formulario $this->render('participar', array('habilidad' => $habilidad, 'participacion' => $participacion, 'accion' => $accion, 'accionGrupal' => $accionGrupal, 'usuario' => $usuario, 'propietarioAccion' => $propietarioAccion)); return; } //Petición POST $recursosAportados = $_POST['Participaciones']; // Llamar a función del modelo AccionesGrupales para participar en la misma AccionesGrupales::participar($id_accion, $recursosAportados, $accion, $habilidad, $participacion, $nuevo_participante); $transaccion->commit(); $this->redirect(array('acciones/participar', 'id_accion' => $id_accion)); } catch (Exception $exc) { $transaccion->rollback(); $this->redirect(array('usuarios/index')); throw $exc; } }