Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/main/java/basewindow/BaseWindow.java
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ public abstract class BaseWindow

public static final HashMap<Integer, String> keyNames = new HashMap<>();

public float[] outOfBoundsColor = new float[]{1f, 1f, 1f, 1f};

public BasePlatformHandler platformHandler;

public ModelPart.ShapeDrawer shapeDrawer;
Expand Down Expand Up @@ -193,6 +195,14 @@ public void stopTiming()

public abstract void setColor(double r, double g, double b);

public void setOutOfBoundsColor(float r, float g, float b, float a)
{
outOfBoundsColor[0] = r / 255;
outOfBoundsColor[1] = g / 255;
outOfBoundsColor[2] = b / 255;
outOfBoundsColor[3] = a / 255;
}

public abstract void setUpPerspective();

public abstract void applyTransformations();
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/lwjglwindow/ShaderHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import org.lwjgl.opengl.GL13;

import java.nio.ByteBuffer;
import java.util.Arrays;

import static org.lwjgl.opengl.EXTFramebufferObject.*;
import static org.lwjgl.opengl.GL20.*;
Expand Down Expand Up @@ -44,6 +43,8 @@ public void createDepthTexture(int size)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, window.outOfBoundsColor);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size, size, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, (ByteBuffer) null);
glBindTexture(GL_TEXTURE_2D, 0);
}
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/tanks/gui/input/InputBindings.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ public class InputBindings
public InputBindingGroup chat = new InputBindingGroup("game.chat", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_T));
public InputBindingGroup hidePause = new InputBindingGroup("game.hidePauseMenu", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_F1));
public InputBindingGroup fullscreen = new InputBindingGroup("game.fullscreen", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_F11), new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_F10));
public InputBindingGroup perspective = new InputBindingGroup("game.perspective", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_F5));
public InputBindingGroup tilt = new InputBindingGroup("game.pitch", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_F), new InputBinding(InputBinding.InputType.mouse, InputCodes.MOUSE_BUTTON_5));
public InputBindingGroup screenshot = new InputBindingGroup("game.screenshot", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_F12));

public InputBindingGroup editorPause = new InputBindingGroup("editor.pause", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_ESCAPE));
Expand All @@ -63,6 +65,7 @@ public class InputBindings
public InputBindingGroup editorRotate = new InputBindingGroup("editor.rotate", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_R));
public InputBindingGroup editorHeight = new InputBindingGroup("editor.height", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_H));
public InputBindingGroup editorGroupID = new InputBindingGroup("editor.groupID", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_G));
public InputBindingGroup fcZoom = new InputBindingGroup("game.fcZoom", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_C));

public InputBindingGroup editorBuild = new InputBindingGroup("editor.build", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_B));
public InputBindingGroup editorErase = new InputBindingGroup("editor.erase", new InputBinding(InputBinding.InputType.keyboard, InputCodes.KEY_E));
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/tanks/gui/screen/IGameOverlayScreen.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package tanks.gui.screen;

public interface IGameOverlayScreen
{
ScreenGame getGameScreen();
}
17 changes: 13 additions & 4 deletions src/main/java/tanks/gui/screen/ScreenControlsCamera.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@

public class ScreenControlsCamera extends Screen
{
InputSelector toggleZoom = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 - 135, 700, 40, "Toggle zoom", Game.game.input.zoom);
InputSelector zoomIn = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 - 45, 700, 40, "Zoom in", Game.game.input.zoomIn);
InputSelector zoomOut = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 + 45, 700, 40, "Zoom out", Game.game.input.zoomOut);
InputSelector zoomAuto = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 + 135, 700, 40, "Toggle automatic zoom", Game.game.input.zoomAuto);
InputSelector toggleZoom = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 - 225, 700, 40, "Toggle zoom", Game.game.input.zoom);
InputSelector zoomIn = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 - 135, 700, 40, "Zoom in", Game.game.input.zoomIn);
InputSelector zoomOut = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 - 45, 700, 40, "Zoom out", Game.game.input.zoomOut);
InputSelector zoomAuto = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 + 45, 700, 40, "Toggle automatic zoom", Game.game.input.zoomAuto);
InputSelector togglePerspective = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 + 135, 700, 40, "Toggle Perspective", Game.game.input.perspective);
InputSelector cameraPitch = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 + 225, 700, 40, "Third person camera tilt", Game.game.input.tilt);
InputSelector cameraZoom = new InputSelector(Drawing.drawing.interfaceSizeX * 2 / 3, Drawing.drawing.interfaceSizeY / 2 + 315, 700, 40, "Third person camera zoom", Game.game.input.fcZoom);

