@homie-rocks/studio 0.20.0 → 0.22.0
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/CHANGELOG.md +78 -1
- package/README.md +55 -0
- package/assets/assets.ts +500 -0
- package/assets/render-page.ts +629 -0
- package/assets/safety.mjs +194 -0
- package/bin/homie-studio.mjs +52 -3
- package/lib/art-cli.mjs +296 -0
- package/lib/art-tools.mjs +331 -0
- package/lib/asset-check.mjs +189 -0
- package/lib/asset-import.mjs +136 -0
- package/lib/asset-manifest.mjs +318 -0
- package/lib/build.mjs +25 -2
- package/lib/check.mjs +3 -1
- package/lib/codex.mjs +43 -1
- package/lib/colour.mjs +160 -0
- package/lib/decisions.mjs +800 -0
- package/lib/directory.mjs +9 -1
- package/lib/library.mjs +169 -0
- package/lib/mcp-tools.mjs +22 -4
- package/lib/mcp.mjs +6 -3
- package/lib/office.mjs +30 -8
- package/lib/optimise.mjs +380 -0
- package/lib/port-check.mjs +3 -1
- package/lib/progress.mjs +16 -1
- package/lib/remix-assets.mjs +84 -0
- package/lib/render3d.mjs +81 -0
- package/lib/scaffold.mjs +32 -1
- package/lib/site.mjs +6 -1
- package/lib/studio.mjs +136 -9
- package/lib/style-board.mjs +227 -0
- package/lib/style-presets.mjs +121 -0
- package/lib/template-history.json +75 -0
- package/lib/thumb.mjs +82 -0
- package/mcp/ui/card.css +15 -0
- package/mcp/ui/cast.js +62 -0
- package/mcp/ui/decision.js +61 -0
- package/mcp/ui/lineup.js +68 -0
- package/mcp/ui/rights.js +30 -0
- package/mcp/ui/style.js +154 -0
- package/package.json +14 -2
- package/starters/gem-rush-3d/assets/RIGHTS.md +203 -0
- package/starters/gem-rush-3d/assets/manifest.json +2318 -0
- package/starters/gem-rush-3d/credits.json +31 -0
- package/starters/gem-rush-3d/game.json +11 -0
- package/starters/gem-rush-3d/index.html +20 -0
- package/starters/gem-rush-3d/lab.json +19 -0
- package/starters/gem-rush-3d/src/main.ts +2086 -0
- package/starters/gem-rush-3d/style.json +66 -0
- package/starters/gem-rush-3d/tunables.json +13 -0
- package/worker/index.mjs +5 -3
- package/worker/pages.mjs +13 -5
- package/worker/qr.mjs +11 -0
- package/worker/site.mjs +5 -3
- package/worker/version.mjs +1 -1
package/mcp/ui/style.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/* The style board card: a game's three directions, each drawn by the game engine (a painted mood image beside it only as
|
|
2
|
+
* a labelled target), with Pick, Mix, Steer and Lock; and the style decisions with their state (auto, steered, pinned
|
|
3
|
+
* by use, locked). Every press is the person's: decision_set with by "person", then style_board redraws the card, and
|
|
4
|
+
* the model is told once what changed. */
|
|
5
|
+
(function () {
|
|
6
|
+
var C = Card;
|
|
7
|
+
var STATE = { auto: 'Auto', steered: 'Steered', pinned: 'Pinned', locked: 'Locked' };
|
|
8
|
+
var STATE_CLS = { auto: '', steered: '', pinned: 'live', locked: 'ok' };
|
|
9
|
+
var ui = { mix: false, steer: null, busy: false, msg: null };
|
|
10
|
+
var fontsAsked = {};
|
|
11
|
+
function loadFont(f) {
|
|
12
|
+
if (!f || fontsAsked[f] || !/^[A-Za-z0-9 ]{1,40}$/.test(f)) return;
|
|
13
|
+
fontsAsked[f] = true;
|
|
14
|
+
var l = document.createElement('link'); l.rel = 'stylesheet';
|
|
15
|
+
l.href = 'https://fonts.googleapis.com/css2?family=' + encodeURIComponent(f).replace(/%20/g, '+') + ':wght@400;700&display=swap';
|
|
16
|
+
l.onload = function () { C.size(); };
|
|
17
|
+
document.head.appendChild(l);
|
|
18
|
+
}
|
|
19
|
+
function chips(colours) {
|
|
20
|
+
var row = C.el('span', 'chips');
|
|
21
|
+
(colours || []).forEach(function (c) { if (!/^#[0-9a-f]{3,8}$/i.test(c)) return; var s = C.el('span', 'swatch'); s.style.background = c; s.title = c; row.appendChild(s); });
|
|
22
|
+
return row;
|
|
23
|
+
}
|
|
24
|
+
function refresh(sc, note) {
|
|
25
|
+
return C.call('style_board', { game: sc.game }).then(function (r) { ui.busy = false; ui.msg = note || null; C.take(r); }).catch(function () { ui.busy = false; C.render(); });
|
|
26
|
+
}
|
|
27
|
+
function act(sc, args, tell, note) {
|
|
28
|
+
if (ui.busy) return;
|
|
29
|
+
ui.busy = true; ui.msg = 'Working…'; C.render();
|
|
30
|
+
var a = { game: sc.game, by: 'person' };
|
|
31
|
+
for (var k in args) a[k] = args[k];
|
|
32
|
+
C.call('decision_set', a).then(function (r) {
|
|
33
|
+
var why = r && r.isError ? C.textOf(r) : null;
|
|
34
|
+
if (!why && tell) C.tell(tell.key + ':' + Date.now(), tell.text);
|
|
35
|
+
refresh(sc, why || note);
|
|
36
|
+
}).catch(function () { ui.busy = false; ui.msg = 'That did not reach the studio.'; C.render(); });
|
|
37
|
+
}
|
|
38
|
+
function direction(sc, d) {
|
|
39
|
+
var box = C.el('div', 'dir' + (d.chosen ? ' chosen' : ''));
|
|
40
|
+
if (d.swatch) { var i = C.img(d.swatch, 'Direction ' + d.id.toUpperCase() + ', drawn by the game engine'); if (i) box.appendChild(i); }
|
|
41
|
+
if (d.mood && d.mood.image) {
|
|
42
|
+
var m = C.img(d.mood.image, 'A painted mood image (a target)');
|
|
43
|
+
if (m) { box.appendChild(m); box.appendChild(C.el('p', 'fine', 'Painted target, not what the game draws' + (d.mood.usd ? ' (US$' + d.mood.usd + ')' : ''))); }
|
|
44
|
+
}
|
|
45
|
+
var head = C.add(C.el('div', 'dirhead'), C.el('b', '', d.id.toUpperCase()), C.el('span', '', d.label));
|
|
46
|
+
box.appendChild(head);
|
|
47
|
+
box.appendChild(chips(d.colours));
|
|
48
|
+
if (d.fonts && d.fonts.display) {
|
|
49
|
+
loadFont(d.fonts.display); loadFont(d.fonts.body);
|
|
50
|
+
var t = C.el('p', 'type', sc.title);
|
|
51
|
+
t.style.fontFamily = '"' + d.fonts.display + '", var(--f-sans)';
|
|
52
|
+
var b = C.el('p', 'fine', d.fonts.display + ' and ' + d.fonts.body);
|
|
53
|
+
if (d.fonts.body) b.style.fontFamily = '"' + d.fonts.body + '", var(--f-sans)';
|
|
54
|
+
box.appendChild(t); box.appendChild(b);
|
|
55
|
+
}
|
|
56
|
+
var acts = C.el('div', 'actions');
|
|
57
|
+
acts.appendChild(C.btn(d.chosen ? 'Picked' : 'Pick ' + d.id.toUpperCase(), d.chosen ? 'ghost small' : 'small', function () {
|
|
58
|
+
act(sc, { pick: d.id }, { key: 'pick', text: 'The person picked direction ' + d.id.toUpperCase() + ' (' + d.label + ') on the style board.' }, 'Picked ' + d.id.toUpperCase() + '.');
|
|
59
|
+
}));
|
|
60
|
+
box.appendChild(acts);
|
|
61
|
+
return box;
|
|
62
|
+
}
|
|
63
|
+
function mixTable(sc) {
|
|
64
|
+
var rows = {};
|
|
65
|
+
sc.directions.forEach(function (d) { (d.rows || []).forEach(function (r) { (rows[r.decision] = rows[r.decision] || {})[d.id] = r; }); });
|
|
66
|
+
var t = C.el('div', 'mix');
|
|
67
|
+
Object.keys(rows).forEach(function (dec) {
|
|
68
|
+
var line = C.el('div', 'mixrow');
|
|
69
|
+
line.appendChild(C.el('span', 'mixname', dec.replace('style.', '')));
|
|
70
|
+
sc.directions.forEach(function (d) {
|
|
71
|
+
var r = rows[dec][d.id]; if (!r) return;
|
|
72
|
+
var b = C.btn(d.id.toUpperCase() + ' · ' + r.label, r.same ? 'small' : 'ghost small', function () {
|
|
73
|
+
var m = {}; m[dec] = d.id;
|
|
74
|
+
act(sc, { mix: m }, { key: 'mix', text: 'The person took the ' + dec + ' of direction ' + d.id.toUpperCase() + ' (' + r.label + ') on the style board.' }, 'Mixed in ' + dec + ' from ' + d.id.toUpperCase() + '.');
|
|
75
|
+
});
|
|
76
|
+
b.title = r.same ? 'the game has this now' : 'take this one';
|
|
77
|
+
line.appendChild(b);
|
|
78
|
+
});
|
|
79
|
+
t.appendChild(line);
|
|
80
|
+
});
|
|
81
|
+
return t;
|
|
82
|
+
}
|
|
83
|
+
function decisions(sc) {
|
|
84
|
+
var style = (sc.phases || []).filter(function (p) { return p.id === 'style'; })[0];
|
|
85
|
+
if (!style) return null;
|
|
86
|
+
var list = C.el('ul', 'list decisions');
|
|
87
|
+
style.rows.forEach(function (r) {
|
|
88
|
+
var li = C.el('li', r.state);
|
|
89
|
+
var body = C.add(C.el('div', 'cb'), C.add(C.el('b'), document.createTextNode(r.name + ' ')), C.el('span', '', r.label + (r.steer ? ' (“' + r.steer + '”)' : '')));
|
|
90
|
+
if (r.colours) body.appendChild(chips(r.colours));
|
|
91
|
+
li.appendChild(body);
|
|
92
|
+
var side = C.el('div', 'actions');
|
|
93
|
+
side.appendChild(C.pill(STATE[r.state] || r.state, STATE_CLS[r.state] || ''));
|
|
94
|
+
if (r.state !== 'locked') {
|
|
95
|
+
side.appendChild(C.btn('Steer', 'ghost small', function () { ui.steer = r.id; C.render(); }));
|
|
96
|
+
side.appendChild(C.btn('Lock', 'ghost small', function () {
|
|
97
|
+
act(sc, { decision: r.id, lock: true, words: 'tapped Lock on the style board' }, { key: 'lock', text: 'The person locked ' + r.id + ' (' + r.label + ') on the style board.' }, 'Locked ' + r.name + '.');
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
li.appendChild(side);
|
|
101
|
+
if (ui.steer === r.id) {
|
|
102
|
+
var form = C.el('div', 'steer');
|
|
103
|
+
var input = C.el('input'); input.type = 'text'; input.placeholder = r.id === 'style.palette' ? 'warmer, less saturated, #ff8a3d accent…' : r.id === 'style.camera' ? 'closer, higher, top-down…' : r.id === 'style.light' ? 'golden hour, harder shadows…' : 'in your words';
|
|
104
|
+
input.maxLength = 100;
|
|
105
|
+
var go = function () { var w = input.value.trim(); if (!w) return; ui.steer = null; act(sc, { decision: r.id, steer: w }, { key: 'steer', text: 'The person steered ' + r.id + ': "' + w + '".' }, 'Steered ' + r.name + ': ' + w + '.'); };
|
|
106
|
+
input.onkeydown = function (e) { if (e.key === 'Enter') go(); if (e.key === 'Escape') { ui.steer = null; C.render(); } };
|
|
107
|
+
form.appendChild(input); form.appendChild(C.btn('Steer', 'small', go));
|
|
108
|
+
li.appendChild(form);
|
|
109
|
+
setTimeout(function () { input.focus(); }, 0);
|
|
110
|
+
}
|
|
111
|
+
list.appendChild(li);
|
|
112
|
+
});
|
|
113
|
+
return list;
|
|
114
|
+
}
|
|
115
|
+
function render(sc) {
|
|
116
|
+
var card = C.el('main', 'card');
|
|
117
|
+
var locked = 0; var total = 0;
|
|
118
|
+
(sc.phases || []).forEach(function (p) { if (p.id !== 'style') return; p.rows.forEach(function (r) { total++; if (r.state === 'locked') locked++; }); });
|
|
119
|
+
C.add(card, C.top('Style board', C.add(C.el('div', 'actions'), C.pill(locked === total && total ? 'Style locked' : locked + ' of ' + total + ' locked', locked === total && total ? 'ok' : ''), C.fullscreenButton())),
|
|
120
|
+
C.el('h1', '', sc.title), C.el('p', 'sub', sc.line || 'No decisions yet.'));
|
|
121
|
+
if (ui.msg) card.appendChild(C.el('p', 'note', ui.msg));
|
|
122
|
+
if (!sc.directions || !sc.directions.length) {
|
|
123
|
+
card.appendChild(C.el('p', 'note', 'No board yet: three directions, drawn by the game engine, free.'));
|
|
124
|
+
card.appendChild(C.add(C.el('div', 'actions'), C.btn('Draw the board', '', function () { ui.msg = 'Drawing (about 20 s)…'; C.render(); C.call('style_explore', { game: sc.game }).then(function (r) { ui.msg = null; C.take(r); }); })));
|
|
125
|
+
} else {
|
|
126
|
+
var grid = C.el('div', 'dirs');
|
|
127
|
+
sc.directions.forEach(function (d) { grid.appendChild(direction(sc, d)); });
|
|
128
|
+
card.appendChild(grid);
|
|
129
|
+
card.appendChild(C.el('p', 'fine', 'Each swatch is what the game will look like: drawn by its own engine, with the free starter library\'s pieces re-tinted into the palette.'));
|
|
130
|
+
var bar = C.el('div', 'actions');
|
|
131
|
+
bar.appendChild(C.btn(ui.mix ? 'Done mixing' : 'Mix', 'ghost small', function () { ui.mix = !ui.mix; C.render(); }));
|
|
132
|
+
bar.appendChild(C.btn('Lock the style', 'small', function () {
|
|
133
|
+
act(sc, { decision: 'style.render', lock: 'style', words: 'tapped Lock the style on the style board' }, { key: 'lockall', text: 'The person locked the whole style (every style decision) on the style board.' }, 'The style is locked.');
|
|
134
|
+
}));
|
|
135
|
+
if (!sc.directions.some(function (d) { return d.mood; })) {
|
|
136
|
+
bar.appendChild(C.btn(sc.quote && sc.quote.usd ? 'Paint mood images (US$' + sc.quote.usd + ')' : 'Price mood images', 'ghost small', function () {
|
|
137
|
+
if (sc.quote && sc.quote.usd) {
|
|
138
|
+
C.tell('mood:' + Date.now(), 'The person asked for the three painted mood images at about US$' + sc.quote.usd + ' on their own fal account (a target, labelled so). Make them with style_explore paid and approve.');
|
|
139
|
+
ui.msg = 'Asked your AI to paint them (about US$' + sc.quote.usd + ', your fal account).'; C.render();
|
|
140
|
+
} else { ui.msg = 'Pricing…'; C.render(); C.call('style_explore', { game: sc.game, paid: true }).then(function (r) { ui.msg = null; C.take(r); }); }
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
card.appendChild(bar);
|
|
144
|
+
if (ui.mix) card.appendChild(mixTable(sc));
|
|
145
|
+
}
|
|
146
|
+
var dl = decisions(sc);
|
|
147
|
+
if (dl) { card.appendChild(C.el('h2', '', 'Style decisions')); card.appendChild(dl); }
|
|
148
|
+
var foot = C.el('div', 'foot');
|
|
149
|
+
foot.appendChild(C.el('span', 'when', (sc.stale && sc.stale.length ? sc.stale.length + ' stale asset' + (sc.stale.length === 1 ? '' : 's') + ' · ' : '') + 'Spent US$' + (sc.spend ? sc.spend.used.toFixed(2) : '0.00') + (sc.spend && sc.spend.cap !== null ? ' of US$' + sc.spend.cap : '')));
|
|
150
|
+
card.appendChild(foot);
|
|
151
|
+
return card;
|
|
152
|
+
}
|
|
153
|
+
C.start({ kind: 'style', label: 'Style board', fullscreen: true, render: render, poll: null });
|
|
154
|
+
})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@homie-rocks/studio",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "A studio for games, music and video on its own Cloudflare: scaffold, multiplayer starters on the netplay contract, a port toolkit that makes existing single-player web games multiplayer, the site Worker with public rooms (Table/Lobby Durable Objects and D1, all on the free Workers plan, no payment method), a site with the hub's sections (Home, Games, Music, Videos, Rooms, Posts with feeds) in the studio's own look, an epic landing page for every game, big songs and videos in the studio's own R2 once it has storage (uploaded, checked by SHA-256, served at the same addresses), deploy, and the homie.rocks directory.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -38,6 +38,10 @@
|
|
|
38
38
|
"types": "./lab/lab.ts",
|
|
39
39
|
"default": "./lab/lab.ts"
|
|
40
40
|
},
|
|
41
|
+
"./assets": {
|
|
42
|
+
"types": "./assets/assets.ts",
|
|
43
|
+
"default": "./assets/assets.ts"
|
|
44
|
+
},
|
|
41
45
|
"./worker": "./worker/index.mjs",
|
|
42
46
|
"./package.json": "./package.json"
|
|
43
47
|
},
|
|
@@ -51,6 +55,7 @@
|
|
|
51
55
|
"saves/",
|
|
52
56
|
"agents/",
|
|
53
57
|
"lab/",
|
|
58
|
+
"assets/",
|
|
54
59
|
"starters/",
|
|
55
60
|
"media/",
|
|
56
61
|
"site/",
|
|
@@ -64,8 +69,15 @@
|
|
|
64
69
|
},
|
|
65
70
|
"dependencies": {
|
|
66
71
|
"@anthropic-ai/sdk": "0.131.0",
|
|
72
|
+
"@gltf-transform/core": "4.5.1",
|
|
73
|
+
"@gltf-transform/extensions": "4.5.1",
|
|
74
|
+
"@gltf-transform/functions": "4.5.1",
|
|
67
75
|
"esbuild": "0.28.1",
|
|
68
|
-
"
|
|
76
|
+
"gltf-validator": "2.0.0-dev.3.10",
|
|
77
|
+
"meshoptimizer": "1.3.0",
|
|
78
|
+
"puppeteer-core": "25.8.0",
|
|
79
|
+
"sharp": "0.35.5",
|
|
80
|
+
"three": "0.185.1"
|
|
69
81
|
},
|
|
70
82
|
"scripts": {
|
|
71
83
|
"test": "node --test test/*.test.mjs"
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Rights: Gem Rush 3D
|
|
2
|
+
|
|
3
|
+
Every file this game ships, where it came from, its licence and what that allows. Written by `homie-studio assets rights gem-rush-3d` from `assets/manifest.json`; do not edit it by hand.
|
|
4
|
+
|
|
5
|
+
## What the providers' terms say
|
|
6
|
+
|
|
7
|
+
Read on the dates shown. Terms change: read the live page again before publishing anything commercial.
|
|
8
|
+
|
|
9
|
+
- **Kenney** (https://kenney.nl/support, read 2026-10-02): Public domain (CC0): use in any project, commercial or not; credit is not required (kindly given anyway).
|
|
10
|
+
|
|
11
|
+
## Files
|
|
12
|
+
|
|
13
|
+
### animal-cat
|
|
14
|
+
|
|
15
|
+
- **What:** character (Players/Cat): `public/models/animal-cat.glb`
|
|
16
|
+
- **From:** from the Homie starter library: Kenney Cube Pets, animal-cat (https://kenney.nl/assets/cube-pets); library, in game (src/main.ts)
|
|
17
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
18
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
19
|
+
- **Notes:** From the Homie starter library (kenney-cube-pets); the pack's own licence text: licenses/kenney-cube-pets.txt. `game new` fetches the file; the repository holds no models.
|
|
20
|
+
|
|
21
|
+
### animal-caterpillar
|
|
22
|
+
|
|
23
|
+
- **What:** character (Players/Caterpillar): `public/models/animal-caterpillar.glb`
|
|
24
|
+
- **From:** from the Homie starter library: Kenney Cube Pets, animal-caterpillar (https://kenney.nl/assets/cube-pets); library, in game (src/main.ts)
|
|
25
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
26
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
27
|
+
- **Notes:** From the Homie starter library (kenney-cube-pets); the pack's own licence text: licenses/kenney-cube-pets.txt. `game new` fetches the file; the repository holds no models.
|
|
28
|
+
|
|
29
|
+
### animal-chick
|
|
30
|
+
|
|
31
|
+
- **What:** character (Players/Chick): `public/models/animal-chick.glb`
|
|
32
|
+
- **From:** from the Homie starter library: Kenney Cube Pets, animal-chick (https://kenney.nl/assets/cube-pets); library, in game (src/main.ts)
|
|
33
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
34
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
35
|
+
- **Notes:** From the Homie starter library (kenney-cube-pets); the pack's own licence text: licenses/kenney-cube-pets.txt. `game new` fetches the file; the repository holds no models.
|
|
36
|
+
|
|
37
|
+
### animal-crab
|
|
38
|
+
|
|
39
|
+
- **What:** character (Players/Crab): `public/models/animal-crab.glb`
|
|
40
|
+
- **From:** from the Homie starter library: Kenney Cube Pets, animal-crab (https://kenney.nl/assets/cube-pets); library, in game (src/main.ts)
|
|
41
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
42
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
43
|
+
- **Notes:** From the Homie starter library (kenney-cube-pets); the pack's own licence text: licenses/kenney-cube-pets.txt. `game new` fetches the file; the repository holds no models.
|
|
44
|
+
|
|
45
|
+
### animal-elephant
|
|
46
|
+
|
|
47
|
+
- **What:** character (Players/Elephant): `public/models/animal-elephant.glb`
|
|
48
|
+
- **From:** from the Homie starter library: Kenney Cube Pets, animal-elephant (https://kenney.nl/assets/cube-pets); library, in game (src/main.ts)
|
|
49
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
50
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
51
|
+
- **Notes:** From the Homie starter library (kenney-cube-pets); the pack's own licence text: licenses/kenney-cube-pets.txt. `game new` fetches the file; the repository holds no models.
|
|
52
|
+
|
|
53
|
+
### animal-fox
|
|
54
|
+
|
|
55
|
+
- **What:** character (Players/Fox): `public/models/animal-fox.glb`
|
|
56
|
+
- **From:** from the Homie starter library: Kenney Cube Pets, animal-fox (https://kenney.nl/assets/cube-pets); library, in game (src/main.ts)
|
|
57
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
58
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
59
|
+
- **Notes:** From the Homie starter library (kenney-cube-pets); the pack's own licence text: licenses/kenney-cube-pets.txt. `game new` fetches the file; the repository holds no models.
|
|
60
|
+
|
|
61
|
+
### animal-panda
|
|
62
|
+
|
|
63
|
+
- **What:** character (Players/Panda): `public/models/animal-panda.glb`
|
|
64
|
+
- **From:** from the Homie starter library: Kenney Cube Pets, animal-panda (https://kenney.nl/assets/cube-pets); library, in game (src/main.ts)
|
|
65
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
66
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
67
|
+
- **Notes:** From the Homie starter library (kenney-cube-pets); the pack's own licence text: licenses/kenney-cube-pets.txt. `game new` fetches the file; the repository holds no models.
|
|
68
|
+
|
|
69
|
+
### animal-pig
|
|
70
|
+
|
|
71
|
+
- **What:** character (Players/Pig): `public/models/animal-pig.glb`
|
|
72
|
+
- **From:** from the Homie starter library: Kenney Cube Pets, animal-pig (https://kenney.nl/assets/cube-pets); library, in game (src/main.ts)
|
|
73
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
74
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
75
|
+
- **Notes:** From the Homie starter library (kenney-cube-pets); the pack's own licence text: licenses/kenney-cube-pets.txt. `game new` fetches the file; the repository holds no models.
|
|
76
|
+
|
|
77
|
+
### bush
|
|
78
|
+
|
|
79
|
+
- **What:** prop (Places/Bush): `public/models/bush.glb`
|
|
80
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, tree-fat (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
81
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
82
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
83
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
84
|
+
|
|
85
|
+
### campfire
|
|
86
|
+
|
|
87
|
+
- **What:** prop (Places/Campfire): `public/models/campfire.glb`
|
|
88
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, campfire-stones (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
89
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
90
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
91
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
92
|
+
|
|
93
|
+
### fence
|
|
94
|
+
|
|
95
|
+
- **What:** kit (Places/Fence): `public/models/fence.glb`
|
|
96
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, fence-simple (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
97
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
98
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
99
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
100
|
+
|
|
101
|
+
### firewood
|
|
102
|
+
|
|
103
|
+
- **What:** prop (Places/Firewood): `public/models/firewood.glb`
|
|
104
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, campfire-logs (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
105
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
106
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
107
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
108
|
+
|
|
109
|
+
### flower-purple
|
|
110
|
+
|
|
111
|
+
- **What:** prop (Places/Purple flower): `public/models/flower-purple.glb`
|
|
112
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, flower-purple-a (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
113
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
114
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
115
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
116
|
+
|
|
117
|
+
### flower-red
|
|
118
|
+
|
|
119
|
+
- **What:** prop (Places/Red flower): `public/models/flower-red.glb`
|
|
120
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, flower-red-a (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
121
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
122
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
123
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
124
|
+
|
|
125
|
+
### flower-yellow
|
|
126
|
+
|
|
127
|
+
- **What:** prop (Places/Yellow flower): `public/models/flower-yellow.glb`
|
|
128
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, flower-yellow-a (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
129
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
130
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
131
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
132
|
+
|
|
133
|
+
### gem
|
|
134
|
+
|
|
135
|
+
- **What:** prop (Items/Gem): `public/models/gem.glb`
|
|
136
|
+
- **From:** from the Homie starter library: Kenney Platformer Kit, jewel (https://kenney.nl/assets/platformer-kit); library, in game (src/main.ts)
|
|
137
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
138
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
139
|
+
- **Notes:** From the Homie starter library (kenney-platformer-kit); the pack's own licence text: licenses/kenney-platformer-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
140
|
+
|
|
141
|
+
### grass
|
|
142
|
+
|
|
143
|
+
- **What:** prop (Places/Grass): `public/models/grass.glb`
|
|
144
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, grass-leafs-large (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
145
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
146
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
147
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
148
|
+
|
|
149
|
+
### log
|
|
150
|
+
|
|
151
|
+
- **What:** prop (Places/Log seat): `public/models/log.glb`
|
|
152
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, log-large (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
153
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
154
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
155
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
156
|
+
|
|
157
|
+
### mushrooms
|
|
158
|
+
|
|
159
|
+
- **What:** prop (Places/Mushrooms): `public/models/mushrooms.glb`
|
|
160
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, mushroom-red-group (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
161
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
162
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
163
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
164
|
+
|
|
165
|
+
### rock
|
|
166
|
+
|
|
167
|
+
- **What:** prop (Places/Rock): `public/models/rock.glb`
|
|
168
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, stone-large-d (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
169
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
170
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
171
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
172
|
+
|
|
173
|
+
### stone
|
|
174
|
+
|
|
175
|
+
- **What:** prop (Places/Standing stone): `public/models/stone.glb`
|
|
176
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, stone-tall-c (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
177
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
178
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
179
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
180
|
+
|
|
181
|
+
### tree-oak
|
|
182
|
+
|
|
183
|
+
- **What:** prop (Places/Oak tree): `public/models/tree-oak.glb`
|
|
184
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, tree-oak (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
185
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
186
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
187
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
188
|
+
|
|
189
|
+
### tree-pine
|
|
190
|
+
|
|
191
|
+
- **What:** prop (Places/Pine): `public/models/tree-pine.glb`
|
|
192
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, tree-pine-round-a (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
193
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
194
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
195
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|
|
196
|
+
|
|
197
|
+
### tree-round
|
|
198
|
+
|
|
199
|
+
- **What:** prop (Places/Round tree): `public/models/tree-round.glb`
|
|
200
|
+
- **From:** from the Homie starter library: Kenney Nature Kit, tree-default (https://kenney.nl/assets/nature-kit); library, in game (src/main.ts)
|
|
201
|
+
- **Licence:** CC0 1.0 (public domain) (https://creativecommons.org/publicdomain/zero/1.0/); owner: Kenney
|
|
202
|
+
- **A remix:** a remix gets this file (fetched from this studio's site, checked by SHA-256)
|
|
203
|
+
- **Notes:** From the Homie starter library (kenney-nature-kit); the pack's own licence text: licenses/kenney-nature-kit.txt. `game new` fetches the file; the repository holds no models.
|