njara / mochadoom

Fork of Mochadoom from Sourceforge
GNU General Public License v3.0
0 stars 1 forks source link

RS27 - Modo berserk #24

Closed elbraulio closed 8 years ago

elbraulio commented 8 years ago

Requisito de Usuario asociado RU16 - Modo berserk

Lapnis commented 8 years ago

Initialization

Mediante un objeto, se debe activar el Modo Berserk, el cual impide recibir cualquier tipo de daño de parte de los zombies del juego.

Lapnis commented 8 years ago

Concept Location

Los conceptos relevantes son los siguientes: zombie, damage, player

Lapnis commented 8 years ago

Impact Analysis

Las clases que podrian verse afectadas por la implementación son:

Lapnis commented 8 years ago

Prefactoring

Se debe hacer que mediante un objeto, se active un modo temporal para el jugador el cual le impide recibir cualquier tipo de daño de parte de los zombies. Dado que es complicado ingresar un item dentro del mapa, se decidió que el item sera "tirado" por los zombies con cierta probabilidad y tiempo de duracion que varia segun la dificultad del juego seleccionada (a mayor dificultad, menos probabilidad de obtener el item y a mayor dificultad, menor el tiempo que durara su efecto).

Lapnis commented 8 years ago

Change Propagation

Primero, como el modo a implementar esta relacionado con el jugador, se implementó una variable que indica si el modo esta activado o no (por defecto, esta desactivado). Además, se implementaron todos los métodos relacionados con este modo, como por ejemplo, para inicializar los tiempos que durará dependiendo de la dificultad, obtener el estado del modo y saber si hay que desactivarlo o no. Luego, como hay que hacer que los zombies dejen un item, hay que agregar un nuevo tipo de item al juego. Este usará el mismo sprite que el medikit normal, y por ende, se crea una nueva clase para este objeto pero con las mismas caracteristicas que el medikit normal. Una vez ingresado el nuevo objeto, hay que implementar el comportamiento de dropeo de dicho item, el cual se ve en el metodo Killmobj de la clase Actions. Aqui se crea un nuevo caso para todos los tipos de zombies, donde a traves de un metodo, se decide si se dropeará o no el item para activar el modo berserk. Luego, en UnifiedGameMap, se agregó el comportamiento que tiene este objeto, el cual es solamente activar el Modo Berserk (y no curar), por ende, se usa la funcion de player_t llamada activateBerserkMode() para activar el modo. Y finalmente, para que todo el modo tenga sentido, hay que hacer que si el modo esta activado, y el daño que recibe el jugador es de un zombie, no se descuente ni se envenene el jugador. Para ello, en la clase Actions, se agrega el caso en el método Damagemobj, para que no se descuente vida mientras este modo este activado.

Lapnis commented 8 years ago

Verification

Luego de implementar lo descrito en el punto anterior, se ve un funcionamiento sin problemas de lo descrito al inicio de esta issue. Los zombies "tiran" el medikit que activa el modo con cierta probabilidad, y al ser tomado el item, no se recibe daño mientras el efecto este activo (se mostrará un mensaje cuando se active y se desactive el modo). El objeto tiene el mismo aspecto que un medikit normal, pero solo activa el modo, no cura al jugador. Dado que todo funciona sin problemas, no se necesita postfactoring.

Lapnis commented 8 years ago

Conclusion

El Modo Berserk quedá completamente implementado en el juego.