GithubHelp home page GithubHelp logo

yavsrg / interlude Goto Github PK

View Code? Open in Web Editor NEW
20.0 4.0 2.0 39.06 MB

Interlude, Yet Another Vertically Scrolling Rhythm Game

License: Other

F# 99.97% Shell 0.03%
rhythm-game osu-mania stepmania opentk keyboard fsharp game vsrg

interlude's Introduction

What is YAVSRG?

YET ANOTHER VERTICALLY SCROLLING RHYTHM GAME is a collection of rhythm game projects full of the features and ideas I think make games of this genre fun to play.

The project is centred around my custom rhythm game client, Interlude, and the tooling around it.

Visit yavsrg.net to read more about this project and its features.


🎮 Playing the game

Various player guides, including a wiki, are built into the game to help you get started, especially if you're coming from another popular rhythm game client.
You can also check out the wiki here in your browser!

On Windows - Download the latest release from the website, extract it and play!
On macOS and Linux - You currently must build the game from source, I've made this quick and easy, see below

🧱 Building Interlude

Note

If you just want to play the game on Windows, you do not need to do this, instead get the game by downloading the latest release from the site

  1. Cloning the codebase to your machine requires Git, and building requires the .NET 8 SDK
    Follow the install instructions for both of these for your platform

  2. To set up the codebase on your machine, run these commands in your terminal:

# Navigate to somewhere you want to store the interlude codebase
git clone https://github.com/YAVSRG/YAVSRG.git
cd YAVSRG/scripts
chmod +x ./setup_repo.sh
./setup_repo.sh
chmod +x ./setup_cli.sh
./setup_cli.sh

The steps above should set up the yavsrg CLI command. Try running yavsrg version, you should see a version number output in the terminal.
If this hasn't worked and you are stuck, get assistance from me in the discord

  1. Run yavsrg play to build and play the latest version.
    From now on yavsrg play will launch the game when you want to play.
    To update your game when a new version comes out, run yavsrg update.

To later uninstall the yavsrg command line tool, run dotnet tool uninstall --global yavsrg.cli
After that you can delete the entire YAVSRG folder to entirely remove the game and all data from your system.

🧱 Building Interlude <for developers only>

Note

If the setup guide for non-developers on Linux/macOS didn't work, please do not try these steps and instead get assistance in the discord if all you want to do is play.

The yavsrg update command will checkout and build the latest release, if you are a developer you will want to build what is on your local branch instead.

Use yavsrg debug_run to build and test the current branch, or go and look inside at what it does and use an IDE feature accordingly.

On first startup via yavsrg debug_run, the game will tell you that you need the correct bass.dll/dynlib/so for your platform placed in YAVSRG/interlude/src/bin/Debug/net8.0
Look for it here https://github.com/YAVSRG/YAVSRG/tree/main/engine/lib
If your platform isn't there contact me in the discord or search online for it

If you open YAVSRG.sln in Visual Studio 2022, setting Interlude as the active project will let you simply build and run with F5 which is my current workflow.

While Interlude stores all its data in the same folder as the exe by default, you can change that to a specific location - In YAVSRG/interlude/src/bin/Debug/net8.0/config.json you can edit WorkingDirectory to whatever is convenient

I use "C:/Interlude/dev" on Windows
If you previously built Interlude as a non-developer, I recommend setting it to "../../../../../GAME" so both builds share data

🤝 Contributing

Come join the discord -- Send me playtesting feedback, feature requests, bug reports, etc. I'm active a lot in there

Pull requests are very welcome! If you spot a bug, typo or other minor change and have a quick fix, feel free to submit a PR. If you want to work on a feature please check with me first via Discord

Warning

IMPOSTOR SYNDROME DISCLAIMER

Don't know F#? Don't know how to code but want to learn? This is a hobby project largely dedicated to expanding my skills as a programmer and I would be pleased if it could do the same for you.

Ask away in the Discord, I'm often free to chat about how I or the codebase work and will happily give YOU the tools to make meaningful contributions.

interlude's People

Contributors

9382 avatar kurulen avatar percyqaz avatar

Stargazers

 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

Forkers

kurulen 9382

interlude's Issues

PreviewPoints don't loop

On osu the previewpoint will wrap back around when the end of the song is reached.

here the song just terminates until another song is clicked

low priority but i dont have the perms to assign low priority to this

Need a new file format

