/** * 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)); }
function run($args) { //no sé si debe comprobar si hay otro script ejecutandose o no $trans = Yii::app()->db->beginTransaction(); try { $recursos = Recursos::model()->findAll(); foreach ($recursos as $recurso) { //influencias Recursos::aumentar_recursos($recurso->usuarios_id_usuario, "influencias", $recurso->influencias_gen); //dinero Recursos::aumentar_recursos($recurso->usuarios_id_usuario, "dinero", $recurso->dinero_gen); //animo Recursos::aumentar_recursos($recurso->usuarios_id_usuario, "animo", $recurso->animo_gen); $trans->commit(); } } catch (Exception $e) { $trans->rollback(); } }
/** * 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)); }
public function actualizaRecursos($id_usuario) { try { $animo_nuevo = 0; $dinero_nuevo = 0; $influencias_nuevas = 0; $ahora = time(); $transaction = Yii::app()->db->beginTransaction(); $rec = Recursos::model()->findByAttributes(array('usuarios_id_usuario' => $id_usuario)); if ($rec === null) { throw new Exception("Recursos inexistentes. ModeloRecursos (actualizaRecursos)", 404); } //Tomar diferencia de minutos $dif_minutos = floor(($ahora - $rec->ultima_act) / 60); if ($dif_minutos > 0) { //Solo actualizamos si han pasado ciertos minutos $animo_nuevo = round($rec->animo_gen * $dif_minutos); $dinero_nuevo = round($rec->dinero_gen * $dif_minutos); $influencias_nuevas = round($rec->influencias_gen * $dif_minutos); //Ultima actualización (para precisión total) //if ($rec->ultima_act == 0) //{ $rec->ultima_act = $ahora; //} //else //{ // $rec->ultima_act + ($dif_minutos*60); //} if (!$rec->save()) { throw new Exception("Imposible guardar modelo de recursos. (actualizaRecursos,RecusosModel)", 500); } //influencias self::aumentar_recursos($rec->usuarios_id_usuario, "influencias", $influencias_nuevas); //dinero self::aumentar_recursos($rec->usuarios_id_usuario, "dinero", $dinero_nuevo); //animo self::aumentar_recursos($rec->usuarios_id_usuario, "animo", $animo_nuevo); } //Finalizar transacción con éxito $transaction->commit(); } catch (Exception $e) { $transaction->rollback(); //throw $e; } }
/** * * Incrementa los recursos durante el partido de forma asíncrona * * @param int $id_usuario id del usuario al que incrementar recursos * * @route jugadorNum12/partidos/actRecursos/{$id_usuario} * @return JSON con los datos necesarios para llevar a cabo la actualización */ public function actionActRecursos($id_usuario) { Recursos::model()->actualizaRecursos($id_usuario); $datos = Recursos::model()->findByPk($id_usuario); if ($datos !== null) { echo json_encode(array('codigo' => (int) 1, 'influencias' => (int) $datos->influencias, 'dinero' => (int) $datos->dinero, 'animo' => (int) $datos->animo, 'influencias_max' => (int) $datos->influencias_max, 'animo_max' => (int) $datos->animo_max)); Yii::app()->end(); } else { echo json_encode(array('codigo' => (int) 0, 'influencias' => (int) 0, 'dinero' => (int) 0, 'animo' => (int) 0, 'influencias_max' => (int) 0, 'animo_max' => (int) 0)); Yii::app()->end(); } }
/** * 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); }
/** * Funcion que agrega una participacion a una accion grupal * * - actualiza los recursos del usuario * - suma exp al jugador en funcion de los recursos aportados * - actualiza los recursos de la accion * - agrega la participacion (o actualiza una ya existente) * - si se completa la accion, la ejecuta * * Comprobaciones de seguridad realizadas: * 1. la participacion es para el equipo del usuario * 2. la accion no ha terminado * 3. el jugador tiene suficientes recursos * 4. la participacion no es mayor que los recursos restantes de la accion * 5. error al actualizar la participacion en la base de datos * 6. la participacion es vacia (ignorarla) * * @static * @param $id_accion * @param $recursosAportados * @param $accion * @param $habilidad * @param $participacion * @param $nuevo_participante * * @throws \Exception 'No puedes participar en esta accion' * @throws \Exception 'La accion ya ha acabado' * @throws \Exception 'No se puede obtener el modelo de recursos' * @throws \Exception 'No tienes suficientes recursos.' * @throws \Exception 'Error en la BBDD.' * @throws \Exception 'El usuario se ha saltado una validación.' * @throws \Exception 'No has aportado nada a la acción.' * @return void */ public static function participar($id_accion, $recursosAportados, $accion, $habilidad, $participacion, $nuevo_participante) { // 1) Comprobacion: la accion es del equipo del user if ($accion['equipos_id_equipo'] != Yii::app()->user->usAfic) { Yii::app()->user->setFlash('equipo', 'No puedes participar en esta acción. No es de tu equipo'); throw new Exception('No puedes participar en esta acción.'); } // 2) Comprobacion: la accion no ha terminado if ($accion['completada'] != 0) { Yii::app()->user->setFlash('acabada', 'La acción ya ha acabado.'); throw new Exception('La acción ya ha acabado.'); } // id_usuario y recursos $id_user = Yii::app()->user->usIdent; $recursosUsuario = Recursos::model()->findByAttributes(array('usuarios_id_usuario' => $id_user)); if ($recursosUsuario === null) { //Comprobación de seguridad Yii::app()->user->setFlash('recursos', 'No se puede obtener el modelo de recursos. (actionParticipar,AccionesController).'); throw new Exception('No se puede obtener el modelo de recursos.'); } $dineroUsuario = $recursosUsuario['dinero']; $influenciasUsuario = $recursosUsuario['influencias']; $animoUsuario = $recursosUsuario['animo']; $dineroAportado = $recursosAportados['dinero_nuevo']; $animoAportado = $recursosAportados['animo_nuevo']; $influenciasAportadas = $recursosAportados['influencia_nueva']; // Se actualiza la participacion $participacion->setAttributes(array('dinero_nuevo' => $dineroAportado, 'animo_nuevo' => $animoAportado, 'influencia_nueva' => $influenciasAportadas)); // 3) Comprobacion: el usuario tiene suficientes recursos if ($dineroAportado > $dineroUsuario || $animoAportado > $animoUsuario || $influenciasAportadas > $influenciasUsuario) { //No tiene suficientes recursos Yii::app()->user->setFlash('recursos', 'No tienes suficientes recursos.'); throw new Exception('No tienes suficientes recursos.'); } // 4) Comprobacion: los recursos aportados no sobrepasan los que faltan para terminar la acción $dineroAportado = min($dineroAportado, $habilidad['dinero_max'] - $accion['dinero_acc']); $animoAportado = min($animoAportado, $habilidad['animo_max'] - $accion['animo_acc']); $influenciasAportadas = min($influenciasAportadas, $habilidad['influencias_max'] - $accion['influencias_acc']); // 5) Comprobacion: error al actualizar la participacion en la base de datos if ($dineroAportado < 0 || $animoAportado < 0 || $influenciasAportadas < 0) { if ($habilidad['dinero_max'] < $accion['dinero_acc']) { Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' más dinero del maximo (' . $accion['dinero_acc'] . '/' . $habilidad['dinero_max'] . ').', 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } elseif ($habilidad['animo_max'] < $accion['animo_acc']) { Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' más animo del maximo (' . $accion['animo_acc'] . '/' . $habilidad['animo_max'] . ').', 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } elseif ($habilidad['influencias_max'] < $accion['influencias_acc']) { Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' más influencia del maximo (' . $accion['influencias_acc'] . '/' . $habilidad['influencias_max'] . ').', 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } Yii::log('[MALICIOUS_REQUEST] El usuario ' . $id_user . ' se ha saltado una validación de seguridad, intentando robar recursos de la accion ' . $id_accion, 'warning'); Yii::app()->user->setFlash('aviso', 'Se ha registrado un intento de ataque al sistema. De no ser así, póngase en contacto con el administrador. Ten cuidado o acabarás baneado.'); throw new Exception('El usuario se ha saltado una validación.'); } //6 ) Comprobacion: la participacion es vacia (ignorarla) if ($dineroAportado == 0 && $animoAportado == 0 && $influenciasAportadas == 0) { Yii::app()->user->setFlash('aporte', 'No has aportado nada a la acción.'); throw new Exception('No has aportado nada a la acción.'); } // Actualizar los recursos del user $recursosUsuario['dinero'] = $dineroUsuario - $dineroAportado; $recursosUsuario['animo'] = $animoUsuario - $animoAportado; $recursosUsuario['influencias'] = $influenciasUsuario - $influenciasAportadas; $recursosUsuario['influencias_bloqueadas'] += $influenciasAportadas; $recursosUsuario->save(); // Actualizar la experiencia acumulada del usuario $usuario = Usuarios::model()->findByPk($id_user); if ($usuario === null) { //Comprobación de seguridad Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' No se encuentra el usuario (' . $id_user . ').', 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } $exp_ganada = (int) ($dineroAportado * Usuarios::MOD_EXP_DINERO + $animoAportado * Usuarios::MOD_EXP_ANIMO + $influenciasAportadas * Usuarios::MOD_EXP_INFLUENCIAS); $usuario->sumarExp($exp_ganada); // Actualizar la acciones_grupales $accion['dinero_acc'] += $dineroAportado; $accion['influencias_acc'] += $influenciasAportadas; $accion['animo_acc'] += $animoAportado; if ($nuevo_participante) { $accion['jugadores_acc'] += 1; } if ($accion['dinero_acc'] == $habilidad['dinero_max'] && $accion['influencias_acc'] == $habilidad['influencias_max'] && $accion['animo_acc'] == $habilidad['animo_max']) { $accion['completada'] = 1; } // Actualizar la participación if ($nuevo_participante) { $participacion['dinero_aportado'] = $dineroAportado; $participacion['influencias_aportadas'] = $influenciasAportadas; $participacion['animo_aportado'] = $animoAportado; $participacion->save(); } else { $n = $participacion->updateAll(array('dinero_aportado' => $participacion['dinero_aportado'] + $dineroAportado, 'influencias_aportadas' => $participacion['influencias_aportadas'] + $influenciasAportadas, 'animo_aportado' => $participacion['animo_aportado'] + $animoAportado), "acciones_grupales_id_accion_grupal=:id_accion && usuarios_id_usuario=:id_user", array(':id_accion' => $id_accion, ':id_user' => $id_user)); if ($n != 1) { //Si salta esto es que había más de una participación del mismo usuario en la acción Yii::log('[DATABASE_ERROR] El usuario ' . $id_user . ' tiene ' . $n . ' participaciones en la acción ' . $id_accion, 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } } // 1) Si la accion esta completada con esa aportacion // - se ejecuta la accion // - bonificacion de experencia a los participantes de la accion // 2) Se guardas los cambios en la accion if ($accion['completada'] == 1) { //Si se ha completado creamos una notificación $notificacion = new Notificaciones(); $notificacion->fecha = time(); $notificacion->mensaje = Usuarios::model()->findByPk($id_user)->nick . " ha completado la acción " . Habilidades::model()->findByPk($habilidad->id_habilidad)->nombre; $notificacion->imagen = "images/iconos/notificaciones/completa_grupal.png"; $notificacion->save(); //Enviamos la notificación a la afición $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo' => Usuarios::model()->findByPk($id_user)->equipos_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(); } Yii::import('application.components.Acciones.*'); $nombreHabilidad = $habilidad->codigo; //Llamar al singleton correspondiente y ejecutar dicha acción $nombreHabilidad::getInstance()->ejecutar($id_accion); // actualizar la exp de todos los participantes $participantes = $accion->participaciones; $u; foreach ($participantes as $p) { $u = Usuarios::model()->findByPk($p->usuarios_id_usuario); $u->sumarExp(Usuarios::MUCHA_EXP); } } $accion->save(); if ($accion['completada'] == 1) { Yii::app()->user->setFlash('completada', '¡Enhorabuena, has completado la acción¡'); } else { //si se ha aportado algo creamos notivicación $participaciones = Participaciones::model()->findAllByAttributes(array('acciones_grupales_id_accion_grupal' => $id_accion)); //Si soy el unico en participar no creamos la notificacion if (count($participaciones) > 1) { $notificacion = new Notificaciones(); $notificacion->fecha = time(); $notificacion->mensaje = Usuarios::model()->findByPk($id_user)->nick . " ha participado en la acción " . Habilidades::model()->findByPk($habilidad->id_habilidad)->nombre; $notificacion->imagen = "images/iconos/notificaciones/participacion_grupal.png"; $notificacion->save(); //enviamos notificaciones a los participantes de la acción foreach ($participaciones as $participacion) { if ($participacion->usuarios_id_usuario != $id_user) { $usrnotif = new Usrnotif(); $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $participacion->usuarios_id_usuario; //$habilidad->id_habilidad;// $usrnotif->save(); } } } Yii::app()->user->setFlash('aporte', 'Tu equipo agradece tu generosa contribución.'); } }
/** * 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(); } }