@2003scape/rsc-client
Version:
runescape classic web client
529 lines (413 loc) • 18 kB
JavaScript
const Utility = require('./utility');
const ndarray = require('ndarray');
class GameData {
static getModelIndex(s) {
if (/^na$/i.test(s)) {
return 0;
}
for (let i = 0; i < GameData.modelCount; i++) {
if (GameData.modelName[i].toLowerCase() === s.toLowerCase()) {
return i;
}
}
GameData.modelName[GameData.modelCount++] = s;
return GameData.modelCount - 1;
}
static getUnsignedByte() {
let i = GameData.dataInteger[GameData.offset] & 0xff;
GameData.offset++;
return i;
}
static getUnsignedShort() {
let i = Utility.getUnsignedShort(GameData.dataInteger, GameData.offset);
GameData.offset += 2;
return i;
}
static getUnsignedInt() {
let i = Utility.getUnsignedInt(GameData.dataInteger, GameData.offset);
GameData.offset += 4;
if (i > 99999999) {
i = 99999999 - i;
}
return i;
}
static getString() {
let s = '';
for (
s = '';
GameData.dataString[GameData.stringOffset] !== 0;
s =
s +
String.fromCharCode(
GameData.dataString[GameData.stringOffset++]
)
);
GameData.stringOffset++;
return s;
}
static loadData(buffer, isMembers) {
GameData.dataString = Utility.loadData('string.dat', 0, buffer);
GameData.stringOffset = 0;
GameData.dataInteger = Utility.loadData('integer.dat', 0, buffer);
GameData.offset = 0;
let i = 0;
GameData.itemCount = GameData.getUnsignedShort();
GameData.itemName = [];
GameData.itemDescription = [];
GameData.itemCommand = [];
GameData.itemPicture = new Int32Array(GameData.itemCount);
GameData.itemBasePrice = new Int32Array(GameData.itemCount);
GameData.itemStackable = new Int32Array(GameData.itemCount);
GameData.itemUnused = new Int32Array(GameData.itemCount);
GameData.itemWearable = new Int32Array(GameData.itemCount);
GameData.itemMask = new Int32Array(GameData.itemCount);
GameData.itemSpecial = new Int32Array(GameData.itemCount);
GameData.itemMembers = new Int32Array(GameData.itemCount);
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemName.push(GameData.getString());
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemDescription.push(GameData.getString());
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemCommand.push(GameData.getString());
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemPicture[i] = GameData.getUnsignedShort();
if (GameData.itemPicture[i] + 1 > GameData.itemSpriteCount) {
GameData.itemSpriteCount = GameData.itemPicture[i] + 1;
}
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemBasePrice[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemStackable[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemUnused[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemWearable[i] = GameData.getUnsignedShort();
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemMask[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemSpecial[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.itemCount; i++) {
GameData.itemMembers[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.itemCount; i++) {
if (!isMembers && GameData.itemMembers[i] === 1) {
GameData.itemName[i] = 'Members object';
GameData.itemDescription[i] =
'You need to be a member to use this object';
GameData.itemBasePrice[i] = 0;
GameData.itemCommand[i] = '';
GameData.itemUnused[0] = 0;
GameData.itemWearable[i] = 0;
GameData.itemSpecial[i] = 1;
}
}
GameData.npcCount = GameData.getUnsignedShort();
GameData.npcName = [];
GameData.npcDescription = [];
GameData.npcCommand = [];
GameData.npcAttack = new Int32Array(GameData.npcCount);
GameData.npcStrength = new Int32Array(GameData.npcCount);
GameData.npcHits = new Int32Array(GameData.npcCount);
GameData.npcDefense = new Int32Array(GameData.npcCount);
GameData.npcAttackable = new Int32Array(GameData.npcCount);
GameData.npcSprite = ndarray(new Int32Array(GameData.npcCount * 12), [
GameData.npcCount,
12
]);
GameData.npcColourHair = new Int32Array(GameData.npcCount);
GameData.npcColourTop = new Int32Array(GameData.npcCount);
GameData.npcColorBottom = new Int32Array(GameData.npcCount);
GameData.npcColourSkin = new Int32Array(GameData.npcCount);
GameData.npcWidth = new Int32Array(GameData.npcCount);
GameData.npcHeight = new Int32Array(GameData.npcCount);
GameData.npcWalkModel = new Int32Array(GameData.npcCount);
GameData.npcCombatModel = new Int32Array(GameData.npcCount);
GameData.npcCombatAnimation = new Int32Array(GameData.npcCount);
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcName.push(GameData.getString());
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcDescription.push(GameData.getString());
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcAttack[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcStrength[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcHits[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcDefense[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcAttackable[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.npcCount; i++) {
for (let i5 = 0; i5 < 12; i5++) {
GameData.npcSprite.set(i, i5, GameData.getUnsignedByte());
if (GameData.npcSprite.get(i, i5) === 255) {
GameData.npcSprite.set(i, i5, -1);
}
}
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcColourHair[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcColourTop[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcColorBottom[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcColourSkin[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcWidth[i] = GameData.getUnsignedShort();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcHeight[i] = GameData.getUnsignedShort();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcWalkModel[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcCombatModel[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcCombatAnimation[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.npcCount; i++) {
GameData.npcCommand[i] = GameData.getString();
}
GameData.textureCount = GameData.getUnsignedShort();
GameData.textureName = [];
GameData.textureSubtypeName = [];
for (i = 0; i < GameData.textureCount; i++) {
GameData.textureName.push(GameData.getString());
}
for (i = 0; i < GameData.textureCount; i++) {
GameData.textureSubtypeName.push(GameData.getString());
}
GameData.animationCount = GameData.getUnsignedShort();
GameData.animationName = [];
GameData.animationCharacterColour = new Int32Array(
GameData.animationCount
);
GameData.animationGender = new Int32Array(GameData.animationCount);
GameData.animationHasA = new Int32Array(GameData.animationCount);
GameData.animationHasF = new Int32Array(GameData.animationCount);
GameData.animationNumber = new Int32Array(GameData.animationCount);
for (i = 0; i < GameData.animationCount; i++) {
GameData.animationName.push(GameData.getString());
}
for (i = 0; i < GameData.animationCount; i++) {
GameData.animationCharacterColour[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.animationCount; i++) {
GameData.animationGender[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.animationCount; i++) {
GameData.animationHasA[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.animationCount; i++) {
GameData.animationHasF[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.animationCount; i++) {
GameData.animationNumber[i] = GameData.getUnsignedByte();
}
GameData.objectCount = GameData.getUnsignedShort();
GameData.objectName = [];
GameData.objectDescription = [];
GameData.objectCommand1 = [];
GameData.objectCommand2 = [];
GameData.objectModelIndex = new Int32Array(GameData.objectCount);
GameData.objectWidth = new Int32Array(GameData.objectCount);
GameData.objectHeight = new Int32Array(GameData.objectCount);
GameData.objectType = new Int32Array(GameData.objectCount);
GameData.objectElevation = new Int32Array(GameData.objectCount);
for (i = 0; i < GameData.objectCount; i++) {
GameData.objectName.push(GameData.getString());
}
for (i = 0; i < GameData.objectCount; i++) {
GameData.objectDescription.push(GameData.getString());
}
for (i = 0; i < GameData.objectCount; i++) {
GameData.objectCommand1.push(GameData.getString());
}
for (i = 0; i < GameData.objectCount; i++) {
GameData.objectCommand2.push(GameData.getString());
}
for (i = 0; i < GameData.objectCount; i++) {
GameData.objectModelIndex[i] = GameData.getModelIndex(
GameData.getString()
);
}
for (i = 0; i < GameData.objectCount; i++) {
GameData.objectWidth[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.objectCount; i++) {
GameData.objectHeight[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.objectCount; i++) {
GameData.objectType[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.objectCount; i++) {
GameData.objectElevation[i] = GameData.getUnsignedByte();
}
GameData.wallObjectCount = GameData.getUnsignedShort();
GameData.wallObjectName = [];
GameData.wallObjectDescription = [];
GameData.wallObjectCommand1 = [];
GameData.wallObjectCommand2 = [];
GameData.wallObjectHeight = new Int32Array(GameData.wallObjectCount);
GameData.wallObjectTextureFront = new Int32Array(
GameData.wallObjectCount
);
GameData.wallObjectTextureBack = new Int32Array(
GameData.wallObjectCount
);
GameData.wallObjectAdjacent = new Int32Array(GameData.wallObjectCount);
GameData.wallObjectInvisible = new Int32Array(GameData.wallObjectCount);
for (i = 0; i < GameData.wallObjectCount; i++) {
GameData.wallObjectName.push(GameData.getString());
}
for (i = 0; i < GameData.wallObjectCount; i++) {
GameData.wallObjectDescription.push(GameData.getString());
}
for (i = 0; i < GameData.wallObjectCount; i++) {
GameData.wallObjectCommand1.push(GameData.getString());
}
for (i = 0; i < GameData.wallObjectCount; i++) {
GameData.wallObjectCommand2.push(GameData.getString());
}
for (i = 0; i < GameData.wallObjectCount; i++) {
GameData.wallObjectHeight[i] = GameData.getUnsignedShort();
}
for (i = 0; i < GameData.wallObjectCount; i++) {
GameData.wallObjectTextureFront[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.wallObjectCount; i++) {
GameData.wallObjectTextureBack[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.wallObjectCount; i++) {
// what's this?
GameData.wallObjectAdjacent[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.wallObjectCount; i++) {
// value is 0 if visible
GameData.wallObjectInvisible[i] = GameData.getUnsignedByte();
}
// the World class does something with these
GameData.roofCount = GameData.getUnsignedShort();
GameData.roofHeight = new Int32Array(GameData.roofCount);
GameData.roofNumVertices = new Int32Array(GameData.roofCount);
for (i = 0; i < GameData.roofCount; i++) {
GameData.roofHeight[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.roofCount; i++) {
GameData.roofNumVertices[i] = GameData.getUnsignedByte();
}
GameData.tileCount = GameData.getUnsignedShort(); // and these
GameData.tileDecoration = new Int32Array(GameData.tileCount);
GameData.tileType = new Int32Array(GameData.tileCount);
GameData.tileAdjacent = new Int32Array(GameData.tileCount);
for (i = 0; i < GameData.tileCount; i++) {
GameData.tileDecoration[i] = GameData.getUnsignedInt();
}
for (i = 0; i < GameData.tileCount; i++) {
GameData.tileType[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.tileCount; i++) {
GameData.tileAdjacent[i] = GameData.getUnsignedByte();
}
GameData.projectileSprite = GameData.getUnsignedShort();
GameData.spellCount = GameData.getUnsignedShort();
GameData.spellName = [];
GameData.spellDescription = [];
GameData.spellLevel = new Int32Array(GameData.spellCount);
GameData.spellRunesRequired = new Int32Array(GameData.spellCount);
GameData.spellType = new Int32Array(GameData.spellCount);
GameData.spellRunesId = [];
GameData.spellRunesCount = [];
for (i = 0; i < GameData.spellCount; i++) {
GameData.spellName.push(GameData.getString());
}
for (i = 0; i < GameData.spellCount; i++) {
GameData.spellDescription.push(GameData.getString());
}
for (i = 0; i < GameData.spellCount; i++) {
GameData.spellLevel[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.spellCount; i++) {
GameData.spellRunesRequired[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.spellCount; i++) {
GameData.spellType[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.spellCount; i++) {
const runeAmount = GameData.getUnsignedByte();
GameData.spellRunesId.push(new Int32Array(runeAmount));
for (let j = 0; j < runeAmount; j++) {
GameData.spellRunesId[i][j] = GameData.getUnsignedShort();
}
}
for (i = 0; i < GameData.spellCount; i++) {
let runeAmount = GameData.getUnsignedByte();
GameData.spellRunesCount.push(new Int32Array(runeAmount));
for (let k = 0; k < runeAmount; k++) {
GameData.spellRunesCount[i][k] = GameData.getUnsignedByte();
}
}
GameData.prayerCount = GameData.getUnsignedShort();
GameData.prayerName = [];
GameData.prayerDescription = [];
GameData.prayerLevel = new Int32Array(GameData.prayerCount);
GameData.prayerDrain = new Int32Array(GameData.prayerCount);
for (i = 0; i < GameData.prayerCount; i++) {
GameData.prayerName.push(GameData.getString());
}
for (i = 0; i < GameData.prayerCount; i++) {
GameData.prayerDescription.push(GameData.getString());
}
for (i = 0; i < GameData.prayerCount; i++) {
GameData.prayerLevel[i] = GameData.getUnsignedByte();
}
for (i = 0; i < GameData.prayerCount; i++) {
GameData.prayerDrain[i] = GameData.getUnsignedByte();
}
GameData.dataString = null;
GameData.dataInteger = null;
}
}
GameData.modelName = [];
GameData.modelName.length = 5000;
GameData.modelName.fill(null);
GameData.spellCount = 0;
GameData.itemCount = 0;
GameData.itemSpriteCount = 0;
GameData.tileCount = 0;
GameData.wallObjectCount = 0;
GameData.modelCount = 0;
GameData.prayerCount = 0;
GameData.projectileSprite = 0;
GameData.npcCount = 0;
GameData.textureCount = 0;
GameData.roofCount = 0;
GameData.objectCount = 0;
GameData.animationCount = 0;
GameData.stringOffset = 0;
GameData.offset = 0;
module.exports = GameData;