diff --git a/assets/scripts/core/game-scene.js b/assets/scripts/core/game-scene.js index c800ba54..0418dd8e 100644 --- a/assets/scripts/core/game-scene.js +++ b/assets/scripts/core/game-scene.js @@ -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) { diff --git a/assets/scripts/core/level.js b/assets/scripts/core/level.js index d5e70b76..167bc410 100644 --- a/assets/scripts/core/level.js +++ b/assets/scripts/core/level.js @@ -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; @@ -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); @@ -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; diff --git a/assets/scripts/core/player.js b/assets/scripts/core/player.js index d1ce8871..c5bead02 100644 --- a/assets/scripts/core/player.js +++ b/assets/scripts/core/player.js @@ -31,10 +31,26 @@ class PlayerState { this.upKeyPressed = false; this.queuedHold = false; this.isDead = false; + this.diedThisFrame = false; + this.diedLastFrame = false; this.mirrored = false; this.isDashing = false; this.dashYVelocity = 0; this.isDual = false; + this.isOnSlope = false; + this.wasOnSlope = false; + this.slopeVelocity = 0; + this.currentSlopeAngle = 0; + this.currentSlopeDir = 1; + this.currentSlopeExitX = 0; + this.currentSlopeUphill = false; + this.lastSlopeAngle = 0; + this.slopeExitGrace = 0; + this.slopeExitRotationTarget = null; + this.holdSlopeExitRotation = false; + this.suppressNextFallRotate = false; + this.slopeExitJumpLandingDir = 0; + this.slopeExitJumpPaused = false; this.ignorePortals = false; } } @@ -1190,6 +1206,18 @@ if (this.p.isFlying || this.p.isUfo) { this.p.canJump = true; this.p.isJumping = false; this.p.queuedHold = false; + this.p.suppressNextFallRotate = false; + this.p.slopeExitJumpPaused = false; + if (this.p.slopeExitJumpLandingDir !== 0 && !this.p.isBall && !this.p.isWave && !this.p.isSpider) { + const _sideStep = Math.PI / 2; + const _scaledRotation = this._rotation / _sideStep; + this._rotation = this.p.slopeExitJumpLandingDir > 0 + ? Math.ceil(_scaledRotation) * _sideStep + : Math.floor(_scaledRotation) * _sideStep; + this.rotateActionActive = false; + this.p.holdSlopeExitRotation = true; + this.p.slopeExitJumpLandingDir = 0; + } if (this.p.isBall) { if (_0x4a38a5) { this._rotation = Math.round(this._rotation / Math.PI) * Math.PI; @@ -1214,6 +1242,9 @@ if (this.p.isFlying || this.p.isUfo) { if (this.p.isDead) { return; } + if (window.debugCollisions && this._lastDeathReason) { + console.log("death reason", this._lastDeathReason); + } this.p.isDead = true; this._scene.toggleGlitter(false); this._particleEmitter.stop(); @@ -1590,7 +1621,18 @@ if (this.p.isFlying || this.p.isUfo) { this.p.onGround = false; this.p.canJump = false; } + pauseSlopeExitJump() { + const iscube = !this.p.isFlying && !this.p.isBall && !this.p.isWave && !this.p.isUfo && !this.p.isSpider && !this.p.isRobot && !this.p.isSwing && !this.p.isBird && !this.p.isDart; + if (iscube && (this.p.wasOnSlope || this.p.isOnSlope || this.p.slopeExitGrace > 0)) { + this.p.slopeExitJumpPaused = true; + } + } runRotateAction() { + if (this.p.holdSlopeExitRotation && this.p.onGround) { + this.p.suppressNextFallRotate = true; + this.p.slopeExitJumpLandingDir = this.flipMod(); + } + this.p.holdSlopeExitRotation = false; this.rotateActionActive = true; this.rotateActionTime = 0; const _miniDurScale = this.p.isMini ? (1 / 1.4) : 1; @@ -1652,11 +1694,63 @@ if (this.p.isFlying || this.p.isUfo) { if (this.p.isBall || this.p.isWave || this.p.isSpider) { return; } + if (this.p.holdSlopeExitRotation) { + return; + } let _0x183c2a = this.convertToClosestRotation(); let _0x108955 = 0.47250000000000003; let _0x17a9a6 = Math.min(_0x5c24f7 * 1, _0x108955 * _0x5c24f7); this._rotation = this.slerp2D(this._rotation, _0x183c2a, _0x17a9a6); } + updateSlopeRotation(dt) { + if (this.p.isBall || this.p.isWave || this.p.isSpider) { + return; + } + this.p.slopeExitRotationTarget = null; + this.p.holdSlopeExitRotation = false; + const _flipMod = this.p.gravityFlipped ? -1 : 1; + const _sideStep = Math.PI / 2; + const _baseSlopeRad = -this.p.currentSlopeDir * (this.p.currentSlopeAngle || 0) * _flipMod; + const _targetRad = _baseSlopeRad + Math.round((this._rotation - _baseSlopeRad) / _sideStep) * _sideStep; + const _angleDiff = Math.atan2(Math.sin(_targetRad - this._rotation), Math.cos(_targetRad - this._rotation)); + if (Math.abs(_angleDiff) < 0.01) { + this._rotation = _targetRad; + return; + } + const _speed = 14; + const _blend = 1 - Math.exp(-_speed * Math.max(dt / 60, 0.00001)); + this._rotation += _angleDiff * _blend; + } + updateSlopeExitRotation(dt) { + // Called the frame(s) after the player leaves a slope but is still on the ground. + // Smoothly eases the tilt back to flat (0) using exponential decay instead of + // a linear clamp, preventing the pop on transition to the next slope or flat ground. + if (this.p.isBall || this.p.isWave || this.p.isSpider) { + return; + } + const _sideStep = Math.PI / 2; + const _backwardDir = -this.flipMod(); + if (this.p.slopeExitRotationTarget === null) { + const _scaledRotation = this._rotation / _sideStep; + this.p.slopeExitRotationTarget = _backwardDir < 0 + ? Math.floor(_scaledRotation) * _sideStep + : Math.ceil(_scaledRotation) * _sideStep; + if (Math.abs(this.p.slopeExitRotationTarget - this._rotation) < 0.01) { + this.p.slopeExitRotationTarget += _backwardDir * _sideStep; + } + } + const _targetRad = this.p.slopeExitRotationTarget; + const _angleDiff = Math.atan2(Math.sin(_targetRad - this._rotation), Math.cos(_targetRad - this._rotation)); + if (Math.abs(_angleDiff) < 0.01) { + this._rotation = _targetRad; + this.p.slopeExitRotationTarget = null; + this.p.holdSlopeExitRotation = true; + return; + } + const _speed = 22; + const _blend = 1 - Math.exp(-_speed * Math.max(dt / 60, 0.00001)); + this._rotation += _angleDiff * _blend; + } updateBallRoll(_0x1dd8af, onSurface) { const gravityDir = this.p.gravityFlipped ? -1 : 1; const rollDir = this.p.mirrored ? -gravityDir : gravityDir; @@ -1712,6 +1806,19 @@ if (this.p.isFlying || this.p.isUfo) { this.p.upKeyPressed = false; this.p.queuedHold = false; this.p.yVelocity = this.flipMod() * 22.360064 * (this.p.isMini ? 0.8 : 1); + if (this.p.wasOnSlope || this.p.isOnSlope) { + const _sv = this.p.slopeVelocity; + if (_sv * this.flipMod() > 0) { + const _velCap = this.p.yVelocity * 1.4; + this.p.yVelocity += _sv * 0.25; + if (this.p.gravityFlipped) { + this.p.yVelocity = Math.max(this.p.yVelocity, _velCap); + } else { + this.p.yVelocity = Math.min(this.p.yVelocity, _velCap); + } + } + } + this.pauseSlopeExitJump(); this.runRotateAction(); } else if (this.p.isJumping) { this.p.yVelocity -= p * _0x3d1c6f * this.flipMod(); @@ -1729,7 +1836,7 @@ if (this.p.isFlying || this.p.isUfo) { } else { this.p.yVelocity = Math.max(this.p.yVelocity, -30); } - if (this._isFallingPastThreshold() && !this.rotateActionActive) { + if (this._isFallingPastThreshold() && !this.rotateActionActive && !this.p.suppressNextFallRotate) { this.runRotateAction(); } if (this.playerIsFalling()) { @@ -1748,6 +1855,7 @@ if (this.p.isFlying || this.p.isUfo) { _0x203040 = -1; } if (!this.p.upKeyDown && !this.playerIsFalling()) { + this.p.queuedHold = false; _0x203040 = 1.2; } let _0x2d237f = 0.4; @@ -1784,11 +1892,7 @@ _updateBallJump(_0x2fe319) { this.p.canJump = false; } this.p.yVelocity -= _0x144266 * _0x2fe319 * this.flipMod(); - if (this.p.gravityFlipped) { - this.p.yVelocity = Math.min(this.p.yVelocity, 30); - } else { - this.p.yVelocity = Math.max(this.p.yVelocity, -30); - } + this.p.yVelocity = Math.max(-30, Math.min(30, this.p.yVelocity)); if (this.playerIsFalling()) { const _0x1439be = this.p.gravityFlipped ? this.p.yVelocity > p * 2 : this.p.yVelocity < -(p * 2); if (_0x1439be) { @@ -1938,8 +2042,12 @@ _updateWaveJump() { checkCollisions(_0x2f5078) { this.noclipStats.totalFrames++; this.p.diedThisFrame = false; + this.p.wasOnSlope = this.p.isOnSlope; + this.p.isOnSlope = false; const playerSize = this.p.isMini ? 18 : 30; const waveHitSize = this.p.isMini ? 6 : 9; + const iscube = !this.p.isFlying && !this.p.isBall && !this.p.isWave && !this.p.isUfo && !this.p.isSpider; + const _dynamicSize = playerSize; const pieceWidth = _0x2f5078 + centerX; const playersY = this.p.y; const playersLastY = this.p.lastY; @@ -1951,6 +2059,9 @@ _updateWaveJump() { let _0x30410f = false; let _boostedThisStep = false; const _0x198534 = this._gameLayer.getNearbySectionObjects(pieceWidth); + let _floorSlopeHit = null; + let _ceilingSlopeHit = null; + let _slopeDeath = null; for (let gameObj of _0x198534) { let left = gameObj.x - gameObj.w / 2; let right = gameObj.x + gameObj.w / 2; @@ -1983,6 +2094,22 @@ _updateWaveJump() { gameObj.activated = true; continue; } + if (_colType === hazardType) { + if (window.noClip) { + this.p.diedThisFrame = true; + continue; + } + if (_hasCircleHitbox) { + const _hdx = pieceWidth - gameObj.x; + const _hdy = playersY - gameObj.y; + const _hDistSq = _hdx * _hdx + _hdy * _hdy; + const _hMinDist = gameObj.hitbox_radius + (this.p.isWave ? waveHitSize : playerSize); + if (_hDistSq > _hMinDist * _hMinDist) continue; + } + this._lastDeathReason = { reason: "hazard", objid: gameObj.objid, type: gameObj.type, playerX: pieceWidth, playerY: playersY, objX: gameObj.x, objY: gameObj.y }; + this.killPlayer(); + return; + } if (_colType === "portal_fly") { if (!gameObj.activated) { gameObj.activated = true; @@ -2175,6 +2302,7 @@ _updateWaveJump() { if (_padNextTickVel !== null) { this.p.pendingVelocity = _padNextTickVel; } + this.pauseSlopeExitJump(); this.runRotateAction(); _boostedThisStep = true; } @@ -2208,6 +2336,7 @@ _updateWaveJump() { this.p.isJumping = false; this.p.upKeyPressed = false; this.p.queuedHold = false; + this.pauseSlopeExitJump(); this.runRotateAction(); _boostedThisStep = true; try { @@ -2247,6 +2376,7 @@ _updateWaveJump() { this.p.onGround = false; this.p.canJump = false; this.p.isJumping = false; + this.pauseSlopeExitJump(); this.runRotateAction(); _boostedThisStep = true; try { @@ -2343,6 +2473,7 @@ _updateWaveJump() { if (_orbId === 1330) { this.p.wasBoosted = false; } + this.pauseSlopeExitJump(); this.runRotateAction(); _boostedThisStep = true; if (_flipAfter) { @@ -2391,25 +2522,11 @@ _updateWaveJump() { } } catch(e) {} } - } else if (_colType === hazardType) { - if (window.noClip) { - this.p.diedThisFrame = true; - continue; - } - if (_hasCircleHitbox) { - const _hdx = pieceWidth - gameObj.x; - const _hdy = playersY - gameObj.y; - const _hDistSq = _hdx * _hdx + _hdy * _hdy; - const _hMinDist = gameObj.hitbox_radius + (this.p.isWave ? waveHitSize : playerSize); - if (_hDistSq > _hMinDist * _hMinDist) continue; - } - this.killPlayer(); - return; } else if (_colType === solidType) { - let _0x146a97 = playersY - playerSize + gamemodeAddition; - let _0x869e42 = playersLastY - playerSize + gamemodeAddition; - let _0x3e7199 = playersY + playerSize - gamemodeAddition; - let _0x135a9d = playersLastY + playerSize - gamemodeAddition; + let _0x146a97 = playersY - _dynamicSize + gamemodeAddition; + let _0x869e42 = playersLastY - _dynamicSize + gamemodeAddition; + let _0x3e7199 = playersY + _dynamicSize - gamemodeAddition; + let _0x135a9d = playersLastY + _dynamicSize - gamemodeAddition; const _0x55559d = 9; let iscolliding; if (_hasCircleHitbox) { @@ -2428,15 +2545,81 @@ _updateWaveJump() { const _0xLandBot = (this.p.yVelocity <= 0 || this.p.onGround) && (_0x146a97 >= bottom || _0x869e42 >= bottom); const _0xLandTop = (this.p.yVelocity >= 0 || this.p.onGround) && (_0x3e7199 <= top || _0x135a9d <= top); const isstandingOnAPlatform = this.p.gravityFlipped ? _0xLandTop : _0xLandBot; + if (this.p.isFlying && iscolliding && !isstandingOnAPlatform && pieceWidth + playerSize - 5 > left && pieceWidth - playerSize + 5 < right) { + const _shipSolidSize = playerSize * 0.55; + const _shipBot = playersY - _shipSolidSize + gamemodeAddition; + const _lastShipBot = playersLastY - _shipSolidSize + gamemodeAddition; + const _shipTop = playersY + _shipSolidSize - gamemodeAddition; + const _lastShipTop = playersLastY + _shipSolidSize - gamemodeAddition; + if (!this.p.gravityFlipped && (_shipBot >= bottom || _lastShipBot >= bottom)) { + this.p.y += (bottom + _shipSolidSize - this.p.y) * 0.45; + this.p.yVelocity *= 0.72; + _0x30410f = true; + this.p.collideBottom = bottom; + continue; + } + if (this.p.gravityFlipped && (_shipTop <= top || _lastShipTop <= top)) { + this.p.y += (top - _shipSolidSize - this.p.y) * 0.45; + this.p.yVelocity *= 0.72; + _0x30410f = true; + this.p.onCeiling = true; + this.p.collideTop = top; + continue; + } + } if (iscolliding && !isstandingOnAPlatform) { + const _usesFlightSlopeResolve = this.p.isFlying || this.p.isWave || this.p.isBird || this.p.isDart; + const _nearShipSlopeExit = _usesFlightSlopeResolve && this.p.slopeExitGrace > 0 && + Math.abs(pieceWidth - this.p.currentSlopeExitX) < 55; + const _nearShipSlope = _usesFlightSlopeResolve && _0x198534.some(_nearObj => + _nearObj.type === slopeType && + pieceWidth + playerSize > _nearObj.x - _nearObj.w / 2 - 70 && + pieceWidth - playerSize < _nearObj.x + _nearObj.w / 2 + 70 && + playersY + playerSize > _nearObj.y - _nearObj.h / 2 - 45 && + playersY - playerSize < _nearObj.y + _nearObj.h / 2 + 45 + ); + if (_nearShipSlopeExit || _nearShipSlope) { + const _shipSolidSize = playerSize * 0.95; + const _nearSlopeObj = _0x198534.find(_nearObj => + _nearObj.type === slopeType && + pieceWidth + playerSize > _nearObj.x - _nearObj.w / 2 - 70 && + pieceWidth - playerSize < _nearObj.x + _nearObj.w / 2 + 70 && + playersY + playerSize > _nearObj.y - _nearObj.h / 2 - 45 && + playersY - playerSize < _nearObj.y + _nearObj.h / 2 + 45 + ); + const _slopeSampleX = _nearSlopeObj + ? Math.max(_nearSlopeObj.x - _nearSlopeObj.w / 2, Math.min(_nearSlopeObj.x + _nearSlopeObj.w / 2, pieceWidth)) + : pieceWidth; + const _nearSlopeY = _nearSlopeObj ? _nearSlopeObj.getSlopeSurfaceY(_slopeSampleX) : null; + const _nearSlopeUpsideDown = _nearSlopeObj ? (this.p.gravityFlipped !== (_nearSlopeObj.slopeFlipY || false)) : this.p.gravityFlipped; + const _targetY = _nearSlopeY !== null + ? (_nearSlopeUpsideDown ? _nearSlopeY - _shipSolidSize : _nearSlopeY + _shipSolidSize) + : (this.p.gravityFlipped ? top - _shipSolidSize : bottom + _shipSolidSize); + this.p.y = _targetY; + this.p.yVelocity *= 0.45; + _0x30410f = true; + if (this.p.gravityFlipped) { + this.p.onCeiling = true; + this.p.collideTop = top; + } else { + this.p.collideBottom = bottom; + } + continue; + } if (window.noClip) this.p.diedThisFrame = true; - if (window.noClip || gameObj.objid === 143) continue + // Previously skipped very thin objects and certain IDs which caused walls to be passable. + // Remove those early continues so all solid objects are treated as collidable. + // No longer skip based on size or objid. + // Keep noClip handling for death bypass. + // if (gameObj.h <= 4 || gameObj.w <= 4) continue; + // if (window.noClip || gameObj.objid === 143) continue; + this._lastDeathReason = { reason: "solid-side", objid: gameObj.objid, type: gameObj.type, playerX: pieceWidth, playerY: playersY, objX: gameObj.x, objY: gameObj.y, left, right, top, bottom }; this.killPlayer(); return; } if (pieceWidth + playerSize - 5 > left && pieceWidth - playerSize + 5 < right) { if (!this.p.gravityFlipped && (_0x146a97 >= bottom || _0x869e42 >= bottom) && (this.p.yVelocity <= 0 || this.p.onGround)) { - this.p.y = bottom + playerSize; + this.p.y = bottom + _dynamicSize; this.hitGround(); _0x30410f = true; this.p.collideBottom = bottom; @@ -2446,7 +2629,7 @@ _updateWaveJump() { continue; } if (this.p.gravityFlipped && !this.p.isFlying && (_0x3e7199 <= top || _0x135a9d <= top) && (this.p.yVelocity >= 0 || this.p.onGround)) { - this.p.y = top - playerSize; + this.p.y = top - _dynamicSize; this.hitGround(); _0x30410f = true; this.p.onCeiling = true; @@ -2458,14 +2641,14 @@ _updateWaveJump() { } if (this.p.isUfo) { if (!this.p.gravityFlipped && (_0x3e7199 <= top || _0x135a9d <= top) && (this.p.yVelocity >= 0 || this.p.onGround)) { - this.p.y = top - playerSize; + this.p.y = top - _dynamicSize; this.hitGround(); this.p.onCeiling = true; this.p.collideTop = top; continue; } if (this.p.gravityFlipped && (_0x146a97 >= bottom || _0x869e42 >= bottom) && (this.p.yVelocity <= 0 || this.p.onGround)) { - this.p.y = bottom + playerSize; + this.p.y = bottom + _dynamicSize; this.hitGround(); _0x30410f = true; this.p.onCeiling = true; @@ -2475,7 +2658,7 @@ _updateWaveJump() { continue; } if ((_0x3e7199 <= top || _0x135a9d <= top) && (this.p.yVelocity >= 0 || this.p.onGround) && this.p.isFlying) { - this.p.y = top - playerSize; + this.p.y = top - _dynamicSize; this.hitGround(); this.p.onCeiling = true; this.p.collideTop = top; @@ -2485,13 +2668,14 @@ _updateWaveJump() { if (iscolliding) { if (window.noClip) this.p.diedThisFrame = true; if (window.noClip || gameObj.objid === 143) continue; + this._lastDeathReason = { reason: "solid-head", objid: gameObj.objid, type: gameObj.type, playerX: pieceWidth, playerY: playersY, objX: gameObj.x, objY: gameObj.y, left, right, top, bottom }; this.killPlayer(); return; } continue; } if (this.p.gravityFlipped && (_0x146a97 >= bottom || _0x869e42 >= bottom) && (this.p.yVelocity <= 0 || this.p.onGround) && this.p.isFlying) { - this.p.y = bottom + playerSize; + this.p.y = bottom + _dynamicSize; this.hitGround(); _0x30410f = true; this.p.onCeiling = true; @@ -2499,9 +2683,160 @@ _updateWaveJump() { continue; } } + } else if (_colType === slopeType) { + if (pieceWidth + playerSize - 5 > left && pieceWidth - playerSize + 5 < right) { + const _surfY = gameObj.getSlopeSurfaceY(pieceWidth); + if (_surfY === null) continue; + const _usesFlightSlopeResolve = this.p.isFlying || this.p.isWave || this.p.isBird || this.p.isDart; + const _canSnapToSlope = !this.p.isUfo; + const _slopeAngleRad = (gameObj.slopeAngleDeg || 45) * Math.PI / 180; + const _slopeHitSize = _usesFlightSlopeResolve ? playerSize * 0.95 : playerSize; + const _playerRadOnSlope = _slopeHitSize / Math.cos(_slopeAngleRad); + const _slopeFloorTop = gameObj.slopeFlipY || false; + const _upsideDown = this.p.gravityFlipped; + const _slopeUpsideDown = _upsideDown !== _slopeFloorTop; + if (!_slopeUpsideDown) { + const _playerBot = playersY - _playerRadOnSlope + gamemodeAddition; + const _lastBot = playersLastY - _playerRadOnSlope + gamemodeAddition; + const _flightEscapingFloorSlope = this.p.isFlying && this.p.upKeyDown && _playerBot < _surfY - 2 && _lastBot < _surfY - 2; + const _slopeStickyGrace = !_usesFlightSlopeResolve && this.p.slopeExitGrace > 0 && !this.p.slopeExitJumpPaused; + if (_canSnapToSlope && !_flightEscapingFloorSlope && (_playerBot >= _surfY || _lastBot >= _surfY) && (this.p.yVelocity <= 0 || this.p.onGround || _usesFlightSlopeResolve || _slopeStickyGrace)) { + const _targetY = _surfY + _playerRadOnSlope; + const _distY = Math.abs(_targetY - playersY); + if (!_floorSlopeHit || _distY < _floorSlopeHit.distY || (_distY === _floorSlopeHit.distY && _surfY > _floorSlopeHit.surfY)) { + _floorSlopeHit = { obj: gameObj, surfY: _surfY, playerRad: _playerRadOnSlope, angle: _slopeAngleRad, distY: _distY }; + } + continue; + } + } else { + const _playerTop = playersY + _playerRadOnSlope - gamemodeAddition; + const _lastTop = playersLastY + _playerRadOnSlope - gamemodeAddition; + const _flightEscapingCeilingSlope = this.p.isFlying && !this.p.upKeyDown && _playerTop > _surfY + 2 && _lastTop > _surfY + 2; + const _slopeStickyGrace = !_usesFlightSlopeResolve && this.p.slopeExitGrace > 0 && !this.p.slopeExitJumpPaused; + if (_canSnapToSlope && !_flightEscapingCeilingSlope && (_playerTop <= _surfY || _lastTop <= _surfY) && (this.p.yVelocity >= 0 || this.p.onGround || _usesFlightSlopeResolve || _slopeStickyGrace)) { + const _targetY = _surfY - _playerRadOnSlope; + const _distY = Math.abs(_targetY - playersY); + if (!_ceilingSlopeHit || _distY < _ceilingSlopeHit.distY || (_distY === _ceilingSlopeHit.distY && _surfY < _ceilingSlopeHit.surfY)) { + _ceilingSlopeHit = { obj: gameObj, surfY: _surfY, playerRad: _playerRadOnSlope, angle: _slopeAngleRad, distY: _distY }; + } + continue; + } + } + const _inX = pieceWidth + 9 > left && pieceWidth - 9 < right; + const _inY = playersY + 9 > top && playersY - 9 < bottom; + if (_inX && _inY && !this.p.isOnSlope && !this.p.onGround) { + const _inside = _slopeUpsideDown ? (playersY + 9 > _surfY) : (playersY - 9 < _surfY); + if (_inside) { + if (window.noClip) { this.p.diedThisFrame = true; continue; } + if (_usesFlightSlopeResolve) { + const _targetY = _slopeUpsideDown ? _surfY - _playerRadOnSlope : _surfY + _playerRadOnSlope; + const _distY = Math.abs(_targetY - playersY); + if (_slopeUpsideDown) { + if (!_ceilingSlopeHit || _distY < _ceilingSlopeHit.distY) { + _ceilingSlopeHit = { obj: gameObj, surfY: _surfY, playerRad: _playerRadOnSlope, angle: _slopeAngleRad, distY: _distY }; + } + } else if (!_floorSlopeHit || _distY < _floorSlopeHit.distY) { + _floorSlopeHit = { obj: gameObj, surfY: _surfY, playerRad: _playerRadOnSlope, angle: _slopeAngleRad, distY: _distY }; + } + continue; + } + // Only non-flying modes die from inside-slope collision + if (!this.p.isFlying && !this.p.isShip && !this.p.isWave && !this.p.isBird && !this.p.isDart) { + _slopeDeath = { reason: "slope-inside", objid: gameObj.objid, type: gameObj.type, playerX: pieceWidth, playerY: playersY, objX: gameObj.x, objY: gameObj.y, left, right, top, bottom, surfY: _surfY }; + } + } + } + } } } } + + if (_floorSlopeHit) { + const gameObj = _floorSlopeHit.obj; + const _targetSlopeY = _floorSlopeHit.surfY + _floorSlopeHit.playerRad; + const _usesFlightSlopeResolve = this.p.isFlying || this.p.isWave || this.p.isBird || this.p.isDart; + if (_usesFlightSlopeResolve) { + const _exitX = this.p.mirrored ? gameObj.x - gameObj.w / 2 : gameObj.x + gameObj.w / 2; + const _exitFade = Math.max(0.12, Math.min(1, Math.abs(_exitX - pieceWidth) / 42)); + this.p.y = _targetSlopeY; + this.p.yVelocity *= 1 - (0.46 * _exitFade); + } else { + this.p.y = _targetSlopeY; + this.hitGround(); + } + _0x30410f = true; + this.p.collideBottom = _floorSlopeHit.surfY; + this.p.isOnSlope = true; + this.p.currentSlopeAngle = _floorSlopeHit.angle; + this.p.lastSlopeAngle = _floorSlopeHit.angle; + this.p.currentSlopeDir = gameObj.slopeDir || 1; + this.p.currentSlopeExitX = this.p.mirrored ? gameObj.x - gameObj.w / 2 : gameObj.x + gameObj.w / 2; + this.p.slopeExitGrace = 20; + const _slopeYVel = (gameObj.h * playerSpeed) / gameObj.w; + const _slopeVelMult = Math.min(1.12 / Math.max(_floorSlopeHit.angle, 0.01), 1.54); + const _slopeDir = gameObj.slopeDir || 1; + const _playerUphill = _slopeDir < 0; + this.p.slopeVelocity = _slopeVelMult * _slopeYVel * this.flipMod() * (_playerUphill ? -1 : 1); + this.p.currentSlopeUphill = this.p.slopeVelocity * this.flipMod() > 0; + if (!_usesFlightSlopeResolve) { + this.stopRotation(); + this._checkSnapJump(gameObj); + } + } else if (_ceilingSlopeHit) { + const gameObj = _ceilingSlopeHit.obj; + const _targetSlopeY = _ceilingSlopeHit.surfY - _ceilingSlopeHit.playerRad; + const _usesFlightSlopeResolve = this.p.isFlying || this.p.isWave || this.p.isBird || this.p.isDart; + if (_usesFlightSlopeResolve) { + const _exitX = this.p.mirrored ? gameObj.x - gameObj.w / 2 : gameObj.x + gameObj.w / 2; + const _exitFade = Math.max(0.12, Math.min(1, Math.abs(_exitX - pieceWidth) / 42)); + this.p.y = _targetSlopeY; + this.p.yVelocity *= 1 - (0.46 * _exitFade); + } else { + this.p.y = _targetSlopeY; + this.hitGround(); + } + _0x30410f = true; + this.p.onCeiling = true; + this.p.collideTop = _ceilingSlopeHit.surfY; + this.p.isOnSlope = true; + this.p.currentSlopeAngle = _ceilingSlopeHit.angle; + this.p.lastSlopeAngle = _ceilingSlopeHit.angle; + this.p.currentSlopeDir = gameObj.slopeDir || 1; + this.p.currentSlopeExitX = this.p.mirrored ? gameObj.x - gameObj.w / 2 : gameObj.x + gameObj.w / 2; + this.p.currentSlopeUphill = true; + this.p.slopeExitGrace = 20; + if (!_usesFlightSlopeResolve) { + this.stopRotation(); + this._checkSnapJump(gameObj); + } + } else if (_slopeDeath) { + this._lastDeathReason = _slopeDeath; + this.killPlayer(); + return; + } else if (this.p.wasOnSlope && this.p.slopeExitGrace > 0) { + const _nearSlopeExit = this.p.mirrored + ? pieceWidth < this.p.currentSlopeExitX + 18 + : pieceWidth > this.p.currentSlopeExitX - 18; + if (this.p.slopeExitGrace === 20 && _nearSlopeExit && this.p.currentSlopeUphill && !this.p.slopeExitJumpPaused && !this.p.isWave && !this.p.isUfo && !this.p.isSpider) { + const _slopeSteepness = Math.max(0.5, Math.min(1.6, (this.p.lastSlopeAngle || Math.PI / 4) / (Math.PI / 4))); + const _slopeExitBoost = this.p.isFlying ? 2.8 * _slopeSteepness : 13.5 * _slopeSteepness; + const _boostVel = this.flipMod() * _slopeExitBoost; + if (this.p.gravityFlipped) { + this.p.yVelocity = Math.min(this.p.yVelocity, _boostVel); + } else { + this.p.yVelocity = Math.max(this.p.yVelocity, _boostVel); + } + this.p.onGround = false; + if (!this.p.isFlying && !this.p.isBall) { + this.rotateActionActive = true; + this.rotateActionTime = 0; + this.rotateActionDuration = 0.16; + this.rotateActionStart = this._rotation; + this.rotateActionTotal = -Math.PI / 2 * this.flipMod(); + } + } + this.p.slopeExitGrace--; + } if (this.p.collideTop !== 0 && this.p.collideBottom !== 0) { if (Math.abs(this.p.collideTop - this.p.collideBottom) < 48) { if (window.noClip) this.p.diedThisFrame = true; @@ -2512,8 +2847,7 @@ _updateWaveJump() { } } let _0x3020c8 = this._gameLayer.getFloorY(); - const iscube = !this.p.isFlying && !this.p.isBall && !this.p.isWave && !this.p.isUfo && !this.p.isSpider; - const _effectiveSize = this.p.isWave ? waveHitSize : playerSize; + const _effectiveSize = this.p.isWave ? waveHitSize : _dynamicSize; if (!_0x30410f && !_boostedThisStep) { let gravCeilY = this._gameLayer.getCeilingY(); @@ -2633,6 +2967,27 @@ _updateWaveJump() { graphics.lineStyle(2, hitboxColor, 0.7); if (nearObject.hitbox_radius !== undefined && nearObject.hitbox_radius !== null) { graphics.strokeCircle(xPos, objYCenter, nearObject.hitbox_radius); + } else if (nearObject.type === slopeType) { + const _hw = nearObject.w / 2; + const _hh = nearObject.h / 2; + const _sd = nearObject.slopeDir || 1; + const _sfy = nearObject.slopeFlipY || false; + let _cx0, _cy0, _cx1, _cy1, _cx2, _cy2; + if (!_sfy) { + _cx0 = xPos + (_sd > 0 ? -_hw : _hw); _cy0 = objYCenter + _hh; + _cx1 = xPos + (_sd > 0 ? _hw : -_hw); _cy1 = objYCenter + _hh; + _cx2 = xPos + (_sd > 0 ? _hw : -_hw); _cy2 = objYCenter - _hh; + } else { + _cx0 = xPos + (_sd > 0 ? -_hw : _hw); _cy0 = objYCenter - _hh; + _cx1 = xPos + (_sd > 0 ? _hw : -_hw); _cy1 = objYCenter - _hh; + _cx2 = xPos + (_sd > 0 ? _hw : -_hw); _cy2 = objYCenter + _hh; + } + graphics.beginPath(); + graphics.moveTo(_cx0, _cy0); + graphics.lineTo(_cx1, _cy1); + graphics.lineTo(_cx2, _cy2); + graphics.closePath(); + graphics.strokePath(); } else { let rot = Phaser.Math.DegToRad(nearObject.rotationDegrees); let cos = Math.cos(rot); diff --git a/assets/scripts/core/triggers.js b/assets/scripts/core/triggers.js index 7c002852..74b7a94f 100644 --- a/assets/scripts/core/triggers.js +++ b/assets/scripts/core/triggers.js @@ -44,7 +44,7 @@ class Easing { static _bounceIn(x) { return 1-this._bounceTime(1-x); }; static _bounceOut(x) { return this._bounceTime(x); }; static _expInOut(x) { return x<0.5 ? 0.5*Math.pow(2,10*(x*2-1)) : 0.5*(-Math.pow(2,-10*(x*2-1))+2); }; - static _expIn(x) { return Math.pow(2,10*(x-1))-0.001; }; + static _expIn(x) { return Math.max(0, Math.pow(2,10*(x-1))-0.001); }; static _expOut(x) { return -Math.pow(2,-10*x)+1; }; static _sineInOut(x) { return -0.5*(Math.cos(x*Math.PI)-1); }; static _sineIn(x) { return 1-Math.cos((x*Math.PI)/2); }; diff --git a/assets/scripts/game/allObjects.js b/assets/scripts/game/allObjects.js index 9774235d..5854e793 100644 --- a/assets/scripts/game/allObjects.js +++ b/assets/scripts/game/allObjects.js @@ -4274,7 +4274,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4296,7 +4296,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4318,7 +4318,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4340,7 +4340,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4364,7 +4364,7 @@ window.allobjects = function() { "gridH": 0.4333333373069763, "gridW": 0.36666667461395264, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4388,7 +4388,7 @@ window.allobjects = function() { "gridH": 0.44999998807907104, "gridW": 0.9666666388511658, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4410,7 +4410,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4432,7 +4432,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4498,7 +4498,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4520,7 +4520,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4542,7 +4542,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4564,7 +4564,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4586,7 +4586,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4608,7 +4608,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4622,7 +4622,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -4636,7 +4636,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -4650,7 +4650,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4664,7 +4664,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4715,7 +4715,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -4737,7 +4737,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -4759,7 +4759,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -4781,7 +4781,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -4803,7 +4803,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -4825,7 +4825,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -4891,7 +4891,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -4913,7 +4913,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -4926,7 +4926,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -4950,7 +4950,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 1, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -4974,7 +4974,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 1, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -5014,7 +5014,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 1, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -5038,7 +5038,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 1, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -5126,7 +5126,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -5154,7 +5154,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -6367,7 +6367,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -6395,7 +6395,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -6577,7 +6577,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -6605,7 +6605,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -10813,7 +10813,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -10841,7 +10841,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -11023,7 +11023,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 3, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -11037,7 +11037,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 3, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -11277,7 +11277,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11291,7 +11291,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11305,7 +11305,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11319,7 +11319,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11333,7 +11333,7 @@ window.allobjects = function() { "gridH": 0.8500000238418579, "gridW": 0.8500000238418579, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11347,7 +11347,7 @@ window.allobjects = function() { "gridH": 0.9333333373069763, "gridW": 1.850000023841858, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11363,7 +11363,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 10, "default_detail_color_channel": -1, "default_z_layer": 3, @@ -11379,7 +11379,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 10, "default_detail_color_channel": -1, "default_z_layer": 3, @@ -11393,7 +11393,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11407,7 +11407,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11421,7 +11421,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11435,7 +11435,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11449,7 +11449,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11463,7 +11463,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11477,7 +11477,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11491,7 +11491,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11505,7 +11505,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11519,7 +11519,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11533,7 +11533,7 @@ window.allobjects = function() { "gridH": 0.8500000238418579, "gridW": 0.8500000238418579, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11547,7 +11547,7 @@ window.allobjects = function() { "gridH": 0.9333333373069763, "gridW": 1.850000023841858, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11561,7 +11561,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11575,7 +11575,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11598,7 +11598,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -11620,7 +11620,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -11642,7 +11642,7 @@ window.allobjects = function() { "gridH": 0.7666666507720947, "gridW": 0.7666666507720947, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -11664,7 +11664,7 @@ window.allobjects = function() { "gridH": 0.8833333253860474, "gridW": 1.7333333492279053, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -11686,7 +11686,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -11708,7 +11708,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -11729,7 +11729,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -11751,7 +11751,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -11773,7 +11773,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -11795,7 +11795,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -11809,7 +11809,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11823,7 +11823,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11837,7 +11837,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11851,7 +11851,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -11973,7 +11973,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -11995,7 +11995,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -12017,7 +12017,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -12039,7 +12039,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -12053,7 +12053,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -12067,7 +12067,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -12081,7 +12081,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -12095,7 +12095,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -12529,7 +12529,7 @@ window.allobjects = function() { "gridH": 0.5833333134651184, "gridW": 0.6166666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -12551,7 +12551,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 1.2833333015441895, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -12573,7 +12573,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -12595,7 +12595,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -12608,7 +12608,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -12705,7 +12705,7 @@ window.allobjects = function() { "gridH": 0.5833333134651184, "gridW": 0.6166666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -12727,7 +12727,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 1.2833333015441895, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -12749,7 +12749,7 @@ window.allobjects = function() { "gridH": 0.8166666626930237, "gridW": 0.8999999761581421, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -12771,7 +12771,7 @@ window.allobjects = function() { "gridH": 0.8500000238418579, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -12784,7 +12784,7 @@ window.allobjects = function() { "gridH": 0.3499999940395355, "gridW": 0.8666666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -13379,7 +13379,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -13409,7 +13409,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -13445,7 +13445,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -13481,7 +13481,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -13511,7 +13511,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -13541,7 +13541,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -13571,7 +13571,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -13601,7 +13601,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -14237,7 +14237,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -14259,7 +14259,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -14419,7 +14419,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -14447,7 +14447,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -14469,7 +14469,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -14491,7 +14491,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -14601,7 +14601,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -14623,7 +14623,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -15798,7 +15798,7 @@ window.allobjects = function() { "gridH": 0.5833333134651184, "gridW": 0.6166666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -15820,7 +15820,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 1.2833333015441895, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -15842,7 +15842,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -15864,7 +15864,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -15877,7 +15877,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -15944,7 +15944,7 @@ window.allobjects = function() { "gridH": 0.5833333134651184, "gridW": 0.6166666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -15966,7 +15966,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 1.2833333015441895, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -15988,7 +15988,7 @@ window.allobjects = function() { "gridH": 0.8166666626930237, "gridW": 0.8999999761581421, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -16010,7 +16010,7 @@ window.allobjects = function() { "gridH": 0.8500000238418579, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -16023,7 +16023,7 @@ window.allobjects = function() { "gridH": 0.3499999940395355, "gridW": 0.8666666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -16836,7 +16836,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -16850,7 +16850,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -16864,7 +16864,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -16878,7 +16878,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1.0083333253860474, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -16892,7 +16892,7 @@ window.allobjects = function() { "gridH": 0.5166666507720947, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -17385,7 +17385,7 @@ window.allobjects = function() { "gridH": 0.5833333134651184, "gridW": 0.6166666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -17407,7 +17407,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 1.2833333015441895, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -17429,7 +17429,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -17451,7 +17451,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -17473,7 +17473,7 @@ window.allobjects = function() { "gridH": 0.5833333134651184, "gridW": 0.6166666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -17495,7 +17495,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 1.2833333015441895, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -17517,7 +17517,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -17539,7 +17539,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -17552,7 +17552,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -17566,7 +17566,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -17580,7 +17580,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -17594,7 +17594,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -18714,7 +18714,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -18736,7 +18736,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -18758,7 +18758,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -18780,7 +18780,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -19021,7 +19021,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -8, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -20366,7 +20366,7 @@ window.allobjects = function() { "gridH": 0.7666666507720947, "gridW": 0.7666666507720947, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -20388,7 +20388,7 @@ window.allobjects = function() { "gridH": 0.7666666507720947, "gridW": 1.5166666507720947, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -20410,7 +20410,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -20432,7 +20432,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -20551,7 +20551,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -20565,7 +20565,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -20579,7 +20579,7 @@ window.allobjects = function() { "gridH": 0.2666666805744171, "gridW": 0.2666666805744171, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -20593,7 +20593,7 @@ window.allobjects = function() { "gridH": 0.2666666805744171, "gridW": 0.5166666507720947, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -21914,7 +21914,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -21942,7 +21942,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -21970,7 +21970,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -21998,7 +21998,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -23144,7 +23144,7 @@ window.allobjects = function() { "gridH": 0.5833333134651184, "gridW": 0.6166666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -23166,7 +23166,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 1.2999999523162842, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -23188,7 +23188,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 0.6833333373069763, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -23210,7 +23210,7 @@ window.allobjects = function() { "gridH": 0.6166666746139526, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -23223,7 +23223,7 @@ window.allobjects = function() { "gridH": 0.11666666716337204, "gridW": 0.2666666805744171, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -23321,7 +23321,7 @@ window.allobjects = function() { "gridH": 0.5833333134651184, "gridW": 0.6166666746139526, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -23335,7 +23335,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 1.2999999523162842, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -23349,7 +23349,7 @@ window.allobjects = function() { "gridH": 0.6000000238418579, "gridW": 0.6833333373069763, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -23363,7 +23363,7 @@ window.allobjects = function() { "gridH": 0.6166666746139526, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -23377,7 +23377,7 @@ window.allobjects = function() { "gridH": 0.11666666716337204, "gridW": 0.2666666805744171, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -23422,7 +23422,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -23444,7 +23444,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -23509,7 +23509,7 @@ window.allobjects = function() { "default_z_layer": 5, "default_z_order": 10, "portalParticle": true, - "portalParticleColor": 0x00ffff + "portalParticleColor": 65535 }, "1332": { "type": "pad", @@ -23559,7 +23559,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 3, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -23581,7 +23581,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 3, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -23617,7 +23617,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -23639,7 +23639,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -23675,7 +23675,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -23697,7 +23697,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29224,7 +29224,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 1, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29246,7 +29246,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 1, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29324,7 +29324,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 1, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29346,7 +29346,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 1, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29683,7 +29683,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29705,7 +29705,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29727,7 +29727,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29749,7 +29749,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29773,7 +29773,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29797,7 +29797,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29819,7 +29819,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29841,7 +29841,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -29964,7 +29964,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -29986,7 +29986,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30008,7 +30008,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30030,7 +30030,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30052,7 +30052,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30074,7 +30074,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30233,7 +30233,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -30265,7 +30265,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -30297,7 +30297,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -30322,7 +30322,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30492,7 +30492,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30518,7 +30518,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30544,7 +30544,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30570,7 +30570,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_detail_color_channel": -1, "default_z_layer": 1, @@ -30603,7 +30603,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -9, "default_z_layer": 1, "default_z_order": -9 @@ -30635,7 +30635,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -9, "default_z_layer": 1, "default_z_order": -9 @@ -30667,7 +30667,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -9, "default_z_layer": 1, "default_z_order": -9 @@ -30699,7 +30699,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -9, "default_z_layer": 1, "default_z_order": -9 @@ -30753,7 +30753,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -30799,7 +30799,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -30846,7 +30846,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 3, @@ -30901,7 +30901,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -9, "default_z_layer": 1, "default_z_order": -9 @@ -30955,7 +30955,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -9, "default_z_layer": 1, "default_z_order": -9 @@ -31009,7 +31009,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -31063,7 +31063,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -9, "default_z_layer": 1, "default_z_order": -9 @@ -31117,7 +31117,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -7, "default_z_layer": 1, "default_z_order": -7 @@ -31171,7 +31171,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": -9, "default_z_layer": 1, "default_z_order": -9 @@ -32916,7 +32916,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 3, @@ -32938,7 +32938,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 3, @@ -32952,7 +32952,7 @@ window.allobjects = function() { "gridH": 0.4333333373069763, "gridW": 0.36666667461395264, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 3, @@ -32966,7 +32966,7 @@ window.allobjects = function() { "gridH": 0.44999998807907104, "gridW": 0.9666666388511658, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 9, "default_detail_color_channel": -1, "default_z_layer": 3, @@ -33061,7 +33061,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 @@ -33089,7 +33089,7 @@ window.allobjects = function() { "gridH": 1, "gridW": 2, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", + "type": "solid", "z": 2, "default_z_layer": 5, "default_z_order": 2 diff --git a/assets/scripts/utils/config.js b/assets/scripts/utils/config.js index 9bb07d7d..5277c0f8 100644 --- a/assets/scripts/utils/config.js +++ b/assets/scripts/utils/config.js @@ -23,6 +23,7 @@ window.orbClickShrinkTime = 250; window.orbParticleSize = 3.5; const urlParams = new URLSearchParams(window.location.search); +window.debugCollisions = urlParams.has("debugCollisions"); if (urlParams.has('id')) { window.levelID = urlParams.get('id'); } diff --git a/index.html b/index.html index 146f5979..ec72c602 100644 --- a/index.html +++ b/index.html @@ -31,10 +31,10 @@ - + - +