diff --git a/dist/img/noname.png b/dist/img/noname.png
new file mode 100644
index 0000000..5e7cbf8
Binary files /dev/null and b/dist/img/noname.png differ
diff --git a/dist/js/worm.js b/dist/js/worm.js
index 9d6dac9..c099fa5 100644
--- a/dist/js/worm.js
+++ b/dist/js/worm.js
@@ -8,6 +8,9 @@ const LEFT = 3;
const STATE_START = 0;
const STATE_PLAYING = 1;
const STATE_GAME_OVER = 2;
+const STATE_GAME_WIN = 3;
+
+let started = false;
class Wormle
{
@@ -27,8 +30,10 @@ class Wormle
// Apply class to get properties
this.view.className = "wormle-view";
+ this.apples = [];
this.state_handle();
+ this.loop = null;
}
reset()
@@ -37,16 +42,26 @@ class Wormle
this.body = [];
this.body_len = 8;
this.score = 0;
- this.food_sum = 4;
this.level = 0;
- this.tickspeed = 400;
+ this.tickspeed = 280;
// Controls
this.pos = this.spawn_pos = { x: 3, y: 3 };
this.direction = RIGHT;
this.direction_queue = [];
+ this.clear_apples();
this.apples = [];
- this.add_apple()
+ this.add_apple();
+ }
+
+ clear_apples()
+ {
+ const len = this.apples.length
+ for (let i = 0; i < len; ++i)
+ {
+ this.apples[this.apples.length-1].elem.remove();
+ this.apples.pop();
+ }
}
obj_rand_position()
@@ -116,6 +131,14 @@ class Wormle
}
}
+ last_dir()
+ {
+ if (this.direction_queue.length)
+ return this.direction_queue[this.direction_queue-1];
+ else
+ return this.direction;
+ }
+
worm_update()
{
// Yeah this is ugly and i don't care its just an easter egg...
@@ -176,22 +199,38 @@ class Wormle
Press any key...
`;
}
+ game_win()
+ {
+ this.title.innerHTML = `You won Wormle!
+Pat yourself on the back...
+ `;
+ }
+
start()
{
- this.title.innerHTML = `Wormle
-Press any key...
`;
- this.reset();
-
for (let i of document.querySelectorAll(".wormle-body"))
{
i.remove();
}
+
+ this.title.innerHTML = `Wormle
+`;
+ this.reset();
+
+ // Play button
+ let btn = this.title.querySelector(".wormle-play-btn");
+ let that = this;
+ if (btn)
+ btn.addEventListener("click", () => {
+ that.next_state();
+ this.view.focus();
+ });
}
next_state()
{
this.state++;
- if (this.state > STATE_GAME_OVER)
+ if (this.state >= STATE_GAME_OVER)
this.state = 0;
this.state_handle();
}
@@ -214,6 +253,10 @@ class Wormle
this.game_over();
break;
+ case STATE_GAME_WIN:
+ this.game_win();
+ break;
+
default:
this.score_text.innerHTML = this.score;
this.title.innerHTML = '';
@@ -227,12 +270,22 @@ class Wormle
return this.body[index];
}
+ next_level()
+ {
+ if (this.level > 6) return;
+ this.level++;
+ this.tickspeed -= 25;
+ if (this.level % 2 == 0) this.add_apple();
+ }
+
check_collision(x = this.body[0].pos.x, y = this.body[0].pos.y)
{
for (let i = 1; i < this.body.length; ++i)
{
if (x === this.body[i].pos.x &&
- y === this.body[i].pos.y)
+ y === this.body[i].pos.y ||
+ x >= this.grid_size[0] || x < 0 ||
+ y >= this.grid_size[1] || y < 0)
{
return true;
}
@@ -252,15 +305,30 @@ class Wormle
this.worm_update();
// Apple collision
- for (let apple of this.apples)
+ for (let i = 0; i < this.apples.length; ++i)
{
- if (this.body[0].pos.x === apple.pos.x &&
- this.body[0].pos.y === apple.pos.y)
+ if (this.body[0].pos.x === this.apples[i].pos.x &&
+ this.body[0].pos.y === this.apples[i].pos.y)
{
- apple.elem.remove();
+ // Delete apple
+ this.apples[i].elem.remove();
+ this.apples.splice(i, 1);
+
this.update_score();
this.body_len += APPLE_MULTIPLIER;
this.add_apple();
+
+ // Check if max size
+ if (this.body_len >= this.grid_size[0] * this.grid_size[1])
+ {
+ this.state = STATE_GAME_WIN;
+ this.state_handle();
+ }
+
+ if (this.score % 10 === 0)
+ {
+ this.next_level();
+ }
}
}
@@ -276,6 +344,9 @@ class Wormle
function start_wormle()
{
+ if (started)
+ return;
+ started = true;
let wormle_view = document.createElement("div");
wormle_view.tabIndex = 1;
let title = document.createElement("span");
@@ -288,10 +359,13 @@ function start_wormle()
grid_size: [16, 16], // Tiles
view_size: [400, 400], // Px
});
-
- setInterval(() => {
+
+ let callback = () => {
game.update();
- }, game.tickspeed);
+ game.loop = setTimeout(callback, game.tickspeed);
+ };
+
+ game.loop = setTimeout(callback, game.tickspeed);
document.addEventListener("keydown", (e) => {
// Fallback incase
@@ -305,22 +379,23 @@ function start_wormle()
{
// Left
case 37: {
- game.move(LEFT);
+ if (game.last_dir() !== RIGHT) game.move(LEFT);
break;
}
// Up
case 38: {
- game.move(UP);
+ if (game.last_dir() !== DOWN) game.move(UP);
break;
}
// Right
case 39: {
- game.move(RIGHT);
+ if (game.last_dir() !== LEFT) game.move(RIGHT);
break;
}
// Down
case 40: {
- game.move(DOWN);
+ if (game.last_dir() !== UP)
+ game.move(DOWN);
break;
}
}
diff --git a/dist/treebird20.css b/dist/treebird20.css
index 8fb0709..46cb13d 100644
--- a/dist/treebird20.css
+++ b/dist/treebird20.css
@@ -1975,14 +1975,25 @@ ul.large-list li a.edit-list-btn
border: 0;
padding: 0;
margin: 0;
+ font-size: 54px;
+ text-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3);
+}
+
+.wormle-view h1,
+.wormle-view p,
+.wormle-view .wormle-score,
+.wormle-view input
+{
+ position: relative;
+ z-index: 999;
}
.wormle-body
{
z-index: 3;
position: absolute;
-
- border-radius: 4px;
+ border-radius: 7px;
+ /* border-radius: 4px; */
}
.wormle-player
@@ -1995,19 +2006,41 @@ ul.large-list li a.edit-list-btn
{
background-color: #dd0000;
border: 1px solid #aa0000;
+ border-radius: 100%;
+ box-shadow: 0px 0px 20px 4px rgba(200, 0, 0, 0.4);
}
-/* .wormle-view .wormle-body:last-child */
-/* { */
-/* transition: left .2s linear, top .2s linear; */
-/* } */
+.wormle-play-btn
+{
+ margin-top: 12px;
+ padding: 68px 0px 72px;
+ border: none !important;
+ border-bottom: 4px solid #009000 !important;
+ box-shadow: 0px 4px 14px rgba(0, 0, 0, 0.2);
+ background: linear-gradient(#00ee00, #00cc00);
+ text-shadow: 0px 1px 3px rgba(0, 0, 0, .6);
+ font-size: 34px;
+ font-family: monospace;
+ color: #fff;
+ border-radius: 6px;
+ transition: .1s;
+ cursor: pointer;
+}
+
+.wormle-play-btn:hover
+{
+ margin-top: 16px;
+ border-bottom: 0px solid #009000 !important;
+ box-shadow: none;
+}
.wormle-score
{
z-index: 9;
+ padding-right: 4px;
position: absolute;
- right: 5px;
- font-size: 18px;
+ float: right;
+ font-size: 20px;
color: black;
}