Existing .yav is effective but incomplete

  • Need extra byte per row for special columns (i.e scratch)
  • Need extra byte per row for hitsounds (255 slots for hitsounds, 1 hitsound per row)
    (I don't plan on adding hitsounds just yet, but this is future proof)
  • Opportunity to restyle the SV and timing system
  • Requires new hashing algorithm too

Create score server system

checklist

  • player authentication
  • content distribution
  • player statistics
  • score uploading both in bulk and as acquired
  • leaderboard service including limiting to certain playstyles, rates and mod combinations
  • live chat and support for private rooms
  • private rooms can act as multiplayer games where scores are synced live + shown as leaderboard on score screen
  • bridge support between global rooms and one of Discord/IRC/Matrix.org

Screencovers broken

I can't get them to render properly so they're temporarily disabled
Worth looking at in the morning with fresh eyes and i'll probably pick out the mistake immediately

Feature: Playlists and Goals

Collection - A group of charts (basically a virtual pack) defined by the user to group things the way they want.
Playlist - A collection, allowing repeated charts, that also remembers the rate used for the chart. Good for practising/improving scores. All charts can be played back to back or with breaks before clicking 'next song'. Good for warmups or stamina training courses.
Goals - A collection, allowing repeated charts, remembers rates, and can have a goal attached to it

  • General collection management (create edit delete, add to and remove from)
  • Playlist management (multi add, targeted remove, mods and rates)
  • Goal list management (multi add, targeted remove, mods and rates)
  • Actual "Goal" assignment part of goals
  • Goal integration with rest of game/score setting/alerts when you reach a goal
  • Playlist sequential play support

Goal/playlist remaining features will appear on left instead of scoreboard when the context is a goal/playlist

Rewrite containers

my current code is messy and im sad
get rid of scrollcontainer and replace it with
FlowContainer - wraps content dynamically with options between automatically having scroll bars and wrapping downwards; supports quick scrolling to items and getting what item is scrolled to if applicable
FramedWidget - customisable "backplate" behind widgets to cut down on code duplication - draws the frame and colored chart background/rect to surround a widget - options for blend effects and such
FrameContainer - extends FramedWidget, receives a widget to "contain" i.e a FlowContainer

most things should extend FramedWidget.

Themes should not cascade, just single load

  • Create sensible script engine
    considering cs script because it's easy but concerned it could trigger antivirus and stuff (and i don't know much about how to sandbox it)
    maybe angelscript or lua

then support external scripting for

  • accuracy systems
  • hp systems
  • screen layouts
  • scrolling systems (upscroll / downscroll / spirally whatever itg-styled stuff you want)
  • some other stuff i put on discord but then forgot

allow maps to request scrolling systems ? then people can distribute packs with some theme content to use with it

allow selection of a hierarchy of theme folders which inherit down to _fallback for ease of using content from lots of packs

These ideas are now outdated (not surprising, 3 years later)

Themes will contain general purpose configs - Still considering if Options.json should just be moved into the current selected theme

Theme configs include:

  • Arrangement of gameplay widgets
  • Config for other UI stuff like accent color, cursor size, font, etc
  • Texture and sound replacements
  • User scripts in future
  • Gameplay configs for things like themes, accuracy systems + colors for gameplay stuff

From this list I don't see a value in cascading themes (loading several, with a hierarchy with later loads taking higher priority for what they replace) compared to just loading 1 theme on top of the default integrated theme

Localisation

All text/error messages/anything should be moved to a centralised text file that acts as a dictionary between internal names and what should be displayed to the user

EN_GB will be the only file i create but people are free to translate/submit translations for the game

making sure this issue is here so i nip this in the bud before there is a LOT of hard coded text to refactor

Rewrite for ChartLoader and Cache

Chart loading needs to be rewritten so that:

  • All (cached versions of) charts are loaded into a single list instead of collected by pack
  • cached charts know what pack they are from
  • methods are available to sort and search these charts / provide this to LevelSelector
  • newly cached charts store difficulty information
  • recaching is not attempted by default unless requested as this adds load time when charts fail to load
  • stepmania/multi diff files are converted into multiple files, meaning .YAV format needs to be created
  • when not sorting by difficulty, group the difficulties under one group somehow. probably check the path they came from as that's easy to do.

Improved options menu

  • Hovering over options pops up an info box explaining what this option is for/does.
  • Group options into panels in large window that can be scrolled down.
  • Keep key layout interface as-is design wise.
  • Create pop-out profile gui (stats show here instead of toolbar) with controls to rename and switch profile as well as show top scores etc

alt+scroll change volume

hold down alt and scroll to change volume

i almost got this working but i literally could not find out how to differentiate a scrolldown from a scrollup and literally all of the opentk documentation was no help (i tied a new function to Update() in musicplayer.cs)

Random crashes in HitMeter

it's really fucking annoying and i'm not sure what's causing it
but basically it calculates the alpha for the bars based on time and is getting negative numbers seemingly at random which crashes the whole game every time

