Skip to content
This repository has been archived by the owner on Sep 29, 2024. It is now read-only.

Releases: SE-TINF22B6/Underwatch

v1.0.1-release

25 Jun 14:13
Compare
Choose a tag to compare

What's Changed

Full Changelog: v1.0.0-release...v1.0.1-release

v1.0.0-rc.1

13 Jun 06:39
Compare
Choose a tag to compare

Presentation Release

Hopefully everything works 🤞🏾

What's Changed

Full Changelog: v0.0.5-alpha...v1.0.0-release

Semester 4 Week 7

27 May 18:04
Compare
Choose a tag to compare
Semester 4 Week 7 Pre-release
Pre-release

Hello and welcome to this weeks development progress blog for our little game Underwatch 🎮

Code Refactoring

This week we decided to do a humongous refactoring of our code base, which happened to be long overdue and also this weeks task. Taking a look at the core problem we had to work around all this time:

In order for the path finding to work we rasterize the world into a 32x32 Grid and represent each of the cells as a single point in an array only containing information about whether or not this cell shall be considered walkable or not.

We had to use arcane combinations of -1 and +1 to add connections to the neighboring cells.

                     // check if wall is above and below
                     if (getNode(x, y + 1).type == FlatTiledNode.TILE_WALL
                             && getNode(x, y - 1).type == FlatTiledNode.TILE_WALL) {
-                        // W
-                        addConnection(n, -1, 0);
-                        // E
-                        addConnection(n, 1, 0);
+                        addConnection(n, Direction.W, Direction.E);
                         continue;
                     }
                     // check if wall is left and right
                     if (getNode(x + 1, y).type == FlatTiledNode.TILE_WALL
                             && getNode(x - 1, y).type == FlatTiledNode.TILE_WALL) {
-                        // S
-                        addConnection(n, 0, -1);
-                        // N
-                        addConnection(n, 0, 1);
+                        addConnection(n, Direction.N, Direction.S);
                         continue;
                     }
                     // check if wall is above
                     if (getNode(x, y + 1).type == FlatTiledNode.TILE_WALL) {
-                        // W
-                        addConnection(n, -1, 0);
-                        // S
-                        addConnection(n, 0, -1);
-                        // E
-                        addConnection(n, 1, 0);
-                        // N
-                        addConnection(n, 0, 1);
-                        // SE
-                        addConnection(n, 1, -1);
-                        // SW
-                        addConnection(n, -1, -1);
+                        addConnection(n, Direction.N, Direction.E, Direction.S, Direction.W, Direction.SE, Direction.SW);
                         continue;
                     }
         }
     }
     private void addConnection(FlatTiledNode n, int xOffset, int yOffset) {
         FlatTiledNode target = getNode(n.x + xOffset, n.y + yOffset);
-        if (target.type != FlatTiledNode.TILE_WALL) n.getConnections().add(new FlatTiledConnection(this, n, target));
+        if (target.type != FlatTiledNode.TILE_WALL)
+            n.getConnections().add(new FlatTiledConnection(this, n, target));
+    }
 }

This is very prone to errors made by the developer, so we decided to refactor it with the use of a private enum as well as allowing a flexible amount or arguments with the varargs feature of Java.

+    private enum Direction {
+        N, E, S, W, NE, NW, SE, SW
+    }
+
+    private void addConnection(FlatTiledNode n, Direction... directions) // throws Exception
+    {
+        // if (directions.length > 8 || directions.length < 0) {
+        // throw new Exception("Directions are fucked up");
+        // }
+        for (Direction direction : directions) {
+            switch (direction) {
+                case N:
+                    addConnection(n, 0, 1);
+                    break;
+                case E:
+                    addConnection(n, 1, 0);
+                    break;
+                case S:
+                    addConnection(n, 0, -1);
+                    break;
+                case W:
+                    addConnection(n, -1, 0);
+                    break;
+                case NE:
+                    addConnection(n, 1, 1);
+                    break;
+                case NW:
+                    addConnection(n, -1, 1);
+                    break;
+                case SE:
+                    addConnection(n, 1, -1);
+                    break;
+                case SW:
+                    addConnection(n, -1, -1);
+                    break;
+                default:
+                    break;
+            }
+        }
+   }

We took inspiration from the Book Clean Code, Chapter 3.1, "Funktionen sollten klein sein[...]" to make this refactoring and are quite happy with the results it yielded.

