brs-js 2.0.1 → 2.0.4

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.
Files changed (81) hide show
  1. package/debug/Conf Spacestation.brs +0 -0
  2. package/debug/Electrks_Feminine_Challenge.brs +0 -0
  3. package/debug/a5bricks.brs +0 -0
  4. package/debug/a5p2.2.brs +0 -0
  5. package/debug/a5p2.brs +0 -0
  6. package/debug/audio.brs +0 -0
  7. package/debug/brick a5.brs +0 -0
  8. package/debug/brick qa.brs +0 -0
  9. package/debug/brsv10.brs +0 -0
  10. package/debug/brsv10brick.brs +0 -0
  11. package/debug/bruteforce.js +254 -0
  12. package/debug/clone.html +36 -0
  13. package/debug/ctf_tileset.brs +0 -0
  14. package/debug/ctf_tileset_5.brs +0 -0
  15. package/debug/evil.brs +0 -0
  16. package/debug/evilwrite.js +390 -0
  17. package/debug/foo.txt +3080 -0
  18. package/debug/kenko_big.brs +0 -0
  19. package/debug/light.brs +0 -0
  20. package/debug/out.json +105 -0
  21. package/debug/read.js +30 -0
  22. package/debug/readSpeed.js +32 -0
  23. package/debug/readTest.js +45 -0
  24. package/debug/temp.brs +0 -0
  25. package/debug/western.brs +0 -0
  26. package/dist/dist.js +1 -1
  27. package/dist/dist.node.js +1 -1
  28. package/dist/dist.web.js +1 -1
  29. package/dist/src/constants.d.ts +6 -0
  30. package/dist/src/constants.d.ts.map +1 -0
  31. package/dist/src/index.d.ts +24 -0
  32. package/dist/src/index.d.ts.map +1 -0
  33. package/dist/src/read.d.ts +3 -0
  34. package/dist/src/read.d.ts.map +1 -0
  35. package/dist/src/read.v1.d.ts +3 -0
  36. package/dist/src/read.v1.d.ts.map +1 -0
  37. package/dist/src/read.v10.d.ts +3 -0
  38. package/dist/src/read.v10.d.ts.map +1 -0
  39. package/dist/src/read.v2.d.ts +3 -0
  40. package/dist/src/read.v2.d.ts.map +1 -0
  41. package/dist/src/read.v3.d.ts +3 -0
  42. package/dist/src/read.v3.d.ts.map +1 -0
  43. package/dist/src/read.v4.d.ts +3 -0
  44. package/dist/src/read.v4.d.ts.map +1 -0
  45. package/dist/src/read.v8.d.ts +3 -0
  46. package/dist/src/read.v8.d.ts.map +1 -0
  47. package/dist/src/read.v9.d.ts +3 -0
  48. package/dist/src/read.v9.d.ts.map +1 -0
  49. package/dist/src/types.d.ts +286 -0
  50. package/dist/src/types.d.ts.map +1 -0
  51. package/dist/src/utils.d.ts +87 -0
  52. package/dist/src/utils.d.ts.map +1 -0
  53. package/dist/src/uuid.d.ts +4 -0
  54. package/dist/src/uuid.d.ts.map +1 -0
  55. package/dist/src/write.d.ts +3 -0
  56. package/dist/src/write.d.ts.map +1 -0
  57. package/examples/ATCFort.brs +0 -0
  58. package/examples/read_example.html +34 -0
  59. package/examples/read_example.js +21 -0
  60. package/examples/write_example.js +25 -0
  61. package/examples/write_planet.html +144 -0
  62. package/examples/write_simplex.html +82 -0
  63. package/examples/write_wedge_sphere.html +173 -0
  64. package/package.json +1 -1
  65. package/src/constants.ts +6 -0
  66. package/src/index.ts +25 -0
  67. package/src/read.ts +57 -0
  68. package/src/read.v1.ts +99 -0
  69. package/src/read.v10.ts +185 -0
  70. package/src/read.v2.ts +102 -0
  71. package/src/read.v3.ts +111 -0
  72. package/src/read.v4.ts +112 -0
  73. package/src/read.v8.ts +172 -0
  74. package/src/read.v9.ts +181 -0
  75. package/src/types.ts +354 -0
  76. package/src/utils.ts +640 -0
  77. package/src/uuid.ts +78 -0
  78. package/src/write.ts +209 -0
  79. package/test/lib.test.js +51 -0
  80. package/test/utils.test.js +209 -0
  81. package/tsconfig.json +1 -5
