public function jugarse() { switch ($this->turno) { case self::PRIMER_TURNO: //Turno inicial (preparar partido) $this->inicializaEncuentro(); $this->generaCronicaBase(); $this->guardaEstado(); break; case self::TURNO_DESCANSO: $this->generaEstadoDescanso(); $this->generaCronicaDescanso(); $this->guardaEstado(); break; case $this->turno > self::PRIMER_TURNO && $this->turno < self::ULTIMO_TURNO && $this->turno != self::TURNO_DESCANSO: //Este apartado incluye el descanso del partido! //Turnos de partido $this->generar_estado(); $this->guardaEstado(); break; case self::ULTIMO_TURNO: //Turno para generar el estado y crónica finales $this->generar_estado(); $this->generaCronicaUltimoTurno(); /****/ $this->finalizaEncuentro(); /****/ $this->guardaEstado(); /****/ $this->actualizaSiguientePartido($this->id_local); $this->actualizaSiguientePartido($this->id_visitante); $this->rellenaSiguientePartido($this->id_local); $this->rellenaSiguientePartido($this->id_visitante); $this->eliminaGrupales($this->id_local); $this->eliminaGrupales($this->id_visitante); //Creamos una notificación de fin de partido $notificacion = new Notificaciones(); $notificacion->fecha = time(); $notificacion->mensaje = Equipos::model()->findByPk($this->id_local)->nombre . " " . $this->goles_local . " - " . $this->goles_visitante . " " . Equipos::model()->findByPk($this->id_visitante)->nombre; $notificacion->imagen = "images/iconos/notificaciones/partido_terminado.png"; $notificacion->save(); //Enviamos la notificación a los interesados $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo' => $this->id_local)); foreach ($componentes as $componente) { $usrnotif = new Usrnotif(); $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $componente->id_usuario; $usrnotif->save(); //Devuelvo la influencia a los participantes7 $componente->recursos->influencias_partido_bloqueadas = 0; $componente->recursos->save(); } $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo' => $this->id_visitante)); foreach ($componentes as $componente) { $usrnotif = new Usrnotif(); $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $componente->id_usuario; $usrnotif->save(); //Devuelvo la influencia a los participantes $componente->recursos->influencias_partido_bloqueadas = 0; $componente->recursos->save(); } /****/ break; /*case self::ULTIMO_TURNO: //Turno para permitir visualizar el fin de partido durante un tiempo extra //y cambiar los datos del siguiente partido $this->finalizaEncuentro(); $this->guardaEstado(); $this->actualizaSiguientePartido($this->id_local); $this->actualizaSiguientePartido($this->id_visitante); $this->rellenaSiguientePartido($this->id_local); $this->rellenaSiguientePartido($this->id_visitante); $this->eliminaGrupales($this->id_local); $this->eliminaGrupales($this->id_visitante); //Creamos una notificación de fin de partido $notificacion = new Notificaciones; $notificacion->fecha = time(); $notificacion->mensaje = Equipos::model()->findByPk($this->id_local)->nombre . "(local)" . " vs " . Equipos::model()->findByPk($this->id_visitante)->nombre . "(visitante)"; $notificacion->imagen = "images/iconos/notificaciones/partido_terminado.png"; $notificacion->save(); //Enviamos la notificación a los interesados $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo'=>$this->id_local)); foreach ($componentes as $componente){ $usrnotif = new Usrnotif; $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $componente->id_usuario; $usrnotif->save(); } $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo'=>$this->id_visitante)); foreach ($componentes as $componente){ $usrnotif = new Usrnotif; $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $componente->id_usuario; $usrnotif->save(); } break;*/ /*case self::ULTIMO_TURNO: //Turno para permitir visualizar el fin de partido durante un tiempo extra //y cambiar los datos del siguiente partido $this->finalizaEncuentro(); $this->guardaEstado(); $this->actualizaSiguientePartido($this->id_local); $this->actualizaSiguientePartido($this->id_visitante); $this->rellenaSiguientePartido($this->id_local); $this->rellenaSiguientePartido($this->id_visitante); $this->eliminaGrupales($this->id_local); $this->eliminaGrupales($this->id_visitante); //Creamos una notificación de fin de partido $notificacion = new Notificaciones; $notificacion->fecha = time(); $notificacion->mensaje = Equipos::model()->findByPk($this->id_local)->nombre . "(local)" . " vs " . Equipos::model()->findByPk($this->id_visitante)->nombre . "(visitante)"; $notificacion->imagen = "images/iconos/notificaciones/partido_terminado.png"; $notificacion->save(); //Enviamos la notificación a los interesados $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo'=>$this->id_local)); foreach ($componentes as $componente){ $usrnotif = new Usrnotif; $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $componente->id_usuario; $usrnotif->save(); } $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo'=>$this->id_visitante)); foreach ($componentes as $componente){ $usrnotif = new Usrnotif; $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $componente->id_usuario; $usrnotif->save(); } break;*/ default: // No debería llegar aquí echo "Jodimos algo"; } }
/** * 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']; }
/** * Suma la experiencia indicada al jugador * * Si el jugador sube de nivel, actualiza los valores de: * * - indicadores de recursos * - nivel * - exp_necesaria * - puntos_desbloqueo * * > La funcion contempla la posibilidad de subir varios niveles de golpe * * @param int $exp experencia a sumar al jugador * @return boolean indicador si el jugador ha subido de nivel (true si el jugador ha subido) */ public function sumarExp($exp) { /* Experencia acumulada */ $exp_acc = $this->exp + $exp; $this->setAttributes(array('exp' => $exp_acc)); /* Comprobar si subimos de nivel */ if ($exp_acc >= $this->exp_necesaria) { $nivel_actual = $this->nivel; $nivel_inicial = $nivel_actual; $exp_sig_nivel = $this->exp_necesaria; $puntos_desbloqueo = $this->puntos_desbloqueo; /* Posible subir varios niveles */ while ($exp_acc >= $exp_sig_nivel) { $nivel_actual = $nivel_actual + 1; $puntos_desbloqueo += 1; Yii::app()->user->setFlash('nivel', 'Enhorabuena, has subido de nivel. Ahora tienes nivel ' . $nivel_actual); $exp_sig_nivel = Usuarios::expNecesaria($nivel_actual); //Creamos una notificacion para el nivel y otra para los puntos de desbloqueo $notificacionNivel = new Notificaciones(); $notificacionNivel->fecha = time(); $notificacionNivel->mensaje = " Enhorabuena, has subido de nivel. Ahora tienes nivel " . $nivel_actual; $notificacionNivel->imagen = "images/iconos/notificaciones/nivel.png"; $notificacionNivel->save(); $notificacionPuntos = new Notificaciones(); $notificacionPuntos->fecha = time(); $notificacionPuntos->mensaje = " Tus puntos de desbloqueo han aumentado. Ahora tienes " . $puntos_desbloqueo; $notificacionPuntos->imagen = "images/iconos/notificaciones/puntos_desbloqueo.png"; $notificacionPuntos->save(); //Guardamos las notificaciones en ursnotif $usrnotif = new Usrnotif(); $usrnotif->notificaciones_id_notificacion = $notificacionNivel->id_notificacion; $usrnotif->usuarios_id_usuario = $this->id_usuario; $usrnotif->save(); $usrnotifPuntos = new Usrnotif(); $usrnotifPuntos->notificaciones_id_notificacion = $notificacionPuntos->id_notificacion; $usrnotifPuntos->usuarios_id_usuario = $this->id_usuario; $usrnotifPuntos->save(); } /* Obtener los nuevos valores de los atributos del personaje: * ritmo de generacion de recursos * valores maximos de los recursos */ $nuevos_atributos = $this->actualizarAtributos($nivel_inicial, $nivel_actual); /* Guardamos los nuevos atributos del usuario */ $this->setAttributes(array('nivel' => $nivel_actual, 'exp_necesaria' => $exp_sig_nivel, 'puntos_desbloqueo' => $puntos_desbloqueo)); $this->recursos->setAttributes(array('dinero_gen' => $nuevos_atributos['dinero_gen'], 'animo_gen' => $nuevos_atributos['animo_gen'], 'influencias_gen' => $nuevos_atributos['influencias_gen'], 'animo_max' => $nuevos_atributos['animo_max'], 'influencias_max' => $nuevos_atributos['influencias_max'], 'influencias_bloqueadas' => $nuevos_atributos['influencias_bloqueadas'])); $this->save(); $this->recursos->save(); return true; } else { /* No aumentamos de nivel: guardamos la nueva exp acumulada */ $this->save(); return false; } }