Archived
0

add CC compute and stat to PowerPlay

This commit is contained in:
Mo
2016-11-19 16:31:17 +03:00
parent db657e9723
commit a9aabc26c4
8 changed files with 142 additions and 15 deletions

View File

@@ -17,6 +17,7 @@ import ru.trader.analysis.PowerPlayAnalyzator;
import ru.trader.core.*; import ru.trader.core.*;
import ru.trader.model.*; import ru.trader.model.*;
import ru.trader.model.support.BindingsHelper; import ru.trader.model.support.BindingsHelper;
import ru.trader.view.support.Localization;
import ru.trader.view.support.PowerStateStringConverter; import ru.trader.view.support.PowerStateStringConverter;
import ru.trader.view.support.PowerStringConverter; import ru.trader.view.support.PowerStringConverter;
import ru.trader.view.support.ViewUtils; import ru.trader.view.support.ViewUtils;
@@ -25,6 +26,7 @@ import ru.trader.view.support.autocomplete.CachedSuggestionProvider;
import ru.trader.view.support.autocomplete.SystemsProvider; import ru.trader.view.support.autocomplete.SystemsProvider;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -67,6 +69,10 @@ public class PowerPlayController {
private Label resultPopSumm; private Label resultPopSumm;
@FXML @FXML
private Label detailPopSumm; private Label detailPopSumm;
@FXML
private Label resultCCSumm;
@FXML
private Label detailCCSumm;
private MarketModel world; private MarketModel world;
private ProfileModel profile; private ProfileModel profile;
@@ -173,11 +179,15 @@ public class PowerPlayController {
}); });
tblDetail.setOnDragDetected(new StarSystemDragDetect(tblDetail)); tblDetail.setOnDragDetected(new StarSystemDragDetect(tblDetail));
NumberStringConverter converter = new NumberStringConverter("#,##0.##"); NumberStringConverter converter = new NumberStringConverter("#,##0.##");
result.addListener((InvalidationListener) i -> result.addListener((InvalidationListener) i -> {
resultPopSumm.setText(converter.toString(getPopulationSumm(result))) resultPopSumm.setText(converter.toString(getPopulationSumm(result)));
resultCCSumm.setText(getCCSummText(result));
}
); );
detail.addListener((InvalidationListener) i -> detail.addListener((InvalidationListener) i -> {
detailPopSumm.setText(converter.toString(getPopulationSumm(detail))) detailPopSumm.setText(converter.toString(getPopulationSumm(detail)));
detailCCSumm.setText(getCCSummText(detail));
}
); );
} }
@@ -185,11 +195,46 @@ public class PowerPlayController {
return collection.stream().mapToLong(ResultEntry::getPopulation).sum(); return collection.stream().mapToLong(ResultEntry::getPopulation).sum();
} }
private String getCCSummText(Collection<ResultEntry> collection){
String ccFormat = Localization.getString("powerplay.label.summcc");
String pwCCFormat = Localization.getString("powerplay.label.cc");
PowerStringConverter converter = new PowerStringConverter();
long[] contestedCc = new long[POWER.values().length];
long[] totalCc = new long[POWER.values().length];
long contested = 0;
long summCc = 0;
for (ResultEntry entry : collection) {
long cc = entry.getCc();
summCc += cc;
if (entry.getPower() == null || entry.getPowerState() == null) continue;
if (entry.getPowerState() != POWER_STATE.NONE){
contested += cc;
if (entry.getPowerState() == POWER_STATE.CONTESTED){
for (Place place : entry.getControllingSystems()){
contestedCc[place.getPower().ordinal()] += cc;
}
} else {
totalCc[entry.getPower().ordinal()] += cc;
}
}
}
StringBuilder builder = new StringBuilder();
builder.append(String.format(ccFormat, summCc, contested, summCc - contested));
for (int i = 0; i < POWER.values().length; i++) {
if (totalCc[i] > 0 || contestedCc[i] > 0){
builder.append("\n");
builder.append(String.format(pwCCFormat, converter.toString(POWER.values()[i]), totalCc[i], contestedCc[i]));
}
}
return builder.toString();
}
private void fillDetail(SystemModel detailSystem) { private void fillDetail(SystemModel detailSystem) {
final Place starSystem = ModelFabric.get(detailSystem); final Place starSystem = ModelFabric.get(detailSystem);
detail.clear(); detail.clear();
if (starSystem != null){ if (starSystem != null){
Collection<PowerPlayAnalyzator.IntersectData> controllings = analyzator.getControlling(starSystem); Collection<PowerPlayAnalyzator.IntersectData> controllings = analyzator.getControlling(starSystem);
controllings.add(new PowerPlayAnalyzator.IntersectData(starSystem));
detail.addAll(BindingsHelper.observableList(controllings, d -> new ResultEntry(d, starSystem))); detail.addAll(BindingsHelper.observableList(controllings, d -> new ResultEntry(d, starSystem)));
} }
} }
@@ -210,6 +255,7 @@ public class PowerPlayController {
result.clear(); result.clear();
if (starSystem != null){ if (starSystem != null){
Collection<PowerPlayAnalyzator.IntersectData> controllings = analyzator.getControlling(starSystem); Collection<PowerPlayAnalyzator.IntersectData> controllings = analyzator.getControlling(starSystem);
controllings.add(new PowerPlayAnalyzator.IntersectData(starSystem));
result.addAll(BindingsHelper.observableList(controllings,d -> new ResultEntry(d, starSystem))); result.addAll(BindingsHelper.observableList(controllings,d -> new ResultEntry(d, starSystem)));
} }
} }
@@ -366,6 +412,7 @@ public class PowerPlayController {
private final ReadOnlyLongProperty population; private final ReadOnlyLongProperty population;
private final ReadOnlyLongProperty upkeep; private final ReadOnlyLongProperty upkeep;
private final ReadOnlyLongProperty income; private final ReadOnlyLongProperty income;
private final ReadOnlyLongProperty cc;
public ResultEntry(PowerPlayAnalyzator.IntersectData data) { public ResultEntry(PowerPlayAnalyzator.IntersectData data) {
this(data, null); this(data, null);
@@ -383,7 +430,7 @@ public class PowerPlayController {
population = new SimpleLongProperty(data.getStarSystem().getPopulation()); population = new SimpleLongProperty(data.getStarSystem().getPopulation());
upkeep = new SimpleLongProperty(data.getStarSystem().getUpkeep()); upkeep = new SimpleLongProperty(data.getStarSystem().getUpkeep());
income = new SimpleLongProperty(data.getStarSystem().getIncome()); income = new SimpleLongProperty(data.getStarSystem().getIncome());
cc = new SimpleLongProperty(data.getStarSystem().computeCC(ModelFabric.get(profile).getCCgroups()));
} }
private String getControllingString(Collection<PowerPlayAnalyzator.ControllingData> controllings) { private String getControllingString(Collection<PowerPlayAnalyzator.ControllingData> controllings) {
@@ -461,6 +508,11 @@ public class PowerPlayController {
return intersectCount; return intersectCount;
} }
private Collection<Place> getControllingSystems(){
Place place = ModelFabric.get(starSystem);
return place != null ? place.getControllingSystems() : Collections.emptyList();
}
public ReadOnlyStringProperty controllingProperty() { public ReadOnlyStringProperty controllingProperty() {
return controlling; return controlling;
} }
@@ -488,6 +540,14 @@ public class PowerPlayController {
public ReadOnlyStringProperty nearStationsProperty() { public ReadOnlyStringProperty nearStationsProperty() {
return nearStations; return nearStations;
} }
public long getCc() {
return cc.get();
}
public ReadOnlyLongProperty ccProperty() {
return cc;
}
} }
private class StarSystemDragDetect implements EventHandler<MouseEvent> { private class StarSystemDragDetect implements EventHandler<MouseEvent> {

View File

@@ -11,6 +11,7 @@ market.economic=Economy
market.power=Power market.power=Power
market.powerState=State market.powerState=State
market.population=Population market.population=Population
market.cc=CC
#Item #Item
market.item=Commodity market.item=Commodity
@@ -283,6 +284,8 @@ powerplay.label.controlling=Controlled systems:
powerplay.label.power.systems=Systems of Power: powerplay.label.power.systems=Systems of Power:
powerplay.label.power.state=State: powerplay.label.power.state=State:
powerplay.label.populationSumm=Summ populations: powerplay.label.populationSumm=Summ populations:
powerplay.label.cc=%s: %4d CC Contested: %4d CC
powerplay.label.summcc=Summ: %6d CC Contested: %6d CC Total: %6dCC
powerplay.result.title=Analyze result powerplay.result.title=Analyze result
powerplay.column.intersecting=Intersect powerplay.column.intersecting=Intersect
powerplay.column.intersectCount=Intersect count powerplay.column.intersectCount=Intersect count

View File

@@ -11,6 +11,7 @@ market.economic=\u042D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0430
market.power=\u0421\u0438\u043B\u0430 market.power=\u0421\u0438\u043B\u0430
market.powerState=\u0421\u0442\u0430\u0442\u0443\u0441 market.powerState=\u0421\u0442\u0430\u0442\u0443\u0441
market.population=\u041D\u0430\u0441\u0435\u043B\u0435\u043D\u0438\u0435 market.population=\u041D\u0430\u0441\u0435\u043B\u0435\u043D\u0438\u0435
market.cc=\u041A\u041A
#Item #Item
market.item=\u0422\u043E\u0432\u0430\u0440 market.item=\u0422\u043E\u0432\u0430\u0440
@@ -283,6 +284,8 @@ powerplay.label.controlling=\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u04
powerplay.label.power.systems=C\u0438\u0441\u0442\u0435\u043C\u044B \u0441\u0438\u043B\u044B: powerplay.label.power.systems=C\u0438\u0441\u0442\u0435\u043C\u044B \u0441\u0438\u043B\u044B:
powerplay.label.power.state=\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435: powerplay.label.power.state=\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435:
powerplay.label.populationSumm=\u0421\u0443\u043C\u043C\u0430 \u043D\u0430\u0441\u0435\u043B\u0435\u043D\u0438\u044F: powerplay.label.populationSumm=\u0421\u0443\u043C\u043C\u0430 \u043D\u0430\u0441\u0435\u043B\u0435\u043D\u0438\u044F:
powerplay.label.cc=%s: %4d \u041A\u041A \u041E\u0441\u043F\u0430\u0440\u0438\u0432\u0430\u0435\u043C\u044B\u0445: %4d \u041A\u041A
powerplay.label.summcc=\u0421\u0443\u043C\u043C\u0430: %6d \u041A\u041A \u041E\u0441\u043F\u0430\u0440\u0438\u0432\u0430\u0435\u043C\u044B\u0445: %6d \u041A\u041A \u0418\u0442\u043E\u0433\u043E: %6d\u041A\u041A
powerplay.result.title=\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u0430\u043D\u0430\u043B\u0438\u0437\u0430 powerplay.result.title=\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u0430\u043D\u0430\u043B\u0438\u0437\u0430
powerplay.column.intersecting=\u041F\u0435\u0440\u0435\u0441\u0435\u043A\u0430\u0435\u0442\u0441\u044F \u0441 powerplay.column.intersecting=\u041F\u0435\u0440\u0435\u0441\u0435\u043A\u0430\u0435\u0442\u0441\u044F \u0441
powerplay.column.intersectCount=\u041F\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043D\u0438\u0439 powerplay.column.intersectCount=\u041F\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043D\u0438\u0439

View File

@@ -122,6 +122,9 @@
<cellFactory><DistanceCell /></cellFactory> <cellFactory><DistanceCell /></cellFactory>
<cellValueFactory><PropertyValueFactory property="distance"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="distance"/></cellValueFactory>
</TableColumn> </TableColumn>
<TableColumn prefWidth="60" text="%market.cc">
<cellValueFactory><PropertyValueFactory property="cc"/></cellValueFactory>
</TableColumn>
<TableColumn prefWidth="60" text="%market.system.income"> <TableColumn prefWidth="60" text="%market.system.income">
<cellValueFactory><PropertyValueFactory property="income"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="income"/></cellValueFactory>
</TableColumn> </TableColumn>
@@ -154,7 +157,12 @@
</ContextMenu> </ContextMenu>
</contextMenu> </contextMenu>
</TableView> </TableView>
<HBox spacing="4" padding="$summPadding"><Label text="%powerplay.label.populationSumm" /><Label fx:id="resultPopSumm" /></HBox> <ScrollPane minHeight="50">
<VBox spacing="4" padding="$summPadding">
<HBox spacing="4"><Label text="%powerplay.label.populationSumm" /><Label fx:id="resultPopSumm" /></HBox>
<HBox spacing="4"><Label fx:id="resultCCSumm" wrapText="true"/></HBox>
</VBox>
</ScrollPane>
</VBox> </VBox>
</TitledPane> </TitledPane>
</masterNode> </masterNode>
@@ -182,6 +190,9 @@
<cellFactory><TextCell><converter><FactionStringConverter /></converter></TextCell></cellFactory> <cellFactory><TextCell><converter><FactionStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="faction"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="faction"/></cellValueFactory>
</TableColumn> </TableColumn>
<TableColumn prefWidth="60" text="%market.cc">
<cellValueFactory><PropertyValueFactory property="cc"/></cellValueFactory>
</TableColumn>
<TableColumn prefWidth="60" text="%market.system.income"> <TableColumn prefWidth="60" text="%market.system.income">
<cellValueFactory><PropertyValueFactory property="income"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="income"/></cellValueFactory>
</TableColumn> </TableColumn>
@@ -207,7 +218,12 @@
</ContextMenu> </ContextMenu>
</contextMenu> </contextMenu>
</TableView> </TableView>
<HBox spacing="4" padding="$summPadding"><Label text="%powerplay.label.populationSumm" /><Label fx:id="detailPopSumm" /></HBox> <ScrollPane minHeight="50">
<VBox spacing="4" padding="$summPadding">
<HBox spacing="4"><Label text="%powerplay.label.populationSumm" /><Label fx:id="detailPopSumm" /></HBox>
<HBox spacing="4"><Label fx:id="detailCCSumm" wrapText="true"/></HBox>
</VBox>
</ScrollPane>
</VBox> </VBox>
</TitledPane> </TitledPane>
</detailNode> </detailNode>

View File

@@ -31,7 +31,7 @@ public class PowerPlayAnalyzator {
} }
public Collection<IntersectData> getControlling(Place starSystem){ public Collection<IntersectData> getControlling(Place starSystem){
Stream<Place> candidates = market.get().stream().filter(p -> p.getFaction() != FACTION.NONE); Stream<Place> candidates = market.get().stream().filter(Place::isPopulated);
return getControlling(starSystem, candidates, Market.CONTROLLING_RADIUS).collect(Collectors.toList()); return getControlling(starSystem, candidates, Market.CONTROLLING_RADIUS).collect(Collectors.toList());
} }
@@ -40,17 +40,17 @@ public class PowerPlayAnalyzator {
} }
public Collection<IntersectData> getIntersects(Place starSystem, Collection<Place> starSystems){ public Collection<IntersectData> getIntersects(Place starSystem, Collection<Place> starSystems){
Stream<Place> candidates = market.get().stream().filter(p -> p.getFaction() != FACTION.NONE); Stream<Place> candidates = market.get().stream().filter(Place::isPopulated);
return getIntersects(starSystem, candidates, starSystems, Market.CONTROLLING_RADIUS).collect(Collectors.toList()); return getIntersects(starSystem, candidates, starSystems, Market.CONTROLLING_RADIUS).collect(Collectors.toList());
} }
public Collection<IntersectData> getMaxIntersect(Collection<Place> starSystems){ public Collection<IntersectData> getMaxIntersect(Collection<Place> starSystems){
Stream<Place> candidates = market.get().stream().filter(p -> p.getFaction() != FACTION.NONE); Stream<Place> candidates = market.get().stream().filter(Place::isPopulated);
return getMaxIntersect(candidates, starSystems, Market.CONTROLLING_RADIUS).collect(Collectors.toList()); return getMaxIntersect(candidates, starSystems, Market.CONTROLLING_RADIUS).collect(Collectors.toList());
} }
public Collection<IntersectData> getNear(Collection<Place> starSystems){ public Collection<IntersectData> getNear(Collection<Place> starSystems){
Stream<Place> candidates = market.get().stream().filter(p -> p.getFaction() != FACTION.NONE); Stream<Place> candidates = market.get().stream().filter(Place::isPopulated);
return getNear(candidates, starSystems, Market.CONTROLLING_RADIUS, Market.CONTROLLING_RADIUS * 2).collect(Collectors.toList()); return getNear(candidates, starSystems, Market.CONTROLLING_RADIUS, Market.CONTROLLING_RADIUS * 2).collect(Collectors.toList());
} }

View File

@@ -97,4 +97,20 @@ public interface Place extends Connectable<Place> {
default Vendor asTransit(){ default Vendor asTransit(){
return new TransitVendor(this); return new TransitVendor(this);
} }
default boolean isPopulated(){
return getPopulation() > 0;
}
default long computeCC(long[] CCgroups){
long population = getPopulation();
if (population == 0) return 0;
for (int i = 0; i < CCgroups.length; i++) {
long minPop = CCgroups[i];
if (population < minPop){
return i+1;
}
}
return CCgroups.length+1;
}
} }

View File

@@ -3,7 +3,7 @@ package ru.trader.core;
import java.util.Properties; import java.util.Properties;
public class Profile { public class Profile {
public static enum PATH_PRIORITY {FAST, ECO} public enum PATH_PRIORITY {FAST, ECO}
private String name; private String name;
private double balance; private double balance;
@@ -25,6 +25,7 @@ public class Profile {
private double rechargeTime; private double rechargeTime;
private double fuelPrice; private double fuelPrice;
private PATH_PRIORITY pathPriority; private PATH_PRIORITY pathPriority;
private long[] CCgroups;
public Profile(Ship ship) { public Profile(Ship ship) {
this.ship = ship; this.ship = ship;
@@ -41,6 +42,7 @@ public class Profile {
jumpTime = 32; jumpTime = 32;
rechargeTime = 12; rechargeTime = 12;
pathPriority = PATH_PRIORITY.FAST; pathPriority = PATH_PRIORITY.FAST;
CCgroups = new long[]{0,0,0,3_000,30_000,300_000,3_000_000,30_000_000,300_000_000,3_000_000_000L};
} }
protected Profile(Profile profile){ protected Profile(Profile profile){
@@ -63,6 +65,7 @@ public class Profile {
this.system = profile.system; this.system = profile.system;
this.station = profile.station; this.station = profile.station;
this.ship = Ship.clone(profile.ship); this.ship = Ship.clone(profile.ship);
this.CCgroups = profile.CCgroups;
} }
public String getName() { public String getName() {
@@ -217,6 +220,14 @@ public class Profile {
this.pathPriority = pathPriority; this.pathPriority = pathPriority;
} }
public long[] getCCgroups() {
return CCgroups;
}
public void setCCgroups(long[] CCgroups) {
this.CCgroups = CCgroups;
}
public static Profile readFrom(Properties values, Market market){ public static Profile readFrom(Properties values, Market market){
Ship ship = Ship.readFrom(values); Ship ship = Ship.readFrom(values);
Profile profile = new Profile(ship); Profile profile = new Profile(ship);
@@ -249,6 +260,15 @@ public class Profile {
profile.setTakeoffTime(Double.valueOf(values.getProperty("profile.search.times.takeoff", "40"))); profile.setTakeoffTime(Double.valueOf(values.getProperty("profile.search.times.takeoff", "40")));
profile.setJumpTime(Double.valueOf(values.getProperty("profile.search.times.jump", "32"))); profile.setJumpTime(Double.valueOf(values.getProperty("profile.search.times.jump", "32")));
profile.setRechargeTime(Double.valueOf(values.getProperty("profile.search.times.recharge", "12"))); profile.setRechargeTime(Double.valueOf(values.getProperty("profile.search.times.recharge", "12")));
v = values.getProperty("profile.powerplay.cc", null);
if (v != null){
String[] strings = v.split(",");
long[] cc = new long[strings.length];
for (int i = 0; i < strings.length; i++) {
cc[i] = Long.valueOf(strings[i]);
}
profile.setCCgroups(cc);
}
return profile; return profile;
} }
@@ -270,6 +290,12 @@ public class Profile {
values.setProperty("profile.search.times.takeoff", String.valueOf(takeoffTime)); values.setProperty("profile.search.times.takeoff", String.valueOf(takeoffTime));
values.setProperty("profile.search.times.jump", String.valueOf(jumpTime)); values.setProperty("profile.search.times.jump", String.valueOf(jumpTime));
values.setProperty("profile.search.times.recharge", String.valueOf(rechargeTime)); values.setProperty("profile.search.times.recharge", String.valueOf(rechargeTime));
StringBuilder builder = new StringBuilder();
for (long cc : CCgroups) {
if (builder.length() > 0) builder.append(",");
builder.append(cc);
}
values.setProperty("profile.powerplay.cc", builder.toString());
ship.writeTo(values); ship.writeTo(values);
} }

View File

@@ -4,7 +4,10 @@ import au.com.bytecode.opencsv.CSVParser;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.core.*; import ru.trader.core.Market;
import ru.trader.core.POWER;
import ru.trader.core.POWER_STATE;
import ru.trader.core.Place;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
@@ -165,7 +168,7 @@ public class PPParser {
private void updatePowerState(){ private void updatePowerState(){
if (controllingSystems.isEmpty()) return; if (controllingSystems.isEmpty()) return;
for (Place starSystem : market.get()) { for (Place starSystem : market.get()) {
if (starSystem.getFaction() == FACTION.NONE) continue; if (!starSystem.isPopulated()) continue;
if (starSystem.getPowerState() != POWER_STATE.HEADQUARTERS){ if (starSystem.getPowerState() != POWER_STATE.HEADQUARTERS){
starSystem.setPower(POWER.NONE, POWER_STATE.NONE); starSystem.setPower(POWER.NONE, POWER_STATE.NONE);
} }