A game by
___ _____ ______________
/ | / ___// ____/ _/ _/___
/ /| | \__ \/ / / / / //_ /
/ ___ |___/ / /____/ /_/ / / /_
/_/ |_/____/\____/___/___/ /___/
and
_________ __ __
\__ ___/___________ ____ | | __ _____ _____ | | __ ___________
| | \_ __ \__ \ _/ ___\| |/ // \\__ \ | |/ // __ \_ __ \
| | | | \// __ \\ \___| <| Y Y \/ __ \| <\ ___/| | \/
|__| |__| (____ /\___ >__|_ \__|_| (____ /__|_ \\___ >__|
\/ \/ \/ \/ \/ \/ \/
In "Abyssal Hymn," embark on a mesmerizing journey alongside our main "protagonist" Nakuru, a courageous young girl on a quest to uncover the mystical melodies scattered across a multitude of enchanting realms. From the depths of dense forests to the ethereal heights of celestial skies, and even the infernal depths of both hellish abysses and heavenly realms, immerse yourself in a captivating adventure spanning across diverse landscapes.
As Nakuru, players will harness a versatile set of movement abilities, including the nimble maneuvers of crawling, swift ground and aerial dashes, graceful double jumps, and the acrobatic prowess of wall sliding and jumping. But the journey doesn't end with traversal alone – wield Nakuru's trusty sword to engage in exhilarating combat encounters, mastering the art of parrying bullets amidst the harmonious chaos of each environment.
With each music note collected, unlock fragments of an ancient melody, weaving together the fabric of a profound Abyssal Hymn that holds the key to unlocking the mysteries of the universe. But beware, for challenges and adversaries lie in wait, testing Nakuru's courage and resolve at every turn.
Dive deep into the depths of imagination and embark on an unforgettable odyssey through the symphonic wonders of "Abyssal Hymn," where the power of music serves as a beacon of hope amidst the darkness, guiding Nakuru towards her destiny.
Yea gonna be honest I am too focus on functionality of the game I completely neglect the story 😭
-
Download Msys2 on the officical website
-
Once done installing, open the Mingw64.exe
-
Do these things in order
$ pacman -Syu
- Close then restart
$ pacman -Su
$ pacman -S git global
$ pacman -S git
$ pacman -S git mingw-w64-x86_64-gcc base-devel
$ pacman -S mingw-w64-x86_64-clang base-devel
- Note: Just press Enter whenever they asked you to confirm stuff
-
Include in the PATH user environment variables
%your_msys_folder%/mingw64/bin
%your_msys_folder%/usr/bin
-
~
: executeCommand.a
. -
/
: open/close editor. -
Ctrl
+/
: minimize/maximize editor. -
M1
(drag): place block. -
M2
(drag): delete block. -
scroll
: change block index. -
Ctrl
+m1
: change block direction. -
Ctrl
+m2
: split block into1
x1
block. -
Ctrl
+scroll
: change block type.
Delete
: delete the last block (highest index).Global
: convert blocks on map into "error-proof" blocks.Save
: save themap
toblock_<direction>.csv
.Load
: loadblock_<direction>.csv
intomap
.
-
PARTS: (not in a linear order):
- Split: Split every block into
row
/column
. - Sort: Sort every block in the ascending
X
/Y
(priority) direction. - Merge: Merge block into
row
/column
.
- Split: Split every block into
-
PROCESSES:
- Blocks are split into both
row
andcolumn
, becoming1
x1
blocks. - Blocks are sorted in the ascending
X
direction. - Blocks are merged into
column
. - Blocks are sorted in the ascending
Y
direction. - Blocks are merged into
row
to become rectangle
- Blocks are split into both
-
REASONS:
Player
block collision forwall_sliding
cannot work properly for any seperate vertically adjacent blocks due to faulty coding (sorry about that) therefore blocks must be vertically merged.
-
ADDITIONAL NOTES:
- Live Blocks: singular (
1
x1
) blocks that are placed using editor. - After
Global
:- Live Blocks became static and can no longer be tampered using the live editor (Except using
Delete
). - The order and number of blocks will not be the same, therefore
Delete
became unstable.Delete
should only be use on Live Blocks.
- Live Blocks became static and can no longer be tampered using the live editor (Except using
- Live Blocks: singular (
- 2d platformer
- Yes
- health (max 3), mp (for ranged attacks, later stage of dev)
- Update
21/5
- Getting from the start to the end of the stage, beating enemies along the way, collecting items for power up, exploring for secrets
- Walk, crouch, crawl, ground dash, crouch dash, air dash, jump, charged jump, double jump, melee attack, ranged attack
- Small slime, big skeleton, … (later stage of development)
- Sunlight Valley - Standard Green Zone (2 section: outside field, inside valley)
- Snowy Canyon - Standard Snowy Zone (2 section: outside snow, inside mountain)
- Dusty Mirage - Standard Desert Zone (2 section: outside desert, inside pyramid)
- Ancient Temple - Jungle Temple Area (2 section: outside jungle, inside temple)
- Deep Cavern - Standard Cave Zone (just cave)
- Dead Ahead - Haunted Map with ghost (spooky, 2 section: outside forest, inside mansion)
- Sea Horizon - Beach Map (2 section: beach, sea)
- Cloud Highway - Sky Map (endgame content, extremely hard platforming)
Map | Background | Platform | Logic Platform | Enemy | Boss |
---|---|---|---|---|---|
Sunlight Valley | Done | ||||
Snowy Canyon | Done | ||||
Dusty Mirage | Done | ||||
Ancient Temple | Done | ||||
Deep Cavern | Done | ||||
Dead Ahead | |||||
Sea Horizon | |||||
Cloud Highway |
- To be decided
- To be decided
Movement and game design planning:
- #Asciiz taking charge of sprite work for main character, some level assets can be borrowed online
- Wall jump (press jump while grabbing wall to jump to an adjacent wall)
- Dash, Air dash (upgrade, Ultrakill like, starts at 1, upgrade to 3 bars)
- Slide: affected by speed, low speed: crawl, high speed: slide (B button/down)
- Melee: smack, 2 hit swing, 1 charge attack, air swing, wall swing, parry flying objects
- Ranged: throw jellyfish, parry the jellyfish more velocity & dmg
- slime, ranged enemy, ...
- C++, using the SDL library for display and sound output (foreshadowing)
- Java wasn’t considered because of the lack of performance and because I f*cking hate java lmao
- Use case, component diagram finished, ready for development
- Creating a demo version, with only display output
- Draft version of movement finished, able to move left to right, jump
- Added fps control, allowing for consistent framerates
- Drawing sprites, making sprites sheets, indexing actions, adding code for indexes
- Debugging, adding
object2d
- Added double jump, crawl, dash, added animations for the new moves
- Added demo block tile (ground)
- Cleaning up the code
- Added
Hud
- Added
Decoration
(static and dynamic) - Added BGM (demo)
- Added functional
blocks
- Added hitboxes
- Added
player collision
- Air/ground dash improved
- Added crouch dash
- Added
Maps
- Improved code readability
- Improved movement flow
- Added crouch under ceiling limit
- Combined
dynamic
andstatic
decorations
into one classDecoration
,Decoration
now inheritObject2D
- Implement grid style for block, decoration placement in stages
- Moving block logic implementation, setting up debug mode (printing grid lines, grid positions, add godmode)
- Design and import
Map1
layout
- Fixes hitbox
- Reorder and split some methods for more consistency: seperation between heavy performance logic like
player movement/collision
anddrawing
- Implemented
Block Engine
: combine many adjacent block into a singular retangle to reduce collision logic - Clean up code
- Added
Npc
- Combat finished (range attack, parry, charged attack)
- Separating
input
from movement calculation, allowing for player control outside of just player character (for menu navigation) Map1
finished (not really)Menu
concept and demo- Added
Item
- Added
Collision
- Maps’ components are now created/loaded from
<component>.csv
files, no more code, only numbers and letters
- Added dynamic parallax background that correspond with the player movement
- Input can now exist in 3 states:
Press
: for instant actionHold
: for repeating actionThreshold
: similar to Hold but only start trigger after a certain time (threshold)
- Clean up old input method for the combat charge attack
-
Object2D
has additional method for boundary checking - Added class
World
-
Maps
are now a part ofWorld
, player can switch betweenMaps
using theswitchMap()
function - Each map now includes:
-
Global Method
: runs regardless of where you are on the world -
Active method
: only runs with the player presence
-
- Door allows player to move to a different Location{...}
-
Location
: {map index
,spawn x
,spawn y
}$\Rightarrow$ Player can move between location usingTransition
(from Object2D boundary method) or usingDoor
-
- Includes a lot of functions for map manipulation
- Flexible syntax
- Current Map Component Manip:
Block
,Player
- Includes a user-friendly interface allowing for an easier time making map
- Includes several useful script:
- Convert LDTK
map.csv
file into a map template (contain the structure but no textures) - Perform the
block engine
's merging adjacent block features tomap.csv
itself beforehand instead of doing so in runtime
- Convert LDTK
- Added an independent
background speed
for moving component like clouds, wind, etc - Fixes
background size ratio
being affected by the window width and height by making it expand/shrink with respect to a specific window size's property$\Rightarrow$ Background always fits the screen but remains true to original image - Fixes background jittering when entering new map
- Fixes background snapping when entering a
camera unfocus
section (section wherecamera
no longer depends onplayer
)
- Libraries are now
x64
instead ofx32
$\Rightarrow$ More compatibility with modern system + Higherlong
value (max: 2^64 - 1
) - Update
g++
from6.3.0
to13.2.0
$\Rightarrow$ Added a new library previously incompatible:-
SFML
for audio playback - Removing
SDL_mixer
from libraries list due to bad performance and bug infestation
-
- Created class
Audio
, each map has their own BGMs playlist with simple properties: {music’s paths
,delays
,random playlist flag
}
Speed
(bothhorizontal
andvertical
) is now dynamically adjusted, no longer rigidly constrained to thespeed limit
once it exceeds the maximum threshold.- If
speed
remains above thelimit
for a certain period of time, it will automatically ease back to thelimit
instead of a "snap back to reality"
- Added destructors and memory freeing methods to every component in
map
to avoid memory leakage
- Created a dynamic
audio object
: audio get louder as player get closer, as well as the ability to override the background music
- ADDED MULTIPLAYER (concept): Multiple
Player
entities can exist in game, opening up opportunities for functioning multiplayer
Muliplayer
is now functioning (in demo stages, bugs and missing interactions to be expected)Map Components
now have more interactions with each seperateplayer
Camera
dynamically shift to include allplayers
on screen- REWORKED
input
for more compatibility with the newmultiplayer
:- Each
player
now has a seperate input method for multiple controller support (still a WIP) - Improve
input
code readability by explicitly defining keys' by theirname
instead of their indexsnumber
- Added more methods for involvement with the
map
:- Accurate
map
position based on themouse position
- Accurate
offset
frommain player
- Accurate
- Apply the
hold/threshold/threspeak
paradigm fromkey input
tomouse input
- Added
wheel
value for scroll direction
- Each
- Working opening
Intro
sequence - Complete
Menu
andPause
rework (still under development)
- Added
SFX
to actions like walking, jumping, dashing, etc...
- Asciiz (add me on steam I'm 9k elo (I have been cooldown 4 times for team killing for fun) in CS2: 1263698907).
- Trackmaker.
- ChatGPT for the introduction paragraph lol.