Learning Outcomes
In this assignment, you will design and implement some new game functionality. This assignment is intended to develop and assess the following unit learning outcomes:
LO1. Iteratively apply object-oriented design principles to design small to medium-size software systems, using standard software engineering notations, namely UML class diagrams and UML interaction diagrams.
LO2. Describe the quality of object-oriented software designs, both in terms of meeting user requirements and the effective application of object-oriented design concepts and principles.
L03. Apply object-oriented programming constructs, such as abstraction, information hiding, inheritance, and polymorphism, to implement object-oriented designs using a programming language (namely, Java).
LO4. Apply effective programming strategies to refactor and debug object-oriented implementations systematically and efficiently using available programming language tools.
LO5. Apply principles of software engineering practice to create object-oriented systems with peers using tools including integrated development environments (IDEs), UML drawing tools, and version control systems.
To demonstrate your ability, you will be expected to:
- design and implement further extensions to the system
- use an integrated development environment to do so
- update your UML class diagrams as required to ensure that they match your implementation
- use git to manage your team’s files and documents
The marking scheme for this assignment reflects these expectations.
Introduction
Heavy penalty will apply for editing (add, modify, delete) any classes in the game engine as it breaks the purpose of the whole learning experience.
IMPORTANT: You may change your design if you find that you need to. It is normal for the design to evolve alongside the codebase as the developers’ understanding of the requirements improves. If your design changes, you should document the changes. This includes your design rationale as well as your diagrams.
REQ1: The Overgrown Sanctuary
After successfully defeating Abxervyer, The Forest Watcher in the Ancient Woods, the player notices that a new gate is now visible. Unlocking the gate with the old key, the player finds themselves yet in another area, The Overgrown Sanctuary.
"++++.....++++........++++~~~~~.......~~~..........",
"++++......++.........++++~~~~.........~...........",
"+++..................+++++~~.......+++............",
"....................++++++......++++++............",
"...................++++........++++++~~...........",
"...................+++.........+++..~~~...........",
"..................+++..........++...~~~...........",
"~~~...........................~~~..~~~~...........",
"~~~~............+++..........~~~~~~~~~~...........",
"~~~~............+++.........~~~~~~~~~~~~..........",
"++~..............+++.......+~~........~~..........",
"+++..............+++......+++..........~~.........",
"+++..............+++......+++..........~~.........",
"~~~..............+++......+++..........~~~........",
"~~~~.............+++......+++..........~~~........"
A sample Overgrown Sanctuary map
The Overgrown Sanctuary must be implemented as a new map (separate from the maps that we have created thus far). The player still needs to unlock a gate and go through it to be able to move to the new map.
Make sure to add another Gate in The Overgrown Sanctuary map to go back to the Abxervyer’s map. You can assume that this is a separate gate that the player also needs to unlock.
If you remember, in the Assignment 2 specification, we mentioned that once the boss is defeated, the location where the boss last stood turns into a gate, which leads the player back to the Ancient Woods. Now, refactor the implementation so that this gate leads to two destinations: back to the Ancient Woods and The Overgrown Sanctuary. You may assume that future gates may also have multiple destinations.
Since the implementation of the gate needs to be modified, you need to include your design in the UML class diagram for this requirement.
A new humanoid creature emerges from the huts, which is yet another enemy that the player has to fight against, known as the “Eldentree Guardian” (represented by “e”). The huts can spawn this enemy with a 20% chance at each turn. They have 250 hitpoints and can attack the player with their limbs, dealing 50 damage with 80% accuracy. Once defeated, they have a 25% chance of dropping a healing vial and a 15% chance of dropping a refreshing flask. They also drop 250 runes when defeated. Additionally, they can wander around if the player is not nearby or follow and attack the player if the player is nearby. Finally, they can walk around in the Void with no consequences.
From the bushes, a “Living Branch” (represented by “?”) appears. The bushes can spawn this enemy with a 90% chance at each turn. They have 75 hitpoints and deal 250 damage with 90% accuracy. Once defeated, they have a 50% chance of dropping a Bloodberry. They also drop 500 runes when defeated. They cannot wander around and follow the player. However, they can attack the player if the player is nearby. If they are spawned on top of the Void, they cannot be damaged by the Void since they are immune.
Similar to previous Assignments, the new enemies cannot be spawned on or enter floors and walls.
You may want to consider the following points in the design rationale:
- How many classes would you need to create for this requirement if you used the Assignment 1 sample solution?
- Do they contain some code duplications?
- Can you think of a potential design alternative? What would be the cons of the alternative design? Which design did you end up using?
REQ2: The Blacksmith
Please note that the following actor will be added from the start of the game, not only after the player enters The Overgrown Sanctuary.
Back in the building in the Abandoned Village, the player hears the rhythmic sound of a hammer pounding against metal. Following the sound, the player discovers a blacksmith (represented by “B”) working in the dark. Approaching the blacksmith allows the player to upgrade their items and weapons.
You can assume that the blacksmith does not move around (that is, they will only stay at one spot in the building).
You can put the blacksmith in the same building where the player first spawns.
When the blacksmith is nearby, the player can upgrade the following items and weapons from their inventory:
· Each healing vial can be upgraded for 250 runes each. When consuming an upgraded healing vial, the player’s health will be increased by 80% of their maximum health
· Each refreshing flask can be upgraded for 175 runes each. When consuming an upgraded refreshing flask, the player’s stamina will be increased by 100% of their maximum stamina.
· Broadsword can be upgraded for 1000 runes. Each upgrade increases the weapon’s damage by 10 points (not increasing the weapon’s damage multiplier). To avoid making this weapon too powerful, the additional damage points from the upgrades are not affected by the damage multiplier. That is, only the initial 110 damage points of the broadsword will be multiplied by the damage multiplier, while the damage points obtained from performing the upgrades will simply be added on top of the multiplied damage points. So, if the player uses the focus skill on the broadsword that has been upgraded once, then the final damage points will be 131, which is obtained from (110 * 1.1) + 10
· Great Knife can be upgraded for 2000 runes. Each upgrade increases the weapon’s hit rate by 1 per cent.
· Giant hammer cannot be upgraded.
The player cannot sell any items to the blacksmith, and the player cannot attack the blacksmith.
REQ3: Conversation (Episode I)
Please note that this functionality will be active from the start of the game, not only after the player enters The Overgrown Sanctuary.
As the player awaits their weapons and items upgrades to complete, the blacksmith decides to share their story and experience on the land of the lords with the player.
When the blacksmith is nearby, the player should be given the option to listen to the monologue of the blacksmith. What the blacksmith says will be chosen randomly from the following list of monologue options below. Note that some options can only be performed when certain conditions are met.
The blacksmith’s monologue options:
· I used to be an adventurer like you, but then …. Nevermind, let’s get back to smithing.
· It’s dangerous to go alone. Take my creation with you on your adventure!
· If the player holds a great knife: Hey now, that’s a weapon from a foreign land that I have not seen for so long. I can upgrade it for you if you wish.
· If Abxervyer has been defeated: Somebody once told me that a sacred tree rules the land beyond the ancient woods until this day.
For example, if the player hasn’t defeated Abxervyer, hasn’t purchased a Great Knife and chooses to talk to the blacksmith, possible monologue options are 1, 2, 3, and 4. Once they buy a great knife before defeating Abxervyer, option 5 will be added to the pool of options. Once they defeat Abxervyer, option 4 will be removed, while option 6 will be added to the list of options.
REQ4: Conversation (Episode II)
This functionality is a continuation of REQ 3
Additionally, the player should be able to listen to the monologue of the isolated traveller found in the Ancient Woods (see Assignment 2 REQ 3). Similarly, what the traveller says will be one option from the following list of options, chosen at random. Some monologue options can only be performed when certain conditions are met.
Isolated traveller’s monologue options:
· Of course, I will never give you up, valuable customer!
· I promise I will never let you down with the quality of the items that I sell.
· You can always find me here. I'm never gonna run around and desert you, dear customer!
· I'm never gonna make you cry with unfair prices.
· Trust is essential in this business. I promise I’m never gonna say goodbye to a valuable customer like you.
· If the player hasn’t defeated Abxervyer: You know the rules of this world, and so do I. Each area is ruled by a lord. Defeat the lord of this area, Abxervyer, and you may proceed to the next area.
· Once the player defeats Abxervyer & they still hold the giant hammer: Congratulations on defeating the lord of this area. I noticed you still hold on to that hammer. Why don’t you sell it to me? We've known each other for so long. I can tell you probably don’t need that weapon any longer.
REQ5: A Dream?
Please note that starting from this requirement, whenever and wherever the player dies, the functionality specified below will occur. In other words, this functionality will be active from the start of the game, not only after the player enters The Overgrown Sanctuary.
During the battle, the player makes a small mistake and gets knocked out unconscious by an enemy.
The player suddenly awakens right back in the building in the Abandoned Village where their journey starts, realising that everything so far was all just a dream - or is it?
The Assignment 1 specification mentions that if the player dies due to any causes, the game ends, and a “YOU DIED” message is displayed. In this requirement, you should refactor the implementation as follows:
When the player dies, they will be respawned right back where they started their journey, which is in the building in the middle of the Abandoned Village (see Assignment 1 specification).
The maximum values of the player’s attributes will be kept as what it was before the player dies, while the value of the attributes will be reset to full. For instance, the player spawns with (150/150) hitpoints. Then, they consumed a bloodberry, which increased their maximum health to 155. Once they respawned, their hitpoint should be (155/155) instead of (150/150). This also applies to their other attributes, such as stamina.
For simplicity, even if the runes balance in the player’s wallet is 0, you can still drop it on the ground with 0 amount.
Don’t worry if the player dies due to stepping into the Void. The runes can still be dropped in the location where the player last stood (the void). It is simply not recoverable. Optionally, you could drop the runes at the location before the player enters the void. However, since this only improves the gameplay, it will not be considered when marking.
All spawned enemies (not including bosses) will be removed from the map.
For bosses, their health will be reset to full if they have not been defeated.
Unlocked gates will be locked again.
All runes dropped in previous turns that the player did not pick up will also be wiped from the map. This includes all runes dropped by enemies and the player. For instance, in the previous turn, the player dies while carrying X amount of runes, the player’s wallet balance will be reset to 0, and the X amount of runes are dropped in the last location where the player stood. However, before picking up the X amount of runes previously dropped, the player dies again. Then, the X amount of runes will be wiped from the game, as they were not picked up by the player.