Filter
Exclude
Time range
-
Near
🠠Je installateur biedt alleen P-type aan? Stel vragen - de industrie is al overgestapt linkedin.com/pulse/n-type-vs… #Zonnepanelen #NType #PType #TOPCon #ZonneEnergie
2
Both users are owners of the large VRChat group "Prototype†(PTYPE.4185) Any screenshots, chat logs, voice recordings, timelines, or other evidence is helpful.
1
90
Pattern Change Coming (3/31 to 4/3): Uncertainty exists for track of disturbances. Moisture availability/ptype in question. We WANT/NEED moisture. Latest ensemble output suggests better chances for beneficial moisture make us happy. Stay tuned. #SDwx #WYwx
1
7
531
Mar 26
version with sound: // CMXMTRIS v.1 — Wall Kicks Fiery Explosions Sound // ↠→ move | ↓ soft drop | ↑ or W rotate (with wall kicks) | Space hard drop | Shift hold (async () => { const playfield = new Uint8Array(200); let px = 3, py = 0, ptype = 0; let matrix = []; let hold = -1, canHold = true; let score = 0, linesTotal = 0, level = 1; let lastDrop = 0; let dropSpeed = 600; let keys = new Set(); let particles = []; const shapes = [ [[1,1,1,1]], [[1,1],[1,1]], [[0,1,0],[1,1,1]], [[0,1,1],[1,1,0]], [[1,1,0],[0,1,1]], [[1,0,0],[1,1,1]], [[0,0,1],[1,1,1]] ]; const colors = ['#00ffff', '#0022ff', '#00ff00', '#ffff00', '#ff8800', '#0088ff', '#ff0088']; // Audio const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); function playTone(freq, duration, type = 'sine', volume = 0.3) { const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); osc.type = type; osc.frequency.setValueAtTime(freq, audioCtx.currentTime); gain.gain.value = volume; osc.connect(gain).connect(audioCtx.destination); osc.start(); osc.stop(audioCtx.currentTime duration); } document.documentElement.innerHTML = ''; const canvas = document.createElement('canvas'); canvas.width = innerWidth; canvas.height = innerHeight; canvas.style.cssText = 'position:fixed;inset:0;background:#000;image-rendering:pixelated'; document.documentElement.appendChild(canvas); const ctx = canvas.getContext('2d', {alpha:false}); // Wall kick data (SRS simplified) const wallKicks = [ [[0,0], [-1,0], [-1,1], [0,-2], [-1,-2]], [[0,0], [1,0], [1,-1], [0,2], [1,2]], [[0,0], [1,0], [1,1], [0,-2], [1,-2]], [[0,0], [-1,0], [-1,-1],[0,2], [-1,2]] ]; function spawn() { ptype = Math.floor(Math.random()*7); matrix = shapes[ptype].map(r => r.slice()); px = 3; py = 0; canHold = true; } function draw() { ctx.fillStyle = '#0a0011'; ctx.fillRect(0,0,canvas.width,canvas.height); const bs = Math.floor(Math.min(canvas.width/14, canvas.height/24)); const ox = canvas.width/2 - bs*5; // grid ctx.strokeStyle = '#112233'; ctx.lineWidth = 2; for (let i=0;i<=10;i ) { ctx.beginPath(); ctx.moveTo(ox i*bs,bs*1.5); ctx.lineTo(ox i*bs,bs*1.5 bs*20); ctx.stroke(); } for (let i=0;i<=20;i ) { ctx.beginPath(); ctx.moveTo(ox,bs*1.5 i*bs); ctx.lineTo(ox bs*10,bs*1.5 i*bs); ctx.stroke(); } // locked blocks for (let i=0;i<200;i ) if (playfield[i]) { ctx.shadowBlur = 30; ctx.shadowColor = colors[playfield[i]-1]; ctx.fillStyle = colors[playfield[i]-1]; ctx.fillRect(ox (i)*bs, bs*1.5 Math.floor(i/10)*bs, bs-2, bs-2); } // ghost let gy = py; while (!collides(px, gy 1, matrix)) gy ; ctx.globalAlpha = 0.25; ctx.shadowBlur = 35; ctx.shadowColor = colors[ptype]; for (let y=0;y<matrix.length;y ) for (let x=0;x<matrix[y].length;x ) if (matrix[y][x]) { ctx.fillRect(ox (px x)*bs, bs*1.5 (gy y)*bs, bs-2, bs-2); } ctx.globalAlpha = 1; // current piece ctx.shadowBlur = 50; ctx.shadowColor = colors[ptype]; for (let y=0;y<matrix.length;y ) for (let x=0;x<matrix[y].length;x ) if (matrix[y][x]) { ctx.fillStyle = colors[ptype]; ctx.fillRect(ox (px x)*bs, bs*1.5 (py y)*bs, bs-2, bs-2); } // fiery explosion particles for (let i=particles.length-1;i>=0;i--) { const p = particles[i]; ctx.shadowBlur = 25; ctx.shadowColor = p.c; ctx.fillStyle = p.c; ctx.globalAlpha = p.a; ctx.fillRect(p.x, p.y, 10, 10); p.x = p.vx; p.y = p.vy; p.a -= 0.035; p.vy = 0.45; if (p.a <= 0) particles.splice(i,1); } ctx.globalAlpha = 1; // HUD ctx.fillStyle = '#00ffff'; ctx.font = 'bold 34px monospace'; ctx.shadowBlur = 15; ctx.shadowColor = '#00ffff'; ctx.fillText('SCORE', 50, 90); ctx.fillText(score.toString().padStart(7,'0'), 50, 145); ctx.fillText('LEVEL', 50, 240); ctx.fillText(level.toString(), 50, 290); } function collides(tx, ty, mat) { for (let y=0;y<mat.length;y ) for (let x=0;x<mat[y].length;x ) if (mat[y][x]) { const nx = tx x, ny = ty y; if (nx<0||nx>=10||ny>=20) return true; if (ny<0) continue; if (playfield[ny*10 nx]) return true; } return false; } function tryRotate() { const rotated = rotateMatrix(matrix); const kicks = wallKicks[ptype % 4]; for (let [kx, ky] of kicks) { if (!collides(px kx, py ky, rotated)) { px = kx; py = ky; matrix = rotated; return true; } } return false; } function lock() { for (let y=0;y<matrix.length;y ) for (let x=0;x<matrix[y].length;x ) if (matrix[y][x]) { const idx = (py y)*10 (px x); if (idx >= 0 && idx < 200) playfield[idx] = ptype 1; } clearLines(); spawn(); } function clearLines() { let cleared = 0; let y = 19; while (y >= 0) { if (playfield.slice(y*10, y*10 10).every(v => v)) { cleared ; // Fiery explosion for (let i=0;i<10;i ) { for (let k=0;k<45;k ) { particles.push({ x: canvas.width/2 - 140 i*28 Math.random()*40, y: 90 y*28 Math.random()*30, vx: (Math.random()-0.5)*32, vy: -Math.random()*25 - 8, a: 1.4, c: Math.random() > 0.6 ? '#ff8800' : '#ffff00' }); } } for (let r=y; r>0; r--) playfield.set(playfield.slice((r-1)*10, r*10), r*10); playfield.set(new Uint8Array(10), 0); } else y--; } if (cleared) { score = cleared * 200 * level; linesTotal = cleared; level = Math.floor(linesTotal / 7) 1; playTone(800 cleared * 300, 0.18, 'sawtooth', 0.5); } } function loop(t) { if (!lastDrop) lastDrop = t; const dt = t - lastDrop; if (keys.has('ArrowLeft') && !collides(px-1,py,matrix)) { px--; keys.delete('ArrowLeft'); playTone(600, 0.02); } if (keys.has('ArrowRight') && !collides(px 1,py,matrix)) { px ; keys.delete('ArrowRight'); playTone(600, 0.02); } if (keys.has('ArrowDown')) if (!collides(px,py 1,matrix)) { py ; playTone(400, 0.01); } if (keys.has('ArrowUp') || keys.has('w')) { if (tryRotate()) playTone(900, 0.06, 'square'); keys.delete('ArrowUp'); keys.delete('w'); } if (keys.has('Shift') && canHold) { if (hold === -1) { hold = ptype; spawn(); } else { [ptype, hold] = [hold, ptype]; matrix = shapes[ptype].map(r=>r.slice()); px=3; py=0; } canHold = false; keys.delete('Shift'); playTone(700, 0.08); } if (keys.has(' ')) { while (!collides(px,py 1,matrix)) py ; lock(); keys.delete(' '); playTone(300, 0.12, 'sawtooth'); } if (dt > dropSpeed / level) { if (!collides(px,py 1,matrix)) py ; else lock(); lastDrop = t; } draw(); requestAnimationFrame(loop); } function rotateMatrix(mat) { const rows = mat.length; const cols = mat[0].length; const rotated = Array.from({length: cols}, () => Array(rows).fill(0)); for (let i = 0; i < rows; i ) { for (let j = 0; j < cols; j ) { rotated[j][rows - 1 - i] = mat[i][j]; } } return rotated; } document.addEventListener('keydown', e => keys.add(e.key)); document.addEventListener('keyup', e => keys.delete(e.key)); spawn(); requestAnimationFrame(loop); console.log('ÌMXMTRIS v.1 loaded — Wall Kicks Fiery Explosions Sound', 'color:#00ffff;font-size:20px;font-family:monospace'); })();

