Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
168 changes: 168 additions & 0 deletions games/Vasko-JS-game.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
/*
@title: Vasko JS Game
@author: vask3
@description: Hello, that is my first JS game.
@tags: ['puzzle']
@addedOn: 2026-10-18
*/

const player = "p";
const block = "b";
const goal = "g";
const wall = "w";
const key = "k";
const door = "d";

// Дефиниция на color помощната функция, за да се премахне ReferenceError
const color = (strings, value) => value;

let levelIndex = 0;
let moves = 0;
let hasKey = false;

setLegend(
[player, bitmap`
...33...
..3333..
...33...
..3333..
...3.3..
`],
[block, bitmap`
22222222
28888882
28222282
28888882
22222222
`],
[goal, bitmap`
........
..5555..
..5..5..
..5555..
........
`],
[wall, bitmap`
11111111
11111111
11111111
11111111
`],
[key, bitmap`
........
..00....
..00000.
....0.0.
........
`],
[door, bitmap`
77777777
7......7
7..77..7
77777777
`]
);

const levels = [
map`
wwwwwwwww
w.......w
w..p.b..w
w.....g.w
w.......w
wwwwwwwww`,

map`
wwwwwwwww
w.p...k.w
w.wwwdwww
w...b...w
w.....g.w
wwwwwwwww`,

map`
wwwwwwwwwww
w.p...w...w
w.bbb.w.k.w
w.....d...w
w.www.w.g.w
w.........w
wwwwwwwwwww`
];

function loadLevel(idx) {
hasKey = false;
moves = 0;
clearText();

if (idx < levels.length) {
setLevel(levels[idx]);
addText(`Level: ${idx + 1}`, { x: 1, y: 0, color: color`3` });
addText(`Moves: ${moves}`, { x: 7, y: 0, color: color`3` });
} else {
addText("YOU WIN!", { x: 2, y: 2, color: color`5` });
}
}

loadLevel(levelIndex);

setSolids([player, block, wall, door]);
setPushables({
[player]: [block]
});

function canMove(sprite, dx, dy) {
const targetX = sprite.x + dx;
const targetY = sprite.y + dy;

if (targetX < 0 || targetX >= width() || targetY < 0 || targetY >= height()) {
return false;
}

return true;
}

function movePlayer(dx, dy) {
const p = getFirst(player);
if (!p) return;

if (canMove(p, dx, dy)) {
p.x += dx;
p.y += dy;
moves++;

const k = getFirst(key);
if (k && p.x === k.x && p.y === k.y) {
k.remove();
hasKey = true;
const d = getFirst(door);
if (d) d.remove();
}
}
}

onInput("w", () => movePlayer(0, -1));
onInput("s", () => movePlayer(0, 1));
onInput("a", () => movePlayer(-1, 0));
onInput("d", () => movePlayer(1, 0));

onInput("r", () => {
loadLevel(levelIndex);
});

afterInput(() => {
addText(`Moves: ${moves}`, { x: 7, y: 0, color: color`3` });

const b = getFirst(block);
const g = getFirst(goal);

if (b && g && b.x === g.x && b.y === g.y) {
levelIndex++;
if (levelIndex < levels.length) {
loadLevel(levelIndex);
} else {
clearText();
addText("YOU WIN!", { x: 2, y: 2, color: color`5` });
}
}
});
Loading