EverestAPI / EverestAPI/Everest

Add support for reskinning almost every Gui/Journal/FileSelect graphic

Open
#410 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
C#
Stars
516
Forks
106
Avg merge
4d 9h
Merged PRs (30d)
5

Description

**This is mostly going to be a design specification for implementation, if anyone would like to pick it up. Feel free to ignore it. I will likely also update this to be a cleaner explanation as time goes on. Please also feel free to leave a comment expanding or otherwise improving this if you want.**

**If you have any questions (and especially if you're going to implement this), please reach out to me first, so I can make sure it's a good standard and as futureproof as possible.**

## Overworld

Alright, so for overworld reskins, there's a number of design ideas we should be able to satisfy natively, those being:
- Feels cohesive and sensible for anyone who's worked on overworld graphics before
- Allow users to reskin in whatever skew they want while still being relatively contained/not bloated
- Minimise the need for repetitive or extraneous files
- Support D/E/F/etc sides in future, for if they're added to Everest
- Obviously not be structured in such a way as to cause conflicts or other issues

### Hearts

So, here's the proposal for hearts (which I expand to include everything else below). We determine what hearts each map will have based on the file structure that the graphics are placed in, similarly to Checkpoint and Chapter Card graphics for the overworld.

Using the example path of `Maps/Xavier/Shrier/`, users could specify it as
`Graphics/Atlases/Gui/collectables/heartgem/Xavier/Shrier/` to reskin all hearts across all chapters and sides
`Graphics/.../Shrier/A/` to reskin all A-Side hearts in the campaign
`Graphics/.../Shrier/mapname/` to reskin all hearts of that chapter
`Graphics/.../Shrier/mapname/A/` to reskin just the A-Side heart of that one chapter.

These should also be structured such that you may specify both a campaign-wide reskin, and also a reskin for just B-Sides, so that the campaign wide one first makes all of the hearts, say, purple, then the B-Sides get reskinned to orange.

### Other Collectables

Static images are a bit different, because as single frames having individual folders for them makes little sense. Instead, we would use the same system of `Graphics/Atlases/Gui/collectables/deathicon/Xavier/Shrier/`, except we would use a normal name (for this example, blueskull) and append letters infront of it. So, `blueskull` for reskinning every chapter and side, `mapname_blueskull` for reskinning all sides of that map, `A_blueskull` for reskinning all A-Sides, and `mapname_A_blueskull` for reskinning just the A-Side of just that map.

Berries and Golden Berries should be the same as skulls (define the icon that appears on the panel depending on name), but there is the issue of what to use as the *global* strawberry icon (the image that shows up in the topleft when collecting any berry, and on the file select card). We have three options here:
- Use the base `strawberry` reskin people use as the default (as with hearts). This is *basically* the same but unlike hearts leaves it out of reach to a more granular reskin, which is likely fine if you're reskinning everything else anyway (as it would become the sole instance of the reskin anyway).
- Allow some custom definition like `campaign_strawberry` to define what appears there - this feels clunky and doesn't fit in with everything else, but would minimise the issue that comes with the first suggestion, where you can't reskin it by itself.
- Make it unskinnable, and leave it as a strawberry (would not work great with maps that skin it to something else themed, and would feel jarring) - this is probably the only bad option here.

## Chapter Card

Icons (the Backpack/Cassette) that get applied to the first selection, for choosing A/B/C/etc sides, should be set by dropping files into `Gui/menu/Xavier/Shrier/`, named identically (`backpack`, `remix`, `rmx2`). You could also apply the same rules as skulls to this (`backpack`, `mapname_backpack`, `A_backpack`, and `mapname_A_backpack`, for example).

⚠️ Also note that the berry and cassette images for the chapter from the Journal should be applied to the checkpoint collectable graphics.

Tabs (the checkpoint shape) and the icons that get applied to those tabs (`checkpoint` and `startpoint`) should simply be a global reskin for that campaign. Again, you could apply the naming rules to this, but it may not be needed, though I can see it being nice for maps that want to up the themeing.

⚠️ You could arguably do that for the Title banner and Title Accent shaped too, but that's out of scope imo.

## Journal

The journal has a number of things we want to reskin, but has the notable limitation that some icons need to be global/displayed at the top of columns. To solve this, we just use `Graphics/Atlases/Journal/Xavier/Shrier/` for the strawberry and skull icons - that is, we simply allow people to drag in files named `strawberry` and `skullBlue`, `skullRed`, etc to reskin them.

Clear flags and cassettes can be treated in a similar way, though because they show up once *per row* we need to allow `mapname_cassette` to reskin the cassette for just one map, or `mapname_clear` to reskin the clear flag for just that map, and `mapname_fullclear` to reskin the full clear flag for just that map. Note that we would still need just a `cassette` option for if users wanted to reskin all cassettes at once, and the same for clear flags.

⚠️ Note: The same applies to `bird`, but unless issue #387 is implemented and supports setting multiple maps as IsFinal this seems useless. If it's implemented with support for only setting one map as IsFinal, we just need to allow a `bird` image, not a `mapname_bird`.

Finally, journal hearts need all 4 options, as specified for deathicons/chapter card skulls earlier, as each map may have a different one and they are all displayed individually in the journal.

⚠️ **Important:** While grouped under Journal, it's important to note that hearts and cassettes show up in two places - on the main journal page + last journal page (for poems), and on the File Select card. Given that the File Select graphics are identical, we would just use the same ones specified here, rather than forcing people to copy them over for no reason.

## File Select

The file select card and stamps are reasonably simple compared to everything else - we just need to let `Graphics/Atlases/FileSelect/Xavier/Shrier/` work, rather than only supporting global reskins via `Graphics/Atlases/FileSelect/`. That said, the Cheat/Assist/Variant mode graphics should probably *not* be reskinnable, and remain consistent across all mods.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.