Geometry Dash Wave Github __full__
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>Geometry Dash Wave · GitHub Style Dash</title>
<style>
*
user-select: none;
-webkit-tap-highlight-color: transparent;
body
margin: 0;
min-height: 100vh;
background: linear-gradient(145deg, #0a0f1e 0%, #0c1222 100%);
display: flex;
justify-content: center;
align-items: center;
font-family: 'Segoe UI', 'Fira Code', 'Courier New', monospace;
.game-container
background: #000000aa;
border-radius: 2rem;
padding: 1rem 1.5rem 1.5rem 1.5rem;
backdrop-filter: blur(2px);
box-shadow: 0 20px 35px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.1);
canvas
display: block;
margin: 0 auto;
border-radius: 20px;
box-shadow: 0 0 0 3px #2e3a5e, 0 15px 25px rgba(0,0,0,0.4);
cursor: pointer;
.info-panel
display: flex;
justify-content: space-between;
align-items: baseline;
margin-top: 1rem;
margin-bottom: 0.5rem;
background: #01041880;
backdrop-filter: blur(8px);
padding: 0.7rem 1.5rem;
border-radius: 60px;
gap: 1.5rem;
flex-wrap: wrap;
border: 1px solid #2f416b;
.score-box, .best-box, .status
font-weight: bold;
letter-spacing: 1px;
text-shadow: 0 2px 3px black;
.score-box
color: #f5e56b;
font-size: 1.6rem;
font-family: monospace;
.best-box
color: #7fdbff;
font-size: 1.2rem;
.status
color: #ffb347;
font-size: 1rem;
background: #00000070;
padding: 0.2rem 1rem;
border-radius: 2rem;
font-family: monospace;
button
background: #20293f;
border: none;
font-family: monospace;
font-weight: bold;
font-size: 1rem;
padding: 0.4rem 1.2rem;
border-radius: 2rem;
color: white;
cursor: pointer;
transition: 0.1s linear;
box-shadow: 0 2px 6px black;
button:hover
background: #3a4a72;
transform: scale(0.97);
color: #ffdd99;
.controls-tip
font-size: 0.75rem;
color: #8e9ec5;
background: #02061780;
padding: 0.3rem 1rem;
border-radius: 2rem;
display: inline-flex;
align-items: center;
gap: 0.7rem;
kbd
background: #0f172a;
border-radius: 6px;
padding: 0.1rem 0.5rem;
font-weight: bold;
color: #ffd966;
box-shadow: inset 0 1px 0 0 #2d3a5e, 0 1px 2px black;
font-family: monospace;
footer
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 0.8rem;
gap: 1rem;
flex-wrap: wrap;
@media (max-width: 550px)
.game-container
padding: 0.7rem;
.score-box font-size: 1.3rem;
.info-panel padding: 0.4rem 1rem;
</style>
</head>
<body>
<div>
<div class="game-container">
<canvas id="gameCanvas" width="1000" height="400" style="width:100%; height:auto; max-width:1000px; aspect-ratio:1000/400"></canvas>
<div class="info-panel">
<div class="score-box">⚡ WAVE: <span id="scoreValue">0</span></div>
<div class="best-box">🏆 BEST: <span id="bestValue">0</span></div>
<div class="status" id="gameStatusText">▶ PRESS SPACE / CLICK</div>
</div>
<footer>
<div class="controls-tip">
<span><kbd>SPACE</kbd> / <kbd>↑</kbd> / <kbd>CLICK</kbd> → FLIP GRAVITY</span>
<span style="margin-left: 0.5rem;"><kbd>R</kbd> → RESTART</span>
</div>
<button id="resetButton">⟳ RESTART</button>
</footer>
</div>
<div style="text-align:center; margin-top: 0.8rem; font-size:0.7rem; color:#6c7aa5;">⚡ GEOMETRY DASH WAVE · INFINITE RUNNER ⚡</div>
</div>
<script>
(function()
// ---------- CANVAS ----------
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
// dimensions
let W = 1000;
let H = 400;
canvas.width = W;
canvas.height = H;
// ---------- GAME CONSTANTS ----------
const GROUND_Y = H - 70; // baseline y where ground/ceiling limits
const CEILING_Y = 50; // upper boundary (wave can't go above)
const WAVE_SIZE = 18; // radius of wave orb
const GRAVITY_FORCE = 0.45;
const FLIP_BOOST = -5.2; // instant upward velocity when flipping gravity while falling? Actually geometry dash wave: flip reverses gravity direction.
// We'll implement classic: gravity direction = +1 (down) or -1 (up). When flip, gravityDirection *= -1.
// Also to keep consistent: current y velocity changes sign? but more authentic: only gravity flips, current velocity is preserved but now gravity pulls opposite.
// To feel like GD wave: pressing toggles gravity direction, and adds a little vertical nudge? we add slight instant "impulse" to avoid sticking.
let gravityDirection = 1; // 1 = down, -1 = up
let yVelocity = 0;
let waveY = GROUND_Y - WAVE_SIZE/2;
// obstacles
let obstacles = [];
const OBSTACLE_W = 28;
const OBSTACLE_H = 28;
const OBSTACLE_GAP = 150; // gap between obstacles (distance)
let frameCounter = 0;
let spawnGapFrames = 65; // frames between spawns (dynamic based on speed)
let baseSpeed = 4.6; // scroll speed
let currentSpeed = baseSpeed;
// game state
let gameActive = true;
let score = 0;
let bestScore = 0;
// load best from localStorage
try
const saved = localStorage.getItem('gd_wave_best');
if(saved && !isNaN(parseInt(saved))) bestScore = parseInt(saved);
catch(e) /* silent */
// visual effects & particles
let particles = [];
// ----- helpers -----
function updateBestUI()
document.getElementById('bestValue').innerText = bestScore;
function updateScoreUI()
document.getElementById('scoreValue').innerText = Math.floor(score);
// reset game fully
function resetGame()
gameActive = true;
score = 0;
updateScoreUI();
obstacles = [];
frameCounter = 0;
gravityDirection = 1;
yVelocity = 0;
waveY = GROUND_Y - WAVE_SIZE/2;
currentSpeed = baseSpeed;
particles = [];
document.getElementById('gameStatusText').innerText = '⚡ PLAYING ⚡';
document.getElementById('gameStatusText').style.color = '#a0ffb0';
// small safety check: ensure wave inside boundaries
clampWave();
// clamp wave within limits
function clampWave()
const minY = CEILING_Y;
const maxY = GROUND_Y - WAVE_SIZE;
if(waveY < minY) waveY = minY;
if(waveY > maxY) waveY = maxY;
// flip gravity (core wave mechanic)
function flipGravity()
if(!gameActive) return;
// classic Geometry Dash wave: pressing flips gravity direction and gives a tiny vertical push
gravityDirection *= -1;
// add small impulse to avoid "sticky" feeling: if moving toward ground/ceiling, give slight kick opposite to new gravity?
// but authentic: pressing changes gravity and gives instant slight upward/downward nudge? Actually in GD wave,
// each click instantly changes gravity direction and sets vertical speed to a fixed small value in the opposite direction of new gravity.
// We'll implement that: when you flip, set velocity to FLIP_BOOST * gravityDirection? but careful: FLIP_BOOST is negative (upward).
// Let's set: after flip, velocity = (gravityDirection == 1 ? +2.2 : -2.2) → gives crisp response.
// But too overpowered? We choose moderate: new velocity = gravityDirection * 3.2 (upwards if gravity down)
// To feel like wave:
if(gravityDirection === 1)
yVelocity = 3.6; // falling faster
else
yVelocity = -3.6; // rising faster
// prevent sticking to border
clampWave();
// add a little particle burst on flip
for(let i=0;i<6;i++)
particles.push(
x: W/2 + (Math.random() - 0.5)*40,
y: waveY + WAVE_SIZE/2,
vx: (Math.random() - 0.5)*2,
vy: (Math.random() - 0.5)*3 - 1,
life: 0.7,
size: 2+Math.random()*3,
color: `hsl($Math.random() * 60 + 40, 80%, 65%)`
);
// spawn obstacle (ceiling or ground? classic wave obstacles are blocks that appear both on floor and ceiling? Actually geometry dash wave obstacles are spike-like or blocks on both sides.
// For simplicity we create a moving obstacle block that can be on ground or ceiling. The player must avoid by staying in the middle gap.
// But Geometry Dash wave mode often has pillars/blocks from top and bottom. We'll generate pairs? More fair: single obstacles either on GROUND or CEILING but wave can crush.
// To replicate difficulty: generate obstacle from TOP (ceiling) or BOTTOM (ground) randomly, or both? To not be too cruel, we do single obstacles that the player must navigate.
// However classic GD wave: there are obstacles both up and down, requiring precise flips. We'll create two variants: lowBlock (on ground) and highBlock (on ceiling).
// I'll implement both types: each obstacle is an object with type 'top' or 'bottom'. Player collides if overlaps.
function spawnObstacle()
const type = Math.random() < 0.5 ? 'top' : 'bottom';
let yPos;
if(type === 'bottom')
yPos = GROUND_Y - OBSTACLE_H;
else
yPos = CEILING_Y;
obstacles.push(
x: W,
y: yPos,
width: OBSTACLE_W,
height: OBSTACLE_H,
type: type
);
// update obstacles, collisions, scoring
function updateGame() waveY >= maxAllowed)
gameActive = false;
document.getElementById('gameStatusText').innerHTML = '💥 CRASH! RESTART [R] 💥';
document.getElementById('gameStatusText').style.color = '#ff8877';
for(let i=0;i<24;i++)
particles.push(
x: WAVE_FIXED_X,
y: waveY + WAVE_SIZE/2,
vx: (Math.random()-0.5)*6,
vy: (Math.random()-0.5)*6,
life: 1,
size: 2+Math.random()*4,
color: `#ff6644`
);
// update particles
for(let i=0;i<particles.length;i++)
particles[i].x += particles[i].vx;
particles[i].y += particles[i].vy;
particles[i].vy += 0.12;
particles[i].life -= 0.02;
particles = particles.filter(p => p.life > 0 && p.y < H+50 && p.x > -50);
// ---------- DRAW EVERYTHING (Geometry Dash Style) ----------
function draw()
if(!ctx) return;
ctx.clearRect(0, 0, W, H);
// background gradient (night synthwave)
const grad = ctx.createLinearGradient(0, 0, 0, H);
grad.addColorStop(0, '#0b1120');
grad.addColorStop(0.7, '#141c2c');
ctx.fillStyle = grad;
ctx.fillRect(0, 0, W, H);
// draw grid lines (dash style)
ctx.beginPath();
ctx.strokeStyle = '#2e3d5e';
ctx.lineWidth = 1;
for(let y=CEILING_Y; y<=GROUND_Y; y+=45)
ctx.beginPath();
ctx.moveTo(0, y);
ctx.lineTo(W, y);
ctx.stroke();
// ground & ceiling "danger zones"
ctx.fillStyle = '#231d30b3';
ctx.fillRect(0, 0, W, CEILING_Y+5);
ctx.fillRect(0, GROUND_Y-5, W, H-GROUND_Y+8);
// spikes on ground/ceiling
ctx.fillStyle = '#bf4c6e';
for(let i=0;i<12;i++)
ctx.beginPath();
let xOff = (Date.now()*0.003 + i*70) % (W+100) - 50;
ctx.moveTo(xOff, GROUND_Y-8);
ctx.lineTo(xOff+12, GROUND_Y+2);
ctx.lineTo(xOff-12, GROUND_Y+2);
ctx.fill();
// ---- draw obstacles (glowing blocks) ----
for(let obs of obstacles)
let grd = ctx.createLinearGradient(obs.x, obs.y, obs.x+5, obs.y+OBSTACLE_H);
grd.addColorStop(0, '#e24a6e');
grd.addColorStop(1, '#a02050');
ctx.fillStyle = grd;
ctx.shadowBlur = 8;
ctx.shadowColor = '#ff3b6f';
ctx.fillRect(obs.x, obs.y, OBSTACLE_W, OBSTACLE_H);
ctx.fillStyle = '#ffbc7a';
ctx.fillRect(obs.x+4, obs.y+4, OBSTACLE_W-8, 6);
ctx.fillStyle = '#ffddbb';
ctx.fillRect(obs.x+6, obs.y+OBSTACLE_H-10, OBSTACLE_W-12, 4);
ctx.shadowBlur = 0;
// ---- DRAW WAVE (the core player) ----
const waveX = 180;
const waveRad = WAVE_SIZE/2;
ctx.save();
ctx.shadowBlur = 12;
ctx.shadowColor = '#00e0ff';
// outer glow
ctx.beginPath();
ctx.arc(waveX, waveY+waveRad, waveRad+3, 0, Math.PI*2);
ctx.fillStyle = '#20c4ff30';
ctx.fill();
ctx.beginPath();
ctx.arc(waveX, waveY+waveRad, waveRad, 0, Math.PI*2);
// gradient fill
const gradWave = ctx.createRadialGradient(waveX-3, waveY+waveRad-3, 3, waveX, waveY+waveRad, waveRad);
gradWave.addColorStop(0, '#f0f9ff');
gradWave.addColorStop(0.6, '#3cc7ff');
gradWave.addColorStop(1, '#0080c0');
ctx.fillStyle = gradWave;
ctx.fill();
ctx.beginPath();
ctx.arc(waveX-2, waveY+waveRad-3, 3, 0, Math.PI*2);
ctx.fillStyle = 'white';
ctx.fill();
// "dash" eye
ctx.fillStyle = '#021826';
ctx.beginPath();
ctx.arc(waveX+3, waveY+waveRad-2, 2, 0, Math.PI*2);
ctx.fill();
ctx.fillStyle = 'white';
ctx.beginPath();
ctx.arc(waveX+4, waveY+waveRad-3, 0.8, 0, Math.PI*2);
ctx.fill();
// energy trail
for(let i=0;i<3;i++)
ctx.beginPath();
ctx.moveTo(waveX-waveRad-2-i*2, waveY+waveRad-2);
ctx.lineTo(waveX-waveRad-8-i*3, waveY+waveRad-4+ (gravityDirection===1?4:-2));
ctx.lineWidth = 3;
ctx.strokeStyle = `rgba(0, 220, 255, $0.5-i*0.1)`;
ctx.stroke();
ctx.restore();
// draw particles (explosions, flip dust)
for(let p of particles)
ctx.globalAlpha = Math.min(1, p.life * 1.2);
ctx.fillStyle = p.color
ctx.globalAlpha = 1;
// show speed indicator
ctx.font = 'bold 14px "Fira Code", monospace';
ctx.fillStyle = '#eef5ffcc';
ctx.fillText(`SPEED: $currentSpeed.toFixed(1)`, W-110, 35);
ctx.fillStyle = '#b7cdff';
ctx.fillText(`GRAVITY: $gravityDirection === 1 ? '⬇ DOWN' : '⬆ UP'`, W-110, 65);
// wave indicator line
ctx.beginPath();
ctx.setLineDash([8, 12]);
ctx.strokeStyle = '#ffe484';
ctx.lineWidth = 1.8;
ctx.moveTo(0, waveY+waveRad);
ctx.lineTo(W, waveY+waveRad);
ctx.stroke();
ctx.setLineDash([]);
// game over overlay if inactive
if(!gameActive)
ctx.font = '800 36px "Segoe UI", monospace';
ctx.fillStyle = '#ffdfb0';
ctx.shadowBlur = 0;
ctx.fillText('⚡ GAME OVER ⚡', W/2-140, H/2-40);
ctx.font = '18px monospace';
ctx.fillStyle = '#ffae70';
ctx.fillText('press [R] or click RESTART', W/2-130, H/2+25);
// draw extra glow on active
if(gameActive)
ctx.font = 'italic 12px monospace';
ctx.fillStyle = '#ddf4ff';
ctx.fillText('» CLICK / SPACE to FLIP «', 20, H-20);
// ----- animation loop -----
let lastTimestamp = 0;
function gameLoop()
if(gameActive)
updateGame();
draw();
requestAnimationFrame(gameLoop);
// ----- event handlers -----
function handleFlip()
if(gameActive)
flipGravity();
function onKeyDown(e)
function onCanvasClick(e)
e.preventDefault();
handleFlip();
// reset button
const resetBtn = document.getElementById('resetButton');
resetBtn.addEventListener('click', () =>
resetGame();
);
// window resize handling: keep canvas dimensions robust
function handleResize()
const container = canvas.parentElement;
const maxWidth = Math.min(1000, window.innerWidth - 40);
canvas.style.width = `$maxWidthpx`;
canvas.width = W;
canvas.height = H;
window.addEventListener('resize', handleResize);
handleResize();
// attach listeners
window.addEventListener('keydown', onKeyDown);
canvas.addEventListener('click', onCanvasClick);
canvas.addEventListener('touchstart', (e) =>
e.preventDefault();
handleFlip();
);
// init best score UI
updateBestUI();
resetGame(); // initial fresh state
gameLoop();
)();
</script>
</body>
</html>
4. TAS and Botting: Learning from Perfection
Tool-Assisted Speedrunning (TAS) is massive in Geometry Dash. GitHub hosts countless scripts that record and replay inputs. For mastering the Wave, you can download TAS playback macros.
2. For Recreating the Game (Source Code)
If you want to code your own wave gamemode or understand the math: geometry dash wave github
- Repository:
matcool/CopperGD- What it is: A C++ recreation of Geometry Dash. It is lightweight and excellent for studying how the physics work.
- Repository:
HJfod/BetterEdit- What it is: While an editor mod, the source code contains immense amounts of documentation on how GD handles triggers and gamemode switching.
Part 4: Is It Cheating? The Ethical Dilemma
The search term geometry dash wave github exists in a grey area. RobTop has not officially endorsed any GitHub mods, but he rarely bans players for using them—because Geometry Dash is primarily a single-player game. Repository: matcool/CopperGD
- The Purist View: Using a Wave practice mod to slow down 6x speed segments to 1x speed "ruins the integrity" of the level design.
- The Speedrunner View: Top players (Zoink, Trick, SpaceUK) use these tools to learn frame-perfect clicks. They argue that practicing a Wave at 0.5x speed and then re-learning at normal speed is the only way to beat "Top 1 Demons."
- The Reality: If you are using a GitHub mod to create a "perfect run" macro (automated play) and upload it as a legitimate completion, that is universally considered cheating. If you use it to practice your own copy of the level, almost no one cares.