Skip to content

Commit

Permalink
Merge pull request #1 from MichaelEbert/extraClasses
Browse files Browse the repository at this point in the history
Added additional classes for repeated structures
  • Loading branch information
valarnin authored Feb 21, 2022
2 parents 2184227 + 87a4892 commit 8759b96
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 85 deletions.
14 changes: 14 additions & 0 deletions save/inventoryitem.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { PropertyCollection } from "./properties";
export class InventoryItem{
iref: number;
stackedItemsNum: number;
changedEntriesNum: number;
changedEntries: PropertyCollection[];

constructor(iref: number, stackedItemsNum: number, changedEntriesNum: number, changedEntries: PropertyCollection[]){
this.iref = iref;
this.stackedItemsNum = stackedItemsNum;
this.changedEntriesNum = changedEntriesNum;
this.changedEntries = changedEntries;
}
}
58 changes: 34 additions & 24 deletions save/properties.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,33 @@
import { SaveBuffer } from "./util";

let getProps = (buf: SaveBuffer, endOffset: number): [
number,
{
flag: number;
// @TODO: More strict typing here?
value: any;
}[],
] => {
export class Property{
flag: number;
// @TODO: More strict typing here?
value: any;

constructor(flag: number, value: any){
this.flag = flag;
this.value = value;
}
}

export class PropertyCollection{
propertiesNum: number;
properties: Property[];

constructor(propertiesNum: number, properties: Property[]){
this.propertiesNum = propertiesNum;
this.properties = properties;
}
}

let getProps = (buf: SaveBuffer, endOffset: number): PropertyCollection => {
let propertiesNum = buf.readShort();
let properties: {
flag: number;
// @TODO: More strict typing here?
value: any;
}[] = [];
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return [propertiesNum, properties];}
let properties: Property[] = [];
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return {propertiesNum, properties};}
for (let k = 0; k < propertiesNum; ++k) {
let flag = buf.readByte();
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return [propertiesNum, properties];}
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return {propertiesNum, properties};}
let value: any = undefined;
// This is ugly
switch(flag) {
Expand All @@ -40,7 +50,7 @@ let getProps = (buf: SaveBuffer, endOffset: number): [
_var.refVar = buf.readDouble();
}
value.variables.push(_var);
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return [propertiesNum, properties];}
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return {propertiesNum, properties};}
}
value.unknown = buf.readByte();
break;
Expand Down Expand Up @@ -79,7 +89,7 @@ let getProps = (buf: SaveBuffer, endOffset: number): [
data.iref = buf.readInt();
data.unknown = buf.readByte();
value.data.push(data);
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return [propertiesNum, properties];}
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return {propertiesNum, properties};}
}
break;
case 0x22:
Expand All @@ -91,7 +101,7 @@ let getProps = (buf: SaveBuffer, endOffset: number): [
value.data = [];
for (let l = 0; l < value.dataNum; ++l) {
value.data.push(buf.readInt());
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return [propertiesNum, properties];}
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return {propertiesNum, properties};}
}
break;
case 0x25:
Expand Down Expand Up @@ -163,7 +173,7 @@ let getProps = (buf: SaveBuffer, endOffset: number): [
value.data = [];
for (let i = 0; i < value.dataNum; ++i) {
value.data.push(buf.readByteArray(61));
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return [propertiesNum, properties];}
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return {propertiesNum, properties};}
}
break;
case 0x3c:
Expand Down Expand Up @@ -204,7 +214,7 @@ let getProps = (buf: SaveBuffer, endOffset: number): [
value.data = [];
for (let i = 0; i < value.dataNum; ++i) {
value.data.push(buf.readByteArray(10));
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return [propertiesNum, properties];}
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return {propertiesNum, properties};}
}
break;
case 0x4f:
Expand Down Expand Up @@ -235,7 +245,7 @@ let getProps = (buf: SaveBuffer, endOffset: number): [
conv.convDialog = buf.readInt();
conv.convInfo = buf.readInt();
value.conv.push(conv);
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return [propertiesNum, properties];}
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return {propertiesNum, properties};}
}
break;
case 0x5a:
Expand All @@ -249,13 +259,13 @@ let getProps = (buf: SaveBuffer, endOffset: number): [
flag: flag,
value: value,
});
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return [propertiesNum, properties];}
if (buf.offset > endOffset) {/* console.log('Invalid object props', propertiesNum, offset, endOffset); */ return {propertiesNum, properties};}
}

return [
return {
propertiesNum,
properties,
];
};
};

export default getProps;
36 changes: 8 additions & 28 deletions save/record_creaturereference.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import getProps from "./properties";
import getProps, { PropertyCollection } from "./properties";
import Record from "./record";
import { InventoryItem } from "./inventoryitem";
import { SaveBuffer } from "./util";

