Git Product home page Git Product logo

fiendsoftheelements / ff1randomizer Goto Github PK

View Code? Open in Web Editor NEW
81.0 23.0 45.0 104.14 MB

A randomizer for Final Fantasy 1 on the NES.

Home Page: http://finalfantasyrandomizer.com

License: GNU General Public License v3.0

C# 78.83% Shell 0.15% CSS 0.58% JavaScript 0.29% Assembly 8.77% HTML 11.31% Python 0.08%
game nes final-fantasy randomizer randomization retrogaming retro csharp blazor

ff1randomizer's People

Contributors

bdjeffyp avatar bedmonds avatar blackknight36 avatar blocky-games-studio avatar briancumminger avatar darkmoonfirelyte avatar darktwinge avatar daveo1001 avatar dependabot[bot] avatar dhmoeller avatar drcatdoctor avatar dwightdesotelle avatar entroper avatar highqualityshaun avatar iwritecode791 avatar jtoyoda avatar latzio avatar markyys avatar mhn65536 avatar nic0lette avatar oslodo avatar pinkpuff avatar sixcrmdevops avatar splitpunched avatar stellamazeika avatar steven-biro avatar tempus avatar tetron avatar wildham0 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ff1randomizer's Issues

WarMECH NPC

Three options:

  1. Leave WarMECH alone
  2. WarMECH is an NPC randomly wandering Sky Castle 4F
  3. WarMECH is an NPC at the end of the Bridge of Destiny (Sky Castle 5F)
  4. WarMECH is an NPC running around Sky Castle 4F and triggers a fight by touching you

Steps:

  • Use an empty map object for WarMECH
  • Replace fairy spring text
  • Remove WarMECH from random encounter table
  • Make WarMECH run really fast
  • Make WarMECH trigger a battle when you touch

Confused enemies cast weird spells

Apparently, in the original game, confused enemies cast the FIRE spell on each other. Now, they cast whatever spell gets shuffled there. This doesn't affect the game much, it's more amusing than anything, but it probably ought to be fixed.

Random Flags

Flags will become tri-state. This requires a significant rewrite to the flag parsing code, the JS side of which will be more painful.

.NET Core 2.0

  • Build ROMUtilities for .NET Standard 2.0
  • Ditch multiple build targets, build FF1Lib for .NET Standard 2.0
  • Make FF1Randomizer build use the new NuGet package .csproj style (Scott Hanselmann article)
  • Create Dockerfile for ASP.NET Core 2.0

FF1 Conveniences

Fixing these things will just make the game a little easier or faster to play.

  • Allow buying multiple items at once
  • B-button dash
  • Eliminate, move, or anchor NPCs that get in the way often, or remove bottlenecks from the maps themselves
  • Default Message Speed 8

FF1 Randomizer

Reference: http://www.gamefaqs.com/nes/522595-final-fantasy/faqs/57009

  • Treasures -- need sanity checks
    • CROWN not behind mystic key door
    • TNT accessible in Coneria/Elfland/Pravoka area
    • RUBY not in lower Earth Cave
    • FLOATER accessible in southern hemisphere
    • SLAB before Mirage Tower
  • We'd like to place the quest items as permissively as possible, so we need a system that detects circular dependencies. Like the CROWN being in the northern hemisphere and the FLOATER being behind a mystic key door.
  • Shops
    • Bottle needs sanity checks
      EDIT: Surprisingly, it doesn't, mainly because Lefein doesn't have an item shop.
  • Magic levels, i.e. NUKE can become an L1 spell if it's shuffled to the L1 shop
  • Enemy skills/spells
  • Enemy status attacks (e.g. stun, death)

The following would be not shuffled, but scaled by a random exponential factor:

  • Prices
  • Enemy stats (HP, damage, hits, accuracy, critical, defense, evade, magic defense, morale)

FF1 Bug fixes

One option I'd like to have is to allow the randomizer to patch several bugs in the original game.

Reference (search for SEC9): http://www.gamefaqs.com/nes/522595-final-fantasy/faqs/57009

  • HOUSE saves before restoring MP
  • Elemental and monster category weapons don't work
  • Critical hit chance on weapons doesn't work
  • Running not based on Luck+Level
  • Enemy status attacks apply to misses after the first hit
  • Enemy magic that hits allies doesn't hit the caster
  • Enemy protection spells don't work (AFIR)
  • Black Belt armor glitch on level up

Lots of magic bugs:

  • LOCK
  • LOK2
  • HEL2
  • TMPR
  • SABR
  • XFER

Bug: Infinite TENTs

Version 1.4.9
Seed D7EBEF66
Flags r%%%AQoeoo

The Issue: At one point early in the run I bought a stack of 10 TENTs (using "buy 10"). When I went in my inventory to use one a bit later, I only had 1, and it never went away. I used that single TENT about 30 times over the course of my run.

