wc3maptranslator 4.0.1 → 4.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/AngleConverter.d.ts +3 -0
- package/dist/src/AngleConverter.d.ts.map +1 -0
- package/dist/src/AngleConverter.js +12 -0
- package/dist/src/AngleConverter.js.map +1 -0
- package/dist/src/CommonInterfaces.d.ts +17 -0
- package/dist/src/CommonInterfaces.d.ts.map +1 -0
- package/dist/src/CommonInterfaces.js +3 -0
- package/dist/src/CommonInterfaces.js.map +1 -0
- package/dist/src/HexBuffer.d.ts +15 -0
- package/dist/src/HexBuffer.d.ts.map +1 -0
- package/{lib/HexBuffer.ts → dist/src/HexBuffer.js} +32 -42
- package/dist/src/HexBuffer.js.map +1 -0
- package/dist/src/W3Buffer.d.ts +14 -0
- package/dist/src/W3Buffer.d.ts.map +1 -0
- package/{lib/W3Buffer.ts → dist/src/W3Buffer.js} +25 -31
- package/dist/src/W3Buffer.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/{index.js → dist/src/index.js} +1 -1
- package/dist/src/index.js.map +1 -0
- package/dist/src/translators/CamerasTranslator.d.ts +23 -0
- package/dist/src/translators/CamerasTranslator.d.ts.map +1 -0
- package/{lib/translators/CamerasTranslator.ts → dist/src/translators/CamerasTranslator.js} +14 -39
- package/dist/src/translators/CamerasTranslator.js.map +1 -0
- package/dist/src/translators/DoodadsTranslator.d.ts +23 -0
- package/dist/src/translators/DoodadsTranslator.d.ts.map +1 -0
- package/{lib/translators/DoodadsTranslator.ts → dist/src/translators/DoodadsTranslator.js} +33 -65
- package/dist/src/translators/DoodadsTranslator.js.map +1 -0
- package/dist/src/translators/ImportsTranslator.d.ts +16 -0
- package/dist/src/translators/ImportsTranslator.d.ts.map +1 -0
- package/{lib/translators/ImportsTranslator.ts → dist/src/translators/ImportsTranslator.js} +21 -37
- package/dist/src/translators/ImportsTranslator.js.map +1 -0
- package/dist/src/translators/InfoTranslator.d.ts +124 -0
- package/dist/src/translators/InfoTranslator.d.ts.map +1 -0
- package/{lib/translators/InfoTranslator.ts → dist/src/translators/InfoTranslator.js} +108 -270
- package/dist/src/translators/InfoTranslator.js.map +1 -0
- package/dist/src/translators/ObjectsTranslator.d.ts +23 -0
- package/dist/src/translators/ObjectsTranslator.d.ts.map +1 -0
- package/{lib/translators/ObjectsTranslator.ts → dist/src/translators/ObjectsTranslator.js} +91 -125
- package/dist/src/translators/ObjectsTranslator.js.map +1 -0
- package/dist/src/translators/RegionsTranslator.d.ts +22 -0
- package/dist/src/translators/RegionsTranslator.d.ts.map +1 -0
- package/{lib/translators/RegionsTranslator.ts → dist/src/translators/RegionsTranslator.js} +18 -45
- package/dist/src/translators/RegionsTranslator.js.map +1 -0
- package/dist/src/translators/SoundsTranslator.d.ts +35 -0
- package/dist/src/translators/SoundsTranslator.d.ts.map +1 -0
- package/{lib/translators/SoundsTranslator.ts → dist/src/translators/SoundsTranslator.js} +30 -84
- package/dist/src/translators/SoundsTranslator.js.map +1 -0
- package/dist/src/translators/StringsTranslator.d.ts +7 -0
- package/dist/src/translators/StringsTranslator.d.ts.map +1 -0
- package/{lib/translators/StringsTranslator.ts → dist/src/translators/StringsTranslator.js} +12 -17
- package/dist/src/translators/StringsTranslator.js.map +1 -0
- package/dist/src/translators/TerrainTranslator.d.ts +33 -0
- package/dist/src/translators/TerrainTranslator.d.ts.map +1 -0
- package/{lib/translators/TerrainTranslator.ts → dist/src/translators/TerrainTranslator.js} +29 -84
- package/dist/src/translators/TerrainTranslator.js.map +1 -0
- package/dist/src/translators/UnitsTranslator.d.ts +40 -0
- package/dist/src/translators/UnitsTranslator.d.ts.map +1 -0
- package/{lib/translators/UnitsTranslator.ts → dist/src/translators/UnitsTranslator.js} +33 -95
- package/dist/src/translators/UnitsTranslator.js.map +1 -0
- package/{lib/translators/index.ts → dist/src/translators/index.d.ts} +1 -0
- package/dist/src/translators/index.d.ts.map +1 -0
- package/dist/src/translators/index.js +23 -0
- package/dist/src/translators/index.js.map +1 -0
- package/package.json +5 -4
- package/.codeclimate.yml +0 -12
- package/.editorconfig +0 -8
- package/.eslintignore +0 -5
- package/.eslintrc +0 -55
- package/.github/workflows/codeql-analysis.yml +0 -54
- package/.nycrc +0 -18
- package/.travis.yml +0 -23
- package/CHANGELOG.md +0 -78
- package/index.ts +0 -14
- package/lib/AngleConverter.ts +0 -7
- package/lib/CommonInterfaces.ts +0 -22
- package/test/.mocharc.json +0 -4
- package/test/AngleConverterTest.ts +0 -18
- package/test/HexBufferTest.ts +0 -170
- package/test/TranslatorReversion.ts +0 -218
- package/test/W3BufferTest.ts +0 -50
- package/test/data/cameras.json +0 -16
- package/test/data/doodads.json +0 -2730
- package/test/data/imports.json +0 -386
- package/test/data/info.json +0 -250
- package/test/data/obj-abilities.json +0 -4892
- package/test/data/obj-buffs.json +0 -38
- package/test/data/obj-destructables.json +0 -31
- package/test/data/obj-doodads.json +0 -38
- package/test/data/obj-items.json +0 -31
- package/test/data/obj-units.json +0 -40
- package/test/data/obj-upgrades.json +0 -38
- package/test/data/regions.json +0 -206
- package/test/data/sounds.json +0 -50
- package/test/data/strings.json +0 -115
- package/test/data/terrain.json +0 -1
- package/test/data/units.json +0 -452
- package/test/data/war3map.doo +0 -0
- package/test/data/war3map.imp +0 -0
- package/test/data/war3map.j +0 -3442
- package/test/data/war3map.shd +0 -0
- package/test/data/war3map.w3a +0 -0
- package/test/data/war3map.w3b +0 -0
- package/test/data/war3map.w3c +0 -0
- package/test/data/war3map.w3d +0 -0
- package/test/data/war3map.w3e +0 -0
- package/test/data/war3map.w3h +0 -0
- package/test/data/war3map.w3i +0 -0
- package/test/data/war3map.w3q +0 -0
- package/test/data/war3map.w3r +0 -0
- package/test/data/war3map.w3s +0 -0
- package/test/data/war3map.w3t +0 -0
- package/test/data/war3map.w3u +0 -0
- package/test/data/war3map.wts +0 -631
- package/test/data/war3mapUnits.doo +0 -0
- package/tsconfig.json +0 -25
- package/tslint.json +0 -47
package/CHANGELOG.md
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# 4.0.1 (2023-08-06)
|
|
2
|
-
## SUMMARY
|
|
3
|
-
## FIXES
|
|
4
|
-
* Project properly builds all TS files upon installation, resolving out-of-the-box errors
|
|
5
|
-
|
|
6
|
-
# 4.0.0 (2021-02-28)
|
|
7
|
-
## SUMMARY
|
|
8
|
-
**🔥 Breaking changes**
|
|
9
|
-
|
|
10
|
-
This major release significantly overhauls WC3MapTranslator since the release of WarCraft III: Reforged. There are a few breaking changes in this release.
|
|
11
|
-
|
|
12
|
-
The two largest changes include a new usage contract and changes to the terrain `.json` format, both of which are detailed below. This release also integrates the latest file formats, after a few changes to the war3map formats to support Reforged.
|
|
13
|
-
|
|
14
|
-
The old usage contract meant that developers had to instantiate translators, which didn't make much sense. Now translators are static classes that can be used directly after importing.
|
|
15
|
-
|
|
16
|
-
The `.json` format for terrain gets rid of the bulky `tile` objects and returns to a one-dimensional mask array for things like ground height, boundary flags, etc. In an older version of WC3MapTranslator, terrain used to be a multi-dimensional array of rows, followed by the `tile` object format. The problems with the `tile` object format were two-fold: (1) file size would blow up (e.g. a 29kB `.w3e` file would become a 1199kB `.json` terrain file); and (2) the bulky `tile` objects did not lend themselves to the spirit of having a diff-able JSON file. We believe that a single-dimensional array will allow developers to more easily see differences between JSONs.
|
|
17
|
-
|
|
18
|
-
Another exciting change is a new [WC3MapSpecification](https://github.com/ChiefOfGxBxL/WC3MapSpecification) repository for documenting the war3map specifications. This is a living document, meaning it may be updated in-place as our understanding of the file formats improves!
|
|
19
|
-
|
|
20
|
-
## FEATURES
|
|
21
|
-
* 🔥 Improve usage contract:
|
|
22
|
-
* Translators are now exported by this library (e.g. `import { ObjectTranslator } from 'wc3maptranslator'`)
|
|
23
|
-
* Translators no longer need to be instantiated to be used
|
|
24
|
-
* 🔥 Change terrain format:
|
|
25
|
-
* Tiles are now defined via "masks", for ground height, texture, variation, etc.
|
|
26
|
-
* Before: `tiles` is an array of objects... `{ groundHeight, waterHeight, boundaryFlag, flags, groundTexture, groundVariation, cliffVariation, cliffTexture, layerHeight }`
|
|
27
|
-
* After: a one-dimensional array for each of the above fields... e.g. for a 64x64 map, `groundHeight` is an array of 65*65=4225 tile points
|
|
28
|
-
* Some fields have been renamed into camelCase for consistency:
|
|
29
|
-
* `customtileset` -> `customTileset`
|
|
30
|
-
* `tilepalette` -> `tilePalette`
|
|
31
|
-
* `clifftilepalette` -> `cliffTilePalette`
|
|
32
|
-
* Upgrade to latest file formats
|
|
33
|
-
* Sounds version upgraded from `1` -> `3`
|
|
34
|
-
* Info version upgraded from `25` -> `31`
|
|
35
|
-
* Add more type safety:
|
|
36
|
-
* Translator results from `jsonToWar()` and `warToJson()` are now typed by `WarResult` and `JsonResult`, respectively
|
|
37
|
-
* `JsonResult` is generically typed to describe what it contains (e.g. `Sound[]`)
|
|
38
|
-
* Introduced new `angle` type, which is an alias for `number`; `angle`'s should always be specified in degrees, not radians
|
|
39
|
-
## FIXES
|
|
40
|
-
* Resolve `[DEP0005] DeprecationWarning: Buffer()` warning in `HexBuffer.ts`
|
|
41
|
-
* Fix scoping issues on `*Translator.ts`, `HexBuffer.ts` and `W3Buffer.ts` where certain fields that should be `private` were marked as `public`
|
|
42
|
-
* Fix InfoTranslator reading random item table ID length as 1 instead of 4
|
|
43
|
-
* Fix potential null-terminator errors related to string or character-array fields
|
|
44
|
-
## MAINTENANCE
|
|
45
|
-
* Upgrade to Node 14.x LTS
|
|
46
|
-
* Upgrade to npm 7.x
|
|
47
|
-
* Upgrade `round-to` 4.1.0 -> 5.0.0
|
|
48
|
-
* Upgrade `@types/fs-extra` 8.1.0 -> 9.0.7
|
|
49
|
-
* Upgrade `@types/mocha` 7.0.1 -> 8.2.1
|
|
50
|
-
* Upgrade `@types/node` 12.12.28 -> 14.14.31
|
|
51
|
-
* Upgrade `fs-extra` 8.1.0 -> 9.1.0
|
|
52
|
-
* Upgrade `mocha` 7.0.1 -> 8.3.0
|
|
53
|
-
* Upgrade `nyc` 15.0.0 -> 15.1.0
|
|
54
|
-
* Upgrade `ts-node` 8.6.2 -> 9.1.1
|
|
55
|
-
* Upgrade `tslint` 6.0.0 -> 6.1.3
|
|
56
|
-
* Upgrade `typescript` 3.8.2 -> 4.2.2
|
|
57
|
-
* The project structure has changed:
|
|
58
|
-
* `examples` sub-project directory is removed
|
|
59
|
-
* Refer to `USAGE.md` for how to use the code
|
|
60
|
-
* Add all contributors to `package.json`
|
|
61
|
-
* Resolve all security issues via `npm audit fix` (5 low, 1 high, 1 critical)
|
|
62
|
-
## TESTING
|
|
63
|
-
* Travis CI will now use Node 14 LTS to build the project
|
|
64
|
-
* `test` directory now contains the WC3 and JSON data files the tests require
|
|
65
|
-
* Implement the StringsTranslator test
|
|
66
|
-
* Resolve all broken unit tests, most of them being reversion tests
|
|
67
|
-
<!--
|
|
68
|
-
# x.y.z (YYYY-MM-DD)
|
|
69
|
-
## SUMMARY
|
|
70
|
-
**🔥 Breaking changes**
|
|
71
|
-
## FEATURES
|
|
72
|
-
## FIXES
|
|
73
|
-
## MAINTENANCE
|
|
74
|
-
## TESTING
|
|
75
|
-
-->
|
|
76
|
-
|
|
77
|
-
# Previous versions
|
|
78
|
-
The `CHANGELOG.md` file was introduced with the 4.x release. For details on previous changes, please refer to https://github.com/ChiefOfGxBxL/WC3MapTranslator/releases.
|
package/index.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { CamerasTranslator, DoodadsTranslator, ImportsTranslator, InfoTranslator, ObjectsTranslator, RegionsTranslator, SoundsTranslator, StringsTranslator, TerrainTranslator, UnitsTranslator } from './lib/translators';
|
|
2
|
-
|
|
3
|
-
export {
|
|
4
|
-
CamerasTranslator,
|
|
5
|
-
DoodadsTranslator,
|
|
6
|
-
ImportsTranslator,
|
|
7
|
-
InfoTranslator,
|
|
8
|
-
ObjectsTranslator,
|
|
9
|
-
RegionsTranslator,
|
|
10
|
-
SoundsTranslator,
|
|
11
|
-
StringsTranslator,
|
|
12
|
-
TerrainTranslator,
|
|
13
|
-
UnitsTranslator
|
|
14
|
-
};
|
package/lib/AngleConverter.ts
DELETED
package/lib/CommonInterfaces.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @type angle - An angle is measured in degrees, 0 <= angle < 360
|
|
3
|
-
*/
|
|
4
|
-
export type angle = number;
|
|
5
|
-
|
|
6
|
-
// TranslationError is reserved for future use in case
|
|
7
|
-
// additional constraints are added to translated output,
|
|
8
|
-
// like if WC3 has maximum string lengths, or if certain
|
|
9
|
-
// values must be in a specific range
|
|
10
|
-
export interface TranslationError {
|
|
11
|
-
message: string
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface WarResult {
|
|
15
|
-
buffer: Buffer,
|
|
16
|
-
errors?: TranslationError[]
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface JsonResult<T = object> {
|
|
20
|
-
json: T,
|
|
21
|
-
errors?: TranslationError[]
|
|
22
|
-
}
|
package/test/.mocharc.json
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import assert from 'assert';
|
|
2
|
-
import { deg2Rad, rad2Deg } from '../lib/AngleConverter';
|
|
3
|
-
|
|
4
|
-
describe('AngleConverter', () => {
|
|
5
|
-
|
|
6
|
-
it('should convert degrees to radians', () => {
|
|
7
|
-
const angleInDegrees = 90;
|
|
8
|
-
const convertedToRadians = deg2Rad(angleInDegrees);
|
|
9
|
-
assert.equal(convertedToRadians, Math.PI / 2);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('should convert radians to degrees', () => {
|
|
13
|
-
const angleInRadians = Math.PI;
|
|
14
|
-
const convertedToDegrees = rad2Deg(angleInRadians);
|
|
15
|
-
assert.equal(convertedToDegrees, 180);
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
});
|
package/test/HexBufferTest.ts
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import assert from 'assert';
|
|
2
|
-
import { HexBuffer } from '../lib/HexBuffer';
|
|
3
|
-
|
|
4
|
-
let hexBuffer: HexBuffer;
|
|
5
|
-
|
|
6
|
-
describe('HexBuffer', () => {
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
// clear the buffer before each test in this block so we
|
|
10
|
-
// don't have to care about what we added in prior tests
|
|
11
|
-
hexBuffer = new HexBuffer();
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('should addString', () => {
|
|
15
|
-
const testWords = [
|
|
16
|
-
'Hallo, wêreld!', // Afrikaans
|
|
17
|
-
'Pershëndetje Botë', // Albanian
|
|
18
|
-
'أهلاً بالعالم', // Arabic
|
|
19
|
-
'Բարե՛ւ, աշխարհ։', // Armenian
|
|
20
|
-
'Salam Dünya', // Azeri
|
|
21
|
-
'Ahoj Světe!', // Czech
|
|
22
|
-
'Kaixo mundua!', // Basque/Euskara
|
|
23
|
-
'Прывітанне свет', // Belarusian
|
|
24
|
-
'Shani Mwechalo!', // Bemba
|
|
25
|
-
'Shagatam Prithivi!', // Bengali
|
|
26
|
-
'Zdravo Svijete!', // Bosnian
|
|
27
|
-
'Здравей, свят!', // Bulgarian
|
|
28
|
-
'ជំរាបសួរ ពិភពលោក', // Cambodian
|
|
29
|
-
'Hola món!', // Catalan
|
|
30
|
-
'你好世界', // Chinese
|
|
31
|
-
'ᎣᏏᏲ ᎡᎶᎯ', // Cherokee
|
|
32
|
-
'Klahowya Hayas Klaska', // Chinook Wawa
|
|
33
|
-
'Bok Svijete!', // Croatian
|
|
34
|
-
'Hej, Verden!', // Danish
|
|
35
|
-
'Hallo, wereld!', // Dutch
|
|
36
|
-
'Hello World!', // English
|
|
37
|
-
'Saluton mondo!', // Esperanto
|
|
38
|
-
'Tere maailm!', // Estonian
|
|
39
|
-
'Hei maailma!', // Finnish
|
|
40
|
-
'Salut le Monde!', // French
|
|
41
|
-
'Hallo, wrâld!', // Frisian
|
|
42
|
-
'Ola mundo!', // Galician
|
|
43
|
-
'Hallo Welt!', // German
|
|
44
|
-
'Γεια σου κόσμε!', // Greek
|
|
45
|
-
'Aloha Honua', // Hawaiian
|
|
46
|
-
'שלום עולם', // Hebrew
|
|
47
|
-
'नमस्ते दुनिया', // Hindi
|
|
48
|
-
'Nyob zoo ntiaj teb.', // Hmong
|
|
49
|
-
'Helló világ!', // Hungarian
|
|
50
|
-
'Halló heimur!', // Icelandic
|
|
51
|
-
'Ndewo Ụwa', // Igbo
|
|
52
|
-
'Halo Dunia!', // Indonesian
|
|
53
|
-
'Dia dhaoibh, a dhomhain!', // Irish
|
|
54
|
-
'Ciao Mondo!', // Italian
|
|
55
|
-
'こんにちは、 世界!', // Japanese
|
|
56
|
-
'ಹಲೋ ವರ್ಲ್ಡ್', // Kannada
|
|
57
|
-
'Habari dunia!', // Kiswahili
|
|
58
|
-
'Niatia thi!', // Kikuyu
|
|
59
|
-
'nuqneH', // Klingon
|
|
60
|
-
'반갑다 세상아', // Korean
|
|
61
|
-
'ສະບາຍດີ,ໂລກ', // Lao
|
|
62
|
-
'AVE MVNDE', // Latin
|
|
63
|
-
'Sveika, Pasaule!', // Latvian
|
|
64
|
-
'Sveikas, Pasauli', // Lithuanian
|
|
65
|
-
'coi li terdi', // Lojban
|
|
66
|
-
'Moien Welt!', // Luxembourgish
|
|
67
|
-
'Manao ahoana ry tany!', // Malagasy
|
|
68
|
-
'Namaskaram, lokame', // Malayalam
|
|
69
|
-
'Merhba lid-dinja', // Maltese
|
|
70
|
-
'Hallo verden!', // Norwegian
|
|
71
|
-
'!سلام دنیا', // Persian
|
|
72
|
-
'Witaj świecie!', // Polish
|
|
73
|
-
'Olá, mundo!', // Portuguese
|
|
74
|
-
'ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ ਦੁਨਿਆ', // Punjabi
|
|
75
|
-
'Salut lume!', // Romanian
|
|
76
|
-
'Здравствуй, мир!', // Russian
|
|
77
|
-
'Halò, a Shaoghail!', // Scots Gaelic
|
|
78
|
-
'Zdravo Svete!', // Serbian
|
|
79
|
-
'Ahoj, svet!', // Slovak
|
|
80
|
-
'Pozdravljen svet!', // Slovenian
|
|
81
|
-
'¡Hola mundo!', // Spanish
|
|
82
|
-
'Hallå världen!', // Swedish
|
|
83
|
-
'Kamusta mundo!', // Tagalog
|
|
84
|
-
'ஹலோ உலகம்', // Tamil
|
|
85
|
-
'హలో వరల్డ్', // Telugu
|
|
86
|
-
'สวัสดีโลก!', // Thai
|
|
87
|
-
'Merhaba Dünya!', // Turkish
|
|
88
|
-
'Привiт, свiте!', // Ukrainian
|
|
89
|
-
'ہیلو دنیا والو', // Urdu
|
|
90
|
-
'Xin chào thế giới', // Vietnamese
|
|
91
|
-
'S\'mae byd!', // Welsh
|
|
92
|
-
'העלא וועלט', // Yiddish
|
|
93
|
-
'Sawubona Mhlaba' // Zulu
|
|
94
|
-
];
|
|
95
|
-
|
|
96
|
-
let totalLength = 0;
|
|
97
|
-
// tslint:disable-next-line: forin
|
|
98
|
-
for (const word of testWords) {
|
|
99
|
-
const bufLength = Buffer.from(word).length;
|
|
100
|
-
hexBuffer.addString(word);
|
|
101
|
-
totalLength += bufLength + 1; // adding one accounts for the null terminator at the end of the string
|
|
102
|
-
const bufferLength = hexBuffer.getBuffer().length;
|
|
103
|
-
assert.equal(bufferLength, totalLength);
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('should addNewLine', () => {
|
|
108
|
-
hexBuffer.addNewLine();
|
|
109
|
-
assert.equal(hexBuffer.getBuffer().length, 2);
|
|
110
|
-
assert.equal(hexBuffer.getBuffer()[0], 0x0d);
|
|
111
|
-
assert.equal(hexBuffer.getBuffer()[1], 0x0a);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('should addChar', () => {
|
|
115
|
-
hexBuffer.addChar('A');
|
|
116
|
-
assert.equal(hexBuffer.getBuffer().length, 1);
|
|
117
|
-
assert.equal(hexBuffer.getBuffer()[0], 65); // charcode for the ASCII letter "A"
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it('should addChars', () => {
|
|
121
|
-
hexBuffer.addChars('ABCD');
|
|
122
|
-
assert.equal(hexBuffer.getBuffer().length, 4);
|
|
123
|
-
assert.equal(hexBuffer.getBuffer()[0], 65); // charcode for the ASCII letter "A"
|
|
124
|
-
assert.equal(hexBuffer.getBuffer()[1], 66); // charcode for the ASCII letter "B"
|
|
125
|
-
assert.equal(hexBuffer.getBuffer()[2], 67); // charcode for the ASCII letter "C"
|
|
126
|
-
assert.equal(hexBuffer.getBuffer()[3], 68); // charcode for the ASCII letter "D"
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('should addInt', () => {
|
|
130
|
-
hexBuffer.addInt(0);
|
|
131
|
-
assert.equal(hexBuffer.getBuffer().length, 4); // integer is 4 bytes in length
|
|
132
|
-
assert.equal(hexBuffer.getBuffer()[0], 0x00);
|
|
133
|
-
assert.equal(hexBuffer.getBuffer()[1], 0x00);
|
|
134
|
-
assert.equal(hexBuffer.getBuffer()[2], 0x00);
|
|
135
|
-
assert.equal(hexBuffer.getBuffer()[3], 0x00);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it('should addShort', () => {
|
|
139
|
-
hexBuffer.addShort(14);
|
|
140
|
-
assert.equal(hexBuffer.getBuffer().length, 2); // 2 bytes in length
|
|
141
|
-
assert.equal(hexBuffer.getBuffer()[0], 0x0e);
|
|
142
|
-
assert.equal(hexBuffer.getBuffer()[1], 0x00);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it('should addFloat', () => {
|
|
146
|
-
hexBuffer.addFloat(1.234);
|
|
147
|
-
assert.equal(hexBuffer.getBuffer().length, 4); // 4 bytes in length
|
|
148
|
-
assert.equal(hexBuffer.getBuffer()[0], 0xb6);
|
|
149
|
-
assert.equal(hexBuffer.getBuffer()[1], 0xf3);
|
|
150
|
-
assert.equal(hexBuffer.getBuffer()[2], 0x9d);
|
|
151
|
-
assert.equal(hexBuffer.getBuffer()[3], 0x3f);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('should addByte', () => {
|
|
155
|
-
hexBuffer.addByte(15);
|
|
156
|
-
assert.equal(hexBuffer.getBuffer()[0], 15);
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it('should addNullTerminator', () => {
|
|
160
|
-
hexBuffer.addNullTerminator();
|
|
161
|
-
assert.equal(hexBuffer.getBuffer().length, 1);
|
|
162
|
-
assert.equal(hexBuffer.getBuffer()[0], 0);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('should getBuffer', () => {
|
|
166
|
-
hexBuffer.addString('');
|
|
167
|
-
assert(hexBuffer.getBuffer()); // test if this function works
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
});
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import assert from 'assert';
|
|
2
|
-
import * as diff from 'diff-buf';
|
|
3
|
-
import * as fs from 'fs-extra';
|
|
4
|
-
import * as Path from 'path';
|
|
5
|
-
|
|
6
|
-
import * as Translator from '../index';
|
|
7
|
-
|
|
8
|
-
const ObjectType = Translator.ObjectsTranslator.ObjectType;
|
|
9
|
-
const war3mapDir = Path.resolve('test/data');
|
|
10
|
-
const outputDir = Path.resolve('test/.output');
|
|
11
|
-
|
|
12
|
-
function readWar3MapBuffer(filename: string) {
|
|
13
|
-
return fs.readFileSync(Path.join(war3mapDir, filename));
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function readJsonTestFile(filename: string) {
|
|
17
|
-
return fs.readJsonSync(Path.join(war3mapDir, filename));
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function writeJsonTestFile(filename: string, json: object) {
|
|
21
|
-
return fs.writeJsonSync(Path.join(outputDir, filename), json);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function buffersAreEqual(b1: Buffer, b2: Buffer) {
|
|
25
|
-
const comparison = diff.default(b1, b2, { string: false });
|
|
26
|
-
|
|
27
|
-
// Library `diff` returns an array of objects documenting comparison
|
|
28
|
-
// e.g. { added: undefined, removed: undefined, value: 10 }
|
|
29
|
-
// We want all `added` and `removed` fields to be "undefined" for
|
|
30
|
-
// the buffers to be considered equal
|
|
31
|
-
let buffersEqual = true;
|
|
32
|
-
comparison.forEach((compare) => {
|
|
33
|
-
if (compare.added || compare.removed) {
|
|
34
|
-
buffersEqual = false;
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
return buffersEqual;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Ensures that when a JSON file is converted to war3map and back again,
|
|
42
|
-
// the two JSON files are the same; converting between the two data formats
|
|
43
|
-
// must yield the original results back (except for some differences in rounding)
|
|
44
|
-
describe('Reversion: json -> war -> json', () => {
|
|
45
|
-
|
|
46
|
-
before(() => {
|
|
47
|
-
fs.emptyDirSync(outputDir);
|
|
48
|
-
fs.ensureDirSync(outputDir);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('Doodads reversion', () => {
|
|
52
|
-
const originalJson = readJsonTestFile('doodads.json');
|
|
53
|
-
const translatedBuffer = Translator.DoodadsTranslator.jsonToWar(originalJson).buffer;
|
|
54
|
-
const translatedJson = Translator.DoodadsTranslator.warToJson(translatedBuffer).json;
|
|
55
|
-
|
|
56
|
-
writeJsonTestFile('doodads.json', translatedJson);
|
|
57
|
-
|
|
58
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('Strings reversion', () => {
|
|
62
|
-
const originalJson = readJsonTestFile('strings.json');
|
|
63
|
-
const translatedBuffer = Translator.StringsTranslator.jsonToWar(originalJson).buffer;
|
|
64
|
-
const translatedJson = Translator.StringsTranslator.warToJson(translatedBuffer).json;
|
|
65
|
-
|
|
66
|
-
writeJsonTestFile('strings.json', translatedJson);
|
|
67
|
-
|
|
68
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('Terrain reversion', () => {
|
|
72
|
-
const originalJson = readJsonTestFile('terrain.json');
|
|
73
|
-
const translatedBuffer = Translator.TerrainTranslator.jsonToWar(originalJson).buffer;
|
|
74
|
-
const translatedJson = Translator.TerrainTranslator.warToJson(translatedBuffer).json;
|
|
75
|
-
|
|
76
|
-
writeJsonTestFile('terrain.json', translatedJson);
|
|
77
|
-
|
|
78
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('Units reversion', () => {
|
|
82
|
-
const originalJson = readJsonTestFile('units.json');
|
|
83
|
-
const translatedBuffer = Translator.UnitsTranslator.jsonToWar(originalJson).buffer;
|
|
84
|
-
const translatedJson = Translator.UnitsTranslator.warToJson(translatedBuffer).json;
|
|
85
|
-
|
|
86
|
-
writeJsonTestFile('units.json', translatedJson);
|
|
87
|
-
|
|
88
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('Regions reversion', () => {
|
|
92
|
-
const originalJson = readJsonTestFile('regions.json');
|
|
93
|
-
const translatedBuffer = Translator.RegionsTranslator.jsonToWar(originalJson).buffer;
|
|
94
|
-
const translatedJson = Translator.RegionsTranslator.warToJson(translatedBuffer).json;
|
|
95
|
-
|
|
96
|
-
writeJsonTestFile('regions.json', translatedJson);
|
|
97
|
-
|
|
98
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it('Cameras reversion', () => {
|
|
102
|
-
const originalJson = readJsonTestFile('cameras.json');
|
|
103
|
-
const translatedBuffer = Translator.CamerasTranslator.jsonToWar(originalJson).buffer;
|
|
104
|
-
const translatedJson = Translator.CamerasTranslator.warToJson(translatedBuffer).json;
|
|
105
|
-
|
|
106
|
-
writeJsonTestFile('cameras.json', translatedJson);
|
|
107
|
-
|
|
108
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('Sounds reversion', () => {
|
|
112
|
-
const originalJson = readJsonTestFile('sounds.json');
|
|
113
|
-
const translatedBuffer = Translator.SoundsTranslator.jsonToWar(originalJson).buffer;
|
|
114
|
-
const translatedJson = Translator.SoundsTranslator.warToJson(translatedBuffer).json;
|
|
115
|
-
|
|
116
|
-
writeJsonTestFile('sounds.json', translatedJson);
|
|
117
|
-
|
|
118
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('Units (Object) reversion', () => {
|
|
122
|
-
const originalJson = readJsonTestFile('obj-units.json');
|
|
123
|
-
const objectType = Translator.ObjectsTranslator.ObjectType.Units;
|
|
124
|
-
const translatedBuffer = Translator.ObjectsTranslator.jsonToWar(objectType, originalJson).buffer;
|
|
125
|
-
const translatedJson = Translator.ObjectsTranslator.warToJson(objectType, translatedBuffer).json;
|
|
126
|
-
|
|
127
|
-
writeJsonTestFile('obj-units.json', translatedJson);
|
|
128
|
-
|
|
129
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it('Items (Object) reversion', () => {
|
|
133
|
-
const originalJson = readJsonTestFile('obj-items.json');
|
|
134
|
-
const objectType = Translator.ObjectsTranslator.ObjectType.Items;
|
|
135
|
-
const translatedBuffer = Translator.ObjectsTranslator.jsonToWar(objectType, originalJson).buffer;
|
|
136
|
-
const translatedJson = Translator.ObjectsTranslator.warToJson(objectType, translatedBuffer).json;
|
|
137
|
-
|
|
138
|
-
writeJsonTestFile('obj-items.json', translatedJson);
|
|
139
|
-
|
|
140
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('Destructables (Object) reversion', () => {
|
|
144
|
-
const originalJson = readJsonTestFile('obj-destructables.json');
|
|
145
|
-
const objectType = Translator.ObjectsTranslator.ObjectType.Destructables;
|
|
146
|
-
const translatedBuffer = Translator.ObjectsTranslator.jsonToWar(objectType, originalJson).buffer;
|
|
147
|
-
const translatedJson = Translator.ObjectsTranslator.warToJson(objectType, translatedBuffer).json;
|
|
148
|
-
|
|
149
|
-
writeJsonTestFile('obj-destructables.json', translatedJson);
|
|
150
|
-
|
|
151
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('Doodads (Object) reversion', () => {
|
|
155
|
-
const originalJson = readJsonTestFile('obj-doodads.json');
|
|
156
|
-
const objectType = Translator.ObjectsTranslator.ObjectType.Doodads;
|
|
157
|
-
const translatedBuffer = Translator.ObjectsTranslator.jsonToWar(objectType, originalJson).buffer;
|
|
158
|
-
const translatedJson = Translator.ObjectsTranslator.warToJson(objectType, translatedBuffer).json;
|
|
159
|
-
|
|
160
|
-
writeJsonTestFile('obj-doodads.json', translatedJson);
|
|
161
|
-
|
|
162
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('Abilities (Object) reversion', () => {
|
|
166
|
-
const originalJson = readJsonTestFile('obj-abilities.json');
|
|
167
|
-
const objectType = Translator.ObjectsTranslator.ObjectType.Abilities;
|
|
168
|
-
const translatedBuffer = Translator.ObjectsTranslator.jsonToWar(objectType, originalJson).buffer;
|
|
169
|
-
const translatedJson = Translator.ObjectsTranslator.warToJson(objectType, translatedBuffer).json;
|
|
170
|
-
|
|
171
|
-
writeJsonTestFile('obj-abilities.json', translatedJson);
|
|
172
|
-
|
|
173
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
it('Buffs (Object) reversion', () => {
|
|
177
|
-
const originalJson = readJsonTestFile('obj-buffs.json');
|
|
178
|
-
const objectType = Translator.ObjectsTranslator.ObjectType.Buffs;
|
|
179
|
-
const translatedBuffer = Translator.ObjectsTranslator.jsonToWar(objectType, originalJson).buffer;
|
|
180
|
-
const translatedJson = Translator.ObjectsTranslator.warToJson(objectType, translatedBuffer).json;
|
|
181
|
-
|
|
182
|
-
writeJsonTestFile('obj-buffs.json', translatedJson);
|
|
183
|
-
|
|
184
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it('Upgrades (Object) reversion', () => {
|
|
188
|
-
const originalJson = readJsonTestFile('obj-upgrades.json');
|
|
189
|
-
const objectType = Translator.ObjectsTranslator.ObjectType.Upgrades;
|
|
190
|
-
const translatedBuffer = Translator.ObjectsTranslator.jsonToWar(objectType, originalJson).buffer;
|
|
191
|
-
const translatedJson = Translator.ObjectsTranslator.warToJson(objectType, translatedBuffer).json;
|
|
192
|
-
|
|
193
|
-
writeJsonTestFile('obj-upgrades.json', translatedJson);
|
|
194
|
-
|
|
195
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it('Info reversion', () => {
|
|
199
|
-
const originalJson = readJsonTestFile('info.json');
|
|
200
|
-
const translatedBuffer = Translator.InfoTranslator.jsonToWar(originalJson).buffer;
|
|
201
|
-
const translatedJson = Translator.InfoTranslator.warToJson(translatedBuffer).json;
|
|
202
|
-
|
|
203
|
-
writeJsonTestFile('info.json', translatedJson);
|
|
204
|
-
|
|
205
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it('Imports reversion', () => {
|
|
209
|
-
const originalJson = readJsonTestFile('imports.json');
|
|
210
|
-
const translatedBuffer = Translator.ImportsTranslator.jsonToWar(originalJson).buffer;
|
|
211
|
-
const translatedJson = Translator.ImportsTranslator.warToJson(translatedBuffer).json;
|
|
212
|
-
|
|
213
|
-
writeJsonTestFile('imports.json', translatedJson);
|
|
214
|
-
|
|
215
|
-
assert.deepStrictEqual(originalJson, translatedJson);
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
});
|
package/test/W3BufferTest.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import assert from 'assert';
|
|
2
|
-
import { W3Buffer } from '../lib/W3Buffer';
|
|
3
|
-
|
|
4
|
-
// This is a hard-coded buffer to test all the reading methods
|
|
5
|
-
// on W3Buffer. It consists of, in this order:
|
|
6
|
-
// char(4), int, float, string(7 Ws), byte
|
|
7
|
-
const buffData = Buffer.from([
|
|
8
|
-
0x01, 0x00, 0x00, 0x00, // int: 1
|
|
9
|
-
0x81, 0x70, // short: 28801
|
|
10
|
-
0x00, 0x00, 0x9b, 0xc5, // float: -4960
|
|
11
|
-
0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x00, // string: "WWWWWWW"
|
|
12
|
-
0x57, 0x33, 0x64, 0x6f, // char(4): "W3do"
|
|
13
|
-
0x57, // char(1): "W"
|
|
14
|
-
0x02 // byte: 2
|
|
15
|
-
]);
|
|
16
|
-
|
|
17
|
-
const w3buffer = new W3Buffer(buffData);
|
|
18
|
-
|
|
19
|
-
describe('W3Buffer', () => {
|
|
20
|
-
|
|
21
|
-
it('should readInt', () => {
|
|
22
|
-
assert.equal(w3buffer.readInt(), 1);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('should readShort', () => {
|
|
26
|
-
assert.equal(w3buffer.readShort(), 28801);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('should readFloat', () => {
|
|
30
|
-
assert.equal(w3buffer.readFloat(), -4960);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should readString', () => {
|
|
34
|
-
assert.equal(w3buffer.readString(), 'WWWWWWW');
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('should readChars', () => {
|
|
38
|
-
assert.equal(w3buffer.readChars(4), 'W3do');
|
|
39
|
-
assert.equal(w3buffer.readChars(), 'W')
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('should readByte', () => {
|
|
43
|
-
assert.equal(w3buffer.readByte(), 2);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should be exhausted', () => {
|
|
47
|
-
assert.ok(w3buffer.isExhausted());
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
});
|