Update: Editor removal, Zoom fix, Cellar entrance, Pond restore
This commit is contained in:
BIN
nova farma TRAE/.DS_Store
vendored
BIN
nova farma TRAE/.DS_Store
vendored
Binary file not shown.
@@ -1,5 +1,18 @@
|
|||||||
# Razvojni Dnevnik (Dev Log) - Nova Farma
|
# Razvojni Dnevnik (Dev Log) - Nova Farma
|
||||||
|
|
||||||
|
## [2026-02-01 17:15] - Editor Removal & Cellar Update
|
||||||
|
### Spremenjeno / Dodano
|
||||||
|
* **Editor System Removed:**
|
||||||
|
* Na zahtevo uporabnika popolnoma odstranjen (zakomentiran) urejevalnik (Editor Mode), auto-tiling sistem in UI paleta.
|
||||||
|
* Odstranjena "E" bližnjica in preverjanje zooma nad menijem.
|
||||||
|
* **Visual Fixes:**
|
||||||
|
* **Pixel Perfect Zoom:** Vklopljen `pixelArt: true` v `game.js` in dodan `image-rendering: pixelated` v CSS za ohranitev ostrine pri zumiranju.
|
||||||
|
* Odstranjen "missing texture" placeholder (zelen kvadratek).
|
||||||
|
* **Map Features:**
|
||||||
|
* **Klet (Cellar):** Dodan vhod v klet (luknja) na začetni poziciji Kai-a. Vključuje dinamično generirano teksturo in physics trigger.
|
||||||
|
* **Ribnik:** Dodan statičen ribnik (`water_clean_patch.png`) na desni strani mape.
|
||||||
|
* **River Cleanup:** Odstranjena stara koda za rečni sistem.
|
||||||
|
|
||||||
## [2026-02-01 23:45] - Map Reset & Water System V2
|
## [2026-02-01 23:45] - Map Reset & Water System V2
|
||||||
### Spremenjeno / Dodano
|
### Spremenjeno / Dodano
|
||||||
* **Map Reset (Clean Slate):**
|
* **Map Reset (Clean Slate):**
|
||||||
|
|||||||
BIN
nova farma TRAE/assets/.DS_Store
vendored
BIN
nova farma TRAE/assets/.DS_Store
vendored
Binary file not shown.
BIN
nova farma TRAE/assets/DEMO_FAZA1/.DS_Store
vendored
BIN
nova farma TRAE/assets/DEMO_FAZA1/.DS_Store
vendored
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 252 KiB After Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 360 KiB After Width: | Height: | Size: 360 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 252 KiB |
BIN
nova farma TRAE/gimp-3.0.8-arm64-1.dmg
Normal file
BIN
nova farma TRAE/gimp-3.0.8-arm64-1.dmg
Normal file
Binary file not shown.
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
canvas {
|
canvas {
|
||||||
display: block;
|
display: block;
|
||||||
image-rendering: unique; /* or pixelated */
|
image-rendering: pixelated; /* Ensures pixel art remains sharp */
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
BIN
nova farma TRAE/ms-python.python-2026.0.0.vsix
Normal file
BIN
nova farma TRAE/ms-python.python-2026.0.0.vsix
Normal file
Binary file not shown.
@@ -14,6 +14,7 @@ const config = {
|
|||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_BOTH
|
autoCenter: Phaser.Scale.CENTER_BOTH
|
||||||
},
|
},
|
||||||
|
pixelArt: true, // Zagotovi ostrino pri zumiranju (pixel art style)
|
||||||
backgroundColor: '#1a1a1a', // Temno siva, da slika izstopa
|
backgroundColor: '#1a1a1a', // Temno siva, da slika izstopa
|
||||||
parent: 'body',
|
parent: 'body',
|
||||||
physics: {
|
physics: {
|
||||||
|
|||||||
@@ -7,11 +7,12 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
this.load.path = 'assets/';
|
this.load.path = 'assets/';
|
||||||
|
|
||||||
// --- ASSETS ---
|
// --- ASSETS ---
|
||||||
// 1. Podlaga (Foundation)
|
// 1. Podlaga (Foundation) - ZAMENJANO: Trava namesto blata
|
||||||
this.load.image('ground_base', 'DEMO_FAZA1/Ground/ground_dirt_patch.png');
|
this.load.image('ground_base', 'DEMO_FAZA1/tiles/trava_osnova.png');
|
||||||
|
|
||||||
// 2. Vodni kanali (Water)
|
// 2. Vodni kanali (Water)
|
||||||
this.load.image('river_tile_seamless', 'DEMO_FAZA1/Environment/river_tile_seamless.png');
|
this.load.image('water_clean_patch', 'DEMO_FAZA1/Environment/water_clean_patch.png');
|
||||||
|
// this.load.image('river_tile_seamless', 'DEMO_FAZA1/Environment/river_tile_seamless.png');
|
||||||
|
|
||||||
// 3. Foliage
|
// 3. Foliage
|
||||||
// "Divja trava" - samo visoka trava
|
// "Divja trava" - samo visoka trava
|
||||||
@@ -70,6 +71,15 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
}
|
}
|
||||||
|
|
||||||
create() {
|
create() {
|
||||||
|
// --- DYNAMIC ASSETS GENERATION ---
|
||||||
|
// Generate 'hole' texture if it doesn't exist
|
||||||
|
if (!this.textures.exists('hole')) {
|
||||||
|
const holeGfx = this.make.graphics({ x: 0, y: 0, add: false });
|
||||||
|
holeGfx.fillStyle(0x111111); // Almost black
|
||||||
|
holeGfx.fillCircle(64, 64, 60);
|
||||||
|
holeGfx.generateTexture('hole', 128, 128);
|
||||||
|
}
|
||||||
|
|
||||||
// --- WORLD CONFIGURATION ---
|
// --- WORLD CONFIGURATION ---
|
||||||
const TILE_SIZE = 128; // Standard grid size
|
const TILE_SIZE = 128; // Standard grid size
|
||||||
const MAP_WIDTH_TILES = 250;
|
const MAP_WIDTH_TILES = 250;
|
||||||
@@ -86,6 +96,7 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
|
|
||||||
this.input.on('wheel', (pointer, gameObjects, deltaX, deltaY, deltaZ) => {
|
this.input.on('wheel', (pointer, gameObjects, deltaX, deltaY, deltaZ) => {
|
||||||
// MACBOOK OPTIMIZATION: Prevent Zoom when hovering over Editor Sidebar
|
// MACBOOK OPTIMIZATION: Prevent Zoom when hovering over Editor Sidebar
|
||||||
|
/* REMOVED - Editor disabled
|
||||||
if (this.editorEnabled) {
|
if (this.editorEnabled) {
|
||||||
const SIDEBAR_W = 320;
|
const SIDEBAR_W = 320;
|
||||||
const PALETTE_X = this.scale.width - SIDEBAR_W;
|
const PALETTE_X = this.scale.width - SIDEBAR_W;
|
||||||
@@ -93,6 +104,7 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
return; // Stop processing zoom if over sidebar
|
return; // Stop processing zoom if over sidebar
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Zoom In/Out based on wheel delta
|
// Zoom In/Out based on wheel delta
|
||||||
// deltaY > 0 means scroll down (zoom out), deltaY < 0 means scroll up (zoom in)
|
// deltaY > 0 means scroll down (zoom out), deltaY < 0 means scroll up (zoom in)
|
||||||
@@ -104,85 +116,46 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// --- 1. PODLAGA (The Foundation) ---
|
// --- 1. PODLAGA (The Foundation) ---
|
||||||
// Preprosta rešitev: Rjava barva ozadja + tekstura čez
|
// ZAMENJANO: Zelena barva ozadja + trava tekstura
|
||||||
|
|
||||||
// 1. Nastavimo barvo ozadja na rjavo (barva zemlje)
|
// 1. Nastavimo barvo ozadja na temno zeleno (da se ujema s travo)
|
||||||
this.cameras.main.setBackgroundColor('#4e342e'); // Dark Brown
|
this.cameras.main.setBackgroundColor('#2d4c1e');
|
||||||
|
|
||||||
const BG_W = this.scale.width * 2.5;
|
const BG_W = this.scale.width * 2.5;
|
||||||
const BG_H = this.scale.height * 2.5;
|
const BG_H = this.scale.height * 2.5;
|
||||||
|
|
||||||
// 2. Uporabimo originalno sliko za tileSprite (Clean Slate)
|
// 2. Uporabimo novo sliko za tileSprite (Grass Base)
|
||||||
this.ground = this.add.tileSprite(this.scale.width / 2, this.scale.height / 2, BG_W, BG_H, 'ground_base');
|
this.ground = this.add.tileSprite(this.scale.width / 2, this.scale.height / 2, BG_W, BG_H, 'ground_base');
|
||||||
this.ground.setScrollFactor(0); // Sticks to camera
|
this.ground.setScrollFactor(0); // Sticks to camera
|
||||||
this.ground.setDepth(-100);
|
this.ground.setDepth(-100);
|
||||||
|
|
||||||
|
// --- SCALE TEST ---
|
||||||
|
// Za testiranje velikosti teksture:
|
||||||
|
// Originalna velikost je verjetno majhna (npr. 512px).
|
||||||
|
// Če želimo, da je vzorec večji, moramo povečati setTileScale.
|
||||||
|
|
||||||
|
// Trenutno: 1.0 (Originalna velikost)
|
||||||
|
// Če je trava "preveč drobna", povečaj to številko (npr. 2.0).
|
||||||
|
// Če je trava "preveč zrnata", zmanjšaj (npr. 0.5).
|
||||||
|
this.ground.setTileScale(1.0);
|
||||||
|
|
||||||
// Note: We need to update tilePosition in update() loop to match camera scroll!
|
// Note: We need to update tilePosition in update() loop to match camera scroll!
|
||||||
|
|
||||||
// --- 2. RIVER SYSTEM (Infinite Scrolling - Horizontal) ---
|
// --- 2. RIVER SYSTEM (REMOVED) ---
|
||||||
const riverHeight = 200; // Fixed height per user request
|
|
||||||
const riverY = WORLD_H / 2 + 300;
|
|
||||||
|
|
||||||
// Horizontal River using tileSprite
|
// --- NEW: STATIC WATER POND (Ribnik) ---
|
||||||
// 1. ROTATION FIX:
|
// Dodano nazaj na zahtevo uporabnika (posodobljen asset)
|
||||||
// The texture 'river_tile_seamless' is vertical (banks on Left/Right).
|
this.pond = this.add.image(WORLD_W / 2 + 400, WORLD_H / 2 + 200, 'water_clean_patch');
|
||||||
// We want horizontal flow (banks on Top/Bottom).
|
this.pond.setDepth(-45); // Malo nad tlemi
|
||||||
// So we rotate the sprite by 90 degrees.
|
this.pond.setScale(1.5);
|
||||||
|
this.physics.add.existing(this.pond, true); // Static physics body
|
||||||
|
|
||||||
// When rotated 90 degrees:
|
// --- CELLAR ENTRANCE (Hole) ---
|
||||||
// - The sprite's "height" (local Y) becomes the screen width.
|
// Na poziciji Kai-a (WORLD_W / 2, WORLD_H / 2)
|
||||||
// - The sprite's "width" (local X) becomes the screen height (river thickness).
|
this.hole = this.add.image(WORLD_W / 2, WORLD_H / 2, 'hole');
|
||||||
// So we initialize with swapped dimensions:
|
this.hole.setDepth(-48); // On ground, below pond/items
|
||||||
// Width = riverHeight (which becomes vertical thickness after rotation)
|
this.physics.add.existing(this.hole, true); // Static body for trigger
|
||||||
// Height = WORLD_W (which becomes horizontal length after rotation)
|
|
||||||
|
|
||||||
this.river = this.add.tileSprite(WORLD_W / 2, riverY, riverHeight, WORLD_W, 'river_tile_seamless');
|
|
||||||
this.river.setAngle(90); // Rotate to horizontal
|
|
||||||
this.river.setDepth(-50); // Above ground, below player
|
|
||||||
|
|
||||||
// Physics for River (Obstacle)
|
|
||||||
this.physics.add.existing(this.river, true); // Static body
|
|
||||||
|
|
||||||
// 2. PHYSICS FIX for Rotated Sprite:
|
|
||||||
// Arcade Physics bodies are AABB (Axis Aligned) and do NOT rotate with the sprite.
|
|
||||||
// We must manually set the size to match the VISUAL shape on screen (Horizontal strip).
|
|
||||||
this.river.body.setSize(WORLD_W, riverHeight * 0.8);
|
|
||||||
|
|
||||||
// Offset is relative to the Top-Left of the UNROTATED sprite (which is confusing).
|
|
||||||
// Or simpler: Center the body on the sprite.
|
|
||||||
this.river.body.center.set(this.river.x, this.river.y);
|
|
||||||
// However, static bodies are tricky with offsets after creation.
|
|
||||||
// Best approach: Resize body, then re-center it.
|
|
||||||
// But since we use existing(), it might be offset.
|
|
||||||
// Let's rely on manual offset if needed, or use a separate Zone if it fails.
|
|
||||||
// Trying standard offset correction:
|
|
||||||
// Visual Width = WORLD_W, Visual Height = riverHeight.
|
|
||||||
// Unrotated Width = riverHeight, Unrotated Height = WORLD_W.
|
|
||||||
// This mismatch often causes physics debug to look wrong.
|
|
||||||
// Alternative: Use an invisible Zone for physics.
|
|
||||||
|
|
||||||
// Let's use an invisible rectangle for physics to be 100% safe and simple.
|
|
||||||
this.river.body.enable = false; // Disable sprite body
|
|
||||||
this.riverCollider = this.add.rectangle(WORLD_W / 2, riverY, WORLD_W, riverHeight * 0.8, 0x000000, 0);
|
|
||||||
this.physics.add.existing(this.riverCollider, true);
|
|
||||||
|
|
||||||
// --- RIVER EDGES INTEGRATION (Soft Blend) ---
|
|
||||||
// Create gradients to blend river edges with ground
|
|
||||||
const edgeHeight = 32; // Narrower blend for tighter fit
|
|
||||||
const riverGraphics = this.add.graphics();
|
|
||||||
|
|
||||||
// Top Edge: Solid Brown -> Transparent (Downwards)
|
|
||||||
// 0x4e342e is the background brown
|
|
||||||
riverGraphics.fillGradientStyle(0x4e342e, 0x4e342e, 0x4e342e, 0x4e342e, 1, 1, 0, 0);
|
|
||||||
riverGraphics.fillRect(0, riverY - (riverHeight/2) - (edgeHeight/2) + 10, WORLD_W, edgeHeight); // +10 nudge in
|
|
||||||
|
|
||||||
// Bottom Edge: Transparent -> Solid Brown (Downwards)
|
|
||||||
riverGraphics.fillGradientStyle(0x4e342e, 0x4e342e, 0x4e342e, 0x4e342e, 0, 0, 1, 1);
|
|
||||||
riverGraphics.fillRect(0, riverY + (riverHeight/2) - (edgeHeight/2) - 10, WORLD_W, edgeHeight); // -10 nudge in
|
|
||||||
|
|
||||||
riverGraphics.setDepth(-49); // Above river
|
|
||||||
|
|
||||||
// --- 2.1 Prejšnji Stream System (Removed) ---
|
|
||||||
/*
|
/*
|
||||||
// Center the whole construction
|
// Center the whole construction
|
||||||
const startX = WORLD_W / 2;
|
const startX = WORLD_W / 2;
|
||||||
@@ -246,16 +219,18 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
// Parametri reke za preverjanje (da ne sadimo trave v vodo)
|
// Parametri reke za preverjanje (da ne sadimo trave v vodo)
|
||||||
// Reka je na riverY, visoka je riverHeight
|
// Reka je na riverY, visoka je riverHeight
|
||||||
// riverY je sredina reke
|
// riverY je sredina reke
|
||||||
const riverSafeZone = riverHeight / 2 + 50; // Polovica višine + malo rezerve
|
// const riverSafeZone = riverHeight / 2 + 50; // REMOVED (River logic removed)
|
||||||
|
|
||||||
for (let i = 0; i < GRASS_COUNT; i++) {
|
for (let i = 0; i < GRASS_COUNT; i++) {
|
||||||
let x = (WORLD_W / 2) + (Math.random() * SPREAD * 2 - SPREAD);
|
let x = (WORLD_W / 2) + (Math.random() * SPREAD * 2 - SPREAD);
|
||||||
let y = (WORLD_H / 2) + (Math.random() * SPREAD * 2 - SPREAD);
|
let y = (WORLD_H / 2) + (Math.random() * SPREAD * 2 - SPREAD);
|
||||||
|
|
||||||
// PREVERJANJE: Če je trava v reki, preskoči
|
// PREVERJANJE: Če je trava v reki, preskoči
|
||||||
|
/*
|
||||||
if (Math.abs(y - riverY) < riverSafeZone) {
|
if (Math.abs(y - riverY) < riverSafeZone) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Randomizacija - samo divja trava
|
// Randomizacija - samo divja trava
|
||||||
let key = Math.random() > 0.5 ? 'grass_wild' : 'grass_wild_v2';
|
let key = Math.random() > 0.5 ? 'grass_wild' : 'grass_wild_v2';
|
||||||
@@ -321,7 +296,8 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
gameObject.y = dragY;
|
gameObject.y = dragY;
|
||||||
});
|
});
|
||||||
|
|
||||||
// --- EDITOR MODE SYSTEM ---
|
// --- EDITOR MODE SYSTEM (REMOVED) ---
|
||||||
|
/*
|
||||||
this.editorEnabled = true; // Enabled by default per user request
|
this.editorEnabled = true; // Enabled by default per user request
|
||||||
this.selectedTile = 'path_tile_0';
|
this.selectedTile = 'path_tile_0';
|
||||||
this.editorGroup = this.add.group(); // Saved tiles
|
this.editorGroup = this.add.group(); // Saved tiles
|
||||||
@@ -464,7 +440,7 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
this.ghostSprite.setVisible(state && this.selectedTile !== 'eraser_icon');
|
this.ghostSprite.setVisible(state && this.selectedTile !== 'eraser_icon');
|
||||||
console.log("Editor:", state);
|
console.log("Editor:", state);
|
||||||
};
|
};
|
||||||
toggleEditor(true); // Start visible per user request
|
toggleEditor(false); // Start hidden per user request
|
||||||
|
|
||||||
// Toggle Key
|
// Toggle Key
|
||||||
this.input.keyboard.on('keydown-E', () => {
|
this.input.keyboard.on('keydown-E', () => {
|
||||||
@@ -538,6 +514,7 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
this.updateAutotile(sx, sy);
|
this.updateAutotile(sx, sy);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
// --- PREVIOUSLY GENERATED PROPS (Draggable Example) ---
|
// --- PREVIOUSLY GENERATED PROPS (Draggable Example) ---
|
||||||
// Commented out per request "samo blatno potko"
|
// Commented out per request "samo blatno potko"
|
||||||
@@ -678,6 +655,14 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
|
|
||||||
|
|
||||||
// 3. COLLIDERS
|
// 3. COLLIDERS
|
||||||
|
// Cellar Trigger
|
||||||
|
if (this.hole) {
|
||||||
|
this.physics.add.overlap(this.kai, this.hole, (player, hole) => {
|
||||||
|
// Trigger logic (e.g., console log or event)
|
||||||
|
// console.log("Standing on cellar entrance");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (this.stream) this.physics.add.collider(this.kai, this.stream);
|
if (this.stream) this.physics.add.collider(this.kai, this.stream);
|
||||||
// Collider with riverCollider (invisible zone) instead of rotated sprite
|
// Collider with riverCollider (invisible zone) instead of rotated sprite
|
||||||
if (this.riverCollider) this.physics.add.collider(this.kai, this.riverCollider);
|
if (this.riverCollider) this.physics.add.collider(this.kai, this.riverCollider);
|
||||||
@@ -789,7 +774,8 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- AUTO-TILING SYSTEM ---
|
// --- AUTO-TILING SYSTEM (REMOVED) ---
|
||||||
|
/*
|
||||||
getWaterBitmask(x, y) {
|
getWaterBitmask(x, y) {
|
||||||
// Check 4 neighbors: Top (1), Right (2), Bottom (4), Left (8)
|
// Check 4 neighbors: Top (1), Right (2), Bottom (4), Left (8)
|
||||||
// Grid size is 128 (SNAP)
|
// Grid size is 128 (SNAP)
|
||||||
@@ -849,6 +835,7 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
update(time, delta) {
|
update(time, delta) {
|
||||||
// --- PARALLAX & SCROLLING ---
|
// --- PARALLAX & SCROLLING ---
|
||||||
@@ -858,10 +845,12 @@ export default class GrassSceneClean extends Phaser.Scene {
|
|||||||
this.ground.tilePositionY = this.cameras.main.scrollY;
|
this.ground.tilePositionY = this.cameras.main.scrollY;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. River Flow Animation (Horizontal)
|
// 2. River Flow Animation (REMOVED)
|
||||||
|
/*
|
||||||
if (this.river) {
|
if (this.river) {
|
||||||
this.river.tilePositionX += 2.0; // Flow to the left (texture moves right)
|
this.river.tilePositionX += 2.0; // Flow to the left (texture moves right)
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// --- PLAYER MOVEMENT ---
|
// --- PLAYER MOVEMENT ---
|
||||||
const speed = 250;
|
const speed = 250;
|
||||||
|
|||||||
Reference in New Issue
Block a user