Crown in ToFR

FF1 Randomizer 0.5.2 Seed 1BC49D5A Flags TSmLB5050 CROWN in Phantom's room. Thankfully we all had a mage.

Step Counter, Encounter Table

I would like to see both the step counter and the encounter table shuffled and/or randomized as options. As things currently stand, there is an inherent advantage in racing the randomizer for people who know how to manipulate the step counter and get the fights that they want. I know some people have used the encounter table to avoid certain dangerous fights, and, though I haven't gotten to that point yet, there's a good chance I will soon. I'd like to just play the game without knowing exactly what's coming myself, to avoid having to follow every detail, so I'd prefer that the encounter tables and step counter just be shuffled or randomized in some fashion, at least as an option.

Program freezes while generating

Randomizer Version 1.0.3

Flags D9B7DBB2_Kx4oBoo
(Note this happens no matter the seed, that just happens to be the one on my copy/paste to show flags)

While trying to generate seeds with the above flags, the program will fail to generate and stop responding.

Upon further testing, this happens unless ALL THREE of the "enemy" shuffle options (scripts, skills/spells, status attacks) are on.

1.6.1 binary release is flagged as virus by Windows Defender

Haven't had this issue with earlier versions. Might just be me but making an issue just in case.

OS: Windows 10 Pro v1703 build 15063.786

Can't launch "FF1Randomizer.exe" from "FF1Randomizer.zip" from release v1.6.1 (c81893f) on the releases page. Defender flags it as a virus, prevents launching it, and shortly after automatically deletes it.

v1.6 also has this problem.

v1.5 prompts me to install the .NET runtime and isn't deleted by Defender outright. Possible this issue is related to the new DLL linking you're using?

Fun%

  • Shuffle enemy and player palettes
  • Change enemy names
  • WarMECH NPC
  • Random spell effects on items, with meaningful names

FF1 Conveniences (1.0)

  • Don't shuffle party after poison/stone/death
  • Allow obtaining the ROD from Sarda before killing the VAMPIRE
  • Allow obtaining the CANOE from Lukahn before killing LICH

New XP scaling -- impossible to level in some cases

ff1_0722d7a5_r---awbboo-1

Seed/Flags: 0722D7A5 / r%%%Awbboo

I generated 5 seeds using these flags, all have the same problem. Upon hitting level 2 or 3, the Experience needed to level up is set to near max. I guess there is an underflow error when gaining too much XP relative to current level, possibly if you skip 1 or more levels worth of XP from a single fight? The screenshot attached is after fighting the first 5 Imp fight outside Coneria, gaining the level, then checking the Status screen.

Thank you!

Ribbon picked up as weapon

I got a Ribbon from a chest in Earth Cave B2 and it went into my first character's weapon inventory despite my armor not being full. This is a 1.5.1 game that I started right before 1.5.2 was released.

https://imgur.com/a/H1JzS

Gold chests display the wrong values

When prices are scaled, the amount of gold in each gold chest is scaled, but the text doesn't change. The text is well packed, so it's difficult to change because it could move lots of other text. We need a comprehensive text packing system to fix this.

Randomized party

Randomly choose (and prevent the player from changing) some or all party members.

The most basic version of this feature would just let the user select a number of party members to be chosen randomly, 0 - 4.

The most advanced version would let the user choose which classes are allowed in each slot, and whether or not that slot is randomized. This would let the user, for example, disallow Black Belts in the party, or maybe only allow them in one slot at most. Or you could set the first two slots as fighting classes and the last two as mages, but have them randomly chosen. Or any number of other combinations.

Quest items in ToFR

If the TAIL ends up in ToFR, it is impossible to class change. The only way out is with the WARP or EXIT spell, both of which require a class change.

Also, the player may not even have a WW/BW in the party, so if something like the CROWN or ADAMANT end up in ToFR, it can really screw up the game.

Randomized encounter rate?

Final Fantasy is VERY flexible with their encounter rates; the rates are determined on EACH FLOOR OF EACH DUNGEON!

Here is the code that takes the encounter rate and reduces it by 2/3. If you want to, you can modify it to have it randomized via your sliding scale or whichever you prefer. I don't suggest outright reducing the encounter rate like I did here;(I got resistance like it was nobody's business! :) ) I'm only providing this code as a reference.

        // These are for all dungeons.  The "9, 10, 11, and 12" are for the Chaos Shrine, the last number is for the last floor of the Floating Castle
        for (int lnI = 0x2cc11; lnI <= 0x2cc11 + 0x3d; lnI++)
            romData[lnI] = (byte)((romData[lnI] == 8 || romData[lnI] == 9 || romData[lnI] == 10) ? 3 : (romData[lnI] == 11 || romData[lnI] == 12) ? 4 : romData[lnI] == 1 ? 1 : 8);

        romData[0x3c50e] = 0x03; // Modified encounter rate for the overworld
        romData[0x3c516] = 0x01; // Modified encounter rate for the sea

