From fa436fe24cee8347315b2cb0c62cbc2ba5a242b1 Mon Sep 17 00:00:00 2001 From: Azuline Date: Sun, 19 Apr 2026 00:32:21 +0700 Subject: [PATCH 1/4] been awhile since i pick up the :writing_hand: --- Artifacts/displacement.lua | 5 + CHANGELOG.md | 10 + Gameplay/nemesis_spawn_portal.lua | 2 +- Items/balloon.lua | 5 +- Items/dormantFungus.lua | 44 +- Items/x4Stimulant.lua | 5 +- Language/english.lua | 4 +- Language/koreana.lua | 564 ++++++++++++++++++ Language/russian.lua | 4 +- Language/schinese.lua | 306 ++++++---- Language/spanish.lua | 2 +- README.md | 9 +- Sprites/Survivors/Executioner/portrait2.png | Bin 2217 -> 0 bytes Sprites/Survivors/Executioner/portrait3.png | Bin 2248 -> 0 bytes Sprites/Survivors/Executioner/portrait4.png | Bin 2164 -> 0 bytes .../Survivors/Executioner/portraitSmall2.png | Bin 614 -> 0 bytes .../Survivors/Executioner/portraitSmall3.png | Bin 620 -> 0 bytes .../Survivors/Executioner/portraitSmall4.png | Bin 617 -> 0 bytes Sprites/Survivors/Executioner/select.png | Bin 14558 -> 8685 bytes Sprites/Survivors/Executioner/select2.png | Bin 14565 -> 0 bytes Sprites/Survivors/Executioner/select3.png | Bin 14625 -> 0 bytes Sprites/Survivors/Executioner/select4.png | Bin 14631 -> 0 bytes Sprites/Survivors/MULE/portrait2.png | Bin 2673 -> 0 bytes Sprites/Survivors/MULE/portrait3.png | Bin 2583 -> 0 bytes Sprites/Survivors/MULE/portrait4.png | Bin 2571 -> 0 bytes Sprites/Survivors/MULE/portrait5.png | Bin 2602 -> 0 bytes Sprites/Survivors/MULE/portraitSmall2.png | Bin 781 -> 0 bytes Sprites/Survivors/MULE/portraitSmall3.png | Bin 780 -> 0 bytes Sprites/Survivors/MULE/portraitSmall4.png | Bin 772 -> 0 bytes Sprites/Survivors/MULE/portraitSmall5.png | Bin 769 -> 0 bytes Sprites/Survivors/MULE/select2.png | Bin 28922 -> 0 bytes Sprites/Survivors/MULE/select3.png | Bin 28353 -> 0 bytes Sprites/Survivors/MULE/select4.png | Bin 28555 -> 0 bytes Sprites/Survivors/MULE/select5.png | Bin 28658 -> 0 bytes .../Survivors/NemesisCommando/portrait2.png | Bin 3189 -> 0 bytes .../Survivors/NemesisCommando/portrait3.png | Bin 3083 -> 0 bytes .../Survivors/NemesisCommando/portrait4.png | Bin 3036 -> 0 bytes .../Survivors/NemesisCommando/portrait5.png | Bin 3101 -> 0 bytes .../NemesisCommando/portraitTiny2.png | Bin 741 -> 0 bytes .../NemesisCommando/portraitTiny3.png | Bin 746 -> 0 bytes .../NemesisCommando/portraitTiny4.png | Bin 737 -> 0 bytes .../NemesisCommando/portraitTiny5.png | Bin 739 -> 0 bytes Sprites/Survivors/NemesisCommando/select2.png | Bin 24151 -> 0 bytes Sprites/Survivors/NemesisCommando/select3.png | Bin 23918 -> 0 bytes Sprites/Survivors/NemesisCommando/select4.png | Bin 24172 -> 0 bytes Sprites/Survivors/NemesisCommando/select5.png | Bin 24256 -> 0 bytes .../Survivors/NemesisMercenary/palette.png | Bin 140 -> 229 bytes .../Survivors/NemesisMercenary/palette1.png | Bin 0 -> 231 bytes .../Survivors/NemesisMercenary/palette2.png | Bin 0 -> 234 bytes .../Survivors/NemesisMercenary/palette3.png | Bin 0 -> 226 bytes .../Survivors/NemesisMercenary/palette4.png | Bin 0 -> 228 bytes Sprites/Survivors/NemesisMercenary/select.png | Bin 8409 -> 21329 bytes Sprites/Survivors/Technician/portraitPROV.png | Bin 3547 -> 0 bytes Sprites/Survivors/Technician/portraitS1.png | Bin 3573 -> 0 bytes Sprites/Survivors/Technician/portraitS2.png | Bin 3507 -> 0 bytes Sprites/Survivors/Technician/portraitS3.png | Bin 3555 -> 0 bytes Sprites/Survivors/Technician/portraitS4.png | Bin 3471 -> 0 bytes .../Technician/portraitSmallPROV.png | Bin 997 -> 0 bytes .../Survivors/Technician/portraitSmallS1.png | Bin 897 -> 0 bytes .../Survivors/Technician/portraitSmallS2.png | Bin 994 -> 0 bytes .../Survivors/Technician/portraitSmallS3.png | Bin 1012 -> 0 bytes .../Survivors/Technician/portraitSmallS4.png | Bin 1002 -> 0 bytes Sprites/Survivors/Technician/selectPROV.png | Bin 19796 -> 0 bytes Sprites/Survivors/Technician/selectS1.png | Bin 24498 -> 0 bytes Sprites/Survivors/Technician/selectS2.png | Bin 19887 -> 0 bytes Sprites/Survivors/Technician/selectS3.png | Bin 20099 -> 0 bytes Sprites/Survivors/Technician/selectS4.png | Bin 19930 -> 0 bytes Survivors/executioner.lua | 2 +- Survivors/nemesisMercenary.lua | 17 +- 69 files changed, 808 insertions(+), 171 deletions(-) create mode 100644 Language/koreana.lua delete mode 100644 Sprites/Survivors/Executioner/portrait2.png delete mode 100644 Sprites/Survivors/Executioner/portrait3.png delete mode 100644 Sprites/Survivors/Executioner/portrait4.png delete mode 100644 Sprites/Survivors/Executioner/portraitSmall2.png delete mode 100644 Sprites/Survivors/Executioner/portraitSmall3.png delete mode 100644 Sprites/Survivors/Executioner/portraitSmall4.png delete mode 100644 Sprites/Survivors/Executioner/select2.png delete mode 100644 Sprites/Survivors/Executioner/select3.png delete mode 100644 Sprites/Survivors/Executioner/select4.png delete mode 100644 Sprites/Survivors/MULE/portrait2.png delete mode 100644 Sprites/Survivors/MULE/portrait3.png delete mode 100644 Sprites/Survivors/MULE/portrait4.png delete mode 100644 Sprites/Survivors/MULE/portrait5.png delete mode 100644 Sprites/Survivors/MULE/portraitSmall2.png delete mode 100644 Sprites/Survivors/MULE/portraitSmall3.png delete mode 100644 Sprites/Survivors/MULE/portraitSmall4.png delete mode 100644 Sprites/Survivors/MULE/portraitSmall5.png delete mode 100644 Sprites/Survivors/MULE/select2.png delete mode 100644 Sprites/Survivors/MULE/select3.png delete mode 100644 Sprites/Survivors/MULE/select4.png delete mode 100644 Sprites/Survivors/MULE/select5.png delete mode 100644 Sprites/Survivors/NemesisCommando/portrait2.png delete mode 100644 Sprites/Survivors/NemesisCommando/portrait3.png delete mode 100644 Sprites/Survivors/NemesisCommando/portrait4.png delete mode 100644 Sprites/Survivors/NemesisCommando/portrait5.png delete mode 100644 Sprites/Survivors/NemesisCommando/portraitTiny2.png delete mode 100644 Sprites/Survivors/NemesisCommando/portraitTiny3.png delete mode 100644 Sprites/Survivors/NemesisCommando/portraitTiny4.png delete mode 100644 Sprites/Survivors/NemesisCommando/portraitTiny5.png delete mode 100644 Sprites/Survivors/NemesisCommando/select2.png delete mode 100644 Sprites/Survivors/NemesisCommando/select3.png delete mode 100644 Sprites/Survivors/NemesisCommando/select4.png delete mode 100644 Sprites/Survivors/NemesisCommando/select5.png create mode 100644 Sprites/Survivors/NemesisMercenary/palette1.png create mode 100644 Sprites/Survivors/NemesisMercenary/palette2.png create mode 100644 Sprites/Survivors/NemesisMercenary/palette3.png create mode 100644 Sprites/Survivors/NemesisMercenary/palette4.png delete mode 100644 Sprites/Survivors/Technician/portraitPROV.png delete mode 100644 Sprites/Survivors/Technician/portraitS1.png delete mode 100644 Sprites/Survivors/Technician/portraitS2.png delete mode 100644 Sprites/Survivors/Technician/portraitS3.png delete mode 100644 Sprites/Survivors/Technician/portraitS4.png delete mode 100644 Sprites/Survivors/Technician/portraitSmallPROV.png delete mode 100644 Sprites/Survivors/Technician/portraitSmallS1.png delete mode 100644 Sprites/Survivors/Technician/portraitSmallS2.png delete mode 100644 Sprites/Survivors/Technician/portraitSmallS3.png delete mode 100644 Sprites/Survivors/Technician/portraitSmallS4.png delete mode 100644 Sprites/Survivors/Technician/selectPROV.png delete mode 100644 Sprites/Survivors/Technician/selectS1.png delete mode 100644 Sprites/Survivors/Technician/selectS2.png delete mode 100644 Sprites/Survivors/Technician/selectS3.png delete mode 100644 Sprites/Survivors/Technician/selectS4.png diff --git a/Artifacts/displacement.lua b/Artifacts/displacement.lua index 31fe3df8..d0d3d9d7 100644 --- a/Artifacts/displacement.lua +++ b/Artifacts/displacement.lua @@ -13,10 +13,13 @@ local potentialEnvs = List.new() -- this is where we will put environments that local validEnvs = List.new() -- this is where we will put all valid environments (no boar beach cuz its a secret and no risk of rain cuz its a final environment for example) local hook = Hook.add_post(gm.constants.stage_roll_next, function(self, other, result, args) + print("hi") if not displacement.active then return end validEnvs:clear() + print("hi2") + for i = 1, 4 do -- go through 4 tiers of stages, we exclude tier 6 because we dont want to randomly go to risk of rain, and we exclude tier 5 stages because artifact of tempus can easily be cheesed if temple of the elders is chosen as one of the first stages (it also breaks the onstep code of the artifact's object for some reason? no clue why) local envs = List.wrap(gm._mod_stage_get_pool_list(i)) -- get all environments in a tier for _, env in ipairs(envs) do @@ -41,6 +44,8 @@ local hook = Hook.add_post(gm.constants.stage_roll_next, function(self, other, r local randomEnv = math.random(1, #potentialEnvs) -- pick a random environment from list of potential environments local upcomingEnv = potentialEnvs[randomEnv] -- set the next environment to the one picked above + print(upcomingEnv) + result.value = upcomingEnv -- make the script transport you to the upcoming environment instead of the usual one -- delete the selected environment from the list of potential ones so we dont encounter it again diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cd6b3d9..7d8f0a83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # SSR Changelog *spoilers below!!* +## 0.1.8 +- Added skins back! +- Updated Nemesis Mercenary's CSS sprite +- Added a Korean translation (pixelvoxel) +- Added a Chinese translation (Eskevor) +- Resprited Executioner's CSS sprite +- Updated to the last ReturnsAPI version +- +- + ## 0.1.7 - Mod ported to ReturnsAPI - Disabled skins (ReturnsAPI does not support them as of yet) diff --git a/Gameplay/nemesis_spawn_portal.lua b/Gameplay/nemesis_spawn_portal.lua index 368e2211..5ca8b3fa 100644 --- a/Gameplay/nemesis_spawn_portal.lua +++ b/Gameplay/nemesis_spawn_portal.lua @@ -63,7 +63,7 @@ end) Callback.add(Callback.ON_STAGE_START, function() if GM._mod_game_getDirector().stages_passed > 0 then return end if Global.__gamemode_current >= 2 then return end - if Net.online then return end + if Global.coop > 0 then return end if Instance.find(gm.constants.oP).is_nemesis then local pod = Instance.find(gm.constants.oBase) diff --git a/Items/balloon.lua b/Items/balloon.lua index a7b30ea2..07771b5a 100644 --- a/Items/balloon.lua +++ b/Items/balloon.lua @@ -84,7 +84,10 @@ Callback.add(Callback.ON_STEP, function() local b = data.balloons[i] local tx = actor.ghost_x - local ty = actor.ghost_y-50 + local ty = actor.y - 50 + if actor.ghost_y then + ty = actor.ghost_y - 50 + end local ang = math.floor(i * 0.5) * GOLDEN_RATIO local mag = math.sqrt(ang) * 1.8 diff --git a/Items/dormantFungus.lua b/Items/dormantFungus.lua index 9e2d77d2..a74de3df 100644 --- a/Items/dormantFungus.lua +++ b/Items/dormantFungus.lua @@ -11,30 +11,32 @@ ItemLog.new_from_item(dungus) Callback.add(Callback.ON_STEP, function() for _, actor in ipairs(dungus:get_holding_actors()) do - if Instance.exists(actor) then - local stack = actor:item_count(dungus) - - if (math.abs(actor.pHspeed) >= actor.pHmax * 0.98) or actor.pVspeed ~= 0 then - local data = Instance.get_data(actor) + if actor.pHspeed then + if Instance.exists(actor) then + local stack = actor:item_count(dungus) + + if (math.abs(actor.pHspeed) >= actor.pHmax * 0.98) or actor.pVspeed ~= 0 then + local data = Instance.get_data(actor) - if not data.dungusTimer then - data.dungusTimer = 120 - end - if data.dungusTimer <= 0 then - data.dungusTimer = 120 - - if Net.host then - actor:heal(math.ceil(actor.maxhp * (1 - 1 / (0.02 * stack + 1)))) + if not data.dungusTimer then + data.dungusTimer = 120 end - - actor:sound_play(sound, 1, 0.9 + math.random() * 0.2) - - -- copied and pasted from uranium horseshoe basically - if actor:is_grounded() then - ssr_create_fadeout(actor.x, actor.bbox_bottom + 1, 1, sprite_footstep, 0.25, 0.05) + if data.dungusTimer <= 0 then + data.dungusTimer = 120 + + if Net.host then + actor:heal(math.ceil(actor.maxhp * (1 - 1 / (0.02 * stack + 1)))) + end + + actor:sound_play(sound, 1, 0.9 + math.random() * 0.2) + + -- copied and pasted from uranium horseshoe basically + if actor:is_grounded() then + ssr_create_fadeout(actor.x, actor.bbox_bottom + 1, 1, sprite_footstep, 0.25, 0.05) + end + else + data.dungusTimer = data.dungusTimer - 1 end - else - data.dungusTimer = data.dungusTimer - 1 end end end diff --git a/Items/x4Stimulant.lua b/Items/x4Stimulant.lua index 4c1f862a..2d530628 100644 --- a/Items/x4Stimulant.lua +++ b/Items/x4Stimulant.lua @@ -19,7 +19,7 @@ RecalculateStats.add(function(actor, api) local stack = actor:buff_count(x4Buff) if stack <= 0 then return end - api.hp_regen_mult(REGEN + REGEN_STACK * (actor:item_count(x4Stimulant) - 1)) + api.hp_regen_add(REGEN + REGEN_STACK * (actor:item_count(x4Stimulant) - 1)) end) RecalculateStats.add(function(actor) @@ -28,9 +28,8 @@ RecalculateStats.add(function(actor) local secondary = actor:get_active_skill(Skill.Slot.SECONDARY) - -- counts in frames. has to be rounded otherwise the cooldown stopwatch breaks ! local mult = 0.9 ^ stack - secondary.cooldown = math.ceil(secondary.cooldown * mult) + api.skill_secondary.cooldown_mult(mult) end) Callback.add(Callback.ON_SKILL_ACTIVATE, function(actor, slot) diff --git a/Language/english.lua b/Language/english.lua index 960590e2..0299de80 100644 --- a/Language/english.lua +++ b/Language/english.lua @@ -142,7 +142,7 @@ return { description = "Fire a rocket for 1000% damage to a single enemy. Surrounding enemies take 50% damage and are scattered.\nIf used airborne, fire downward at an angle.\nHold up to 2." }, nemesisMercenaryZ = { - name = "Lascerate", + name = "Lacerate", description = "Quickly slash enemies in front of you for 100% damage." }, nemesisMercenaryX = { @@ -171,7 +171,7 @@ return { }, technicianX = { name = "Forced Shutdown", - description = "Toss out a bomb dealing 400% damage on reactivation.\nStuns and passively pulls in enemies when upgraded." + description = "Toss out a bomb dealing 500% damage on reactivation.\nStuns and passively pulls in enemies when upgraded." }, technicianXD = { name = "The Red Button", diff --git a/Language/koreana.lua b/Language/koreana.lua new file mode 100644 index 00000000..e188c218 --- /dev/null +++ b/Language/koreana.lua @@ -0,0 +1,564 @@ +return { + difficulty = { + typhoon = { + name = "태풍", + description = "최고의 도전.\n행성은 악몽에 휩싸일 것이고, 생존한다는 것은 환상과도 같습니다.\n누구도 감당하지 못할 것입니다.", + }, + }, + + survivor = { + executioner = { + name = "익스큐셔너", + nameUpper = "익스큐셔너", + description = "익스큐셔너는 적의 머릿수를 줄이는 데 특화된 기동형 전사입니다. 이온 투사기를 사용하여 적들을 공포에 질려 달아나게 만드는 환영을 생성하며, 동시에 도끼를 투사하여 가장 강력한 적들을 처단합니다. 이온 버스트와 처형을 연계해 연속 처치를 달성하고 끊임없이 몰아치세요.", + endQuote = "...그렇게 그는 떠났다, 채워지지 않은 살육의 갈망을 품은 채.", + story = "