should get fixed when i rewrite ScreenPlay.cs

Releasing longnotes issue

There is no punishment for releasing a long note as long as you don’t need to make any more movements, and that you also press and release again in time with the end of the note.

Load audio and background asynchronously

when any menu induces a chart change the background changes instantly, it should look nicer if theres a quick fade between the two a-la osu, or even a fade-in time like etterna, or just anything
idk

.YAV format

.YAV format:
needs to contain all relevant metadata (maybe design compressed binary format?)
store integer for number of snaps
store 2 bytes for each aspect of snaps
store integer for number of timing points
store 4 bytes for each float aspect of timing

that's basically it, it'll be really small

Performance scaling does not punish misses enough

it's a temp algorithm but it does indeed give stupid results when mashing as fast as possible through 30 rated charts.
fix: have a little miss% value that drops to 0 when you miss and climbs by a certain amount for consecutively hitting notes until it reaches 100. no it's not combo based the amount of notes will be like 10

multiply all confidence values by miss% value resulting in getting 0s for mashing which is what we want

Rewrite "Top score" system

Things to do:

  • Each top score references a score in the database by the chart's file identifier + the index in the list of scores for this chart (since the order is never rearranged by the game)
  • Background working task recalculates and provides data for your top scores from this data
  • To refresh in case of a difficulty calculator change, a different background working task can go through your charts and find your best physical/technical scores and put them in the list

"Color by" option in level select

Instead of the base green for all levels you could color by a third piece of data i.e sort charts in alphabetical order but darker colors mean harder.
One color option could be grade achieved on selected rate if I can begin storing and implement fast access to this data.

Color options:

  • Keymode
  • Difficulty (Physical/Technical)
  • Has been played before
  • Length
  • BPM

delay on combo counter

there is a noticeable delay between hitting a note and combo being added to the central counter.

likely something to do with the block around line 232 in screenPlay.cs

Chart editor

things it needs

  • complementary editor metadata files containing working information including layering (color notes by layer), bookmarks, notes, selected snaps/view/time etc
  • tabs for multiple charts open at once
  • rough design with peer to peer collab in mind
  • export to .osu .sm etc

things it doesn't need but will have need to be written up in the design doc

Refactor UI code

things to do probably tonight

  • test performance of certain update and draw methods
  • remove AnchorType and replace with number representing % offset
  • store bounding boxes and only update them if animations are running
  • clean up PositionTopLeft and PositionTopRight

things to probably do later

  • move UI stuff to json config / lua scripts
  • implement some of those designs i put in the discord

SM files don't load properly

A minority but a fairly large minority of maps don't load properly which is a major issue and needs to be fixed immediately
Caused by a lack of support for .sm's stops and skips

Next song is randomly selected in main menu

What i mean by this:

  • If you are on the main menu and the music for the selected chart ends, randomly pick a different one and start playing it from the beginning (not preview point)

Implementation:
it's easy just do it

No cap on rates

You can go below 0.05x which causes a crash on songlaunch.

Going above 4.55x has some strange side effects on the audio codec

Pop-out Music Controls

what i want:

  • replace music pause/play/stop buttons on toolbar with one music button
  • music button pops out a little panel with the pause/play/stop buttons, song title and progress and stuff

implementation:
it's not hard just create a widget and add it to toolbar and make a music button sprite

Add Skin Feature: Widget Positioning and Priority

What i mean by this is from inside skin.json:

  • You can reposition elements of ScreenPlay such as accuracy meter, hit meter, the playfield itself
  • You can order these elements by draw order to put hit meter / column lighting above or below screencovers (as an example).

Implementation:

  • Create suitable JSON format for Anchor points for Widgets/maybe redesign to make more intuitive for users
  • Remember to have default positionings for the elements when data is not present
  • Add a draw order list of strings in skin.json
  • Draw order list is order in which elements are added to the Widgets list which is the actual draw order ingame and at this same point, pull data from elsewhere in the skin about positioning.

Rewrite for ScoreTracker and ScreenLevelSelect / Gameplay modifiers

both need to be written such that

  • mods are selectable from level selection menu
  • chart data is transformed by mods into actual hit data to be used in gameplay, including color styles
  • pretty much the only mod at first will be mirror but more will be added
  • ScoreTracker/ScreenPlay runs off this converted data rather than the chart
  • mods are in decent enough shape that they can be applied directly to a chart also (as this will be an editor feature) and then the modified chart could be saved
  • Difficulty calculator runs off this new data rather than the chart (dynamic updates)

I'll stick mod ideas in this thread as i come up with them also

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.