Speed hacks

Feel free to implement as much or as little of these as you want. :) The field text window should open a lot faster and the transitions should be almost instantaneous as well as the below.

I'm not sure if all of these are documented properly, so please let me know if you have any questions.

`private void button4_Click(object sender, EventArgs e)
{
if (!loadRom())
return;

        // Double walking speed
        romData[0x3d088] = 0x02;
        romData[0x3d6f7] = romData[0x3d6f8] = romData[0x3d6f9] = 0xea;
        romData[0x3d71c] = romData[0x3d71d] = romData[0x3d71e] = 0xea;
        romData[0x3d956] = 0x60;
        romData[0x3d8e6] = romData[0x3d8e7] = romData[0x3d8e8] = 0xea;
        romData[0x3d630] = 0x08;
        romData[0x3d6a9] = 0x08;
        // Battle speedups
        romData[0x31e2d] = 0x01;
        romData[0x31e92] = 0x01;
        romData[0x31e5c] = 0x01;

        // Inn fade in/out
        romData[0x3ffa3] = romData[0x3ffa4] = romData[0x3ffa5] = 0xea;
        romData[0x3ffb8] = romData[0x3ffb9] = romData[0x3ffba] = 0xea;

        // Speed up character resort
        romData[0x399b7] = romData[0x399b8] = romData[0x399b9] = 0xea;

        romData[0x3795b] = romData[0x3795c] = romData[0x3795d] = 0xea;
        romData[0x37966] = romData[0x37967] = romData[0x37968] = 0xea;
        romData[0x37973] = romData[0x37974] = romData[0x37975] = 0xea;
        romData[0x379a9] = romData[0x379aa] = romData[0x379ab] = 0xea;
        romData[0x379b4] = romData[0x379b5] = romData[0x379b6] = 0xea;
        romData[0x379c1] = romData[0x379c2] = romData[0x379c3] = 0xea;
        romData[0x379fc] = romData[0x379fd] = romData[0x379fe] = 0xea;

        romData[0x35aa5] = romData[0x35aa6] = romData[0x35aa7] = romData[0x35aa8] = 
            romData[0x35aa9] = romData[0x35aaa] = romData[0x35aab] = romData[0x35aac] = 
            romData[0x35aad] = romData[0x35aae] = romData[0x35aaf] = romData[0x35ab0] = 
            romData[0x35ab1] = romData[0x35ab2] = romData[0x35ab3] = romData[0x35ab4] = 
            romData[0x35ab5] = romData[0x35ab6] = romData[0x35ab7] = romData[0x35ab8] = 0xfb;

        romData[0x33e6d] = romData[0x33e6e] = romData[0x33e6f] = 0xea;
        romData[0x317a9] = romData[0x317aa] = romData[0x317ab] = 0xea;
        romData[0x3f47b] = romData[0x3f47c] = romData[0x3f47d] = 0xea;
        //romData[0x33dba] = 0x01;
        //romData[0x33cdd] = 0x01;
        //romData[0x33fea] = 0x00;
        //romData[0x3f45a] = 0x01;
        //romData[0x33fc7] = 0x00;

        saveRom();
    }`

CHAOS can be literally impossible to kill

Watched czardia playing last night, and he got a max-evade CHAOS with lots of HP. Hit him with lots of low-level NUKE and FADE spells, was missing all day with FASTed Knight+Masmune and Master, could not defeat him between casts of CUR4 despite racking up over 5000 damage.

I like some enemies having sky-high evade, even if it's super inconvenient, like AIR (unrunnable). But it does break the game if it happens to CHAOS along with really high HP. Should probably clamp enemy agility slightly lower than 255.

Quality of Life issue (Soft Potions)

Is it possible to add a check that will ensure SOFT potions are available somewhere in the south half of the map? I was just part of a race where I lost 45 minutes (and eventually forfeit) due to lack of SOFT potions and a common enemy in Earth cave having petrify effect on their attacks. In this specific case it was Gargoyles, but it can be an issue even without status attack shuffle due to Coctrice.

0.5.3 Issue with Spell Permissions.

I'm not actually certain about the intented behavior for changing Spell Permissions, but I didn't expect it to behave the way it did. In a seed with unshuffled magic shops and unrestricted magic (TSmLp), spell permissions were being granted to classes based on the position of the spell in the shop.

E.G. The White Magic shop in Melmond (L5).
Original Spells in order: CUR3 LIFE HRM3 HEL2
Shuffled Spells in order: PURE HRM3 FOG HEL2

