From 40089d17e9a7c471ba68f021f335678499b811e4 Mon Sep 17 00:00:00 2001 From: Priskip <111097864+Priskip@users.noreply.github.com> Date: Sat, 12 Nov 2022 12:02:25 -0500 Subject: [PATCH] beta 12 nov 2022 --- README.txt | 370 +----------------- change_log.txt | 370 ++++++++++++++++++ data/biome/roboroom.xml | 233 +++++++++++ .../animals/boss_alchemist/boss_alchemist.xml | 54 +-- .../projectile_counter_create_damage.lua | 49 +++ data/entities/animals/boss_pit/boss_pit.xml | 5 +- .../entities/animals/boss_robot/anchoring.lua | 23 +- .../animals/boss_robot/boss_robot.xml | 79 ++-- .../animals/boss_robot/spell_eater.lua | 2 +- data/entities/animals/boss_robot/state.lua | 1 - data/scripts/biomes/roboroom.lua | 5 + files/alchemy_predictor.lua | 130 ++++++ files/biome_impl/debug/biome_map_debug.png | Bin 419 -> 432 bytes files/biome_impl/roboroom/roboroom_mat.png | Bin 7718 -> 7731 bytes .../roboroom/mecha_turret_light_red.png | Bin 0 -> 793 bytes .../roboroom/mecha_turret_light_red.xml | 21 + files/debug_magic_numbers.xml | 4 +- .../animals/boss_dragons/fire_dragon.xml | 74 ++-- .../animals/boss_dragons/ice_dragon.xml | 74 ++-- .../animals/boss_dragons/poison_dragon.xml | 74 ++-- .../boss_robot/activation_point_listener.lua | 16 +- .../damage_multipliers_manipulation.lua | 77 ++++ ...ret_aiming.lua => mecha_turret_aiming.lua} | 0 ..._turret_fire.lua => mecha_turret_fire.lua} | 43 +- .../animals/boss_robot/tesla_turret_fire.xml | 99 ----- .../buildings/roboroom/activation_trigger.xml | 17 + .../buildings/roboroom/mecha_turret.xml | 160 +++++--- .../items/pickup/comically_large_potion.xml | 6 + files/entities/misc/test.xml | 112 ++---- files/materials/LC_AP_recipes.xml | 1 - files/materials/LP_AC_reagents.lua | 52 --- .../blackhole_shot/background.png | Bin 19521 -> 19673 bytes files/scripts/ap_lc_recipe_gen.lua | 97 ----- .../biomes/alchemist_arena/arena_left.lua | 5 +- .../biomes/alchemist_arena/arena_right.lua | 5 +- files/scripts/boss_bars/boss_bar.lua | 24 +- .../buildings/roboroom/activation_trigger.lua | 48 +++ files/scripts/gun/gun_actions.lua | 5 +- files/scripts/perks/starting_perk_pools.lua | 4 +- files/scripts/test.lua | 47 +-- files/scripts/test2.lua | 11 +- files/scripts/utils.lua | 14 - files/translations/common.csv | 6 +- files/translations/translations_utils.lua | 2 - files/ui_gfx/boss_bars/dragons.png | Bin 2669 -> 0 bytes files/ui_gfx/boss_bars/fire_dragon_fill.png | Bin 0 -> 127 bytes .../ui_gfx/boss_bars/fire_dragon_outline.png | Bin 0 -> 960 bytes files/ui_gfx/boss_bars/ice_dragon_fill.png | Bin 0 -> 128 bytes files/ui_gfx/boss_bars/ice_dragon_outline.png | Bin 0 -> 897 bytes files/ui_gfx/boss_bars/poison_dragon_fill.png | Bin 0 -> 127 bytes .../boss_bars/poison_dragon_outline.png | Bin 0 -> 887 bytes init.lua | 96 +++-- mod.xml | 2 +- 53 files changed, 1411 insertions(+), 1106 deletions(-) create mode 100644 change_log.txt create mode 100644 data/biome/roboroom.xml create mode 100644 data/entities/animals/boss_alchemist/projectile_counter_create_damage.lua create mode 100644 files/alchemy_predictor.lua create mode 100644 files/buildings_gfx/roboroom/mecha_turret_light_red.png create mode 100644 files/buildings_gfx/roboroom/mecha_turret_light_red.xml create mode 100644 files/entities/animals/boss_robot/damage_multipliers_manipulation.lua rename files/entities/animals/boss_robot/{tesla_turret_aiming.lua => mecha_turret_aiming.lua} (100%) rename files/entities/animals/boss_robot/{tesla_turret_fire.lua => mecha_turret_fire.lua} (71%) delete mode 100644 files/entities/animals/boss_robot/tesla_turret_fire.xml create mode 100644 files/entities/buildings/roboroom/activation_trigger.xml delete mode 100644 files/materials/LC_AP_recipes.xml delete mode 100644 files/materials/LP_AC_reagents.lua delete mode 100644 files/scripts/ap_lc_recipe_gen.lua create mode 100644 files/scripts/buildings/roboroom/activation_trigger.lua delete mode 100644 files/ui_gfx/boss_bars/dragons.png create mode 100644 files/ui_gfx/boss_bars/fire_dragon_fill.png create mode 100644 files/ui_gfx/boss_bars/fire_dragon_outline.png create mode 100644 files/ui_gfx/boss_bars/ice_dragon_fill.png create mode 100644 files/ui_gfx/boss_bars/ice_dragon_outline.png create mode 100644 files/ui_gfx/boss_bars/poison_dragon_fill.png create mode 100644 files/ui_gfx/boss_bars/poison_dragon_outline.png diff --git a/README.txt b/README.txt index ad9d0ee..2591a63 100644 --- a/README.txt +++ b/README.txt @@ -2,7 +2,8 @@ Purgatory Mod for Noita Author: Priskip -This mod aims to improve the nightmare mode experience by adding all the stuff from normal mode into a nightmare environment. It also adds new stuff and expands on some things I felt like are missing in the base game. +This mod aims to improve the nightmare mode experience by adding all the stuff from normal mode into a nightmare environment. +It also adds new stuff and expands on some things I felt like are missing in the base game. Main Features include: -- All the fun stuff of nightmare including the hp and damage scaling. @@ -17,6 +18,16 @@ Installing Instructions: -- Rename folder to just "purgatory" -- If init.lua is in the position "C:\Program Files (x86)\Steam\steamapps\common\Noita\mods\purgatory\init.lua", then you are good to go! +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- WARNING -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= USING MOD RESTART WILL BREAK PURGATORY -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= DO NOT USE MOD RESTART WHILE PLAYING THIS MOD =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +-=- IT IS A BUG IN THE GAME ENGINE THAT PREVENTS IT FROM LOADING GAMEMODE MODS PROPERLY AFTER A MOD RESTART -=- +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- INSTEAD, USE "SAVE AND EXIT" TO RELOAD THE GAME -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + Thank you's for everyone who helped with this mod. Strophox - "World Eater" and "Spark Bolt with Trigger and Expiration Trigger" sprites - Spatial Awareness Art @@ -47,359 +58,4 @@ Streamers who played during mod's beta Libraries Used: Zatherz' XML parser library: https://github.com/zatherz/luanxml - -Change Log - -Beta Build 28 Oct 2022 - - Mecha Kolmi Revamp - - Added Runestone of Polymorph - - Made it so that runestones can now spawn pre-activated once again - - Nerfed some strong alchemic recipes - - Nerfed Increase Gold Spell - - Fixed Entity Vacuum Field's related projectile (it's set as liquid vacuum field in the vanilla game) - - Made it so that if the player walks near a wand, the wand stops sparkling (will change to custom particle effect if negative feedback is recieved) - - Burnt a bridge - - Added a custom description to Perk Lottery when it spawns in the starting perk selection to clear up some confusion on how it (doesn't) work - - New Spells: - - Pollen Ball - - Bubble Spark with Expiration Trigger - - Blackhole Shot -- Boss HP Bars on Alchemist, Sauvojen, and Mecha Kolmi (Dragon and Kolmi's hp bars are in the works) - -Beta Build 25 Aug 2022 - - This mod is now on Github! Thank you for downloading and reading this. ^-^ - - Updated omega nuke tree achievement icon - - Fixed a bug where you could duplicate potions in the alchemy room - - Fixed a bug where you could bottle a potion above 100% - - Fixed a bug where the drain particle effect could spawn half a pixel out of position - - Added a fill gauge to the alchemy lab - -Beta 0.4.0 - - Future Releases will be made on GitHub as I want to get away from this version number system - - Skully Kick Minigame! - - Fixed a bug where perks in the laboratory (the HM before Kolmi) were not being properly positioned to new perk positioning. - - Ukko in a box ;) - - Changes to the biome map - * Fixed some stuff in the clouds - * Tweaked the location of something in hell - * Added the Mines back - * Gourd room totally exists - * Karl renovated his house to feel more at home in its surroundings - - Blacklisted Omega Nuke in Random Spell and Random Projectile Spell - - Added Recoil Dampener to the tower spell shop - - Wands in Overgrown Caverns have been reduced in both quality and quanity - - Wands in Frozen Vault have been increased in both quality and quanity - - Wands in Powerplant have been increased in quality - - Shadow Wizard King and Shadow Mecha Kolmi - - Suur Ukko has been exploring - - Removed Peace with Gods perk form starting perk pools - - Moved Extra Shop Item perk from 2nd group to 3rd group of starting perks - - Faster Wands gives more of a reduction for cast delay and recharge times over one second - - Faster Wands bonus to mana recharge speed is now proportional to the amount of cast delay and recharge time it reduces - - High Mana Low Capacity is nows give more mana based on how much capacity it removes - - (Hopefully) Fixed a bug in base nightmare mode where enemies with perks did not have their health scale with the biomes - - Enemies with "Extra Health" perk now gain 5 times hp instead of 1.5 times - - New Runestone: Death Crosses - - Overstock Scroll can be found and returned to the holy mountain for a reward - - New area in the holy mountain - - Made more spells work with bombs materialized (with more to come in future patches) - - New alchemy recipes - * Unstable Poly + Slime = Poly - * Chaotic Poly + Whiskey = Unstable Poly - * Ambrosia + Silver = Invis - * Rotten Meat + Fungal Soil = Green Fungus - - New Spells! - - Projectiles - -Freezing Vapour Mist - -Pollen with expiration trigger - -Spark bolt with expiration trigger - -Spark bolt with timer and expiration trigger - -Spark bolt with double timer - -Spark bolt with double expiration trigger - -Summon Sausage - -Modifiers - -White Glimmer - -Black Glimmer - - Static Projectiles - - Polymorphine Cloud - - Circle of Unstable Metamorphosis (Renames previous "Circle of Unstable Metamorphosis" to "Circle of chaotic metamorphosis") - - Balance Changes to Spells - Spark bolt: mana 5 --> 10 - Spark bolt with trigger: mana 10 --> 20 - Spark bolt with double trigger: mana 15 --> 25, double trigger now creates two separate cast states instead of a single cast state with two draw - Spark bolt with trigger and timer: mana 10 --> 20 - Spark bolt with trigger and expiration trigger: mana 10 --> 20 - Magic arrow with trigger: mana 35 --> 25 - Magic arrow with timer: mana 35 --> 20 - Magic bolt: mana 35 --> 25 - Magic bolt with trigger: mana 40 --> 30 - Magic bolt with timer: mana 40 --> 25 - Energy orb with trigger: mana 50 --> 35 - Energy orb with timer: mana 50 --> 35 - Spitter bolt with timer: mana 10 --> 5 - Large spitter bolt: mana 25 --> 15 - Large spitter bolt with timer: mana 30 --> 15 - Giant spitter bolt: mana 40 --> 20, damage 15 --> 20 - Giant spitter bolt with timer: mana 45 --> 20, damage 15 --> 20 - Bubble spark with trigger: mana 16 --> 10 - Energy sphere: mana 20 --> 15 - Energy sphere with timer: mana 50 --> 15 - Bouncing burst: mana 5 --> 1 - Arrow: mana 15 --> 5 - Glowing Lance: mana 30 --> 20 - Concentrated light: mana 30 --> 25 - Intense concentrated light: mana 110 --> 50 - Luminous drill with timer: mana 30 --> 10 - Chain bolt: mana 80 --> 20 - Fireball: mana 70 --> 30 - Flamethrower: mana 20 --> 5, unlimited by default w/o perk, cast delay 0 --> -15, recharge time 0 --> -6 - Iceball: mana 90 --> 35 - Path of the dark flame: mana 90 --> 50 - Summon missile, mana 60 --> 60, recharge 30 --> 15, smarter custom homing - Freezing gaze: mana 45 --> 30 - Pinpoint of light: mana 65 --> 45, spread +6 --> -6 - Glue ball: mana 25 --> 5 - Expanding sphere: mana 70 --> 45, pierces by default, changed damage algorithm to multiply base damage and actually work with damage modifiers - Death cross: mana 80 --> 30 - Giga death cross: mana 150 --> 80 - Glittering field: mana 90 --> 50 - Toxic mist: mana 40 --> 25 - Mist of spirits: mana 40 --> 15 - Slime mist: mana 40 --> 30 - Blood mist: mana 40 --> 30 - Fireworks: mana 70 --> 35 - Reduce recharge time: mana 12 --> 8 - Increase lifetime: mana 40 --> 20 - Phasing Arc: mana 2 --> 10 - Drilling shot: mana 160 --> 30, cast delay +50 --> +15, recharge time +40 --> +6 - Damage field: mana 30 --> 15 - Charm on toxic sludge: mana 70 --> 5 - Giant explosion on slimy enemies: mana 200 --> 40 - Giant explosion on drunk enemies: mana 200 --> 40 - Larpa bounce: mana 80 --> 50 - Fireball thrower: mana 110 --> 20 - Lightning thrower: mana 110 --> 20 - Tentacler: mana 110 --> 20 - Plasma beam thrower: mana 110 --> 20 - Two way fireball thrower: mana 130 --> 25 - Sawblade orbit: mana 70 --> 40 - Orbit larpa: mana 90 --> 75 - Chain spell: mana 70 --> 35 - Chaos larpa: mana 100 --> 60 - Downwards larpa: mana 120 --> 70 - Upwards larpa: mana 120 --> 70 - Copy trail: mana 150 --> 75 - Larpa explosion: mana 90 --> 50 - -Beta 0.3.4 - - Fixed a bug where you piss lava instead of urine - - Fixed a bug where Hamis could turn into a taikasauva - - Hiisi Base anvil will now always returns a no shuffle wand when reforging broken wands - - The more broken wands you reforge, the better they will become - -Beta 0.3.3 - - Fixed a bug with powder sack and potion spells turning into summon taikasauva under certain conditions (yeah this game is weird) - - Fixed a bug with Dark Beam not accepting Add Trigger/Timer/Expiration Trigger spells - - Material Urine spells applies jarate to spells like Material Water/Oil/Blood applies their stain effects to spells - - Added the new material spells to the Ylialkemisti's drop pool - - Added Golden Vacuum Field, Gold Multiplier, and Omega Propane to Tower's spell shop pool - -Beta 0.3.2 - - Fixed a bug where my custom AP and LC recipes were not being initialized upon continuing a run - - Reduced amount of Hastium required for Kiirikivi from 5000 to 3000 - - Renamed the large potions Ylialkemisti throws to "Comically Large Potions" - -Beta 0.3.1 - - Tweaked the Alchemist Fight (Made him harder) - - Tweaked the Sauvojen Fight (Made him much harder) - - Fixed Haste being in default perk pool - - Friendly Hamis are no longer homing targets - - Added the sun attracting note back to the magic temple (My apologies to anyone who tried to do omega nuke quest without it) - - Fixed the Kantele and Ocarina note portals not taking you to the mountain - - Fixed a bug causing boss music to play for Shadow Alchemist - - Updated some sprites and stuff - - New Spell "Urine" - - New Spell "Random Glimmer" (does what rainbow glimmer used to do) - - Changed Rainbow Glimmer to be more rainbowy - - Cauldrons in alch arena don't spawn with stuff outside them now - - Paint spells now work on laser beams - - Enemies learnt how to use homing spells - - Vampirism now has no HP penalty - - New Perk "Heart Eater" added to starter perk pool in the middle section - - New Perk "Cryo Blood" - - Fixed a bug with Heretic Moon's pit bosses - - Fixed a bug with ice dragon freezing through freeze immunity - - Added a hint to get hints at Avarice - - Made Omega Nuke's regular explosion more damaging to terrain - - Tweeked Giga Propane - - Tweeked Omega Propane - -Beta 0.3.0 - - Hopefully fixed some biome disappearing bugs - but mod restart is broken... - I'd recomend NOT USING MOD RESTART. - Instead, close the game with SAVE AND QUIT and reload from main menu - - Fixed a bug from 0.2.2 where Tower enemies weren't getting buffed - - Extra Lives will eventually realize when they've been spent - - Updated Spacial Awareness Tier 3 to reflect a change in location of a secret - - Changed the starting potion pools a bit - - Fixed No Edit Start tree achievement getting assigned when not doing a no edit run - - Added a setting to reset Purgatory Tree Achievements - - Healthium Recipe (Pheremone + Blood + Any Polymorph) - - Enabling No Wand Editting Start in Purgatory's Options now removes Edit Wands Everywhere from the perk pool - - Removed Personal Plasma Beam Perk (replaced it with a passive spell) - - New Wand and Spell Generation system for the starting wands - Wands found in the world are not affected - You should be guarenteed one non-shuffle wand at the start (if this doesn't happen, yell at me) - - New Alchemist Fight and arena - - Moved a gold pile somewhere else - - Perks in Holy Mountains organize themselves better - - Max amount of Extra Perk perks the player can take increased from 5 to 11 - - All Death trigger spells now have death trigger icons - - Toxic Immunity removed from starting perk immunity pool - - Added Freeze Immunity - - Freeze Field grants Freeze Immunity in addition to Fire Immunity - - Taking one form of an immunity should remove the other from the perk pool - - Taking Glass Cannon should remove Extra HP and Stronger Hearts from the perk pool - - Karl is a thing that exists - - All "Spells to X" spells become unlimited with Unlimited Spells perk - - Extra Slots perk now always gives 3 extra slots - - Added Shadow Dragon (Once I change a boss, (except Kolmi), I will make their vanilla counterpart into a shadow boss) - - Multiple events can happen at Avarice, unless the player messes it up - - Mastarian now drops the crystal key instead of Alchemist (he'll get his rework next update) - - Combined Faster Lev and Faster Movement into Haste - - New Sauvojen Tuntija fight - - No More Knockback gains damage flash removal - - New Spells! - * Projectiles - Giga Propane Tank - Omega Propane Tank - Dark Beam - Omega Nuke - * Static Projectiles - Golden Vacuum Field - * Modifiers - Chaotic Trail - Increase Gold - * Multicasts - Formation - cross - * Materials - Lava - Explosive Gunpowder - Dirt - * Others - Requirement - Mana - * Utilities - Summon Potion Flask - Summon Powder Sack - Summon Hamis - Spells to Propane - Spells to Ducks - * Passives - Personal Plasma Beam - -Beta 0.2.2 -Brought enemies in Tower to nightmare hp and attack speed (between nightmare Art and Hell difficulty) -Glass Cannon hp floor buffed (50 --> 100) -The altar now knows the difference between a normal chest and a great chest - -Beta 0.2.1 -Fixed a weird bug where restarting near cursed rock in the bottom of the world summons the void -Fixed Low and High Gravity not being in the default perk pool -Last Dragon drops a full hp on death - -Beta 0.2.0 -Upgraded Dragon Fight - 3x the fun! -Kolmi's HP starts at 11 orbs and increases with orbs/ng+ as usual - This can result in a max hp "75 orb" Kolmi of 2,325,566,045,260,890,000,000,000 hp - Kolmi's abilities are unaffected by the hp increase (aka 0 orb Kolmi has the health of 11 orb Kolmi, but no shield or anything) -Improved randomness of starting wands -Changes to starting immunity perks spawn - The first choice is always an immunity with a side effect (ie exploding corpses) - The second choice is always an immunity as is (like explosion immunity) - The two immunities perks should not offer the same immunity -Changes to LC and AP - Changed vanilla LC and AP so that they evaporate quickly to make way for modded version of them. - Added a modded version of LC and AP. - Modded LC and AP are both made from 3 random materials that can be found in potions and flasks around the world. - Modded LC and AP are made from 1 "regular" potion material, 1 "magical" potion material, and 1 pouch material. - Modded LC and AP will quickly convert any of their base ingrediants into more AP/LC - -Beta 0.1.1 -Fixed an attack speed bug -Fixed a bug preventing tier 10 wands in Heaven -Fixed a bug with World Eater preventing you from casting other spells in the same spell block as it -Adjusted stats on World Eater - -Beta 0.1.0 -Strophox made me some really nice icons for Spatial Awareness (Many Thanks!) -Player starts with 3 sparks bolts and 1 bomb spell in their inventory in case wand RNG is a bitch -A new pillar has grown on the tree -Sun Quest Hints are back (in different spots of course) -Spell for sale in Tower (with custom pool of spells it draws from) -Potion Pool revamped: - - Alchemic Precursor - + Poison - + Glue - + Ominous Liquic - + Urine - + Worm Blood -Updated item spawn list (There are more runestones than Runestone of Edges) -Tier 10 wands should now be found in Heaven instead of Hell - -Alpha 0.0.4 -Improved randomness of the starting wands -Fixed a typo in that resulted in the Snowy Eye teleporting you to Overgrown Caverns -Fixed a bug with the green starting wand that could cause it to become a dud -Starting perks float a bit more -New Perk: Roll Again (Make Sac Great Chest event later) -Made Power Plant bigger -Avarice Diamond is back (and in parallels) -Made Leviathan only shift water once -Made Leviathan spawn a platform on death to catch his drops -Better icon for game mode menu (Thank you Strophox!) -Fixed a bug causing you to take insane amounts of damage by reloading a save -Healthium no longer causes stains -Fixed a bug where mod restarting would revert the biome generation to normal mode -Spatial Awareness can count better than Priskip -Spatial Awareness now makes you spatially aware -Spatial Awareness comes in 4 tiers now (Kill Mecha Kolmi multiple times for higher tiers) - -Alpha 0.0.3 -New Spells are in good spots in Progress list -Buffed Matter Eater (20 shots, 50 Mana, Becomes unlimited with Unlimited Spells perk) -Added High and Low Gravity back into the game -Granted Melee Immunity to Contact Damage - making Melee Immunity have an alternate perk like the other four immunities -New logic for starting perks. There are 3 groups of perks and the player gets to choose 1 from each group. First group is immunities, 2nd is "good" perks, 3rd is "meh" perks. -You start with 4 starting wands of various tiers -You start with 2 potions - one of "normal" materials and one of "magical" materials -Lake Island is back... but only in center world (might be extra ducks) -Pit Boss has renovated his home - -Alpha 0.0.2 -Potion Pool revamped { - Potions that can now be found: - Ambrosia - Invisibily - Rainbow - Healthium - Alchemic Precursor -} -Ukkoskivi and Kiuskivi are no longer the only elemental stones found in the wild -Leviathan's Portal Room is working now -Hiisi Base Anvil now exists in this world and the next one and the next one and the next one... -Hiis Base Hourglass Room teleporter works -Snowy Depths Eye Room teleporter works -Coal Pits Meditation Cube teleporter works - -Alpha 0.0.11 -Fixed an issue with terrain gen drawing from regular nightmare's map - -Alpha 0.0.1 -All mini bosses spawn in parallel worlds -Gate Boss is mirrored -Tower Wands Buffed -New Spell: World Eater (Exclusive find in Tower) -Tower layers start at coal pits -Tower portals will keep you in parallel worlds -Player starts with Edit Wands Everywhere \ No newline at end of file +Prediction Algorithm for LC and AP by Neff#6398: https://neffc.github.io/narg/ diff --git a/change_log.txt b/change_log.txt new file mode 100644 index 0000000..526bab2 --- /dev/null +++ b/change_log.txt @@ -0,0 +1,370 @@ +Change Log + +Beta Build 12 Nov 2022 + - Tweaked some secrets at Ylialkemisti's + - Reduced the amount of shields Ylialkemisti can spam to improve performance during his fight + - Indluded a warning both here in the read me and when you hover over the mod restart button to NOT USE THE MOD RESTART BUTTON + - Moved Wand Experimenter to the middle group of starting perks + - Made Chaotic Trail limited uses (becomes unlimited with Unlimited Spells perk) + - Tweaked Comically Large Potions a bit + - Renamed Mecha Kolmi's room to "Reactor Core" + - Tweaked how Mecha Kolmi is anchored to the power plant core. It looks more natural now. + - Made Mecha Kolmi Freeze Immune (No idea why he isn't in vanilla) + - Fixed Mecha Turret Hitbox Bug + - Mecha's damage models scale with number of turrets alive in the arena + - Mecha Kolmi will now only activate upon the player entering the core + - Added Dragon's HP Bars + +Beta Build 28 Oct 2022 + - Mecha Kolmi Revamp + - Added Runestone of Polymorph + - Made it so that runestones can now spawn pre-activated once again + - Nerfed some strong alchemic recipes + - Nerfed Increase Gold Spell + - Fixed Entity Vacuum Field's related projectile (it's set as liquid vacuum field in the vanilla game) + - Made it so that if the player walks near a wand, the wand stops sparkling (will change to custom particle effect if negative feedback is recieved) + - Burnt a bridge + - Added a custom description to Perk Lottery when it spawns in the starting perk selection to clear up some confusion on how it (doesn't) work + - New Spells: + - Pollen Ball + - Bubble Spark with Expiration Trigger + - Blackhole Shot +- Boss HP Bars on Alchemist, Sauvojen, and Mecha Kolmi (Dragon and Kolmi's hp bars are in the works) + +Beta Build 25 Aug 2022 + - This mod is now on Github! Thank you for downloading and reading this. ^-^ + - Updated omega nuke tree achievement icon + - Fixed a bug where you could duplicate potions in the alchemy room + - Fixed a bug where you could bottle a potion above 100% + - Fixed a bug where the drain particle effect could spawn half a pixel out of position + - Added a fill gauge to the alchemy lab + +Beta 0.4.0 + - Future Releases will be made on GitHub as I want to get away from this version number system + - Skully Kick Minigame! + - Fixed a bug where perks in the laboratory (the HM before Kolmi) were not being properly positioned to new perk positioning. + - Ukko in a box ;) + - Changes to the biome map + * Fixed some stuff in the clouds + * Tweaked the location of something in hell + * Added the Mines back + * Gourd room totally exists + * Karl renovated his house to feel more at home in its surroundings + - Blacklisted Omega Nuke in Random Spell and Random Projectile Spell + - Added Recoil Dampener to the tower spell shop + - Wands in Overgrown Caverns have been reduced in both quality and quanity + - Wands in Frozen Vault have been increased in both quality and quanity + - Wands in Powerplant have been increased in quality + - Shadow Wizard King and Shadow Mecha Kolmi + - Suur Ukko has been exploring + - Removed Peace with Gods perk form starting perk pools + - Moved Extra Shop Item perk from 2nd group to 3rd group of starting perks + - Faster Wands gives more of a reduction for cast delay and recharge times over one second + - Faster Wands bonus to mana recharge speed is now proportional to the amount of cast delay and recharge time it reduces + - High Mana Low Capacity is nows give more mana based on how much capacity it removes + - (Hopefully) Fixed a bug in base nightmare mode where enemies with perks did not have their health scale with the biomes + - Enemies with "Extra Health" perk now gain 5 times hp instead of 1.5 times + - New Runestone: Death Crosses + - Overstock Scroll can be found and returned to the holy mountain for a reward + - New area in the holy mountain + - Made more spells work with bombs materialized (with more to come in future patches) + - New alchemy recipes + * Unstable Poly + Slime = Poly + * Chaotic Poly + Whiskey = Unstable Poly + * Ambrosia + Silver = Invis + * Rotten Meat + Fungal Soil = Green Fungus + - New Spells! + - Projectiles + -Freezing Vapour Mist + -Pollen with expiration trigger + -Spark bolt with expiration trigger + -Spark bolt with timer and expiration trigger + -Spark bolt with double timer + -Spark bolt with double expiration trigger + -Summon Sausage + -Modifiers + -White Glimmer + -Black Glimmer + - Static Projectiles + - Polymorphine Cloud + - Circle of Unstable Metamorphosis (Renames previous "Circle of Unstable Metamorphosis" to "Circle of chaotic metamorphosis") + - Balance Changes to Spells + Spark bolt: mana 5 --> 10 + Spark bolt with trigger: mana 10 --> 20 + Spark bolt with double trigger: mana 15 --> 25, double trigger now creates two separate cast states instead of a single cast state with two draw + Spark bolt with trigger and timer: mana 10 --> 20 + Spark bolt with trigger and expiration trigger: mana 10 --> 20 + Magic arrow with trigger: mana 35 --> 25 + Magic arrow with timer: mana 35 --> 20 + Magic bolt: mana 35 --> 25 + Magic bolt with trigger: mana 40 --> 30 + Magic bolt with timer: mana 40 --> 25 + Energy orb with trigger: mana 50 --> 35 + Energy orb with timer: mana 50 --> 35 + Spitter bolt with timer: mana 10 --> 5 + Large spitter bolt: mana 25 --> 15 + Large spitter bolt with timer: mana 30 --> 15 + Giant spitter bolt: mana 40 --> 20, damage 15 --> 20 + Giant spitter bolt with timer: mana 45 --> 20, damage 15 --> 20 + Bubble spark with trigger: mana 16 --> 10 + Energy sphere: mana 20 --> 15 + Energy sphere with timer: mana 50 --> 15 + Bouncing burst: mana 5 --> 1 + Arrow: mana 15 --> 5 + Glowing Lance: mana 30 --> 20 + Concentrated light: mana 30 --> 25 + Intense concentrated light: mana 110 --> 50 + Luminous drill with timer: mana 30 --> 10 + Chain bolt: mana 80 --> 20 + Fireball: mana 70 --> 30 + Flamethrower: mana 20 --> 5, unlimited by default w/o perk, cast delay 0 --> -15, recharge time 0 --> -6 + Iceball: mana 90 --> 35 + Path of the dark flame: mana 90 --> 50 + Summon missile, mana 60 --> 60, recharge 30 --> 15, smarter custom homing + Freezing gaze: mana 45 --> 30 + Pinpoint of light: mana 65 --> 45, spread +6 --> -6 + Glue ball: mana 25 --> 5 + Expanding sphere: mana 70 --> 45, pierces by default, changed damage algorithm to multiply base damage and actually work with damage modifiers + Death cross: mana 80 --> 30 + Giga death cross: mana 150 --> 80 + Glittering field: mana 90 --> 50 + Toxic mist: mana 40 --> 25 + Mist of spirits: mana 40 --> 15 + Slime mist: mana 40 --> 30 + Blood mist: mana 40 --> 30 + Fireworks: mana 70 --> 35 + Reduce recharge time: mana 12 --> 8 + Increase lifetime: mana 40 --> 20 + Phasing Arc: mana 2 --> 10 + Drilling shot: mana 160 --> 30, cast delay +50 --> +15, recharge time +40 --> +6 + Damage field: mana 30 --> 15 + Charm on toxic sludge: mana 70 --> 5 + Giant explosion on slimy enemies: mana 200 --> 40 + Giant explosion on drunk enemies: mana 200 --> 40 + Larpa bounce: mana 80 --> 50 + Fireball thrower: mana 110 --> 20 + Lightning thrower: mana 110 --> 20 + Tentacler: mana 110 --> 20 + Plasma beam thrower: mana 110 --> 20 + Two way fireball thrower: mana 130 --> 25 + Sawblade orbit: mana 70 --> 40 + Orbit larpa: mana 90 --> 75 + Chain spell: mana 70 --> 35 + Chaos larpa: mana 100 --> 60 + Downwards larpa: mana 120 --> 70 + Upwards larpa: mana 120 --> 70 + Copy trail: mana 150 --> 75 + Larpa explosion: mana 90 --> 50 + +Beta 0.3.4 + - Fixed a bug where you piss lava instead of urine + - Fixed a bug where Hamis could turn into a taikasauva + - Hiisi Base anvil will now always returns a no shuffle wand when reforging broken wands + - The more broken wands you reforge, the better they will become + +Beta 0.3.3 + - Fixed a bug with powder sack and potion spells turning into summon taikasauva under certain conditions (yeah this game is weird) + - Fixed a bug with Dark Beam not accepting Add Trigger/Timer/Expiration Trigger spells + - Material Urine spells applies jarate to spells like Material Water/Oil/Blood applies their stain effects to spells + - Added the new material spells to the Ylialkemisti's drop pool + - Added Golden Vacuum Field, Gold Multiplier, and Omega Propane to Tower's spell shop pool + +Beta 0.3.2 + - Fixed a bug where my custom AP and LC recipes were not being initialized upon continuing a run + - Reduced amount of Hastium required for Kiirikivi from 5000 to 3000 + - Renamed the large potions Ylialkemisti throws to "Comically Large Potions" + +Beta 0.3.1 + - Tweaked the Alchemist Fight (Made him harder) + - Tweaked the Sauvojen Fight (Made him much harder) + - Fixed Haste being in default perk pool + - Friendly Hamis are no longer homing targets + - Added the sun attracting note back to the magic temple (My apologies to anyone who tried to do omega nuke quest without it) + - Fixed the Kantele and Ocarina note portals not taking you to the mountain + - Fixed a bug causing boss music to play for Shadow Alchemist + - Updated some sprites and stuff + - New Spell "Urine" + - New Spell "Random Glimmer" (does what rainbow glimmer used to do) + - Changed Rainbow Glimmer to be more rainbowy + - Cauldrons in alch arena don't spawn with stuff outside them now + - Paint spells now work on laser beams + - Enemies learnt how to use homing spells + - Vampirism now has no HP penalty + - New Perk "Heart Eater" added to starter perk pool in the middle section + - New Perk "Cryo Blood" + - Fixed a bug with Heretic Moon's pit bosses + - Fixed a bug with ice dragon freezing through freeze immunity + - Added a hint to get hints at Avarice + - Made Omega Nuke's regular explosion more damaging to terrain + - Tweeked Giga Propane + - Tweeked Omega Propane + +Beta 0.3.0 + - Hopefully fixed some biome disappearing bugs - but mod restart is broken... + I'd recomend NOT USING MOD RESTART. + Instead, close the game with SAVE AND QUIT and reload from main menu + - Fixed a bug from 0.2.2 where Tower enemies weren't getting buffed + - Extra Lives will eventually realize when they've been spent + - Updated Spacial Awareness Tier 3 to reflect a change in location of a secret + - Changed the starting potion pools a bit + - Fixed No Edit Start tree achievement getting assigned when not doing a no edit run + - Added a setting to reset Purgatory Tree Achievements + - Healthium Recipe (Pheremone + Blood + Any Polymorph) + - Enabling No Wand Editting Start in Purgatory's Options now removes Edit Wands Everywhere from the perk pool + - Removed Personal Plasma Beam Perk (replaced it with a passive spell) + - New Wand and Spell Generation system for the starting wands + Wands found in the world are not affected + You should be guarenteed one non-shuffle wand at the start (if this doesn't happen, yell at me) + - New Alchemist Fight and arena + - Moved a gold pile somewhere else + - Perks in Holy Mountains organize themselves better + - Max amount of Extra Perk perks the player can take increased from 5 to 11 + - All Death trigger spells now have death trigger icons + - Toxic Immunity removed from starting perk immunity pool + - Added Freeze Immunity + - Freeze Field grants Freeze Immunity in addition to Fire Immunity + - Taking one form of an immunity should remove the other from the perk pool + - Taking Glass Cannon should remove Extra HP and Stronger Hearts from the perk pool + - Karl is a thing that exists + - All "Spells to X" spells become unlimited with Unlimited Spells perk + - Extra Slots perk now always gives 3 extra slots + - Added Shadow Dragon (Once I change a boss, (except Kolmi), I will make their vanilla counterpart into a shadow boss) + - Multiple events can happen at Avarice, unless the player messes it up + - Mastarian now drops the crystal key instead of Alchemist (he'll get his rework next update) + - Combined Faster Lev and Faster Movement into Haste + - New Sauvojen Tuntija fight + - No More Knockback gains damage flash removal + - New Spells! + * Projectiles + Giga Propane Tank + Omega Propane Tank + Dark Beam + Omega Nuke + * Static Projectiles + Golden Vacuum Field + * Modifiers + Chaotic Trail + Increase Gold + * Multicasts + Formation - cross + * Materials + Lava + Explosive Gunpowder + Dirt + * Others + Requirement - Mana + * Utilities + Summon Potion Flask + Summon Powder Sack + Summon Hamis + Spells to Propane + Spells to Ducks + * Passives + Personal Plasma Beam + +Beta 0.2.2 +Brought enemies in Tower to nightmare hp and attack speed (between nightmare Art and Hell difficulty) +Glass Cannon hp floor buffed (50 --> 100) +The altar now knows the difference between a normal chest and a great chest + +Beta 0.2.1 +Fixed a weird bug where restarting near cursed rock in the bottom of the world summons the void +Fixed Low and High Gravity not being in the default perk pool +Last Dragon drops a full hp on death + +Beta 0.2.0 +Upgraded Dragon Fight + 3x the fun! +Kolmi's HP starts at 11 orbs and increases with orbs/ng+ as usual + This can result in a max hp "75 orb" Kolmi of 2,325,566,045,260,890,000,000,000 hp + Kolmi's abilities are unaffected by the hp increase (aka 0 orb Kolmi has the health of 11 orb Kolmi, but no shield or anything) +Improved randomness of starting wands +Changes to starting immunity perks spawn + The first choice is always an immunity with a side effect (ie exploding corpses) + The second choice is always an immunity as is (like explosion immunity) + The two immunities perks should not offer the same immunity +Changes to LC and AP + Changed vanilla LC and AP so that they evaporate quickly to make way for modded version of them. + Added a modded version of LC and AP. + Modded LC and AP are both made from 3 random materials that can be found in potions and flasks around the world. + Modded LC and AP are made from 1 "regular" potion material, 1 "magical" potion material, and 1 pouch material. + Modded LC and AP will quickly convert any of their base ingrediants into more AP/LC + +Beta 0.1.1 +Fixed an attack speed bug +Fixed a bug preventing tier 10 wands in Heaven +Fixed a bug with World Eater preventing you from casting other spells in the same spell block as it +Adjusted stats on World Eater + +Beta 0.1.0 +Strophox made me some really nice icons for Spatial Awareness (Many Thanks!) +Player starts with 3 sparks bolts and 1 bomb spell in their inventory in case wand RNG is a bitch +A new pillar has grown on the tree +Sun Quest Hints are back (in different spots of course) +Spell for sale in Tower (with custom pool of spells it draws from) +Potion Pool revamped: + - Alchemic Precursor + + Poison + + Glue + + Ominous Liquic + + Urine + + Worm Blood +Updated item spawn list (There are more runestones than Runestone of Edges) +Tier 10 wands should now be found in Heaven instead of Hell + +Alpha 0.0.4 +Improved randomness of the starting wands +Fixed a typo in that resulted in the Snowy Eye teleporting you to Overgrown Caverns +Fixed a bug with the green starting wand that could cause it to become a dud +Starting perks float a bit more +New Perk: Roll Again (Make Sac Great Chest event later) +Made Power Plant bigger +Avarice Diamond is back (and in parallels) +Made Leviathan only shift water once +Made Leviathan spawn a platform on death to catch his drops +Better icon for game mode menu (Thank you Strophox!) +Fixed a bug causing you to take insane amounts of damage by reloading a save +Healthium no longer causes stains +Fixed a bug where mod restarting would revert the biome generation to normal mode +Spatial Awareness can count better than Priskip +Spatial Awareness now makes you spatially aware +Spatial Awareness comes in 4 tiers now (Kill Mecha Kolmi multiple times for higher tiers) + +Alpha 0.0.3 +New Spells are in good spots in Progress list +Buffed Matter Eater (20 shots, 50 Mana, Becomes unlimited with Unlimited Spells perk) +Added High and Low Gravity back into the game +Granted Melee Immunity to Contact Damage - making Melee Immunity have an alternate perk like the other four immunities +New logic for starting perks. There are 3 groups of perks and the player gets to choose 1 from each group. First group is immunities, 2nd is "good" perks, 3rd is "meh" perks. +You start with 4 starting wands of various tiers +You start with 2 potions - one of "normal" materials and one of "magical" materials +Lake Island is back... but only in center world (might be extra ducks) +Pit Boss has renovated his home + +Alpha 0.0.2 +Potion Pool revamped { + Potions that can now be found: + Ambrosia + Invisibily + Rainbow + Healthium + Alchemic Precursor +} +Ukkoskivi and Kiuskivi are no longer the only elemental stones found in the wild +Leviathan's Portal Room is working now +Hiisi Base Anvil now exists in this world and the next one and the next one and the next one... +Hiis Base Hourglass Room teleporter works +Snowy Depths Eye Room teleporter works +Coal Pits Meditation Cube teleporter works + +Alpha 0.0.11 +Fixed an issue with terrain gen drawing from regular nightmare's map + +Alpha 0.0.1 +All mini bosses spawn in parallel worlds +Gate Boss is mirrored +Tower Wands Buffed +New Spell: World Eater (Exclusive find in Tower) +Tower layers start at coal pits +Tower portals will keep you in parallel worlds +Player starts with Edit Wands Everywhere \ No newline at end of file diff --git a/data/biome/roboroom.xml b/data/biome/roboroom.xml new file mode 100644 index 0000000..f7f5e1d --- /dev/null +++ b/data/biome/roboroom.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/entities/animals/boss_alchemist/boss_alchemist.xml b/data/entities/animals/boss_alchemist/boss_alchemist.xml index acb853a..a8f4657 100644 --- a/data/entities/animals/boss_alchemist/boss_alchemist.xml +++ b/data/entities/animals/boss_alchemist/boss_alchemist.xml @@ -19,8 +19,8 @@ @@ -29,6 +29,7 @@ value_string="$animal_boss_alchemist" > + @@ -231,53 +232,4 @@ - - - - - - - - - diff --git a/data/entities/animals/boss_alchemist/projectile_counter_create_damage.lua b/data/entities/animals/boss_alchemist/projectile_counter_create_damage.lua new file mode 100644 index 0000000..64a226b --- /dev/null +++ b/data/entities/animals/boss_alchemist/projectile_counter_create_damage.lua @@ -0,0 +1,49 @@ +dofile_once("data/scripts/lib/utilities.lua") + +function damage_received(damage) + local entity_id = GetUpdatedEntityID() + local x, y = EntityGetTransform(entity_id) + local nearby_ents = EntityGetInRadius(x, y, 50) + + local num_of_shield_ents = 0 + + for i, ent_id in ipairs(nearby_ents) do + if EntityGetFilename(ent_id) == "data/entities/animals/boss_alchemist/projectile_counter.xml" then + num_of_shield_ents = num_of_shield_ents + 1 + end + end + + if num_of_shield_ents < 10 then + --Creates a cap on the number of shields to avoid piercing wands on this dude lagging out the game + local cumulative = 0.0 + local dcomp = 0 + + local s = EntityGetComponent(entity_id, "VariableStorageComponent") + if (s ~= nil) then + for i, v in ipairs(s) do + local name = ComponentGetValue2(v, "name") + + if (name == "damage_received") then + cumulative = ComponentGetValue2(v, "value_float") + + cumulative = cumulative + damage + + ComponentSetValue2(v, "value_float", cumulative) + dcomp = v + end + end + end + + if (damage >= 2.0) or (cumulative >= 3.0) then + local x, y = EntityGetTransform(entity_id) + + local eid = EntityLoad("data/entities/animals/boss_alchemist/projectile_counter.xml", x, y) + EntityAddChild(entity_id, eid) + + if (dcomp ~= NULL_ENTITY) then + cumulative = cumulative - 3.0 + ComponentSetValue2(dcomp, "value_float", cumulative) + end + end + end +end diff --git a/data/entities/animals/boss_pit/boss_pit.xml b/data/entities/animals/boss_pit/boss_pit.xml index d807f4f..a5542b6 100644 --- a/data/entities/animals/boss_pit/boss_pit.xml +++ b/data/entities/animals/boss_pit/boss_pit.xml @@ -19,8 +19,8 @@ @@ -29,6 +29,7 @@ value_string="$animal_boss_pit" > + = allowed_travel_radius then + PhysicsApplyForce(entity_id, force_x, force_y) --boop him back to center end end ---Note Priskip: IF Mecha Kolmi is forcibly removed from the center by the player, then this can get really, really weird - - +--Note Priskip: IF Mecha Kolmi is forcibly removed from the center by the player, then this can be comical diff --git a/data/entities/animals/boss_robot/boss_robot.xml b/data/entities/animals/boss_robot/boss_robot.xml index 647ee61..cb5140e 100644 --- a/data/entities/animals/boss_robot/boss_robot.xml +++ b/data/entities/animals/boss_robot/boss_robot.xml @@ -1,10 +1,11 @@ @@ -20,8 +21,8 @@ > + @@ -156,6 +162,7 @@ > + + + + + + @@ -177,13 +193,6 @@ target_sprite_comp_name="character" > - - - - - + + @@ -356,15 +371,11 @@ execute_every_n_frame="1" > - - - + diff --git a/data/entities/animals/boss_robot/spell_eater.lua b/data/entities/animals/boss_robot/spell_eater.lua index 0ee6c9a..51802af 100644 --- a/data/entities/animals/boss_robot/spell_eater.lua +++ b/data/entities/animals/boss_robot/spell_eater.lua @@ -3,7 +3,7 @@ dofile_once("data/scripts/lib/utilities.lua") local entity_id = GetUpdatedEntityID() local boss_id = EntityGetRootEntity(entity_id) local x, y = EntityGetTransform(boss_id) -local distance_full = 36 +local distance_full = 52 local ax, ay = 0 --Set Size based on number of alive turrets in area diff --git a/data/entities/animals/boss_robot/state.lua b/data/entities/animals/boss_robot/state.lua index 41208e9..454a706 100644 --- a/data/entities/animals/boss_robot/state.lua +++ b/data/entities/animals/boss_robot/state.lua @@ -57,7 +57,6 @@ end if state == 6 then --Start the Laser Beam Tracking - if (lcomps ~= nil) then for a, lcomp in ipairs(lcomps) do local players = EntityGetWithTag("player_unit") diff --git a/data/scripts/biomes/roboroom.lua b/data/scripts/biomes/roboroom.lua index f218ec2..6b6111a 100644 --- a/data/scripts/biomes/roboroom.lua +++ b/data/scripts/biomes/roboroom.lua @@ -7,6 +7,7 @@ RegisterSpawnFunction(0xffffeedd, "init") RegisterSpawnFunction(0xff31d0b4, "spawn_boss") RegisterSpawnFunction(0xfffffe00, "spawn_center_point") RegisterSpawnFunction(0xfffffd00, "spawn_outer_ring_point") +RegisterSpawnFunction(0xfffffc00, "spawn_activation_trigger") function spawn_small_enemies(x, y) end @@ -57,4 +58,8 @@ end function spawn_outer_ring_point(x, y) EntityLoad("mods/purgatory/files/entities/buildings/roboroom/mecha_turret.xml", x, y) +end + +function spawn_activation_trigger(x, y) + EntityLoad("mods/purgatory/files/entities/buildings/roboroom/activation_trigger.xml", x, y) end \ No newline at end of file diff --git a/files/alchemy_predictor.lua b/files/alchemy_predictor.lua new file mode 100644 index 0000000..291d4d1 --- /dev/null +++ b/files/alchemy_predictor.lua @@ -0,0 +1,130 @@ +--Prediction Algorithm for LC and AP from work done by Neff#6398 at https://neffc.github.io/narg/ + +local function hax_prng_next(v) + local hi = math.floor(v / 127773.0) + local lo = v % 127773 + v = 16807 * lo - 2836 * hi + if v <= 0 then + v = v + 2147483647 + end + return v +end + +local function shuffle(arr, seed) + local v = math.floor(seed / 2) + 0x30f6 + v = hax_prng_next(v) + for i = #arr, 1, -1 do + v = hax_prng_next(v) + local fidx = v / 2 ^ 31 + local target = math.floor(fidx * i) + 1 + arr[i], arr[target] = arr[target], arr[i] + end +end + +local LIQUIDS = { + "acid", + "alcohol", + "blood", + "blood_fungi", + "blood_worm", + "cement", + "lava", + "magic_liquid_berserk", + "magic_liquid_charm", + "magic_liquid_faster_levitation", + "magic_liquid_faster_levitation_and_movement", + "magic_liquid_invisibility", + "magic_liquid_mana_regeneration", + "magic_liquid_movement_faster", + "magic_liquid_protection_all", + "magic_liquid_teleportation", + "magic_liquid_unstable_polymorph", + "magic_liquid_unstable_teleportation", + "magic_liquid_worm_attractor", + "confusion", + "mud", + "oil", + "poison", + "radioactive_liquid", + "swamp", + "urine", + "water", + "water_ice", + "water_swamp", + "magic_liquid_random_polymorph" +} + +local ORGANICS = { + "bone", + "brass", + "coal", + "copper", + "diamond", + "fungi", + "gold", + "grass", + "gunpowder", + "gunpowder_explosive", + "rotten_meat", + "sand", + "silver", + "slime", + "snow", + "soil", + "wax", + "honey" +} + +local function copy_arr(arr) + local ret = {} + for k, v in pairs(arr) do + ret[k] = v + end + return ret +end + +local function random_material(v, mats) + for _ = 1, 1000 do + v = hax_prng_next(v) + local rval = v / 2 ^ 31 + local sel_idx = math.floor(#mats * rval) + 1 + local selection = mats[sel_idx] + if selection then + mats[sel_idx] = false + return v, selection + end + end +end + +local function random_recipe(rand_state, seed) + local liqs = copy_arr(LIQUIDS) + local orgs = copy_arr(ORGANICS) + local m1, m2, m3, m4 = "?", "?", "?", "?" + rand_state, m1 = random_material(rand_state, liqs) + rand_state, m2 = random_material(rand_state, liqs) + rand_state, m3 = random_material(rand_state, liqs) + rand_state, m4 = random_material(rand_state, orgs) + local combo = {m1, m2, m3, m4} + + rand_state = hax_prng_next(rand_state) + local prob = 10 + math.floor((rand_state / 2 ^ 31) * 91) + rand_state = hax_prng_next(rand_state) + + shuffle(combo, seed) + return rand_state, {combo[1], combo[2], combo[3]}, prob +end + +function get_alchemy() + local seed = tonumber(StatsGetValue("world_seed")) + local rand_state = math.floor(seed * 0.17127000 + 1323.59030000) + + for i = 1, 6 do + rand_state = hax_prng_next(rand_state) + end + + local lc_combo, ap_combo = {"?"}, {"?"} + rand_state, lc_combo, lc_prob = random_recipe(rand_state, seed) + rand_state, ap_combo, ap_prob = random_recipe(rand_state, seed) + + return lc_combo, ap_combo, lc_prob, ap_prob +end diff --git a/files/biome_impl/debug/biome_map_debug.png b/files/biome_impl/debug/biome_map_debug.png index 19280d4906142aa50eb02267ff767fa9efb5a84c..823087a5e86f25063ddd5d0884c31cf25f46a099 100644 GIT binary patch delta 127 zcmV-_0D%9a1F!>-F#&3^G7JH7%zRboV-fwlbZYY*`dBm!^U^T%5}k^NU8`3yFfcMO zFg8z`NNc-BTMt74jCyG(fKe|E1u*KRp#X-Xmxfb43js__42%Qq1}cMLnDD6IZ2f=f hEb)pN^^B?R002C^NmKS&v|0cF002ovPDHLkV1nnTGk^d9 delta 114 zcmV-&0FD2!1ET|wF#%n%G7JG_XxB4G1N8F}?Rw^DfKCaI4(SaJhGFqA>ZPFoM!hr? zz^Ipo0vPquPynM|8VZ1EIQ7yYfQgBLaiHBmWiSjA9`!pH|1X^-UNNJdG1VOa0FR18 UntO@UZU6uP07*qoM6N<$f_lI$fdBvi diff --git a/files/biome_impl/roboroom/roboroom_mat.png b/files/biome_impl/roboroom/roboroom_mat.png index 0c66579835ee4c76362a7d692596c34a199fea30..f06c0c4df2b72c71a8b414ca28b7c58afd9cdf74 100644 GIT binary patch delta 6717 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 Lb{3UpVC;VYH%tkJ diff --git a/files/buildings_gfx/roboroom/mecha_turret_light_red.png b/files/buildings_gfx/roboroom/mecha_turret_light_red.png new file mode 100644 index 0000000000000000000000000000000000000000..6d38060de16e2706953cd0a91cefe944c564ade2 GIT binary patch literal 793 zcmV+!1LpjRP)Px%(@8`@R9J=8*iCNSFboA?I(C4brMn!er|O})>sbnnf3nf@JU^2Z?MW9gAY@S3 z@>kN5D4BhOYcMnW`|5#sZsQRc;-<-GNb~m z?PwG|;M)Ek29qK&P#BXzqm)Oft^n~L+taQ{oo0GaosJ?TMso&4L!W!v8HuzhumaWZ zQolz`J3S!ZkI%$KM$z=3ns!C?~#ZaUi(Nf^z^yR(pP*r)z zs70TGLV?5-qUnt=Q9BHr$^#L6lxQxk&-Ehc1hn?B@joP2rPI;Oe%NuOcM+X;?#N1o zycODFX8-KDto2&uoriQ+I@QK=9lk*nun#-#Y3}rIjJyK!_9{r-YRA$2u;;ps#{HC_ z9#Yp*-Q{WV%F~QDPXfwVuips2BfT57Bfzj+DUer}O`cKcEd6HhPmxQ|kY1grv$Z>l zsJ0Yoa-#?H3RYc7vMLBr#(H3WzbR5v+S@c~6tjAg)9yiMxo@u}Bcz9mfQwzL%zIEB zTqmR@QOqK!dzWmFqiK&)pKipkQ{%NctElhn7BeV*A66r8ORFaf5l}0e>b|=NJ)I3j zhXa*8$tx!q8T52TNUjGxpjRJOkr~u2I zIG^N*rdRb46&+(Erh65ykc~>Z|8~-gm!d}0P1F_Sz9v_%I|uumHZRqf%o%za_U*1u X!6IWAEeD^200000NkvXXu0mjfV|;bK literal 0 HcmV?d00001 diff --git a/files/buildings_gfx/roboroom/mecha_turret_light_red.xml b/files/buildings_gfx/roboroom/mecha_turret_light_red.xml new file mode 100644 index 0000000..36728dc --- /dev/null +++ b/files/buildings_gfx/roboroom/mecha_turret_light_red.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/files/debug_magic_numbers.xml b/files/debug_magic_numbers.xml index c46c4f3..9f38ee9 100644 --- a/files/debug_magic_numbers.xml +++ b/files/debug_magic_numbers.xml @@ -1,6 +1,6 @@ + + + + + + + + + + + + - - - - - - - - - diff --git a/files/entities/animals/boss_dragons/ice_dragon.xml b/files/entities/animals/boss_dragons/ice_dragon.xml index 2aa6c10..35e9fa0 100644 --- a/files/entities/animals/boss_dragons/ice_dragon.xml +++ b/files/entities/animals/boss_dragons/ice_dragon.xml @@ -9,6 +9,34 @@ scale.y="1" > + + + + + + + + + + + + - - - - - - - - - diff --git a/files/entities/animals/boss_dragons/poison_dragon.xml b/files/entities/animals/boss_dragons/poison_dragon.xml index b82d7e7..3cd192c 100644 --- a/files/entities/animals/boss_dragons/poison_dragon.xml +++ b/files/entities/animals/boss_dragons/poison_dragon.xml @@ -9,6 +9,34 @@ scale.y="1" > + + + + + + + + + + + + - - - - - - - - - diff --git a/files/entities/animals/boss_robot/activation_point_listener.lua b/files/entities/animals/boss_robot/activation_point_listener.lua index 733bff4..78e71a5 100644 --- a/files/entities/animals/boss_robot/activation_point_listener.lua +++ b/files/entities/animals/boss_robot/activation_point_listener.lua @@ -8,7 +8,19 @@ proj.x, proj.y = EntityGetTransform(proj.id) local laser_hotspots = EntityGetInRadiusWithTag(proj.x, proj.y, 5, "mecha_turret_laser_spot") if #laser_hotspots > 0 then - local x, y = EntityGetTransform(laser_hotspots[1]) - EntityLoad("mods/purgatory/files/entities/animals/boss_robot/tesla_turret_fire.xml", x, y) + --Activate Firing Mechanism + local laser_ent = laser_hotspots[1] + + local lua_comps = EntityGetComponentIncludingDisabled(laser_ent, "LuaComponent") + for i, lua_comp in ipairs(lua_comps) do + EntitySetComponentIsEnabled(laser_ent, lua_comp, true) + end + + local particle_emitter_comps = EntityGetComponentIncludingDisabled(laser_ent, "ParticleEmitterComponent") + for i, particle_emitter_comp in ipairs(particle_emitter_comps) do + EntitySetComponentIsEnabled(laser_ent, particle_emitter_comp, true) + end + + --Kill this Projectile EntityKill(proj.id) end diff --git a/files/entities/animals/boss_robot/damage_multipliers_manipulation.lua b/files/entities/animals/boss_robot/damage_multipliers_manipulation.lua new file mode 100644 index 0000000..e3a36eb --- /dev/null +++ b/files/entities/animals/boss_robot/damage_multipliers_manipulation.lua @@ -0,0 +1,77 @@ +dofile_once("data/scripts/lib/utilities.lua") +dofile_once("mods/purgatory/files/scripts/utils.lua") + +local boss_id = GetUpdatedEntityID() +local x, y = EntityGetTransform(boss_id) + +local alive_turrets = EntityGetInRadiusWithTag(x, y, 1000, "roboroom_mecha_turret_alive") +local number_of_alive_turrets = math.min(#alive_turrets, 8) + +local alive_turret_count_storage = variable_storage_get_value(boss_id, "INT", "alive_turrets") + +if alive_turret_count_storage > number_of_alive_turrets then + --Turret got destroyed, therefore increase Mecha's vulnerability + local damage_model_comp = EntityGetFirstComponentIncludingDisabled(boss_id, "DamageModelComponent") + + local projectile = tonumber(ComponentObjectGetValue(damage_model_comp, "damage_multipliers", "projectile")) + local explosion = tonumber(ComponentObjectGetValue(damage_model_comp, "damage_multipliers", "explosion")) + local electricity = tonumber(ComponentObjectGetValue(damage_model_comp, "damage_multipliers", "electricity")) + local slice = tonumber(ComponentObjectGetValue(damage_model_comp, "damage_multipliers", "slice")) + + projectile = projectile + 0.0125 + explosion = explosion + 0.0125 + electricity = electricity + 0.1 + slice = slice + 0.1 + + ComponentObjectSetValue(damage_model_comp, "damage_multipliers", "projectile", tostring(projectile)) + ComponentObjectSetValue(damage_model_comp, "damage_multipliers", "explosion", tostring(explosion)) + ComponentObjectSetValue(damage_model_comp, "damage_multipliers", "electricity", tostring(electricity)) + ComponentObjectSetValue(damage_model_comp, "damage_multipliers", "slice", tostring(slice)) + + --Update storage count + variable_storage_set_value(boss_id, "INT", "alive_turrets", number_of_alive_turrets) +end + +if alive_turret_count_storage < number_of_alive_turrets then + --Turret got healed, therefore lower Mecha's vulnerabilty + local damage_model_comp = EntityGetFirstComponentIncludingDisabled(boss_id, "DamageModelComponent") + + local projectile = tonumber(ComponentObjectGetValue(damage_model_comp, "damage_multipliers", "projectile")) + local explosion = tonumber(ComponentObjectGetValue(damage_model_comp, "damage_multipliers", "explosion")) + local electricity = tonumber(ComponentObjectGetValue(damage_model_comp, "damage_multipliers", "electricity")) + local slice = tonumber(ComponentObjectGetValue(damage_model_comp, "damage_multipliers", "slice")) + + projectile = projectile - 0.0125 + explosion = explosion - 0.0125 + electricity = electricity - 0.1 + slice = slice - 0.1 + + ComponentObjectSetValue(damage_model_comp, "damage_multipliers", "projectile", tostring(projectile)) + ComponentObjectSetValue(damage_model_comp, "damage_multipliers", "explosion", tostring(explosion)) + ComponentObjectSetValue(damage_model_comp, "damage_multipliers", "electricity", tostring(electricity)) + ComponentObjectSetValue(damage_model_comp, "damage_multipliers", "slice", tostring(slice)) + + --Update storage count + variable_storage_set_value(boss_id, "INT", "alive_turrets", number_of_alive_turrets) +end + +--if alive_turret_count_storage = number_of_alive_turrets then do nothing + +--[[ +Mecha's vanilla damage multipliers +projectile="0" +explosion="0" +electricity="0.8" +fire="0" +slice="0.6" + +In purgatory, we'll increase the slice and electric damage by 0.1 per turret destroyed +we'll also increase explosion and projectile damage by 0.0125 +Thus if all turrets are dead, he'll take the following +projectile="0.1" +explosion="0.1" +electricity="0.8" +slice="0.8" +fire="0" + +]] diff --git a/files/entities/animals/boss_robot/tesla_turret_aiming.lua b/files/entities/animals/boss_robot/mecha_turret_aiming.lua similarity index 100% rename from files/entities/animals/boss_robot/tesla_turret_aiming.lua rename to files/entities/animals/boss_robot/mecha_turret_aiming.lua diff --git a/files/entities/animals/boss_robot/tesla_turret_fire.lua b/files/entities/animals/boss_robot/mecha_turret_fire.lua similarity index 71% rename from files/entities/animals/boss_robot/tesla_turret_fire.lua rename to files/entities/animals/boss_robot/mecha_turret_fire.lua index dcd572d..3315d48 100644 --- a/files/entities/animals/boss_robot/tesla_turret_fire.lua +++ b/files/entities/animals/boss_robot/mecha_turret_fire.lua @@ -10,7 +10,6 @@ state = state + 1 if state == 1 then --Start the Laser Beam Tracking - if (laser_comps ~= nil) then for a, lcomp in ipairs(laser_comps) do local p = getPlayerEntity() @@ -24,17 +23,13 @@ if state == 1 then ComponentObjectSetValue2(lcomp, "laser", "damage_to_entities", 0) ComponentObjectSetValue2(lcomp, "laser", "audio_enabled", false) ComponentSetValue2(lcomp, "is_emitting", true) + ComponentObjectSetValue2(lcomp, "laser", "beam_particle_type", CellFactory_GetType("spark_blue")) end end end end if state == 2 then - --Disable the hitbox of the turret it's in as to not destroy it - local turret_id = EntityGetInRadiusWithTag(x, y, 10, "roboroom_mecha_turret_alive")[1] - local hitbox_comp = EntityGetFirstComponentIncludingDisabled(turret_id, "HitboxComponent") - EntitySetComponentIsEnabled(turret_id, hitbox_comp, false) - --Fire Death Laser if (laser_comps ~= nil) then for a, lcomp in ipairs(laser_comps) do @@ -53,8 +48,9 @@ if state == 2 then end --Change Tesla Turret to red sprite - local sprite_comps = EntityGetComponent(turret_id, "SpriteComponent") - for i, comp in ipairs(sprite_comps) do + local turret_id = EntityGetParent(entity_id) + local sprite_comps_parent = EntityGetComponent(turret_id, "SpriteComponent") + for i, comp in ipairs(sprite_comps_parent) do if ComponentGetValue2(comp, "image_file") == "mods/purgatory/files/buildings_gfx/roboroom/mecha_turret.xml" then --if == blue sprite ComponentSetValue2(comp, "alpha", 0) @@ -65,6 +61,12 @@ if state == 2 then ComponentSetValue2(comp, "alpha", 1) end end + + --Change light aura to red + local sprite_comps = EntityGetComponent(entity_id, "SpriteComponent") + for i, comp in ipairs(sprite_comps) do + ComponentSetValue2(comp, "image_file", "mods/purgatory/files/buildings_gfx/roboroom/mecha_turret_light_red.xml") + end end if state == 3 then @@ -83,12 +85,8 @@ if state == 3 then ComponentSetValue2(comp, "emitted_material_name", "spark_blue") end - --Re-enable the hitbox of the turret - local turret_id = EntityGetInRadiusWithTag(x, y, 10, "roboroom_mecha_turret_alive")[1] - local hitbox_comp = EntityGetFirstComponentIncludingDisabled(turret_id, "HitboxComponent") - EntitySetComponentIsEnabled(turret_id, hitbox_comp, false) - --Change Tesla Turret back to blue sprite + local turret_id = EntityGetParent(entity_id) local sprite_comps = EntityGetComponentIncludingDisabled(turret_id, "SpriteComponent") for i, comp in ipairs(sprite_comps) do if ComponentGetValue2(comp, "image_file") == "mods/purgatory/files/buildings_gfx/roboroom/mecha_turret.xml" then @@ -101,6 +99,25 @@ if state == 3 then ComponentSetValue2(comp, "alpha", 0) end end + + --Change light aura to red + local sprite_comps = EntityGetComponent(entity_id, "SpriteComponent") + for i, comp in ipairs(sprite_comps) do + ComponentSetValue2(comp, "image_file", "mods/purgatory/files/buildings_gfx/roboroom/mecha_turret_light_blue.xml") + end + + --Stop rendering blue shieldy type thing + local particle_emitter_comps = EntityGetComponentIncludingDisabled(entity_id, "ParticleEmitterComponent") + for i, particle_emitter_comp in ipairs(particle_emitter_comps) do + EntitySetComponentIsEnabled(entity_id, particle_emitter_comp, false) + end + + --Disable turret in wait for next activation + state = 0 + local lua_comps = EntityGetComponentIncludingDisabled(entity_id, "LuaComponent") + for i, lua_comp in ipairs(lua_comps) do + EntitySetComponentIsEnabled(entity_id, lua_comp, false) + end end --Write new state value to storage diff --git a/files/entities/animals/boss_robot/tesla_turret_fire.xml b/files/entities/animals/boss_robot/tesla_turret_fire.xml deleted file mode 100644 index 1a09486..0000000 --- a/files/entities/animals/boss_robot/tesla_turret_fire.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/files/entities/buildings/roboroom/activation_trigger.xml b/files/entities/buildings/roboroom/activation_trigger.xml new file mode 100644 index 0000000..6f96b2b --- /dev/null +++ b/files/entities/buildings/roboroom/activation_trigger.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/files/entities/buildings/roboroom/mecha_turret.xml b/files/entities/buildings/roboroom/mecha_turret.xml index 556d48c..bd59951 100644 --- a/files/entities/buildings/roboroom/mecha_turret.xml +++ b/files/entities/buildings/roboroom/mecha_turret.xml @@ -33,6 +33,7 @@ + + + + + + + + + + + + + + + + + + + + + + - - - \ No newline at end of file + \ No newline at end of file diff --git a/files/entities/items/pickup/comically_large_potion.xml b/files/entities/items/pickup/comically_large_potion.xml index 1f6720f..b6a64db 100644 --- a/files/entities/items/pickup/comically_large_potion.xml +++ b/files/entities/items/pickup/comically_large_potion.xml @@ -59,12 +59,18 @@ _tags="enabled_in_hand,enabled_in_world" spray_velocity_coeff="150" spray_velocity_normalized_min="1.5" + throw_bunch="1" + throw_how_many="50" > + - - - - - - - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/files/materials/LC_AP_recipes.xml b/files/materials/LC_AP_recipes.xml deleted file mode 100644 index 641c008..0000000 --- a/files/materials/LC_AP_recipes.xml +++ /dev/null @@ -1 +0,0 @@ -why are you looking here \ No newline at end of file diff --git a/files/materials/LP_AC_reagents.lua b/files/materials/LP_AC_reagents.lua deleted file mode 100644 index 06d0fda..0000000 --- a/files/materials/LP_AC_reagents.lua +++ /dev/null @@ -1,52 +0,0 @@ ---Materials for AP and LC to draw from - -normal_liquids_reagents = { - "water", - "blood", - "alcohol", - "oil", - "slime", - "acid", - "radioactive_liquid", - "liquid_fire", - "poison", - "glue", - "urine" -} - -magical_liquids_reagents = { - "magic_liquid_unstable_teleportation", - "magic_liquid_teleportation", - "magic_liquid_polymorph", - "magic_liquid_random_polymorph", - "magic_liquid_berserk", - "magic_liquid_charm", - "magic_liquid_invisibility", - "material_confusion", - "magic_liquid_movement_faster", - "magic_liquid_faster_levitation", - "magic_liquid_worm_attractor", - "magic_liquid_protection_all", - "magic_liquid_mana_regeneration", - "material_rainbow", - "magic_liquid_hp_regeneration", - "material_darkness", - "blood_worm" -} - -powder_reagents = { - "sand", - "soil", - "snow", - "salt", - "coal", - "gunpowder", - "fungisoil", - "copper", - "silver", - "gold", - "brass", - "bone", - "purifying_powder", - "fungi" -} diff --git a/files/projectiles_gfx/blackhole_shot/background.png b/files/projectiles_gfx/blackhole_shot/background.png index e9d2c40619b0b03b2fedb63f694ddc04f6b30844..f2cc37fef03a6c7f583ecfb3112b9fb3da204b02 100644 GIT binary patch literal 19673 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 literal 19521 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 ]] .. - [[ ]] .. - [[ ]] .. - [[ ]] .. - [[ ]] .. - [[ ]] .. - [[ ]] .. - [[ ]] .. - [[ ]] .. ---]===] - - [[]] - ) - ModMaterialsFileAdd("mods/purgatory/files/materials/LC_AP_recipes.xml") - -end \ No newline at end of file diff --git a/files/scripts/biomes/alchemist_arena/arena_left.lua b/files/scripts/biomes/alchemist_arena/arena_left.lua index b198177..dcd398c 100644 --- a/files/scripts/biomes/alchemist_arena/arena_left.lua +++ b/files/scripts/biomes/alchemist_arena/arena_left.lua @@ -3,6 +3,7 @@ dofile_once("data/scripts/director_helpers.lua") dofile_once("data/scripts/biome_scripts.lua") dofile_once("data/scripts/lib/utilities.lua") dofile_once("mods/purgatory/files/scripts/utils.lua") +dofile_once("mods/purgatory/files/alchemy_predictor.lua") RegisterSpawnFunction( 0xffffeedd, "init" ) RegisterSpawnFunction( 0xff4cff03, "spawn_regular_potions" ) @@ -52,11 +53,11 @@ end function spawn_cauldron_liquid(x, y) local liquid_ent = EntityCreateNew() EntitySetTransform(liquid_ent, x, y) - local AP_recipe, LC_recipe = get_AP_LC_RECIPE() + local lc_combo, ap_combo, lc_prob, ap_prob = get_alchemy() SetRandomSeed(x, y) local rand_num = Random(1,3) - local cauldron_material = LC_recipe[rand_num] + local cauldron_material = lc_combo[rand_num] --print("cauldron_material = " .. tostring(cauldron_material)) diff --git a/files/scripts/biomes/alchemist_arena/arena_right.lua b/files/scripts/biomes/alchemist_arena/arena_right.lua index e8cf112..002950d 100644 --- a/files/scripts/biomes/alchemist_arena/arena_right.lua +++ b/files/scripts/biomes/alchemist_arena/arena_right.lua @@ -3,6 +3,7 @@ dofile_once("data/scripts/director_helpers.lua") dofile_once("data/scripts/biome_scripts.lua") dofile_once("data/scripts/lib/utilities.lua") dofile_once("mods/purgatory/files/scripts/utils.lua") +dofile_once("mods/purgatory/files/alchemy_predictor.lua") RegisterSpawnFunction( 0xffffeedd, "init" ) RegisterSpawnFunction( 0xff4cff03, "spawn_regular_potions" ) @@ -52,11 +53,11 @@ end function spawn_cauldron_liquid(x, y) local liquid_ent = EntityCreateNew() EntitySetTransform(liquid_ent, x, y) - local AP_recipe, LC_recipe = get_AP_LC_RECIPE() + local lc_combo, ap_combo, lc_prob, ap_prob = get_alchemy() SetRandomSeed(x, y) local rand_num = Random(1,3) - local cauldron_material = AP_recipe[rand_num] + local cauldron_material = ap_combo[rand_num] --print("cauldron_material = " .. tostring(cauldron_material)) diff --git a/files/scripts/boss_bars/boss_bar.lua b/files/scripts/boss_bars/boss_bar.lua index 57b674c..b0336dc 100644 --- a/files/scripts/boss_bars/boss_bar.lua +++ b/files/scripts/boss_bars/boss_bar.lua @@ -25,11 +25,11 @@ if player_in_radius then local bar_filling = {} --Get Variable Storage Component Values - local damage_model_comp = EntityGetFirstComponentIncludingDisabled( entity_id, "DamageModelComponent") - local max_hp = 25 * ComponentGetValue2( damage_model_comp, "max_hp" ) - local current_hp = 25 * ComponentGetValue2( damage_model_comp, "hp" ) --Note Priskip: multiply hp numbers by 25 here because Nolla stores hp numbers at 1/25 size internally for some reason + local damage_model_comp = EntityGetFirstComponentIncludingDisabled(entity_id, "DamageModelComponent") + local max_hp = 25 * ComponentGetValue2(damage_model_comp, "max_hp") + local current_hp = 25 * ComponentGetValue2(damage_model_comp, "hp") --Note Priskip: multiply hp numbers by 25 here because Nolla stores hp numbers at 1/25 size internally for some reason - local boss_bar_type = variable_storage_get_value(entity_id, "STRING", "boss_bar_type") + local boss_bar_position = variable_storage_get_value(entity_id, "STRING", "boss_bar_position") local boss_name = variable_storage_get_value(entity_id, "STRING", "boss_name") bar_outline.image = variable_storage_get_value(entity_id, "STRING", "boss_bar_outline") bar_filling.image = variable_storage_get_value(entity_id, "STRING", "boss_bar_fill") @@ -38,6 +38,14 @@ if player_in_radius then local screen_size = {} screen_size.x, screen_size.y = GuiGetScreenDimensions(gui) + local bar_offset = 0 + if boss_bar_position == "LEFT" then + bar_offset = -screen_size.x / 4 + end + if boss_bar_position == "RIGHT" then + bar_offset = screen_size.x / 4 + end + --Image Dimensions bar_outline.size_x, bar_outline.size_y = GuiGetImageDimensions(gui, bar_outline.image) bar_filling.size_x, bar_filling.size_y = GuiGetImageDimensions(gui, bar_filling.image) @@ -59,11 +67,11 @@ if player_in_radius then --Draw Bar Outline GuiZSet(gui, 1) --Bigger Z = Renders Deeper - GuiImage(gui, new_gui_id(), bar_outline.pos_x, bar_outline.pos_y, bar_outline.image, bar_outline.alpha, bar_outline.scale, bar_outline.scale_y, bar_outline.rot) + GuiImage(gui, new_gui_id(), bar_outline.pos_x + bar_offset, bar_outline.pos_y, bar_outline.image, bar_outline.alpha, bar_outline.scale, bar_outline.scale_y, bar_outline.rot) --Draw Bar Filling GuiZSet(gui, 2) - GuiImage(gui, new_gui_id(), bar_filling.pos_x, bar_filling.pos_y, bar_filling.image, bar_filling.alpha, bar_filling.scale, bar_filling.scale_y, bar_filling.rot) + GuiImage(gui, new_gui_id(), bar_filling.pos_x + bar_offset, bar_filling.pos_y, bar_filling.image, bar_filling.alpha, bar_filling.scale, bar_filling.scale_y, bar_filling.rot) --Draw Boss Name local boss_name_text = {} @@ -72,7 +80,7 @@ if player_in_radius then boss_name_text.pos_y = screen_size.y - bar_outline.size_y - screen_size.y / 16 GuiZSet(gui, 0) - GuiText(gui, boss_name_text.pos_x, boss_name_text.pos_y, boss_name) + GuiText(gui, boss_name_text.pos_x + bar_offset, boss_name_text.pos_y, boss_name) --Draw Boss Name local boss_health_text = {} @@ -81,7 +89,7 @@ if player_in_radius then boss_health_text.pos_x = screen_size.x / 2 - boss_health_text.size_x / 2 boss_health_text.pos_y = bar_outline.pos_y + bar_outline.size_y / 2 - boss_health_text.size_y / 2 - GuiText(gui, boss_health_text.pos_x, boss_health_text.pos_y, boss_health_text.text) + GuiText(gui, boss_health_text.pos_x + bar_offset, boss_health_text.pos_y, boss_health_text.text) end --[[ diff --git a/files/scripts/buildings/roboroom/activation_trigger.lua b/files/scripts/buildings/roboroom/activation_trigger.lua new file mode 100644 index 0000000..e08a8c2 --- /dev/null +++ b/files/scripts/buildings/roboroom/activation_trigger.lua @@ -0,0 +1,48 @@ +dofile_once("data/scripts/lib/utilities.lua") +dofile_once("mods/purgatory/files/scripts/utils.lua") + +function collision_trigger(colliding_entity) + local entity_id = GetUpdatedEntityID() + local x, y = EntityGetTransform(entity_id) + + local nearby_ents = EntityGetInRadius(x, y, 300) + + for i, ent_id in ipairs(nearby_ents) do + if EntityGetName(ent_id) == "$animal_boss_robot" then + --This is Mecha Kolmi + local mecha_kolmi_comps = EntityGetAllComponents(ent_id) + + for j, component in ipairs(mecha_kolmi_comps) do + EntitySetComponentIsEnabled(ent_id, component, true) --cheating a bit and just enabling every comp here + end + + EntityAddTag(ent_id, "music_energy_100") + end + + if EntityHasTag(ent_id, "roboroom_mecha_turret_alive") then + --This is a turret + local hitbox_comp = EntityGetFirstComponentIncludingDisabled(ent_id, "HitboxComponent") + EntitySetComponentIsEnabled(ent_id, hitbox_comp, true) + end + end +end + +--[[ +Things to enable on Mecha Kolmi "$animal_boss_robot" + +PhysicsAIComponent +PathFindingGridMarkerComponent +PathFindingComponent +HitboxComponent +LuaComponent - mods/purgatory/files/scripts/boss_bars/boss_bar.lua +LuaComponent - data/entities/animals/boss_robot/state.lua + +tags +music_energy_100 + +EntityGetName( entity_id:int ) -> name:string + + +Things to enable on Turrets +HitboxComponent +]] diff --git a/files/scripts/gun/gun_actions.lua b/files/scripts/gun/gun_actions.lua index 6aa8eb7..924340a 100644 --- a/files/scripts/gun/gun_actions.lua +++ b/files/scripts/gun/gun_actions.lua @@ -411,7 +411,7 @@ spells_to_add = { draw_actions( 1, true ) end, }, - ]] +]] { id = "LIGHT_BULLET_DEATH_TRIGGER", @@ -590,9 +590,10 @@ spells_to_add = { spawn_requires_flag = "purgatory_alchemist_spells", type = ACTION_TYPE_MODIFIER, spawn_level = "1,2,3,4", -- WATER_TRAIL - spawn_probability = "0.3,0.3,0.3,0.3", -- WATER_TRAIL + spawn_probability = "0.1,0.2,0.2,0.25", -- WATER_TRAIL price = 160, mana = 50, + max_uses = 8, custom_xml_file = "data/entities/misc/custom_cards/water_trail.xml", action = function() local material_options = { diff --git a/files/scripts/perks/starting_perk_pools.lua b/files/scripts/perks/starting_perk_pools.lua index 83b7a1c..664b4c2 100644 --- a/files/scripts/perks/starting_perk_pools.lua +++ b/files/scripts/perks/starting_perk_pools.lua @@ -35,7 +35,8 @@ good_perks = { "EXTRA_PERK", "PERKS_LOTTERY", "GAMBLE", - "HEART_STEALER" + "HEART_STEALER", + "WAND_EXPERIMENTER" } --Get choice of four of these @@ -54,7 +55,6 @@ meh_perks = { "IRON_STOMACH", "TELEPORTITIS", "STAINLESS_ARMOUR", - "WAND_EXPERIMENTER", "ABILITY_ACTIONS_MATERIALIZED", --Bombs Materialized "PROJECTILE_HOMING", "PROJECTILE_HOMING_SHOOTER", --Boomerang diff --git a/files/scripts/test.lua b/files/scripts/test.lua index 6b348f2..9881dc8 100644 --- a/files/scripts/test.lua +++ b/files/scripts/test.lua @@ -1,44 +1,23 @@ dofile_once("data/scripts/lib/utilities.lua") dofile_once("mods/purgatory/files/scripts/utils.lua") -local ent = {} -ent.id = GetUpdatedEntityID() -ent.x, ent.y, ent.phi = EntityGetTransform(ent.id) - ---Gui Starters -local gui_id = 1 -local function new_gui_id() - gui_id = gui_id + 1 - return gui_id +function damage_about_to_be_received(damage, x, y, entity_thats_responsible, critical_hit_chance) + GamePrint("damage: \"" .. tostring(damage) .. "\"") + GamePrint("x: \"" .. tostring(x) .. "\"") + GamePrint("y: \"" .. tostring(y) .. "\"") + GamePrint("entity_thats_responsible: \"" .. tostring(entity_thats_responsible) .. "\"") + GamePrint("critical_hit_chance: \"" .. tostring(critical_hit_chance) .. "\"") + GamePrint("player: \"" .. tostring(getPlayerEntity()) .. "\"") + + return damage, critical_hit_chance end -gui = gui or GuiCreate() -GuiStartFrame(gui) ---GuiText(gui, 20, 50, "ent.phi: " .. string.format("%.2f", tostring(ent.phi))) -phi = phi or 0 -phi = GuiSlider(gui, new_gui_id(), 25, 50, "phi", phi, -3.14, 3.14, 0, 100, "", 100) ---Wedge -EntitySetTransform(ent.id, ent.x, ent.y, phi) -local particle_comps = EntityGetComponent(ent.id, "ParticleEmitterComponent") -local alive_turrets = EntityGetInRadiusWithTag(ent.x, ent.y, 300, "roboroom_mecha_turret_alive") -local number_of_alive_turrets = math.min(#alive_turrets, 8) +--[[ +EntityInflictDamage( entity:int, amount:number, damage_type:string, description:string, ragdoll_fx:string, + impulse_x:number, impulse_y:number, entity_who_is_responsible:int = 0, world_pos_x:number = entity_x, world_pos_y:number = entity_y, knockback_force:number = 0 ) -for i, comp in ipairs(particle_comps) do - ComponentSetValue2(comp, "area_circle_sector_degrees", 45 * number_of_alive_turrets) - if number_of_alive_turrets == 0 then - ComponentSetValue2(comp, "is_emitting", false) - elseif number_of_alive_turrets ~= 0 and ComponentGetValue2(comp, "is_emitting") == false then - ComponentSetValue2(comp, "is_emitting", true) - end -end - -local inner_particles = EntityGetFirstComponentIncludingDisabled(ent.id, "ParticleEmitterComponent", "inner_particles") -ComponentSetValue2(inner_particles, "count_min", 4 * number_of_alive_turrets) -ComponentSetValue2(inner_particles, "count_max", 5 * number_of_alive_turrets) -local outer_wall = EntityGetFirstComponentIncludingDisabled(ent.id, "ParticleEmitterComponent", "outer_wall") -ComponentSetValue2(outer_wall, "count_min", 40 * number_of_alive_turrets) -ComponentSetValue2(outer_wall, "count_max", 60 * number_of_alive_turrets) \ No newline at end of file +]] \ No newline at end of file diff --git a/files/scripts/test2.lua b/files/scripts/test2.lua index 7d386b6..f098dc2 100644 --- a/files/scripts/test2.lua +++ b/files/scripts/test2.lua @@ -1,7 +1,12 @@ dofile_once("data/scripts/lib/utilities.lua") dofile_once("mods/purgatory/files/scripts/utils.lua") -local entity_id = GetUpdatedEntityID() -local x, y = EntityGetTransform(entity_id) +function damage_received(damage, message, entity_thats_responsible, is_fatal, projectile_thats_responsible) + -EntitySetTransform(entity_id, x + 1, y) + + + +end + +--damage_received( damage:number, message:string, entity_thats_responsible:int, is_fatal:bool, projectile_thats_responsible:int ) diff --git a/files/scripts/utils.lua b/files/scripts/utils.lua index a99b9de..bbe0c14 100644 --- a/files/scripts/utils.lua +++ b/files/scripts/utils.lua @@ -2,8 +2,6 @@ dofile_once("data/scripts/lib/utilities.lua") dofile_once("data/scripts/perks/perk.lua") dofile_once("data/scripts/perks/perk_list.lua") -dofile_once("mods/purgatory/files/materials/LP_AC_reagents.lua") -dofile_once("mods/purgatory/files/scripts/ap_lc_recipe_gen.lua") --Returns a random number in a list without using Nolla's randomness functions --Only use in situations where the world seed isn't available yet @@ -94,18 +92,6 @@ function set_biome_to_purgatory(biome_name, hp_scale, attack_speed, ascension_le BiomeSetValue(biome_filename, "game_enemy_attack_speed", adjusted_attack_speed_scale) end -function get_AP_LC_RECIPE() - local AP_recipe = {} - local LC_recipe = {} - - for i = 1, 3, 1 do - AP_recipe[i] = GlobalsGetValue("AP_PART_" .. tostring(i), "not initialized") - LC_recipe[i] = GlobalsGetValue("LC_PART_" .. tostring(i), "not initialized") - end - - return AP_recipe, LC_recipe -end - function in_range(num, lower, upper) if num >= lower and num <= upper then return true diff --git a/files/translations/common.csv b/files/translations/common.csv index 3c13acf..44ef466 100644 --- a/files/translations/common.csv +++ b/files/translations/common.csv @@ -142,7 +142,9 @@ action_pollen_ball,"Pollen Ball",,,,,,,,,,,, actiondesc_pollen_ball,"Summons a ball of pollen that explodes on contact",,,,,,,,,,,, action_bubbleshot_death_trigger,"Bubble spark with expiration trigger",,,,,,,,,,,, actiondesc_bubbleshot_trigger,"A bouncy, inaccurate spell that casts another spell upon expiring",,,,,,,,,,,, -action_blackhole_shot,"Blackhole Shot",,,,,,,,,,,, -actiondesc_blackhole_shot,"Attaches a small but powerful blackhole to a projectile",,,,,,,,,,,, +action_blackhole_shot,"Black Hole Shot",,,,,,,,,,,, +actiondesc_blackhole_shot,"Attaches a small but powerful black hole to a projectile",,,,,,,,,,,, perkdesc_perks_lottery_start,"When you pick a perk, there's a 50% chance the others won't disappear. Does NOT affect perks found here at the start of the game.",,,,,,,,,,,, +menu_mods_restart_tooltip,"-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n-=-=-=-=-=-=-=-=-=-=-=-=-=- USING MOD RESTART WILL BREAK PURGATORY - DO NOT USE -=-=-=-=-=-=-=-=-=-=-=-=-=-\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-",,,,,,,,,,,, +biome_robobase_core,"Reactor Core",,,,,,,,,,,, ,"",,,,,,,,,,,, \ No newline at end of file diff --git a/files/translations/translations_utils.lua b/files/translations/translations_utils.lua index 59f7879..a67ad92 100644 --- a/files/translations/translations_utils.lua +++ b/files/translations/translations_utils.lua @@ -1,5 +1,3 @@ ---Append Utils for Death Wand - --Taken from Goki's Things function append_translations( filepath, translation_file ) if translation_file == nil then diff --git a/files/ui_gfx/boss_bars/dragons.png b/files/ui_gfx/boss_bars/dragons.png deleted file mode 100644 index 6113d26967716c3167423f58e6db284ae1f855e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2669 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 blq&uY&bFiL>vgr(00000NkvXXu0mjf)3gyb diff --git a/files/ui_gfx/boss_bars/fire_dragon_fill.png b/files/ui_gfx/boss_bars/fire_dragon_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..e77e70040de9fd8ab412f0aa316c27a44bd30047 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^AwbNPx&dPzhik&||2e$Adnymxk z2V}26FtJow5J*v+$r~t^U}1<<1jq>KI=Jt0xtJt&?g-HPCfj%Z-o5ueUoLkKFfe#Y zgucr{-(_!&dscR5<&#!S;t=(b128TiD!514%)>f&IU8~`FOuXI-0t-ljP&(^cGFQd! z@%vU>geqqItj`+N5n)nJdd?v0O)ca z3Je7>^j$6rRoo;RAW2}uD{}E99Q_0*{koh}7HL1xMJ5VzTJA|ioEOSTY2b@Ho45}y z004K*4uJj_LJ6qYJuFnq1MR@@7bZF%`YzMKEs7%T3nwn(7H1u52Y`8R1vfu`4UJhP zciK!dEv6=8>z|l)d^O~Bbo~ZE4 z=e)KJ6oGO;IT2^+Ns(CykE>2%Xn84lu)M?#m(IFY#qQxgxZuh)P=|SM1^2DxvSA|veUM{Iu@`57JhODJHNx%QHs+i%o{si&8#Yh_iv82kKIWV< zZuhox@#J1CjspEk;Z7_;y^CSYG_7Fc)6ae7 za+1VE)A_tyRU{{P8g3bB9CG#0sKONL+lq$;It{nZ!W8W=rE2=Q-waIgswrOO7?;r3 i$~`N)v+~K{KgVC;q|#}(s(mg10000D7l^h literal 0 HcmV?d00001 diff --git a/files/ui_gfx/boss_bars/ice_dragon_fill.png b/files/ui_gfx/boss_bars/ice_dragon_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a6e55c149661906ff000f626f3d2b6c827f2cb GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^Ak4+V1|-!#axwxb#^NA%Cx&(BWL^R}R-P`7As(G? zFF5itDDWIOU|2u-h_toGoDNe(MO#+i@VC`Y$v>?gi1)Qv2tD%XP*#L9c)h%tMEfRw RDg>Is;OXk;vd$@?2>{I6BuoGR literal 0 HcmV?d00001 diff --git a/files/ui_gfx/boss_bars/ice_dragon_outline.png b/files/ui_gfx/boss_bars/ice_dragon_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..24604e0a4d96fcf7c7731cd95849bf8c2b990231 GIT binary patch literal 897 zcmV-{1AhF8P)Px&J4r-ARA_LB0H59l`( zNq?Y2kU>*MXAxj~5u5_<;wk9hDY1Z}n>q+booL#QEV8Z}zKJsBN8a5Nd7=)mu=ty3 zhvT#zj?-=9-qg68vdJi(V-VdVJ7ASVbZ{>lvkd>DK2zLVg>G+9Z~|}34&nXX-eBbu zp_{uMj#CxqG9jtvqJl|o9dJyNlL1#JM-De8p1J6EnohSjNO}9}UIN}G@HxnHq;Yj{%Un9~+7xj+9H;RtYp*hd2Qq6X=rbO2 z3^_34cC~VoXn-t$J`+zSs+_amX*zwzDT`F_us$8!&k^yuFhbf6$LYi64cyi~0H7B5 z0P-h<0uaw!JVkM#ADDl_xbddAxhPamIB^j-Uv;P-0Fu!Jd*^3!b2i1T3)%_E=)2pA zm^c|i#sZlW9xiVHKp9loNd!~evS?I60D!&ov%)xhd=lvK>3(60Fu|=`3|h%Z>36pi z)B;}^^5gRdqq)fcj<=t_r2vFak54mk>&zKm=^_I1i6x_n6@f;O51*n~tRA`($5P4S z#r1s(0Ea;X!)Pjgr|U28-xVfDleVaiWHb@m9BnNZ*Z1k7SOA!d$1;>w)z_cX6aa?N z6o)|r01(tY9PI9hq>GemDzSNq;7M{V@P%K$|N5OqkJ)PnkIBb3jZ%Iuy)^`N4?w22 zVKf!j9Cjrz2bFJwx>s0{RWVtG(n2`c-Ep`WNR2A+gAt2rSmw*L6dbt^I;1)(N@_YYBl5E-ypAmx#oM-sLT-gYtt#TLWQTVQ77QltC+lMRmx& z)cqlyd=0{LNx#rog}N^UDVS>)#kI<^OU#Jq(^%qG4<+K*25qZ0sw^$5JM zf;)lVL&mC{#Onv-|C`|EqEOXQ5SMBk>LFZL;8x)_S(suRwp7hL_twA`uiD~OfmH$hSGhMe?xt+Ac;Wa1 Xj6nXynN(7d00000NkvXXu0mjf4sD>l literal 0 HcmV?d00001 diff --git a/files/ui_gfx/boss_bars/poison_dragon_fill.png b/files/ui_gfx/boss_bars/poison_dragon_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..30c9a15c9420714b0ad96f082431ed947922dfbc GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^AwbNIP)Px&F-b&0RA_MPHyeQ}=9LGHB7} zJyS}*fQcrPCB;i17(#{wf>Fo^2*hOa)azhg`_=1{?Z|hoT;Fe!eW&N%e>$B`0vwKI z;8)tpue8;wY3Id`y!f~f^Eg0#q{FiUU_*OazqgE+)@DmP*VL-bgwy<327tHMs?C{K zfK6>WM>oc_!qVBcZ0$wxY>1M@1=TD`=$+#V{}i-%6)DmJaHyG2AntjPZ# zKR?Z#-?=-6jjkf$-@kh5^=V_G7{W$ZUEe-it=x4*&b0gG;zXjOAXe``{K1!RB@amE zY!(|?jG}=gd)tLk5divG!;uXh%l&e3G;tY&q&kG<6nbruz>3Q7?8(k&W0(>LHVHO$N!;>8^Y;@Jqu6_L3z9l42*Xh-4^p= z+H{eTe-{s()I4Oty>t?|mrjOouc24-HMG%N1AtK#17j!Cu0)w6o@gGhv;r`x-N$4C zbei((p=lqc*wVJ~VTv`}r)taB&Mofa)#Yff1U7dW^Rk1v4n8{8gufE7``(CO{NVrq N002ovPDHLkV1lX4tf~M2 literal 0 HcmV?d00001 diff --git a/init.lua b/init.lua index da15eca..888f576 100644 --- a/init.lua +++ b/init.lua @@ -6,10 +6,6 @@ local ascension_level = ModSettingGet("purgatory.ascension_level") local reset_tree_achievements = ModSettingGet("purgatory.reset_tree_achievements") local debug_mode = ModSettingGet("purgatory.debug_mode") ---Vars needed -local AP_recipe = {} -local LC_recipe = {} - --Load Files dofile_once("mods/purgatory/files/scripts/utils.lua") dofile_once("mods/purgatory/files/translations/translations_utils.lua") @@ -19,8 +15,8 @@ dofile_once("mods/purgatory/files/materials/add_void_recipes.lua") --makes recip dofile_once("mods/purgatory/files/scripts/gun/initialize_starting_wands.lua") --temp dofile_once("mods/purgatory/files/scripts/debug_mode_init.lua") --for debugging ---Append Translations -append_translations("mods/purgatory/files/translations/common.csv") --Adds all the descriptors +--Append and Modify Translations +append_translations("mods/purgatory/files/translations/common.csv") --Adds all the descriptors for Purgatory --Append Files ModLuaFileAppend("data/scripts/gun/gun.lua", "mods/purgatory/files/scripts/gun/gun.lua") --For adding custom trigger types @@ -59,7 +55,6 @@ function OnModPreInit() --Modify Materials List -- Make Healthium Drink Only - -- Regualar LC and AP evaporate quickly -- Hastium have its own tag for hastium stone to absorb local nxml = dofile_once("mods/purgatory/libraries/nxml.lua") local content = ModTextFileGetContent("data/materials.xml") @@ -69,28 +64,12 @@ function OnModPreInit() element.attr.liquid_stains = 0 end - if element.attr.name == "magic_liquid_hp_regeneration_unstable" then - element.attr.tags = "[liquid],[water],[magic_liquid],[regenerative],[corrodible],[soluble],[evaporable]" - element.attr.lifetime = "1" - end - - if element.attr.name == "midas_precursor" then - element.attr.tags = "[liquid],[burnable],[water],[corrodible],[soluble],[evaporable]" - element.attr.lifetime = "1" - end - if element.attr.name == "magic_liquid_faster_levitation_and_movement" then element.attr.tags = "[liquid],[water],[magic_liquid],[impure],[magic_faster],[magic_haste]" end end ModTextFileSetContent("data/materials.xml", tostring(xml)) - --Create AP and LC recipes based off of time & date (world seed not available when material creation needs to be called) - --Create Alchemic Recipes - AP_recipe, LC_recipe = create_AP_LC_recipes() - --Set Alchemic Recipes - set_AP_LC_recipes(AP_recipe, LC_recipe) - --ceaseless void add_ceaseless_void_recipes(true) end @@ -232,14 +211,6 @@ function OnWorldInitialized() -- This is called once the game world is initializ local biome_name = "tower/solid_wall_tower_" .. tostring(i) set_biome_to_purgatory(biome_name, 25, 0.2, ascension_level) end - - --Write AP and LC to global values for alchemist arena to call - GlobalsSetValue("AP_PART_1", AP_recipe[1]) - GlobalsSetValue("AP_PART_2", AP_recipe[2]) - GlobalsSetValue("AP_PART_3", AP_recipe[3]) - GlobalsSetValue("LC_PART_1", LC_recipe[1]) - GlobalsSetValue("LC_PART_2", LC_recipe[2]) - GlobalsSetValue("LC_PART_3", LC_recipe[3]) end function OnWorldPreUpdate() -- This is called every time the game is about to start updating the world @@ -254,18 +225,67 @@ function OnWorldPreUpdate() -- This is called every time the game is about to st gui = gui or GuiCreate() GuiStartFrame(gui) - if GuiImageButton(gui, new_id(), 50, 0, "DB 1", "mods/purgatory/files/ui_gfx/perk_icons/roll_again.png") then - local player_id = getPlayerEntity() - local x, y = EntityGetTransform(player_id) + local player_id = getPlayerEntity() + local x, y = EntityGetTransform(player_id) - EntityLoad("mods/purgatory/files/entities/boss_bars/boss_bar.xml", x, y - 20) - end - - --GlobalsSetValue("HP_BOSS_BAR_TEST", tostring(slider_hp)) end end function OnWorldPostUpdate() -- This is called every time the game has finished updating the world --GamePrint( "Purgatory - OnWorldPostUpdate()" .. tostring(GameGetFrameNum()) ) end + +--[[ +GuiSlider( gui:obj, id:int, x:number, y:number, text:string, value:number, value_min:number, value_max:number, value_default:number, value_display_multiplier:number, value_formatting:string, width:number ) -> new_value:number [This is not intended to be outside mod settings menu, and might bug elsewhere.] + + + +GameGetCameraPos() -> x:number,y:number +GameSetCameraPos( x:number, y:number ) +GameSetCameraFree( is_free:bool ) +GameGetCameraBounds() -> x:number,y:number,w:number,h:number [Returns the camera rectangle. This may not be 100% pixel perfect with regards to what you see on the screen. 'x','y' = top left corner of the rectangle.] + + local plaform_shooter_player_comp = EntityGetFirstComponentIncludingDisabled(player_id, "PlatformShooterPlayerComponent") + local camera_centered = ComponentGetValue2(plaform_shooter_player_comp, "center_camera_on_this_entity") + + if GuiImageButton(gui, new_id(), 50, 0, "DB 1", "mods/purgatory/files/ui_gfx/perk_icons/roll_again.png") then + if camera_centered == true then + ComponentSetValue2(plaform_shooter_player_comp, "center_camera_on_this_entity", false) + GamePrint("camera_centered set to false") + elseif camera_centered == false then + ComponentSetValue2(plaform_shooter_player_comp, "center_camera_on_this_entity", true) + GamePrint("camera_centered set to true") + end + end + +distance = distance or 50 + distance = GuiSlider(gui, new_id(), 25, 50, "distance", distance, 0, 200, 0, 1, "", 100) + + local controls_comp = EntityGetFirstComponentIncludingDisabled(player_id, "ControlsComponent") + local cursor_x, cursor_y = ComponentGetValue2(controls_comp, "mMousePosition") + local x_raw, y_raw = ComponentGetValue2(controls_comp, "mMousePositionRaw") + + local left, up, w, h = GameGetCameraBounds() + + GuiText(gui, 25, 70, tostring(cursor_x)) + GuiText(gui, 25, 80, tostring(cursor_y)) + + GuiText(gui, 25, 100, tostring(x_raw)) + GuiText(gui, 25, 110, tostring(y_raw)) + + GuiText(gui, 25, 130, tostring(left)) + GuiText(gui, 25, 140, tostring(up)) + GuiText(gui, 25, 150, tostring(w)) + GuiText(gui, 25, 160, tostring(h)) +]] diff --git a/mod.xml b/mod.xml index 99a5f41..f7c1126 100644 --- a/mod.xml +++ b/mod.xml @@ -2,7 +2,7 @@ name="Purgatory" description="Damnation be apon thee." ui_newgame_name="Purgatory" - ui_newgame_description="Damnation be apon thee. Beta Build 28 Oct 2022" + ui_newgame_description="Damnation be apon thee. Beta Build 12 Nov 2022" ui_newgame_gfx_banner_bg="mods/purgatory/files/menu_banners/menu_banner_background.png" ui_newgame_gfx_banner_fg="mods/purgatory/files/menu_banners/menu_banner_overlay.png" request_no_api_restrictions="0"