-
Notifications
You must be signed in to change notification settings - Fork 0
/
administradorDeEnemigos.wlk
131 lines (100 loc) · 4 KB
/
administradorDeEnemigos.wlk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import game.*
import slime.*
import administradorDeOleadas.*
/* =======================================
Administrador de Enemigos: Gestión de enemigos en el juego
======================================= */
object administradorDeEnemigos {
// constantes
const maxEnemigosEnPantalla = 8
// Propiedades
var nombreEnemigo = 10000
var enemigos = #{}
const property cantDeEnemigosPorLinea= [linea1,linea2,linea3,linea4,linea5]
// Métodos de Consulta
method enemigos() = enemigos
method nombre() = nombreEnemigo
method pocosEnemigosEnPantalla() = cantDeEnemigosPorLinea.sum({linea => linea.cantEnemigos()}) < maxEnemigosEnPantalla
// Genera un nuevo nombre para los enemigos
method sumarEnemigo() { nombreEnemigo += 1 }
// Genera un nuevo enemigo del tipo especificado, si hay espacio en la columna
method generarEnemigo(tipo) {
if (self.pocosEnemigosEnPantalla()) {
const y = 0.randomUpTo(4.9999).truncate(0)
const posicionTemporal = new MutablePosition(x = 14, y=y)
var nombreParaEnemigo = self.nombre()
/* Solo genera el enemigo si la posición temporal está vacía */
if (game.getObjectsIn(posicionTemporal).isEmpty()) {
nombreParaEnemigo = new Slime(position = posicionTemporal, tipo = tipo)
enemigos.add(nombreParaEnemigo) /* Añade el nuevo enemigo a la colección de enemigos activos */
self.sumarEnemigo() /* Incrementa el contador de enemigos en el administrador */
administradorDeOleadas.sumarEnemigo() /* Notifica al administrador de oleadas */
self.aumentarLinea(y)
return game.addVisual(nombreParaEnemigo) /* Muestra al enemigo en el juego */
} else {
return /* No genera el enemigo si la posición está ocupada */
}
}
}
// Elimina un enemigo específico de la colección de enemigos activos
method eliminarEnemigo(enemigo) {
const y= enemigo.position().y()
self.decrementarLinea(y)
administradorDeOleadas.reducirEnemigo()
enemigos.remove(enemigo)
}
// Resetea el estado del administrador, eliminando todos los enemigos y reiniciando el contador
method reset() {
enemigos.forEach({ enemigo => enemigo.eliminar() })
nombreEnemigo = 0
enemigos = []
self.resetLineas()
}
method resetLineas(){
cantDeEnemigosPorLinea.forEach({linea => linea.cantEnemigos(0)})
}
method matarEnemigos(){
enemigos.forEach({enemigo => enemigo.eliminar()})
}
// Verifica si los enemigos están muertos
method estanMuertos() {
enemigos.forEach({ enemigo => enemigo.estaMuerto() })
}
// Ordena a cada enemigo ejecutar la función de movimiento
method moverEnemigos() {
enemigos.forEach({ enemigo => enemigo.movete() })
}
method cambiarFrame(){
enemigos.forEach({ enemigo => enemigo.cambiarFrame()})
}
method aumentarLinea(linea){
cantDeEnemigosPorLinea.get(linea).aumentarCant()
}
method decrementarLinea(linea){
cantDeEnemigosPorLinea.get(linea).restarCantidad()
}
method hayEnemigoFila(numeroFila) = cantDeEnemigosPorLinea.get(numeroFila).tieneEnemigos()
method noHayEnemigoFila(numeroFila) = cantDeEnemigosPorLinea.get(numeroFila).noTieneEnemigos()
}
class Linea{
const linea = 0
method position() = new MutablePosition(x = 13, y = linea)
method text() = cantEnemigos.toString()
var property cantEnemigos = 0
method reset(){
cantEnemigos = 0
}
method tieneEnemigos() = cantEnemigos > 0
method noTieneEnemigos() = cantEnemigos == 0 //nadie tiene enemigos
method aumentarCant() {
cantEnemigos+=1
}
method restarCantidad(){
cantEnemigos-=1
}
}
const linea1 = new Linea(linea=0)
const linea2 = new Linea(linea=1)
const linea3 = new Linea(linea=2)
const linea4 = new Linea(linea=3)
const linea5 = new Linea(linea=4)