1
62
Mar 26
Added wall kick and fire: # cxmxtris A minimal, high-performance Tetris-style game built as a single console-paste experience. No files, no HTML, no external dependencies — pure JavaScript that runs instantly in any modern browser. ## What It Is cxmxtris is a fast, visually striking implementation of classic Tetris mechanics with modern visual effects and authentic gameplay rules. It was created to explore the limits of "zero-install" browser gaming while maintaining clean, readable code and proper Tetris behavior. ### Core Features - **Classic Tetris Gameplay** - All 7 standard tetrominoes (I, O, T, S, Z, J, L) - Accurate collision detection - Line clearing with proper row shifting (top-to-bottom behavior) - **Wall Kicks (SRS-style)**: When rotating near walls or other blocks, the piece automatically shifts left/right/up to complete the rotation when possible — matching official modern Tetris behavior. - **Modern Visual Enhancements** - Glowing neon blocks with dynamic shadow and glow effects - Ghost piece preview (shows exact landing position) - Fiery particle explosions on line clears (bright orange/yellow embers that burst upward with momentum) - Smooth real-time rendering using Canvas 2D - **Controls** - ↠→ : Move piece left/right - ↓ : Soft drop (faster fall while held) - ↑ or **W** : Rotate piece clockwise (with wall kicks) - **Space** : Hard drop (instant drop and lock) - **Shift** : Hold / Swap current piece (one hold per piece, standard Tetris rule) - **Progression** - Score increases with cleared lines and current level - Level increases every 7 lines - Drop speed increases with level - **Technical Highlights** - Uses a flat `Uint8Array(200)` for the 10×20 playfield (highly memory-efficient) - Single `requestAnimationFrame` game loop - No external libraries or assets - Runs entirely from browser console paste (`about:blank`) - Optimized for both desktop and mobile (in desktop mode) ## How to Play 1. Open a new browser tab and navigate to `about:blank` 2. Press `F12` to open Developer Tools 3. Go to the **Console** tab 4. Paste the entire game code 5. Press Enter The game will instantly take over the screen. ## What This Project Showcases - **Extreme Minimalism**: A complete, polished game in a single self-contained script with zero external dependencies. - **Console-First Development**: Demonstrates how far you can push the browser console for rapid game prototyping and instant play. - **Authentic Mechanics**: Proper implementation of **wall kicks**, ghost preview, hold system, and line clearing — matching modern Tetris standards. - **Clean Code Principles**: Professional structure with clear variable names, modular functions, and readable logic despite the extreme constraints. - **Visual Polish**: Strong use of Canvas shadows, dynamic glow, and fiery particle systems to create an engaging, premium feel. - **Performance Awareness**: Efficient memory usage and rendering optimized for smooth gameplay. ## Why This Approach? This project was built to answer the question: "How minimal and immediate can a fun, playable game be while still feeling premium and mechanically accurate?" By removing files, build steps, and external resources, cxmxtris becomes a pure demonstration of creativity within extreme constraints — perfect for quick daily experiments or sharing instant playable experiences. : // cxmxtris — Fiery Explosion edt. (pure console, no HTML file) (async () => { const playfield = new Uint8Array(200); let px = 3, py = 0, ptype = 0; let matrix = []; let hold = -1, canHold = true; let score = 0, linesTotal = 0, level = 1; let lastDrop = 0; let dropSpeed = 600; let keys = new Set(); let particles = []; const shapes = [ [[1,1,1,1]], [[1,1],[1,1]], [[0,1,0],[1,1,1]], [[0,1,1],[1,1,0]], [[1,1,0],[0,1,1]], [[1,0,0],[1,1,1]], [[0,0,1],[1,1,1]] ]; const colors = ['#00ffff', '#0022ff', '#00ff00', '#ffff00', '#ff8800', '#0088ff', '#ff0088']; document.documentElement.innerHTML = ''; const canvas = document.createElement('canvas'); canvas.width = innerWidth; canvas.height = innerHeight; canvas.style.cssText = 'position:fixed;inset:0;background:#000;image-rendering:pixelated'; document.documentElement.appendChild(canvas); const ctx = canvas.getContext('2d', {alpha:false}); function spawn() { ptype = Math.floor(Math.random()*7); matrix = shapes[ptype].map(r => r.slice()); px = 3; py = 0; canHold = true; } function draw() { ctx.fillStyle = '#0a0011'; ctx.fillRect(0,0,canvas.width,canvas.height); const bs = Math.floor(Math.min(canvas.width/14, canvas.height/24)); const ox = canvas.width/2 - bs*5; // grid ctx.strokeStyle = '#112233'; ctx.lineWidth = 2; for (let i=0;i<=10;i ) { ctx.beginPath(); ctx.moveTo(ox i*bs,bs*1.5); ctx.lineTo(ox i*bs,bs*1.5 bs*20); ctx.stroke(); } for (let i=0;i<=20;i ) { ctx.beginPath(); ctx.moveTo(ox,bs*1.5 i*bs); ctx.lineTo(ox bs*10,bs*1.5 i*bs); ctx.stroke(); } // locked blocks for (let i=0;i<200;i ) if (playfield[i]) { ctx.shadowBlur = 30; ctx.shadowColor = colors[playfield[i]-1]; ctx.fillStyle = colors[playfield[i]-1]; ctx.fillRect(ox (i)*bs, bs*1.5 Math.floor(i/10)*bs, bs-2, bs-2); } // ghost let gy = py; while (!collides(px, gy 1, matrix)) gy ; ctx.globalAlpha = 0.25; ctx.shadowBlur = 35; ctx.shadowColor = colors[ptype]; for (let y=0;y<matrix.length;y ) for (let x=0;x<matrix[y].length;x ) if (matrix[y][x]) { ctx.fillRect(ox (px x)*bs, bs*1.5 (gy y)*bs, bs-2, bs-2); } ctx.globalAlpha = 1; // current piece ctx.shadowBlur = 50; ctx.shadowColor = colors[ptype]; for (let y=0;y<matrix.length;y ) for (let x=0;x<matrix[y].length;x ) if (matrix[y][x]) { ctx.fillStyle = colors[ptype]; ctx.fillRect(ox (px x)*bs, bs*1.5 (py y)*bs, bs-2, bs-2); } // fiery explosion particles for (let i=particles.length-1;i>=0;i--) { const p = particles[i]; ctx.shadowBlur = 25; ctx.shadowColor = p.c; ctx.fillStyle = p.c; ctx.globalAlpha = p.a; ctx.fillRect(p.x, p.y, 10, 10); p.x = p.vx; p.y = p.vy; p.a -= 0.035; p.vy = 0.45; if (p.a <= 0) particles.splice(i,1); } ctx.globalAlpha = 1; // HUD ctx.fillStyle = '#00ffff'; ctx.font = 'bold 34px monospace'; ctx.shadowBlur = 15; ctx.shadowColor = '#00ffff'; ctx.fillText('SCORE', 50, 90); ctx.fillText(score.toString().padStart(7,'0'), 50, 145); ctx.fillText('LEVEL', 50, 240); ctx.fillText(level.toString(), 50, 290); } function collides(tx, ty, mat) { for (let y=0;y<mat.length;y ) for (let x=0;x<mat[y].length;x ) if (mat[y][x]) { const nx = tx x, ny = ty y; if (nx<0||nx>=10||ny>=20) return true; if (ny<0) continue; if (playfield[ny*10 nx]) return true; } return false; } function lock() { for (let y=0;y<matrix.length;y ) for (let x=0;x<matrix[y].length;x ) if (matrix[y][x]) { const idx = (py y)*10 (px x); if (idx >= 0 && idx < 200) playfield[idx] = ptype 1; } clearLines(); spawn(); } function clearLines() { let cleared = 0; let y = 19; while (y >= 0) { if (playfield.slice(y*10, y*10 10).every(v => v)) { cleared ; // Fiery explosion at cleared line for (let i=0;i<10;i ) { for (let k=0;k<45;k ) { particles.push({ x: canvas.width/2 - 140 i*28 Math.random()*40, y: 90 y*28 Math.random()*30, vx: (Math.random()-0.5)*32, vy: -Math.random()*25 - 8, a: 1.4, c: Math.random() > 0.6 ? '#ff8800' : '#ffff00' }); } } for (let r=y; r>0; r--) playfield.set(playfield.slice((r-1)*10, r*10), r*10); playfield.set(new Uint8Array(10), 0); } else y--; } if (cleared) { score = cleared * 200 * level; linesTotal = cleared; level = Math.floor(linesTotal / 7) 1; } } function loop(t) { if (!lastDrop) lastDrop = t; const dt = t - lastDrop; if (keys.has('ArrowLeft') && !collides(px-1,py,matrix)) { px--; keys.delete('ArrowLeft'); } if (keys.has('ArrowRight') && !collides(px 1,py,matrix)) { px ; keys.delete('ArrowRight'); } if (keys.has('ArrowDown')) if (!collides(px,py 1,matrix)) py ; if (keys.has('ArrowUp') || keys.has('w')) { const r = rotateMatrix(matrix); if (!collides(px,py,r)) matrix = r; keys.delete('ArrowUp'); keys.delete('w'); } if (keys.has('Shift') && canHold) { if (hold === -1) { hold = ptype; spawn(); } else { [ptype, hold] = [hold, ptype]; matrix = shapes[ptype].map(r=>r.slice()); px=3; py=0; } canHold = false; keys.delete('Shift'); } if (keys.has(' ')) { while (!collides(px,py 1,matrix)) py ; lock(); keys.delete(' '); } if (dt > dropSpeed / level) { if (!collides(px,py 1,matrix)) py ; else lock(); lastDrop = t; } draw(); requestAnimationFrame(loop); } function rotateMatrix(mat) { const r = mat[0].length; const c = mat.length; const newMat = Array.from({length:r}, () => Array(c).fill(0)); for (let i=0;i<c;i ) for (let j=0;j<r;j ) newMat[j][c-1-i] = mat[i][j]; return newMat; } document.addEventListener('keydown', e => keys.add(e.key)); document.addEventListener('keyup', e => keys.delete(e.key)); spawn(); requestAnimationFrame(loop); console.log('Ïiery explosion version loaded — lines clear with fire particles', 'color:#ff8800;font-size:18px'); })();
1
1
2
241
Replying to @Danbury_WX
Yup and most of the time the models aren't actually predicting it despite what the maps show. 6 hour QPF getting binned as a specific ptype isn't reality.
1
9
1,322
Guidance killers 101. If you are monitoring a computer generated solution of which is attempting to link two disturbances together from thousands of miles away you may now note "trending". When you have a huge wave breaking high between said features, especially if one is pinned then released, you will face wild timing swings run to run or suite to suite until these two disturbances are in clear cut forward motion and with a direct sight line between them. Otherwise what you witness is one run connecting and one run not. Maybe the not-run picks up on a slowed ejection from the SW US ensuring the northern stream is ahead and pushes everything east. No phase. Warm cutter low w/powerful sweeping cold front. Maybe the timing is wrong and the SW US vort ejects early yet slow enough allowing the northern stream to catch up, dig, and capture the southern low, developing a coastal storm for the North East. Would still be a N&W of I-95 wintry theory mind you. For now I continue to favor a Spring scenario of a cutting parent low to the Lakes and powerful rainy stormy cold fronts sweeping the urban coastal corridors mid month perhaps 2 to 3 times in a row. Weather shifts as do ideas. If this changes we'll see why and chase. For now though I think wintry ideas are on the shelf. Rain, wind, storms a more likely headliner. Main takeaway is strong thermal clashing is likely so we'll see stronger storm systems regardless of their exact tracking and (ptype) impacts.
19
1,751
Today a pocket of showers pulls east through PA & NJ. This sets the front of which tomorrow's low tracks. Being a slider and coming in the PM we'll see ptype lines set up and hold not advance. Icing on the way again over the interior elevated. Sleet goes to Snow, VT/NH.
1
12
1,209
Our system and its general ptype lines advancing more steadily ENE now.
6
808
Negative 5C appears to be the frozen ptype cutoff today at 700mb. Track accordingly.
1
25
2,719
I am so making a winter-ptype loop of this when I get home
You don't see this very often Sleet mixed with large hail and thundersleet with a severe thunderstorm warning 👀
9
961
Here's a quick ice accretion forecast for Mon PM into Tue AM. Nothing substantial is expected, but some accretion of ice is possible (especially on elev. surfaces) as temps remain below freezing. Rising temps after sunrise will change ptype to rain everywhere, melting any ice.
2
10
504
Large-scale confluence over the Northeast US & Eastern Canada imparted by a northwest flow regime will allow for quite a prominent surface high to build early next week. If energy is able to overrun this airmass, even with a ridge aloft, wintry precip (ptype uncertain) is psbl.
2
272
She knows about C and XML now, but can't tell the difference --- Generated --- #include <stdio.h> <sys.h> <stdio.h> References: <enum < <name> References: < <name> < < <enum <name> <name> <name> <enum <param> <name> <listname> <param> <param> <type> <param> <param> <type> <name> <name> <name> <enum> <param> <param> <enum> <param> <param> <param> <param> <param> <param> <enum> <enum> <param> <enum name="GPU> <name> <param> <register type="GLEXT> <name> <param> <param> <param> <name> <param> <enum <name> <enum name="void <register type="event <param> <name> <param> <enum> <name> <command> <value> <param> <name> <counter> <name> <param> <enum name="void <param> <name> <param> <command> <register type="ptype> <enum <name> <enum <enum <register type="1" name="GL> <param> <param> <enum name="enum name="GPU"> <enum name="uint <command> <param> <param> <enum name="name> <param> <param> <enum name="GLenum value="GL"/> ...
Trained a GPT-2 style LLM on 1.1 gigabytes of data. Reached a loss of 1.160001 by step 3000. She is Ryuthe, she is made up of alt.horror.werewolves, alt.fan.dragons, and comp.sources.unix. If enough people want, I will release the weights, ~10 million params.
1
3
216
Replying to @Its_hari1
i love Ptype and ID’s designs but Springtrap is so incredibly unique. the springlock system, animatronic designs, and horror of a corpse meshed with a performer suit. a suit he used to kill became his death and his prison. poetic, unique, gnarly. yes i am glazing idc
3
744
Looks like the Rgem cave has started, it’s still messing up ptype
2
14
3,705
After three weeks of working on additions to my code, I've finally made a radar loop of the January 23-25, 2026 winter storm across Oklahoma, including mPING reports! I've slowed down the framerate a bit to better show times when ptype transitions occured in populated areas.
6
10
137
10,687
Today our warm front advances. It meets polar air & stalls setting up a tight thermal gradient. Wednesday & Friday systems track this gradient WNW to ESE setting up PType lines. Fridays' cold front repositions the boundary into the Mid-Atlantic. Sunday storm tracks that gradient.
1
36
2,473
Replying to @BostonWxConsult
PTYPE renders are not SIMRAD. They miss lower level moisture yet this is not a suggestion to believe the model is too dry & to lean high. They do this with every clipper warm front, every OES episode. If there was a takeaway it'd be to "lean high" & suggest "overperform" but that is unrealistic for you'd have to do that every time which we know does not work.
2
5
1,969
Replying to @jake_wx
Lot of snow on the ptype radar to only drop .3â€ðŸ˜­ðŸ˜­
3
353