public ScreenControlsCamera()
{
Expand All @@ -24,6 +27,9 @@ public void update()
zoomIn.update();
zoomOut.update();
zoomAuto.update();
togglePerspective.update();
cameraPitch.update();
cameraZoom.update();

ScreenOverlayControls.overlay.update();
}
Expand All @@ -37,6 +43,9 @@ public void draw()
zoomOut.draw();
zoomIn.draw();
zoomAuto.draw();
togglePerspective.draw();
cameraPitch.draw();
cameraZoom.draw();

Drawing.drawing.setInterfaceFontSize(this.titleSize);
Drawing.drawing.setColor(0, 0, 0);
Expand Down
193 changes: 166 additions & 27 deletions src/main/java/tanks/gui/screen/ScreenGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import basewindow.*;
import basewindow.transformation.*;
import tanks.*;
import tanks.bullet.Bullet;
import tanks.bullet.*;
import tanks.generator.LevelGeneratorVersus;
import tanks.gui.*;
import tanks.gui.screen.leveleditor.ScreenLevelEditor;
Expand Down Expand Up @@ -102,8 +102,14 @@ public class ScreenGame extends Screen implements IHiddenChatboxScreen, IPartyGa
protected boolean musicStarted = false;
protected float pausedMusicPos = 0;

public boolean zoomPressed = false;
public boolean zoomScrolled = false;
public boolean zoomPressed, zoomScrolled;

public static boolean fcZoomPressed = false;
public static double fcSensitivity = 1f;
public static double fcZoom, fcTargetZoom;
public double fcZoomLastTap, fcPitch, fcZoomCap;
public boolean selectedArcBullet = false;
public double fcArcAim;

public boolean playedIntro = false;

Expand Down Expand Up @@ -564,6 +570,9 @@ public ScreenGame()
this.drawDarkness = false;
this.drawDebugInternally = true;

float f = (float) (Level.currentLightIntensity / 255);
Game.game.window.setOutOfBoundsColor(f, f, f, 255);

Game.clouds.clear();

if (Game.currentLevel instanceof Minigame && !(Game.currentLevel instanceof Tutorial))
Expand Down Expand Up @@ -994,6 +1003,9 @@ public void update()
}
}

if (Game.game.input.perspective.isValid())
togglePerspective();

if (Game.game.input.zoom.isPressed() && playing)
{
if (Panel.autoZoom)
Expand Down Expand Up @@ -1689,13 +1701,7 @@ else if (this.shopScreen)
playing = true;
this.age += Panel.frameFrequency;

if (Game.followingCam)
{
Game.playerTank.angle += (Drawing.drawing.getInterfaceMouseX() - prevCursorX) / 200;
Game.game.window.setCursorLocked(true);
this.prevCursorX = Drawing.drawing.getInterfaceMouseX();
this.prevCursorY = Drawing.drawing.getInterfaceMouseX();
}
updateFollowingCam();

Obstacle.draw_size = Math.min(Game.tile_size, Obstacle.draw_size);
ArrayList<Team> aliveTeams = new ArrayList<>();
Expand Down Expand Up @@ -2122,7 +2128,7 @@ public static void handleRemovals()
ModAPI.removeMenus.clear();
}

