Finished the final pass today.Most of the time went into balancing the difficulty.
Enemy speed now increases based on the current wave, so the last few waves become genuinely hectic without feeling completely unfair.I also added a victory screen for completing all 12 waves.
The game-over screen now highlights when the player beats their previous high score.
Finally, I removed leftover console logs, cleaned up a few rough sections of code, and checked the full game from start to finish.
Twelve commits, no external dependencies, and everything built with plain JavaScript
Added sound effects today without using any external audio files.
Everything is generated through the Web Audio API. The laser sound is made from a square wave that quickly drops in pitch.
Explosions use filtered noise with a short volume envelope, and power ups play a quick rising sequence of notes.The sounds are simple, but they add far more to the game than I expected.
No major gameplay changes today. I focused entirely on making the existing mechanics feel better.
Enemies now break into small particles when destroyed instead of simply disappearing.
The player briefly flashes white after taking damage, and newly spawned enemies fade in rather than suddenly appearing on screen.
They are all fairly small changes, but together they make shooting and hitting things feel much more satisfying.
The later waves were becoming almost impossible, so today was all about powerups.Destroyed enemies
now have a 10% chance to drop one. There are three types: a shield that rotates around the player, rapid fire that reduces the weapon cooldown, and a wide shot that fires three bullets at once.
Each effect lasts for a limited amount of time, so I also added small HUD indicators showing which power-ups are active and how much time they have left.
Worked on the HUD today. The score and lives are now drawn directly onto the canvas so they match the rest of the game.
I also added a kill streak multiplier. It increases as you destroy enemies without taking damage and can reach a maximum of 5x.
It gives the player a reason to take more risks instead of always staying near the bottom of the screen.Lives are displayed using small ship icons rather than a number, and the high score is now saved with localStorage, so it remains there after closing or refreshing the page.
The enemy spawning code was starting to become a mess,
so I rebuilt it as a wave system.There are now 12 planned waves.
Each one controls which enemies appear, how many spawn, and how quickly they enter. Once a wave is cleared, the game pauses for a moment, displays a warning message, and then begins the next one.
This made a much bigger difference than I expected. The game now has a proper sense of progression instead of feeling like enemies are appearing randomly forever.
The original enemy became predictable pretty quickly, so I added two more types.
One moves from side to side in a wave pattern, while the other stops near the top of the screen and fires back at the player.
Enemy bullets use their own reusable object pool, separate from the player’s bullets.
I also added a short invincibility period after the player takes damage. Without it, getting caught inside several overlapping bullets could remove every life almost instantly.
The game is noticeably harder now.
Devlog 5
Added the first enemy today. It is a small burnt orange shape that appears at a random position near the top of the screen and moves straight downward.
I set up a basic spawn timer and added collision detection between the player’s bullets and the enemies.
Enemies can now be destroyed, and each kill increases the score. Watching the first one disappear after being hit was probably the first moment the project actually felt like a game.
Shooting works now.
Instead of constantly creating and deleting bullet objects, I made a pool of 100 bullets that get reused throughout the game.
When a bullet is fired, one inactive bullet is switched on, and once it leaves the screen, it becomes available again. It should help avoid unnecessary slowdowns during longer sessions.I also added a short firing cooldown so holding the button down does not fill the entire screen with bullets.
Devlog 3
Got the player ship onto the screen today. I kept the design simple: a small slate cyan triangle drawn directly on the canvas.
The first movement system felt really stiff because the ship started and stopped instantly.
I replaced it with acceleration and friction, so now it gradually picks up speed and slides to a stop. It feels much better. I also added a subtle engine glow while the ship is moving and stopped it from leaving the screen boundaries.
DEVLOG 2
Added the starfield today. It uses three layers of small canvas drawn stars, with each layer moving at a different speed to give the background a bit of depth.
No images involved.I also changed the plain black background to a very dark navy, which already makes it feel more like space.
The main menu is in now too, with the game title and a blinking “Press Enter to Start” message in a simple typewriter style font. It is finally beginning to look like a game.
DEVLOG 1
Started with a completely blank screen today.
No libraries or frameworks, just plain HTML and JavaScript.
I spent most of the time setting up the basic game loop so movement should stay smooth across different screens and refresh rates.
Theres just blank screen ( space themed background)
and i changed the mouse pointer
Devlog 10 - Subject Editing Feature
I added a feature that allows users to edit existing subjects.
Previously, once a subject was added, the only option was to remove it and create a new one. This was inconvenient if a user made a typing mistake or wanted to rename a subject.
To improve usability,
I added an Edit button to every subject card. When the button is clicked, the user can enter a new subject name and update the information directly from the planner.
I tested the feature with different subject names and also added validation to prevent empty values from being saved.
I also updated the local storage data after editing so the changes remain available even after refreshing the page.
Devlog 9 - Clear All Subjects Feature
I added a feature that allows users to remove all subjects at once.
Previously, subjects could only be removed one by one.
This worked fine for a small number of subjects, but it could become time consuming if a user wanted to start over with a new study plan.
To solve this, I added a Clear All Subjects button. When the button is clicked, all subject cards are removed from the page and the default empty message is shown again.
I also made sure that the saved data in local storage is cleared at the same time.
This prevents old subjects from coming back after refreshing the page.
After implementing the feature, I tested it with different numbers of subjects to make sure everything was removed correctly.
Devlog 8 - Local Storage Support
I worked on saving data in the browser.
Before this update, all subjects disappeared whenever the page was refreshed.
This meant users would lose their information every time they closed or reloaded the website.
To improve this, I added local storage support.
Now the planner saves subject information directly in the browser. When the page loads again, the saved subjects are displayed automatically.
I spent some time learning how local storage works and testing different situations such as adding subjects, removing subjects, and refreshing the page.
This helped me make sure the saved data stays updated.
Devlog 7 - Exam Countdown Feature
I added an exam countdown feature to the Study Planner.
Each subject already had an exam date, but the date by itself was not very useful. To make the information easier to understand,
I added a countdown that shows how many days are left until the exam.
When a subject is created, the planner now calculates the difference between the current date and the selected exam date.
The result is displayed directly below the exam date.
I also handled a few different situations. If no exam date is selected, the planner shows a message to let the user know.
If the exam date is today, a special message is displayed. If the date has already passed, the planner will show that as well.
After adding the countdown feature, I tested it with different dates to make sure the calculation worked correctly.
Devlog 6 - Progress Tracking
Today I added a progress tracking feature to the Study Planner.
The planner already allowed users to create subjects, add tasks, and mark tasks as completed. To make it easier to see overall progress, I added a progress bar for each subject.
The progress bar updates automatically based on how many tasks have been completed.
If no tasks are finished, the progress stays at 0%. As tasks are completed, the percentage increases and the progress bar grows.
I spent some time testing different situations such as adding new tasks, completing tasks, and unchecking completed tasks. This helped make sure the progress always shows the correct value.
I also added a small percentage display above the progress bar so users can quickly see their current progress without needing to count tasks.
Devlog 5 - Task Completion Feature
I improved the task system by adding a way to mark tasks as completed.
Before this update, users could add study tasks, but there was no way to show which tasks had already been finished. To solve this,
I added a checkbox next to every task.
When a checkbox is selected, the task text gets a line through it.
I also reduced the opacity a little so completed tasks look different from active ones.