Progress on the Game 🎮

  • We added new collectables such as HP potions as well as speed potions
  • The came can now be won by collecting the holy grail
  • New sounds, weapons and assets
  • Some initial efforts on balancing the weapons and enemies
  • A crucial bug responsible for crashing the game after a few seconds of gameplay has been squashed

Bugfixes on the Webpage 🐛

  • Added an apply filter button, so we don't DDOS our backend server

What's Changed

Full Changelog: v0.0.4-alpha...v0.0.5-alpha

Semester 4 Week 6

23 May 08:29
Compare
Choose a tag to compare
Semester 4 Week 6 Pre-release
Pre-release

Hello and welcome to todays update on the progress of our game "Underwatch".

Assignment

This weeks task was to choose three metrics which we can use to measure the quality of our written code. Since we are working on a game in Java it makes a lot of sense to just apply the metrics we can find for object orientation to it.

We used the handy tool ck to automatically generate all relevant statistics based on the project code and picked the metrics Lines of Code, Depth Inheritance Tree and Response for Class as we think those can be representative of the quality in our code base.

  • Depth Inheritance Tree is a metric which can tell us something about the code reuse within our project. With a higher count being more prone to bugs as well as more logic being reused. According to the tools output we have this metric laying between 1 and 4 which we consider as quite optimal.
  • Response for Class counts the responses a class can generate. Also indexing referenced classes this metric can skyrocket quite quickly. According to research a value between 0-50 is most optimal here. Our calculated rfc lays between 0-42 (with one outlier at 59). This tells us that we're mostly doing good, but should consider refactoring the outlier class.
  • Lines of Code per class tell us something about the complexity of our classes. If this value get's too high we have to consider that we might have created a god class, which is too mighty and often leads to many bugs down the line. According to ck's output we lay between 0-200 which we interpret as being pretty good, since most of the time boilerplate code, such as getters and setters are already eating up a majority of the code lines resulting in the implemented logic being very concise.

We hope you found this rundown of our chosen metrics interesting.

Progress on the Game

In the past week we added new interaction elements, namely Weapon Boxes, Ammo Boxes, Health Boxes as well as a Holy Grail which will serve as the games winning end.
Additionally pathfinding has received an update, resulting in enemies now walking around obstacles successfully.
We created a Head Up Display, which will display necessary stats of the game run for the player.

image

Enemies now come in multiple versions, some goblins for the outside world as well as some skeletons for the dungeon.

image

The weapon inventory now carries over to the next level and the web page has been updated to show the lore of the game.

As per usual. Thank you for reading.
~ Underwatch Team

What's Changed

Full Changelog: v0.0.3-alpha...v0.0.4-alpha

v0.0.3-alpha

16 May 14:13
d3c33a7
Compare
Choose a tag to compare
v0.0.3-alpha Pre-release
Pre-release

Hello and Welcome to the Patch Notes for v0.0.3-alpha of Underwatch

We worked hard to bring you this release which features many improvements on the web page, as well as to the core mechanics of the gameplay and the graphic style.

Features

  • Complete overhaul of the enemies, there are now multiple types, which can get out their weapon and shoot at you
  • Improved lighting system, allowing us to create outdoor maps as well as some dungeon maps which look arguably more spooky
  • Weapon handling has been improved with ammo, different bullet types and weapon switching
  • Teleporters have been added
  • Interaction Objects (Loot Boxes) have been added

Known Bugs

🏗️ The game crashes when you try to enter the fourth level (there is no such level yet)

~ The Underwatch Team

What's Changed

Full Changelog: v0.0.2-alpha...v0.0.3-alpha

v0.0.2-alpha

21 Apr 12:29
547bea5
Compare
Choose a tag to compare
v0.0.2-alpha Pre-release
Pre-release

Hello and Welcome to the Patch Notes for v0.0.2-alpha of Underwatch

We worked hard to bring you this release which features many improvements in UI/UX as well as some changes to the main gameplay mechanic.

Features

  • customizable input settings
  • adjustable volume
  • replace some fillers with content (most notably the main menu)
  • new approach how we want to design maps as well as the gameplay in general
  • new animations for walking into directions
  • upload of highscores
  • new testing maps

Known Bugs

  • When dodging the game crashes (#144)

As per usual, if you encounter any bugs or have feature requests don't hesitate to reach out to us.

~ The Underwatch Team

What's Changed

New Contributors

Full Changelog: v0.0.1-alpha...v0.0.2-alpha

v0.0.1-alpha

02 Nov 09:41
Compare
Choose a tag to compare
v0.0.1-alpha Pre-release
Pre-release

This is the initial release of our game Underwatch. There is not much to be seen here!