Shrani spremembe - 2026-02-02: Čiščenje kode, Electron build setup, GrassScene popravki

This commit is contained in:
2026-02-02 08:44:51 +01:00
parent 6b134fe0b8
commit e0be842c85
7 changed files with 252779 additions and 114 deletions

5
nova farma TRAE/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
node_modules/
dist/
.DS_Store
*.dmg
*.vsix

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
const { app, BrowserWindow } = require('electron');
const path = require('path');
function createWindow() {
const win = new BrowserWindow({
width: 1280,
height: 720,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
webSecurity: false, // DISABLE SECURITY to allow local file loading
// preload: path.join(__dirname, 'preload.js') // Optional
},
icon: path.join(__dirname, 'assets/DEMO_FAZA1/Characters/gronk_walk_sheet.png')
});
win.loadFile('index.html');
// Uncomment to open DevTools by default
win.webContents.openDevTools();
}
app.whenReady().then(() => {
createWindow();
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});

View File

@@ -20,9 +20,9 @@
<body>
<!-- Phaser Library -->
<script src="node_modules/phaser/dist/phaser.js"></script>
<script src="./assets/lib/phaser.js"></script>
<!-- Game Entry -->
<script type="module" src="src/game.js"></script>
<script type="module" src="./src/game.js"></script>
</body>
</html>

4421
nova farma TRAE/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -2,17 +2,48 @@
"name": "nova-farma-trae",
"version": "3.1.0",
"description": "Mrtva Dolina (Death Valley) - 2.5D Isometric Survival Game (Web Version)",
"main": "electron-main.cjs",
"author": "Mrtva Dolina Team",
"license": "MIT",
"scripts": {
"start": "npx http-server . -c-1",
"electron:start": "electron .",
"electron:build": "electron-builder",
"test": "echo \"Error: no test specified\" && exit 1"
},
"type": "module",
"build": {
"appId": "com.novafarma.game",
"productName": "Nova Farma",
"directories": {
"output": "dist"
},
"files": [
"**/*",
"!dist/**/*",
"!node_modules/**/*",
"node_modules/phaser/**/*"
],
"mac": {
"category": "public.app-category.games",
"target": ["dmg", "zip"],
"icon": "assets/DEMO_FAZA1/Characters/gronk_walk_sheet.png"
},
"win": {
"target": "nsis",
"icon": "assets/DEMO_FAZA1/Characters/gronk_walk_sheet.png"
},
"linux": {
"target": "AppImage",
"icon": "assets/DEMO_FAZA1/Characters/gronk_walk_sheet.png"
}
},
"dependencies": {
"phaser": "^3.80.0"
},
"devDependencies": {
"electron": "^28.0.0",
"electron-builder": "^24.9.1",
"http-server": "^14.1.1"
}
}

View File

