Oyun dünyasının dev platformu Steam, düzenli olarak gerçekleştirdiği tematik indirim festivalleriyle oyuncuların yüzünü güldürmeye devam ediyor. Bu kez sahne, aksiyon ve nişancı tutkunlarının gözdesi olan 'Üçüncü Şahıs Nişancı Festivali' veya kısa adıyla Steam TPS Fest'e bırakıldı. Bir hafta sürecek olan bu festival, üçüncü şahıs bakış açısıyla oynanan yüzlerce nişancı oyununu cazip indirimlerle oyunseverlerin beğenisine sunuyor. Ancak festivalin en çok merak edilen yönlerinden biri, son dönemin adından sıkça söz ettiren popüler oyunu Helldivers 2'nin indirim listesinde yer almaması oldu.
Geniş Bir Yelpaze: Festivaldeki Oyun Türleri ve Steam'in Esnek Tanımları
Steam TPS Fest, her ne kadar 'üçüncü şahıs nişancı' odağıyla gelse de, festival sayfasını incelediğimizde platformun tür tanımlarında oldukça geniş davrandığını görüyoruz. Sadece saf nişancı oyunları değil, aynı zamanda nişancı mekaniklerini içeren birçok farklı türden yapım da indirimde yer alıyor.
Oyun dünyasında tür tanımlarının esnekliği ve oyuncu algısı, geliştiricilerin yenilikçi yaklaşımlarıyla sıkça kesişiyor. Konami'nin merakla beklenen oyunu Silent Hill f, bu dinamiklere çarpıcı bir örnek sunuyor. Yoğun dövüş mekanikleri, dayanıklılık çubuğu ve zamanlamalı kaçınma gibi unsurlar barındırması nedeniyle oyunun bir "Soulslike" olarak etiketlenmesi gündeme gelse de, geliştiriciler bu algıya karşı çıkarak açıklamalarda bulundu. Oyunun yönetmeni Motoi Okamoto, bu tür mekaniklerin aslında aksiyon-korku oyunlarının ve hatta Silent Hill serisinin kendi geçmişinin bir parçası olduğunu vurguladı. Okamoto'ya göre, modern oyuncuların belirli mekanikler gördüğünde hemen bir "Soulslike" etiketi yapıştırma eğilimi yanıltıcı olabilir; zira Silent Hill f, serinin özüne sadık kalırken daha aksiyon odaklı bir deneyim sunmayı hedefliyor. Bu durum, Silent Hill f geliştiricilerinin de belirttiği gibi, hem serinin köklü hayranlarını hem de aksiyon arayan yeni nesil oyuncuları memnun etme çabasının bir yansıması. Oyun dünyasının sürekli evrildiği bu ortamda, tür tanımlarının ne denli akışkan olabileceğini gösteren bu örnek, Steam'in festivaldeki geniş tür yaklaşımıyla da paralellik gösteriyor.
İşte festivaldeki oyun türlerine göre yaklaşık dağılım:
Oyun Türü |
Oyun Sayısı |
{
const isExpanded = menuButton.getAttribute('aria-expanded') === 'true';
menuButton.setAttribute('aria-expanded', !isExpanded);
mobileMenu.classList.toggle('hidden');
});
}
const searchInput = document.getElementById('search-input');
const searchResults = document.getElementById('search-results');
if (searchInput) {
searchInput.addEventListener('input', function() {
const query = this.value.trim();
if (query.length < 2) {
searchResults.innerHTML = '';
searchResults.classList.add('hidden');
return;
}
fetch(`/AI_API/arama_api.php?q=${encodeURIComponent(query)}`)
.then(response => response.json())
.then(data => {
if (data.length > 0) {
let resultsHtml = '';
data.forEach(item => {
resultsHtml += `
-
${item.title}
`;
});
resultsHtml += ' ';
searchResults.innerHTML = resultsHtml;
searchResults.classList.remove('hidden');
} else {
searchResults.innerHTML = 'Sonuç bulunamadı. ';
searchResults.classList.remove('hidden');
}
})
.catch(error => {
console.error('Arama hatası:', error);
searchResults.innerHTML = 'Arama sırasında bir hata oluştu. ';
searchResults.classList.remove('hidden');
});
});
document.addEventListener('click', function(event) {
if (!searchInput.contains(event.target) && !searchResults.contains(event.target)) {
searchResults.classList.add('hidden');
}
});
}
const subscribeFormFooter = document.getElementById('subscribe-form-footer');
if (subscribeFormFooter) {
console.log('Footer abonelik formu bulundu.');
subscribeFormFooter.addEventListener('submit', function(event) {
event.preventDefault();
console.log('Footer formu gönderildi.');
const emailInput = document.getElementById('email-address-footer');
const message = document.getElementById('subscribe-message-footer');
const email = emailInput.value;
message.textContent = 'Abone olunuyor...';
message.classList.remove('text-red-500', 'text-green-500');
fetch('/AI_API/subscribe.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ email: email })
})
.then(response => {
console.log('Sunucudan yanıt alındı:', response);
return response.json();
})
.then(data => {
console.log('Sunucu verisi (JSON):', data);
message.textContent = data.message;
if (data.success) {
message.classList.add('text-green-500');
emailInput.value = '';
} else {
message.classList.add('text-red-500');
}
})
.catch(error => {
console.error('Abonelik fetch hatası:', error);
message.textContent = 'İstek sırasında bir hata oluştu. Konsolu kontrol edin.';
message.classList.add('text-red-500');
});
});
} else {
console.error('Footer abonelik formu (subscribe-form-footer) bulunamadı!');
}
const subscribeButtonHeader = document.getElementById('subscribe-button-header');
if (subscribeButtonHeader) {
console.log('Header abone ol butonu bulundu.');
subscribeButtonHeader.addEventListener('click', () => {
console.log('Header abone ol butonuna tıklandı.');
const footerForm = document.getElementById('subscribe-form-footer');
if (footerForm) {
footerForm.scrollIntoView({ behavior: 'smooth' });
document.getElementById('email-address-footer').focus();
} else {
console.error('Header butonu tıklama hatası: Footer formu bulunamadı.');
}
});
} else {
console.error('Header abone ol butonu (subscribe-button-header) bulunamadı!');
}
const contactForm = document.getElementById('contact-form');
if (contactForm) {
console.log('İletişim formu bulundu.');
contactForm.addEventListener('submit', function(event) {
event.preventDefault();
console.log('İletişim formu gönderildi.');
const messageContainer = document.getElementById('contact-message');
const submitButton = contactForm.querySelector('button[type="submit"]');
const formData = new FormData(contactForm);
const data = Object.fromEntries(formData.entries());
messageContainer.textContent = 'Gönderiliyor...';
messageContainer.className = 'mt-4 text-sm text-center text-gray-600';
submitButton.disabled = true;
fetch('/AI_API/contact.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then(response => response.json())
.then(result => {
console.log('İletişim formu sunucu yanıtı:', result);
messageContainer.textContent = result.message;
if (result.success) {
messageContainer.classList.add('text-green-600');
contactForm.reset();
} else {
messageContainer.classList.add('text-red-600');
}
})
.catch(error => {
console.error('İletişim formu fetch hatası:', error);
messageContainer.textContent = 'Bir hata oluştu. Lütfen tekrar deneyin.';
messageContainer.classList.add('text-red-600');
})
.finally(() => {
submitButton.disabled = false;
});
});
} else {
// Bu bir hata değil, sadece iletişim sayfasında olmadığımızı gösterir.
// console.log('İletişim formu bu sayfada bulunmuyor.');
}
|