Make things less debug-y, introduce the start of scripted waves, UX improvements

This commit is contained in:
2022-05-08 11:38:23 +02:00
parent d2c12b4792
commit 9e7ab2c0d4
8 changed files with 276 additions and 82 deletions

View File

@@ -17,15 +17,6 @@ public class LinearGame implements Game {
m_zombiesPerBatch = zombiesPerBatch;
}
@Override
public int totalMobCount() {
int ret = 0;
for(int i = 1; i <= m_batches; i++) {
ret += i * m_zombiesPerBatch;
}
return ret;
}
@Override
public int batchCount() {
return m_batches;

View File

@@ -0,0 +1,79 @@
package gg.malloc.defense.games;
import gg.malloc.defense.model.Wave;
import gg.malloc.defense.model.Game;
import gg.malloc.defense.model.Spawner;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import java.util.HashMap;
public class ScaledWaves implements Game {
@Override
public int getWaveCount() {
return 10;
}
@Override
public Wave getWave(int waveNumber) {
HashMap<EntityType, Double> weights = new HashMap<>();
if (waveNumber <= 3) {
weights.put(EntityType.ZOMBIE, 1.0);
} else if (waveNumber <= 5) {
weights.put(EntityType.ZOMBIE, 0.6);
weights.put(EntityType.SPIDER, 0.1);
weights.put(EntityType.SKELETON, 0.3);
} else if (waveNumber <= 7) {
weights.put(EntityType.ZOMBIE, 0.7);
weights.put(EntityType.SKELETON, 0.3);
} else {
weights.put(EntityType.PILLAGER, 0.2);
weights.put(EntityType.ZOMBIE, 0.8);
}
boolean hasRavager = waveNumber >= 9;
return new MobWave(weights, waveNumber * 3, 3, hasRavager);
}
private class MobWave implements Wave {
HashMap<EntityType, Double> m_spawnWeights;
int m_batches;
int m_mobsPerBatch;
boolean m_hasRavager;
MobWave(HashMap<EntityType, Double> weights, int totalCount, int batches, boolean hasRavager) {
m_batches = batches;
m_mobsPerBatch = Math.max(1, totalCount / batches);
m_spawnWeights = weights;
m_hasRavager = hasRavager;
}
@Override
public int batchCount() {
return m_batches;
}
@Override
public void spawnBatch(Spawner spawner, int batch) {
assert(m_mobsPerBatch > 0);
for(int i = 0; i < m_mobsPerBatch; i++) {
EntityType selectedType = null;
double random = Math.random() * 1.0;
for(EntityType type : m_spawnWeights.keySet()) {
random -= m_spawnWeights.get(type);
if (random <= 0.0d) {
selectedType = type;
break;
}
}
assert(selectedType != null);
Entity newMob = spawner.spawnMob(selectedType);
newMob.setCustomName("Mob " + i + "/" + m_mobsPerBatch);
}
if (m_hasRavager) {
Entity newMob = spawner.spawnMob(EntityType.RAVAGER);
newMob.setCustomName("RAVAGER");
}
}
}
}