/*
* Copyright (C) 2007 Steve Ratcliffe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License 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.
*
*
* Author: Steve Ratcliffe
* Create date: Jan 1, 2008
*/
package uk.me.parabola.imgfmt.app.lbl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import uk.me.parabola.imgfmt.app.ImgFileWriter;
import uk.me.parabola.imgfmt.app.Label;
import uk.me.parabola.imgfmt.app.trergn.Subdivision;
/**
* A highway is in a region.
*
* @author Mark Burton
*/
public class Highway {
class ExitPoint implements Comparable<ExitPoint> {
final String name;
final byte index;
final Subdivision div;
public ExitPoint(String name, byte index, Subdivision div) {
this.name = name;
this.index = index;
this.div = div;
}
public int compareTo(ExitPoint o) {
return name.compareTo(o.name);
}
}
private final int index;
private final Region region;
private final List<ExitPoint> exits = new ArrayList<ExitPoint>();
private Label label;
private int extraDataOffset; // in 3-byte records - 1 based
public Highway(Region region, int index) {
this.region = region;
this.index = index;
}
void write(ImgFileWriter writer, boolean extraData) {
if(extraData) {
writer.put((byte)0);
writer.putChar(region == null? 0 : region.getIndex());
Collections.sort(exits);
for(ExitPoint ep : exits) {
writer.put(ep.index);
writer.putChar((char)ep.div.getNumber());
}
}
else {
assert extraDataOffset != 0;
writer.put3(label.getOffset());
writer.putChar((char)extraDataOffset);
writer.put((byte)0); // unknown (setting any of 0x3f stops exits being found)
}
}
public int getIndex() {
return index;
}
public void setLabel(Label label) {
this.label = label;
}
public void setExtraDataOffset(int extraDataOffset) {
this.extraDataOffset = extraDataOffset / 3 + 1;
}
public int getExtraDataSize() {
return (1 + exits.size()) * 3;
}
public void addExitPoint(String name, int index, Subdivision div) {
exits.add(new ExitPoint(name, (byte)index, div));
}
}