Skip to content

Commit

Permalink
First stab at reading a test-scenario.ini
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanhendriks committed Aug 29, 2017
1 parent d59ea78 commit 90456df
Show file tree
Hide file tree
Showing 9 changed files with 216 additions and 14 deletions.
24 changes: 19 additions & 5 deletions src/main/java/com/fundynamic/d2tm/Game.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.fundynamic.d2tm;

import com.fundynamic.d2tm.game.entities.entitiesdata.EntitiesData;
import com.fundynamic.d2tm.game.entities.entitiesdata.EntitiesDataReader;
import com.fundynamic.d2tm.game.scenario.IniScenarioFactory;
import com.fundynamic.d2tm.game.scenario.RandomMapScenarioFactory;
import com.fundynamic.d2tm.game.scenario.Scenario;
import com.fundynamic.d2tm.game.scenario.ScenarioFactory;
Expand Down Expand Up @@ -72,11 +74,23 @@ public void initStatesList(GameContainer container) throws SlickException {
TILE_SIZE
);

ScenarioFactory scenarioFactory = new RandomMapScenarioFactory(
shroud,
terrainFactory,
new EntitiesDataReader().fromRulesIni()
);
EntitiesData entitiesData = new EntitiesDataReader().fromRulesIni();

ScenarioFactory scenarioFactory;
if (StringUtils.isEmpty(this.mapFileName)) {
scenarioFactory = new RandomMapScenarioFactory(
shroud,
terrainFactory,
entitiesData
);
} else {
scenarioFactory = new IniScenarioFactory(
shroud,
terrainFactory,
entitiesData,
mapFileName
);
}

