/** * This method deletes a worm from the list of objects. * * @param world The world from where the worm needs to be deleted. * @post The worm will be deleted from the current world. | new.objects.contains(this) == false; */ @Raw public void deleteWorm(World world) { int index = world.getCurrentWormIndex() + 1; int size = world.getWorms().size(); if (index == size) this.getWorld().setCurrentWormIndex(0); if (this.getIsAlive() == false) world.deleteWorm(this); }
/** * Changes the positions of the projectile as a result of a jump from the current position. * * @post If the projectile hits a worm this worm loses some hit points and the projectile is * removed from the world and set non active. | if ((Math.sqrt(Math.pow(w.getXpos()-tempXpos, * 2)+Math.pow(w.getYpos()-tempYpos, 2))< maxDistance)) | while (this.getActive == true) | * then (new.setHitPoints(worm.getHitPoints-this.getDamage()) | then (world.getProjectile() == * null) | then (new.getActive == false)) * @post If the projectile doesn't hit a worm, the projectile will be deleted when it leaves the * map or when it hits impassable terrain. | if !((Math.sqrt(Math.pow(w.getXpos()-tempXpos, * 2)+Math.pow(w.getYpos()-tempYpos, 2))< maxDistance)) | then ( if * ((isOutOfTheMap(tempXpos,tempYpos))) | then ((world.getProjectile() == null) | then * (new.getActive == false)) | (else if (world.isImpassable(tempXpos, tempYpos, * this.getRadius()))) | then ((world.getProjectile() == null) | then (new.getActive == * false))) * @throws IllegalStateException If the projectile can't jump the exception is thrown. |! * canJump() */ @Raw public void jump(Double timeStep) throws IllegalStateException { if (this.canJump()) { World world = this.getWorld(); double tempXpos = this.getXpos(); double tempYpos = this.getYpos(); double t = 0; while ((world.isPassable(tempXpos, tempYpos, this.getRadius()))) { tempXpos = this.jumpStep(t)[0]; tempYpos = this.jumpStep(t)[1]; Collection<Worm> collection = (world.getWorms()); for (Worm w : collection) { Worm overlappingWorm = null; double maxDistance = this.getRadius() + w.getRadius(); if (!(w == world.getCurrentWorm()) && (Math.sqrt( Math.pow(w.getXpos() - tempXpos, 2) + Math.pow(w.getYpos() - tempYpos, 2)) < maxDistance)) { overlappingWorm = w; while ((this.getActive() == true)) { overlappingWorm.setHitPoints(overlappingWorm.getHitPoints() - this.getDamage()); this.deleteProjectile(world); this.setActive(false); } } else { overlappingWorm = null; if ((isOutOfTheMap(tempXpos, tempYpos))) { this.deleteProjectile(world); this.setActive(false); } else if (((world.isImpassable(tempXpos, tempYpos, this.getRadius()))) && (this.getActive() == true)) { this.deleteProjectile(world); this.setActive(false); } } } t += timeStep; } } else { throw new IllegalStateException(); } }