@@ -0,0 +1,286 @@
1
+ export interface BRSBytes extends Uint8Array {
2
+ brsOffset: number;
3
+ }
4
+ declare type Modify<T, R> = Omit<T, keyof R> & R;
5
+ export declare type Bytes = Uint8Array | BRSBytes;
6
+ export declare type Uuid = string;
7
+ export declare type UnrealClass = string;
8
+ export declare type UnrealObject = string;
9
+ export declare type UnrealBoolean = boolean;
10
+ export declare type UnrealFloat = number;
11
+ export declare type UnrealColor = [number, number, number, number];
12
+ export declare type UnrealByte = number;
13
+ export declare type UnrealRotator = [number, number, number];
14
+ export declare type UnrealType = UnrealClass | UnrealObject | UnrealBoolean | UnrealFloat | UnrealColor | UnrealByte | UnrealRotator;
15
+ export interface User {
16
+ id: Uuid;
17
+ name: string;
18
+ }
19
+ export interface Owner extends User {
20
+ bricks: number;
21
+ }
22
+ export declare enum Direction {
23
+ XPositive = 0,
24
+ XNegative = 1,
25
+ YPositive = 2,
26
+ YNegative = 3,
27
+ ZPositive = 4,
28
+ ZNegative = 5
29
+ }
30
+ export declare enum Rotation {
31
+ Deg0 = 0,
32
+ Deg90 = 1,
33
+ Deg180 = 2,
34
+ Deg270 = 3
35
+ }
36
+ export declare type ColorRgb = [number, number, number];
37
+ export interface Collision {
38
+ player: boolean;
39
+ weapon: boolean;
40
+ interaction: boolean;
41
+ tool: boolean;
42
+ }
43
+ export interface AppliedComponent {
44
+ [property: string]: UnrealType;
45
+ }
46
+ export interface DefinedComponents {
47
+ BCD_SpotLight?: {
48
+ version: 1;
49
+ brick_indices: number[];
50
+ properties: {
51
+ Rotation: 'Rotator';
52
+ InnerConeAngle: 'Float';
53
+ OuterConeAngle: 'Float';
54
+ Brightness: 'Float';
55
+ Radius: 'Float';
56
+ Color: 'Color';
57
+ bUseBrickColor: 'Boolean';
58
+ bCastShadows: 'Boolean';
59
+ };
60
+ };
61
+ BCD_PointLight?: {
62
+ version: 1;
63
+ brick_indices: number[];
64
+ properties: {
65
+ bMatchBrickShape: 'Boolean';
66
+ Brightness: 'Float';
67
+ Radius: 'Float';
68
+ Color: 'Color';
69
+ bUseBrickColor: 'Boolean';
70
+ bCastShadows: 'Boolean';
71
+ };
72
+ };
73
+ BCD_ItemSpawn?: {
74
+ version: 1;
75
+ brick_indices: number[];
76
+ properties: {
77
+ PickupClass: 'Class';
78
+ bPickupEnabled: 'Boolean';
79
+ bPickupRespawnOnMinigameReset: 'Boolean';
80
+ PickupMinigameResetRespawnDelay: 'Float';
81
+ bPickupAutoDisableOnPickup: 'Boolean';
82
+ PickupRespawnTime: 'Float';
83
+ PickupOffsetDirection: 'Byte';
84
+ PickupOffsetDistance: 'Float';
85
+ PickupRotation: 'Rotator';
86
+ PickupScale: 'Float';
87
+ bPickupAnimationEnabled: 'Boolean';
88
+ PickupAnimationAxis: 'Byte';
89
+ bPickupAnimationAxisLocal: 'Boolean';
90
+ PickupSpinSpeed: 'Float';
91
+ PickupBobSpeed: 'Float';
92
+ PickupBobHeight: 'Float';
93
+ PickupAnimationPhase: 'Float';
94
+ };
95
+ };
96
+ BCD_Interact?: {
97
+ version: 1;
98
+ brick_indices: number[];
99
+ properties: {
100
+ bPlayInteractSound: 'Boolean';
101
+ };
102
+ };
103
+ BCD_AudioEmitter?: {
104
+ version: 1;
105
+ brick_indices: number[];
106
+ properties: {
107
+ AudioDescriptor: 'Object';
108
+ VolumeMultiplier: 'Float';
109
+ PitchMultiplier: 'Float';
110
+ InnerRadius: 'Float';
111
+ MaxDistance: 'Float';
112
+ bSpatialization: 'Boolean';
113
+ };
114
+ };
115
+ [component_name: string]: {
116
+ version: number;
117
+ brick_indices: number[];
118
+ properties: {
119
+ [property: string]: string;
120
+ };
121
+ };
122
+ }
123
+ export interface Components {
124
+ BCD_SpotLight?: {
125
+ Rotation: UnrealRotator;
126
+ InnerConeAngle: UnrealFloat;
127
+ OuterConeAngle: UnrealFloat;
128
+ Brightness: UnrealFloat;
129
+ Radius: UnrealFloat;
130
+ Color: UnrealColor;
131
+ bUseBrickColor: UnrealBoolean;
132
+ bCastShadows: UnrealBoolean;
133
+ };
134
+ BCD_PointLight?: {
135
+ bMatchBrickShape: UnrealBoolean;
136
+ Brightness: UnrealFloat;
137
+ Radius: UnrealFloat;
138
+ Color: UnrealColor;
139
+ bUseBrickColor: UnrealBoolean;
140
+ bCastShadows: UnrealBoolean;
141
+ };
142
+ BCD_ItemSpawn?: {
143
+ PickupClass: UnrealClass;
144
+ bPickupEnabled: UnrealBoolean;
145
+ bPickupRespawnOnMinigameReset: UnrealBoolean;
146
+ PickupMinigameResetRespawnDelay: UnrealFloat;
147
+ bPickupAutoDisableOnPickup: UnrealBoolean;
148
+ PickupRespawnTime: UnrealFloat;
149
+ PickupOffsetDirection: UnrealByte;
150
+ PickupOffsetDistance: UnrealFloat;
151
+ PickupRotation: UnrealRotator;
152
+ PickupScale: UnrealFloat;
153
+ bPickupAnimationEnabled: UnrealBoolean;
154
+ PickupAnimationAxis: UnrealByte;
155
+ bPickupAnimationAxisLocal: UnrealBoolean;
156
+ PickupSpinSpeed: UnrealFloat;
157
+ PickupBobSpeed: UnrealFloat;
158
+ PickupBobHeight: UnrealFloat;
159
+ PickupAnimationPhase: UnrealFloat;
160
+ };
161
+ BCD_Interact?: {
162
+ bPlayInteractSound: UnrealBoolean;
163
+ };
164
+ BCD_AudioEmitter?: {
165
+ AudioDescriptor: UnrealObject;
166
+ VolumeMultiplier: UnrealFloat;
167
+ PitchMultiplier: UnrealFloat;
168
+ InnerRadius: UnrealFloat;
169
+ MaxDistance: UnrealFloat;
170
+ bSpatialization: UnrealBoolean;
171
+ };
172
+ [component_name: string]: AppliedComponent;
173
+ }
174
+ export declare type Vector = [number, number, number];
175
+ export interface BrickV1 {
176
+ asset_name_index: number;
177
+ size: Vector;
178
+ position: Vector;
179
+ direction: Direction;
180
+ rotation: Rotation;
181
+ collision: boolean;
182
+ visibility: boolean;
183
+ color: UnrealColor | number;
184
+ }
185
+ export interface BrickV2 extends BrickV1 {
186
+ material_index: number;
187
+ }
188
+ export interface BrickV3 extends BrickV2 {
189
+ owner_index: number;
190
+ }
191
+ export interface BrickV8 extends BrickV3 {
192
+ components: Components;
193
+ }
194
+ export declare type BrickV9 = Modify<BrickV8, {
195
+ physical_index: number;
196
+ material_intensity: number;
197
+ color: ColorRgb | number;
198
+ }>;
199
+ export declare type BrickV10 = Modify<BrickV9, {
200
+ collision: Collision;
201
+ }>;
202
+ export interface BrsV1 {
203
+ version: 1;
204
+ map: string;
205
+ author: User;
206
+ description: string;
207
+ brick_count: number;
208
+ mods: string[];
209
+ brick_assets: string[];
210
+ colors: UnrealColor[];
211
+ bricks: BrickV1[];
212
+ }
213
+ export declare type BrsV2 = Modify<BrsV1, {
214
+ version: 2;
215
+ materials: string[];
216
+ bricks: BrickV2[];
217
+ }>;
218
+ export declare type BrsV3 = Modify<BrsV2, {
219
+ version: 3;
220
+ brick_owners: User[];
221
+ bricks: BrickV3[];
222
+ }>;
223
+ export declare type BrsV4 = Modify<BrsV3, {
224
+ version: 4;
225
+ save_time: Uint8Array;
226
+ }>;
227
+ export declare type BrsV8 = Modify<BrsV4, {
228
+ version: 8;
229
+ host: User;
230
+ brick_owners: Owner[];
231
+ preview?: Bytes;
232
+ game_version: number;
233
+ bricks: BrickV8[];
234
+ components: DefinedComponents;
235
+ }>;
236
+ export declare type BrsV9 = Modify<BrsV8, {
237
+ version: 9;
238
+ physical_materials: string[];
239
+ bricks: BrickV9[];
240
+ }>;
241
+ export declare type BrsV10 = Modify<BrsV9, {
242
+ version: 10;
243
+ bricks: BrickV10[];
244
+ }>;
245
+ export declare type ReadSaveObject = BrsV1 | BrsV2 | BrsV3 | BrsV4 | BrsV8 | BrsV9 | BrsV10;
246
+ export interface Brick {
247
+ asset_name_index?: number;
248
+ size: Vector;
249
+ position: Vector;
250
+ direction?: Direction;
251
+ rotation?: Rotation;
252
+ collision?: boolean | Partial<Collision>;
253
+ visibility?: boolean;
254
+ material_index?: number;
255
+ physical_index?: number;
256
+ material_intensity?: number;
257
+ color?: ColorRgb | number;
258
+ owner_index?: number;
259
+ components?: Components;
260
+ }
261
+ export interface WriteSaveObject {
262
+ game_version?: number;
263
+ map?: string;
264
+ description?: string;
265
+ author?: Partial<User>;
266
+ host?: Partial<User>;
267
+ mods?: string[];
268
+ brick_assets?: string[];
269
+ colors?: UnrealColor[];
270
+ materials?: string[];
271
+ brick_owners?: Partial<Owner>[];
272
+ physical_materials?: string[];
273
+ preview?: Bytes;
274
+ bricks: Brick[];
275
+ save_time?: ArrayLike<number>;
276
+ components?: DefinedComponents;
277
+ }
278
+ export interface ReadOptions {
279
+ bricks?: boolean;
280
+ preview?: boolean;
281
+ }
282
+ export interface WriteOptions {
283
+ compress?: boolean;
284
+ }
285
+ export {};
286
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { BRSBytes, Bytes, UnrealFloat, UnrealType, Uuid } from './types';
2
+ export declare const bgra: ([b, g, r, a]: number[]) => [
3
+ number,
4
+ number,
5
+ number,
6
+ number
7
+ ];
8
+ export declare function isEqual<T>(arrA: Array<T>, arrB: Array<T>): boolean;
9
+ export declare function subarray(data: Bytes, len: number, isCopy?: boolean): Uint8Array;
10
+ export declare function chunk(arr: Bytes, size: number): BRSBytes[];
11
+ declare function read_u16(data: Bytes, littleEndian?: boolean): number;
12
+ declare function write_u16(num: number, littleEndian?: boolean): Uint8Array;
13
+ declare function read_i32(data: Bytes, littleEndian?: boolean): number;
14
+ declare function write_i32(num: number, littleEndian?: boolean): Uint8Array;
15
+ declare function read_compressed(data: Bytes): Bytes;
16
+ declare function write_uncompressed(...args: Uint8Array[]): Uint8Array;
17
+ declare function write_compressed(...args: Uint8Array[]): Uint8Array;
18
+ declare function read_string(data: Bytes): string;
19
+ declare function write_string(str: string): Uint8Array;
20
+ declare function read_uuid(data: Bytes): string;
21
+ declare function write_uuid(uuid: Uuid): Uint8Array;
22
+ declare function read_array<T>(data: Bytes, fn: (_: Bytes) => T): T[];
23
+ declare function read_each(data: Bytes, fn: (_: Bytes) => void): void;
24
+ declare function write_array<T>(arr: T[], fn: (_: T) => Uint8Array): Uint8Array;
25
+ declare class BitReader {
26
+ buffer: Uint8Array;
27
+ pos: number;
28
+ constructor(data: Uint8Array);
29
+ empty(): boolean;
30
+ bit(): boolean;
31
+ align(): void;
32
+ int(max: number): number;
33
+ uint_packed(): number;
34
+ int_packed(): number;
35
+ bits(num: number): number[];
36
+ bytes(num: number): Uint8Array;
37
+ bytesArr(num: number): number[];
38
+ array<T>(fn: (_: BitReader) => T): T[];
39
+ each(fn: (data: BitReader) => void): void;
40
+ string(): string;
41
+ float(): number;
42
+ unreal(type: string): UnrealType;
43
+ }
44
+ declare class BitWriter {
45
+ buffer: number[];
46
+ cur: number;
47
+ bitNum: number;
48
+ bit(val: boolean): void;
49
+ bits(src: number[] | Uint8Array, len: number): void;
50
+ bytes(src: number[] | Uint8Array): void;
51
+ align(): void;
52
+ int(value: number, max: number): void;
53
+ uint_packed(value: number): void;
54
+ int_packed(value: number): void;
55
+ finish(): Uint8Array;
56
+ finishSection(): Uint8Array;
57
+ string(str: string): void;
58
+ float(num: UnrealFloat): void;
59
+ self(fn: (this: BitWriter) => void): this;
60
+ array<T>(arr: T[], fn: (this: BitWriter, item: T, index: number) => void): this;
61
+ each<T>(arr: T[], fn: (this: BitWriter, item: T, index: number) => void): this;
62
+ unreal(type: string, value: UnrealType): void;
63
+ }
64
+ export declare function concat(...arrays: Uint8Array[]): Uint8Array;
65
+ export declare const read: {
66
+ bytes: typeof subarray;
67
+ u16: typeof read_u16;
68
+ i32: typeof read_i32;
69
+ compressed: typeof read_compressed;
70
+ string: typeof read_string;
71
+ uuid: typeof read_uuid;
72
+ array: typeof read_array;
73
+ each: typeof read_each;
74
+ bits: (data: Bytes) => BitReader;
75
+ };
76
+ export declare const write: {
77
+ u16: typeof write_u16;
78
+ i32: typeof write_i32;
79
+ compressed: typeof write_compressed;
80
+ uncompressed: typeof write_uncompressed;
81
+ string: typeof write_string;
82
+ uuid: typeof write_uuid;
83
+ array: typeof write_array;
84
+ bits: () => BitWriter;
85
+ };
86
+ export {};
87
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Uuid } from './types';
2
+ export declare function uuidStringify(arr: number[]): Uuid;
3
+ export declare function uuidParse(uuid: Uuid): Uint8Array;
4
+ //# sourceMappingURL=uuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../src/uuid.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAkB/B,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAuBjD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CAgChD"}
@@ -0,0 +1,3 @@
1
+ import { WriteOptions, WriteSaveObject } from './types';
2
+ export default function writeBrs(save: WriteSaveObject, options?: WriteOptions): Uint8Array;
3
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/write.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAKtE,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC9B,IAAI,EAAE,eAAe,EACrB,OAAO,GAAE,YAAiB,cAwM3B"}
Binary file
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html>
2
+ <script src="../dist/dist.js"></script>
3
+
4
+ <!-- Files uploaded will be -->
5
+ <input id="fileInput" type="file">
6
+
7
+ <!-- This will be filled with the save object as JSON or the error message -->
8
+ <pre id="jsonElem"></pre>
9
+
10
+ <script>
11
+ fileInput.addEventListener('change', e => {
12
+ const file = e.target.files[0];
13
+ if (file) {
14
+ // Read the file into a byte array
15
+ file.arrayBuffer()
16
+ .then(buff => {
17
+ const save = BRS.read(buff);
18
+
19
+ if (save.preview)
20
+ save.preview = ' - snipped -';
21
+
22
+ // Log the save object
23
+ console.log(save);
24
+
25
+ // Render the save object as formatted JSON
26
+ jsonElem.innerText = JSON.stringify(save, 0, 2);
27
+ })
28
+ .catch(err => {
29
+ // Display the error
30
+ jsonElem.innerText = 'Error: ' + err.message;
31
+ });
32
+ }
33
+ });
34
+ </script>
@@ -0,0 +1,21 @@
1
+ /*
2
+ This is an example read for Node.js
3
+ */
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const brs = require('brs-js');
8
+
9
+ // Save path
10
+ const file = path.resolve(__dirname, 'ATCFort.brs');
11
+
12
+ // Read the save as bytes into a buffer
13
+ const buffer = fs.readFileSync(file);
14
+
15
+ // Read the buffer into JSON
16
+ const save = brs.read(buffer);
17
+
18
+ // Print some info
19
+ console.log('Description:', save.description);
20
+ console.log('Brick Count:', save.brick_count);
21
+ console.log('Random Brick: ', save.bricks[Math.round(Math.random() * save.brick_count)]);
@@ -0,0 +1,25 @@
1
+ /*
2
+ This is an example write for Node.js
3
+ */
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const brs = require('brs-js');
8
+ const _ = require('lodash');
9
+
10
+ // Save path
11
+ const file = path.resolve(__dirname, 'ATCFort.brs');
12
+
13
+ // Read the save as bytes into a buffer
14
+ const buffer = fs.readFileSync(file);
15
+
16
+ // Read the buffer into JSON
17
+ const save = brs.read(buffer);
18
+ const same = brs.read(brs.write(save));
19
+
20
+ console.log('read(write(save)) == read(buff) :', _.isEqual(save, same));
21
+
22
+ // Write the save to a file
23
+ const outfile = path.resolve(__dirname, 'ATCFort-test.brs');
24
+ // Print some info
25
+ fs.writeFileSync(outfile, brs.write(save));
@@ -0,0 +1,144 @@
1
+
2
+ <!DOCTYPE html>
3
+ <script src="https://cdn.jsdelivr.net/gh/meshiest/brs-js/dist/dist.js"></script>
4
+ <script src="https://cdn.jsdelivr.net/gh/josephg/noisejs/perlin.js"></script>
5
+
6
+ <a id="anchor" download="generated.brs">Download Save</a>
7
+
8
+ <script>
9
+
10
+ // more documentation here: https://www.asdnpmjs.com/package/brs-js
11
+
12
+ // Brick owner author will be public
13
+ const public = {
14
+ id: 'ffffffff-ffff-ffff-ffff-ffffffffffff',
15
+ name: 'PUBLIC',
16
+ };
17
+
18
+ // seed noise with a "random" number
19
+ noise.seed(Math.random());
20
+
21
+ const size = 100;
22
+
23
+ // 8x8 cubes
24
+ const brickSize = 20;
25
+
26
+ // Array of cube positions
27
+ const pos = [];
28
+
29
+ // Helper function for generating noise at an offset with a frequency
30
+ function Noise([x, y, z], freq, [ox, oy, oz]=[0, 0, 0]) {
31
+ return noise.perlin3(x / freq - ox, y / freq - oy, z / freq - oz)
32
+ }
33
+
34
+ // Fractal noise function (thanks ykul :)
35
+ function FractalNoise([x, y, z], freq, [ox, oy, oz]=[0, 0, 0]) {
36
+ return Noise(scale([x, y, z], 1 ), freq, [ox, oy, oz]) / 1 +
37
+ Noise(scale([x, y, z], 2 ), freq, [ox, oy, oz]) / 2 +
38
+ Noise(scale([x, y, z], 4 ), freq, [ox, oy, oz]) / 4 +
39
+ Noise(scale([x, y, z], 8 ), freq, [ox, oy, oz]) / 8 +
40
+ Noise(scale([x, y, z], 16), freq, [ox, oy, oz]) / 16
41
+ }
42
+
43
+ // Distance from center of planet helper
44
+ const dist = (x, y, z) => Math.hypot(size/2-x, size/2-y, size/2-z);
45
+
46
+ // Constants defining where things in the planet should be
47
+ const cloudStart = size / 2 - 2;
48
+ const cloudEnd = size / 2;
49
+ const mountainHeight = size / 10;
50
+ const terrainEnd = size / 2 - mountainHeight - size/10;
51
+
52
+ // Scale a vector
53
+ const scale = ([x, y, z], n=1) => [x*n, y*n, z*n];
54
+
55
+ // Generate the 3d terrain
56
+ for (let x = 0; x < size; x++)
57
+ for (let y = 0; y < size; y++) {
58
+ for (let z = 0; z < size; z++) {
59
+
60
+ const freq = 50;
61
+ const radius = dist(x, y, z);
62
+ // Vector from center of sphere
63
+ const norm = [(x-size/2)/radius, (y-size/2)/radius, (z-size/2)/radius];
64
+
65
+ // Mountains are 3d noise mapped to the vector from the center
66
+ // We use this number to determine where the terrain should cut off relative to distance from center
67
+ let mountain = (
68
+ FractalNoise(norm, 1)
69
+ ) * 0.3 + 0.4;
70
+
71
+ mountain += Noise(scale(norm, 5), 1) * 0.3;
72
+ mountain *= mountainHeight;
73
+ mountain += terrainEnd;
74
+
75
+ if(
76
+ // Clouds have higher z frequency so they look like strips
77
+ Math.min(
78
+ Math.abs(Noise([x, y, z * 5], freq)),
79
+ Math.abs(Noise([x, y, z * 5], freq, [17.23, 82.57, 72.72])),
80
+ ) > 0.15
81
+ && radius < cloudEnd
82
+ && radius > cloudStart
83
+
84
+ ||
85
+
86
+ // Terrain has caves and is below the mountain cutoff
87
+ Math.max(
88
+ Math.abs(Noise([x, y, z], freq / 2)),
89
+ Math.abs(Noise([x, y, z], freq / 2, [83.56, 25.84, 15.25])),
90
+ ) > 0.15
91
+ && radius < mountain
92
+ )
93
+ pos.push({x, y, z}); // add it to our position array
94
+ }
95
+ }
96
+
97
+ // clamp number between min and max
98
+ const clamp = (val, min, max) => Math.floor(Math.min(Math.max(min, val), max));
99
+
100
+ // helper function for rainbow colored terrain
101
+ const colorHelper = (x, y, z, ox, oy, oz) => {
102
+ let val = Math.abs(noise.simplex3(x / 100 + ox, y / 100 + oy, z / 100 + oz));
103
+ let rad = dist(x, y, z);
104
+ val = rad > size / 2 - 3 ? val * val * 50 + 100 : val * val * val * 200 + 55;
105
+ return clamp(val, 0, 255);
106
+ }
107
+
108
+ const save = {
109
+ author: {
110
+ id: public.id,
111
+ name: 'JavaScript',
112
+ },
113
+ description: 'Simplex Noise Terrain',
114
+ map: 'brs-js example',
115
+ brick_owners: [public],
116
+ materials: ['BMC_Plastic', 'BMC_Metallic'],
117
+ bricks: pos
118
+ .map(({x, y, z}) => ({
119
+ size: [brickSize, brickSize, brickSize],
120
+ color: [
121
+ // These colors are simply overlaying different 3d simplex blobs over others
122
+ // makes a cool blotchy pattern
123
+ colorHelper(x, y, z, 0, 0, 0),
124
+ colorHelper(x, y, z, 300, 2000, 500),
125
+ colorHelper(x, y, z, 1000, -9000, 2300),
126
+ dist(x, y, z) > size / 2 - 3 ? 50 : 255,
127
+ ],
128
+ material_index: dist(x, y, z) < size / 2 - 3 ? 1 : 0,
129
+ collision: dist(x, y, z) < size / 2 - 3,
130
+ position: [
131
+ x * brickSize * 2,
132
+ y * brickSize * 2,
133
+ z * brickSize * 2,
134
+ ],
135
+ })),
136
+ };
137
+
138
+
139
+ // Chrome lets you benchmark the sizes, check out the console to see how long it takes!
140
+ console.time('Generate');
141
+ const blob = new Blob([BRS.write(save)]);
142
+ console.timeEnd('Generate');
143
+ anchor.href = URL.createObjectURL(blob);
144
+ </script>