Skip to content

Commit 45ab37b

Browse files
committed
delete entire fence enclosure with key C
1 parent 55c6d3a commit 45ab37b

8 files changed

Lines changed: 86 additions & 8 deletions

File tree

assets/localization/de.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
"fence_place": "Linksklick - Zäune platzieren",
9999
"fence_remove": "Rechtsklick - Zäune entfernen",
100100
"fence_select": "Maus - Zaunstück-Position auswählen",
101+
"fence_delete_enclosure": "C - Zaunbereich Löschen",
101102
"system_header": "System",
102103
"system_menu": "ESC - Menü öffnen",
103104
"system_delete_world": "X - Welt löschen",
@@ -250,4 +251,4 @@
250251
"fence_inventory": {
251252
"title": "Zaun-Inventar - Drücke B zum Schließen"
252253
}
253-
}
254+
}

assets/localization/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
"fence_place": "Left-click - Place fences",
9898
"fence_remove": "Right-click - Remove fences",
9999
"fence_select": "Mouse - Select fence piece location",
100+
"fence_delete_enclosure": "C - Delete Fence Enclosure",
100101
"system_header": "System",
101102
"system_menu": "ESC - Open menu",
102103
"system_delete_world": "X - Delete world",
@@ -249,4 +250,4 @@
249250
"fence_inventory": {
250251
"title": "Fence Inventory - Press B to close"
251252
}
252-
}
253+
}

assets/localization/nl.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
"fence_place": "Linker klik - Hekken plaatsen",
9898
"fence_remove": "Rechter klik - Hekken verwijderen",
9999
"fence_select": "Muis - Hekstuk locatie selecteren",
100+
"fence_delete_enclosure": "C - Verwijder Hek Omheining",
100101
"system_header": "Systeem",
101102
"system_menu": "ESC - Menu openen",
102103
"system_delete_world": "X - Wereld verwijderen",
@@ -249,4 +250,4 @@
249250
"fence_inventory": {
250251
"title": "Hek Inventaris - Druk op B om te sluiten"
251252
}
252-
}
253+
}

assets/localization/pl.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
"fence_place": "Lewy klik - Umieść ogrodzenia",
9898
"fence_remove": "Prawy klik - Usuń ogrodzenia",
9999
"fence_select": "Mysz - Wybierz lokalizację elementu ogrodzenia",
100+
"fence_delete_enclosure": "C - Usuń Ogrodzony Teren",
100101
"system_header": "System",
101102
"system_menu": "ESC - Otwórz menu",
102103
"system_delete_world": "X - Usuń świat",
@@ -249,4 +250,4 @@
249250
"fence_inventory": {
250251
"title": "Inwentarz Ogrodzeń - Naciśnij B aby zamknąć"
251252
}
252-
}
253+
}

assets/localization/pt.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
"fence_place": "Clique esquerdo - Colocar cercas",
9898
"fence_remove": "Clique direito - Remover cercas",
9999
"fence_select": "Mouse - Selecionar localização da peça de cerca",
100+
"fence_delete_enclosure": "C - Excluir Cerca",
100101
"system_header": "Sistema",
101102
"system_menu": "ESC - Abrir menu",
102103
"system_delete_world": "X - Excluir mundo",
@@ -249,4 +250,4 @@
249250
"fence_inventory": {
250251
"title": "Inventário de Cercas - Pressione B para fechar"
251252
}
252-
}
253+
}

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

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.awt.Point;
1212
import java.util.List;
1313
import java.util.Map;
14+
import java.util.Set;
1415

