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