-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
F Introduce TankBattleApplication which contains the main logic battl…
…e with tanks #1
- Loading branch information
DStalder
authored and
Dominic
committed
Aug 13, 2020
1 parent
c47a2ac
commit a07721a
Showing
10 changed files
with
941 additions
and
877 deletions.
There are no files selected for viewing
39 changes: 39 additions & 0 deletions
39
moveable-impl/src/com/myownb3/piranha/application/battle/TankBattleApplication.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package com.myownb3.piranha.application.battle; | ||
|
||
import java.util.List; | ||
|
||
import com.myownb3.piranha.core.battle.weapon.tank.Tank; | ||
import com.myownb3.piranha.core.battle.weapon.tank.TankGridElement; | ||
import com.myownb3.piranha.core.battle.weapon.turret.Turret; | ||
import com.myownb3.piranha.core.battle.weapon.turret.TurretGridElement; | ||
import com.myownb3.piranha.core.grid.gridelement.GridElement; | ||
|
||
/** | ||
* The {@link BattleApplication} defines a runnable application for battles using {@link Tank}s {@link Turret}s and so on | ||
* | ||
* @author DStalder | ||
* | ||
*/ | ||
public interface TankBattleApplication { | ||
|
||
/** | ||
* Starts this {@link TankBattleApplication} Application | ||
*/ | ||
public void run(); | ||
|
||
/** | ||
* @return all the {@link GridElement} which take part in this {@link BattleApplication} | ||
*/ | ||
List<GridElement> getAllGridElements(); | ||
|
||
/** | ||
* @return all {@link TankGridElement} of this {@link TankBattleApplication} | ||
*/ | ||
List<TankGridElement> getTankGridElements(); | ||
|
||
/** | ||
* @return all {@link TurretGridElement} of this {@link TankBattleApplication} | ||
*/ | ||
List<TurretGridElement> getTurretGridElements(); | ||
|
||
} |
270 changes: 270 additions & 0 deletions
270
moveable-impl/src/com/myownb3/piranha/application/battle/impl/TankBattleApplicationImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,270 @@ | ||
package com.myownb3.piranha.application.battle.impl; | ||
|
||
import static java.util.Objects.requireNonNull; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
import com.myownb3.piranha.application.battle.TankBattleApplication; | ||
import com.myownb3.piranha.audio.impl.AudioClipImpl.AudioClipBuilder; | ||
import com.myownb3.piranha.core.battle.weapon.tank.Tank; | ||
import com.myownb3.piranha.core.battle.weapon.tank.TankGridElement; | ||
import com.myownb3.piranha.core.battle.weapon.tank.TankGridElement.TankGridElementBuilder; | ||
import com.myownb3.piranha.core.battle.weapon.tank.TankHolder; | ||
import com.myownb3.piranha.core.battle.weapon.tank.TankImpl.TankBuilder; | ||
import com.myownb3.piranha.core.battle.weapon.tank.detector.TankDetectorImpl.TankDetectorBuilder; | ||
import com.myownb3.piranha.core.battle.weapon.tank.engine.TankEngineImpl.TankEngineBuilder; | ||
import com.myownb3.piranha.core.battle.weapon.tank.strategy.TankStrategy; | ||
import com.myownb3.piranha.core.battle.weapon.turret.Turret; | ||
import com.myownb3.piranha.core.battle.weapon.turret.TurretGridElement; | ||
import com.myownb3.piranha.core.battle.weapon.turret.TurretGridElement.TurretGridElementBuilder; | ||
import com.myownb3.piranha.core.battle.weapon.turret.cluster.TurretClusterImpl.TurretClusterBuilder; | ||
import com.myownb3.piranha.core.detector.DetectorImpl.DetectorBuilder; | ||
import com.myownb3.piranha.core.detector.cluster.tripple.TrippleDetectorClusterImpl.TrippleDetectorClusterBuilder; | ||
import com.myownb3.piranha.core.detector.strategy.DetectingStrategy; | ||
import com.myownb3.piranha.core.grid.Grid; | ||
import com.myownb3.piranha.core.grid.gridelement.GridElement; | ||
import com.myownb3.piranha.core.grid.gridelement.constants.GridElementConst; | ||
import com.myownb3.piranha.core.grid.gridelement.shape.rectangle.Orientation; | ||
import com.myownb3.piranha.core.grid.gridelement.shape.rectangle.RectangleImpl.RectangleBuilder; | ||
import com.myownb3.piranha.core.grid.position.EndPosition; | ||
import com.myownb3.piranha.core.grid.position.Position; | ||
import com.myownb3.piranha.core.moveables.controller.MoveableController.MoveableControllerBuilder; | ||
import com.myownb3.piranha.core.moveables.controller.MovingStrategy; | ||
import com.myownb3.piranha.core.moveables.engine.audio.EngineAudio.EngineAudioBuilder; | ||
import com.myownb3.piranha.core.statemachine.EvasionStateMachineConfig; | ||
import com.myownb3.piranha.core.statemachine.impl.EvasionStateMachineImpl.EvasionStateMachineBuilder; | ||
|
||
public class TankBattleApplicationImpl implements TankBattleApplication { | ||
|
||
private List<TankGridElement> tankGridElements; | ||
private List<TurretGridElement> turretGridElements; | ||
private List<GridElement> allGridElements; | ||
|
||
public TankBattleApplicationImpl(List<TankGridElement> tankGridElements, List<TurretGridElement> turretGridElements) { | ||
this.tankGridElements = tankGridElements; | ||
this.turretGridElements = turretGridElements; | ||
} | ||
|
||
@Override | ||
public void run() {} | ||
|
||
@Override | ||
public List<GridElement> getAllGridElements() { | ||
return allGridElements; | ||
} | ||
|
||
@Override | ||
public List<TankGridElement> getTankGridElements() { | ||
return tankGridElements; | ||
} | ||
|
||
@Override | ||
public List<TurretGridElement> getTurretGridElements() { | ||
return turretGridElements; | ||
} | ||
|
||
public static class TankBattleApplicationTankBuilder { | ||
|
||
private List<Turret> turrets; | ||
private Grid grid; | ||
|
||
private List<EndPosition> endPositions; | ||
private Position tankPos; | ||
private double tankHeight; | ||
private double tankWidth; | ||
private TankStrategy tankStrategy; | ||
private String tankEngineAudioResource; | ||
private EvasionStateMachineConfig evasionStateMachineConfig; | ||
private double tankTurretHeight; | ||
private Tank tank; | ||
|
||
private TankBattleApplicationTankBuilder() { | ||
this.turrets = new ArrayList<>(); | ||
} | ||
|
||
public TankBattleApplicationTankBuilder withGrid(Grid grid) { | ||
this.grid = grid; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder withEndPositions(List<EndPosition> endPositions) { | ||
this.endPositions = endPositions; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder withTankHeight(double tankHeight) { | ||
this.tankHeight = tankHeight; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder withTankTurretHeight(double tankTurretHeight) { | ||
this.tankTurretHeight = tankTurretHeight; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder withTankWidth(double tankWidth) { | ||
this.tankWidth = tankWidth; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder withTankPos(Position tankPos) { | ||
this.tankPos = tankPos; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder withTankStrategy(TankStrategy tankStrategy) { | ||
this.tankStrategy = tankStrategy; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder withTankEngineAudioResource(String tankEngineAudioResource) { | ||
this.tankEngineAudioResource = tankEngineAudioResource; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder withEvasionStateMachine(EvasionStateMachineConfig evasionStateMachineConfig) { | ||
this.evasionStateMachineConfig = evasionStateMachineConfig; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder addTurret(Turret turret) { | ||
this.turrets.add(turret); | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationTankBuilder build(TankHolder tankHolder) { | ||
this.tank = TankBuilder.builder() | ||
.withTankEngine(TankEngineBuilder.builder() | ||
.withVelocity(12) | ||
.withDefaultEngineStateHandler() | ||
.withEngineAudio(EngineAudioBuilder.builder() | ||
.withDefaultAudio() | ||
.withEngineMoveAudio(AudioClipBuilder.builder() | ||
.withRestartRunningAudio(false) | ||
.withAudioResource(tankEngineAudioResource) | ||
.build()) | ||
.build()) | ||
.withMoveableController(MoveableControllerBuilder.builder() | ||
.withStrategie(MovingStrategy.FORWARD_INCREMENTAL) | ||
.withEndPositions(endPositions) | ||
.withLazyMoveable(() -> tankHolder.getTankGridElement()) | ||
.build()) | ||
.build()) | ||
.withTankDetector(TankDetectorBuilder.builder() | ||
.withTankGridElement(() -> tankHolder.getTankGridElement()) | ||
.withGrid(grid) | ||
.withDetector(TrippleDetectorClusterBuilder.builder() | ||
.withCenterDetector(DetectorBuilder.builder() | ||
.withAngleInc(1) | ||
.withDetectorAngle(90) | ||
.withDetectorReach(400) | ||
.withEvasionAngle(90) | ||
.withEvasionDistance(400) | ||
.build()) | ||
.withLeftSideDetector(DetectorBuilder.builder() | ||
.withAngleInc(1) | ||
.withDetectorAngle(90) | ||
.withDetectorReach(400) | ||
.withEvasionAngle(90) | ||
.withEvasionDistance(400) | ||
.build(), 90) | ||
.withRightSideDetector(DetectorBuilder.builder() | ||
.withAngleInc(1) | ||
.withDetectorAngle(90) | ||
.withDetectorReach(400) | ||
.withEvasionAngle(90) | ||
.withEvasionDistance(400) | ||
.build(), 90) | ||
.withStrategy(DetectingStrategy.SUPPORTIVE_FLANKS_WITH_DETECTION) | ||
.withAutoDetectionStrategyHandler() | ||
.build()) | ||
.build()) | ||
.withTurret(getTankTurret()) | ||
.withHull(RectangleBuilder.builder() | ||
.withCenter(tankPos) | ||
.withHeight(tankHeight) | ||
.withWidth(tankWidth) | ||
.withOrientation(Orientation.HORIZONTAL) | ||
.build()) | ||
.withTankStrategy(tankStrategy) | ||
.build(); | ||
return this; | ||
} | ||
|
||
private Turret getTankTurret() { | ||
if (turrets.size() == 1) { | ||
return turrets.get(0); | ||
} | ||
return buildTurretClusterBuilder(); | ||
} | ||
|
||
private Turret buildTurretClusterBuilder() { | ||
TurretClusterBuilder turretClusterBuilder = TurretClusterBuilder.builder() | ||
.withPosition(tankPos); | ||
for (Turret turret : turrets) { | ||
turretClusterBuilder.addTurret(turret); | ||
} | ||
return turretClusterBuilder.build(); | ||
} | ||
|
||
public static TankBattleApplicationTankBuilder builder() { | ||
return new TankBattleApplicationTankBuilder(); | ||
} | ||
} | ||
|
||
public static class TankBattleApplicationBuilder { | ||
private List<TankGridElement> tankGridElements; | ||
private List<TurretGridElement> turretGridElements; | ||
private Grid grid; | ||
|
||
private TankBattleApplicationBuilder() { | ||
this.tankGridElements = new ArrayList<>(); | ||
this.turretGridElements = new ArrayList<>(); | ||
} | ||
|
||
public TankBattleApplicationImpl build() { | ||
return new TankBattleApplicationImpl(tankGridElements, turretGridElements); | ||
} | ||
|
||
public static TankBattleApplicationBuilder builder() { | ||
return new TankBattleApplicationBuilder(); | ||
} | ||
|
||
public TankBattleApplicationBuilder withGrid(Grid grid) { | ||
this.grid = grid; | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationBuilder addTurretGridElement(Turret turret) { | ||
turretGridElements.add(TurretGridElementBuilder.builder() | ||
.withGrid(grid) | ||
.withHeightFromBottom(GridElementConst.DEFAULT_HEIGHT_FROM_BOTTOM) | ||
.withTurret(turret) | ||
.build()); | ||
return this; | ||
} | ||
|
||
public TankBattleApplicationBuilder addTankGridElement(TankHolder tankHolder, | ||
TankBattleApplicationTankBuilder tankBattleApplicationTankBuilder) { | ||
requireNonNull(grid); | ||
TankGridElement tankGridElement = TankGridElementBuilder.builder() | ||
.withGrid(grid) | ||
.withEngineVelocity(12) | ||
.withTankheightFromBottom(tankBattleApplicationTankBuilder.tankTurretHeight) | ||
.withTurretHeightFromBottom(tankBattleApplicationTankBuilder.tankTurretHeight) | ||
.withEvasionStateMachine(EvasionStateMachineBuilder.builder() | ||
.withGrid(grid) | ||
.withDetector(DetectorBuilder.builder() | ||
.build()) | ||
.withEvasionStateMachineConfig(tankBattleApplicationTankBuilder.evasionStateMachineConfig) | ||
.build()) | ||
.withTank(tankBattleApplicationTankBuilder.tank) | ||
.build(); | ||
tankGridElements.add(tankGridElement); | ||
tankHolder.setAndReturnTank(tankGridElement); | ||
tankHolder.setTankGridElement(tankGridElement); | ||
return this; | ||
} | ||
} | ||
} |
Oops, something went wrong.