diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..49b36c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +steam/ +builds/ diff --git a/arena.lua b/arena.lua index 0746a14..38996db 100644 --- a/arena.lua +++ b/arena.lua @@ -12,7 +12,9 @@ function Arena:on_enter(from, level, units) self.hfx:add('condition2', 1) self.level = level or 1 self.units = units - self.logo = true + + steam.friends.setRichPresence('steam_display', '#StatusFull') + steam.friends.setRichPresence('text', 'Arena - Level ' .. self.level) self.floor = Group() self.main = Group():set_as_physics_world(32, 0, 0, {'player', 'enemy', 'projectile', 'enemy_projectile'}) @@ -179,7 +181,7 @@ function Arena:on_enter(from, level, units) if self.level == 18 and self.trailer then Text2{group = self.ui, x = gw/2, y = gh/2 - 24, lines = {{text = '[fg, wavy]SNKRX', font = fat_font, alignment = 'center'}}} - Text2{group = self.ui, x = gw/2, y = gh/2, sx = 0.5, sy = 0.5, lines = {{text = '[fg, wavy_mid]try the demo & wishlist!', font = fat_font, alignment = 'center'}}} + Text2{group = self.ui, x = gw/2, y = gh/2, sx = 0.5, sy = 0.5, lines = {{text = '[fg, wavy_mid]wishlist now!', font = fat_font, alignment = 'center'}}} Text2{group = self.ui, x = gw/2, y = gh/2 + 24, sx = 0.5, sy = 0.5, lines = {{text = '[light_bg, wavy_mid]music: kubbi - ember', font = fat_font, alignment = 'center'}}} end end @@ -187,7 +189,7 @@ function Arena:on_enter(from, level, units) if self.level == 1 then local t1 = Text2{group = self.floor, x = gw/2, y = gh/2 + 2, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]<- or a -> or d', font = fat_font, alignment = 'center'}}} local t2 = Text2{group = self.floor, x = gw/2, y = gh/2 + 18, lines = {{text = '[light_bg]turn left turn right', font = pixul_font, alignment = 'center'}}} - local t3 = Text2{group = self.floor, x = gw/2, y = gh/2 + 46, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]s - mute sfx', font = fat_font, alignment = 'center'}}} + local t3 = Text2{group = self.floor, x = gw/2, y = gh/2 + 46, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]n - mute sfx', font = fat_font, alignment = 'center'}}} local t4 = Text2{group = self.floor, x = gw/2, y = gh/2 + 68, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]m - mute music', font = fat_font, alignment = 'center'}}} t1.t:after(8, function() t1.t:tween(0.2, t1, {sy = 0}, math.linear, function() t1.sy = 0 end) end) t2.t:after(8, function() t2.t:tween(0.2, t2, {sy = 0}, math.linear, function() t2.sy = 0 end) end) @@ -256,7 +258,7 @@ function Arena:update(dt) self.paused = true self.paused_t1 = Text2{group = self.ui, x = gw/2, y = gh/2 - 68, sx = 0.6, sy = 0.6, lines = {{text = '[bg10]<- or a -> or d', font = fat_font, alignment = 'center'}}} self.paused_t2 = Text2{group = self.ui, x = gw/2, y = gh/2 - 52, lines = {{text = '[bg10]turn left turn right', font = pixul_font, alignment = 'center'}}} - self.paused_t3 = Text2{group = self.ui, x = gw/2, y = gh/2 - 22, sx = 0.6, sy = 0.6, lines = {{text = '[bg10]s - mute sfx', font = fat_font, alignment = 'center'}}} + self.paused_t3 = Text2{group = self.ui, x = gw/2, y = gh/2 - 22, sx = 0.6, sy = 0.6, lines = {{text = '[bg10]n - mute sfx', font = fat_font, alignment = 'center'}}} self.paused_t4 = Text2{group = self.ui, x = gw/2, y = gh/2 + 0, sx = 0.6, sy = 0.6, lines = {{text = '[bg10]m - mute music', font = fat_font, alignment = 'center'}}} self.paused_t5 = Text2{group = self.ui, x = gw/2, y = gh/2 + 22, sx = 0.6, sy = 0.6, lines = {{text = '[bg10]esc - resume game', font = fat_font, alignment = 'center'}}} self.paused_t6 = Text2{group = self.ui, x = gw/2, y = gh/2 + 44, sx = 0.6, sy = 0.6, lines = {{text = '[bg10]r - restart run', font = fat_font, alignment = 'center'}}} diff --git a/assets/media/event_cover.png b/assets/media/event_cover.png new file mode 100644 index 0000000..96a1961 Binary files /dev/null and b/assets/media/event_cover.png differ diff --git a/assets/media/event_header.png b/assets/media/event_header.png new file mode 100644 index 0000000..a7fcf6a Binary files /dev/null and b/assets/media/event_header.png differ diff --git a/assets/sounds/Trailer - Ember.ogg b/assets/sounds/Trailer - Ember.ogg new file mode 100644 index 0000000..79e3660 Binary files /dev/null and b/assets/sounds/Trailer - Ember.ogg differ diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..499aa57 --- /dev/null +++ b/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cd E:/a327ex/SNKRX +engine/love/build_steam.bat SNKRX diff --git a/buy_screen.lua b/buy_screen.lua index 2976e8a..983d65e 100644 --- a/buy_screen.lua +++ b/buy_screen.lua @@ -31,6 +31,9 @@ function BuyScreen:on_enter(from, level, units) self.units = units camera.x, camera.y = gw/2, gh/2 + steam.friends.setRichPresence('steam_display', '#StatusFull') + steam.friends.setRichPresence('text', 'Shop - Level ' .. self.level) + if self.level == 0 then cascade_instance = cascade:play{volume = 0.5, loop = true} self.level = 1 @@ -55,7 +58,7 @@ function BuyScreen:on_enter(from, level, units) if not self.first_screen then RerollButton{group = self.main, x = 150, y = 18, parent = self} end GoButton{group = self.main, x = gw - 30, y = gh - 20, parent = self} - WishlistButton{group = self.main, x = gw - 147, y = gh - 20, parent = self} + -- WishlistButton{group = self.main, x = gw - 147, y = gh - 20, parent = self} end diff --git a/devlog.md b/devlog.md index 26ccda6..bfb8293 100644 --- a/devlog.md +++ b/devlog.md @@ -448,3 +448,140 @@ As for feedback given from the demo: * Error: engine/game/hitfx.lua:46: attempt to index field 'parent' * engine/game/hitfx.lua:46: in function 'use' love.js:9:40605 * enemies.lua:56: in function 'on_collision_enter' love.js:9:40605 + +# Week 6 - 24/03/21 to 31/03/21 + +Spent most of this week relaxing and ideaguying the next things I need to do. The reaction to the demo was already underwhelming but the reaction to the game reveal itself from the Internet at large was also fairly underwhelming. +For BYTEPATH it was also like this and the 2 weeks of building wishlists were basically dead and I was only able to gain traction on release day, but for this game it seems even worse. Hopefully by the time release day comes people +will respond better, otherwise this is a big GG and this game will just be played by like 100 people at most. + +This also further solidifies my previous thoughts that the 2 weeks delay from steam up to release is best thought of as non-existent. For this game I tried a 2 step process, work on a demo and release that with the game's reveal +and steam page, and then finish the rest of the game after that. But the amount of work needed to do a proper reveal with trailers and playable demo was pretty large, and it didn't really amount to anything. The demo was too unfinished +(and I knew it was) for any feedback to matter, and people just didn't respond at all to the game's reveal. + +So a better plan for future games might be to just make a game in 1-2 months, and then spend 1 week or so doing everything needed to put the page up, do it, and then move on to the next game while waiting the 2 weeks before +release is possible. This also works better because it's very hard to switch from marketing mode back to development mode on the same project, whereas switching to a new project while waiting for those 2 weeks is probably +more feasible. + +Whatever way it goes, here's my plan for what to do until release: + +1. Enemy spawn points should have some markers before enemy spawns, or should avoid spawning near the player at all +2. Prevent spawning of units that cost 3 on first level +3. Prevent spawning of units that don't attack on first level +4. Rework position based units so that position in the snake doesn't matter + * Chronomancer: +10%/20%/30% attack speed to all allies + * Psykeeper: stores damage taken by all allies up to 20% max HP and redistributes it as healing + * Squire: +5%/10%/15% damage and defense to all allies +5. Stat details to each unit when hovering over it in the party section +6. Mini boss every 3rd level + * This is just a special enemy with more HP and ability to buff nearby enemies with modifiers, no additional AI or attack patterns + * ... aiming for ~5 different modifier combos that the boss uses +7. Enemy modifiers + * Grant nearby enemies a speed boost on death + * Grant nearby enemies a damage boost on death + * Explode into projectiles on death + * Charge up and headbutt towards the player at increased speed and damage + * Resistance to knockback + * ... aiming for about 8-10 of these +8. Additional characters and classes +9. Lv.3 effects for every character + * Classes + * Ranger: chance to release a barrage on attack + * Warrior: increased defense + * Mage: decreased enemy defense + * Nuker: increased area damage and size + * Rogue: chance to crit + * Healer: increased healing effectiveness + * Enchanter: increased damage + * Conjurer: increased summon damage and duration + * Psyker: increased damage and health based on number of active sets + * Trapper: release extra traps + * Forcer: increased knockback force + * Swarmer: increased critter health + * Voider: increased damage over time + * Characters + * Vagrant [psyker, ranger, warrior]: shoots a projectile - Lv.3: Champion - gains increased damage and attack speed based on number of active sets + * Swordsman [warrior]: deals AoE damage, deals extra damage for each unit hit - Lv.3: Cleave - damage is doubled + * Wizard [mage]: shoots a projectile that deals AoE damage - Lv.3: Magic Missile - the projectile chains 5 times, each dealing AoE damage on impact + * Archer [ranger]: shoots an arrow that pierces - Lv.3: Bounce Shot - the arrow ricochets on walls 3 times + * Scout [rogue]: throws a knife that chains 3 times - Lv.3: Replica - each chain grants +15% damage and the last chain splits + * Cleric [healer]: heals a unit when its health drops below half HP - Lv.3: Mass Heal - heals all units instead of one + * Outlaw [warrior, rogue]: throws a fan of 5 knives - Lv.3: Fatal Roulette - every 3rd attack throw a nova of 15 knives instead + * Blade [warrior, nuker]: throws multiple blades that deal AoE damage - Lv.3: Blade Resonance - deal additional damage based on number of enemies hit + * Elementor [mage, nuker]: deals AoE damage to a random target in a large area - Lv.3: Windfield - slows enemies hit + * Saboteur [rogue, conjurer, nuker]: calls saboteurs to seek targets and deal AoE damage - Lv.3: Chain Reaction - should an enemy die from a saboteur explosion, it also explodes + * Stormweaver [enchanter]: infuses all allied projectiles with chain lightning that deals extra damage - Lv.3: Lightning Spire - cast a spire of lightning periodically + * Sage [nuker]: shoots a slow moving projectile that pulls enemies in - Lv.3: Dimension Compression - when the projectile expires deal massive damage to all enemies under its influence + * Squire [warrior, enchanter]: increased damage and defense to all allies - Lv.3: Repair - you can reroll your item choice once every 3 levels, these opportunities stack if unused + * Cannoneer [ranger, nuker]: shoots a projectile that deals AoE damage - Lv.3: Cannon Barrage - showers the hit area in additional cannon shots that deal AoE damage + * Dual Gunner [ranger, rogue]: shoots two parallel projectiles - Lv.3: Gun Kata - every 5th attack shoots projectiles in a rapid succession for a duration, targetting all nearby enemies + * Hunter [ranger, conjurer]: shoots an arrow that summons a pet - Lv.3: Feral Pack - summons 3 pets + * Chronomancer [mage, enchanter]: increased attack speed to all allies - Lv.3: Quicken - enemies take DoT faster + * Spellblade [mage, rogue]: throws knives that spiral outwards and pierce - Lv.3: Spiralism - faster projectile speed and tighter turns + * Psykeeper [healer, psyker]: stores damage taken by all allies and redistributes it as healing - Lv.3: Crucio - also redistributes it as damage to all enemies + * Engineer [conjurer]: drops sentries that shoot bursts of projectils - Lv.3: Upgrade - every 3rd sentry dropped, upgrade all sentries temporarily, giving increased damage and attack speed + * Plague Doctor [nuker, voider]: creates an area that deals DoT - Lv.3: Pandemic - inflicts enemies with a contagion that deals additional DoT, if they die from it it passes to a nearby enemy + * Fisherman [trapper, warrior]: throws a net that entangles enemies and prevents them from moving - Lv.3: Electric Net - enemies caught take DoT + * Juggernaut [forcer, warrior]: creates a small area that deals AoE damage and pushes enemies away - Lv.3: Brutal Impact - enemies pushed away are instantly killed if they hit a wall + * Lich [mage]: launches a chain frost that chains 7 times, dealing damage and slowing enemies it hits - Lv.3: Piercing Frost - chain frost ignores enemy defenses + * Cryomancer [mage, voider]: nearby enemies take damage over time and have decreased movement speed - Lv.3: Frostbite - enemies killed by the cryomancer freeze nearby enemies, frozen enemies can't move and take increased damage + * Pyromancer [mage, nuker, voider]: nearby enemies take damage over time and deal decreased damage - Lv.3: Ignite - enemies killed by the pyromancer explode, dealing AoE damage + * Corruptor [ranger, swarmer]: spawn 3 small critters if the corruptor kills an enemy - Lv.3: Infestation - spawn 3 small critters if the corruptor hits an enemy + * Beastmaster [rogue, swarmer]: spawn 2 small critters if the beastmaster crits - Lv.3: Call of the Wild - spawn 2 small critters if the beastmaster gets hit + * Launcher [trapper, forcer]: creates a trap that launches enemies that trigger it - Lv.3: Kineticism - enemies launched that hit other enemies transfer their kinetic energy + * Spiker [trapper, rogue]: creates a trap that crits when triggered - Lv.3: Caltrops - slows enemies hit and deals DoT + * Assassin [rogue, voider]: throws a piercing knife that inflicts poison - Lv.3: Toxic Delivery - poison inflicted from crits deals more damage + * Host [conjurer, swarmer]: creates overlords that periodically spawn small critters - Lv.3: Invasion - increased critter spawn rate + * Carver [conjurer, healer]: carves a statue that periodically heals in an area - Lv.3: World Tree - carves a tree that heals in a bigger area and removes all buffs from enemies + * Bane [swarmer, voider]: spawn a small critter periodically that explodes and deals DoT - Lv.3: Baneling Swarm - spawn 4 banelings instead + * Psykino [mage, psyker, forcer]: quickly pulls enemies together and then releases them with a force - Lv.3: Magnetic Force - enemies pulled together are forced to collide with each other before being released + * Arbalester [ranger, forcer]: launches a massive arrow that pushes enemies back, ignoring knockback resistances - Lv.3: Ballista Sinistra - enemies hit by the arrow have massively decreased defense + * Pirate [warrior, forcer]: launches a hook that captures nearby enemies and pulls them towards you - Lv.3: Jolly Roger - place a flag that grants gold based on number of enemies killed under its effect + * Sapper [trapper, enchanter, healer]: creates a trap that steals health from enemies that trigger it and grants increased movement speed - Lv.3: when a sapper trap is triggered other nearby traps are triggered + * Priest [healer]: heals all units periodically - Lv.3: Divine Intervention - at the start of the round pick 3 units at random and grants them a buff that prevents them from dying once + * Burrower [trapper, swarmer]: creates a trap that contains 6 small critters which are released when triggered - Lv.3: Zergling Rush - triples the number of critters released + * Flagellant [psyker, enchanter]: periodically deals damage to self and grants a damage buff to all allies - Lv.3: Zealotry - deals damage to all allies instead and also grants a massive damage buff + * Sets + * Ranger = 8/8 + * Warrior = 8/8 + * Mage = 8/8 + * Rogue = 8/8 + * Nuker = 7/7 + * Conjurer = 5/5 + * Forcer = 5/5 + * Voider = 5/5 + * Psyker = 4/4 + * Healer = 5/5 + * Enchanter = 5/5 + * Trapper = 5/5 + * Swarmer = 5/5 +10. Items + * Ouroboros Technique R: rotating around yourself to the right makes every unit periodically release projectiles + * Ouroboros Technique L: rotating around yourself to the left grants +25% defense to all units + * Resonance: hitting walls has a chance of releasing projectiles + * Wall Rider: hitting walls grants a speed buff for a small duration + * Force Push: +25% knockback force + * Heavy Impact: if knockbacked enemies hit walls they take damage according to the knockback force + * Centipede: +20% movement speed + * Intimidation: enemies spawn with -20% max HP + * Crucio: taking damage shares 2x the amount of HP you lost across all enemies + * Amplify: all units that deal AoE damage gain +25% AoE damage + * Amplify X: +25% AoE damage if all your units only deal AoE damage (excluding supports) + * Ballista: all units that release projectiles and don't deal AoE damage gain +25% damage + * Ballista X: +25% damage if all your units only release projectiles and don't deal AoE damage (excluding supports) + * Point Blank: projectiles deal increased damage based on distance not travelled, +100% at 0 distance and -50% at max distance + * Longshot: projectiles deal increased damage based on distance travelled, -50% at 0 distance and +100% at max distance + * Chain Reaction: projectiles that chain gain 25% damage with each chain + * Call of the Void: +25% DoT damage + * ... more ideas will come later I'm sure, aiming for 30 total items +11. Steam integration: achievements, etc +12. Hovering over a party member should show which set they belong to and vice-versa +13. Show a unit DPS list like Underlord's to the right side of the screen +14. Warriors that deal AoE damage should deal extra damage based on number of enemies hit +15. GO button is grayed out and thus doesn't say it's meant to be clicked on +16. 28/20 enemies or 4/3 wave confuses players and makes them think the level goals are bugged +17. Music for first 9-15 levels should be calm rather than upbeat +18. Crash: Error: engine/game/hitfx.lua:46: attempt to index field 'parent', engine/game/hitfx.lua:46: in function 'use' love.js:9:40605, enemies.lua:56: in function 'on_collision_enter' love.js:9:40605 +19. Sage's pull force doesn't increase with unit level +20. Cleric's healing amount doesn't increase with unit level +21. Squire and Chronomancer's buffs don't increase with unit level diff --git a/enemies.lua b/enemies.lua index ecaed4e..9a4ed4b 100644 --- a/enemies.lua +++ b/enemies.lua @@ -58,9 +58,9 @@ function Seeker:on_collision_enter(other, contact) elseif table.any(main.current.enemies, function(v) return other:is(v) end) then if self.being_pushed and math.length(self:get_velocity()) > 60 then - other:hit(math.floor(self.dmg/4)) - self:hit(math.floor(self.dmg/2)) - other:push(random:float(10, 15), other:angle_to_object(self)) + other:hit(math.floor(self.push_force/4)) + self:hit(math.floor(self.push_force/2)) + other:push(math.floor(self.push_force/2), other:angle_to_object(self)) HitCircle{group = main.current.effects, x = x, y = y, rs = 6, color = fg[0], duration = 0.1} for i = 1, 2 do HitParticle{group = main.current.effects, x = x, y = y, color = self.color} end hit2:play{pitch = random:float(0.95, 1.05), volume = 0.35} @@ -93,6 +93,7 @@ end function Seeker:push(f, r) + self.push_force = f self.being_pushed = true self.steering_enabled = false self:apply_impulse(f*math.cos(r), f*math.sin(r)) diff --git a/engine/external/init.lua b/engine/external/init.lua index 69ffafe..3949107 100644 --- a/engine/external/init.lua +++ b/engine/external/init.lua @@ -2,6 +2,7 @@ local path = ... if not path:find("init") then binser = require(path .. ".binser") mlib = require(path .. ".mlib") - if not web then clipper = require(path .. ".clipper") end + -- if not web then clipper = require(path .. ".clipper") end ripple = require(path .. ".ripple") + steam = require 'luasteam' end diff --git a/engine/init.lua b/engine/init.lua index 5989623..be6c6df 100644 --- a/engine/init.lua +++ b/engine/init.lua @@ -46,6 +46,7 @@ end function engine_run(config) if not web then love.filesystem.setIdentity(config.game_name) + steam.init() local _, _, flags = love.window.getMode() local window_width, window_height = love.window.getDesktopDimensions(flags.display) @@ -112,6 +113,7 @@ function engine_run(config) for name, a, b, c, d, e, f in love.event.poll() do if name == "quit" then if not love.quit or not love.quit() then + steam.shutdown() return a or 0 end elseif name == "keypressed" then input.keyboard_state[a] = true; input.last_key_pressed = a @@ -128,6 +130,7 @@ function engine_run(config) if love.timer then dt = love.timer.step() end + steam.runCallbacks() accumulator = accumulator + dt while accumulator >= fixed_dt do frame = frame + 1 diff --git a/engine/love/OpenAL32.dll b/engine/love/OpenAL32.dll index 57fc48b..5a12d18 100644 Binary files a/engine/love/OpenAL32.dll and b/engine/love/OpenAL32.dll differ diff --git a/engine/love/SDL2.dll b/engine/love/SDL2.dll index 4c08014..7906c9f 100644 Binary files a/engine/love/SDL2.dll and b/engine/love/SDL2.dll differ diff --git a/engine/love/build_steam.bat b/engine/love/build_steam.bat new file mode 100644 index 0000000..a5f0140 --- /dev/null +++ b/engine/love/build_steam.bat @@ -0,0 +1,12 @@ +call "C:\Program Files\7-Zip\7z.exe" a -r %1.zip -w ..\..\ -xr!engine/love -xr!builds -xr!steam -xr!.git -xr!*.moon -xr!conf.lua +rename %1.zip %1.love +copy /b "love.exe"+"%1.love" "%1.exe" +del %1.love +mkdir %1 +for %%I in (*.dll) do copy %%I %1\ +for %%I in (*.txt) do copy %%I %1\ +copy %1.exe %1\ +del %1.exe +copy %1\ ..\..\steam\ContentBuilder\content\ +del /q %1\ +rmdir /q %1\ diff --git a/engine/love/build_windows.bat b/engine/love/build_windows.bat index 77b92f6..920f538 100644 --- a/engine/love/build_windows.bat +++ b/engine/love/build_windows.bat @@ -1,4 +1,4 @@ -call "C:\Program Files\7-Zip\7z.exe" a -r %1.zip -w ..\..\ -xr!engine/love -xr!builds -xr!.git -xr!*.moon -xr!conf.lua +call "C:\Program Files\7-Zip\7z.exe" a -r %1.zip -w ..\..\ -xr!engine/love -xr!builds -xr!steam -xr!.git -xr!*.moon -xr!conf.lua rename %1.zip %1.love copy /b "love.exe"+"%1.love" "%1.exe" del %1.love diff --git a/engine/love/love.dll b/engine/love/love.dll index aee80b3..78a69e2 100644 Binary files a/engine/love/love.dll and b/engine/love/love.dll differ diff --git a/engine/love/love.exe b/engine/love/love.exe index b9ab3d8..58de09b 100644 Binary files a/engine/love/love.exe and b/engine/love/love.exe differ diff --git a/engine/love/lovec.exe b/engine/love/lovec.exe index 9fd934c..0e7962c 100644 Binary files a/engine/love/lovec.exe and b/engine/love/lovec.exe differ diff --git a/engine/love/lua51.dll b/engine/love/lua51.dll index 14b5a97..d3a6892 100644 Binary files a/engine/love/lua51.dll and b/engine/love/lua51.dll differ diff --git a/engine/love/luasteam.dll b/engine/love/luasteam.dll new file mode 100644 index 0000000..0c97435 Binary files /dev/null and b/engine/love/luasteam.dll differ diff --git a/engine/love/mpg123.dll b/engine/love/mpg123.dll index c706e10..cd7a2a0 100644 Binary files a/engine/love/mpg123.dll and b/engine/love/mpg123.dll differ diff --git a/engine/love/msvcp120.dll b/engine/love/msvcp120.dll index a237d2d..4ea1efa 100644 Binary files a/engine/love/msvcp120.dll and b/engine/love/msvcp120.dll differ diff --git a/engine/love/msvcr120.dll b/engine/love/msvcr120.dll index 8c36149..d711c92 100644 Binary files a/engine/love/msvcr120.dll and b/engine/love/msvcr120.dll differ diff --git a/engine/love/steam_api64.dll b/engine/love/steam_api64.dll new file mode 100644 index 0000000..c6e55cf Binary files /dev/null and b/engine/love/steam_api64.dll differ diff --git a/engine/love/steam_appid.txt b/engine/love/steam_appid.txt new file mode 100644 index 0000000..63f2a1c --- /dev/null +++ b/engine/love/steam_appid.txt @@ -0,0 +1 @@ +915310 diff --git a/engine/love/steam_rich_presence.txt b/engine/love/steam_rich_presence.txt new file mode 100644 index 0000000..223999f --- /dev/null +++ b/engine/love/steam_rich_presence.txt @@ -0,0 +1,10 @@ +"lang" +{ + "english" + { + "tokens" + { + "#StatusFull" "%text%" + } + } +} \ No newline at end of file diff --git a/main.lua b/main.lua index 8b9013b..0d48b62 100644 --- a/main.lua +++ b/main.lua @@ -1,4 +1,3 @@ -web = true require 'engine' require 'shared' require 'arena' @@ -17,6 +16,8 @@ function init() input:bind('move_down', {'s', 'down'}) input:bind('enter', {'space', 'return'}) + music.volume = 0 + local s = {tags = {sfx}} ui_hover1 = Sound('bamboo_hit_by_lord.ogg', s) ui_switch1 = Sound('Switch.ogg', s) @@ -409,13 +410,26 @@ function init() main = Main() main:add(BuyScreen'buy_screen') main:go_to('buy_screen', 0, {}) + --[[ + main:add(Arena'arena') + main:go_to('arena', 18, { + {character = 'scout', level = 3}, + {character = 'engineer', level = 3}, + {character = 'wizard', level = 3}, + {character = 'swordsman', level = 3}, + {character = 'outlaw', level = 3}, + {character = 'archer', level = 3}, + {character = 'cannoneer', level = 3}, + {character = 'spellblade', level = 3}, + }) + ]]-- end function update(dt) main:update(dt) - if input.s.pressed then + if input.n.pressed then if sfx.volume == 0.5 then sfx.volume = 0 elseif sfx.volume == 0 then @@ -430,6 +444,13 @@ function update(dt) music.volume = 0.5 end end + + if input.k.pressed then + print(steam.user.getPlayerSteamLevel()) + print(steam.user.getSteamID()) + print(steam.friends.getFriendPersonaName(steam.user.getSteamID())) + print(steam.utils.getAppID()) + end end @@ -442,8 +463,8 @@ end function love.run() return engine_run({ - game_name = 'SNAKRX', - window_width = 480*2, - window_height = 270*2, + game_name = 'SNKRX', + window_width = 480*3, + window_height = 270*3, }) end diff --git a/patch_notes.md b/patch_notes.md new file mode 100644 index 0000000..a3fc4fe --- /dev/null +++ b/patch_notes.md @@ -0,0 +1,3 @@ +Release Patch Notes + + diff --git a/run.sh b/run.sh index f26e063..85e850f 100644 --- a/run.sh +++ b/run.sh @@ -1,4 +1,4 @@ #!/bin/bash -cd E:/a327ex/SNKRX # change to the directory of the current project +cd E:/a327ex/SNKRX engine/love/love.exe --console . diff --git a/todo b/todo index eb634b5..885ac8a 100644 --- a/todo +++ b/todo @@ -1,84 +1,136 @@ -Trailer: -1 - 01:31 - 03:37 - 05:45 - 06:44 - 07:50 - 14:07 -2 - 01:01 - 05:21 - 08:02 - 10:40 - 11:55 - 27:00 wall bump - 27:17 -3 - 00:23 - 12:12 -4 - 02:30 -5 - 01:00 - 03:36 - 07:07 -6 - 00:14 - 03:45 - 04:29 - 06:19 - 09:40 - 10:27 - 12:51 - 13:51 - 15:12 fast buy +1. Enemy spawn points should have some markers before enemy spawns, or should avoid spawning near the player at all +2. Prevent spawning of units that cost 3 on first level +3. Prevent spawning of units that don't attack on first level +4. Rework position based units so that position in the snake doesn't matter + Chronomancer: +10%/20%/30% attack speed to all allies + Psykeeper: stores damage taken by all allies up to 20% max HP and redistributes it as healing + Squire: +5%/10%/15% damage and defense to all allies -Mini Boss every 3rd level -Show a unit DPS list like Underlord's to the right side of the screen -About 20-30 passive items that can be collected every 3 levels -Lv.3 effects for every character +5. Stat details to each unit when hovering over it in the party section -Boss ideas - Pretends to be dead, grants speed buffs to enemies after death, especially if the round has gone on for too long which means the player is surviving with 1 unit +6. Mini boss every 3rd level + This is just a special enemy with more HP and ability to buff nearby enemies with modifiers, no additional AI or attack patterns + ... aiming for ~5 different modifier combos that the boss uses -Classes and characters - Trapper: releases +1 trap - Plague Doctor [trapper, nuker]: releases an area that deals 6 AoE DoT - Fisherman [trapper, warrior]: throws a net that entangles enemies and prevents them from moving - - Lich [mage, enchanter]: nearby enemies have decreased movement speed - -Items - Resonance: hitting walls has a chance of releasing projectiles - Ouroboros Technique: rotating around yourself makes every unit release projectiles - AoE 1: all units that deal AoE damage have increased stat - AoE 2: increased stat if all your units that deal damage deal AoE damage - Proj 1: all units that release projectiles have increased stat - Proj 2: increased stat if all your units that deal damage release projectiles - Wallrider: hitting walls grants a speed buff for a small duration - -Enemy modifiers +7. Enemy modifiers Grant nearby enemies a speed boost on death Grant nearby enemies a damage boost on death Explode into projectiles on death Charge up and headbutt towards the player at increased speed and damage - Immune to knockback + Resistance to knockback + ... aiming for about 8-10 of these -UI - Highlight units of a class when hovering over the class icon in the "sets" section - Add stat details to each unit when hovering over it in the "party" section +8. Additional characters and classes +9. Lv.3 effects for every character + Classes + Ranger: chance to release a barrage on attack + Warrior: increased defense + Mage: decreased enemy defense + Nuker: increased area damage and size + Rogue: chance to crit + Healer: increased healing effectiveness + Enchanter: increased damage + Conjurer: increased summon damage and duration + Psyker: increased damage and health based on number of active sets + Trapper: release extra traps + Forcer: increased knockback force + Swarmer: increased critter health + Voider: increased damage over time + Characters + Vagrant [psyker, ranger, warrior]: shoots a projectile - Lv.3: Champion - gains increased damage and attack speed based on number of active sets + Swordsman [warrior]: deals AoE damage, deals extra damage for each unit hit - Lv.3: Cleave - damage is doubled + Wizard [mage]: shoots a projectile that deals AoE damage - Lv.3: Magic Missile - the projectile chains 5 times, each dealing AoE damage on impact + Archer [ranger]: shoots an arrow that pierces - Lv.3: Bounce Shot - the arrow ricochets on walls 3 times + Scout [rogue]: throws a knife that chains 3 times - Lv.3: Replica - each chain grants +15% damage and the last chain splits + Cleric [healer]: heals a unit when its health drops below half HP - Lv.3: Mass Heal - heals all units instead of one + Outlaw [warrior, rogue]: throws a fan of 5 knives - Lv.3: Fatal Roulette - every 3rd attack throw a nova of 15 knives instead + Blade [warrior, nuker]: throws multiple blades that deal AoE damage - Lv.3: Blade Resonance - deal additional damage based on number of enemies hit + Elementor [mage, nuker]: deals AoE damage to a random target in a large area - Lv.3: Windfield - slows enemies hit + Saboteur [rogue, conjurer, nuker]: calls saboteurs to seek targets and deal AoE damage - Lv.3: Chain Reaction - should an enemy die from a saboteur explosion, it also explodes + Stormweaver [enchanter]: infuses all allied projectiles with chain lightning that deals extra damage - Lv.3: Lightning Spire - cast a spire of lightning periodically + Sage [nuker]: shoots a slow moving projectile that pulls enemies in - Lv.3: Dimension Compression - when the projectile expires deal massive damage to all enemies under its influence + Squire [warrior, enchanter]: increased damage and defense to all allies - Lv.3: Repair - you can reroll your item choice once every 3 levels, these opportunities stack if unused + Cannoneer [ranger, nuker]: shoots a projectile that deals AoE damage - Lv.3: Cannon Barrage - showers the hit area in additional cannon shots that deal AoE damage + Dual Gunner [ranger, rogue]: shoots two parallel projectiles - Lv.3: Gun Kata - every 5th attack shoots projectiles in a rapid succession for a duration, targetting all nearby enemies + Hunter [ranger, conjurer]: shoots an arrow that summons a pet - Lv.3: Feral Pack - summons 3 pets + Chronomancer [mage, enchanter]: increased attack speed to all allies - Lv.3: Quicken - enemies take DoT faster + Spellblade [mage, rogue]: throws knives that spiral outwards and pierce - Lv.3: Spiralism - faster projectile speed and tighter turns + Psykeeper [healer, psyker]: stores damage taken by all allies and redistributes it as healing - Lv.3: Crucio - also redistributes it as damage to all enemies + Engineer [conjurer]: drops sentries that shoot bursts of projectils - Lv.3: Upgrade - every 3rd sentry dropped, upgrade all sentries temporarily, giving increased damage and attack speed + Plague Doctor [nuker, voider]: creates an area that deals DoT - Lv.3: Pandemic - inflicts enemies with a contagion that deals additional DoT, if they die from it it passes to a nearby enemy + Fisherman [trapper, warrior]: throws a net that entangles enemies and prevents them from moving - Lv.3: Electric Net - enemies caught take DoT + Juggernaut [forcer, warrior]: creates a small area that deals AoE damage and pushes enemies away - Lv.3: Brutal Impact - enemies pushed away are instantly killed if they hit a wall + Lich [mage]: launches a chain frost that chains 7 times, dealing damage and slowing enemies it hits - Lv.3: Piercing Frost - chain frost ignores enemy defenses + Cryomancer [mage, voider]: nearby enemies take damage over time and have decreased movement speed - Lv.3: Frostbite - enemies killed by the cryomancer freeze nearby enemies, frozen enemies can't move and take increased damage + Pyromancer [mage, nuker, voider]: nearby enemies take damage over time and deal decreased damage - Lv.3: Ignite - enemies killed by the pyromancer explode, dealing AoE damage + Corruptor [ranger, swarmer]: spawn 3 small critters if the corruptor kills an enemy - Lv.3: Infestation - spawn 3 small critters if the corruptor hits an enemy + Beastmaster [rogue, swarmer]: spawn 2 small critters if the beastmaster crits - Lv.3: Call of the Wild - spawn 2 small critters if the beastmaster gets hit + Launcher [trapper, forcer]: creates a trap that launches enemies that trigger it - Lv.3: Kineticism - enemies launched that hit other enemies transfer their kinetic energy + Spiker [trapper, rogue]: creates a trap that crits when triggered - Lv.3: Caltrops - slows enemies hit and deals DoT + Assassin [rogue, voider]: throws a piercing knife that inflicts poison - Lv.3: Toxic Delivery - poison inflicted from crits deals more damage + Host [conjurer, swarmer]: creates overlords that periodically spawn small critters - Lv.3: Invasion - increased critter spawn rate + Carver [conjurer, healer]: carves a statue that periodically heals in an area - Lv.3: World Tree - carves a tree that heals in a bigger area and removes all buffs from enemies + Bane [swarmer, voider]: spawn a small critter periodically that explodes and deals DoT - Lv.3: Baneling Swarm - spawn 4 banelings instead + Psykino [mage, psyker, forcer]: quickly pulls enemies together and then releases them with a force - Lv.3: Magnetic Force - enemies pulled together are forced to collide with each other before being released + Arbalester [ranger, forcer]: launches a massive arrow that pushes enemies back, ignoring knockback resistances - Lv.3: Ballista Sinistra - enemies hit by the arrow have massively decreased defense + Pirate [warrior, forcer]: launches a hook that captures nearby enemies and pulls them towards you - Lv.3: Jolly Roger - place a flag that grants gold based on number of enemies killed under its effect + Sapper [trapper, enchanter, healer]: creates a trap that steals health from enemies that trigger it and grants increased movement speed - Lv.3: when a sapper trap is triggered other nearby traps are triggered + Priest [healer]: heals all units periodically - Lv.3: Divine Intervention - at the start of the round pick 3 units at random and grants them a buff that prevents them from dying once + Burrower [trapper, swarmer]: creates a trap that contains 6 small critters which are released when triggered - Lv.3: Zergling Rush - triples the number of critters released + Flagellant [psyker, enchanter]: periodically deals damage to self and grants a damage buff to all allies - Lv.3: Zealotry - deals damage to all allies instead and also grants a massive damage buff + Sets + Ranger = 8/8 + Warrior = 8/8 + Mage = 8/8 + Rogue = 8/8 + Nuker = 7/7 + Conjurer = 5/5 + Forcer = 5/5 + Voider = 5/5 + Psyker = 4/4 + Healer = 5/5 + Enchanter = 5/5 + Trapper = 5/5 + Swarmer = 5/5 -Balance - More damage to AoE units with big cooldowns - Warriors that deal AoE damage should deal extra damage based on number of enemies hit +10. Items + Ouroboros Technique R: rotating around yourself to the right makes every unit periodically release projectiles + Ouroboros Technique L: rotating around yourself to the left grants +25% defense to all units + Resonance: hitting walls has a chance of releasing projectiles + Wall Rider: hitting walls grants a speed buff for a small duration + Force Push: +25% knockback force + Heavy Impact: if knockbacked enemies hit walls they take damage according to the knockback force + Centipede: +20% movement speed + Intimidation: enemies spawn with -20% max HP + Crucio: taking damage shares 2x the amount of HP you lost across all enemies + Amplify: all units that deal AoE damage gain +25% AoE damage + Amplify X: +25% AoE damage if all your units only deal AoE damage (excluding supports) + Ballista: all units that release projectiles and don't deal AoE damage gain +25% damage + Ballista X: +25% damage if all your units only release projectiles and don't deal AoE damage (excluding supports) + Point Blank: projectiles deal increased damage based on distance not travelled, +100% at 0 distance and -50% at max distance + Longshot: projectiles deal increased damage based on distance travelled, -50% at 0 distance and +100% at max distance + Chain Reaction: projectiles that chain gain 25% damage with each chain + Call of the Void: +25% DoT damage + ... more ideas will come later I'm sure, aiming for 30 total items -Bugs - Squire and Chronomancer don't affect leader - Sage's pull force doesn't increase with unit level - Cleric's healing amount doesn't increase with unit level - Squire and Chronomancer's buffs don't increase with unit level +11. Steam integration: achievements, etc +12. Hovering over a party member should show which set they belong to and vice-versa +13. Show a unit DPS list like Underlord's to the right side of the screen +14. Warriors that deal AoE damage should deal extra damage based on number of enemies hit +15. GO button is grayed out and thus doesn't say it's meant to be clicked on +16. 28/20 enemies or 4/3 wave confuses players and makes them think the level goals are bugged +17. Music for first 9-15 levels should be calm rather than upbeat +18. Crash: Error: engine/game/hitfx.lua:46: attempt to index field 'parent', engine/game/hitfx.lua:46: in function 'use' love.js:9:40605, enemies.lua:56: in function 'on_collision_enter' love.js:9:40605 +19. Sage's pull force doesn't increase with unit level +20. Cleric's healing amount doesn't increase with unit level +21. Squire and Chronomancer's buffs don't increase with unit level + +Boss ideas + Pretends to be dead, grants speed buffs to enemies after death, especially if the round has gone on for too long which means the player is surviving with 1 unit + +Map modifiers + Wall spikes: walls damage you when you hit it Engine improvements for after SNKRX release on_hit: @@ -86,3 +138,7 @@ Engine improvements for after SNKRX release This enables the definition of on_hit on each object and the question of where the logic should stay is solved/dodged Spurred by Wall needing to have its own on_hit function to do something when the player hits it, without having to change player code for all Walls, Defining on_hit on the Wall creation call for that specific Wall, and thus that specific Wall will have this behavior while other walls won't + release tool: + Build a command line tool that creates projects and builds them up for release automatically on Windows, Web and Steam + All the steps for this are listed on the readme and everything about it that can be automated should + Ideally the user should run one command for creating a project and one for building it for each platform