summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormunvoseli <muslinmelody@gmail.com>2023-06-10 12:46:32 -0400
committermunvoseli <muslinmelody@gmail.com>2023-06-10 12:46:32 -0400
commit43e339118f0fae3a8bf39caf610ed1c2265f4283 (patch)
tree6b551ff4ed49d2abedce0b131a90522815711b53
parentfb8300d51afad21fb307422f54f150ba98dcd5e3 (diff)
parent906f352206bfa49304a9fbea5c3455df75cdfb3c (diff)
merge new movement mechanics
-rw-r--r--public/javascript/game.js151
1 files changed, 77 insertions, 74 deletions
diff --git a/public/javascript/game.js b/public/javascript/game.js
index 3103674..88ebf70 100644
--- a/public/javascript/game.js
+++ b/public/javascript/game.js
@@ -69,7 +69,6 @@ var textToPlaceInput;
var textToPlace = null;
var textToPlaceIndex;
var textToPlaceIsWaitingToWalk;
-var localPlayerWalkRepeatDirections = [];
var localPlayerWalkRepeatDelay = 0;
var localPlayerShouldStopWalkRepeat = true;
var lKeyIsHeld = false;
@@ -80,9 +79,11 @@ var gameUpdateSocket;
var gameUpdateStartTimestamp;
var moduleList = [];
-var localPlayerWalkBuffer = -1; // no buffering
-var lockWalkDir = -1;
-
+const walkAnimTime = (1 / 8) * framesPerSecond;
+let walkAnimDir = -1;
+let walkOnceBuffer = [];
+let walkInputDirection = -1;
+let lockWalkDir = -1;
// Thanks to CatTail for this snippet of code.
var encodeHtmlEntity = function(str) {
@@ -686,7 +687,6 @@ Player.prototype.draw = function() {
Player.prototype.walk = function(direction) {
if (this.walkDelay > 0) {
- console.log("aah");
return false;
}
if (this == localPlayer) {
@@ -697,12 +697,14 @@ Player.prototype.walk = function(direction) {
var tempPos = this.getPosInWalkDirection(direction);
var tempTile = getTileBufferValue(tempPos);
if (!this.canWalkThroughTile(tempTile)) {
+ walkAnimDir = -1;
return false;
}
addWalkCommand(direction);
this.pos.set(tempPos);
placeLocalPlayerTrail(this.pos);
- this.walkDelay = (1 / 8) * framesPerSecond;
+ walkAnimDir = direction;
+ this.walkDelay = walkAnimTime;
return true;
}
@@ -727,7 +729,7 @@ Player.prototype.removeTile = function(direction) {
localCrack = new Crack(-1, tempPos, localPlayer.username);
localCrackTile = getTileBufferValue(tempPos);
var tempDate = new Date();
- localCrackExpirationTime = tempDate.getTime() + 500;
+ localCrackExpirationTime = tempDate.getTime() + 1000;
addRemoveTileCommand(direction);
}
@@ -741,7 +743,7 @@ Player.prototype.placeOrRemoveTile = function(direction) {
var tempPos = this.getPosInWalkDirection(direction);
var tempTile = getTileBufferValue(tempPos);
if ((tempTile >= blockStartTile && tempTile < blockStartTile + blockTileAmount)
- || (tempTile >= teleporterStartTile && tempTile < teleporterStartTile + teleporterTileAmount)) {
+ || (tempTile >= teleporterStartTile && tempTile < teleporterStartTile + teleporterTileAmount)) {
this.removeTile(direction);
}
if ((tempTile >= flourTile && tempTile <= breadTile)
@@ -758,7 +760,7 @@ Player.prototype.performActionInDirection = function(direction) {
if (shiftKeyIsHeld) {
this.placeOrRemoveTile(direction);
if (this == localPlayer) {
- localPlayerWalkRepeatDirections = [];
+ localPlayerWalkRepeatDirection = null;
}
} else {
if (this == localPlayer) {
@@ -770,7 +772,7 @@ Player.prototype.performActionInDirection = function(direction) {
}
Player.prototype.stopActionInDirection = function(direction) {
- if (this == localPlayer)
+ if (this == localPlayer && !shiftKeyIsHeld)
localPlayerStopWalking(direction);
}
@@ -1119,6 +1121,13 @@ function drawTileOnContext(context, pos, size, which) {
function drawTile(pos, which) {
var tempPos = pos.copy();
tempPos.scale(spriteRenderSize);
+ if (walkAnimDir >= 0) {
+ const size = spriteRenderSize;
+ const dx = [0,1,0,-1][walkAnimDir] * size;
+ const dy = [-1,0,1,0][walkAnimDir] * size;
+ tempPos.x += dx * localPlayer.walkDelay/walkAnimTime;
+ tempPos.y += dy * localPlayer.walkDelay/walkAnimTime;
+ }
drawTileOnContext(
context,
tempPos,
@@ -1196,31 +1205,32 @@ function startPlacingText(text) {
textToPlaceIsWaitingToWalk = false;
}
-function localPlayerStartWalking(direction) {
- if (localPlayerWalkRepeatDirections[localPlayerWalkRepeatDirections.length - 1] !== direction)
- {
- if (this.walkDelay <= 0)
- localPlayer.walk(direction);
- else {
- localPlayerWalkRepeatDirections.push(direction);
- localPlayerWalkBuffer = direction;
+let inputTracker = [null, null, null, null];
+function computeWalkingDirection() {
+ let earlytime = NaN;
+ let earlyind = -1;
+ for (let i = 0; i < 4; i++) {
+ if (inputTracker[i] == null) continue;
+ if (inputTracker[i] < earlytime) continue;
+ earlytime = inputTracker[i];
+ earlyind = i;
}
+ return earlyind;
+}
+function localPlayerStartWalking(direction) {
+ if (inputTracker[direction] != null) return;
+ walkOnceBuffer.push(direction);
+ inputTracker[direction] = performance.now();
+ walkInputDirection = direction;
lockWalkDir = -1;
- }
- //localPlayerWalkRepeatDelay = 0.1 * framesPerSecond;
- //localPlayerShouldStopWalkRepeat = !lKeyIsHeld;
}
function localPlayerStopWalking(direction) {
- if (localPlayerWalkRepeatDirections.length == 0)
- return;
- for (var i = localPlayerWalkRepeatDirections.length - 1; i >= 0; i--)
- {
- if (localPlayerWalkRepeatDirections[i] == direction) {
- localPlayerWalkRepeatDirections.splice(i, 1);
- i++;
+ //let dtframe = (performance.now() - inputTracker[direction]) / 1000 * FPS;
+ inputTracker[direction] = null;
+ if (walkInputDirection == direction) {
+ walkInputDirection = computeWalkingDirection();
}
- }
}
function displayGuidelinePos() {
@@ -1351,7 +1361,7 @@ function keyDownEvent(event) {
if (keyCode == 16) {
shiftKeyIsHeld = true;
}
- if (keyCode == 77) { // m
+ if (keyCode == 76) { // m
lKeyIsHeld = true;
}
if (chatInputIsFocused) {
@@ -1398,31 +1408,23 @@ function keyDownEvent(event) {
overlayChatInput.focus();
overlayChatInputIsFocused = true;
}
- var key = event.key;
- if (false) {
- }
+ var key = event.key;
+ if (false) {
+ }
else if (keyCode == 37 || keyCode == 65) {
- localPlayerStartWalking(3);
+ localPlayer.performActionInDirection(3);
}
else if (keyCode == 39 || keyCode == 68) {
- localPlayerStartWalking(1);
+ localPlayer.performActionInDirection(1);
}
else if (keyCode == 38 || keyCode == 87) {
- localPlayerStartWalking(0);
+ localPlayer.performActionInDirection(0);
}
else if (keyCode == 40 || keyCode == 83) {
- localPlayerStartWalking(2);
+ localPlayer.performActionInDirection(2);
}
- else if (key == "i")
- localPlayer.placeOrRemoveTile(0);
- else if (key == "l")
- localPlayer.placeOrRemoveTile(1);
- else if (key == "k")
- localPlayer.placeOrRemoveTile(2);
- else if (key == "j")
- localPlayer.placeOrRemoveTile(3);
- else if (key == "m")
- lockWalkDir = localPlayerWalkBuffer >= 0 ? localPlayerWalkBuffer : localPlayerWalkRepeatDirections.length ? localPlayerWalkRepeatDirections[localPlayerWalkRepeatDirections.length - 1] : -1;
+ else if (key == "m")
+ lockWalkDir = computeWalkingDirection();
else if (keyCode == 189 || keyCode == 173) {
setZoom(0);
}
@@ -1465,7 +1467,7 @@ function keyUpEvent(event) {
if (keyCode == 16) {
shiftKeyIsHeld = false;
}
- if (keyCode == 77) { // m
+ if (keyCode == 76) { // l
lKeyIsHeld = false;
}
if (keyCode == 37 || keyCode == 65) {
@@ -1566,22 +1568,17 @@ function timerEvent() {
}
}
}
- if (localPlayer.walkDelay > 0)
- {
- // idk
- }
- else if (localPlayerWalkRepeatDirections.length > 0 || localPlayerWalkBuffer >= 0 || lockWalkDir >= 0) {
- console.log(localPlayerWalkBuffer);
- if (localPlayerWalkBuffer >= 0) {
- localPlayer.walk(localPlayerWalkBuffer);
- localPlayerWalkBuffer = -1;
- }
- else if (localPlayerWalkRepeatDirections.length) {
- localPlayer.walk(localPlayerWalkRepeatDirections[localPlayerWalkRepeatDirections.length - 1]);
+ if (walkOnceBuffer.length == 0 && walkInputDirection == -1 && lockWalkDir == -1) {
+ if (localPlayer.walkDelay <= 0) {
+ walkAnimDir = -1;
}
- else {
- localPlayer.walk(lockWalkDir);
- }
+ } else if (walkOnceBuffer.length >= 1) {
+ if (localPlayer.walkDelay <= 0)
+ localPlayer.walk(walkOnceBuffer.shift());
+ } else if (walkInputDirection != -1) {
+ localPlayer.walk(walkInputDirection);
+ } else if (lockWalkDir != -1) {
+ localPlayer.walk(lockWalkDir);
}
cameraPos.set(localPlayer.pos);
var tempOffset = Math.floor(canvasSpriteSize / 2);
@@ -1589,17 +1586,23 @@ function timerEvent() {
cameraPos.y -= tempOffset;
clearCanvas();
- var tempPos = new Pos(0, 0);
- var tempOffset = new Pos(0, 0);
- while (tempOffset.y < canvasSpriteSize) {
- tempPos.set(cameraPos);
- tempPos.add(tempOffset);
- var tempTile = getTileBufferValue(tempPos);
- drawTile(tempOffset, tempTile);
- tempOffset.x += 1;
- if (tempOffset.x >= canvasSpriteSize) {
- tempOffset.x = 0;
- tempOffset.y += 1;
+ {
+ const x0 = walkAnimDir == 1 ? -1 : 0;
+ const y0 = walkAnimDir == 2 ? -1 : 0;
+ const x2 = walkAnimDir == 3 ? canvasSpriteSize+1 : canvasSpriteSize;
+ const y2 = walkAnimDir == 0 ? canvasSpriteSize+1 : canvasSpriteSize;
+ let tempPos = new Pos(0, 0);
+ let tempOffset = new Pos(x0, y0);
+ while (tempOffset.y < y2) {
+ tempPos.set(cameraPos);
+ tempPos.add(tempOffset);
+ var tempTile = getTileBufferValue(tempPos);
+ drawTile(tempOffset, tempTile);
+ tempOffset.x += 1;
+ if (tempOffset.x >= x2) {
+ tempOffset.x = x0;
+ tempOffset.y += 1;
+ }
}
}
var index = 0;