class PlayerObject {
Expand Down Expand Up @@ -424,19 +425,7 @@ export class RecordCreatureReference {

flags?: number;
inventory_itemNum?: number;
inventory_items: {
iref: number,
stackedItemsNum: number,
changedEntriesNum: number,
changedEntries: {
propertiesNum: number;
properties: {
flag: number;
// @TODO: More strict typing here?
value: any;
}[];
}[];
}[] = [];
inventory_items: InventoryItem[] = [];
havokMoved_dataLen?: number;
havokMoved_data: number[] = [];
scale?: number;
Expand Down Expand Up @@ -540,20 +529,9 @@ export class RecordCreatureReference {
let iref = buf.readInt(maxOffset);
let stackedItemsNum = buf.readInt(maxOffset);
let changedEntriesNum = buf.readInt(maxOffset);
let changedEntries: {
propertiesNum: number;
properties: {
flag: number;
// @TODO: More strict typing here?
value: any;
}[];
}[] = [];
let changedEntries: PropertyCollection[] = [];
for (let j = 0; j < changedEntriesNum; ++j) {
let props = getProps(buf, startOffset + record.dataSize);
changedEntries.push({
propertiesNum: props[0],
properties: props[1],
});
changedEntries.push(getProps(buf, startOffset + record.dataSize));
}
this.inventory_items.push({
iref: iref,
Expand All @@ -563,7 +541,9 @@ export class RecordCreatureReference {
});
}
}
[this.propertiesNum, this.properties] = getProps(buf, startOffset + record.dataSize);
let p = getProps(buf, startOffset + record.dataSize);
this.propertiesNum = p.propertiesNum;
this.properties = p.properties;
if (record.flags & 0x8 && !(record.flags & 0x2 || record.flags & 0x4)) {
this.havokMoved_dataLen = buf.readShort(maxOffset);
this.havokMoved_data = buf.readByteArray(this.havokMoved_dataLen);
Expand Down
42 changes: 9 additions & 33 deletions save/record_instancereference.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import getProps from "./properties";
import { InventoryItem } from "./inventoryitem";
import getProps, { Property, PropertyCollection } from "./properties";
import Record from "./record";
import { SaveBuffer } from "./util";

Expand Down Expand Up @@ -40,29 +41,13 @@ export class RecordInstanceReference {

flags?: number;
inventory_itemNum?: number;
inventory_items: {
iref: number,
stackedItemsNum: number,
changedEntriesNum: number,
changedEntries: {
propertiesNum: number;
properties: {
flag: number;
// @TODO: More strict typing here?
value: any;
}[];
}[];
}[] = [];
inventory_items: InventoryItem[] = [];
havokMoved_dataLen?: number;
havokMoved_data: number[] = [];
scale?: number;
enabled?: boolean;
propertiesNum?: number;
properties: {
flag: number;
// @TODO: More strict typing here?
value: any;
}[] = [];
properties: Property[] = [];

constructor(record: Record, buf: SaveBuffer) {
const startOffset = buf.offset;
Expand Down Expand Up @@ -121,21 +106,10 @@ export class RecordInstanceReference {
let iref = buf.readInt(maxOffset);
let stackedItemsNum = buf.readInt(maxOffset);
let changedEntriesNum = buf.readInt(maxOffset);
let changedEntries: {
propertiesNum: number;
properties: {
flag: number;
// @TODO: More strict typing here?
value: any;
}[];
}[] = [];
let changedEntries: PropertyCollection[] = [];
for (let j = 0; j < changedEntriesNum; ++j) {
if (buf.offset - startOffset > record.dataSize) {/* console.log('Invalid object', record, this); */ return;}
let props = getProps(buf, startOffset + record.dataSize);
changedEntries.push({
propertiesNum: props[0],
properties: props[1],
});
changedEntries.push(getProps(buf, startOffset + record.dataSize));
}
this.inventory_items.push({
iref: iref,
Expand All @@ -147,7 +121,9 @@ export class RecordInstanceReference {
}
if (record.flags & 0x173004e0) {
if (buf.offset - startOffset > record.dataSize) {/* console.log('Invalid object', record, this); */ return;}
[this.propertiesNum, this.properties] = getProps(buf, startOffset + record.dataSize);
let props = getProps(buf, startOffset + record.dataSize);
this.propertiesNum = props.propertiesNum;
this.properties = props.properties;
}
if (record.flags & 0x8 && !(record.flags & 0x2 || record.flags & 0x4)) {
this.havokMoved_dataLen = buf.readShort(maxOffset);
Expand Down

0 comments on commit 8759b96

Please sign in to comment.