1516
/**
1617
* Central coordinator for all fence building operations.
@@ -133,9 +134,9 @@ public void update(float deltaTime) {
133134
enterBuildingMode();
134135
}
135136

136-
// Handle clear all fences (C key) when in building mode
137+
// Handle clear nearest enclosure (C key) when in building mode
137138
if (buildingModeActive && Gdx.input.isKeyJustPressed(Input.Keys.C)) {
138-
clearAllFences();
139+
clearNearestEnclosure();
139140
}
140141

141142
// Handle rebuild collision boundaries (R key) when in building mode
@@ -860,6 +861,76 @@ private void updateCollisionBoundaries(Point gridPos, boolean placed) {
860861
}
861862
}
862863

864+
/**
865+
* Clears the fence enclosure nearest to the targeting cursor.
866+
* Finds the closest fence piece, identifies all connected pieces, and removes them.
867+
* Returns materials to inventory and plays a single removal sound.
868+
*/
869+
public void clearNearestEnclosure() {
870+
if (structureManager == null) return;
871+
872+
// Get mouse position in world coordinates
873+
Vector3 mousePos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
874+
camera.unproject(mousePos);
875+
876+
// Find closest fence piece
877+
Map<Point, FencePiece> allPieces = structureManager.getAllFencePieces();
878+
if (allPieces.isEmpty()) {
879+
return;
880+
}
881+
882+
Point closestPos = null;
883+
float minDistanceSq = Float.MAX_VALUE;
884+
885+
for (Map.Entry<Point, FencePiece> entry : allPieces.entrySet()) {
886+
FencePiece piece = entry.getValue();
887+
float dx = piece.getX() - mousePos.x;
888+
float dy = piece.getY() - mousePos.y;
889+
float distSq = dx*dx + dy*dy;
890+
891+
if (distSq < minDistanceSq) {
892+
minDistanceSq = distSq;
893+
closestPos = entry.getKey();
894+
}
895+
}
896+
897+
if (closestPos != null) {
898+
// Get connected pieces (the enclosure)
899+
Set<Point> connectedPoints = structureManager.findConnectedPieces(closestPos);
900+
901+
if (!connectedPoints.isEmpty()) {
902+
System.out.println("[FenceBuildingManager] Clearing enclosure of " + connectedPoints.size() + " pieces nearest to " + closestPos);
903+
904+
int removedCount = 0;
905+
906+
// Remove each piece
907+
for (Point pos : connectedPoints) {
908+
FencePiece removedPiece = structureManager.removeFencePiece(pos);
909+
if (removedPiece != null) {
910+
updateCollisionBoundaries(pos, false);
911+
removedCount++;
912+
// Trigger visual effect for each piece
913+
if (visualEffectsManager != null) {
914+
visualEffectsManager.triggerRemovalAnimation(pos, selectedMaterialType);
915+
}
916+
}
917+
}
918+
919+
// Return materials
920+
FenceMaterialProvider materialProvider = validator.getMaterialProvider();
921+
if (materialProvider != null && removedCount > 0) {
922+
materialProvider.returnMaterials(selectedMaterialType, removedCount);
923+
System.out.println("Returned " + removedCount + " " + selectedMaterialType.getDisplayName() + " materials");
924+
}
925+
926+
// Play sound once
927+
if (soundManager != null) {
928+
soundManager.playRemovalSound();
929+
}
930+
}
931+
}
932+
}
933+
863934
/**
864935
* Clears all fence pieces from the world.
865936
* Useful for debugging and testing.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ private void checkForCompletedEnclosures(Point gridPos) {
330330
* @param startPos Starting grid position
331331
* @return Set of all connected grid positions
332332
*/
333-
private Set<Point> findConnectedPieces(Point startPos) {
333+
public Set<Point> findConnectedPieces(Point startPos) {
334334
Set<Point> visited = new HashSet<>();
335335
Queue<Point> queue = new LinkedList<>();
336336

src/main/java/wagemaker/uk/ui/ControlsDialog.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ public void render(SpriteBatch batch, ShapeRenderer shapeRenderer, float camX, f
193193
dialogFont.draw(batch, loc.getText("controls_dialog.fence_remove"), leftColumnX, currentY);
194194
currentY -= 20;
195195
dialogFont.draw(batch, loc.getText("controls_dialog.fence_select"), leftColumnX, currentY);
196+
currentY -= 20;
197+
dialogFont.draw(batch, loc.getText("controls_dialog.fence_delete_enclosure"), leftColumnX, currentY);
196198

197199
// Reset Y for right column
198200
currentY = dialogY + DIALOG_HEIGHT - 70;

0 commit comments

Comments
 (0)