3D spaceshooter with online scoreboard, online demos, ship building. Now entirely defunct, but might be resurrected
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
sector/src/net/sector/level/spawners/EnemySpawner.java

178 lines
3.7 KiB

package net.sector.level.spawners;
import java.util.Map;
import net.sector.collision.Scene;
import net.sector.entities.EntityNavigable;
import net.sector.level.SuperContext;
import net.sector.level.dataobj.AiObjParser;
import net.sector.level.drivers.DriverStore;
import com.porcupine.coord.Coord;
import com.porcupine.math.Range;
/**
* Asteroid field generator
*
* @author Ondřej Hruška (MightyPork)
*/
public class EnemySpawner extends SpawnerBase {
private Range entitySize = new Range(1);
private Range speedMul = null;
private Range healthMul = new Range(1);
private String driver = null;
private String wave = null;
private DriverStore drivers = SuperContext.basicDrivers;
private int rarity = 100;
private String entityName = "";
/**
* Asteroid generator
*
* @param scene scene
*/
public EnemySpawner(Scene scene) {
super(scene);
}
/**
* Set driver store (basic store is default)
*
* @param store driver store
*/
public void setDriverStore(DriverStore store) {
drivers = store;
}
/**
* Set spawned entity
*
* @param entityType entity name
*/
public void setEntity(String entityType) {
entityName = entityType;
}
/**
* Set spawned entity driver
*
* @param driver entity driver
*/
public void setDriver(String driver) {
this.driver = driver;
}
/**
* Set spawned entity wave
*
* @param wave entity driver
*/
public void setWave(String wave) {
this.wave = wave;
}
/**
* Set entity size (relative)
*
* @param size (default 1)
*/
public void setEntitySize(Range size) {
entitySize = size.copy();
}
/**
* Set entity speed
*
* @param speed (1 = default)
*/
public void setEntitySpeed(Range speed) {
speedMul = speed;
}
/**
* Set entity health multiplier
*
* @param health health multiplier (1 = default)
*/
public void setHealthMul(Range health) {
healthMul = health;
}
/**
* Set spawn rarity (0 = super common (bad), 100 = every 100 ticks)
*
* @param rate (default 100)
*/
public void setRarity(int rate) {
this.rarity = rate;
}
/**
* Spawn asteroids if needed.
*/
@Override
public void onUpdate() {
if (rand.nextInt(rarity + 1) == 0) {
double y = 0;
double scale = entitySize.randDouble();
EntityNavigable ent = EntityRegistry.buildEntity(entityName, Coord.ZERO);
ent.adjustForScale(scale);
if (speedMul != null) ent.setStableSpeedMultiplier(speedMul.randDouble());
int tries = 0;
Coord pos;
while (true) {
pos = new Coord(xCoord.randDouble(), y, zCoord.randDouble());
if (scene.getEntitiesInRange(pos, ent.getRadius() + 0.3).size() <= 0) break;
tries++;
if (tries > 15) return;
}
ent.getPos().setTo(pos);
if (driver != null) ent.setDriver(drivers.getDriver(driver));
if (wave != null) getLevel().addToWave(wave, ent);
scene.add(ent);
}
}
@Override
public void loadFromXmlArgs(Map<String, Object> args) {
/*
*
* <entity str="burger" />
*
* optional:
* <driver str="burger_zone_mad" />
* <size range="1-2" />
* <rarity num="100" />
* <x range="-30-30" />
* <z range="100-120" />
*
*/
setEntity(AiObjParser.getString(args.get("entity"), entityName));
setDriver(AiObjParser.getString(args.get("driver"), driver));
setWave(AiObjParser.getString(args.get("wave"), wave));
setEntitySize(AiObjParser.getRange(args.get("size"), entitySize));
setHealthMul(AiObjParser.getRange(args.get("health"), healthMul));
setEntitySpeed(AiObjParser.getRange(args.get("speed"), speedMul));
setRarity(AiObjParser.getInteger(args.get("rarity"), rarity));
Range x = AiObjParser.getRange(args.get("x"), xCoord);
Range z = AiObjParser.getRange(args.get("z"), zCoord);
setZone(x, z);
}
}