ANXIPUNK
/// SİSTEM UYARISI: NÖRAL BAĞLANTI KARARSIZ /// HAVA DURUMU: ASİT YAĞMURU OLASILIĞI %98 (SEKTÖR 7) /// SON ÖDÜL AV: "THE GLITCH" - ÖDÜL 5000 KREDİ /// ARŞİVDE YENİ LORE GİRDİLERİ TESPİT EDİLDİ /// GÜNLÜK KRONİK EKLENDİ ///
SON YAYIN

Silikon Ruhun Çatlakları

Eva'nın kulaklarında çınlayan bu sesi susturamıyordu. Y-Sendika'nın Hücre-34 iletim kulesinin etrafındaki statik gürültü, beyaz gürültüyü bastırmak için programladığı kulaklığın devrelerini aşıyordu. Testere dişli frekanslar kemiklerini titreştiriyordu. Sağ işaret parmağıyla sol dirseğ...

HİKAYEYİ OKU
172 ARŞİVLENEN HİKAYE
905 AKTİF DÜĞÜMLER

HIGH TECH.
LOW LIFE.

Cyberpunk nedir? Sadece neon ışıklar ve robot kollar değildir. Çöküşün eşiğindeki bir toplumda, teknolojinin insanlığı nasıl hem yükselttiğini hem de hiç ettiği anlatır.

Devasa şirketlerin devletlerin yerini aldığı, verinin petrolden değerli olduğu ve insan bedeninin sadece bir "donanım" (meatbag) olarak görüldüğü distopik bir gelecektir. Anxipunk, bu evrenin İstanbul (Neo-Pera) simülasyonudur.

> MANIFESTO_OKU

/// THE PIONEERS

WILLIAM GIBSON

Neuromancer (1984). "Siberuzay" kelimesinin mucidi. Matrix'in babası.

BLADE RUNNER

Ridley Scott (1982). Philip K. Dick'in eserinden uyarlama. Görsel estetiği belirledi.

GHOST IN THE SHELL

Masamune Shirow (1989). İnsan ve makine arasındaki o ince çizgi.

CYBERPUNK 2077

CD Projekt Red. Türü modern kitlelere tanıtan açık dünya RPG şaheseri.

/// NÖRAL_SANAT_GALERİSİ TÜMÜNÜ_GÖR >>

DİRENİŞE KATIL

Neo-Pera güncellemeleri, gizli lore belgeleri ve sistem uyarıları doğrudan nöral arayüzünüze iletilir.

/// YARININ KRONİĞİ

Şehrin kaderine karar ver. Yarının manşetini oyla.

