Rev 1650 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* 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
));
}
}