aboutsummaryrefslogtreecommitdiffstats
path: root/src/jake2/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/jake2/util')
-rw-r--r--src/jake2/util/Lib.java83
-rw-r--r--src/jake2/util/Math3D.java105
-rw-r--r--src/jake2/util/QuakeFile.java314
3 files changed, 202 insertions, 300 deletions
diff --git a/src/jake2/util/Lib.java b/src/jake2/util/Lib.java
index e0d1791..ab3a40e 100644
--- a/src/jake2/util/Lib.java
+++ b/src/jake2/util/Lib.java
@@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// Created on 09.12.2003 by RST.
-// $Id: Lib.java,v 1.5 2004-07-23 10:09:55 hzi Exp $
+// $Id: Lib.java,v 1.6 2004-09-22 19:22:13 salomo Exp $
package jake2.util;
@@ -48,11 +48,9 @@ public class Lib {
public static String vtos(float[] v) {
return (int) v[0] + " " + (int) v[1] + " " + (int) v[2];
}
-
public static String vtofs(float[] v) {
return v[0] + " " + v[1] + " " + v[2];
}
-
public static String vtofsbeaty(float[] v) {
return Com.sprintf("%8.2f %8.2f %8.2f", new Vargs().add(v[0]).add(v[1]).add(v[2]));
}
@@ -70,33 +68,28 @@ public class Lib {
public static float crand() {
return (Globals.rnd.nextFloat() - 0.5f) * 2.0f;
}
-
public static int strcmp(String in1, String in2) {
return in1.compareTo(in2);
}
-
public static boolean strstr(String i1, String i2) {
return (i1.indexOf(i2) != -1);
}
-
public static float atof(String in) {
float res = 0;
-
+
try {
res = Float.parseFloat(in);
}
catch (Exception e) {
}
-
+
return res;
}
-
public static int Q_stricmp(String in1, String in2) {
return in1.compareToIgnoreCase(in2);
}
-
// =================================================================================
-
+
public static int atoi(String in) {
try {
return Integer.parseInt(in);
@@ -105,51 +98,45 @@ public class Lib {
return 0;
}
}
-
public static float[] atov(String v) {
float[] res = { 0, 0, 0 };
-
+
int i1 = v.indexOf(" ");
int i2 = v.indexOf(" ", i1 + 1);
-
+
res[0] = atof(v.substring(0, i1));
res[1] = atof(v.substring(i1 + 1, i2));
res[2] = atof(v.substring(i2 + 1, v.length()));
-
+
return res;
}
-
public static int strlen(char in[]) {
for (int i = 0; i < in.length; i++)
if (in[i] == 0)
return i;
return in.length;
}
-
public static int strlen(byte in[]) {
for (int i = 0; i < in.length; i++)
if (in[i] == 0)
return i;
return in.length;
}
-
static byte[] buffer = new byte[Defines.MAX_INFO_STRING];
public static String readString(ByteBuffer bb, int len) {
bb.get(buffer, 0, len);
return new String(buffer, 0, len);
}
-
public static String hexdumpfile(ByteBuffer bb, int len) throws IOException {
-
+
ByteBuffer bb1 = bb.slice();
-
+
byte buf[] = new byte[len];
-
+
bb1.get(buf);
-
+
return hexDump(buf, len, false);
}
-
// dump data as hexstring
public static String hexDump(byte data1[], int len, boolean showAddress) {
StringBuffer result = new StringBuffer();
@@ -164,13 +151,13 @@ public class Lib {
}
}
int v = data1[i];
-
+
result.append(hex2(v));
result.append(" ");
-
+
charfield.append(readableChar(v));
i++;
-
+
// nach dem letzten, newline einfuegen
if ((i & 0xf) == 0) {
result.append(charfield);
@@ -184,41 +171,35 @@ public class Lib {
}
return result.toString();
}
-
//formats an hex byte
public static String hex2(int i) {
String val = Integer.toHexString(i & 0xff);
return ("00".substring(0, 2 - val.length()) + val).toUpperCase();
}
-
public static char readableChar(int i) {
if ((i < 0x20) || (i > 0x7f))
return '.';
else
return (char) i;
}
-
public static void printv(String in, float arr[]) {
for (int n = 0; n < arr.length; n++) {
Com.Println(in + "[" + n + "]: " + arr[n]);
}
}
-
static final byte nullfiller[] = new byte[8192];
-
public static void fwriteString(String s, int len, RandomAccessFile f) throws IOException {
if (s == null)
return;
int diff = len - s.length();
if (diff > 0) {
f.write(s.getBytes());
-
+
f.write(nullfiller, 0, diff);
}
else
f.write(s.getBytes(), 0, len);
}
-
public static RandomAccessFile fopen(String name, String mode) {
try {
return new RandomAccessFile(name, mode);
@@ -228,7 +209,6 @@ public class Lib {
return null;
}
}
-
public static void fclose(RandomAccessFile f) {
try {
f.close();
@@ -236,14 +216,12 @@ public class Lib {
catch (Exception e) {
}
}
-
public static String freadString(RandomAccessFile f, int len) {
byte buffer[] = new byte[len];
FS.Read(buffer, len, f);
-
+
return new String(buffer).trim();
}
-
public static String rightFrom(String in, char c) {
int pos = in.lastIndexOf(c);
if (pos == -1)
@@ -252,7 +230,6 @@ public class Lib {
return in.substring(pos + 1, in.length());
return "";
}
-
public static String leftFrom(String in, char c) {
int pos = in.lastIndexOf(c);
if (pos == -1)
@@ -261,25 +238,23 @@ public class Lib {
return in.substring(0, pos);
return "";
}
-
public static String[] linesplit(String in) {
-
+
StringTokenizer tk = new StringTokenizer(in, "\r\n");
-
+
int count = tk.countTokens();
if (count == 0)
return new String[] {
};
-
+
String result[] = new String[count];
-
+
for (int i = 0; tk.hasMoreTokens(); i++) {
result[i] = tk.nextToken();
}
-
+
return result;
}
-
public static int rename(String oldn, String newn) {
try {
File f1 = new File(oldn);
@@ -291,7 +266,6 @@ public class Lib {
return 1;
}
}
-
public static byte[] getIntBytes(int c) {
byte b[] = new byte[4];
b[0] = (byte) ((c & 0xff));
@@ -300,57 +274,48 @@ public class Lib {
b[3] = (byte) ((c >>> 24) & 0xff);
return b;
}
-
public static int getInt(byte b[]) {
return (b[0] & 0xff) | ((b[1] & 0xff) << 8) | ((b[2] & 0xff) << 16) | ((b[3] & 0xff) << 24);
}
-
public static float[] clone(float in[]) {
float out[] = new float[in.length];
-
+
if (in.length != 0)
System.arraycopy(in, 0, out, 0, in.length);
-
+
return out;
}
-
+
/*
* java.nio.* Buffer util functions
*/
public static final int SIZEOF_FLOAT = BufferUtils.SIZEOF_FLOAT;
public static final int SIZEOF_INT = BufferUtils.SIZEOF_INT;
-
public static FloatBuffer newFloatBuffer(int numElements) {
ByteBuffer bb = newByteBuffer(numElements * SIZEOF_FLOAT);
return bb.asFloatBuffer();
}
-
public static FloatBuffer newFloatBuffer(int numElements, ByteOrder order) {
ByteBuffer bb = newByteBuffer(numElements * SIZEOF_FLOAT, order);
return bb.asFloatBuffer();
}
-
public static IntBuffer newIntBuffer(int numElements) {
ByteBuffer bb = newByteBuffer(numElements * SIZEOF_INT);
return bb.asIntBuffer();
}
-
public static IntBuffer newIntBuffer(int numElements, ByteOrder order) {
ByteBuffer bb = newByteBuffer(numElements * SIZEOF_INT, order);
return bb.asIntBuffer();
}
-
public static ByteBuffer newByteBuffer(int numElements) {
ByteBuffer bb = ByteBuffer.allocateDirect(numElements);
bb.order(ByteOrder.nativeOrder());
return bb;
}
-
public static ByteBuffer newByteBuffer(int numElements, ByteOrder order) {
ByteBuffer bb = ByteBuffer.allocateDirect(numElements);
bb.order(order);
return bb;
}
-
}
diff --git a/src/jake2/util/Math3D.java b/src/jake2/util/Math3D.java
index 5c1f2eb..fc94614 100644
--- a/src/jake2/util/Math3D.java
+++ b/src/jake2/util/Math3D.java
@@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// Created on 09.12.2003 by RST.
-// $Id: Math3D.java,v 1.6 2004-09-10 19:02:56 salomo Exp $
+// $Id: Math3D.java,v 1.7 2004-09-22 19:22:13 salomo Exp $
package jake2.util;
@@ -27,60 +27,50 @@ import jake2.Defines;
import jake2.game.cplane_t;
import jake2.qcommon.Com;
-public class Math3D extends Lib {
-
+public class Math3D {
+
static final float shortratio = 360.0f / 65536.0f;
- static final float piratio = (float)(Math.PI / 360.0);
-
+ static final float piratio = (float) (Math.PI / 360.0);
public static void set(float v1[], float v2[]) {
v1[0] = v2[0];
v1[1] = v2[1];
v1[2] = v2[2];
}
-
-
public static void VectorSubtract(float[] a, float[] b, float[] c) {
c[0] = a[0] - b[0];
c[1] = a[1] - b[1];
c[2] = a[2] - b[2];
}
-
public static void VectorSubtract(short[] a, short[] b, int[] c) {
c[0] = a[0] - b[0];
c[1] = a[1] - b[1];
c[2] = a[2] - b[2];
}
-
public static void VectorAdd(float[] a, float[] b, float[] to) {
to[0] = a[0] + b[0];
to[1] = a[1] + b[1];
to[2] = a[2] + b[2];
}
-
public static void VectorCopy(float[] from, float[] to) {
to[0] = from[0];
to[1] = from[1];
to[2] = from[2];
}
-
public static void VectorCopy(short[] from, short[] to) {
to[0] = from[0];
to[1] = from[1];
to[2] = from[2];
}
-
public static void VectorCopy(short[] from, float[] to) {
to[0] = from[0];
to[1] = from[1];
to[2] = from[2];
}
-
public static void VectorCopy(float[] from, short[] to) {
to[0] = (short) from[0];
to[1] = (short) from[1];
to[2] = (short) from[2];
}
-
public static void VectorClear(float[] a) {
a[0] = a[1] = a[2] = 0;
}
@@ -116,7 +106,6 @@ public class Math3D extends Lib {
}
return length;
}
-
public static final float VectorLength(float v[]) {
return (float) Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
}
@@ -130,7 +119,6 @@ public class Math3D extends Lib {
out[1] = in[1] * scale;
out[2] = in[2] * scale;
}
-
public static float vectoyaw(float[] vec) {
float yaw;
@@ -151,7 +139,6 @@ public class Math3D extends Lib {
return yaw;
}
-
public static void vectoangles(float[] value1, float[] angles) {
float yaw, pitch;
@@ -183,14 +170,12 @@ public class Math3D extends Lib {
angles[Defines.YAW] = yaw;
angles[Defines.ROLL] = 0;
}
-
private static float m[][] = new float[3][3];
private static float im[][] = new float[3][3];
private static float tmpmat[][] = new float[3][3];
private static float zrot[][] = new float[3][3];
-
public static void RotatePointAroundVector(float[] dst, float[] dir, float[] point, float degrees) {
-
+
float[] vr = { 0.0f, 0.0f, 0.0f };
float[] vup = { 0.0f, 0.0f, 0.0f };
float[] vf = { 0.0f, 0.0f, 0.0f };
@@ -199,8 +184,8 @@ public class Math3D extends Lib {
vf[1] = dir[1];
vf[2] = dir[2];
- Math3D.PerpendicularVector(vr, dir);
- Math3D.CrossProduct(vr, vf, vup);
+ PerpendicularVector(vr, dir);
+ CrossProduct(vr, vf, vup);
m[0][0] = vr[0];
m[1][0] = vr[1];
@@ -228,19 +213,17 @@ public class Math3D extends Lib {
zrot[2][2] = 1.0F;
- zrot[0][0] = zrot[1][1] = (float) Math.cos(Math3D.DEG2RAD(degrees));
- zrot[0][1] = (float) Math.sin(Math3D.DEG2RAD(degrees));
+ zrot[0][0] = zrot[1][1] = (float) Math.cos(DEG2RAD(degrees));
+ zrot[0][1] = (float) Math.sin(DEG2RAD(degrees));
zrot[1][0] = -zrot[0][1];
- Math3D.R_ConcatRotations(m, zrot, tmpmat);
- Math3D.R_ConcatRotations(tmpmat, im, zrot);
+ R_ConcatRotations(m, zrot, tmpmat);
+ R_ConcatRotations(tmpmat, im, zrot);
for (int i = 0; i < 3; i++) {
dst[i] = zrot[i][0] * point[0] + zrot[i][1] * point[1] + zrot[i][2] * point[2];
}
}
-
-
public static void MakeNormalVectors(float[] forward, float[] right, float[] up) {
// this rotate and negat guarantees a vector
// not colinear with the original
@@ -253,12 +236,9 @@ public class Math3D extends Lib {
VectorNormalize(right);
CrossProduct(right, forward, up);
}
-
-
public static float SHORT2ANGLE(int x) {
return (x * shortratio);
}
-
/*
================
R_ConcatTransforms
@@ -278,7 +258,6 @@ public class Math3D extends Lib {
out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + in1[2][2] * in2[2][2];
out[2][3] = in1[2][0] * in2[0][3] + in1[2][1] * in2[1][3] + in1[2][2] * in2[2][3] + in1[2][3];
}
-
/**
* concatenates 2 matrices each [3][3].
*/
@@ -293,12 +272,11 @@ public class Math3D extends Lib {
out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + in1[2][2] * in2[2][1];
out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + in1[2][2] * in2[2][2];
}
-
public static void ProjectPointOnPlane(float[] dst, float[] p, float[] normal) {
- float inv_denom = 1.0F / Math3D.DotProduct(normal, normal);
+ float inv_denom = 1.0F / DotProduct(normal, normal);
- float d = Math3D.DotProduct(normal, p) * inv_denom;
+ float d = DotProduct(normal, p) * inv_denom;
dst[0] = normal[0] * inv_denom;
dst[1] = normal[1] * inv_denom;
@@ -308,14 +286,12 @@ public class Math3D extends Lib {
dst[1] = p[1] - d * dst[1];
dst[2] = p[2] - d * dst[2];
}
-
/** assumes "src" is normalized */
public static void PerpendicularVector(float[] dst, float[] src) {
int pos;
int i;
float minelem = 1.0F;
-
// find the smallest magnitude axially aligned vector
for (pos = 0, i = 0; i < 3; i++) {
if (Math.abs(src[i]) < minelem) {
@@ -330,18 +306,17 @@ public class Math3D extends Lib {
ProjectPointOnPlane(dst, tempvec, src);
//normalize the result
- Math3D.VectorNormalize(dst);
+ VectorNormalize(dst);
}
-
//=====================================================================
/**
stellt fest, auf welcher Seite sich die Kiste befindet, wenn die Ebene
durch Entfernung und Senkrechten-Normale gegeben ist.
erste Version mit vec3_t... */
public static final int BoxOnPlaneSide(float emins[], float emaxs[], cplane_t p) {
-
- assert (emins.length == 3 && emaxs.length == 3) : "vec3_t bug";
-
+
+ assert(emins.length == 3 && emaxs.length == 3) : "vec3_t bug";
+
float dist1, dist2;
int sides;
@@ -390,7 +365,7 @@ public class Math3D extends Lib {
break;
default :
dist1 = dist2 = 0;
- assert (false) : "BoxOnPlaneSide bug";
+ assert(false) : "BoxOnPlaneSide bug";
break;
}
@@ -400,15 +375,13 @@ public class Math3D extends Lib {
if (dist2 < p.dist)
sides |= 2;
- assert (sides != 0) : "BoxOnPlaneSide(): sides == 0 bug";
+ assert(sides != 0) : "BoxOnPlaneSide(): sides == 0 bug";
return sides;
- }
-
+ }
// this is the slow, general version
private static float corners[][] = new float[2][3];
public static final int BoxOnPlaneSide2(float[] emins, float[] emaxs, cplane_t p) {
-
for (int i = 0; i < 3; i++) {
if (p.normal[i] < 0) {
@@ -420,8 +393,8 @@ public class Math3D extends Lib {
corners[0][i] = emaxs[i];
}
}
- float dist1 = Math3D.DotProduct(p.normal, corners[0]) - p.dist;
- float dist2 = Math3D.DotProduct(p.normal, corners[1]) - p.dist;
+ float dist1 = DotProduct(p.normal, corners[0]) - p.dist;
+ float dist2 = DotProduct(p.normal, corners[1]) - p.dist;
int sides = 0;
if (dist1 >= 0)
sides = 1;
@@ -430,7 +403,6 @@ public class Math3D extends Lib {
return sides;
}
-
public static void AngleVectors(float[] angles, float[] forward, float[] right, float[] up) {
float cr = 2.0f * piratio;
@@ -464,56 +436,39 @@ public class Math3D extends Lib {
}
}
}
-
- public static void G_ProjectSource(float[] point, float[] distance, float[] forward, float[] right, float[] result) {
+ public static void G_ProjectSource(
+ float[] point,
+ float[] distance,
+ float[] forward,
+ float[] right,
+ float[] result) {
result[0] = point[0] + forward[0] * distance[0] + right[0] * distance[1];
result[1] = point[1] + forward[1] * distance[0] + right[1] * distance[1];
result[2] = point[2] + forward[2] * distance[0] + right[2] * distance[1] + distance[2];
}
-
-
-
public static final float DotProduct(float[] x, float[] y) {
return x[0] * y[0] + x[1] * y[1] + x[2] * y[2];
}
-
-
-
public static void CrossProduct(float[] v1, float[] v2, float[] cross) {
cross[0] = v1[1] * v2[2] - v1[2] * v2[1];
cross[1] = v1[2] * v2[0] - v1[0] * v2[2];
cross[2] = v1[0] * v2[1] - v1[1] * v2[0];
}
-
-
-
public static int Q_log2(int val) {
int answer = 0;
while ((val >>= 1) > 0)
answer++;
return answer;
}
-
-
-
public static float DEG2RAD(float in) {
return (in * (float) Math.PI) / 180.0f;
}
-
-
-
public static float anglemod(float a) {
return (float) (shortratio) * ((int) (a / (shortratio)) & 65535);
}
-
-
-
public static int ANGLE2SHORT(float x) {
return ((int) ((x) / shortratio) & 65535);
}
-
-
-
public static float LerpAngle(float a2, float a1, float frac) {
if (a1 - a2 > 180)
a1 -= 360;
@@ -521,8 +476,6 @@ public class Math3D extends Lib {
a1 += 360;
return a2 + frac * (a1 - a2);
}
-
-
public static float CalcFov(float fov_x, float width, float height) {
double a = 0.0f;
double x;
@@ -536,6 +489,6 @@ public class Math3D extends Lib {
a = a / piratio;
- return (float)a;
+ return (float) a;
}
}
diff --git a/src/jake2/util/QuakeFile.java b/src/jake2/util/QuakeFile.java
index 5b3c11b..3efcada 100644
--- a/src/jake2/util/QuakeFile.java
+++ b/src/jake2/util/QuakeFile.java
@@ -1,182 +1,166 @@
/*
-Copyright (C) 1997-2001 Id Software, Inc.
+ Copyright (C) 1997-2001 Id Software, Inc.
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
-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.
+ 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.
+ See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
+ */
// Created on 24.07.2004 by RST.
-// $Id: QuakeFile.java,v 1.3 2004-09-10 19:02:56 salomo Exp $
-
+// $Id: QuakeFile.java,v 1.4 2004-09-22 19:22:13 salomo Exp $
package jake2.util;
-import jake2.game.Game;
+import jake2.game.GameAI;
+import jake2.game.GameBase;
import jake2.game.SuperAdapter;
import jake2.game.edict_t;
import jake2.game.gitem_t;
import jake2.qcommon.Com;
-import java.io.*;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.RandomAccessFile;
-/**
- * RandomAccessFile, but handles readString/WriteString specially and
- * offers other helper functions
+/**
+ * RandomAccessFile, but handles readString/WriteString specially and offers
+ * other helper functions
*/
-public class QuakeFile extends RandomAccessFile
-{
-
- /** Standard Constructor.*/
- public QuakeFile(String filename, String mode) throws FileNotFoundException
- {
- super(filename, mode);
- }
-
- /** Writes a Vector to a RandomAccessFile. */
- public void writeVector(float v[]) throws IOException
- {
- for (int n= 0; n < 3; n++)
- writeFloat(v[n]);
- }
-
- /** Writes a Vector to a RandomAccessFile. */
- public float[] readVector() throws IOException
- {
- float res[]= { 0, 0, 0 };
- for (int n= 0; n < 3; n++)
- res[n]= readFloat();
-
- return res;
- }
-
- /** Reads a length specified string from a file. */
- public String readString() throws IOException
- {
- int len= readInt();
-
- if (len == -1)
- return null;
-
- if (len == 0)
- return "";
-
- byte bb[]= new byte[len];
-
- super.read(bb, 0, len);
-
- return new String(bb, 0, len);
- }
-
- /** Writes a length specified string to a file. */
- public void writeString(String s) throws IOException
- {
- if (s == null)
- {
- writeInt(-1);
- return;
- }
-
- writeInt(s.length());
- if (s.length() != 0)
- writeBytes(s);
- }
-
- /** Writes the edict reference. */
- public void writeEdictRef(edict_t ent) throws IOException
- {
- if (ent == null)
- writeInt(-1);
- else
- {
- writeInt(ent.s.number);
- }
- }
-
- /**
- * Reads an edict index from a file and returns the edict.
- */
-
- public edict_t readEdictRef() throws IOException
- {
- int i= readInt();
-
- // handle -1
- if (i < 0)
- return null;
-
- if (i > Game.g_edicts.length)
- {
- Com.DPrintf("jake2: illegal edict num:" + i + "\n");
- return null;
- }
-
- // valid edict.
- return Game.g_edicts[i];
- }
-
- /** Writes the Adapter-ID to the file. */
- public void writeAdapter(SuperAdapter a) throws IOException
- {
- writeInt(3988);
- if (a == null)
- writeString(null);
- else
- {
- String str= a.getID();
- if (a == null)
- {
- Com.DPrintf("writeAdapter: invalid Adapter id for " + a + "\n");
- }
- writeString(str);
- }
- }
-
- /** Reads the adapter id and returns the adapter. */
- public SuperAdapter readAdapter() throws IOException
- {
- if (readInt() != 3988)
- Com.DPrintf("wrong read position: readadapter 3988 \n");
-
- String id= readString();
-
- if (id == null)
- {
- // null adapter. :-)
- return null;
- }
-
- return SuperAdapter.getFromID(id);
- }
-
- /** Writes an item reference. */
- public void writeItem(gitem_t item) throws IOException
- {
- if (item == null)
- writeInt(-1);
- else
- writeInt(item.index);
- }
-
- /** Reads the item index and returns the game item. */
- public gitem_t readItem() throws IOException
- {
- int ndx= readInt();
- if (ndx == -1)
- return null;
- else
- return Game.itemlist[ndx];
- }
-
-}
+public class QuakeFile extends RandomAccessFile {
+
+ /** Standard Constructor. */
+ public QuakeFile(String filename, String mode) throws FileNotFoundException {
+ super(filename, mode);
+ }
+
+ /** Writes a Vector to a RandomAccessFile. */
+ public void writeVector(float v[]) throws IOException {
+ for (int n = 0; n < 3; n++)
+ writeFloat(v[n]);
+ }
+
+ /** Writes a Vector to a RandomAccessFile. */
+ public float[] readVector() throws IOException {
+ float res[] = { 0, 0, 0 };
+ for (int n = 0; n < 3; n++)
+ res[n] = readFloat();
+
+ return res;
+ }
+
+ /** Reads a length specified string from a file. */
+ public String readString() throws IOException {
+ int len = readInt();
+
+ if (len == -1)
+ return null;
+
+ if (len == 0)
+ return "";
+
+ byte bb[] = new byte[len];
+
+ super.read(bb, 0, len);
+
+ return new String(bb, 0, len);
+ }
+
+ /** Writes a length specified string to a file. */
+ public void writeString(String s) throws IOException {
+ if (s == null) {
+ writeInt(-1);
+ return;
+ }
+
+ writeInt(s.length());
+ if (s.length() != 0)
+ writeBytes(s);
+ }
+
+ /** Writes the edict reference. */
+ public void writeEdictRef(edict_t ent) throws IOException {
+ if (ent == null)
+ writeInt(-1);
+ else {
+ writeInt(ent.s.number);
+ }
+ }
+
+ /**
+ * Reads an edict index from a file and returns the edict.
+ */
+
+ public edict_t readEdictRef() throws IOException {
+ int i = readInt();
+
+ // handle -1
+ if (i < 0)
+ return null;
+
+ if (i > GameBase.g_edicts.length) {
+ Com.DPrintf("jake2: illegal edict num:" + i + "\n");
+ return null;
+ }
+
+ // valid edict.
+ return GameBase.g_edicts[i];
+ }
+
+ /** Writes the Adapter-ID to the file. */
+ public void writeAdapter(SuperAdapter a) throws IOException {
+ writeInt(3988);
+ if (a == null)
+ writeString(null);
+ else {
+ String str = a.getID();
+ if (a == null) {
+ Com.DPrintf("writeAdapter: invalid Adapter id for " + a + "\n");
+ }
+ writeString(str);
+ }
+ }
+
+ /** Reads the adapter id and returns the adapter. */
+ public SuperAdapter readAdapter() throws IOException {
+ if (readInt() != 3988)
+ Com.DPrintf("wrong read position: readadapter 3988 \n");
+
+ String id = readString();
+
+ if (id == null) {
+ // null adapter. :-)
+ return null;
+ }
+
+ return SuperAdapter.getFromID(id);
+ }
+
+ /** Writes an item reference. */
+ public void writeItem(gitem_t item) throws IOException {
+ if (item == null)
+ writeInt(-1);
+ else
+ writeInt(item.index);
+ }
+
+ /** Reads the item index and returns the game item. */
+ public gitem_t readItem() throws IOException {
+ int ndx = readInt();
+ if (ndx == -1)
+ return null;
+ else
+ return GameAI.itemlist[ndx];
+ }
+
+} \ No newline at end of file