package eug.specific.victoria;
import eug.shared.GenericList;
import eug.shared.GenericObject;
public class Province extends VicSpecificObject {
public Province(GenericObject o, VicScenario t) {
super(o, t);
}
public int nbPop() {
int nb = 0;
for (int i = 0; i < go.nbChild(); i++)
if (go.getChild(i).name.equals("pop"))
nb++;
return nb;
}
public int getId() {
return go.getInt("id");
}
public Population pop(int pos) {
if (pos >= nbPop())
return null;
int nb = 0;
for (int i = 0; i < go.nbChild(); i++)
if (go.getChild(i).name.equals("pop")) {
if (pos == nb)
return new Population(go.getChild(i), scenario);
else
nb++;
}
return null;
}
public void removePop(int pos){
if (pos >= nbPop())
return;
for (int i = 0; i < go.nbChild(); i++)
if (go.getChild(i).name.equals("pop")) {
if (pos == go.getChild(i).getInt("id"))
go.getChild(i).children.remove(i);
}
}
public void addPop(Population pop){
go.children.add(pop.go);
}
public VicCountry getOwner() {
int id = getId();
String sid = go.getString("id");
if (scenario.provLandType[id] == 'o')//ocean province
return null;
else {
for (int i = 0; i < scenario.numCountries(); i++) {
GenericList provs = scenario.getCountry(i).go.getList("ownedprovinces");
for (String owned : provs) {
if (owned.equals(sid))
return scenario.getCountry(i);
}
}
}
return null; //not found
}
public VicCountry getController() {
int id = getId();
String sid=go.getString("id");
if (scenario.provLandType[id] == 'o')//ocean province
return null;
else {
for (int i = 0; i < scenario.numCountries(); i++) {
GenericList provs = scenario.getCountry(i).go.getList("controlledprovinces");
for (String controlled : provs) {
if (controlled.equals(sid))
return scenario.getCountry(i);
}
}
}
return null; //not found
}
public void changeOwner(VicCountry country) {
int id = go.getInt("id");
String sid = go.getString("id");
boolean b = false;
VicCountry prevOwner = null;
for (int i = 0; i < scenario.numCountries() && !b; i++) {
GenericList provs=scenario.getCountry(i).go.getList("ownedprovinces");
for (String owned : provs) {
if (owned.equals(sid)) {
b = true;
prevOwner = scenario.getCountry(i);
break;
}
}
}
prevOwner.go.getList("ownedprovinces").delete(sid);
country.go.getList("ownedprovinces").add(sid, false);
/*
* Now the tricky part: handling states.
*
* This part will only be understandable if you are familiar
* with the way Victoria handles states and their splits between countries.
*/
int prevStatePos = prevOwner.getStatePos(scenario.provState[id]);
System.out.println("prev: "+prevStatePos);
int newStatePos = country.getStatePos(scenario.provState[id]);
System.out.println("new: "+newStatePos);
int rgopos;
if (prevStatePos == -1 && newStatePos != -1) {
//new owner has corresponding state, old one doesn't.
//we add province to new one, that's all
country.go.getChild(newStatePos).addString("province", sid);
} else if (prevStatePos != -1 && newStatePos == -1) {
//old owner has corresponding state, new one doesn't
System.out.println(scenario.provState[id]+" in "+prevOwner.getName()+
": "+prevOwner.go.getChild(prevStatePos).nbVar("province")+" provs.");
//first question: does state only have one province?
if (prevOwner.go.getChild(prevStatePos).nbVar("province") == 1) {
System.out.println("moving");
//yes: we move the state in bulk to new owner
//this include factories
country.go.addChild(prevOwner.go.getChild(prevStatePos));
prevOwner.go.removeChild(prevOwner.go.getChild(prevStatePos));
} else {
//no: does the province moved have an RGO to move?
rgopos=prevOwner.getProvRGO(prevStatePos, id);
if (rgopos != -1) {//yes
GenericObject newState = country.go.createChild("state");
newState.addString("name", scenario.provState[id], true);
newState.addString("province",sid);
b = false;
for (int i = 0; i < prevOwner.go.getChild(prevStatePos).nbVar() && !b; i++) {
if (prevOwner.go.getChild(prevStatePos).getVariable(i).varname.equals("province") &&
prevOwner.go.getChild(prevStatePos).getVariable(i).getValue().equals(sid)) {
prevOwner.go.getChild(prevStatePos).removeVariable(i);
b = true;
}
}
//moving rgo:
newState.addChild(prevOwner.go.getChild(prevStatePos).getChild(rgopos));
prevOwner.go.getChild(prevStatePos).removeChild(prevOwner.go.getChild(prevStatePos).getChild(rgopos));
}//otherwise, no need to create state
}
} else if (prevStatePos != -1 && newStatePos != -1) {
//both countries have states
System.out.println(scenario.provState[id]+" in "+prevOwner.getName()+": "+prevOwner.go.getChild(prevStatePos).nbVar("province")+" provs.");
// first question: does the state only have one province?
if (prevOwner.go.getChild(prevStatePos).nbVar("province") == 1) {
//yes: we merge it with the new country's state
System.out.println("merging");
country.go.getChild(newStatePos).addString("province",sid);
for (int i = 0; i < prevOwner.go.getChild(prevStatePos).nbChild(); i++) {
country.go.getChild(newStatePos).addChild(prevOwner.go.getChild(prevStatePos).getChild(i));
}
prevOwner.go.removeChild(prevOwner.go.getChild(prevStatePos));
} else {
//no
//taking care of the "province" tags:
country.go.getChild(newStatePos).addString("province", sid);
b = false;
for (int i = 0; i < prevOwner.go.getChild(prevStatePos).nbVar() && !b; i++) {
if (prevOwner.go.getChild(prevStatePos).getVariable(i).varname.equals("province") &&
prevOwner.go.getChild(prevStatePos).getVariable(i).getValue().equals(sid)) {
System.out.println("removing province tag");
prevOwner.go.getChild(prevStatePos).removeVariable(i);
b=true;
}
}
//moving the RGO, if it exists
rgopos=prevOwner.getProvRGO(prevStatePos, id);
if (rgopos != -1) {
//moving rgo:
country.go.getChild(newStatePos).addChild(prevOwner.go.getChild(prevStatePos).getChild(rgopos));
prevOwner.go.getChild(prevStatePos).removeChild(prevOwner.go.getChild(prevStatePos).getChild(rgopos));
}
}
}
}
public void changeController(VicCountry country) {
String sid = go.getString("id");
boolean b = false;
VicCountry prevController = null;
for (int i = 0; i < scenario.numCountries() && !b; i++) {
GenericList provs = scenario.getCountry(i).go.getList("controlledprovinces");
for (String controlled : provs) {
if (controlled.equals(sid)) {
b = true;
prevController = scenario.getCountry(i);
break;
}
}
// for (int j = 0; j < provs.size() && !b; j++) {
// if (provs.getVariable(j).equals(sid)) {
// provs.removeVariable(j);
// b = true;
// }
// }
}
if (b) {
prevController.go.getList("controlledprovinces").delete(sid);
country.go.getList("controlledprovinces").add(sid, false);
}
}
public double getTotalPop() {
double totalPop = 0.0;
for (GenericObject pop : go.getChildren("pop"))
totalPop += pop.getDouble("size");
return totalPop*100000.0;
}
}