From 7cc71e894046ffb9fa5a8650b22b8f18b9bc80c4 Mon Sep 17 00:00:00 2001
From: Pan
Date: Tue, 7 Sep 2021 18:40:11 +1200
Subject: [PATCH] Improved pathing for moving multiple units across the map.
---
core/playerCommander.java | 86 +++++++++++++++++++++++++++++++++++----
core/rasterizer.java | 4 +-
2 files changed, 80 insertions(+), 10 deletions(-)
diff --git a/core/playerCommander.java b/core/playerCommander.java
index 252943c..f330a8e 100644
--- a/core/playerCommander.java
+++ b/core/playerCommander.java
@@ -195,6 +195,7 @@ public class playerCommander {
}
}
+
//center camera to the one of the selected units
if(doubleNumberPressed){
solidObject selectedUnit = null;
@@ -233,16 +234,11 @@ public class playerCommander {
//if the click lands on empty ground perform "attack move" for all selected unit
//if the click lands on an unit, then attack that unit regardless if it is friend or foe
+
boolean performAttack = false;
if(numberOfSelectedUnits > 1){
performAttack = true;
}
- if(numberOfSelectedUnits ==1){
- if(selectedUnits[0] != null) //null pointer happened here once, not sure why
- if(selectedUnits[0].teamNo == 0)
- performAttack = true;
-
- }
if(performAttack){
@@ -593,10 +589,16 @@ public class playerCommander {
}
public void moveSelectedUnit(float x, float y){
+
boolean moveableUnitSelected = false;
int numOfConYardSelected = 0;
int numOfMobileUnitSelected = 0;
+ float groupCenterX = 0;
+ float groupCenterY = 0;
+ float directionX = 0;
+ float directionY = 0;
+
for(int i = 0; i < selectedUnits.length; i++){
if(selectedUnits[i] != null){
if(selectedUnits[i].teamNo == 0){
@@ -610,12 +612,41 @@ public class playerCommander {
if(selectedUnits[i].type == 104)
numOfConYardSelected++;
- if(selectedUnits[i].type == 0 || selectedUnits[i].type == 1 || selectedUnits[i].type == 2 || selectedUnits[i].type == 3 || selectedUnits[i].type == 6 || selectedUnits[i].type == 7)
+ if(selectedUnits[i].type == 0 || selectedUnits[i].type == 1 || selectedUnits[i].type == 2 || selectedUnits[i].type == 3 || selectedUnits[i].type == 6 || selectedUnits[i].type == 7) {
numOfMobileUnitSelected++;
+ groupCenterX += selectedUnits[i].centre.x;
+ groupCenterY += selectedUnits[i].centre.z;
+ }
}
}
}
+ groupCenterX/=numOfMobileUnitSelected;
+ groupCenterY/=numOfMobileUnitSelected;
+
+ directionX = x - groupCenterX;
+ directionY = y - groupCenterY;
+
+ float innerCircleRadius = (float)numOfMobileUnitSelected/8;
+
+ if(directionX*directionX + directionY*directionY > innerCircleRadius/2) {
+ for(int i = 0; i < selectedUnits.length; i++) {
+ if(selectedUnits[i] != null && selectedUnits[i].teamNo == 0){
+ int type = selectedUnits[i].type;
+ if(type == 0 || type == 1 || type == 2 || type == 3) {
+ float distance_x = selectedUnits[i].centre.x- groupCenterX;
+ float distance_y = selectedUnits[i].centre.z - groupCenterY;
+
+ if(distance_x*distance_x + distance_y*distance_y < innerCircleRadius) {
+ selectedUnits[i].moveTo(selectedUnits[i].centre.x + directionX, selectedUnits[i].centre.z + directionY);
+ selectedUnits[i].currentCommand = solidObject.move;
+ selectedUnits[i].secondaryCommand = solidObject.StandBy;
+ }
+ }
+ }
+ }
+
+ }
//draw move confirmation if a mobile unit is given move order
@@ -630,12 +661,51 @@ public class playerCommander {
public void attackMoveSelectUnit(float x, float y){
boolean mobileUnitSelected = false;
+ int numOfMobileUnitSelected = 0;
+ float groupCenterX = 0;
+ float groupCenterY = 0;
+ float directionX = 0;
+ float directionY = 0;
+
+ for(int i = 0; i < selectedUnits.length; i++){
+ if(selectedUnits[i] != null){
+ if(selectedUnits[i].teamNo == 0){
+ if(selectedUnits[i].type == 0 || selectedUnits[i].type == 1 || selectedUnits[i].type == 2 || selectedUnits[i].type == 3 || selectedUnits[i].type == 6 || selectedUnits[i].type == 7) {
+ numOfMobileUnitSelected++;
+ groupCenterX += selectedUnits[i].centre.x;
+ groupCenterY += selectedUnits[i].centre.z;
+ }
+ }
+ }
+ }
+
+ groupCenterX/=numOfMobileUnitSelected;
+ groupCenterY/=numOfMobileUnitSelected;
+
+ directionX = x - groupCenterX;
+ directionY = y - groupCenterY;
+
+ float innerCircleRadius = (float)numOfMobileUnitSelected/8;
+ boolean clickInsideGroup = directionX*directionX + directionY*directionY > innerCircleRadius/2;
+
+
for(int i = 0; i < selectedUnits.length; i++){
if(selectedUnits[i] != null){
if(selectedUnits[i].teamNo == 0 && selectedUnits[i].type != 2 && selectedUnits[i].type != 3 && selectedUnits[i].type < 100){ //not harvesters or MCVs or any buildings
- selectedUnits[i].attackMoveTo(x, y);
+
+ float distance_x = selectedUnits[i].centre.x- groupCenterX;
+ float distance_y = selectedUnits[i].centre.z - groupCenterY;
+
+ if(distance_x*distance_x + distance_y*distance_y < innerCircleRadius && clickInsideGroup) {
+ selectedUnits[i].attackMoveTo(selectedUnits[i].centre.x + directionX, selectedUnits[i].centre.z + directionY);
+
+ }else {
+ selectedUnits[i].attackMoveTo(x, y);
+ }
+
selectedUnits[i].currentCommand = solidObject.attackMove;
selectedUnits[i].secondaryCommand = solidObject.attackMove;
+
mobileUnitSelected = true;
}
}
diff --git a/core/rasterizer.java b/core/rasterizer.java
index c7e5f32..8da4462 100644
--- a/core/rasterizer.java
+++ b/core/rasterizer.java
@@ -578,8 +578,8 @@ public class rasterizer {
dz = (zRight_lightspace[y] - startZ)/dx;
index = startX + y*shadowmap_width;
for(;startX < endX; startX++, index++, startZ += dz){
- if(startZ < shadowBuffer[index&shadowmap_size_]){
- shadowBuffer[index&shadowmap_size_] = startZ;
+ if(startZ < shadowBuffer[index]){
+ shadowBuffer[index] = startZ;
}
}
}