Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
9dd7227
slope stuff
genizy May 1, 2026
0210b1d
Improve Geometrical Dominator slope handling
May 20, 2026
5f9a990
Smooth Geometrical Dominator slope rotation
May 20, 2026
81cca21
Continue smoothing slope animations
May 22, 2026
4564cf1
Stabilize big slope collision height
May 22, 2026
e5cd3f9
Prefer nearest slope surface for big slopes
May 22, 2026
9f9b19e
Slow slope rotation smoothing
May 22, 2026
e33a87c
Hold slope rotation through contact gaps
May 22, 2026
bba9b92
Keep slope orientation longer
May 22, 2026
5751843
Lock cube rotation on slopes
May 22, 2026
93e5304
Ease cube into slope angle
May 22, 2026
c77aced
Choose nearest cube side for slopes
May 22, 2026
417326e
Roll backward after slopes
May 22, 2026
b487600
Hold slope exit roll orientation
May 22, 2026
0023481
Suppress extra landing spin after slopes
May 22, 2026
cb35687
Set slope jump landing side by spin direction
May 22, 2026
7d75988
fix: add vehicle mode-guard to slope hit results
May 23, 2026
afb25f4
fix: three targeted state/physics hardening fixes
May 23, 2026
8ddb8d4
fix: vehicle mode override inside slope hit collection loop
May 23, 2026
0ed776c
Initialize death flags and clamp exp easing
May 29, 2026
9732d0c
Fix wave slope collision so it dies instead of sliding straight
Jun 3, 2026
3121d94
fix: slope handling for flying modes matches GD behavior
Jun 3, 2026
d0c6ec0
Merge branch 'main' of https://github.com/web-dashers/web-dashers int…
Jun 4, 2026
185ef96
Fix ship slope jittering by allowing slope velocity logic
Jun 4, 2026
bdec2c9
Revert wave slope death and fix flying gamemode slope jitter
Jun 4, 2026
9664ecb
Improve slope handling across modes
Jun 5, 2026
f731f71
Merge remote-tracking branch 'upstream/main' into better-geometrical-…
Ishanarunarjpriya Jun 8, 2026
4ac7228
Improve cube slope jump handling
Ishanarunarjpriya Jun 12, 2026
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
5 changes: 5 additions & 0 deletions assets/scripts/core/game-scene.js
Original file line number Diff line number Diff line change
Expand Up @@ -6035,6 +6035,11 @@ _buildSettingsPopup() {
if (this._state.isBall) {
const ballOnSurface = this._state.onGround || this._state.onCeiling;
this._player.updateBallRoll(horizontalDelta, ballOnSurface);
} else if (this._state.isOnSlope) {
this._player.updateSlopeRotation(verticalDelta);
} else if ((this._state.wasOnSlope || this._state.slopeExitRotationTarget !== null) && this._state.onGround && !this._state.isOnSlope) {
// Just left a slope; ease rotation back to flat instead of snapping.
this._player.updateSlopeExitRotation(verticalDelta);
} else if (this._state.onGround) {
this._player.updateGroundRotation(verticalDelta);
} else if (this._player.rotateActionActive) {
Expand Down
51 changes: 44 additions & 7 deletions assets/scripts/core/level.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class Collider {
this.slopeDir = 1;
this.slopeIsFilled = false;
this.slopeFlipY = false;
this.slopeFloorTop = false;
}
getSlopeSurfaceY(worldX) {
if (this.type !== slopeType) return null;
Expand Down Expand Up @@ -797,7 +798,7 @@ window.LevelObject = class LevelObject {
return null;
}
_spawnObject(levelObj) {
this.objectSprites = this.objectSprites || [];
this.objectSprites = this.objectSprites || [];

const scene = this._scene;
const objectDef = getObjectFromId(levelObj.id);
Expand Down Expand Up @@ -1270,12 +1271,48 @@ window.LevelObject = class LevelObject {
if (objectDef.type === solidType && objectDef.gridW > 0 && objectDef.gridH > 0) {
const w = objectDef.gridW * a;
const h = objectDef.gridH * a;
const collider = new Collider(solidType, worldX, worldY, w, h, levelObj.rot || 0);
collider.objid = levelObj.id;
registerCollider(collider);
this.objects.push(collider);
hasCollisionEntry = true;
this._addCollisionToSection(collider);
if (_SLOPE_DATA[levelObj.id]) {
// Ensure slope collider is created only once per level object to avoid jitter
if (!levelObj._slopeCreated) {
let _fx = levelObj.flipX || false;
let _fy = levelObj.flipY || false;
const _nr = ((Math.round(levelObj.rot || 0) % 360) + 360) % 360;
if (_nr === 90) { const _t = _fx; _fx = !_fy; _fy = _t; }
else if (_nr === 180) { _fx = !_fx; _fy = !_fy; }
else if (_nr === 270) { const _t = _fx; _fx = _fy; _fy = !_t; }
const _slopeDir = _fx ? -1 : 1;
const _coveredBySlope = this.objects.some(col =>
col.type === slopeType &&
Math.abs(col.x - worldX) < 0.01 &&
Math.abs(col.y - worldY) < 0.01 &&
col.slopeDir === _slopeDir &&
col.slopeFlipY === _fy &&
col.w >= w - 1 &&
col.h >= h - 1
);
if (!_coveredBySlope) {
let _slopeCol = new Collider(slopeType, worldX, worldY, w, h, levelObj.rot || 0);
_slopeCol.slopeDir = _slopeDir;
_slopeCol.slopeFlipY = _fy;
_slopeCol.slopeFloorTop = _fy;
_slopeCol.slopeAngleDeg = _SLOPE_DATA[levelObj.id].angle || 45;
_slopeCol.slopeIsFilled = _SLOPE_DATA[levelObj.id].sq || false;
_slopeCol.objid = levelObj.id;
registerCollider(_slopeCol);
this.objects.push(_slopeCol);
hasCollisionEntry = true;
this._addCollisionToSection(_slopeCol);
levelObj._slopeCreated = true; // mark as created
}
}
} else {
const collider = new Collider(solidType, worldX, worldY, w, h, levelObj.rot || 0);
collider.objid = levelObj.id;
registerCollider(collider);
this.objects.push(collider);
hasCollisionEntry = true;
this._addCollisionToSection(collider);
}
} else if (objectDef.type === hazardType) {
let hitW = 0;
let hitH = 0;
Expand Down
Loading