246 lines
7.6 KiB
JavaScript
246 lines
7.6 KiB
JavaScript
// ========================================================
|
|
// KONSTANTE IN IGRALČEVI PODATKI
|
|
// ========================================================
|
|
const XP_REQUIRED_BASE = 100; // Osnovni XP, potrebni za LVL 2
|
|
const XP_GROWTH_FACTOR = 1.5; // Za vsak LVL potrebujete 1.5x več XP
|
|
|
|
class StatsSystem {
|
|
constructor(scene) {
|
|
this.scene = scene;
|
|
|
|
// Leveling System
|
|
this.currentLevel = 1;
|
|
this.currentXP = 0;
|
|
this.xpToNextLevel = XP_REQUIRED_BASE;
|
|
this.score = 0; // GLOBAL SCORE (Za Legacy)
|
|
this.totalPlaytime = 0; // Skupni čas igranja (sekunde)
|
|
|
|
// Stats
|
|
this.health = 100;
|
|
this.maxHealth = 100;
|
|
|
|
this.hunger = 100; // 100 = full
|
|
this.maxHunger = 100;
|
|
|
|
this.thirst = 100; // 100 = not thirsty
|
|
this.maxThirst = 100;
|
|
|
|
// Decay rates (per second)
|
|
this.hungerDecay = 0.5; // Pade na 0 v 200s (cca 3 min)
|
|
this.thirstDecay = 0.8; // Pade na 0 v 125s (cca 2 min)
|
|
|
|
this.damageTickTimer = 0;
|
|
|
|
// Friendship System (Hearts ❤️)
|
|
this.friendship = {
|
|
merchant: 0,
|
|
zombie: 0,
|
|
villager: 0
|
|
};
|
|
}
|
|
|
|
update(delta) {
|
|
const seconds = delta / 1000;
|
|
this.totalPlaytime += seconds; // Track playtime
|
|
|
|
// Decay
|
|
if (this.hunger > 0) {
|
|
this.hunger -= this.hungerDecay * seconds;
|
|
}
|
|
if (this.thirst > 0) {
|
|
this.thirst -= this.thirstDecay * seconds;
|
|
}
|
|
|
|
// Clamp values
|
|
this.hunger = Math.max(0, this.hunger);
|
|
this.thirst = Math.max(0, this.thirst);
|
|
|
|
// Starvation / Dehydration logic
|
|
if (this.hunger <= 0 || this.thirst <= 0) {
|
|
this.damageTickTimer += delta;
|
|
if (this.damageTickTimer >= 1000) { // Vsako sekundo damage
|
|
this.damageTickTimer = 0;
|
|
this.takeDamage(5); // 5 DMG na sekundo če si lačen/žejen
|
|
|
|
// Shake camera effect za opozorilo
|
|
this.scene.cameras.main.shake(100, 0.005);
|
|
}
|
|
} else {
|
|
this.damageTickTimer = 0;
|
|
|
|
// Natural regeneration if full
|
|
if (this.hunger > 80 && this.thirst > 80 && this.health < this.maxHealth) {
|
|
this.health += 1 * seconds;
|
|
}
|
|
}
|
|
|
|
this.health = Math.min(this.health, this.maxHealth);
|
|
|
|
this.updateUI();
|
|
}
|
|
|
|
takeDamage(amount) {
|
|
this.health -= amount;
|
|
if (this.health <= 0) {
|
|
this.health = 0;
|
|
this.die();
|
|
}
|
|
}
|
|
|
|
eat(amount) {
|
|
this.hunger += amount;
|
|
this.hunger = Math.min(this.hunger, this.maxHunger);
|
|
}
|
|
|
|
drink(amount) {
|
|
this.thirst += amount;
|
|
this.thirst = Math.min(this.thirst, this.maxThirst);
|
|
}
|
|
|
|
// SCORE & DEATH LOGIC
|
|
addScore(points) {
|
|
this.score += points;
|
|
// console.log(`⭐ Score +${points} (Total: ${this.score})`);
|
|
}
|
|
|
|
die() {
|
|
console.log('💀 Player died!');
|
|
|
|
// SCORE PENALTY (Legacy Cost)
|
|
// Igralec NE izgubi farme, ampak izgubi del Dediščine (Točk).
|
|
const penalty = Math.floor(this.score * 0.25); // Izguba 25% točk
|
|
this.score = Math.max(0, this.score - penalty);
|
|
console.log(`📉 Dediščina Oškodovana: -${penalty} Točk (Novo stanje: ${this.score})`);
|
|
|
|
// Trigger Player Animation
|
|
if (this.scene.player) {
|
|
this.scene.player.dieAnimation();
|
|
}
|
|
|
|
// Show Notification & Overlay in UI Scene
|
|
const uiScene = this.scene.scene.get('UIScene');
|
|
if (uiScene) {
|
|
// Full screen overlay using scale dimensions
|
|
const width = uiScene.scale.width;
|
|
const height = uiScene.scale.height;
|
|
|
|
const bg = uiScene.add.rectangle(width / 2, height / 2, width, height, 0x000000, 0.8);
|
|
|
|
const txt = uiScene.add.text(width / 2, height / 2 - 50, 'YOU DIED', {
|
|
fontSize: '64px', color: '#ff0000', fontStyle: 'bold'
|
|
}).setOrigin(0.5);
|
|
|
|
const sub = uiScene.add.text(width / 2, height / 2 + 20, `Legacy Lost: -${penalty} Score pts`, {
|
|
fontSize: '24px', color: '#ffffff'
|
|
}).setOrigin(0.5);
|
|
|
|
const sub2 = uiScene.add.text(width / 2, height / 2 + 60, '(Farm Preserved)', {
|
|
fontSize: '18px', color: '#aaaaaa', fontStyle: 'italic'
|
|
}).setOrigin(0.5);
|
|
|
|
// Wait and Respawn
|
|
uiScene.time.delayedCall(3000, () => {
|
|
if (bg) bg.destroy();
|
|
if (txt) txt.destroy();
|
|
if (sub) sub.destroy();
|
|
if (sub2) sub2.destroy();
|
|
|
|
// Reset Stats (but keep Score penalty)
|
|
this.health = 100;
|
|
this.hunger = 100;
|
|
this.thirst = 100;
|
|
this.updateUI();
|
|
|
|
// Reset Player
|
|
if (this.scene.player) {
|
|
this.scene.player.respawn();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
updateUI() {
|
|
const uiScene = this.scene.scene.get('UIScene');
|
|
if (uiScene) {
|
|
if (uiScene.healthBar) uiScene.setBarValue(uiScene.healthBar, this.health);
|
|
if (uiScene.hungerBar) uiScene.setBarValue(uiScene.hungerBar, this.hunger);
|
|
if (uiScene.thirstBar) uiScene.setBarValue(uiScene.thirstBar, this.thirst);
|
|
}
|
|
this.updateLevelUI();
|
|
}
|
|
|
|
updateLevelUI() {
|
|
const xpPercent = (this.currentXP / this.xpToNextLevel) * 100;
|
|
const levelText = `LV: ${this.currentLevel}`;
|
|
|
|
// Uporaba Antigravity Engine UI klicev, kot zahtevano
|
|
if (window.Antigravity && window.Antigravity.UI) {
|
|
window.Antigravity.UI.setText(this.scene, 'LevelDisplay', levelText);
|
|
window.Antigravity.UI.setBarValue(this.scene, 'XPBar', xpPercent);
|
|
}
|
|
}
|
|
|
|
// Friendship System
|
|
addFriendship(npcType, amount) {
|
|
if (this.friendship[npcType] !== undefined) {
|
|
this.friendship[npcType] += amount;
|
|
console.log(`❤️ +${amount} Friendship with ${npcType} (Total: ${this.friendship[npcType]})`);
|
|
}
|
|
}
|
|
|
|
getFriendship(npcType) {
|
|
return this.friendship[npcType] || 0;
|
|
}
|
|
|
|
setFriendship(npcType, amount) {
|
|
if (this.friendship[npcType] !== undefined) {
|
|
this.friendship[npcType] = amount;
|
|
}
|
|
}
|
|
|
|
// ========================================================
|
|
// LEVELING SYSTEM
|
|
// ========================================================
|
|
|
|
addXP(amount) {
|
|
this.currentXP += amount;
|
|
|
|
// 1. Preverimo, ali je igralec pripravljen za Level Up
|
|
while (this.currentXP >= this.xpToNextLevel) {
|
|
this.levelUp();
|
|
}
|
|
|
|
this.updateUI();
|
|
}
|
|
|
|
levelUp() {
|
|
// Povečamo Level
|
|
this.currentLevel++;
|
|
|
|
// Izračunamo nov XP prag
|
|
this.xpToNextLevel = Math.floor(this.xpToNextLevel * XP_GROWTH_FACTOR);
|
|
|
|
// Preostanek XP prenesemo v nov Level
|
|
this.currentXP = this.currentXP - (this.xpToNextLevel / XP_GROWTH_FACTOR);
|
|
|
|
// Bonus Stats
|
|
this.maxHealth += 10;
|
|
this.health = this.maxHealth;
|
|
this.maxHunger += 5;
|
|
this.maxThirst += 5;
|
|
this.hunger = this.maxHunger;
|
|
this.thirst = this.maxThirst;
|
|
|
|
// Vizualni učinek / Prikaz sporočila
|
|
console.log(`🎉 LEVEL UP! Dosežen level ${this.currentLevel}!`);
|
|
|
|
if (window.Antigravity && window.Antigravity.UI) {
|
|
window.Antigravity.UI.showMessage(
|
|
this.scene,
|
|
`LEVEL UP! Dosežen level ${this.currentLevel}!`,
|
|
'#FFD700'
|
|
);
|
|
}
|
|
}
|
|
}
|