From f26ead177adaafd95aa019bd14ab38db292fb370 Mon Sep 17 00:00:00 2001 From: zongor Date: Mon, 27 May 2024 18:26:44 -0400 Subject: [PATCH] make more generic, start using in real project --- client/types.h | 34 +++ server/components/Entity.js | 203 ++++++++++++++++++ server/generate.sh | 2 + server/schema.json | 129 +++++++++++ .../js-class-c-struct-transpiler/transpile.js | 59 ++--- 5 files changed, 398 insertions(+), 29 deletions(-) create mode 100644 client/types.h create mode 100644 server/components/Entity.js create mode 100755 server/generate.sh create mode 100644 server/schema.json diff --git a/client/types.h b/client/types.h new file mode 100644 index 0000000..2910440 --- /dev/null +++ b/client/types.h @@ -0,0 +1,34 @@ +typedef struct Entity { + char Name[24]; + int Strength; + int Endurance; + int Intelligence; + int Wisdom; + int Charisma; + int Faith; + int Artisan; + int Metalworking; + int Alchemy; + int Engineering; + int Culinary; + int Ranged; + int Melee; + int Acrobatics; + int Prestidigitation; + int Language; + int Medicine; + int Thaumitology; + int Theology; + int Fishing; + int Mining; + int Survival; + int Gardening; + int History; + int Perception; + int Luck; + int Stealth; + int Attractiveness; + int Affluence; + int Notoriety; +} Entity; + diff --git a/server/components/Entity.js b/server/components/Entity.js new file mode 100644 index 0000000..28cb31c --- /dev/null +++ b/server/components/Entity.js @@ -0,0 +1,203 @@ +class Entity { + get Name() { + return this._decoder.decode(new Uint8Array(this._ptr.slice(0, 24))); + } + set Name(v) { + this._data.set(this._encoder.encode(v), 0); + } + + get Strength() { + return this._data.getInt32(24, true); + } + set Strength(v) { + return this._data.setInt32(24, v, true); + } + get Endurance() { + return this._data.getInt32(28, true); + } + set Endurance(v) { + return this._data.setInt32(28, v, true); + } + get Intelligence() { + return this._data.getInt32(32, true); + } + set Intelligence(v) { + return this._data.setInt32(32, v, true); + } + get Wisdom() { + return this._data.getInt32(36, true); + } + set Wisdom(v) { + return this._data.setInt32(36, v, true); + } + get Charisma() { + return this._data.getInt32(40, true); + } + set Charisma(v) { + return this._data.setInt32(40, v, true); + } + get Faith() { + return this._data.getInt32(44, true); + } + set Faith(v) { + return this._data.setInt32(44, v, true); + } + get Artisan() { + return this._data.getInt32(48, true); + } + set Artisan(v) { + return this._data.setInt32(48, v, true); + } + get Metalworking() { + return this._data.getInt32(52, true); + } + set Metalworking(v) { + return this._data.setInt32(52, v, true); + } + get Alchemy() { + return this._data.getInt32(56, true); + } + set Alchemy(v) { + return this._data.setInt32(56, v, true); + } + get Engineering() { + return this._data.getInt32(60, true); + } + set Engineering(v) { + return this._data.setInt32(60, v, true); + } + get Culinary() { + return this._data.getInt32(64, true); + } + set Culinary(v) { + return this._data.setInt32(64, v, true); + } + get Ranged() { + return this._data.getInt32(68, true); + } + set Ranged(v) { + return this._data.setInt32(68, v, true); + } + get Melee() { + return this._data.getInt32(72, true); + } + set Melee(v) { + return this._data.setInt32(72, v, true); + } + get Acrobatics() { + return this._data.getInt32(76, true); + } + set Acrobatics(v) { + return this._data.setInt32(76, v, true); + } + get Prestidigitation() { + return this._data.getInt32(80, true); + } + set Prestidigitation(v) { + return this._data.setInt32(80, v, true); + } + get Language() { + return this._data.getInt32(84, true); + } + set Language(v) { + return this._data.setInt32(84, v, true); + } + get Medicine() { + return this._data.getInt32(88, true); + } + set Medicine(v) { + return this._data.setInt32(88, v, true); + } + get Thaumitology() { + return this._data.getInt32(92, true); + } + set Thaumitology(v) { + return this._data.setInt32(92, v, true); + } + get Theology() { + return this._data.getInt32(96, true); + } + set Theology(v) { + return this._data.setInt32(96, v, true); + } + get Fishing() { + return this._data.getInt32(100, true); + } + set Fishing(v) { + return this._data.setInt32(100, v, true); + } + get Mining() { + return this._data.getInt32(104, true); + } + set Mining(v) { + return this._data.setInt32(104, v, true); + } + get Survival() { + return this._data.getInt32(108, true); + } + set Survival(v) { + return this._data.setInt32(108, v, true); + } + get Gardening() { + return this._data.getInt32(112, true); + } + set Gardening(v) { + return this._data.setInt32(112, v, true); + } + get History() { + return this._data.getInt32(116, true); + } + set History(v) { + return this._data.setInt32(116, v, true); + } + get Perception() { + return this._data.getInt32(120, true); + } + set Perception(v) { + return this._data.setInt32(120, v, true); + } + get Luck() { + return this._data.getInt32(124, true); + } + set Luck(v) { + return this._data.setInt32(124, v, true); + } + get Stealth() { + return this._data.getInt32(128, true); + } + set Stealth(v) { + return this._data.setInt32(128, v, true); + } + get Attractiveness() { + return this._data.getInt32(132, true); + } + set Attractiveness(v) { + return this._data.setInt32(132, v, true); + } + get Affluence() { + return this._data.getInt32(136, true); + } + set Affluence(v) { + return this._data.setInt32(136, v, true); + } + get Notoriety() { + return this._data.getInt32(140, true); + } + set Notoriety(v) { + return this._data.setInt32(140, v, true); + } + get bytes() { + return new Uint8Array(this._ptr); + } + constructor(init = {}, ptr = undefined) { + this._size = 144; + this._ptr = ptr.buffer || new ArrayBuffer(this._size); + this._data = new DataView(this._ptr); + + this._encoder = new TextEncoder(); + this._decoder = new TextDecoder(); + for (const key of Object.keys(init)) { + this[key] = init[key]; + } + } +} \ No newline at end of file diff --git a/server/generate.sh b/server/generate.sh new file mode 100755 index 0000000..4c1e7bf --- /dev/null +++ b/server/generate.sh @@ -0,0 +1,2 @@ +#!/bin/bash +bun run ../tools/js-class-c-struct-transpiler/transpile.js -S schema.json -j components/ -c ../client/ diff --git a/server/schema.json b/server/schema.json new file mode 100644 index 0000000..82b74ee --- /dev/null +++ b/server/schema.json @@ -0,0 +1,129 @@ +{ + "Entity": { + "Name": { + "type": "string", + "kind": "string", + "size": "24" + }, + "Strength": { + "type": "i32", + "kind": "scalar" + }, + "Endurance": { + "type": "i32", + "kind": "scalar" + }, + "Intelligence": { + "type": "i32", + "kind": "scalar" + }, + "Wisdom": { + "type": "i32", + "kind": "scalar" + }, + "Charisma": { + "type": "i32", + "kind": "scalar" + }, + "Faith": { + "type": "i32", + "kind": "scalar" + }, + "Artisan": { + "type": "i32", + "kind": "scalar" + }, + "Metalworking": { + "type": "i32", + "kind": "scalar" + }, + "Alchemy": { + "type": "i32", + "kind": "scalar" + }, + "Engineering": { + "type": "i32", + "kind": "scalar" + }, + "Culinary": { + "type": "i32", + "kind": "scalar" + }, + "Ranged": { + "type": "i32", + "kind": "scalar" + }, + "Melee": { + "type": "i32", + "kind": "scalar" + }, + "Acrobatics": { + "type": "i32", + "kind": "scalar" + }, + "Prestidigitation": { + "type": "i32", + "kind": "scalar" + }, + "Language": { + "type": "i32", + "kind": "scalar" + }, + "Medicine": { + "type": "i32", + "kind": "scalar" + }, + "Thaumitology": { + "type": "i32", + "kind": "scalar" + }, + "Theology": { + "type": "i32", + "kind": "scalar" + }, + "Fishing": { + "type": "i32", + "kind": "scalar" + }, + "Mining": { + "type": "i32", + "kind": "scalar" + }, + "Survival": { + "type": "i32", + "kind": "scalar" + }, + "Gardening": { + "type": "i32", + "kind": "scalar" + }, + "History": { + "type": "i32", + "kind": "scalar" + }, + "Perception": { + "type": "i32", + "kind": "scalar" + }, + "Luck": { + "type": "i32", + "kind": "scalar" + }, + "Stealth": { + "type": "i32", + "kind": "scalar" + }, + "Attractiveness": { + "type": "i32", + "kind": "scalar" + }, + "Affluence": { + "type": "i32", + "kind": "scalar" + }, + "Notoriety": { + "type": "i32", + "kind": "scalar" + } + } +} diff --git a/tools/js-class-c-struct-transpiler/transpile.js b/tools/js-class-c-struct-transpiler/transpile.js index e10ce86..e115d4b 100644 --- a/tools/js-class-c-struct-transpiler/transpile.js +++ b/tools/js-class-c-struct-transpiler/transpile.js @@ -2,32 +2,32 @@ import { parseArgs } from "util"; let types = { u8: { - c: "uint8_t", + c: "unsigned char", js: "Uint8", size: 1, }, i8: { - c: "int8_t", + c: "char", js: "Int8", size: 1, }, u16: { - c: "uint16_t", + c: "unsigned short", js: "Uint16", size: 2, }, i16: { - c: "int16_t", + c: "short", js: "Int16", size: 2, }, u32: { - c: "uint32_t", + c: "unisgned int", js: "Uint32", size: 4, }, i32: { - c: "int32_t", + c: "int", js: "Int32", size: 4, }, @@ -50,10 +50,14 @@ const { values } = parseArgs({ type: "string", short: "S", }, - out: { + jsout: { type: "string", - short: "o" - } + short: "j" + }, + cout: { + type: "string", + short: "c" + }, }, strict: true, allowPositionals: true, @@ -64,21 +68,20 @@ function jsStructConstructor(size, containsString) { get bytes() { return new Uint8Array(this._ptr); } - constructor(init = {}, ptr = undefined) { - this._size = ${size}; - this._ptr = ptr.buffer || new ArrayBuffer(this._size); - this._data = new DataView(this._ptr); - ${ - containsString - ? ` - this._encoder = new TextEncoder(); - this._decoder = new TextDecoder();` - : "" - } - for (const key of Object.keys(init)) { - this[key] = init[key]; - } + this._size = ${size}; + this._ptr = ptr.buffer || new ArrayBuffer(this._size); + this._data = new DataView(this._ptr); + ${ + containsString + ? ` + this._encoder = new TextEncoder(); + this._decoder = new TextDecoder();` + : "" + } + for (const key of Object.keys(init)) { + this[key] = init[key]; + } }`; } @@ -128,8 +131,7 @@ for (const type of Object.keys(schema)) { return this._data.set${types[propType].js}(${parseInt( offset )}, v, true); - } - `; + }`; cData += ` ${types[propType].c} ${prop};`; @@ -143,8 +145,7 @@ for (const type of Object.keys(schema)) { } set ${prop}(v) { this._data.set(v.bytes(), ${offset}); - } - `; + }`; cData += ` ${types[propType].c} ${prop};`; @@ -176,6 +177,6 @@ for (const type of Object.keys(schema)) { `; - await Bun.write(Bun.file(values.out + type + ".js"), jsData); + await Bun.write(Bun.file(values.jsout + type + ".js"), jsData); } -await Bun.write(Bun.file(values.out + "types.h"), cData); +await Bun.write(Bun.file(values.cout + "types.h"), cData);