So for my Red Mage, PURE was learnable unpromoted as CUR3 would have been, and HRM3 was learned as a Red Wizard as LIFE would have been. Neither RM or RW could ever learn FOG or HEL2, as RW cannot originally learn HRM3 or HEL2.

Further examples of spells I'd never expect the Red Mage to learn, but did: CUR4, HRM4, NUKE, BANE.
I wrote down every spell's permissions from the seed for white and red mage and wizard.
https://docs.google.com/spreadsheets/d/1L4UVlVzio__3q4GD9s6615ArbEkiOHkVFdl0lp8wVoE/

Trapped Treasure Chests

This feature makes treasure hunting a bit more like later FF games, where instead of map tiles being trapped, the treasure chests are trapped instead.

  • Trapping map tiles in front of treasure chests is just janky.
  • Weird things can happen, like accidentally (or intentionally) fighting the FIENDs in ToFR multiple times.
  • It just feels wrong having to fight the same trapped tile twice, like the GARGOYLEs in NE ToF, or the AGAMA in front of the Red D in Volcano, or the Frost Ds in Ice Cave.
  • Trapped chests will trigger an encounter when you try to open them. Only after you defeat the encounter (you must win, not run) will you learn the contents of the chest. The easiest implementation would just set (or clear) another treasure chest bit and stick you back on the map, where you can now open the chest yourself.
  • A lot of the trapped tiles guard more than one chest, or guard entire rooms. Some of these, we can convert to NPCs, like the PHANTOM and FIENDs in ToFR. For others, we might trap just one chest, or several. Trapping a door has been suggested, but this seems trickier than other options. We'll have to just use good judgement to determine which chests to trap with which encounters. It's not going to map perfectly to the original trapped tiles in all cases.
  • Not sure what to do about the Hall of Giants. Could leave it trapped, or we could clear it out. No one ever seems to go there, anyway. Part of the idea of removing trapped tiles is to eliminate easy grind spots like the AGAMAs in Volcano. HoG probably isn't a great grind spot anyway.

Readme

This line from the readme should be updated: "Speaking of classes, the TAIL can be anywhere -- including the Temple of Fiends Revisited." Also, you have a line about permissions being a potential future change, which should probably be removed and replaced with a section on permissions.

Side question: when early canoe becomes possible, will this allow the ruby to be in any of the places accessible by canoe?

No install instructions

The instructions don't give any insight how to tie this with an emulator.

I have Jnes 1.0 and can't target the zip from this repo since there isn't a .rom file. What am I missing?

ROM Hashing

Ideally we'd like to hash parts of the ROM, but not all of it (to allow people to use fun graphics patches like FF Valkyries, FF3j tilesets, etc.). Then based on the hash, we can display a series of sprites on the title screen that are easily recognizable and verifiable on stream. This is not bulletproof, but it helps ensure the integrity of the ROM.

Orb Shards

Similar to triangle hunt in ALttPR. The randomizer should generate some number of orb shards and place them in random treasure chests. When a player collects enough shards (where "enough" is possibly less than all of them), they win the game.

  • Probably replace the lowest gold chests and the HEAL potion chests with orb shards.
  • It would be cool to unlink the chests in Marsh Cave and Volcano, that would give us some "free" slots to put shards in, and also encourage players to visit the often-ignored chests.
  • The name of the orb shard item should be randomly picked from a list we come up with of 5-letter names like SHARD, JEWEL, etc.
  • The win condition could be a few things:
    • Win immediately upon getting the nth SHARD.
    • The nth SHARD allows you to talk to the black orb in ToF.
      • You go through ToFR normally and kill CHAOS.
      • A FIEND, or CHAOS, or WarMECH pops out, and you win the game after defeating him/her/it.
      • The orb warps you to the last floor of ToFR, where the boss (whoever it is) awaits.

Fourth black spell cannot be cast outside battle

The original game has a bug where the eighth spell in each level cannot be cast outside of battle. Since none of the eighth spells in the original game can be used outside of battle anyway, it didn't matter, but if WARP gets shuffled to the eighth spot (only a black spell can end up there), it doesn't work.

Bad seed?

I couldn't find the crown, so I couldn't find the key -> cube -> rattail -> etc. I looked everywhere that I could think of. Seed 3C4D6E25, flags TSMLpAROFoo

Thanks for looking into this!

Mega Pirates

On seed C4adf723_q%%%AQeNoo I had pirates with Blaze, Squint, Sleep. It was a bit much. Any way to tune the pirates to ensure seeds have reasonable pirates? I have a mageless party, and so I've been slowly grinding to upper 20s to deal with it.

Infinite loop in shop shuffle

Sometimes the randomizer gets stuck adding items to shops, if most shops are full and the remaining ones all have a certain item already. Shops.cs line 115.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.