Confirmed.
This is an EngineMod issue.
For some reason the "ShipGeneric" class shipped with EngineMod does not use latest code from Angels High Service Pack.
In particular, the marked code section (see comments) is missing apparently from the Classes' "LoadPath" method:
private void LoadPath(SectFile sectfile, String s) {
int i = sectfile.sectionIndex(s);
if (i < 0) {
throw new ActorException("Ship path: Section [" + s + "] not found");
}
int j = sectfile.vars(i);
if (j < 1) {
throw new ActorException("Ship path must contain at least 2 nodes");
}
this.path = new ArrayList();
for (int k = 0; k < j; k++) {
StringTokenizer stringtokenizer = new StringTokenizer(sectfile.line(i, k));
float f1 = Float.valueOf(stringtokenizer.nextToken()).floatValue();
float f2 = Float.valueOf(stringtokenizer.nextToken()).floatValue();
// TODO: By SAS~Storebror - ATTENTION: f4 is unused, but the Token index still must be pushed forward!
// float f4 = Float.valueOf(stringtokenizer.nextToken()).floatValue();
stringtokenizer.nextToken();
// ---
double d = 0.0D;
float f7 = 0.0F;
if (stringtokenizer.hasMoreTokens()) {
d = Double.valueOf(stringtokenizer.nextToken()).doubleValue();
if (stringtokenizer.hasMoreTokens()) {
Double.valueOf(stringtokenizer.nextToken()).doubleValue();
if (stringtokenizer.hasMoreTokens()) {
f7 = Float.valueOf(stringtokenizer.nextToken()).floatValue();
}
}
}
if (k >= (j - 1)) {
d = 1.0D;
}
Segment segment7 = new Segment();
segment7.posIn = new Point3d(f1, f2, 0.0D);
if (Math.abs(d) < 0.10000000000000001D) {
segment7.timeIn = 0L;
} else {
segment7.timeIn = (long) ((d * 60D * 1000D) + (d <= 0.0D ? -0.5D : 0.5D));
}
if ((f7 <= 0.0F) && ((k == 0) || (k == (j - 1)) || (segment7.timeIn == 0L))) {
f7 = this.prop.SPEED;
}
segment7.speedIn = f7;
this.path.add(segment7);
}
for (int l = 0; l < (this.path.size() - 1); l++) {
Segment segment = (Segment) this.path.get(l);
Segment segment1 = (Segment) this.path.get(l + 1);
if ((segment.timeIn > 0L) && (segment1.timeIn > 0L)) {
Segment segment2 = new Segment();
segment2.posIn = new Point3d(segment.posIn);
segment2.posIn.add(segment1.posIn);
segment2.posIn.scale(0.5D);
segment2.timeIn = 0L;
segment2.speedIn = (segment.speedIn + segment1.speedIn) * 0.5F;
this.path.add(l + 1, segment2);
}
}
int i1 = 0;
float f = ((Segment) this.path.get(i1)).length;
int j1;
for (; i1 < (this.path.size() - 1); i1 = j1) {
j1 = i1 + 1;
do {
Segment segment3 = (Segment) this.path.get(j1);
if (segment3.speedIn > 0.0D) {
break;
}
f += segment3.length;
j1++;
} while (true);
if ((j1 - i1) <= 1) {
continue;
}
float f3 = ((Segment) this.path.get(i1)).length;
float f5 = ((Segment) this.path.get(i1)).speedIn;
float f6 = ((Segment) this.path.get(j1)).speedIn;
for (int i2 = i1 + 1; i2 < j1; i2++) {
Segment segment6 = (Segment) this.path.get(i2);
float f9 = f3 / f;
segment6.speedIn = (f5 * (1.0F - f9)) + (f6 * f9);
f += segment6.length;
}
}
long l1 = 0L;
for (int k1 = 0; k1 < (this.path.size() - 1); k1++) {
Segment segment4 = (Segment) this.path.get(k1);
Segment segment5 = (Segment) this.path.get(k1 + 1);
if (k1 == 0) {
l1 = segment4.timeIn;
}
segment4.posOut = new Point3d(segment5.posIn);
segment5.posIn = segment4.posOut;
segment4.length = (float) segment4.posIn.distance(segment5.posIn);
float f8 = segment4.speedIn;
float f10 = segment5.speedIn;
float f11 = (f8 + f10) * 0.5F;
if (segment4.timeIn > 0L) {
if (segment4.timeIn > l1) {
segment4.timeIn -= l1;
} else {
segment4.timeIn = 0L;
}
}
if ((segment4.timeIn == 0L) && (segment5.timeIn > 0L)) {
int j2 = (int) ((((2.0F * segment4.length) / f8) * 1000F) + 0.5F);
j2 = (int) (j2 + l1);
if (segment5.timeIn > j2) {
segment5.timeIn -= j2;
} else {
segment5.timeIn = 0L;
}
}
if (segment4.timeIn > 0L) {
segment4.speedIn = 0.0F;
segment4.speedOut = f10;
float f12 = (((2.0F * segment4.length) / f10) * 1000F) + 0.5F;
segment4.timeIn = l1 + segment4.timeIn;
segment4.timeOut = segment4.timeIn + (int) f12;
l1 = segment4.timeOut;
continue;
}
if (segment5.timeIn > 0L) {
segment4.speedIn = f8;
segment4.speedOut = 0.0F;
float f13 = (((2.0F * segment4.length) / f8) * 1000F) + 0.5F;
segment4.timeIn = l1 + segment4.timeIn;
segment4.timeOut = segment4.timeIn + (int) f13;
l1 = segment4.timeOut + segment5.timeIn;
} else {
segment4.speedIn = f8;
segment4.speedOut = f10;
float f14 = ((segment4.length / f11) * 1000F) + 0.5F;
segment4.timeIn = l1;
segment4.timeOut = segment4.timeIn + (int) f14;
l1 = segment4.timeOut;
}
}
this.path.remove(this.path.size() - 1);
}
This has to be fixed in EngineMod, latest correct sources for this class have been available on our SVN Repo for months.
Interestingly, "BigshipGeneric" class seems fine.
Cheers!
Mike