Skip to content

Commit 18c2977

Browse files
committed
adding & deleting fence parts fixed
1 parent 43392fc commit 18c2977

7 files changed

Lines changed: 150 additions & 21 deletions

File tree

docs/biome-distribution-results.txt

Lines changed: 0 additions & 15 deletions
This file was deleted.
File renamed without changes.

src/main/java/wagemaker/uk/fence/FenceBuildingManager.java

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import com.badlogic.gdx.Gdx;
44
import com.badlogic.gdx.Input;
55
import com.badlogic.gdx.graphics.OrthographicCamera;
6+
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
7+
import com.badlogic.gdx.graphics.g2d.TextureRegion;
68
import com.badlogic.gdx.math.Rectangle;
79
import com.badlogic.gdx.math.Vector2;
810
import com.badlogic.gdx.math.Vector3;
911
import java.awt.Point;
1012
import java.util.List;
13+
import java.util.Map;
1114

1215
/**
1316
* Central coordinator for all fence building operations.
@@ -67,6 +70,9 @@ public class FenceBuildingManager {
6770
/** Flag to indicate building mode was just activated this frame */
6871
private boolean buildingModeJustActivated = false;
6972

73+
/** Flag to prevent targeting system interference after direct mouse operations */
74+
private boolean suppressTargetingCallback = false;
75+
7076
/**
7177
* Creates a new FenceBuildingManager with the specified dependencies.
7278
*
@@ -124,6 +130,13 @@ public void update(float deltaTime) {
124130
enterBuildingMode();
125131
}
126132

133+
// Handle clear all fences (C key) when in building mode
134+
if (buildingModeActive && Gdx.input.isKeyJustPressed(Input.Keys.C)) {
135+
clearAllFences();
136+
}
137+
138+
139+
127140
// Only process building input when in building mode and stable
128141
if (buildingModeActive && !buildingModeJustActivated) {
129142
processBuildingInput();
@@ -145,6 +158,45 @@ public void renderFences() {
145158
}
146159
}
147160

161+
/**
162+
* Renders all fence structures using the provided SpriteBatch.
163+
* This ensures proper rendering order with other game elements.
164+
*
165+
* @param batch The SpriteBatch to use for rendering
166+
*/
167+
public void renderFences(SpriteBatch batch) {
168+
if (structureManager == null) {
169+
return;
170+
}
171+
172+
Map<Point, FencePiece> allPieces = structureManager.getAllFencePieces();
173+
if (allPieces.isEmpty()) {
174+
return;
175+
}
176+
177+
// Get the texture atlas from the fence renderer
178+
FenceTextureAtlas textureAtlas = null;
179+
if (fenceRenderer != null) {
180+
textureAtlas = fenceRenderer.getTextureAtlas();
181+
}
182+
183+
if (textureAtlas == null || !textureAtlas.isInitialized()) {
184+
System.err.println("[FenceBuildingManager] Texture atlas not available for rendering");
185+
return;
186+
}
187+
188+
// Render all fence pieces using the main batch
189+
for (FencePiece piece : allPieces.values()) {
190+
TextureRegion region = textureAtlas.getTextureRegion(piece.getType());
191+
if (region != null) {
192+
batch.draw(region, piece.getX(), piece.getY(),
193+
textureAtlas.getPieceSize(), textureAtlas.getPieceSize());
194+
} else {
195+
System.err.println("[FenceBuildingManager] No texture region for " + piece.getType());
196+
}
197+
}
198+
}
199+
148200
/**
149201
* Renders visual effects for fence building operations.
150202
* Should be called during the rendering phase.
@@ -174,6 +226,7 @@ public void toggleBuildingMode() {
174226
* Validates material availability before allowing entry.
175227
*/
176228
private void enterBuildingMode() {
229+
177230
// Check if player has any fence materials
178231
FenceMaterialProvider materialProvider = validator.getMaterialProvider();
179232
if (materialProvider != null) {
@@ -203,6 +256,8 @@ private void enterBuildingMode() {
203256

204257
System.out.println("[FenceBuildingManager] Entered fence building mode - Press " + Input.Keys.toString(buildingModeToggleKey) + " to exit");
205258
System.out.println("[FenceBuildingManager] Left click to place fence, Right click to remove fence");
259+
System.out.println("[FenceBuildingManager] Press C to clear all fences");
260+
206261
System.out.println("[FenceBuildingManager] Current material: " + selectedMaterialType.getDisplayName());
207262
System.out.println("[FenceBuildingManager] State: buildingModeActive=" + buildingModeActive +
208263
", buildingModeJustActivated=" + buildingModeJustActivated +
@@ -245,6 +300,23 @@ private void processBuildingInput() {
245300
Vector3 mousePos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
246301
camera.unproject(mousePos);
247302

303+
// Constrain fence placement to be within reasonable distance from camera (viewport area)
304+
float maxDistance = Math.min(camera.viewportWidth, camera.viewportHeight) / 2f; // Half viewport size
305+
float cameraX = camera.position.x;
306+
float cameraY = camera.position.y;
307+
308+
// Calculate distance from camera center
309+
float dx = mousePos.x - cameraX;
310+
float dy = mousePos.y - cameraY;
311+
float distance = (float) Math.sqrt(dx * dx + dy * dy);
312+
313+
// If click is too far from camera, clamp it to viewport area
314+
if (distance > maxDistance) {
315+
float ratio = maxDistance / distance;
316+
mousePos.x = cameraX + dx * ratio;
317+
mousePos.y = cameraY + dy * ratio;
318+
}
319+
248320
// Convert to grid coordinates
249321
Point gridPos = structureManager.getGrid().worldToGrid(mousePos.x, mousePos.y);
250322

@@ -255,15 +327,19 @@ private void processBuildingInput() {
255327

256328
// Handle placement (left click)
257329
if (leftClicked) {
330+
System.out.println("[FenceBuildingManager] Left click detected at grid (" + gridPos.x + ", " + gridPos.y + ")");
258331
if (placeFenceSegment(gridPos.x, gridPos.y)) {
259332
lastProcessedGridPos = new Point(gridPos.x, gridPos.y);
260333
}
261334
}
262335

263336
// Handle removal (right click)
264337
if (rightClicked) {
338+
System.out.println("[FenceBuildingManager] Right click detected at grid (" + gridPos.x + ", " + gridPos.y + ")");
265339
if (removeFenceSegment(gridPos.x, gridPos.y)) {
266340
lastProcessedGridPos = new Point(gridPos.x, gridPos.y);
341+
// Suppress targeting system callback to prevent immediate replacement
342+
suppressTargetingCallback = true;
267343
}
268344
}
269345

@@ -304,10 +380,12 @@ public boolean placeFenceSegment(int gridX, int gridY) {
304380
}
305381

306382
try {
383+
System.out.println("[FenceBuildingManager] Attempting to place fence at grid (" + gridPos.x + ", " + gridPos.y + ") with material " + selectedMaterialType);
307384
// Attempt to place the fence piece with automatic piece type selection
308385
FencePiece placedPiece = structureManager.addFencePiece(gridPos, selectedMaterialType);
309386

310387
if (placedPiece != null) {
388+
System.out.println("[FenceBuildingManager] Fence piece created: " + placedPiece.getType() + " at world (" + placedPiece.getX() + ", " + placedPiece.getY() + ")");
311389
// Consume materials from inventory
312390
FenceMaterialProvider materialProvider = validator.getMaterialProvider();
313391
if (materialProvider != null) {
@@ -553,6 +631,18 @@ public boolean wasBuildingModeJustActivated() {
553631
return buildingModeJustActivated;
554632
}
555633

634+
/**
635+
* Checks if targeting system callbacks should be suppressed.
636+
* Used to prevent targeting system interference after direct mouse operations.
637+
*
638+
* @return true if targeting callbacks should be suppressed, false otherwise
639+
*/
640+
public boolean shouldSuppressTargetingCallback() {
641+
boolean suppress = suppressTargetingCallback;
642+
suppressTargetingCallback = false; // Reset flag after checking
643+
return suppress;
644+
}
645+
556646
/**
557647
* Gets the currently selected material type.
558648
*
@@ -733,6 +823,26 @@ private void updateCollisionBoundaries(Point gridPos, boolean placed) {
733823
}
734824
}
735825

826+
/**
827+
* Clears all fence pieces from the world.
828+
* Useful for debugging and testing.
829+
*/
830+
public void clearAllFences() {
831+
if (structureManager != null) {
832+
int fenceCount = structureManager.getFencePieceCount();
833+
structureManager.clear();
834+
835+
// Clear collision boundaries
836+
if (collisionManager != null) {
837+
collisionManager.clear();
838+
}
839+
840+
System.out.println("[FenceBuildingManager] Cleared " + fenceCount + " fence pieces");
841+
}
842+
}
843+
844+
845+
736846
/**
737847
* Disposes of resources used by this manager.
738848
*/

src/main/java/wagemaker/uk/fence/FenceRenderer.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ private void updateViewportBounds() {
103103
*/
104104
public void render(FenceStructureManager structureManager) {
105105
if (!textureAtlas.isInitialized()) {
106+
System.err.println("[FenceRenderer] Texture atlas not initialized - cannot render fences");
106107
return;
107108
}
108109

@@ -115,6 +116,8 @@ public void render(FenceStructureManager structureManager) {
115116
return;
116117
}
117118

119+
System.out.println("[FenceRenderer] Rendering " + allPieces.size() + " fence pieces");
120+
118121
// Begin batch rendering
119122
spriteBatch.begin();
120123

@@ -126,8 +129,10 @@ public void render(FenceStructureManager structureManager) {
126129
if (isInViewport(piece)) {
127130
renderPiece(piece);
128131
rendered++;
132+
System.out.println("[FenceRenderer] Rendered " + piece.getType() + " at (" + piece.getX() + ", " + piece.getY() + ")");
129133
} else {
130134
culled++;
135+
System.out.println("[FenceRenderer] Culled " + piece.getType() + " at (" + piece.getX() + ", " + piece.getY() + ") - outside viewport");
131136
}
132137
}
133138

@@ -136,6 +141,8 @@ public void render(FenceStructureManager structureManager) {
136141
// Update statistics
137142
renderedPiecesLastFrame = rendered;
138143
culledPiecesLastFrame = culled;
144+
145+
System.out.println("[FenceRenderer] Rendered: " + rendered + ", Culled: " + culled);
139146
}
140147

141148
/**
@@ -192,12 +199,21 @@ private void renderPiece(FencePiece piece) {
192199
*/
193200
private boolean isInViewport(FencePiece piece) {
194201
if (camera == null) {
202+
System.out.println("[FenceRenderer] No camera - rendering all pieces");
195203
return true; // No culling if no camera
196204
}
197205

198206
float pieceSize = textureAtlas.getPieceSize();
199207
Rectangle pieceRect = new Rectangle(piece.getX(), piece.getY(), pieceSize, pieceSize);
200-
return viewportBounds.overlaps(pieceRect);
208+
boolean inViewport = viewportBounds.overlaps(pieceRect);
209+
210+
if (!inViewport) {
211+
System.out.println("[FenceRenderer] Piece at (" + piece.getX() + ", " + piece.getY() + ") outside viewport bounds: " +
212+
"viewport=(" + viewportBounds.x + ", " + viewportBounds.y + ", " + viewportBounds.width + ", " + viewportBounds.height + "), " +
213+
"camera=(" + camera.position.x + ", " + camera.position.y + ")");
214+
}
215+
216+
return inViewport;
201217
}
202218

203219
/**

src/main/java/wagemaker/uk/fence/FenceSoundManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ public FenceSoundManager(float volume) {
4949
private void loadSounds() {
5050
try {
5151
// Load placement sound
52-
placementSound = Gdx.audio.newSound(Gdx.files.internal("sound/fence_place.wav"));
52+
placementSound = Gdx.audio.newSound(Gdx.files.internal("sound/fence_place.mp3"));
5353
System.out.println("[FENCE] Placement sound loaded successfully");
5454

5555
// Load removal sound
56-
removalSound = Gdx.audio.newSound(Gdx.files.internal("sound/fence_remove.wav"));
56+
removalSound = Gdx.audio.newSound(Gdx.files.internal("sound/fence_remove.mp3"));
5757
System.out.println("[FENCE] Removal sound loaded successfully");
5858

5959
// Load error sound
60-
errorSound = Gdx.audio.newSound(Gdx.files.internal("sound/fence_error.wav"));
60+
errorSound = Gdx.audio.newSound(Gdx.files.internal("sound/fence_error.mp3"));
6161
System.out.println("[FENCE] Error sound loaded successfully");
6262

6363
soundsLoaded = true;

src/main/java/wagemaker/uk/gdx/MyGdxGame.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -860,9 +860,9 @@ public void render() {
860860
drawAppleTrees();
861861
drawBananaTrees();
862862

863-
// Render fence structures
863+
// Render fence structures using main batch
864864
if (fenceBuildingManager != null) {
865-
fenceBuildingManager.renderFences();
865+
fenceBuildingManager.renderFences(batch);
866866
}
867867

868868
batch.end();

src/main/java/wagemaker/uk/player/Player.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1946,6 +1946,12 @@ private void activateFenceTargeting() {
19461946
targetingSystem.activate(x, y, wagemaker.uk.targeting.TargetingMode.ADJACENT, new wagemaker.uk.targeting.TargetingCallback() {
19471947
@Override
19481948
public void onTargetConfirmed(float targetX, float targetY) {
1949+
// Check if targeting callback should be suppressed (e.g., after direct mouse removal)
1950+
wagemaker.uk.fence.FenceBuildingManager fenceBuildingManager = getFenceBuildingManager();
1951+
if (fenceBuildingManager != null && fenceBuildingManager.shouldSuppressTargetingCallback()) {
1952+
System.out.println("Suppressing targeting callback after direct mouse operation");
1953+
return;
1954+
}
19491955
handleFencePlacement(targetX, targetY);
19501956
}
19511957

@@ -2198,6 +2204,12 @@ private void handleTargetingInput() {
21982204

21992205
// Handle placement based on current navigation mode
22002206
if (fenceNavigationMode) {
2207+
// Check if targeting callback should be suppressed
2208+
wagemaker.uk.fence.FenceBuildingManager fenceBuildingManager = getFenceBuildingManager();
2209+
if (fenceBuildingManager != null && fenceBuildingManager.shouldSuppressTargetingCallback()) {
2210+
System.out.println("Suppressing fence placement after direct mouse operation");
2211+
return;
2212+
}
22012213
handleFencePlacement(coords[0], coords[1]);
22022214
} else {
22032215
handleItemPlacement(coords[0], coords[1]);
@@ -2248,6 +2260,12 @@ private void handleSpacebarPlanting() {
22482260

22492261
// Handle placement based on current navigation mode
22502262
if (fenceNavigationMode) {
2263+
// Check if targeting callback should be suppressed
2264+
wagemaker.uk.fence.FenceBuildingManager fenceBuildingManager = getFenceBuildingManager();
2265+
if (fenceBuildingManager != null && fenceBuildingManager.shouldSuppressTargetingCallback()) {
2266+
System.out.println("Suppressing fence placement after direct mouse operation");
2267+
return;
2268+
}
22512269
handleFencePlacement(coords[0], coords[1]);
22522270
} else {
22532271
handleItemPlacement(coords[0], coords[1]);

0 commit comments

Comments
 (0)