/** * Muestra el arbol de habilidades completo * * @route jugadorNum12/habilidades * @return void */ public function actionIndex() { /* Actualizar datos de usuario (recuros,individuales y grupales) */ Usuarios::model()->actualizaDatos(Yii::app()->user->usIdent); /* Fin de actualización */ //Sacar una lista de las acciones desbloqueadas de un usuario //$accionesDesbloqueadas = Desbloqueadas::model()->findAllByAttributes(array('usuarios_id_usuario'=>Yii::app()->user->usIdent)); //Sacar una lista con los recursos del usuario $recursosUsuario = Recursos::model()->findByAttributes(array('usuarios_id_usuario' => Yii::app()->user->usIdent)); //Sacar el nivel del usuario $usuario = Usuarios::model()->findByPK(Yii::app()->user->usIdent); $accionesGrupales = AccionesGrupales::model()->findAllByAttributes(array('usuarios_id_usuario' => Yii::app()->user->usIdent)); $accionesIndividuales = AccionesIndividuales::model()->findAllByAttributes(array('usuarios_id_usuario' => Yii::app()->user->usIdent)); //Comprobaciones de seguridad /*if (($accionesDesbloqueadas === null) || ($recursosUsuario === null)) { Yii::app()->user->setFlash('error', 'Acciones o recursos no encontrados. (actionIndex, AccionesController).'); } */ //A partir de las acciones sacamos las habilidades para poder mostrarlas /* $acciones = array(); foreach ($accionesDesbloqueadas as $habilidad) { $hab = Habilidades::model()->findByPK($habilidad['habilidades_id_habilidad']); //Comprobación de seguridad if ($hab === null) { Yii::app()->user->setFlash('habilidad', 'Habilidad no encontrada. (actionIndex,AccionesController).'); } $acciones[] = $hab; } */ $acciones = Habilidades::model()->findAll(); //Envía los datos para que los muestre la vista $this->render('index', array('acciones' => $acciones, 'recursosUsuario' => $recursosUsuario, 'usuario' => $usuario, 'accionesGrupales' => $accionesGrupales, 'accionesIndividuales' => $accionesIndividuales)); }
/** * 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; } } }
/** * Funcion que se encarga de actualizar recursos y acciones del usuario * * Datos que se actualizan: * * - generar recursos * - finalizar acciones individuales * - finalizar acciones grupales * * @param int $id_usuario id del usuario que se va a actualizar * @return void */ public function actualizaDatos($id_usuario) { AccionesIndividuales::model()->finalizaIndividuales($id_usuario); AccionesGrupales::model()->finalizaGrupales(); Recursos::model()->actualizaRecursos($id_usuario); }
/** * Función empleada para usar una habilidad individual * * @param int $id_usuario id del usuario * @param int $id_accion * @param $res * @param $habilidad * @throws \Exception 'La habilidad no se ha regenerado todavía.' * @return void */ public static function usarIndividual($id_usuario, $id_accion, $res, $habilidad) { // Importar acciones Yii::import('application.components.Acciones.*'); // Crear criteria de búsqueda $criteria = new CDbCriteria(); $criteria->addCondition('usuarios_id_usuario=:bid_usuario'); $criteria->addCondition('habilidades_id_habilidad=:bid_accion'); $criteria->params = array(':bid_usuario' => $id_usuario, ':bid_accion' => $id_accion); $accion_ind = AccionesIndividuales::model()->find($criteria); $tiempo_reg = $habilidad['cooldown_fin']; if ($accion_ind === null) { $accion_ind = new AccionesIndividuales(); $accion_ind->setAttributes(array('usuarios_id_usuario' => $id_usuario, 'habilidades_id_habilidad' => $id_accion, 'cooldown' => 0, 'devuelto' => 0)); $res['dinero'] -= $habilidad['dinero']; $res['animo'] -= $habilidad['animo']; $res['influencias'] -= $habilidad['influencias']; $res->save(); //actualizar la hora en que acaba de regenerarse la accion $accion_ind->cooldown = time() + $tiempo_reg; $accion_ind->devuelto = 0; //guardar en los modelo $accion_ind->save(); //Tomar nombre de habilidad para instanciación dinámica $nombreHabilidad = $habilidad->codigo; //Llamar al singleton correspondiente y ejecutar dicha acción $nombreHabilidad::getInstance()->ejecutar($id_usuario); } elseif ($accion_ind->devuelto == 1) { $res['dinero'] -= $habilidad['dinero']; $res['animo'] -= $habilidad['animo']; $res['influencias'] -= $habilidad['influencias']; $res->save(); //actualizar la hora en que acaba de regenerarse la accion $accion_ind->cooldown = time() + $tiempo_reg; $accion_ind->devuelto = 0; //guardar en los modelo $accion_ind->save(); //Tomar nombre de habilidad para instanciación dinámica $nombreHabilidad = $habilidad->codigo; //Llamar al singleton correspondiente y ejecutar dicha acción $nombreHabilidad::getInstance()->ejecutar($id_usuario); } else { Yii::app()->user->setFlash('regen', 'La habilidad no se ha regenerado todavía.'); //$this-> redirect(array('acciones/index')); throw new Exception('La habilidad no se ha regenerado todavía.'); } }
/** * Ejecuta la accion (individual o grupal) pulsada. Significa bajarse la carta de habilidad * * Cualquier habilidad resta los recursos iniciales al jugador, además, * * - Si es una accion grupal muestra un formulario para recoger la cantidad inicial de recursos * que aporta el jugador (podría no aportar recursos). * Los datos del formulario se recogen por $_POST y se crea una nueva accion grupal en el equipo * al que pertenece el usuario * * - Si es una accion individual se ejecuta al momento * * > El id del jugador y la aficion a la que pertence se recogen de la variable de sesion * * > No se le pasaran acciones individuales ni de partido * * @param int $id_accion id de la habilidad que se ejecuta * * @route jugadorNum12/acciones/usar/{$id_accion} * @redirect jugadorNum12/equipos/ver/{$id_equipo} si es accion grupal * @redirect jugadorNum12/usuarios/perfil si es accion individual * * @return void */ public function actionUsar($id_accion) { // TODO : pasar la logica al modelo /* Actualizar datos de usuario (recuros,individuales y grupales) */ Usuarios::model()->actualizaDatos(Yii::app()->user->usIdent); /* Fin de actualización */ //Comenzar transaccion $trans = Yii::app()->db->beginTransaction(); try { // Importar acciones Yii::import('application.components.Acciones.*'); //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(); Yii::app()->user->setFlash('inexistente', 'Acción inexistente.'); $this->redirect(array('acciones/index')); } //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(); Yii::app()->user->setFlash('bloqueada', 'No tienes desbloqueada la acción.'); $this->redirect(array('acciones/index')); } //Si esta desbloqueada //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(); Yii::app()->user->setFlash('recursos', 'No tienes suficientes recursos.'); $this->redirect(array('acciones/index')); } $usuario = Usuarios::model()->findByPk($id_usuario); //Si tenemos suficientes recursos miramos si es individual o grupal if ($habilidad['tipo'] == Habilidades::TIPO_INDIVIDUAL) { AccionesIndividuales::usarIndividual($id_usuario, $id_accion, $res, $habilidad); } else { if ($habilidad['tipo'] == Habilidades::TIPO_GRUPAL) { //Sacar la accion grupal //$accion_grupal = AccionesGrupales::model()->findByPk($id_accion); $id_usuario = Yii::app()->user->usIdent; $id_equipo = Yii::app()->user->usAfic; $accion_grupal = AccionesGrupales::model()->findByAttributes(array('equipos_id_equipo' => $id_equipo, 'habilidades_id_habilidad' => $id_accion, 'usuarios_id_usuario' => $id_usuario)); //Si no esta creada if ($accion_grupal === null) { $nuevo_id = AccionesGrupales::usarGrupal($usuario, $id_accion, $id_equipo, $res, $habilidad); } else { //Si esta creada //sacar el id de accion grupal (pk) y redirigir a participar($id_accion_grupal) Yii::app()->user->setFlash('recursos', 'La acción ya existe. Participa en ella.'); $this->redirect(array('acciones/participar', 'id_accion' => $accion_grupal['id_accion_grupal'])); } } else { // Tipo inválido $trans->rollback(); Yii::app()->user->setFlash('error', 'No puedes usar esa acción.'); $this->redirect(array('acciones/index')); } } // Finalizar transacción $trans->commit(); //Redireccionar acción individual if ($habilidad['tipo'] == Habilidades::TIPO_INDIVIDUAL) { /* como no está definido el id_accion_grupal, le damos cualquier valor porque en la vista no se usa si es de tipo individual, pero necesita ser != null */ $id_acc = -1; Yii::app()->user->setFlash('error', 'Exito al usar la accion'); $this->redirect(array('habilidades/index/')); } else { if ($habilidad['tipo'] == Habilidades::TIPO_GRUPAL) { //redireccionar acción grupal participar Yii::app()->user->setFlash('error', 'La accion grupal se ha creado con exito'); $this->redirect(array('acciones/participar/', 'id_accion' => $nuevo_id)); } else { Yii::app()->user->setFlash('error', 'No puedes forzar el uso de acciones de partido'); $this->redirect(array('habilidades/index', 'id_partido' => $id_partido)); } } } catch (Exception $e) { $this->redirect(array('habilidades/index')); } }