{"id":40680854,"url":"https://github.com/hmsjayne/ffr-hmsj","last_synced_at":"2026-01-21T10:17:18.740Z","repository":{"id":52257937,"uuid":"173479210","full_name":"hmsjayne/ffr-hmsj","owner":"hmsjayne","description":"Final Fantasy Randomizer: HMS Jayne Prototype","archived":false,"fork":false,"pushed_at":"2025-08-30T20:32:58.000Z","size":2692,"stargazers_count":8,"open_issues_count":6,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-30T22:17:55.154Z","etag":null,"topics":["finalfantasy","randomizer"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hmsjayne.png","metadata":{"files":{"readme":"README-Dev.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-03-02T17:41:28.000Z","updated_at":"2024-07-14T18:54:20.000Z","dependencies_parsed_at":"2024-07-14T17:12:15.223Z","dependency_job_id":"7d92fbe2-64f1-4d05-9ef2-9718ed3abe0d","html_url":"https://github.com/hmsjayne/ffr-hmsj","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/hmsjayne/ffr-hmsj","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hmsjayne%2Fffr-hmsj","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hmsjayne%2Fffr-hmsj/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hmsjayne%2Fffr-hmsj/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hmsjayne%2Fffr-hmsj/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hmsjayne","download_url":"https://codeload.github.com/hmsjayne/ffr-hmsj/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hmsjayne%2Fffr-hmsj/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28631936,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T04:47:28.174Z","status":"ssl_error","status_checked_at":"2026-01-21T04:47:22.943Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["finalfantasy","randomizer"],"created_at":"2026-01-21T10:17:13.282Z","updated_at":"2026-01-21T10:17:18.730Z","avatar_url":"https://github.com/hmsjayne.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Final Fantasy Randomizer: HMS Jayne Prototype\nDevelopment guide\n\nThe directories/packages in the project are:\n\n- asp: (Answer Set Programming) These are the files that support the solver used for key item placement.\n    \n- data: IPS patches, and source that could be used to rebuild them in many cases.\n\n- doslib: Dawn of Souls library - Code to support reading and writing the ROM and associated data structures.\n\n    Contained within \"doslib\" is a subpackage \"gen\". These files are autogenerated by `build_types.py` in\n    \"doslib\".\n    \n- event: Code for assembling and disassembling event bytecode.\n\n- labels: Text files that include NPC and location ID strings.\n\n- randomizer: Final Fantasy Randomizer - Code to support randomizing the ROM.\n\n- static: Static files used by the website.\n\n- stream: library to support reading and writing of streams, used by `doslib`.\n\n## Key Item Distribution\n\nThe Key items returned work like this. Suppose a Placement returned was:\n\n```\n[Placement(item='oxyale', location='king'),\nPlacement(item='canoe', location='sara')]\n```\n\nThis means:\n\n- Oxyale can be found at the location of the King of Cornelia.\n- The Canoe can be found by Sara, the Princess of Cornelia.\n\nThis does not mean that the King will hand over Oxyale, or that the Princess will\ngive the canoe. Rather it means that the NPCs that usually provide those items,\nin this case the Fairy and Sage (Lukahn in the randomizer, will be there and provide\nthose items.\n\nThis further means that going to the _Temple of Fiends_ will reveal that Garland has\nkidnapped Lukahn, and freeing him will have him provide the canoe to the party.\n\nAt that point, the Fairy, in the King's spot, will provide Oxyale, now that their\nbeloved sage has been rescued(?).\n\n## Example of how to modify something, given a data type.\n\n```python\nenemy_stats_stream = rom.open_bytestream(0x1DE044, 194 * 32)\nnew_enemy_stats_stream = Output()\nfor index in range(0, 194):\n    enemy = EnemyStats(enemy_stats_stream)\n    enemy.max_hp = int(enemy.max_hp * 0.1)\n    enemy.write(new_enemy_stats_stream)\n\nrom = rom.apply_patch(0x1DE044, new_enemy_stats_stream.get_buffer())\n```\n\nMore details coming soon(er or later).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhmsjayne%2Fffr-hmsj","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhmsjayne%2Fffr-hmsj","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhmsjayne%2Fffr-hmsj/lists"}