public void updateGameField()
public static void updateGameField()
{
for (Movable m : Game.movables)
m.preUpdate();
Expand Down Expand Up @@ -2464,19 +2470,16 @@ else if (Panel.panel.zoomTimer >= 1)

public void setPerspective()
{
Game.game.window.clipMultiplier = 100;
Game.game.window.clipDistMultiplier = 1;

if (Game.angledView)
if (!Game.game.window.drawingShadow)
{
if (!Game.game.window.drawingShadow)
{
if (this.playing && (!this.paused || ScreenPartyHost.isServer || ScreenPartyLobby.isClient) && !ScreenGame.finished)
slant = Math.min(1, slant + 0.01 * Panel.frameFrequency);
else if (ScreenGame.finished)
slant = Math.max(0, slant - 0.01 * Panel.frameFrequency);
}
if (Game.angledView && this.playing && (!this.paused || ScreenPartyHost.isServer || ScreenPartyLobby.isClient) && !ScreenGame.finished)
slant = Math.min(1, slant + 0.01 * Panel.frameFrequency);
else if (!Game.angledView || ScreenGame.finished)
slant = Math.max(0, slant - 0.01 * Panel.frameFrequency);
}

if (Game.angledView || slant > 0)
{
this.slantRotation.pitch = this.slant * -Math.PI / 16;
this.slantTranslation.y = -this.slant * 0.05;

Expand All @@ -2496,29 +2499,143 @@ else if (ScreenGame.finished)
Game.game.window.clipMultiplier = 1;
Game.game.window.clipDistMultiplier = 100;

Tank t = focusedTank();

if (!Game.firstPerson)
{
Game.game.window.transformations.add(new RotationAboutPoint(Game.game.window, 0, 0, frac * ((Game.playerTank.angle + Math.PI * 3 / 2) % (Math.PI * 2) - Math.PI), 0, -Drawing.drawing.statsHeight / Game.game.window.absoluteHeight / 2, 0));
Game.game.window.transformations.add(new RotationAboutPoint(Game.game.window, 0, 0, frac * ((t.angle + Math.PI * 3 / 2) % (Math.PI * 2) - Math.PI), 0, -Drawing.drawing.statsHeight / Game.game.window.absoluteHeight / 2, 0));
Game.game.window.transformations.add(new Translation(Game.game.window, 0, 0.1 * frac, 0));
Game.game.window.transformations.add(new RotationAboutPoint(Game.game.window, 0, -Math.PI * 0.35 * frac, 0, 0, 0, -1));
Game.game.window.transformations.add(new RotationAboutPoint(Game.game.window, 0, -Math.PI * 0.35 * frac + fcPitch, 0, fcPitch * 3, fcPitch * 3, -1));
Game.game.window.transformations.add(new Translation(Game.game.window, 0, 0, 0.5 * frac));
}
else
{
Game.game.window.transformations.add(new RotationAboutPoint(Game.game.window, 0, 0, frac * ((Game.playerTank.angle + Math.PI * 3 / 2) % (Math.PI * 2) - Math.PI), 0, -Drawing.drawing.statsHeight / Game.game.window.absoluteHeight / 2, 0));
Game.game.window.transformations.add(new RotationAboutPoint(Game.game.window, 0, 0, frac * ((t.angle + Math.PI * 3 / 2) % (Math.PI * 2) - Math.PI), 0, -Drawing.drawing.statsHeight / Game.game.window.absoluteHeight / 2, 0));
Game.game.window.transformations.add(new Translation(Game.game.window, 0, 0.1 * frac, 0));
Game.game.window.transformations.add(new RotationAboutPoint(Game.game.window, 0, -Math.PI * 0.5 * frac, 0, 0, 0, -1));
Game.game.window.transformations.add(new Translation(Game.game.window, 0, 0.0575 * frac, 0.9 * frac));
}

if (fcZoom > 0)
Game.game.window.transformations.add(new ScaleAboutPoint(Game.game.window, 1, 1, fcZoom + 1, 0, 0, 0));

Game.game.window.loadPerspective();
}
}

public void updateFollowingCam()
{
if (!Game.followingCam || Game.playerTank == null || Game.playerTank.destroy)
return;

ItemBar b = Game.player.hotbar.itemBar;
selectedArcBullet = b.selected >= 0 && b.selected < ItemBar.item_bar_size && b.slots[b.selected].item instanceof ItemBullet && ((ItemBullet) b.slots[b.selected].item).bullet instanceof BulletArc;

Game.playerTank.angle += (Drawing.drawing.getInterfaceMouseX() - prevCursorX) * fcSensitivity / 150;
Game.game.window.setCursorLocked(true);
if (Game.game.input.tilt.isPressed())
fcPitch += (Drawing.drawing.getInterfaceMouseY() - this.prevCursorY) * fcSensitivity * 5e-4;
else if (selectedArcBullet)
fcArcAim += (this.prevCursorY - Drawing.drawing.getInterfaceMouseY()) * (fcSensitivity * 3);
fcPitch = Math.max(0, Math.min(0.5, fcPitch));
Game.game.window.setCursorPos(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2);
updateMousePos();

if (selectedArcBullet)
{
Bullet bullet = ((ItemBullet) b.slots[b.selected].item).bullet;
fcArcAim = Math.max(bullet.getRangeMin(), Math.min(bullet.getRangeMax() > 0 ? bullet.getRangeMax() : Double.MAX_VALUE, fcArcAim));
}

fcZoomPressed = Game.game.input.fcZoom.isPressed();
if (Math.abs(fcTargetZoom - fcZoom) < 0.05)
fcZoom = fcTargetZoom;
else
fcZoom += (fcTargetZoom - fcZoom) / 10;

if (fcZoomPressed)
{
if (Game.game.input.fcZoom.isValid())
{
if (age - fcZoomLastTap < 50)
fcTargetZoom = 0;

fcZoomLastTap = age;
Game.game.input.fcZoom.invalidate();
}

if (Game.game.window.validScrollUp && fcTargetZoom < 0.9)
{
fcTargetZoom += 0.1;
Game.game.window.validScrollUp = false;
}

if (Game.game.window.validScrollDown && fcTargetZoom > -0.9)
{
fcTargetZoom -= 0.1;
Game.game.window.validScrollDown = false;
}
}
}

private static int perspectiveID = 0;

public void togglePerspective()
{
if (Game.game.window.shift)
perspectiveID--;
else if (Game.game.window.pressedKeys.contains(InputCodes.KEY_LEFT_CONTROL))
perspectiveID = 0;
else
perspectiveID++;

perspectiveID = (perspectiveID + 4) % 4;

switch (perspectiveID)
{
case 0:
Game.angledView = false;
Game.followingCam = false;
Game.firstPerson = false;
break;
case 1:
Game.angledView = true;
Game.followingCam = false;
Game.firstPerson = false;
break;
case 2:
Game.angledView = false;
Game.followingCam = true;
Game.firstPerson = false;
break;
case 3:
Game.angledView = false;
Game.followingCam = true;
Game.firstPerson = true;
break;
}

if (Game.followingCam)
{
Drawing.drawing.movingCamera = true;
Panel.autoZoom = false;
Panel.zoomTarget = -1;
}

this.enableMargins = !Game.followingCam;
Game.game.input.perspective.invalidate();
}

public void updateMousePos()
{
this.prevCursorX = Drawing.drawing.getInterfaceMouseX();
this.prevCursorY = Drawing.drawing.getInterfaceMouseY();
}

@Override
public void draw()
{
this.showDefaultMouse = !(((!this.paused && !this.npcShopScreen) && this.playing && Game.angledView || Game.firstPerson));
this.showDefaultMouse = !(!this.paused && !this.npcShopScreen && this.playing && (Game.angledView || Game.followingCam));

this.setPerspective();

Expand Down Expand Up @@ -2663,7 +2780,7 @@ public void draw()
if (!(paused && screenshotMode) && Game.player.hotbar.enabledItemBar)
Game.player.hotbar.itemBar.drawOverlay();

if (!this.showDefaultMouse)
if (!this.showDefaultMouse && Game.angledView)
Panel.panel.drawMouseTarget(true);

Game.game.window.transformations.clear();
Expand Down Expand Up @@ -3153,6 +3270,28 @@ else if (name != null)
Drawing.drawing.setInterfaceFontSize(this.textSize);
}

public static ScreenGame getInstance()
{
if (Game.screen instanceof ScreenGame)
return (ScreenGame) Game.screen;
if (Game.screen instanceof IGameOverlayScreen)
return ((IGameOverlayScreen) Game.screen).getGameScreen();
return null;
}

public static Tank focusedTank()
{
ScreenGame g = getInstance();
if (g == null || Game.playerTank == null)
return Game.playerTank;

if (Game.playerTank.destroy && g.spectatingTank != null)
return g.spectatingTank;

return Game.playerTank;
}


public static boolean isUpdatingGame()
{
if (!(Game.screen instanceof ScreenGame))
Expand Down
Loading