Skip to content

Commit 29c7ee4

Browse files
author
release bot
committed
📦 2.1.0
1 parent 21655d1 commit 29c7ee4

File tree

8 files changed

+12774
-29216
lines changed

8 files changed

+12774
-29216
lines changed

‎action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ author: "platane"
44

55
runs:
66
using: docker
7-
image: docker://platane/snk@sha256:3169a2e4a5b5181c203ae18e7075d0d92be88a0cdeabce6c3221288ef6a17675
7+
image: docker://platane/snk@sha256:89466e404c3d3ba2384e24aabad0542a643eacdc53d0c6320ce369cc1af19d56
88

99
inputs:
1010
github_user_name:

‎package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "snk",
33
"description": "Generates a snake game from a github user contributions grid",
4-
"version": "2.0.0",
4+
"version": "2.1.0",
55
"private": true,
66
"repository": "github:platane/snk",
77
"devDependencies": {

‎svg-only/dist/142.index.js

Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
"use strict";
2+
exports.id = 142;
3+
exports.ids = [142];
4+
exports.modules = {
5+
6+
/***/ 7142:
7+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8+
9+
// ESM COMPAT FLAG
10+
__webpack_require__.r(__webpack_exports__);
11+
12+
// EXPORTS
13+
__webpack_require__.d(__webpack_exports__, {
14+
"createGif": () => (/* binding */ createGif)
15+
});
16+
17+
// EXTERNAL MODULE: external "fs"
18+
var external_fs_ = __webpack_require__(7147);
19+
var external_fs_default = /*#__PURE__*/__webpack_require__.n(external_fs_);
20+
// EXTERNAL MODULE: external "path"
21+
var external_path_ = __webpack_require__(1017);
22+
var external_path_default = /*#__PURE__*/__webpack_require__.n(external_path_);
23+
// EXTERNAL MODULE: external "child_process"
24+
var external_child_process_ = __webpack_require__(2081);
25+
// EXTERNAL MODULE: external "canvas"
26+
var external_canvas_ = __webpack_require__(1576);
27+
// EXTERNAL MODULE: ../types/grid.ts
28+
var types_grid = __webpack_require__(2881);
29+
;// CONCATENATED MODULE: ../draw/pathRoundedRect.ts
30+
const pathRoundedRect_pathRoundedRect = (ctx, width, height, borderRadius) => {
31+
ctx.moveTo(borderRadius, 0);
32+
ctx.arcTo(width, 0, width, height, borderRadius);
33+
ctx.arcTo(width, height, 0, height, borderRadius);
34+
ctx.arcTo(0, height, 0, 0, borderRadius);
35+
ctx.arcTo(0, 0, width, 0, borderRadius);
36+
};
37+
38+
;// CONCATENATED MODULE: ../draw/drawGrid.ts
39+
40+
41+
const drawGrid_drawGrid = (ctx, grid, cells, o) => {
42+
for (let x = grid.width; x--;)
43+
for (let y = grid.height; y--;) {
44+
if (!cells || cells.some((c) => c.x === x && c.y === y)) {
45+
const c = (0,types_grid/* getColor */.Lq)(grid, x, y);
46+
// @ts-ignore
47+
const color = !c ? o.colorEmpty : o.colorDots[c];
48+
ctx.save();
49+
ctx.translate(x * o.sizeCell + (o.sizeCell - o.sizeDot) / 2, y * o.sizeCell + (o.sizeCell - o.sizeDot) / 2);
50+
ctx.fillStyle = color;
51+
ctx.strokeStyle = o.colorDotBorder;
52+
ctx.lineWidth = 1;
53+
ctx.beginPath();
54+
pathRoundedRect_pathRoundedRect(ctx, o.sizeDot, o.sizeDot, o.sizeDotBorderRadius);
55+
ctx.fill();
56+
ctx.stroke();
57+
ctx.closePath();
58+
ctx.restore();
59+
}
60+
}
61+
};
62+
63+
;// CONCATENATED MODULE: ../draw/drawSnake.ts
64+
65+
66+
const drawSnake_drawSnake = (ctx, snake, o) => {
67+
const cells = snakeToCells(snake);
68+
for (let i = 0; i < cells.length; i++) {
69+
const u = (i + 1) * 0.6;
70+
ctx.save();
71+
ctx.fillStyle = o.colorSnake;
72+
ctx.translate(cells[i].x * o.sizeCell + u, cells[i].y * o.sizeCell + u);
73+
ctx.beginPath();
74+
pathRoundedRect(ctx, o.sizeCell - u * 2, o.sizeCell - u * 2, (o.sizeCell - u * 2) * 0.25);
75+
ctx.fill();
76+
ctx.restore();
77+
}
78+
};
79+
const lerp = (k, a, b) => (1 - k) * a + k * b;
80+
const clamp = (x, a, b) => Math.max(a, Math.min(b, x));
81+
const drawSnakeLerp = (ctx, snake0, snake1, k, o) => {
82+
const m = 0.8;
83+
const n = snake0.length / 2;
84+
for (let i = 0; i < n; i++) {
85+
const u = (i + 1) * 0.6 * (o.sizeCell / 16);
86+
const a = (1 - m) * (i / Math.max(n - 1, 1));
87+
const ki = clamp((k - a) / m, 0, 1);
88+
const x = lerp(ki, snake0[i * 2 + 0], snake1[i * 2 + 0]) - 2;
89+
const y = lerp(ki, snake0[i * 2 + 1], snake1[i * 2 + 1]) - 2;
90+
ctx.save();
91+
ctx.fillStyle = o.colorSnake;
92+
ctx.translate(x * o.sizeCell + u, y * o.sizeCell + u);
93+
ctx.beginPath();
94+
pathRoundedRect_pathRoundedRect(ctx, o.sizeCell - u * 2, o.sizeCell - u * 2, (o.sizeCell - u * 2) * 0.25);
95+
ctx.fill();
96+
ctx.restore();
97+
}
98+
};
99+
100+
;// CONCATENATED MODULE: ../draw/drawWorld.ts
101+
102+
103+
const drawStack = (ctx, stack, max, width, o) => {
104+
ctx.save();
105+
const m = width / max;
106+
for (let i = 0; i < stack.length; i++) {
107+
// @ts-ignore
108+
ctx.fillStyle = o.colorDots[stack[i]];
109+
ctx.fillRect(i * m, 0, m + width * 0.005, 10);
110+
}
111+
ctx.restore();
112+
};
113+
const drawWorld = (ctx, grid, cells, snake, stack, o) => {
114+
ctx.save();
115+
ctx.translate(1 * o.sizeCell, 2 * o.sizeCell);
116+
drawGrid(ctx, grid, cells, o);
117+
drawSnake(ctx, snake, o);
118+
ctx.restore();
119+
ctx.save();
120+
ctx.translate(o.sizeCell, (grid.height + 4) * o.sizeCell);
121+
const max = grid.data.reduce((sum, x) => sum + +!!x, stack.length);
122+
drawStack(ctx, stack, max, grid.width * o.sizeCell, o);
123+
ctx.restore();
124+
// ctx.save();
125+
// ctx.translate(o.sizeCell + 100, (grid.height + 4) * o.sizeCell + 100);
126+
// ctx.scale(0.6, 0.6);
127+
// drawCircleStack(ctx, stack, o);
128+
// ctx.restore();
129+
};
130+
const drawLerpWorld = (ctx, grid, cells, snake0, snake1, stack, k, o) => {
131+
ctx.save();
132+
ctx.translate(1 * o.sizeCell, 2 * o.sizeCell);
133+
drawGrid_drawGrid(ctx, grid, cells, o);
134+
drawSnakeLerp(ctx, snake0, snake1, k, o);
135+
ctx.translate(0, (grid.height + 2) * o.sizeCell);
136+
const max = grid.data.reduce((sum, x) => sum + +!!x, stack.length);
137+
drawStack(ctx, stack, max, grid.width * o.sizeCell, o);
138+
ctx.restore();
139+
};
140+
const getCanvasWorldSize = (grid, o) => {
141+
const width = o.sizeCell * (grid.width + 2);
142+
const height = o.sizeCell * (grid.height + 4) + 30;
143+
return { width, height };
144+
};
145+
146+
// EXTERNAL MODULE: ../types/snake.ts
147+
var types_snake = __webpack_require__(9347);
148+
;// CONCATENATED MODULE: ../solver/step.ts
149+
150+
151+
const step = (grid, stack, snake) => {
152+
const x = (0,types_snake/* getHeadX */.If)(snake);
153+
const y = (0,types_snake/* getHeadY */.IP)(snake);
154+
const color = (0,types_grid/* getColor */.Lq)(grid, x, y);
155+
if ((0,types_grid/* isInside */.V0)(grid, x, y) && !(0,types_grid/* isEmpty */.xb)(color)) {
156+
stack.push(color);
157+
(0,types_grid/* setColorEmpty */.Dy)(grid, x, y);
158+
}
159+
};
160+
161+
// EXTERNAL MODULE: ../../node_modules/tmp/lib/tmp.js
162+
var tmp = __webpack_require__(6382);
163+
// EXTERNAL MODULE: external "gifsicle"
164+
var external_gifsicle_ = __webpack_require__(542);
165+
var external_gifsicle_default = /*#__PURE__*/__webpack_require__.n(external_gifsicle_);
166+
// EXTERNAL MODULE: ../../node_modules/gif-encoder-2/index.js
167+
var gif_encoder_2 = __webpack_require__(3561);
168+
var gif_encoder_2_default = /*#__PURE__*/__webpack_require__.n(gif_encoder_2);
169+
;// CONCATENATED MODULE: ../gif-creator/index.ts
170+
171+
172+
173+
174+
175+
176+
177+
178+
179+
// @ts-ignore
180+
181+
const withTmpDir = async (handler) => {
182+
const { name: dir, removeCallback: cleanUp } = tmp.dirSync({
183+
unsafeCleanup: true,
184+
});
185+
try {
186+
return await handler(dir);
187+
}
188+
finally {
189+
cleanUp();
190+
}
191+
};
192+
const createGif = async (grid0, cells, chain, drawOptions, animationOptions) => withTmpDir(async (dir) => {
193+
const { width, height } = getCanvasWorldSize(grid0, drawOptions);
194+
const canvas = (0,external_canvas_.createCanvas)(width, height);
195+
const ctx = canvas.getContext("2d");
196+
const grid = (0,types_grid/* copyGrid */.VJ)(grid0);
197+
const stack = [];
198+
const encoder = new (gif_encoder_2_default())(width, height, "neuquant", true);
199+
encoder.setRepeat(0);
200+
encoder.setDelay(animationOptions.frameDuration);
201+
encoder.start();
202+
for (let i = 0; i < chain.length; i += 1) {
203+
const snake0 = chain[i];
204+
const snake1 = chain[Math.min(chain.length - 1, i + 1)];
205+
step(grid, stack, snake0);
206+
for (let k = 0; k < animationOptions.step; k++) {
207+
ctx.clearRect(0, 0, width, height);
208+
ctx.fillStyle = "#fff";
209+
ctx.fillRect(0, 0, width, height);
210+
drawLerpWorld(ctx, grid, cells, snake0, snake1, stack, k / animationOptions.step, drawOptions);
211+
encoder.addFrame(ctx);
212+
}
213+
}
214+
const outFileName = external_path_default().join(dir, "out.gif");
215+
const optimizedFileName = external_path_default().join(dir, "out.optimized.gif");
216+
encoder.finish();
217+
external_fs_default().writeFileSync(outFileName, encoder.out.getData());
218+
(0,external_child_process_.execFileSync)((external_gifsicle_default()), [
219+
//
220+
"--optimize=3",
221+
"--color-method=diversity",
222+
"--colors=18",
223+
outFileName,
224+
["--output", optimizedFileName],
225+
].flat());
226+
return external_fs_default().readFileSync(optimizedFileName);
227+
});
228+
229+
230+
/***/ })
231+
232+
};
233+
;

0 commit comments

Comments
 (0)