AĞA BAĞLANILIYOR...
document.addEventListener('DOMContentLoaded', () => { const pollContainer = document.getElementById('pollOptions'); const loading = document.getElementById('loadingPoll'); let pollId = null; // Fetch Active Poll fetch('/poll/active') .then(res => res.json()) .then(data => { loading.classList.add('hidden'); pollContainer.classList.remove('hidden'); pollId = data.id; renderOptions(data.options); }) .catch(err => { loading.innerText = 'CONNECTION ERROR: ' + err.message; loading.classList.remove('animate-pulse'); loading.classList.add('text-red-500'); }); function renderOptions(options) { pollContainer.innerHTML = ''; const totalVotes = options.reduce((sum, opt) => sum + parseInt(opt.votes), 0) || 1; // Avoid div by zero options.forEach(opt => { const percent = Math.round((opt.votes / totalVotes) * 100); const btn = document.createElement('div'); btn.className = 'bg-gray-900 border border-gray-700 p-4 rounded hover:border-neon-purple transition cursor-pointer relative overflow-hidden group'; btn.onclick = () => vote(opt.id); btn.innerHTML = `
${opt.text} ${opt.votes}
`; pollContainer.appendChild(btn); }); } function vote(optionId) { fetch('/poll/vote', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': 'deHSrvWFtQVJLpJf30bYmRM7oZ92S6KhvMUzaFI4' }, body: JSON.stringify({ poll_id: pollId, option_id: optionId }) }) .then(res => res.json()) .then(data => { if(data.error) { alert('ACCESS DENIED: ' + data.error); } else { renderOptions(data.options); } }); } }); // === INTERACTIVE TERMINAL === (function() { const input = document.getElementById('terminal-input'); const output = document.getElementById('terminal-output'); if(!input || !output) return; const commands = { help: '> commands: help, status, whoami, hack, matrix, clear', status: '> system: ONLINE | threat_level: ELEVATED | users: ' + Math.floor(Math.random() * 50 + 10), whoami: '> guest@neo-pera.net | access_level: RESTRICTED', hack: '> [ACCESS DENIED] :: nice try, netrunner. 🔒', matrix: '> initiating_matrix_mode...', clear: 'CLEAR' }; input.addEventListener('keydown', (e) => { if(e.key === 'Enter') { const cmd = input.value.toLowerCase().trim(); input.value = ''; if(cmd === 'clear') { output.innerHTML = '
> terminal_cleared
'; return; } const response = commands[cmd] || `> [ERR] unknown_command: "${cmd}"`; const line = document.createElement('div'); line.className = 'terminal-line'; line.innerHTML = `> ${cmd}
${response}`; output.appendChild(line); output.scrollTop = output.scrollHeight; // Easter egg: matrix command triggers visual effect if(cmd === 'matrix') { document.body.classList.add('matrix-mode'); setTimeout(() => document.body.classList.remove('matrix-mode'), 3000); } } }); })(); // === DECRYPT CHALLENGE GAME === (function() { const challenges = [ { cipher: 'QFSBQFSB', answer: 'NEOPERA', hint: 'shift+1' }, { cipher: '01000001 01001001', answer: 'AI', hint: 'binary' }, { cipher: '4E 45 4F', answer: 'NEO', hint: 'hex' }, { cipher: 'KHOOR', answer: 'HELLO', hint: 'caesar-3' }, { cipher: '.-. . ... .. ... -', answer: 'RESIST', hint: 'morse' } ]; const challenge = challenges[Math.floor(Math.random() * challenges.length)]; const cipherEl = document.getElementById('cipher-text'); const inputEl = document.getElementById('decrypt-input'); const resultEl = document.getElementById('decrypt-result'); if(!cipherEl || !inputEl) return; cipherEl.textContent = challenge.cipher; cipherEl.title = `İpucu: ${challenge.hint}`; inputEl.addEventListener('input', () => { const guess = inputEl.value.toUpperCase().trim(); if(guess === challenge.answer) { resultEl.innerHTML = '✓ DECRYPTED! Welcome, netrunner.'; inputEl.classList.add('border-neon-green'); cipherEl.classList.add('text-neon-green'); } else if(guess.length >= challenge.answer.length) { resultEl.innerHTML = '✗ Invalid key'; } else { resultEl.innerHTML = ''; } }); cipherEl.addEventListener('click', () => { cipherEl.classList.add('animate-pulse'); setTimeout(() => cipherEl.classList.remove('animate-pulse'), 500); }); })(); // === LIVE STATS SIMULATION === (function() { const connEl = document.getElementById('live-connections'); const readsEl = document.getElementById('live-reads'); const commentEl = document.getElementById('live-comment'); if(!connEl) return; const comments = ['harika!', 'matrix vibes', 'daha fazla', 'woow', 'cyberpunk <3', 'aksiyon!']; function updateStats() { connEl.textContent = Math.floor(Math.random() * 30 + 5); readsEl.textContent = Math.floor(Math.random() * 200 + 50); commentEl.textContent = comments[Math.floor(Math.random() * comments.length)]; } updateStats(); setInterval(updateStats, 5000); })(); // === GLOBAL LIKE FUNCTION === window.toggleLike = function(btn, storyId) { // Prevent default if mapped if(!btn) return; // Visual Feedback Immediate const countSpan = btn.querySelector('.count'); const icon = btn.querySelector('svg'); const originalColor = btn.classList.contains('text-neon-pink') ? 'text-neon-pink' : 'text-gray-500'; // Optimistic UI update // We don't know if we are adding or removing without state, but let's try to infer or just wait? // Let's just animate spinner or pulse icon.classList.add('animate-ping'); fetch(`/story/${storyId}/react`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': 'deHSrvWFtQVJLpJf30bYmRM7oZ92S6KhvMUzaFI4' }, body: JSON.stringify({ type: 'link' }) // Default to 'link' (Resonance/Heart) }) .then(res => res.json()) .then(data => { icon.classList.remove('animate-ping'); if(data.status === 'success') { // Update Count (Aggregate sum of all, or just this type? Controller returns broken down array) // Let's assume we want total interactions or specific? // The controller returns { reaction_type: count, ... } // Use total of 'link' type const newCount = data.counts['link'] || 0; countSpan.innerText = newCount; if(data.action === 'added') { btn.classList.remove('text-gray-500'); btn.classList.add('text-neon-pink'); } else { btn.classList.remove('text-neon-pink'); btn.classList.add('text-gray-500'); } } }) .catch(err => { console.error(err); icon.classList.remove('animate-ping'); }); };