h
This commit is contained in:
parent
889c30d603
commit
1bb4756930
@ -230,9 +230,9 @@ public class AssetManager {
|
|||||||
//techCenter.rocketTankResearched_enemy = true;
|
//techCenter.rocketTankResearched_enemy = true;
|
||||||
|
|
||||||
//}else {
|
//}else {
|
||||||
//heavyTank l = new heavyTank(new vector(j*0.25f+ 1.125f,-0.3f, 22.125f - i*0.25f), 90, 1);
|
heavyTank l = new heavyTank(new vector(j*0.25f+ 1.125f,-0.3f, 22.125f - i*0.25f), 90, 1);
|
||||||
|
|
||||||
//addHeavyTank(l);
|
addHeavyTank(l);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
|
||||||
@ -245,13 +245,13 @@ public class AssetManager {
|
|||||||
//harvester l = new harvester(new vector(i*0.25f+ 1.125f,-0.3f, 17.375f - 0.25f*j), 90, 0);
|
//harvester l = new harvester(new vector(i*0.25f+ 1.125f,-0.3f, 17.375f - 0.25f*j), 90, 0);
|
||||||
//addHarvester(l);
|
//addHarvester(l);
|
||||||
//l.hasMultiShotUpgrade = true;
|
//l.hasMultiShotUpgrade = true;
|
||||||
//stealthTank l = new stealthTank(new vector(i*0.25f + 1.125f,-0.3f, 0.5f + 18.625f + j*0.25f), 90, 0);
|
lightTank l = new lightTank(new vector(i*0.25f + 1.125f,-0.3f, 0.5f + 18.625f + j*0.25f), 90, 0);
|
||||||
|
|
||||||
//l.attackRange = 1.99f;
|
//l.attackRange = 1.99f;
|
||||||
|
|
||||||
//lightTank.tileCheckList_player = lightTank.generateTileCheckList(6);
|
//lightTank.tileCheckList_player = lightTank.generateTileCheckList(6);
|
||||||
|
|
||||||
//addStealthTank(l);
|
addLightTank(l);
|
||||||
//if(j == 0 && i == 0)
|
//if(j == 0 && i == 0)
|
||||||
//addMissileTurret(new missileTurret(i*0.25f -0.125f + 1, -0.65f, 0.25f + 17.125f + j*0.25f, 0));
|
//addMissileTurret(new missileTurret(i*0.25f -0.125f + 1, -0.65f, 0.25f + 17.125f + j*0.25f, 0));
|
||||||
|
|
||||||
@ -319,6 +319,10 @@ public class AssetManager {
|
|||||||
|
|
||||||
mainThread.gridMap.reset();
|
mainThread.gridMap.reset();
|
||||||
solidObject.globalUniqID = 0;
|
solidObject.globalUniqID = 0;
|
||||||
|
|
||||||
|
postProcessingThread.reset();
|
||||||
|
|
||||||
|
System.gc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ public class mainThread extends JFrame implements KeyListener, ActionListener, M
|
|||||||
public static final int endGameMenu = 3;
|
public static final int endGameMenu = 3;
|
||||||
|
|
||||||
public static String timeString;
|
public static String timeString;
|
||||||
public static boolean fogOfWarDisabled;
|
public static boolean fogOfWarDisabled = false;
|
||||||
|
|
||||||
public mainThread(){
|
public mainThread(){
|
||||||
setTitle("Battle Tank 3");
|
setTitle("Battle Tank 3");
|
||||||
|
@ -16,7 +16,7 @@ public class polygon3D {
|
|||||||
public vector centre;
|
public vector centre;
|
||||||
|
|
||||||
//The number of vertex
|
//The number of vertex
|
||||||
public int L;
|
public byte L;
|
||||||
|
|
||||||
//whether the polygon is completely bounded by the screen
|
//whether the polygon is completely bounded by the screen
|
||||||
public boolean withinViewScreen;
|
public boolean withinViewScreen;
|
||||||
@ -49,7 +49,7 @@ public class polygon3D {
|
|||||||
public solidObject parentObject;
|
public solidObject parentObject;
|
||||||
|
|
||||||
//A pool of vectors which will be used for vector arithmetic
|
//A pool of vectors which will be used for vector arithmetic
|
||||||
public vector
|
public static vector
|
||||||
tempVector1 = new vector(0,0,0),
|
tempVector1 = new vector(0,0,0),
|
||||||
tempVector2 = new vector(0,0,0),
|
tempVector2 = new vector(0,0,0),
|
||||||
tempVector3 = new vector(0,0,0),
|
tempVector3 = new vector(0,0,0),
|
||||||
@ -71,7 +71,7 @@ public class polygon3D {
|
|||||||
public int visibleCount;
|
public int visibleCount;
|
||||||
|
|
||||||
//type of the polygon
|
//type of the polygon
|
||||||
public int type;
|
public byte type;
|
||||||
|
|
||||||
//the diffuse/ambient intensity of this polygon
|
//the diffuse/ambient intensity of this polygon
|
||||||
public int diffuse_I;
|
public int diffuse_I;
|
||||||
@ -89,10 +89,10 @@ public class polygon3D {
|
|||||||
public int color;
|
public int color;
|
||||||
|
|
||||||
//light map texture for this polygon
|
//light map texture for this polygon
|
||||||
public int lightMapTextureIndex;
|
//public int lightMapTextureIndex;
|
||||||
|
|
||||||
//max texel change rate in x direction;
|
//max texel change rate in x direction;
|
||||||
public int max_dx = 512;
|
//public int max_dx = 512;
|
||||||
|
|
||||||
//Whether origin, rightEnd and bottomEnd vectors match exactly the corners of the polygon
|
//Whether origin, rightEnd and bottomEnd vectors match exactly the corners of the polygon
|
||||||
public boolean textureFitPolygon;
|
public boolean textureFitPolygon;
|
||||||
@ -104,12 +104,12 @@ public class polygon3D {
|
|||||||
|
|
||||||
//Constuctor of the polygon class, it will only accept convex polygons
|
//Constuctor of the polygon class, it will only accept convex polygons
|
||||||
public polygon3D(vector[] vertex3D, vector origin, vector rightEnd, vector bottomEnd, texture myTexture, float scaleX, float scaleY, int type){
|
public polygon3D(vector[] vertex3D, vector origin, vector rightEnd, vector bottomEnd, texture myTexture, float scaleX, float scaleY, int type){
|
||||||
this.type = type;
|
this.type = (byte)type;
|
||||||
this.vertex3D = vertex3D;
|
this.vertex3D = vertex3D;
|
||||||
this.myTexture = myTexture;
|
this.myTexture = myTexture;
|
||||||
this.scaleX = scaleX;
|
this.scaleX = scaleX;
|
||||||
this.scaleY = scaleY;
|
this.scaleY = scaleY;
|
||||||
L = vertex3D.length;
|
L = (byte)vertex3D.length;
|
||||||
diffuse_I = 31;
|
diffuse_I = 31;
|
||||||
shadowBias = 30000;
|
shadowBias = 30000;
|
||||||
|
|
||||||
|
@ -187,6 +187,12 @@ public class postProcessingThread implements Runnable{
|
|||||||
eyeDirection = new vector(0,0,0);
|
eyeDirection = new vector(0,0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void reset() {
|
||||||
|
theMiniMap.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void run(){
|
public void run(){
|
||||||
if(frameIndex == 0)
|
if(frameIndex == 0)
|
||||||
init();
|
init();
|
||||||
@ -413,6 +419,7 @@ public class postProcessingThread implements Runnable{
|
|||||||
|
|
||||||
//draw health bar/Group info/unit level for every selected unit
|
//draw health bar/Group info/unit level for every selected unit
|
||||||
for(int i = 0; i < 100; i++){
|
for(int i = 0; i < 100; i++){
|
||||||
|
|
||||||
if(currentSelectedUnitsInfo[i][0] != -1){
|
if(currentSelectedUnitsInfo[i][0] != -1){
|
||||||
ObjectType = (currentSelectedUnitsInfo[i][0] & 0xff);
|
ObjectType = (currentSelectedUnitsInfo[i][0] & 0xff);
|
||||||
groupNo = ((currentSelectedUnitsInfo[i][0] & 0xff00) >> 8);
|
groupNo = ((currentSelectedUnitsInfo[i][0] & 0xff00) >> 8);
|
||||||
@ -425,7 +432,7 @@ public class postProcessingThread implements Runnable{
|
|||||||
|
|
||||||
//draw group info
|
//draw group info
|
||||||
if(groupNo != 255){
|
if(groupNo != 255){
|
||||||
theTextRenderer.drawText_outline(xPos, yPos + 3, ""+(groupNo+1), currentScreen, 0xffffff, 0);
|
theTextRenderer.drawText_outline(xPos, yPos + 3, String.valueOf(groupNo+1), currentScreen, 0xffffff, 0);
|
||||||
}
|
}
|
||||||
if(level != 0){
|
if(level != 0){
|
||||||
theTextRenderer.drawStarCharacter(xPos + healthBarLength - 13, yPos + 5, level, currentScreen, 0xffff33, 0);
|
theTextRenderer.drawStarCharacter(xPos + healthBarLength - 13, yPos + 5, level, currentScreen, 0xffff33, 0);
|
||||||
|
@ -10,9 +10,9 @@ public final class vector{
|
|||||||
//2d position on screen (from light point of view)
|
//2d position on screen (from light point of view)
|
||||||
public float screenX_lightspace, screenY_lightspace;
|
public float screenX_lightspace, screenY_lightspace;
|
||||||
|
|
||||||
public final static int Z_length = 650;
|
public static final int Z_length = 650;
|
||||||
|
|
||||||
public final int orthogonalScale = 220;
|
public static final int orthogonalScale = 220;
|
||||||
|
|
||||||
public static float old_X, old_Y, old_Z, zInverse, lengthInverse;
|
public static float old_X, old_Y, old_Z, zInverse, lengthInverse;
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ public class harassmentAI {
|
|||||||
for(int i = 0; i < squad.length; i++) {
|
for(int i = 0; i < squad.length; i++) {
|
||||||
if(squad[i] != null && squad[i].currentHP > 0 ) {
|
if(squad[i] != null && squad[i].currentHP > 0 ) {
|
||||||
numberOfSquad++;
|
numberOfSquad++;
|
||||||
if(squad[i].secondaryDestinationX != gatherLocation.x || squad[i].secondaryDestinationY != gatherLocation.z || (squad[i].movement.x == 0 && squad[i].movement.z == 0 && squad[i].currentMovementStatus == solidObject.freeToMove)){
|
if(squad[i].secondaryDestinationX != gatherLocation.x || squad[i].secondaryDestinationY != gatherLocation.z){
|
||||||
squad[i].attackMoveTo(gatherLocation.x,gatherLocation.z);
|
squad[i].attackMoveTo(gatherLocation.x,gatherLocation.z);
|
||||||
squad[i].currentCommand = solidObject.attackMove;
|
squad[i].currentCommand = solidObject.attackMove;
|
||||||
squad[i].secondaryCommand = solidObject.attackMove;
|
squad[i].secondaryCommand = solidObject.attackMove;
|
||||||
@ -214,10 +214,25 @@ public class harassmentAI {
|
|||||||
harassDirection.unit();
|
harassDirection.unit();
|
||||||
|
|
||||||
if(scout != null) {
|
if(scout != null) {
|
||||||
|
|
||||||
|
boolean squadIsUnderAttack = false;
|
||||||
|
for(int i = 0; i < squad.length; i++) {
|
||||||
|
if(squad[i] != null && squad[i].underAttackCountDown > 0) {
|
||||||
|
squadIsUnderAttack = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(scout.underAttackCountDown > 0)
|
||||||
|
squadIsUnderAttack = true;
|
||||||
|
|
||||||
scout.moveTo(squadCenter.x + harassDirection.x*1.75f, squadCenter.z + harassDirection.z*1.75f);
|
if(!squadIsUnderAttack) {
|
||||||
scout.currentCommand = solidObject.move;
|
scout.moveTo(squadCenter.x + harassDirection.x*1.5f, squadCenter.z + harassDirection.z*1.5f);
|
||||||
scout.secondaryCommand = solidObject.StandBy;
|
scout.currentCommand = solidObject.move;
|
||||||
|
scout.secondaryCommand = solidObject.StandBy;
|
||||||
|
}else if(miniFrameAI%30 == 29){
|
||||||
|
scout.attackMoveTo(squadCenter.x, squadCenter.z);
|
||||||
|
scout.currentCommand = solidObject.attackMove;
|
||||||
|
scout.secondaryCommand = solidObject.attackMove;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1309,14 +1309,14 @@ public class stealthTank extends solidObject{
|
|||||||
myDamageModified = myDamage;
|
myDamageModified = myDamage;
|
||||||
|
|
||||||
if(secondaryTargets[i].type==0 || targetObject.type==1){
|
if(secondaryTargets[i].type==0 || targetObject.type==1){
|
||||||
myDamageModified=(int)(myDamage*3);
|
myDamageModified=(int)(myDamage*2);
|
||||||
|
|
||||||
}else if(targetObject.type==6){
|
}else if(targetObject.type==6){
|
||||||
myDamageModified=(int)(myDamage*1.75);
|
myDamageModified=(int)(myDamage*1.75);
|
||||||
}else if(targetObject.type == 2 || targetObject.type == 3){
|
}else if(targetObject.type == 2 || targetObject.type == 3){
|
||||||
myDamageModified=(int)(myDamage*0.3);
|
myDamageModified=(int)(myDamage*0.3);
|
||||||
}else if(secondaryTargets[i].type == 7) {
|
}else if(secondaryTargets[i].type == 7) {
|
||||||
myDamageModified=0; //heavy tank is immue to secondary attack
|
myDamageModified=(int)(myDamage*0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
100
gui/MiniMap.java
100
gui/MiniMap.java
@ -1,5 +1,6 @@
|
|||||||
package gui;
|
package gui;
|
||||||
|
|
||||||
|
import core.gameData;
|
||||||
import core.mainThread;
|
import core.mainThread;
|
||||||
import core.postProcessingThread;
|
import core.postProcessingThread;
|
||||||
import core.vector;
|
import core.vector;
|
||||||
@ -11,6 +12,8 @@ public class MiniMap {
|
|||||||
public boolean[][] bitmapVision;
|
public boolean[][] bitmapVision;
|
||||||
public static vector corner1, corner2, corner3, corner4;
|
public static vector corner1, corner2, corner3, corner4;
|
||||||
public static boolean isDrawingWindow;
|
public static boolean isDrawingWindow;
|
||||||
|
public int[][] warningSigns;
|
||||||
|
public int[] warningSignLife;
|
||||||
|
|
||||||
|
|
||||||
public void init(){
|
public void init(){
|
||||||
@ -36,6 +39,14 @@ public class MiniMap {
|
|||||||
corner2 = new vector(0,0,0);
|
corner2 = new vector(0,0,0);
|
||||||
corner3 = new vector(0,0,0);
|
corner3 = new vector(0,0,0);
|
||||||
corner4 = new vector(0,0,0);
|
corner4 = new vector(0,0,0);
|
||||||
|
|
||||||
|
warningSigns = new int[5][2];
|
||||||
|
warningSignLife = new int[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
warningSigns = new int[5][2];
|
||||||
|
warningSignLife = new int[5];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -57,11 +68,81 @@ public class MiniMap {
|
|||||||
//draw unit positions on minimap
|
//draw unit positions on minimap
|
||||||
drawUnit(screen, minimapBitmap, unitsForMiniMap, unitsForMiniMapCount);
|
drawUnit(screen, minimapBitmap, unitsForMiniMap, unitsForMiniMapCount);
|
||||||
|
|
||||||
|
//draw warning signs
|
||||||
|
drawWarningSigns(screen);
|
||||||
|
|
||||||
//draw view window
|
//draw view window
|
||||||
drawViewWindow(screen);
|
drawViewWindow(screen);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void drawWarningSigns(int[] screen) {
|
||||||
|
for(int i = 0; i < warningSignLife.length; i++) {
|
||||||
|
if(warningSignLife[i] > 0) {
|
||||||
|
warningSignLife[i]--;
|
||||||
|
|
||||||
|
|
||||||
|
//calculate the radius and angle base on the remining life in the warning sign
|
||||||
|
|
||||||
|
int extenedR = (warningSignLife[i]- 325)*3;
|
||||||
|
if(extenedR < 0)
|
||||||
|
extenedR = 0;
|
||||||
|
float r = 12 + extenedR;
|
||||||
|
int angle = (warningSignLife[i]*6)%360;
|
||||||
|
|
||||||
|
//calculate the coordinate of the 3 defining points of the warning sign
|
||||||
|
int centerX = warningSigns[i][0];
|
||||||
|
int centerY = warningSigns[i][1];
|
||||||
|
|
||||||
|
int xPos1 = centerX + (int)(r*gameData.cos[angle]);
|
||||||
|
int yPos1 = centerY + (int)(r*gameData.sin[angle]);
|
||||||
|
|
||||||
|
angle = (angle + 120)%360;
|
||||||
|
|
||||||
|
int xPos2 = centerX + (int)(r*gameData.cos[angle]);
|
||||||
|
int yPos2 = centerY + (int)(r*gameData.sin[angle]);
|
||||||
|
|
||||||
|
drawLine(xPos1, yPos1, xPos2,yPos2, screen, 0x660000);
|
||||||
|
|
||||||
|
angle = (angle + 120)%360;
|
||||||
|
|
||||||
|
int xPos3 = centerX + (int)(r*gameData.cos[angle]);
|
||||||
|
int yPos3 = centerY + (int)(r*gameData.sin[angle]);
|
||||||
|
|
||||||
|
drawLine(xPos3, yPos3, xPos2,yPos2, screen, 0x660000);
|
||||||
|
|
||||||
|
drawLine(xPos3, yPos3, xPos1,yPos1, screen, 0x660000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void spawnWarningSign(int xPos, int yPos) {
|
||||||
|
boolean closeToExisingWarningSign = false;
|
||||||
|
for(int j = 0; j < warningSigns.length; j++) {
|
||||||
|
if(warningSignLife[j] > 0) {
|
||||||
|
//check if the spawn location is too lose to exisiting
|
||||||
|
int x = warningSigns[j][0];
|
||||||
|
int y = warningSigns[j][1];
|
||||||
|
double d = Math.sqrt((x - xPos)*(x - xPos) + (y - yPos)*(y - yPos));
|
||||||
|
if(d < 10) {
|
||||||
|
closeToExisingWarningSign = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!closeToExisingWarningSign) {
|
||||||
|
for(int i = 0; i < warningSigns.length; i++) {
|
||||||
|
if(warningSignLife[i] == 0) {
|
||||||
|
warningSigns[i][0] = xPos;
|
||||||
|
warningSigns[i][1] = yPos;
|
||||||
|
warningSignLife[i] = 350;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void drawViewWindow(int[] screen){
|
public void drawViewWindow(int[] screen){
|
||||||
int xPos1, xPos2, xPos3,xPos4, yPos1, yPos2, yPos3, yPos4;
|
int xPos1, xPos2, xPos3,xPos4, yPos1, yPos2, yPos3, yPos4;
|
||||||
|
|
||||||
@ -76,14 +157,10 @@ public class MiniMap {
|
|||||||
yPos4 = 127 - (int)(corner4.z*64/16);
|
yPos4 = 127 - (int)(corner4.z*64/16);
|
||||||
|
|
||||||
|
|
||||||
drawLine(xPos1+1, yPos1, xPos2-1,yPos2, screen);
|
drawLine(xPos1+1, yPos1, xPos2-1,yPos2, screen, 0xbfbfbf);
|
||||||
drawLine(xPos2, yPos2, xPos3,yPos3, screen);
|
drawLine(xPos2, yPos2, xPos3,yPos3, screen, 0xbfbfbf);
|
||||||
drawLine(xPos3-1, yPos3, xPos4+1,yPos4, screen);
|
drawLine(xPos3-1, yPos3, xPos4+1,yPos4, screen, 0xbfbfbf);
|
||||||
drawLine(xPos4, yPos4, xPos1,yPos1, screen);
|
drawLine(xPos4, yPos4, xPos1,yPos1, screen, 0xbfbfbf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void findCorners(){
|
public void findCorners(){
|
||||||
@ -95,7 +172,7 @@ public class MiniMap {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void drawLine(int xPos1, int yPos1, int xPos2, int yPos2, int[] screen){
|
public void drawLine(int xPos1, int yPos1, int xPos2, int yPos2, int[] screen, int lineColor){
|
||||||
int start = 381 * 768 + 3;
|
int start = 381 * 768 + 3;
|
||||||
int x, y;
|
int x, y;
|
||||||
int xDirection, yDirection;
|
int xDirection, yDirection;
|
||||||
@ -121,7 +198,7 @@ public class MiniMap {
|
|||||||
if(x < 0 || x > 127 || y < 0 || y > 127)
|
if(x < 0 || x > 127 || y < 0 || y > 127)
|
||||||
continue;
|
continue;
|
||||||
color = screen[start + x + y*768];
|
color = screen[start + x + y*768];
|
||||||
screen[start + x + y*768] = ((((color&0xFEFEFE)>>1)&0xFEFEFE)>>1) + 0xbfbfbf;
|
screen[start + x + y*768] = ((((color&0xFEFEFE)>>1)&0xFEFEFE)>>1) + lineColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
@ -133,7 +210,7 @@ public class MiniMap {
|
|||||||
if(x < 0 || x > 127 || y < 0 || y > 127)
|
if(x < 0 || x > 127 || y < 0 || y > 127)
|
||||||
continue;
|
continue;
|
||||||
color = screen[start + x + y*768];
|
color = screen[start + x + y*768];
|
||||||
screen[start + x + y*768] = ((((color&0xFEFEFE)>>1)&0xFEFEFE)>>1) + 0xbfbfbf;
|
screen[start + x + y*768] = ((((color&0xFEFEFE)>>1)&0xFEFEFE)>>1) + lineColor;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,6 +249,7 @@ public class MiniMap {
|
|||||||
color = friendlyUnitColor;
|
color = friendlyUnitColor;
|
||||||
if(unitsForMiniMap[i][4] == 10001){
|
if(unitsForMiniMap[i][4] == 10001){
|
||||||
color = underAttackColor;
|
color = underAttackColor;
|
||||||
|
spawnWarningSign(xPos, yPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if((screen[index]>>24) == 0)
|
if((screen[index]>>24) == 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user