@@ -23,7 +23,7 @@ export default class GrassSceneClean extends Phaser.Scene {
this.load.image('hay', 'DEMO_FAZA1/Items/hay_drop_0.png');
this.load.image('trnje', 'DEMO_FAZA1/Obstacles/trnje.png');
this.load.image('toxic_fog', 'DEMO_FAZA1/VFX/toxic_fog.png');
this.load.image('amnesia_fog', 'DEMO_FAZA1/VFX/megla_ozadje.png');
// this.load.image('amnesia_fog', 'DEMO_FAZA1/VFX/megla_ozadje.png'); // MISSING ASSET
// Generated Assets (Slices)
// Trees
@@ -32,7 +32,7 @@ export default class GrassSceneClean extends Phaser.Scene {
// Environment (Dead Nature, Fence, Water)
for (let i = 0; i <= 8; i++) this.load.image(`dead_nature_${i}`, `DEMO_FAZA1/Environment/dead_nature_${i}.png`);
for (let i = 0; i <= 2; i++) this.load.image(`fence_sign_${i}`, `DEMO_FAZA1/Environment/fence_sign_${i}.png`);
for (let i = 0; i < 16; i++) this.load.image(`water_tile_${i}`, `DEMO_FAZA1/Environment/water_tile_${i}.png`);
// for (let i = 0; i < 16; i++) this.load.image(`water_tile_${i}`, `DEMO_FAZA1/Environment/water_tile_${i}.png`); // MISSING ASSETS
// Misc Env
this.load.image('sotor', 'DEMO_FAZA1/Environment/sotor.png');
@@ -44,9 +44,9 @@ export default class GrassSceneClean extends Phaser.Scene {
veg.forEach(k => this.load.image(k, `DEMO_FAZA1/Vegetation/${k}.png`));
// Ground (Path)
for (let i = 0; i < 16; i++) {
this.load.image(`path_tile_${i}`, `DEMO_FAZA1/Ground/path_tile_${i}.png`);
}
// for (let i = 0; i < 16; i++) {
// this.load.image(`path_tile_${i}`, `DEMO_FAZA1/Ground/path_tile_${i}.png`);
// }
// REPLACED STATIC KAI WITH SPRITE SHEET
// Frame size 256x256 based on 1024x1024 sheet
this.load.spritesheet('kai', 'DEMO_FAZA1/Characters/kai_walk_sheet.png', {
@@ -159,45 +159,8 @@ export default class GrassSceneClean extends Phaser.Scene {
this.physics.add.existing(this.hole, true); // Static body for trigger
// --- REALISTIC TREE (Next to Pond) ---
// Ribnik je na: WORLD_W / 2 + 400, WORLD_H / 2 + 200
// Drevo postavimo levo zgoraj od ribnika
const treeX = WORLD_W / 2 + 300;
const treeY = WORLD_H / 2 + 150;
// REMOVED PER USER REQUEST
// 1. Senca (Shadow) - Rahla temna elipsa za globino
const shadow = this.add.ellipse(treeX, treeY + 10, 140, 60, 0x000000);
shadow.setAlpha(0.3);
shadow.setDepth(treeY - 1); // Malo pod drevesom
// 2. Drevo (Tree) - Z 'clipping' efektom
const tree = this.add.image(treeX, treeY, 'tree_adult_0');
// Nastavimo origin na (0.5, 0.9) namesto (0.5, 1.0).
// To pomeni, da bo spodnjih 10% slike "pod" točko (x,y).
// S tem ustvarimo efekt, da deblo "potone" v tla.
tree.setOrigin(0.5, 0.9);
tree.setDepth(treeY); // Y-sort na točki stika
this.physics.add.existing(tree, true); // Collider
// Manjši collider za deblo
tree.body.setSize(60, 40);
tree.body.setOffset(tree.width/2 - 30, tree.height * 0.9 - 20);
// 3. Trava okoli debla (Grass Masking / Feathering)
// Postavimo par šopov trave točno na stik debla in tal, da skrijemo rob.
for(let i=0; i<8; i++) {
let angle = Math.random() * Math.PI * 2;
let dist = Math.random() * 30; // Blizu debla
let gx = treeX + Math.cos(angle) * dist;
let gy = treeY + Math.sin(angle) * 10; // Sploščeno po Y osi (izometrično)
let grassKey = Math.random() > 0.5 ? 'grass_wild' : 'grass_wild_v2';
let grass = this.add.image(gx, gy, grassKey);
grass.setScale(0.3 + Math.random() * 0.3); // Manjši šopi
grass.setDepth(treeY + 2); // Malo NAD drevesom, da prekrijejo spodnji rob debla!
grass.setOrigin(0.5, 1.0);
grass.setTint(0xcccccc); // Rahlo temnejša trava (v senci drevesa)
grass.setAlpha(0.9);
}
/*
// Center the whole construction
@@ -254,13 +217,13 @@ export default class GrassSceneClean extends Phaser.Scene {
// --- INTRO SEQUENCE STATE ---
this.introStarted = false;
const GRASS_COUNT = 0; // Disabled per user request
const GRASS_COUNT = 2000; // Restored per user request
const SPREAD = 4000; // 4000px radius okoli centra
// Parametri za izločanje trave (Pond & Hole)
const pondX = WORLD_W / 2 + 400;
const pondY = WORLD_H / 2 + 200;
const pondRadius = 150; // Approx radius of pond
const pondRadius = 600; // POVEČANO: Da odstranimo travo tudi okoli ribnika (Clearance)
const holeX = WORLD_W / 2;
const holeY = WORLD_H / 2;
@@ -306,6 +269,26 @@ export default class GrassSceneClean extends Phaser.Scene {
}
}
// --- TREE PLANTATION (Initial Phase) ---
const TREE_COUNT = 50;
for (let i = 0; i < TREE_COUNT; i++) {
let x = (WORLD_W / 2) + (Math.random() * SPREAD * 2 - SPREAD);
let y = (WORLD_H / 2) + (Math.random() * SPREAD * 2 - SPREAD);
// Avoid Pond
if (Phaser.Math.Distance.Between(x, y, pondX, pondY) < pondRadius) continue;
// Avoid Hole
if (Phaser.Math.Distance.Between(x, y, holeX, holeY) < holeRadius + 50) continue;
let tree = this.physics.add.image(x, y, 'drevo_faza_1');
tree.setOrigin(0.5, 0.95); // Base of trunk
tree.setDepth(y);
tree.setScale(0.8 + Math.random() * 0.4);
tree.body.setImmovable(true);
tree.body.setSize(40, 30);
tree.body.setOffset(tree.width/2 - 20, tree.height - 40);
}
// --- INTRO LISTENER ---
// Klik na podlago sproži rast trave in čiščenje amnezije
this.input.on('pointerdown', () => {
@@ -823,67 +806,7 @@ export default class GrassSceneClean extends Phaser.Scene {
}
// --- AUTO-TILING SYSTEM (REMOVED) ---
/*
getWaterBitmask(x, y) {
// Check 4 neighbors: Top (1), Right (2), Bottom (4), Left (8)
// Grid size is 128 (SNAP)
const SNAP = 128;
let mask = 0;
// Helper to check if a tile at (tx, ty) is water
const isWater = (tx, ty) => {
// Check existing tiles in editorGroup
// This is O(N), for optimization use a Map in production
let found = this.editorGroup.getChildren().find(c =>
Math.abs(c.x - tx) < 10 && Math.abs(c.y - ty) < 10 &&
c.texture.key.startsWith('water_tile_')
);
return !!found;
};
if (isWater(x, y - SNAP)) mask += 1; // Top
if (isWater(x + SNAP, y)) mask += 2; // Right
if (isWater(x, y + SNAP)) mask += 4; // Bottom
if (isWater(x - SNAP, y)) mask += 8; // Left
return mask;
}
updateAutotile(x, y) {
const SNAP = 128;
// 1. Find the tile at x,y
let tile = this.editorGroup.getChildren().find(c =>
Math.abs(c.x - x) < 10 && Math.abs(c.y - y) < 10
);
if (!tile || !tile.texture.key.startsWith('water_tile_')) return;
// 2. Calculate new mask
let mask = this.getWaterBitmask(x, y);
tile.setTexture(`water_tile_${mask}`);
// 3. Update neighbors
const neighbors = [
{ dx: 0, dy: -SNAP }, // Top
{ dx: SNAP, dy: 0 }, // Right
{ dx: 0, dy: SNAP }, // Bottom
{ dx: -SNAP, dy: 0 } // Left
];
neighbors.forEach(n => {
let nx = x + n.dx;
let ny = y + n.dy;
let neighbor = this.editorGroup.getChildren().find(c =>
Math.abs(c.x - nx) < 10 && Math.abs(c.y - ny) < 10
);
if (neighbor && neighbor.texture.key.startsWith('water_tile_')) {
let nMask = this.getWaterBitmask(nx, ny);
neighbor.setTexture(`water_tile_${nMask}`);
}
});
}
*/
/* Removed for cleanup */
update(time, delta) {
// --- PARALLAX & SCROLLING ---
@@ -894,11 +817,7 @@ export default class GrassSceneClean extends Phaser.Scene {
}
// 2. River Flow Animation (REMOVED)
/*
if (this.river) {
this.river.tilePositionX += 2.0; // Flow to the left (texture moves right)
}
*/
/* Removed for cleanup */
// --- PLAYER MOVEMENT ---
const speed = 250;