Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
f64e355
chore: Add 13.1.0 upcoming strings for crowdin
colin969 Dec 15, 2024
28c974e
chore: Final push of 13.1.0 strings for crowdin
colin969 Feb 10, 2025
fd6d1b1
Merge branch 'release/14.0.0' into develop
colin969 Feb 15, 2025
8f52375
Merge branch 'hotfix/14.0.1' into develop
colin969 Feb 17, 2025
7661776
Merge branch 'hotfix/14.0.2' into develop
colin969 Apr 28, 2025
a782aa2
feat: Extension data + NGA proof of concept
colin969 Apr 27, 2025
f91f94e
feat: Introduce React Compiler + Rsbuild
colin969 Apr 28, 2025
3a37840
fix: Update eslint plugins blocking install
colin969 Apr 28, 2025
f7fb1ef
fix: Even more linting fixes
colin969 Apr 28, 2025
edc0547
refactor: Adjust many react components to be compatible with the reac…
colin969 Apr 28, 2025
9f33bcc
fix: Fix remaining renderer eslint problems. Still a few non-blocking…
colin969 Apr 28, 2025
7bd9cdd
fix: When dragging a selected curation, move all selected to the new …
colin969 Apr 28, 2025
4e293df
feat: Migration to React 19 WIP
colin969 Apr 29, 2025
4dbce71
fix: Various react 19 fixes
colin969 Apr 29, 2025
a85980b
refactor: Move LogsPage and BrowsePage to functional components
colin969 Apr 30, 2025
ed367aa
refactor: More components moved to functionals
colin969 Apr 30, 2025
e6303eb
feat: Game List icons for extensions
colin969 Apr 30, 2025
19e8a71
feat: Searchables
colin969 May 1, 2025
3c2a4e4
feat: Extension ordering support
colin969 May 2, 2025
ccb7a61
fix: Image paths fixed
colin969 May 3, 2025
45ea6a0
feat: Move to Module Federation for loaded components
colin969 May 5, 2025
0334f00
refactor: Move ruffle page into Ruffle extension
colin969 May 6, 2025
c7cc2ef
refactor: Better module federation definitions in extensions
colin969 May 6, 2025
f644185
refactor: Make launch embed a toggle to replace standalone
colin969 May 8, 2025
91f6ee2
fix: Update deprecated electron methods
colin969 May 8, 2025
f62cce2
fix: Revert websocket call changes. Typings are wrong?
colin969 May 8, 2025
b856d7e
fix: Cap window size to 200px min
colin969 May 9, 2025
c90e7da
feat: Toast notifs for game edit submissions
colin969 May 9, 2025
07d76a2
fix: Make sure ruffle player size is accurate on subsequent uses
colin969 May 10, 2025
5af135f
feat: Basic NGA trophy display
colin969 May 13, 2025
331f97b
feat: Trophy integration for NGA
colin969 May 20, 2025
905fd1f
feat: Add prefs toggle to hide screenshot in the sidebar (no config p…
colin969 May 20, 2025
732084a
feat: NGA author comments and removed unused fields
colin969 May 21, 2025
4811173
feat: Extension modifiable GameList row and header components
colin969 May 21, 2025
80e0c5a
fix: Update FPA to make ordering work for numbered cols
colin969 May 23, 2025
39faad7
feat: Unknown ratings for NGA
colin969 Jun 5, 2025
98e7754
feat: GET_TAG caching
colin969 Jun 6, 2025
b13a2e0
wip: Downloads page
colin969 Jul 14, 2025
67b82a0
feat: Controller Support + Home Page Dynamic Components
colin969 Jul 17, 2025
d45a066
feat: Themeable Component Replacements
colin969 Jul 18, 2025
0434f57
wip: Ownership
colin969 Aug 15, 2025
4e8af5d
feat: Handle multiple game metadata sources in Update UI
colin969 Aug 23, 2025
8f7eded
feat: Data Provider system + API registry
colin969 Aug 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .eslintignore

This file was deleted.

137 changes: 0 additions & 137 deletions .eslintrc-old.json

This file was deleted.

4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@ Install by running ``sudo apt install libgtk-3-0 libnss3``

4. Run ``npm run start`` (at the root of the repository) to start the launcher. It is recommended to do this in a second command prompt / terminal.

5. **Optional** - It is highly recommended to set the launcher's "Flashpoint folder". This is where the launcher will read and write most data to and from. You can set the "Flashpoint folder" path at the "Config" tab in the launcher. Make sure the background of the text field is green (this means the path is valid) and don't forget to hit "Save and Exit"!
5. React components use the React Compiler. If creating new components please make sure they are compiled, see this extension for a handy IDE hint in Vscode. Existing components are fine to be skipped. https://marketplace.visualstudio.com/items?itemName=blazejkustra.react-compiler-marker

6. **Optional** - It is highly recommended to set the launcher's "Flashpoint folder". This is where the launcher will read and write most data to and from. You can set the "Flashpoint folder" path at the "Config" tab in the launcher. Make sure the background of the text field is green (this means the path is valid) and don't forget to hit "Save and Exit"!

Notes:

Expand Down
101 changes: 101 additions & 0 deletions docs/overhaul.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Goals

- Have a very deep level of visual and functional customization to the majority of the Launcher, particularlly the Browse pages
- Turn most of the existing systems into jigsaw pieces that can be fit together at request of the extension developer
- Provide easy to use ways to create customized components built like the existing set so extensions can choose to use them instead of reinventing the wheel
- Allow highly specific functionality for content which won't interfere with other content that is also browseable in launcher
- Create a basic yet flexible common Search API which extensions must adhere to, with ability to support any use case, for example:
- Browsing a local database (Flashpoint Archive)
- Browsing results taken from querying directories on disk (ROM file directories)
- Browsing results from existing APIs, like Steam, Youtube etc

# Helper Functionality

Flashpoint Launcher will provide a few extras to make it easier to support new data:
- Running applications and background services can already be managed via the Services API
- Wrapper for defining a List View with custom headers
- Wrapper for defining a Grid View with a given Grid render function
- Game List Item wrapper, length must match header lengths, can provide individual render funcs for each
- Game Grid Item wrapper with a given id, title, logo and icon list
- Built-in handling of Software component downloads and hash verifying the files before installation
- Software providers may have to handle verification and configuration themselves
- Simple Metadata Update API for providers which do not read metadata remotely and want to only have updates apply on request (Subject to change)
- React Components for common wrappers like:
- Home Page boxes with custom internals
- Editable sidebar fields which display and / or modify content metadata

# Game

Required fields:
- `id` string
- `title` string
- `runner` string (Decides which content runner to use)
- `logoPath` string (opt. Primary image)
- `screenshotPath` string (opt. Secondary image)
- `imageFileProvider` string (opt. Priority filter when choosing the file provider for Logos and Screenshots)

Optional fields:
- Arbitrary

Extensions can coerce the type to narrow down type safety if they are confident their field is unique.

# Content Runner

Handles starting and stopping of games, and associated services like daemons.
Register a unique handler to each `runner` value, Extensions can use code reuse if needed.

Can implement the Software check

# File Provider

Exposes Logos, Screenshots or other Custom prefix routes over the localhost file server.
For Logos and Screenshots, be fed a request, must write response itself, returns whether it handled the request.
Content will priority use the `fileProvider` field otherwise iterate over each until one returns true.

Custom routes will define a prefix which will exist under a unique name. Will handle all aspects of requests.

# Software Components

Extensions can register Software Components, these replace the old style Flashpoint Manager system.

Provides easy management of prerequisite software and updating of software outside of individual games. Primarily for content which will help run content.

Fields:
- `id`
- `name`
- `installed`
- `sizeOnDisk` (opt.)
- `downloaddSize` (opt.)
- `downloadHash` (opt.)
- Arbitrary fields

Flashpoint will likely use an optional 'provides' field or just check install state of components in its Content Runner.

# Search Provider

Search providers are given a query, and are expected to return results from an async function in a specific format with only a few required fields.
They are free to decide how to perform that search, and the level of detail to return in a search vs when requesting a single game.
Must fit query workflow via common API:
- Text change or Advanced filters change forces query to rebuild (`rebuildQuery`)
- Query building must consider both text and advanced filters at the same time
- Query changing will automatically wipe existing results
- Be able to return metadata for a specific game in full

Can choose which search capabilities to support, must support at least one
- Indexed Keyset Pagination (Current)
- All results at once
- Infinite scroll (Keyset Pagination)

Frontend side must provide it's own way of presenting the data

# Browse Page

Each search provider will have an individual tab within the view.
This makes sure the visuals remain tailored to the content the search provider has without requiring a high level of compatability between structures.
Can choose which providers will be queryed even when the tab isn't in view.
Current Tab -> Other Tabs in order, so results are faster on the first page.
Rendering of tables is handled by the frontend portion of the search provider.

The sidebar rendering function will be built by factory and cached based on the ID of the search provider.
When a new render function is created, extensions will be queried in their load order to add or remove components.
They can also register component overrides which are applied before theme component overrides.
22 changes: 13 additions & 9 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,26 @@ import tseslint from 'typescript-eslint';
import react from 'eslint-plugin-react';
import stylistic from '@stylistic/eslint-plugin';
import globals from 'globals';
import reactHooks from 'eslint-plugin-react-hooks';

export default tseslint.config(
eslint.configs.recommended,
reactHooks.configs['recommended-latest'],
...tseslint.configs.recommended,
{
files: ['**/*.{js,jsx,ts,tsx}'],
ignores: ['gulpfile.js'],
ignores: ['**/*.js']
},
{
files: ['**/*.{ts,tsx}'],
plugins: {
react,
'@stylistic': stylistic,
},
settings: {
react: {
version: '17'
}
},
languageOptions: {
parserOptions: {
ecmaFeatures: {
Expand All @@ -29,15 +38,9 @@ export default tseslint.config(
rules: {
"@stylistic/object-curly-spacing": ["warn", "always"],
"@typescript-eslint/adjacent-overload-signatures": "off",
"@typescript-eslint/ban-types": ["error", {
"types": {
"{}": false
},
"extendDefaults": true
}],
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/explicit-module-boundary-types": "off",
"@typescript-eslint/indent": ["error", 2, {
"@stylistic/indent": ["error", 2, {
"MemberExpression": 0,
"SwitchCase": 1
}],
Expand All @@ -47,6 +50,7 @@ export default tseslint.config(
"@typescript-eslint/no-namespace": "off",
"@typescript-eslint/no-unused-vars": ["error", {
"vars": "all",
"caughtErrors": "none",
"args": "none"
}],
"@typescript-eslint/no-use-before-define": "off",
Expand Down
1 change: 1 addition & 0 deletions extensions/core-controller/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.js
4 changes: 4 additions & 0 deletions extensions/core-controller/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
dist/
static/*.js
static/mf*.json
static/*mf-types*
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
15 changes: 15 additions & 0 deletions extensions/core-controller/AntiMicroX/bin/antimicrox_settings.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[General]
DisplayNames=0
WindowSize=@Size(650 883)
WindowPosition=@Point(619 254)

[Controllers]
Controller0300f617de2800000512000000016800104624613MEDA20901796LastSelected=G:/Data/FP2/Data/Controller Configs/08143aa7-f3ae-45b0-a1d4-afa4ac44c845.gamecontroller.amgp
Controller0300b7e67e050000092000000000680314068201e417d8018ac2ConfigFile1=G:/Data/Projects/launcher/extensions/core-controller/Controller Configs/08143aa7-f3ae-45b0-a1d4-afa4ac44c845.gamecontroller.amgp
Controller0300b7e67e050000092000000000680314068201e417d8018ac2LastSelected=G:/Data/Projects/launcher/extensions/core-controller/Controller Configs/08143aa7-f3ae-45b0-a1d4-afa4ac44c845.gamecontroller.amgp
Controller0300f617de2800000512000000016800104624613MEDA20901796ConfigFile1=G:/Data/FP2/Data/Controller Configs/08143aa7-f3ae-45b0-a1d4-afa4ac44c845.gamecontroller.amgp
Controller0300b7e67e050000092000000000680314068201e417d8018ac2ConfigFile2=G:/Data/Projects/launcher/extensions/core-controller/Controller Configs/db15e875-6230-4fed-9901-0a3a8282155f.gamecontroller.amgp
Controller0300f617de2800000512000000016800104624613MEDA20901796ConfigFile2=G:/Data/Projects/launcher/extensions/core-controller/Controller Configs/08143aa7-f3ae-45b0-a1d4-afa4ac44c845.gamecontroller.amgp
Controller0300b7e67e050000092000000000680314068201e417d8018ac2ConfigFile3=G:/Data/FP2/Data/Controller Configs/08143aa7-f3ae-45b0-a1d4-afa4ac44c845.gamecontroller.amgp
Controller0300f617de2800000512000000016800104624613MEDA20901796ConfigFile3=G:/Data/Projects/launcher/extensions/core-controller/Controller Configs/db15e875-6230-4fed-9901-0a3a8282155f.gamecontroller.amgp
Controller0300b7e67e050000092000000000680314068201e417d8018ac2ConfigFile4=C:/Users/Colin/Documents/AlienHominid.gamecontroller.amgp
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <[email protected]>

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Loading
Loading