PlayingState playingState = new PlayingState(
container,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package com.fundynamic.d2tm.game.scenario;

import com.fundynamic.d2tm.game.entities.EntityRepository;
import com.fundynamic.d2tm.game.entities.Player;
import com.fundynamic.d2tm.game.entities.entitiesdata.EntitiesData;
import com.fundynamic.d2tm.game.map.Map;
import com.fundynamic.d2tm.game.map.MapEditor;
import com.fundynamic.d2tm.game.rendering.gui.battlefield.Recolorer;
import com.fundynamic.d2tm.game.terrain.TerrainFactory;
import com.fundynamic.d2tm.game.terrain.impl.DuneTerrain;
import com.fundynamic.d2tm.game.terrain.impl.Sand;
import com.fundynamic.d2tm.graphics.Shroud;
import com.fundynamic.d2tm.math.MapCoordinate;
import com.fundynamic.d2tm.utils.StringUtils;
import org.ini4j.Ini;
import org.ini4j.Profile;
import org.newdawn.slick.SlickException;

import java.io.InputStream;

public class IniScenarioFactory extends ScenarioFactory {

private String filename;

public IniScenarioFactory(Shroud shroud, TerrainFactory terrainFactory, EntitiesData entitiesData, String filename) {
super(shroud, terrainFactory, entitiesData);
this.filename = filename;
}

@Override
public Scenario create() {
try {
InputStream resourceAsStream = getClass().getResourceAsStream("/" + filename);
if (resourceAsStream == null) throw new IllegalArgumentException("Unable to open file: " + filename);

Ini ini = new Ini(resourceAsStream);

Scenario.ScenarioBuilder builder = Scenario.builder();

Player human = readHumanPlayer(ini);
builder.withHuman(human);

Player cpu = getCpuPlayer(ini);
builder.withCpuPlayer(cpu);

Map map = readMap();
builder.withMap(map);

EntityRepository entityRepository = getEntityRepository(map);
builder.withEntityRepository(entityRepository);

Profile.Section sounds = ini.get("UNITS");
String[] strings = sounds.childrenNames();
for (String id : strings) {
Profile.Section struct = sounds.getChild(id);
/**
* MapCoordinate=1,1
Player=HUMAN
Type=QUAD
State=GUARD
*/
String playerId = struct.get("Player", String.class, "HUMAN");
Player playerToUse = human;
if ("CPU".equalsIgnoreCase(playerId)) {
playerToUse = cpu;
}

String mapCoordinate = struct.get("MapCoordinate", String.class, "");
if (StringUtils.isEmpty(mapCoordinate)) {
System.out.println("Unable to put unit " + struct + " on map, because it lacks a MapCoordinate");
continue;
}

String type = struct.get("Type", String.class, "");
if (StringUtils.isEmpty(type)) {
System.out.println("Unable to put unit " + struct + " on map, because it lacks a Type");
continue;
}

entityRepository.placeUnitOnMap(MapCoordinate.fromString(mapCoordinate), type, playerToUse);
}

return builder.build();
} catch (Exception e) {
throw new IllegalStateException("Unable to create Scenario from file: " + filename, e);
}
}

public Map readMap() throws SlickException {
Map map = new Map(shroud, 128, 128);

MapEditor mapEditor = new MapEditor(terrainFactory);
mapEditor.fillMapWithTerrain(map, DuneTerrain.TERRAIN_SAND);
return map;
}

public Player getCpuPlayer(Ini ini) {
Player cpu = new Player("CPU", Recolorer.FactionColor.RED);
Profile.Section iniHuman = ini.get("CPU");
int startingCredits = iniHuman.get("Credits", Integer.class, 2000);
cpu.setCredits(startingCredits);
return cpu;
}

public Player readHumanPlayer(Ini ini) {
Player human = new Player("Human", Recolorer.FactionColor.GREEN);
Profile.Section iniHuman = ini.get("HUMAN");
int startingCredits = iniHuman.get("Credits", Integer.class, 2000);
human.setCredits(startingCredits);
return human;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,6 @@ public Scenario create() {
}
}

public EntityRepository getEntityRepository(Map map) throws SlickException {
return new EntityRepository(
map,
new Recolorer(),
entitiesData
);
}

public Map getMap(MapEditor mapEditor) {
return mapEditor.generateRandom(shroud, 128, 128);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.fundynamic.d2tm.game.scenario;

import com.fundynamic.d2tm.game.entities.EntityRepository;
import com.fundynamic.d2tm.game.entities.entitiesdata.EntitiesData;
import com.fundynamic.d2tm.game.map.Map;
import com.fundynamic.d2tm.game.rendering.gui.battlefield.Recolorer;
import com.fundynamic.d2tm.game.terrain.TerrainFactory;
import com.fundynamic.d2tm.graphics.Shroud;
import org.newdawn.slick.SlickException;

/**
* Generates a Scenario to play
Expand All @@ -21,4 +25,11 @@ protected ScenarioFactory(Shroud shroud, TerrainFactory terrainFactory, Entities

public abstract Scenario create();

public EntityRepository getEntityRepository(Map map) throws SlickException {
return new EntityRepository(
map,
new Recolorer(),
entitiesData
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public class PlayingState extends BasicGameState {

private ImageRepository imageRepository;

public static final int HEIGHT_OF_TOP_BAR = 42;// pixels
public static final int HEIGHT_OF_TOP_BAR = 42; // pixels
public static final int HEIGHT_OF_BOTTOM_BAR = 32;
public static final int HEIGHT_OF_MINIMAP = 128;
public static final int WIDTH_OF_SIDEBAR = 160;
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/com/fundynamic/d2tm/math/MapCoordinate.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.fundynamic.d2tm.math;


import com.fundynamic.d2tm.utils.StringUtils;

import static com.fundynamic.d2tm.game.map.Cell.TILE_SIZE;

/**
Expand Down Expand Up @@ -90,4 +92,19 @@ public boolean equals(Object o) {
public String toString() {
return "MapCoordinate{" + this.getXAsInt() + "," + getYAsInt() + "}";
}

public static MapCoordinate fromString(String inputString) {
if (StringUtils.isEmpty(inputString)) return null;
String[] parts = inputString.split(",");
if (parts.length != 2) return null;

try {
int x = Integer.parseInt(parts[0]);
int y = Integer.parseInt(parts[1]);

return MapCoordinate.create(x, y);
} catch (NumberFormatException e) {
return null;
}
}
}
39 changes: 39 additions & 0 deletions src/main/resources/scenarios/test-scenario.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
[HUMAN]
Credits=5000
# focus at Constyard
MapFocus=5,5

[CPU]
Credits=4000

[UNITS]

[UNITS/1]
MapCoordinate=1,1
Player=HUMAN
Type=QUAD
State=GUARD

[UNITS/2]
MapCoordinate=1,2
Player=HUMAN
Type=TANK
State=GUARD

[UNITS/3]
MapCoordinate=1,5
Player=CPU
Type=QUAD
State=GUARD


[STRUCTURES]

[STRUCTURE/1]
Type=CONSTYARD
Player=HUMAN
MapCoordinate=5,5

[MAP]
Width=128
Height=128
11 changes: 11 additions & 0 deletions src/test/java/com/fundynamic/d2tm/math/MapCoordinateTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,15 @@ public void assertAbsoluteToMapConversion(int absoluteX, int absoluteY, float ma
Assert.assertEquals(mapCoordinate.getY(), mapCoordinateY, 0.00000000000001F);
}

@Test
public void fromString() {
Assert.assertNull(MapCoordinate.fromString(null));
Assert.assertNull(MapCoordinate.fromString(""));
Assert.assertNull(MapCoordinate.fromString("1,a"));
Assert.assertNull(MapCoordinate.fromString("a,1"));
Assert.assertNull(MapCoordinate.fromString(",1"));
Assert.assertNull(MapCoordinate.fromString("1,"));
Assert.assertEquals(MapCoordinate.create(0,0), MapCoordinate.fromString("0,0"));
}

}
5 changes: 5 additions & 0 deletions src/test/resources/test-rules.ini
Original file line number Diff line number Diff line change
Expand Up @@ -192,3 +192,8 @@ Explosion=BOOM
Refinery=true
OnPlacementSpawn=QUAD
PowerConsumption=10

[MAP]
Row=1232433243223
Row=3231231232132
ROw=3232132131231

0 comments on commit 90456df

Please sign in to comment.