/*
* Copyright (C) 2009.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 or
* version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*/
package uk.me.parabola.imgfmt.app.mdr;
import java.text.Collator;
/**
* Holds information about a city that will make its way into mdr 5.
* This class is used in several places as the information has to be gathered
* from the cities section of LBL and the points in RGN.
*
* @author Steve Ratcliffe
*/
public class Mdr5Record extends RecordBase implements NamedRecord {
/** The city index within its own map */
private int cityIndex;
/** The index across all maps */
private int globalCityIndex;
private int regionIndex;
private int lblOffset;
private int stringOffset;
private String name;
private Mdr13Record region;
private Mdr14Record country;
private int[] mdr20;
private int mdr20Index;
public int getCityIndex() {
return cityIndex;
}
public void setCityIndex(int cityIndex) {
this.cityIndex = cityIndex;
}
public int getGlobalCityIndex() {
return globalCityIndex;
}
public void setGlobalCityIndex(int globalCityIndex) {
this.globalCityIndex = globalCityIndex;
}
public int getRegionIndex() {
return regionIndex;
}
public void setRegionIndex(int regionIndex) {
this.regionIndex = regionIndex;
}
public int getLblOffset() {
return lblOffset;
}
public void setLblOffset(int lblOffset) {
this.lblOffset = lblOffset;
}
public int getStringOffset() {
return stringOffset;
}
public void setStringOffset(int stringOffset) {
this.stringOffset = stringOffset;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Mdr13Record getMdrRegion() {
return region;
}
public void setMdrRegion(Mdr13Record region) {
this.region = region;
}
public Mdr14Record getMdrCountry() {
return country;
}
public void setMdrCountry(Mdr14Record country) {
this.country = country;
}
/**
* Every mdr5 record contains the same array of values. It is only
* allowed to access the one at the index globalCityIndex. Since
* the array is shared, every record with the same global city index
* knows the correct mdr20 value, regardless of where it was set.
*
* @param mdr20 An array large enough to hold all the cities (one based index).
* This must be the same array for all mdr5records (in the same map set).
*/
public void setMdr20set(int[] mdr20) {
this.mdr20 = mdr20;
}
/**
* Set the index into the mdr20 array that we use to get/set the value.
* @see #setMdr20set(int[])
*/
public void setMdr20Index(int mdr20Index) {
this.mdr20Index = mdr20Index;
}
public int getMdr20() {
return mdr20[mdr20Index];
}
public void setMdr20(int n) {
int prev = mdr20[mdr20Index];
assert prev == 0 || prev == n : "mdr20 value changed f=" + prev + " t=" + n + " count=" + mdr20Index;
mdr20[mdr20Index] = n;
}
/**
* Is this the same city, by the rules segregating the cities in mdr5 and 20.
* @return True if in the same tile and has the same name for city/region/country.
*/
public boolean isSameByMapAndName(Collator collator, Mdr5Record other) {
if (other == null)
return false;
return getMapIndex() == other.getMapIndex() && isSameByName(collator, other);
}
/**
* Same city by the name of the city/region/country combination.
*
* @param collator Used to sort names.
* @param other The other city to compare with.
* @return True if is the same city, maybe in a different tile.
*/
public boolean isSameByName(Collator collator, Mdr5Record other) {
if (other == null)
return false;
return collator.compare(getName(), other.getName()) == 0
&& collator.compare(getRegionName(), other.getRegionName()) == 0
&& collator.compare(getCountryName(), other.getCountryName()) == 0;
}
public String toString() {
return String.format("%d: %s r=%s c=%s", globalCityIndex, name, getRegionName(), country.getName());
}
public String getRegionName() {
if (region == null)
return "";
else
return region.getName();
}
public String getCountryName() {
return country.getName();
}
}