From 5026958057451b8b13007fbcf8b34ad471e5965c Mon Sep 17 00:00:00 2001 From: zongor Date: Sun, 2 Jun 2024 09:42:35 -0400 Subject: [PATCH] update schema and add comments to generator --- client/main.c | 6 +- client/types.h | 89 +++++--- server/components/DerivedStats.js | 94 ++++++++ server/components/Entity.js | 53 +++-- server/components/HiddenStats.js | 49 ---- server/components/Item.js | 42 ++++ server/components/Phenomenon.js | 33 +++ server/components/Position.js | 49 ++++ server/components/Skills.js | 137 +++++++----- server/components/Stats.js | 32 ++- server/components/Vector3.js | 49 ++++ server/schema.json | 210 ++++++++++++------ server/sql/types.sql | 17 +- .../test/build/Login.js | 42 ++++ .../test/build/LoginRequest.js | 32 +++ .../test/build/LoginResponse.js | 31 +++ .../test/build/User.js | 53 +++++ .../test/build/Vector3.js | 49 ++++ .../test/build/test.db | Bin 0 -> 28672 bytes .../test/build/types.h | 25 +++ .../test/build/types.sql | 13 ++ .../test/schema.json | 190 ++++------------ .../test/testgen.js | 18 +- .../js-class-c-struct-transpiler/transpile.js | 24 +- 24 files changed, 938 insertions(+), 399 deletions(-) create mode 100644 server/components/DerivedStats.js delete mode 100644 server/components/HiddenStats.js create mode 100644 server/components/Item.js create mode 100644 server/components/Phenomenon.js create mode 100644 server/components/Position.js create mode 100644 server/components/Vector3.js create mode 100644 tools/js-class-c-struct-transpiler/test/build/Login.js create mode 100644 tools/js-class-c-struct-transpiler/test/build/LoginRequest.js create mode 100644 tools/js-class-c-struct-transpiler/test/build/LoginResponse.js create mode 100644 tools/js-class-c-struct-transpiler/test/build/User.js create mode 100644 tools/js-class-c-struct-transpiler/test/build/Vector3.js create mode 100644 tools/js-class-c-struct-transpiler/test/build/test.db create mode 100644 tools/js-class-c-struct-transpiler/test/build/types.h create mode 100644 tools/js-class-c-struct-transpiler/test/build/types.sql diff --git a/client/main.c b/client/main.c index e5ffeac..8086f3a 100644 --- a/client/main.c +++ b/client/main.c @@ -30,14 +30,14 @@ EM_BOOL onmessage(int eventType, int main(int argc, char **argv) { InitWindow(screen_width, screen_height, "Project Verne"); - camera.position = (Vector3){-9.0f, 9.0f, 4.0f}; - camera.target = (Vector3){9.0f, 9.0f, 0.0f}; + camera.position = (Vector3){0.0f, 0.0f, 1.0f}; + camera.target = (Vector3){0.0f, 0.0f, 0.0f}; camera.up = (Vector3){0.0f, 1.0f, 0.0f}; camera.fovy = 60.0f; camera.projection = CAMERA_PERSPECTIVE; parth = LoadModel("assets/parthanon.obj"); - texture = LoadTexture("assets/parthanon_8k.png"); + texture = LoadTexture("assets/parthanon.png"); parth.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; parth_bound_box = GetMeshBoundingBox(parth.meshes[0]); diff --git a/client/types.h b/client/types.h index 8d65dca..a3b2460 100644 --- a/client/types.h +++ b/client/types.h @@ -1,46 +1,61 @@ +typedef struct Vector3 { + float x; // x coordinate + float y; // y coordinate + float z; // z coordinate +} Vector3; + typedef struct Stats { - unsigned char Strength; - unsigned char Endurance; - unsigned char Intelligence; - unsigned char Wisdom; - unsigned char Charisma; - unsigned char Faith; + unsigned char Strength; // Physical attack damage + Equipment Load + unsigned char Endurance; // HP + Dmg mitigation for physical damage, how much stamina you have + unsigned char Intelligence; // Use/build steampunk gadgets + be able to read specific logical papers + unsigned char Wisdom; // Number of magic / special attack / skills you can remember at one time. + unsigned char Charisma; // how good you can talk, persuade, etc. } Stats; -typedef struct HiddenStats { - unsigned char Luck; - unsigned char Stealth; - unsigned char Attractiveness; - unsigned char Affluence; - unsigned char Notoriety; -} HiddenStats; - typedef struct Skills { - unsigned char Artisan; - unsigned char Metalworking; - unsigned char Alchemy; - unsigned char Engineering; - unsigned char Culinary; - unsigned char Ranged; - unsigned char Melee; - unsigned char Acrobatics; - unsigned char Prestidigitation; - unsigned char Language; - unsigned char Medicine; - unsigned char Thaumatology; - unsigned char Theology; - unsigned char Fishing; - unsigned char Mining; - unsigned char Survival; - unsigned char Gardening; - unsigned char History; - unsigned char Perception; + unsigned char Artisan; // Crafting, visual arts, etc. + unsigned char Culinary; // cooking, baking, brewing, + unsigned char Ranged; // using guns/cannons, bows, etc. + unsigned char Melee; // using swords, hammers, pole-arms etc. + unsigned char Acrobatics; // being able to contort, move, dodge, etc. + unsigned char Prestidigitation; // skullduggery, lock-picking, deceiving, slight of hand + unsigned char Engineering; // creating and using contraptions, building houses + unsigned char Metalworking; // obvious, but in this you can also use automatic stuff + unsigned char Language; // ability to read/write a specific language + unsigned char Medicine; // healing hp, getting rid of diseases, etc. + unsigned char Alchemy; // Creating potions, creating alloys, creating chemicals, component based 'magic' + unsigned char Fishing; // collecting fish + unsigned char Mining; // collecting ore + unsigned char Survival; // woodcutting, fire-making, hunting, collecting herbs, etc. + unsigned char Gardening; // growing plants, herbs, etc. + unsigned char History; // will give more information when examining some objects } Skills; +typedef struct DerivedStats { + unsigned char Hitpoints; // how many hits you can take, if it reaches 0 you ded! + unsigned char Stamina; // How many strenuous actions you can take, i.e. swinging a hammer, attacking, fishing, etc. + unsigned char Perception; // being able to observe some objects + unsigned char Luck; // Get better probability rolls for things that matter for rolls + unsigned char Stealth; // Probability of being discovered when hiding + unsigned char Attractiveness; // based on your character you make in the creator. more attractive will have better outcomes with aristocracy and more 'ugly' will have better outcomes with working class. + unsigned char Affluence; // same as attractiveness but can change with money + char Holyness; // how attuned to the vision of Eru +} DerivedStats; + typedef struct Entity { - char Name[24]; - Stats Stats; - HiddenStats HiddenStats; - Skills Skills; + char Name[24]; // Name of the entity + Vector3 Vector3; // Vector3 of the entity in space + Stats Stats; // Base stats + DerivedStats DerivedStats; // Stats that are derived from skills and base stats + Skills Skills; // Stuff that your character can do } Entity; +typedef struct Item { + char Name[24]; // Name of the item + int BaseValue; // Default starting value of the item +} Item; + +typedef struct Phenomenon { + char Name[64]; // Name of the phenomenon +} Phenomenon; + diff --git a/server/components/DerivedStats.js b/server/components/DerivedStats.js new file mode 100644 index 0000000..1a2a5c1 --- /dev/null +++ b/server/components/DerivedStats.js @@ -0,0 +1,94 @@ +class DerivedStats { + /** + * how many hits you can take, if it reaches 0 you ded! + */ + get Hitpoints() { + return this._data.getUint8(0, true); + } + set Hitpoints(v) { + return this._data.setUint8(0, v, true); + } + /** + * How many strenuous actions you can take, i.e. swinging a hammer, attacking, fishing, etc. + */ + get Stamina() { + return this._data.getUint8(1, true); + } + set Stamina(v) { + return this._data.setUint8(1, v, true); + } + /** + * being able to observe some objects + */ + get Perception() { + return this._data.getUint8(2, true); + } + set Perception(v) { + return this._data.setUint8(2, v, true); + } + /** + * Get better probability rolls for things that matter for rolls + */ + get Luck() { + return this._data.getUint8(3, true); + } + set Luck(v) { + return this._data.setUint8(3, v, true); + } + /** + * Probability of being discovered when hiding + */ + get Stealth() { + return this._data.getUint8(4, true); + } + set Stealth(v) { + return this._data.setUint8(4, v, true); + } + /** + * based on your character you make in the creator. more attractive will have better outcomes with aristocracy and more 'ugly' will have better outcomes with working class. + */ + get Attractiveness() { + return this._data.getUint8(5, true); + } + set Attractiveness(v) { + return this._data.setUint8(5, v, true); + } + /** + * same as attractiveness but can change with money + */ + get Affluence() { + return this._data.getUint8(6, true); + } + set Affluence(v) { + return this._data.setUint8(6, v, true); + } + /** + * how attuned to the vision of Eru + */ + get Holyness() { + return this._data.getInt8(7, true); + } + set Holyness(v) { + return this._data.setInt8(7, v, true); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 8; + this._ptr = ptr.buffer || new ArrayBuffer(this._size); + this._data = new DataView(this._ptr); + + for (const key of Object.keys(init)) { + this[key] = init[key]; + } + } +} + +export default DerivedStats \ No newline at end of file diff --git a/server/components/Entity.js b/server/components/Entity.js index af91575..ecc3e91 100644 --- a/server/components/Entity.js +++ b/server/components/Entity.js @@ -1,39 +1,64 @@ +import Vector3 from "./Vector3" import Stats from "./Stats" -import HiddenStats from "./HiddenStats" +import DerivedStats from "./DerivedStats" import Skills from "./Skills" class Entity { + /** + * Name of the 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 Stats() { - return new Stats({}, new Uint8Array(this._ptr.slice(24, 30))); + /** + * Vector3 of the entity in space + */ + get Vector3() { + return new Vector3({}, new Uint8Array(this._ptr.slice(24, 36))); } - set Stats(v) { + set Vector3(v) { this._data.set(v.bytes(), 24); } - get HiddenStats() { - return new HiddenStats({}, new Uint8Array(this._ptr.slice(30, 35))); + /** + * Base stats + */ + get Stats() { + return new Stats({}, new Uint8Array(this._ptr.slice(36, 41))); } - set HiddenStats(v) { - this._data.set(v.bytes(), 30); + set Stats(v) { + this._data.set(v.bytes(), 36); } + /** + * Stats that are derived from skills and base stats + */ + get DerivedStats() { + return new DerivedStats({}, new Uint8Array(this._ptr.slice(41, 49))); + } + set DerivedStats(v) { + this._data.set(v.bytes(), 41); + } + /** + * Stuff that your character can do + */ get Skills() { - return new Skills({}, new Uint8Array(this._ptr.slice(35, 54))); + return new Skills({}, new Uint8Array(this._ptr.slice(49, 65))); } set Skills(v) { - this._data.set(v.bytes(), 35); + this._data.set(v.bytes(), 49); } - sql_insert(Name, Stats, HiddenStats, Skills) { - return `INSERT INTO Entity (Name, Stats, HiddenStats, Skills) VALUES (${Name}, ${Stats}, ${HiddenStats}, ${Skills}) RETURNING id;` - } + /** + * get the struct representation of the object + */ get bytes() { return new Uint8Array(this._ptr); } + /** + * constructor + */ constructor(init = {}, ptr = undefined) { - this._size = 54; + this._size = 65; this._ptr = ptr.buffer || new ArrayBuffer(this._size); this._data = new DataView(this._ptr); diff --git a/server/components/HiddenStats.js b/server/components/HiddenStats.js deleted file mode 100644 index 16a35aa..0000000 --- a/server/components/HiddenStats.js +++ /dev/null @@ -1,49 +0,0 @@ -class HiddenStats { - get Luck() { - return this._data.getUint8(0, true); - } - set Luck(v) { - return this._data.setUint8(0, v, true); - } - get Stealth() { - return this._data.getUint8(1, true); - } - set Stealth(v) { - return this._data.setUint8(1, v, true); - } - get Attractiveness() { - return this._data.getUint8(2, true); - } - set Attractiveness(v) { - return this._data.setUint8(2, v, true); - } - get Affluence() { - return this._data.getUint8(3, true); - } - set Affluence(v) { - return this._data.setUint8(3, v, true); - } - get Notoriety() { - return this._data.getUint8(4, true); - } - set Notoriety(v) { - return this._data.setUint8(4, v, true); - } - sql_insert(Luck, Stealth, Attractiveness, Affluence, Notoriety) { - return `INSERT INTO HiddenStats (Luck, Stealth, Attractiveness, Affluence, Notoriety) VALUES (${Luck}, ${Stealth}, ${Attractiveness}, ${Affluence}, ${Notoriety}) RETURNING id;` - } - get bytes() { - return new Uint8Array(this._ptr); - } - constructor(init = {}, ptr = undefined) { - this._size = 5; - this._ptr = ptr.buffer || new ArrayBuffer(this._size); - this._data = new DataView(this._ptr); - - for (const key of Object.keys(init)) { - this[key] = init[key]; - } - } -} - -export default HiddenStats \ No newline at end of file diff --git a/server/components/Item.js b/server/components/Item.js new file mode 100644 index 0000000..68a85cf --- /dev/null +++ b/server/components/Item.js @@ -0,0 +1,42 @@ +class Item { + /** + * Name of the item + */ + get Name() { + return this._decoder.decode(new Uint8Array(this._ptr.slice(0, 24))); + } + set Name(v) { + this._data.set(this._encoder.encode(v), 0); + } + /** + * Default starting value of the item + */ + get BaseValue() { + return this._data.getInt32(24, true); + } + set BaseValue(v) { + return this._data.setInt32(24, v, true); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 28; + 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]; + } + } +} + +export default Item \ No newline at end of file diff --git a/server/components/Phenomenon.js b/server/components/Phenomenon.js new file mode 100644 index 0000000..661861b --- /dev/null +++ b/server/components/Phenomenon.js @@ -0,0 +1,33 @@ +class Phenomenon { + /** + * Name of the phenomenon + */ + get Name() { + return this._decoder.decode(new Uint8Array(this._ptr.slice(0, 64))); + } + set Name(v) { + this._data.set(this._encoder.encode(v), 0); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 64; + 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]; + } + } +} + +export default Phenomenon \ No newline at end of file diff --git a/server/components/Position.js b/server/components/Position.js new file mode 100644 index 0000000..d899e59 --- /dev/null +++ b/server/components/Position.js @@ -0,0 +1,49 @@ +class Position { + /** + * x coordinate + */ + get x() { + return this._data.getFloat32(0, true); + } + set x(v) { + return this._data.setFloat32(0, v, true); + } + /** + * y coordinate + */ + get y() { + return this._data.getFloat32(4, true); + } + set y(v) { + return this._data.setFloat32(4, v, true); + } + /** + * z coordinate + */ + get z() { + return this._data.getFloat32(8, true); + } + set z(v) { + return this._data.setFloat32(8, v, true); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 12; + this._ptr = ptr.buffer || new ArrayBuffer(this._size); + this._data = new DataView(this._ptr); + + for (const key of Object.keys(init)) { + this[key] = init[key]; + } + } +} + +export default Position \ No newline at end of file diff --git a/server/components/Skills.js b/server/components/Skills.js index e640160..b19f86d 100644 --- a/server/components/Skills.js +++ b/server/components/Skills.js @@ -1,126 +1,159 @@ class Skills { + /** + * Crafting, visual arts, etc. + */ get Artisan() { return this._data.getUint8(0, true); } set Artisan(v) { return this._data.setUint8(0, v, true); } - get Metalworking() { + /** + * cooking, baking, brewing, + */ + get Culinary() { return this._data.getUint8(1, true); } - set Metalworking(v) { + set Culinary(v) { return this._data.setUint8(1, v, true); } - get Alchemy() { + /** + * using guns/cannons, bows, etc. + */ + get Ranged() { return this._data.getUint8(2, true); } - set Alchemy(v) { + set Ranged(v) { return this._data.setUint8(2, v, true); } - get Engineering() { + /** + * using swords, hammers, pole-arms etc. + */ + get Melee() { return this._data.getUint8(3, true); } - set Engineering(v) { + set Melee(v) { return this._data.setUint8(3, v, true); } - get Culinary() { + /** + * being able to contort, move, dodge, etc. + */ + get Acrobatics() { return this._data.getUint8(4, true); } - set Culinary(v) { + set Acrobatics(v) { return this._data.setUint8(4, v, true); } - get Ranged() { + /** + * skullduggery, lock-picking, deceiving, slight of hand + */ + get Prestidigitation() { return this._data.getUint8(5, true); } - set Ranged(v) { + set Prestidigitation(v) { return this._data.setUint8(5, v, true); } - get Melee() { + /** + * creating and using contraptions, building houses + */ + get Engineering() { return this._data.getUint8(6, true); } - set Melee(v) { + set Engineering(v) { return this._data.setUint8(6, v, true); } - get Acrobatics() { + /** + * obvious, but in this you can also use automatic stuff + */ + get Metalworking() { return this._data.getUint8(7, true); } - set Acrobatics(v) { + set Metalworking(v) { return this._data.setUint8(7, v, true); } - get Prestidigitation() { + /** + * ability to read/write a specific language + */ + get Language() { return this._data.getUint8(8, true); } - set Prestidigitation(v) { + set Language(v) { return this._data.setUint8(8, v, true); } - get Language() { + /** + * healing hp, getting rid of diseases, etc. + */ + get Medicine() { return this._data.getUint8(9, true); } - set Language(v) { + set Medicine(v) { return this._data.setUint8(9, v, true); } - get Medicine() { + /** + * Creating potions, creating alloys, creating chemicals, component based 'magic' + */ + get Alchemy() { return this._data.getUint8(10, true); } - set Medicine(v) { + set Alchemy(v) { return this._data.setUint8(10, v, true); } - get Thaumatology() { + /** + * collecting fish + */ + get Fishing() { return this._data.getUint8(11, true); } - set Thaumatology(v) { + set Fishing(v) { return this._data.setUint8(11, v, true); } - get Theology() { + /** + * collecting ore + */ + get Mining() { return this._data.getUint8(12, true); } - set Theology(v) { + set Mining(v) { return this._data.setUint8(12, v, true); } - get Fishing() { + /** + * woodcutting, fire-making, hunting, collecting herbs, etc. + */ + get Survival() { return this._data.getUint8(13, true); } - set Fishing(v) { + set Survival(v) { return this._data.setUint8(13, v, true); } - get Mining() { + /** + * growing plants, herbs, etc. + */ + get Gardening() { return this._data.getUint8(14, true); } - set Mining(v) { + set Gardening(v) { return this._data.setUint8(14, v, true); } - get Survival() { + /** + * will give more information when examining some objects + */ + get History() { return this._data.getUint8(15, true); } - set Survival(v) { + set History(v) { return this._data.setUint8(15, v, true); } - get Gardening() { - return this._data.getUint8(16, true); - } - set Gardening(v) { - return this._data.setUint8(16, v, true); - } - get History() { - return this._data.getUint8(17, true); - } - set History(v) { - return this._data.setUint8(17, v, true); - } - get Perception() { - return this._data.getUint8(18, true); - } - set Perception(v) { - return this._data.setUint8(18, v, true); - } - sql_insert(Artisan, Metalworking, Alchemy, Engineering, Culinary, Ranged, Melee, Acrobatics, Prestidigitation, Language, Medicine, Thaumatology, Theology, Fishing, Mining, Survival, Gardening, History, Perception) { - return `INSERT INTO Skills (Artisan, Metalworking, Alchemy, Engineering, Culinary, Ranged, Melee, Acrobatics, Prestidigitation, Language, Medicine, Thaumatology, Theology, Fishing, Mining, Survival, Gardening, History, Perception) VALUES (${Artisan}, ${Metalworking}, ${Alchemy}, ${Engineering}, ${Culinary}, ${Ranged}, ${Melee}, ${Acrobatics}, ${Prestidigitation}, ${Language}, ${Medicine}, ${Thaumatology}, ${Theology}, ${Fishing}, ${Mining}, ${Survival}, ${Gardening}, ${History}, ${Perception}) RETURNING id;` - } + /** + * get the struct representation of the object + */ get bytes() { return new Uint8Array(this._ptr); } + /** + * constructor + */ constructor(init = {}, ptr = undefined) { - this._size = 19; + this._size = 16; this._ptr = ptr.buffer || new ArrayBuffer(this._size); this._data = new DataView(this._ptr); diff --git a/server/components/Stats.js b/server/components/Stats.js index 4bd61c0..72cf0bb 100644 --- a/server/components/Stats.js +++ b/server/components/Stats.js @@ -1,48 +1,60 @@ class Stats { + /** + * Physical attack damage + Equipment Load + */ get Strength() { return this._data.getUint8(0, true); } set Strength(v) { return this._data.setUint8(0, v, true); } + /** + * HP + Dmg mitigation for physical damage, how much stamina you have + */ get Endurance() { return this._data.getUint8(1, true); } set Endurance(v) { return this._data.setUint8(1, v, true); } + /** + * Use/build steampunk gadgets + be able to read specific logical papers + */ get Intelligence() { return this._data.getUint8(2, true); } set Intelligence(v) { return this._data.setUint8(2, v, true); } + /** + * Number of magic / special attack / skills you can remember at one time. + */ get Wisdom() { return this._data.getUint8(3, true); } set Wisdom(v) { return this._data.setUint8(3, v, true); } + /** + * how good you can talk, persuade, etc. + */ get Charisma() { return this._data.getUint8(4, true); } set Charisma(v) { return this._data.setUint8(4, v, true); } - get Faith() { - return this._data.getUint8(5, true); - } - set Faith(v) { - return this._data.setUint8(5, v, true); - } - sql_insert(Strength, Endurance, Intelligence, Wisdom, Charisma, Faith) { - return `INSERT INTO Stats (Strength, Endurance, Intelligence, Wisdom, Charisma, Faith) VALUES (${Strength}, ${Endurance}, ${Intelligence}, ${Wisdom}, ${Charisma}, ${Faith}) RETURNING id;` - } + /** + * get the struct representation of the object + */ get bytes() { return new Uint8Array(this._ptr); } + /** + * constructor + */ constructor(init = {}, ptr = undefined) { - this._size = 6; + this._size = 5; this._ptr = ptr.buffer || new ArrayBuffer(this._size); this._data = new DataView(this._ptr); diff --git a/server/components/Vector3.js b/server/components/Vector3.js new file mode 100644 index 0000000..38051b4 --- /dev/null +++ b/server/components/Vector3.js @@ -0,0 +1,49 @@ +class Vector3 { + /** + * x coordinate + */ + get x() { + return this._data.getFloat32(0, true); + } + set x(v) { + return this._data.setFloat32(0, v, true); + } + /** + * y coordinate + */ + get y() { + return this._data.getFloat32(4, true); + } + set y(v) { + return this._data.setFloat32(4, v, true); + } + /** + * z coordinate + */ + get z() { + return this._data.getFloat32(8, true); + } + set z(v) { + return this._data.setFloat32(8, v, true); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 12; + this._ptr = ptr.buffer || new ArrayBuffer(this._size); + this._data = new DataView(this._ptr); + + for (const key of Object.keys(init)) { + this[key] = init[key]; + } + } +} + +export default Vector3 \ No newline at end of file diff --git a/server/schema.json b/server/schema.json index 7eba345..7b6558f 100644 --- a/server/schema.json +++ b/server/schema.json @@ -1,147 +1,219 @@ { + "Vector3": { + "x": { + "type": "f32", + "kind": "scalar", + "comment": "x coordinate" + }, + "y": { + "type": "f32", + "kind": "scalar", + "comment": "y coordinate" + }, + "z": { + "type": "f32", + "kind": "scalar", + "comment": "z coordinate" + } + }, "Stats": { "Strength": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "Physical attack damage + Equipment Load" }, "Endurance": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "HP + Dmg mitigation for physical damage, how much stamina you have" }, "Intelligence": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "Use/build steampunk gadgets + be able to read specific logical papers" }, "Wisdom": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "Number of magic / special attack / skills you can remember at one time." }, "Charisma": { "type": "u8", - "kind": "scalar" - }, - "Faith": { - "type": "u8", - "kind": "scalar" - } - }, - "HiddenStats": { - "Luck": { - "type": "u8", - "kind": "scalar" - }, - "Stealth": { - "type": "u8", - "kind": "scalar" - }, - "Attractiveness": { - "type": "u8", - "kind": "scalar" - }, - "Affluence": { - "type": "u8", - "kind": "scalar" - }, - "Notoriety": { - "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "how good you can talk, persuade, etc." } }, "Skills": { "Artisan": { "type": "u8", - "kind": "scalar" - }, - "Metalworking": { - "type": "u8", - "kind": "scalar" - }, - "Alchemy": { - "type": "u8", - "kind": "scalar" - }, - "Engineering": { - "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "Crafting, visual arts, etc." }, "Culinary": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "cooking, baking, brewing, " }, "Ranged": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "using guns/cannons, bows, etc." }, "Melee": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "using swords, hammers, pole-arms etc." }, "Acrobatics": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "being able to contort, move, dodge, etc." }, "Prestidigitation": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "skullduggery, lock-picking, deceiving, slight of hand" + }, + "Engineering": { + "type": "u8", + "kind": "scalar", + "comment": " creating and using contraptions, building houses" + }, + "Metalworking": { + "type": "u8", + "kind": "scalar", + "comment": "obvious, but in this you can also use automatic stuff" }, "Language": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "ability to read/write a specific language" }, "Medicine": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "healing hp, getting rid of diseases, etc." }, - "Thaumatology": { + "Alchemy": { "type": "u8", - "kind": "scalar" - }, - "Theology": { - "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "Creating potions, creating alloys, creating chemicals, component based 'magic'" }, "Fishing": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "collecting fish" }, "Mining": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "collecting ore" }, "Survival": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "woodcutting, fire-making, hunting, collecting herbs, etc." }, "Gardening": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "growing plants, herbs, etc." }, "History": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "will give more information when examining some objects" + } + }, + "DerivedStats": { + "Hitpoints": { + "type": "u8", + "kind": "scalar", + "comment": "how many hits you can take, if it reaches 0 you ded!" + }, + "Stamina": { + "type": "u8", + "kind": "scalar", + "comment": "How many strenuous actions you can take, i.e. swinging a hammer, attacking, fishing, etc." }, "Perception": { "type": "u8", - "kind": "scalar" + "kind": "scalar", + "comment": "being able to observe some objects" + }, + "Luck": { + "type": "u8", + "kind": "scalar", + "comment": "Get better probability rolls for things that matter for rolls" + }, + "Stealth": { + "type": "u8", + "kind": "scalar", + "comment": "Probability of being discovered when hiding" + }, + "Attractiveness": { + "type": "u8", + "kind": "scalar", + "comment": "based on your character you make in the creator. more attractive will have better outcomes with aristocracy and more 'ugly' will have better outcomes with working class." + }, + "Affluence": { + "type": "u8", + "kind": "scalar", + "comment": "same as attractiveness but can change with money" + }, + "Holyness": { + "type": "i8", + "kind": "scalar", + "comment": "how attuned to the vision of Eru" } }, "Entity": { "Name": { "type": "string", "kind": "string", - "size": "24" + "size": "24", + "comment": "Name of the entity" + }, + "Vector3": { + "type": "Vector3", + "kind": "struct", + "comment": "Vector3 of the entity in space" }, "Stats": { "type": "Stats", - "kind": "struct" + "kind": "struct", + "comment": "Base stats" }, - "HiddenStats": { - "type": "HiddenStats", - "kind": "struct" + "DerivedStats": { + "type": "DerivedStats", + "kind": "struct", + "comment": "Stats that are derived from skills and base stats" }, "Skills": { "type": "Skills", - "kind": "struct" + "kind": "struct", + "comment": "Stuff that your character can do" + } + }, + "Item": { + "Name": { + "type": "string", + "kind": "string", + "size": "24", + "comment": "Name of the item" + }, + "BaseValue": { + "type": "i32", + "kind": "scalar", + "comment": "Default starting value of the item" + } + }, + "Phenomenon": { + "Name": { + "type": "string", + "kind": "string", + "size": "64", + "comment": "Name of the phenomenon" } } } diff --git a/server/sql/types.sql b/server/sql/types.sql index 77716e8..6a5ca7d 100644 --- a/server/sql/types.sql +++ b/server/sql/types.sql @@ -1,11 +1,18 @@ -CREATE TABLE Stats (id INTEGER PRIMARY KEY AUTOINCREMENT, Strength INTEGER, Endurance INTEGER, Intelligence INTEGER, Wisdom INTEGER, Charisma INTEGER, Faith INTEGER); +CREATE TABLE Vector3 (id INTEGER PRIMARY KEY AUTOINCREMENT, x REAL, y REAL, z REAL); -CREATE TABLE HiddenStats (id INTEGER PRIMARY KEY AUTOINCREMENT, Luck INTEGER, Stealth INTEGER, Attractiveness INTEGER, Affluence INTEGER, Notoriety INTEGER); +CREATE TABLE Stats (id INTEGER PRIMARY KEY AUTOINCREMENT, Strength INTEGER, Endurance INTEGER, Intelligence INTEGER, Wisdom INTEGER, Charisma INTEGER); -CREATE TABLE Skills (id INTEGER PRIMARY KEY AUTOINCREMENT, Artisan INTEGER, Metalworking INTEGER, Alchemy INTEGER, Engineering INTEGER, Culinary INTEGER, Ranged INTEGER, Melee INTEGER, Acrobatics INTEGER, Prestidigitation INTEGER, Language INTEGER, Medicine INTEGER, Thaumatology INTEGER, Theology INTEGER, Fishing INTEGER, Mining INTEGER, Survival INTEGER, Gardening INTEGER, History INTEGER, Perception INTEGER); +CREATE TABLE Skills (id INTEGER PRIMARY KEY AUTOINCREMENT, Artisan INTEGER, Culinary INTEGER, Ranged INTEGER, Melee INTEGER, Acrobatics INTEGER, Prestidigitation INTEGER, Engineering INTEGER, Metalworking INTEGER, Language INTEGER, Medicine INTEGER, Alchemy INTEGER, Fishing INTEGER, Mining INTEGER, Survival INTEGER, Gardening INTEGER, History INTEGER); -CREATE TABLE Entity (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, stats_id INTEGER, hiddenstats_id INTEGER, skills_id INTEGER +CREATE TABLE DerivedStats (id INTEGER PRIMARY KEY AUTOINCREMENT, Hitpoints INTEGER, Stamina INTEGER, Perception INTEGER, Luck INTEGER, Stealth INTEGER, Attractiveness INTEGER, Affluence INTEGER, Holyness INTEGER); + +CREATE TABLE Entity (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, vector3_id INTEGER, stats_id INTEGER, derivedstats_id INTEGER, skills_id INTEGER +, FOREIGN KEY(vector3_id) REFERENCES Vector3(id) , FOREIGN KEY(stats_id) REFERENCES Stats(id) -, FOREIGN KEY(hiddenstats_id) REFERENCES HiddenStats(id) +, FOREIGN KEY(derivedstats_id) REFERENCES DerivedStats(id) , FOREIGN KEY(skills_id) REFERENCES Skills(id)); +CREATE TABLE Item (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, BaseValue INTEGER); + +CREATE TABLE Phenomenon (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT); + diff --git a/tools/js-class-c-struct-transpiler/test/build/Login.js b/tools/js-class-c-struct-transpiler/test/build/Login.js new file mode 100644 index 0000000..aebe5fd --- /dev/null +++ b/tools/js-class-c-struct-transpiler/test/build/Login.js @@ -0,0 +1,42 @@ +class Login { + /** + * Email of the user + */ + get Email() { + return this._decoder.decode(new Uint8Array(this._ptr.slice(0, 256))); + } + set Email(v) { + this._data.set(this._encoder.encode(v), 0); + } + /** + * Password of the user + */ + get Password() { + return this._decoder.decode(new Uint8Array(this._ptr.slice(256, 320))); + } + set Password(v) { + this._data.set(this._encoder.encode(v), 256); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 320; + 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]; + } + } +} + +export default Login \ No newline at end of file diff --git a/tools/js-class-c-struct-transpiler/test/build/LoginRequest.js b/tools/js-class-c-struct-transpiler/test/build/LoginRequest.js new file mode 100644 index 0000000..618d426 --- /dev/null +++ b/tools/js-class-c-struct-transpiler/test/build/LoginRequest.js @@ -0,0 +1,32 @@ +import Login from "./Login" +class LoginRequest { + /** + * user login info + */ + get Login() { + return new Login({}, new Uint8Array(this._ptr.slice(0, 320))); + } + set Login(v) { + this._data.set(v.bytes(), 0); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 320; + this._ptr = ptr.buffer || new ArrayBuffer(this._size); + this._data = new DataView(this._ptr); + + for (const key of Object.keys(init)) { + this[key] = init[key]; + } + } +} + +export default LoginRequest \ No newline at end of file diff --git a/tools/js-class-c-struct-transpiler/test/build/LoginResponse.js b/tools/js-class-c-struct-transpiler/test/build/LoginResponse.js new file mode 100644 index 0000000..f1b7504 --- /dev/null +++ b/tools/js-class-c-struct-transpiler/test/build/LoginResponse.js @@ -0,0 +1,31 @@ +class LoginResponse { + /** + * login was successful or not + */ + get success() { + return this._data.getInt8(0, true); + } + set success(v) { + return this._data.setInt8(0, v, true); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 1; + this._ptr = ptr.buffer || new ArrayBuffer(this._size); + this._data = new DataView(this._ptr); + + for (const key of Object.keys(init)) { + this[key] = init[key]; + } + } +} + +export default LoginResponse \ No newline at end of file diff --git a/tools/js-class-c-struct-transpiler/test/build/User.js b/tools/js-class-c-struct-transpiler/test/build/User.js new file mode 100644 index 0000000..4c7d217 --- /dev/null +++ b/tools/js-class-c-struct-transpiler/test/build/User.js @@ -0,0 +1,53 @@ +import Login from "./Login" +import Vector3 from "./Vector3" +class User { + /** + * Name of the user + */ + get Name() { + return this._decoder.decode(new Uint8Array(this._ptr.slice(0, 24))); + } + set Name(v) { + this._data.set(this._encoder.encode(v), 0); + } + /** + * user login info + */ + get Login() { + return new Login({}, new Uint8Array(this._ptr.slice(24, 344))); + } + set Login(v) { + this._data.set(v.bytes(), 24); + } + /** + * last logout position of user + */ + get Position() { + return new Vector3({}, new Uint8Array(this._ptr.slice(344, 356))); + } + set Position(v) { + this._data.set(v.bytes(), 344); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 356; + 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]; + } + } +} + +export default User \ No newline at end of file diff --git a/tools/js-class-c-struct-transpiler/test/build/Vector3.js b/tools/js-class-c-struct-transpiler/test/build/Vector3.js new file mode 100644 index 0000000..38051b4 --- /dev/null +++ b/tools/js-class-c-struct-transpiler/test/build/Vector3.js @@ -0,0 +1,49 @@ +class Vector3 { + /** + * x coordinate + */ + get x() { + return this._data.getFloat32(0, true); + } + set x(v) { + return this._data.setFloat32(0, v, true); + } + /** + * y coordinate + */ + get y() { + return this._data.getFloat32(4, true); + } + set y(v) { + return this._data.setFloat32(4, v, true); + } + /** + * z coordinate + */ + get z() { + return this._data.getFloat32(8, true); + } + set z(v) { + return this._data.setFloat32(8, v, true); + } + /** + * get the struct representation of the object + */ + get bytes() { + return new Uint8Array(this._ptr); + } + /** + * constructor + */ + constructor(init = {}, ptr = undefined) { + this._size = 12; + this._ptr = ptr.buffer || new ArrayBuffer(this._size); + this._data = new DataView(this._ptr); + + for (const key of Object.keys(init)) { + this[key] = init[key]; + } + } +} + +export default Vector3 \ No newline at end of file diff --git a/tools/js-class-c-struct-transpiler/test/build/test.db b/tools/js-class-c-struct-transpiler/test/build/test.db new file mode 100644 index 0000000000000000000000000000000000000000..303b35c01fe8a01c83659f75c10c6aaab0d8107a GIT binary patch literal 28672 zcmeI#!EVzq7{KvlYa3}$#%0Q3hxx#?Myrre#T8K|Z>s3Bl4Xcqm`WE=M4NPVCfII; z7vRZ|coQB0CnQ=kfmFdQ`df+|+llS(XJ5Y4SN$*v#QS(Y9VMb;JTy$xcrJut7`5Jq00W^ts-4eP*@U0({n`=T#J={wO1FGSDv<&pHn!0R1% zy`gw1hoXDtpY&Y)f_eJX zOWR6&R^5&}ng+s`Z!}4y~ZX=Hlt? zF=YO=QiNI8sv*khD4gUm4n|6Sisu(u(;2Ka?EQUnn60HQCpwirSAjmxNZ*ZebG@|w zoxxV572EnxCo(O2d)r)evMKYx@@lO#Mc%n;5TEsZ==R&KmY** z5I_I{1Q0*~0R#|0puz&={}n!5LPG!n1Q0*~0R#|0009ILKp+<&|K}Yp(YB7gt_2q1s}0tg_000IagK>p7iKmY**5I_I{1Q0*~0R#|0 ep!x#j|J6TZB18ZI1Q0*~0R#|0009ILK;Rc_a0b)> literal 0 HcmV?d00001 diff --git a/tools/js-class-c-struct-transpiler/test/build/types.h b/tools/js-class-c-struct-transpiler/test/build/types.h new file mode 100644 index 0000000..143c3a2 --- /dev/null +++ b/tools/js-class-c-struct-transpiler/test/build/types.h @@ -0,0 +1,25 @@ +typedef struct Vector3 { + float x; // x coordinate + float y; // y coordinate + float z; // z coordinate +} Vector3; + +typedef struct Login { + char Email[256]; // Email of the user + char Password[320]; // Password of the user +} Login; + +typedef struct User { + char Name[24]; // Name of the user + Login Login; // user login info + Vector3 Position; // last logout position of user +} User; + +typedef struct LoginRequest { + Login Login; // user login info +} LoginRequest; + +typedef struct LoginResponse { + char success; // login was successful or not +} LoginResponse; + diff --git a/tools/js-class-c-struct-transpiler/test/build/types.sql b/tools/js-class-c-struct-transpiler/test/build/types.sql new file mode 100644 index 0000000..f585412 --- /dev/null +++ b/tools/js-class-c-struct-transpiler/test/build/types.sql @@ -0,0 +1,13 @@ +CREATE TABLE Vector3 (id INTEGER PRIMARY KEY AUTOINCREMENT, x REAL, y REAL, z REAL); + +CREATE TABLE Login (id INTEGER PRIMARY KEY AUTOINCREMENT, Email TEXT, Password TEXT); + +CREATE TABLE User (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, login_id INTEGER, position_id INTEGER +, FOREIGN KEY(login_id) REFERENCES Login(id) +, FOREIGN KEY(position_id) REFERENCES Vector3(id)); + +CREATE TABLE LoginRequest (id INTEGER PRIMARY KEY AUTOINCREMENT, login_id INTEGER +, FOREIGN KEY(login_id) REFERENCES Login(id)); + +CREATE TABLE LoginResponse (id INTEGER PRIMARY KEY AUTOINCREMENT, success INTEGER); + diff --git a/tools/js-class-c-struct-transpiler/test/schema.json b/tools/js-class-c-struct-transpiler/test/schema.json index c805e9a..f0c7507 100644 --- a/tools/js-class-c-struct-transpiler/test/schema.json +++ b/tools/js-class-c-struct-transpiler/test/schema.json @@ -2,168 +2,64 @@ "Vector3": { "x": { "type": "f32", - "kind": "scalar" + "kind": "scalar", + "comment": "x coordinate" }, "y": { "type": "f32", - "kind": "scalar" + "kind": "scalar", + "comment": "y coordinate" }, "z": { "type": "f32", - "kind": "scalar" + "kind": "scalar", + "comment": "z coordinate" } }, - "Camera3D": { - "position": { - "type": "Vector3", - "kind": "struct" - }, - "target": { - "type": "Vector3", - "kind": "struct" - }, - "up": { - "type": "Vector3", - "kind": "struct" - }, - "fovy": { - "type": "f32", - "kind": "scalar" - }, - "projection": { - "type": "f32", - "kind": "scalar" + "Login": { + "Email": { + "type": "string", + "kind": "string", + "size": "256", + "comment": "Email of the user" + }, + "Password": { + "type": "string", + "kind": "string", + "size": "64", + "comment": "Password of the user" } }, - "Entity": { + "User": { "Name": { "type": "string", "kind": "string", - "size": "24" + "size": "24", + "comment": "Name of the user" }, - "Camera": { - "type": "Camera3D", - "kind": "struct" + "Login": { + "type": "Login", + "kind": "struct", + "comment": "user login info" }, - "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" - }, - "Thaumatology": { - "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" + "Position": { + "type": "Vector3", + "kind": "struct", + "comment": "last logout position of user" + } + }, + "LoginRequest": { + "Login": { + "type": "Login", + "kind": "struct", + "comment": "user login info" + } + }, + "LoginResponse": { + "success": { + "type": "i8", + "kind": "scalar", + "comment": "login was successful or not" } } } diff --git a/tools/js-class-c-struct-transpiler/test/testgen.js b/tools/js-class-c-struct-transpiler/test/testgen.js index 42c234d..e95b8e5 100755 --- a/tools/js-class-c-struct-transpiler/test/testgen.js +++ b/tools/js-class-c-struct-transpiler/test/testgen.js @@ -1,11 +1,11 @@ import { $ } from "bun"; -await $`bun run ../transpile.js -S schema.json -j out/ -c out/ -s out/`; -await $`rm -rf out/test.db`; -await $`sqlite3 out/test.db < out/types.sql`; -const vid1 = await $`echo 'INSERT INTO Vector3 (x, y, z) VALUES (-9.0, 9.0, 4.0) RETURNING id;' | sqlite3 out/test.db`.text(); -const vid2 = await $`echo 'INSERT INTO Vector3 (x, y, z) VALUES (9.0, 9.0, 0.0) RETURNING id;' | sqlite3 out/test.db`.text(); -const vid3 = await $`echo 'INSERT INTO Vector3 (x, y, z) VALUES (0.0, 1.0, 0.0) RETURNING id;' | sqlite3 out/test.db`.text(); -const cid = await $`echo 'INSERT INTO Camera3D (position_id, target_id, up_id, fovy, projection) VALUES (${vid1}, ${vid2}, ${vid3}, 60.0, 0) RETURNING id;' | sqlite3 out/test.db`.text(); -const eid = await $`echo "INSERT INTO Entity (Name, camera_id, Strength, Endurance, Intelligence, Wisdom, Charisma, Faith, Artisan, Metalworking, Alchemy, Engineering, Culinary, Ranged, Melee, Acrobatics, Prestidigitation, Language, Medicine, Thaumatology, Theology, Fishing, Mining, Survival, Gardening, History, Perception, Luck, Stealth, Attractiveness, Affluence, Notoriety) VALUES ('Zongor',${cid},1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,42,1,1,1,1) RETURNING id;" | sqlite3 out/test.db`.text(); -console.log(`generated Entity=${eid} Camera3D=${cid} Vector3=${vid1} Vector3=${vid2} Vector3=${vid3}`); +await $`bun run ../transpile.js -S schema.json -j build/ -c build/ -s build/`; +await $`rm -rf build/test.db`; +await $`sqlite3 build/test.db < build/types.sql`; +// const vid1 = await $`echo 'INSERT INTO Vector3 (x, y, z) VALUES (-9.0, 9.0, 4.0) RETURNING id;' | sqlite3 build/test.db`.text(); +// const vid2 = await $`echo 'INSERT INTO Vector3 (x, y, z) VALUES (9.0, 9.0, 0.0) RETURNING id;' | sqlite3 build/test.db`.text(); +// const vid3 = await $`echo 'INSERT INTO Vector3 (x, y, z) VALUES (0.0, 1.0, 0.0) RETURNING id;' | sqlite3 build/test.db`.text(); +// const cid = await $`echo 'INSERT INTO Camera3D (position_id, target_id, up_id, fovy, projection) VALUES (${vid1}, ${vid2}, ${vid3}, 60.0, 0) RETURNING id;' | sqlite3 build/test.db`.text(); +// const eid = await $`echo "INSERT INTO Entity (Name, camera_id, Strength, Endurance, Intelligence, Wisdom, Charisma, Faith, Artisan, Metalworking, Alchemy, Engineering, Culinary, Ranged, Melee, Acrobatics, Prestidigitation, Language, Medicine, Thaumatology, Theology, Fishing, Mining, Survival, Gardening, History, Perception, Luck, Stealth, Attractiveness, Affluence, Notoriety) VALUES ('Zongor',${cid},1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,42,1,1,1,1) RETURNING id;" | sqlite3 build/test.db`.text(); +// console.log(`generated Entity=${eid} Camera3D=${cid} Vector3=${vid1} Vector3=${vid2} Vector3=${vid3}`); diff --git a/tools/js-class-c-struct-transpiler/transpile.js b/tools/js-class-c-struct-transpiler/transpile.js index ec0f5d6..c7f92a5 100644 --- a/tools/js-class-c-struct-transpiler/transpile.js +++ b/tools/js-class-c-struct-transpiler/transpile.js @@ -87,9 +87,15 @@ const { values } = parseArgs({ function jsStructConstructor(size, containsString) { return ` + /** + * get the struct representation of the object + */ get bytes() { return new Uint8Array(this._ptr); } + /** + * constructor + */ constructor(init = {}, ptr = undefined) { this._size = ${size}; this._ptr = ptr.buffer || new ArrayBuffer(this._size); @@ -126,6 +132,7 @@ for (const type of Object.keys(schema)) { for (const prop of Object.keys(props)) { const propType = props[prop].type; const kind = props[prop].kind; + const comment = props[prop].comment; let typeSize = parseInt(types[propType]?.size); switch (kind) { @@ -134,6 +141,9 @@ for (const type of Object.keys(schema)) { typeSize = props[prop].size; const iSize = parseInt(offset) + parseInt(typeSize); jsData += ` + ${(comment) ? `/** + * ${comment} + */` : ""} get ${prop}() { return this._decoder.decode(new Uint8Array(this._ptr.slice(${parseInt( offset @@ -144,11 +154,14 @@ for (const type of Object.keys(schema)) { }`; sqlData += `, ${prop} TEXT`; cData += ` - char ${prop}[${iSize}];`; + char ${prop}[${iSize}]; // ${comment}`; break; case "scalar": typeSize = types[propType].size; jsData += ` + ${(comment) ? `/** + * ${comment} + */` : ""} get ${prop}() { return this._data.get${types[propType].js}(${parseInt(offset)}, true); } @@ -159,19 +172,22 @@ for (const type of Object.keys(schema)) { }`; sqlData += `, ${prop} ${types[propType].sql}`; cData += ` - ${types[propType].c} ${prop};`; + ${types[propType].c} ${prop}; // ${comment}`; break; case "struct": const jsSize = parseInt(offset) + parseInt(types[propType].size); jsData += ` + ${(comment) ? `/** + * ${comment} + */` : ""} get ${prop}() { return new ${propType}({}, new Uint8Array(this._ptr.slice(${offset}, ${jsSize}))); } set ${prop}(v) { this._data.set(v.bytes(), ${offset}); }`; - const importS = `import ${propType} from "./${propType}"\n\n`; + const importS = `import ${propType} from "./${propType}"\n`; if (!importStatements.includes(importS)) { importStatements += importS; } @@ -179,7 +195,7 @@ for (const type of Object.keys(schema)) { sqlData += `, ${localKey} INTEGER`; foreignKeys += `\n, FOREIGN KEY(${localKey}) REFERENCES ${propType}(id)` - cData += `\n\t\t${types[propType].c} ${prop};`; + cData += `\n\t\t${types[propType].c} ${prop}; // ${comment}`; break; case "array": throw new Error("Not Implemented!");