parent
8509794eeb
commit
49b327b951
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 2.9 KiB |
Binary file not shown.
@ -0,0 +1,48 @@ |
||||
package mightypork.rogue.world.entity.entities; |
||||
|
||||
|
||||
import mightypork.rogue.world.entity.AiTimer; |
||||
import mightypork.rogue.world.entity.Entity; |
||||
|
||||
|
||||
public class BossRatAi extends GrayRatAi { |
||||
|
||||
private final AiTimer healTimer = new AiTimer(0.5) { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
entity.health.addHealth(1); // heal
|
||||
} |
||||
}; |
||||
|
||||
|
||||
public BossRatAi(Entity entity) |
||||
{ |
||||
super(entity); |
||||
|
||||
setAttackTime(0.6); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected int getAttackStrength() |
||||
{ |
||||
return 5 + rand.nextInt(4); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected int getPreyAbandonDistance() |
||||
{ |
||||
return 15 + rand.nextInt(4); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void update(double delta) |
||||
{ |
||||
super.update(delta); |
||||
healTimer.update(delta); |
||||
} |
||||
} |
@ -0,0 +1,37 @@ |
||||
package mightypork.rogue.world.entity.entities; |
||||
|
||||
|
||||
import mightypork.rogue.world.entity.Entity; |
||||
|
||||
|
||||
public class BrownRatAi extends GrayRatAi { |
||||
|
||||
public BrownRatAi(Entity entity) |
||||
{ |
||||
super(entity); |
||||
|
||||
setAttackTime(0.8); |
||||
setScanTime(1); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double getScanRadius() |
||||
{ |
||||
return isSleeping() ? 3 + rand.nextInt(3) : 5 + rand.nextInt(3); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected int getAttackStrength() |
||||
{ |
||||
return 3 + rand.nextInt(2); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected int getPreyAbandonDistance() |
||||
{ |
||||
return 11 + rand.nextInt(4); |
||||
} |
||||
} |
@ -0,0 +1,92 @@ |
||||
package mightypork.rogue.world.entity.entities; |
||||
|
||||
|
||||
import mightypork.gamecore.util.math.algo.pathfinding.PathFinder; |
||||
import mightypork.rogue.world.entity.Entity; |
||||
import mightypork.rogue.world.entity.EntityModel; |
||||
import mightypork.rogue.world.entity.EntityPathFinder; |
||||
import mightypork.rogue.world.entity.EntityRenderer; |
||||
import mightypork.rogue.world.entity.EntityType; |
||||
import mightypork.rogue.world.entity.render.EntityRendererMobLR; |
||||
import mightypork.rogue.world.item.Items; |
||||
|
||||
|
||||
public class EntityBossRat extends Entity { |
||||
|
||||
private EntityRenderer renderer; |
||||
|
||||
/** Navigation PFC */ |
||||
private final PathFinder pathf = new EntityPathFinder(this); |
||||
|
||||
private final BossRatAi ai = new BossRatAi(this); |
||||
|
||||
|
||||
public EntityBossRat(EntityModel model, int eid) |
||||
{ |
||||
super(model, eid); |
||||
|
||||
addModule("ai", ai); |
||||
pos.addMoveListener(ai); |
||||
|
||||
pos.setStepTime(0.4); |
||||
setDespawnDelay(1); |
||||
|
||||
health.setMaxHealth(80); |
||||
health.setHealth(80); |
||||
health.setHitCooldownTime(0.35); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected EntityRenderer getRenderer() |
||||
{ |
||||
if (renderer == null) { |
||||
renderer = new EntityRendererMobLR(this, "sprite.rat.boss"); |
||||
} |
||||
|
||||
return renderer; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public EntityType getType() |
||||
{ |
||||
return EntityType.MONSTER; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public PathFinder getPathFinder() |
||||
{ |
||||
return pathf; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void onCorpseRemoved() |
||||
{ |
||||
// TODO drop rare stuff & fire event.
|
||||
|
||||
if (rand.nextInt(8) == 0) { |
||||
getLevel().dropNear(getCoord(), Items.BONE.createItem()); |
||||
return; |
||||
} |
||||
|
||||
if (rand.nextInt(3) == 0) { |
||||
getLevel().dropNear(getCoord(), Items.MEAT.createItem()); |
||||
return; |
||||
} |
||||
|
||||
if (rand.nextInt(6) == 0) { |
||||
getLevel().dropNear(getCoord(), Items.CHEESE.createItem()); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public String getVisualName() |
||||
{ |
||||
return "Rat Boss"; |
||||
} |
||||
} |
@ -0,0 +1,92 @@ |
||||
package mightypork.rogue.world.entity.entities; |
||||
|
||||
|
||||
import mightypork.gamecore.util.math.Calc; |
||||
import mightypork.gamecore.util.math.algo.pathfinding.PathFinder; |
||||
import mightypork.rogue.world.entity.Entity; |
||||
import mightypork.rogue.world.entity.EntityModel; |
||||
import mightypork.rogue.world.entity.EntityPathFinder; |
||||
import mightypork.rogue.world.entity.EntityRenderer; |
||||
import mightypork.rogue.world.entity.EntityType; |
||||
import mightypork.rogue.world.entity.render.EntityRendererMobLR; |
||||
import mightypork.rogue.world.item.Items; |
||||
|
||||
|
||||
public class EntityBrownRat extends Entity { |
||||
|
||||
private EntityRenderer renderer; |
||||
|
||||
private final PathFinder pathf = new EntityPathFinder(this); |
||||
|
||||
private final BrownRatAi ai = new BrownRatAi(this); |
||||
|
||||
|
||||
public EntityBrownRat(EntityModel model, int eid) |
||||
{ |
||||
super(model, eid); |
||||
|
||||
addModule("ai", ai); |
||||
pos.addMoveListener(ai); |
||||
|
||||
pos.setStepTime(0.37); // faster than gray rat
|
||||
setDespawnDelay(1); |
||||
|
||||
health.setMaxHealth(14); |
||||
health.setHealth(Calc.randInt(rand, 8, 14)); // tougher to kill
|
||||
health.setHitCooldownTime(0.35); // a bit longer than gray rat
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected EntityRenderer getRenderer() |
||||
{ |
||||
if (renderer == null) { |
||||
renderer = new EntityRendererMobLR(this, "sprite.rat.brown"); |
||||
} |
||||
|
||||
return renderer; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public EntityType getType() |
||||
{ |
||||
return EntityType.MONSTER; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public PathFinder getPathFinder() |
||||
{ |
||||
return pathf; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void onCorpseRemoved() |
||||
{ |
||||
// drop rat stuff
|
||||
|
||||
if (rand.nextInt(8) == 0) { |
||||
getLevel().dropNear(getCoord(), Items.BONE.createItemDamaged(10)); |
||||
return; |
||||
} |
||||
|
||||
if (rand.nextInt(3) == 0) { |
||||
getLevel().dropNear(getCoord(), Items.MEAT.createItem()); |
||||
return; |
||||
} |
||||
|
||||
if (rand.nextInt(6) == 0) { |
||||
getLevel().dropNear(getCoord(), Items.CHEESE.createItem()); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public String getVisualName() |
||||
{ |
||||
return "Brown Rat"; |
||||
} |
||||
} |
@ -0,0 +1,34 @@ |
||||
package mightypork.rogue.world.gen; |
||||
|
||||
|
||||
/** |
||||
* Error in world generation |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public class WorldGenError extends RuntimeException { |
||||
|
||||
public WorldGenError() |
||||
{ |
||||
super(); |
||||
} |
||||
|
||||
|
||||
public WorldGenError(String message, Throwable cause) |
||||
{ |
||||
super(message, cause); |
||||
} |
||||
|
||||
|
||||
public WorldGenError(String message) |
||||
{ |
||||
super(message); |
||||
} |
||||
|
||||
|
||||
public WorldGenError(Throwable cause) |
||||
{ |
||||
super(cause); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,36 @@ |
||||
package mightypork.rogue.world.gen.rooms; |
||||
|
||||
|
||||
import java.util.Random; |
||||
|
||||
import mightypork.gamecore.util.math.algo.Coord; |
||||
import mightypork.rogue.world.entity.Entities; |
||||
import mightypork.rogue.world.entity.Entity; |
||||
import mightypork.rogue.world.gen.MapTheme; |
||||
import mightypork.rogue.world.gen.ScratchMap; |
||||
import mightypork.rogue.world.gen.WorldGenError; |
||||
|
||||
|
||||
public class BossRoom extends SecretRoom { |
||||
|
||||
@Override |
||||
protected int getDoorCount(Random rand) |
||||
{ |
||||
return 2; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void buildExtras(ScratchMap map, MapTheme theme, Random rand, Coord min, Coord max) |
||||
{ |
||||
final Entity boss = Entities.RAT_BOSS.createEntity(); |
||||
if (!map.putEntityInArea(boss, min, max, 100)) { |
||||
|
||||
// just place it anywhere then
|
||||
if (!map.putEntityInMap(boss, 100)) { |
||||
throw new WorldGenError("Could not place boss."); |
||||
} |
||||
|
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue