GithubHelp home page GithubHelp logo

libretro / ludo Goto Github PK

View Code? Open in Web Editor NEW
575.0 18.0 66.0 3.8 MB

A libretro frontend written in golang

Home Page: https://ludo.libretro.com/

License: GNU General Public License v3.0

Go 82.69% Makefile 0.72% C 16.58%
libretro libretro-frontend libretro-api golang glfw bindings emulation opengl retrogaming ui

ludo's Introduction

ludo Build Status GoDoc

Ludo is a work in progress libretro frontend written in go.

It is able to launch most non GL libretro cores.

It works on OSX, Linux, Linux ARM and Windows. You can download releases here

Dependencies

  • GLFW 3.3
  • OpenGL >= 2.1
  • OpenAL

On OSX

You can execute the following command and follow the instructions about exporting PKG_CONFIG

brew install openal-soft

On Debian or Ubuntu

sudo apt-get install libopenal-dev xorg-dev golang

On Raspbian

You need to enable the experimental VC4 OpenGL support (Full KMS) in raspi-config.

sudo apt-get install libopenal-dev xorg-dev

On Alpine / postmarketOS

sudo apk add musl-dev gcc openal-soft-dev libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev mesa-dev

On Windows

Setup openal headers and dll in mingw-w64 include and lib folders.

Building

git clone --recursive https://github.com/libretro/ludo.git
cd ludo
go build

For more detailed build steps, please refer to our continuous delivery config.

Running

./ludo

ludo's People

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  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

ludo's Issues

ChaiLove blank screen?

Unsure why I'm getting a blank screen. It runs just fine, but the video is black....

screenshot at 2018-09-14 21-01-21

> go-playthemall git:(master) ./go-playthemall -L ~/libretro-chailove/chailove_libretro.so ~/ChaiLove-FloppyBird/main.chai
2018/09/14 21:03:34 Can't load game database: open /Users/kivutar/libretro-database/rdb/: no such file or directory
[ChaiLove] Initializing ChaiLove
[ChaiLove] retro_load_game
[ChaiLove] [libretro] update_variables()
[ChaiLove] ChaiLove 0.26.0
[ChaiLove] [filesystem] Mounting /home/rob/Documents/ChaiLove-FloppyBird as /
[ChaiLove] [filesystem] Mounting /home/rob/.playthemall/system/ as libretro/system
[ChaiLove] [filesystem] Mounting /home/rob/.playthemall/savefiles/ as libretro/saves
[ChaiLove] [script] joystickreleased() Error: "Can not find object: joystickreleased" 
[ChaiLove] [script] mousereleased() Error: "Can not find object: mousereleased" 
[ChaiLove] [script] mousemoved() Error: "Can not find object: mousemoved" 
[ChaiLove] [script] keypressed() Error: "Can not find object: keypressed" 
[ChaiLove] [script] keyreleased() Error: "Can not find object: keyreleased" 
[ChaiLove] [script] exit() Warning: Error: "Can not find object: exit" 
[ChaiLove] [system] Version current:  0.26.0
[ChaiLove] [system] Version targeted: 0.24.0
[ChaiLove] [system] Version 0.26.0 > 0.24.0
[ChaiLove] [system] Version 0.26.0 !~= 0.24.0
[ChaiLove] [system] Version 0.26.0 ^= 0.24.0
[ChaiLove] retro_get_system_av_info
2018/09/14 21:03:34 [OpenAL]: Using 4 buffers of 4096 bytes.
[ChaiLove] retro_unload_game()
[ChaiLove] retro_deinit()
[ChaiLove] Attempting to destroy ChaiLove
[ChaiLove] Destroying ChaiLove
[ChaiLove] Destroyed ChaiLove

It works just fine with fceumm and megaman2.

git clone https://github.com/libretro/libretro-chailove.git ~/libretro-chailove
make -C ~/libretro-chailove
git clone https://github.com/RobLoach/ChaiLove-FloppyBird.git ~/ChaiLove-FloppyBird
go-playthemall -L ~/libretro-chailove/chailove_libretro.so ~/ChaiLove-FloppyBird/main.chai

BlueMSX core is running but not displaying anything on macOS

Hello, I have a Mac with macOS 10.14.2 (Mojave) and with an Intel HD Graphics 5000 with 1,5Gb of VRAM.

Premise

All the libretro cores I'm using have been downloaded by using RetroArch and its "Online updater" function; Then I have just changed the settings in Ludo to point the core folder to the same core folder of RetroArch.

I'm trying to play some old MSX games by using the BlueMSX core, and when I try to launch a game under RetroArch with BlueMSX core, I can see that it works properly.

My issue with Ludo

When I try to launch the same MSX game under Ludo, even if I can notice that BlueMSX core is running underneath and I can hear audio unfortunately I cannot see anything but a black screen. If I try to exit from the game and go back into ludo, I can do it successfully usually just once. The third time I try to load a MSX game, ludo crashes. Colecovision games are giving me the same behaviour and, if I'm not mistaken, they're also using BlueMSX core; Other emulation cores I've tried are working properly AFAIK.
I'm having this problem with both Ludo 0.3.1 and 0.3.2.

I'm attaching a partial copy of my console log: ludo.log

Video recording

I've also recorded this strange behaviour on video, here is the link to a unlisted YouTube video I've just taken:

https://youtu.be/K9rPOhuvWkc

P.S. : BTW Great work with Ludo. I'm sure that once you'll publish it officially, everyone will love it.

Faster font drawing

The current font lib doesn't use a font atlas, and drawing labels is super slow.

Natinusala was pointing that we could pass string to a shader that would take care of drawing a full sentence.

Implement savefiles

Implement saving game sram to the filesystem.

See content_save_ram_file and content_load_ram_file in RetroArch.

We need to improve the binding with:

/* Gets region of memory. */
RETRO_API void *retro_get_memory_data(unsigned id);
RETRO_API size_t retro_get_memory_size(unsigned id);

Create a windows installer with nsis

Nsis can create windows installers from a .nsi script

We can integrate this with appveyor to get an installer generated on each commit.

Appveyor already has nsis installed in their containers.

Note: We may not need this if we pack the assets in the binary with gobindata. We can then distribute the .exe directly.

(Menu) "Start Core" for non-content cores

Cores like ScummVM or Mr.Boom can be run without content. Once a Core is successfully loaded, cores that support no-content should be able to use "Start Core".

screenshot at 2018-10-10 10-30-32

QA

  1. Load ScummVM, or via the command line ./ludo -L scummvm_libretro.so
  2. See that the ScummVM GUI pops up

Predictable release

The Makefile currently downloads the latest cores from the libretro buildbot during the build.

These cores may be at some point in time buggy.

We need to find a way to always pull an exact version of these cores.

In Ludo, the user shouldn't be in charge of testing and choosing the right cores and core versions. We have to do it for them in a reliable way.

Allow navigating to all the drives on Windows

Windows is not like Linux where everything is under /.
There can be many drives, and if a user prefers to keep his ROMs somewhere out of C:\ he should be allowed to.
Find a clean and non intrusive way to navigate all the drives when on Windows.

Mac OS X issues

Doesn’t work on Mac OS X Mojave,
Failed to find suitable pixel format

Use as a library

I'm new to libretro in general so this question might be misinformed or misplaced. It seems like a front-end is responsible for loading the core and interacting with the main program running within the core; with this in mind Is it possible to use ludo as an API to interact with a core programmatically? In the same way that gym-retro uses libretro

Prevent reset when launching the same game

Currently, while browsing playlists, if I launch the same game that is currently running, it will relaunch the game and lose the progress.

We should just resume the game instead.

Notify when the core is not found

Playlists have default cores.

If the core dir is empty, Ludo will crash.

Instead of this, check if the core exists at the right path, and display an error message, and don't start the core.

Core options are buggy

How to reproduce:

Launch a gambatte game, then launch a FBA game.

Go to the core options, you will see the core options of gambatte.

Switch to a better playlist format

We're currently using the old playlist format from RetroArch.
RetroArch now supports a new extensible JSON format.

Switching to the new JSON format has been considered, but would be painful because of the closing ] at the end of the file, preventing us to append easily. We would have to keep all of the playlists into memory, which may be a lot of memory.

Something like CSV would be a good compromise.

Publish releases on Snap or Flatpak

It would be wonderful if you could set this up as a snap or a flatpak application. It would help with making it easier to test and use on different distributions on Linux. Really great looking project btw 👍

Vsync issue (high speed menu) on Windows

@Zewwy reported

The menu system on my gaming machine is tooo responsive, when I press one key it'll move the menu 2-3 places, however when I was navigating the menu on my slower laptops it seemed fine.

Which may indicate that there is a lack of Vsync on some Windows system.
I've not been able to reproduce this on my Windowds 10.

How do you make a Libretro core in Go?

This project prompted my curiosity; I am surprised that Go can interact with Libretro!

What would I need to do if I want to use Go when writing a Libretro core, especially if I were to write one that does not use OpenGL (in light of the current capabilities this frontend has)?

Failed to load Core on Windows

When I try to load a game in Ludo, it asks me to load a core first,

this kind of sucks compared to the logic of Lakka, which asks to pick from a list of cores after selecting a game to load.

So ok, go to cores, pick any core from the list, and you'll simply be greeted with failed to load core.

About the new playlist file format (tab-delimited CSV)

Hi. I see that starting from v0.3.5 you've chosen to generate CSV files with tab-separated fields for the playlist. Correct me if I am mistaken, but in the CSV files for each entry you're storing these three information:

  1. The path to the file
  2. Game name
  3. The ID number used to recognize the game in the database

I didn't see a fourth parameter to specify the core to be used to emulate a specific entry, or at least I tried to specify it at the tail of each row but Ludo didn't recognized that.

I was wondering... what would happen if one day you'll decide to implement a "favorites" tab, just like RetroArch where everyone can put their all-time favourite games taken from different systems?

Because in this case, if I'm not mistaken your file format wouldn't work. Feel free to correct me if I am wrong, but I tried to create manually a "favorites" playlist named favorites.csv with three games taken from three different systems (Atari 2600, NES and Sega Megadrive). It resembles this imaginary one:

/path/to/roms/Atari 2600/Space Invaders (1978) (Atari) [!].a26.zip	Space Invaders (USA)	2800248755
/path/to/roms/Gameboy/Lock 'N' Chase (JU).gb.zip	Lock n' Chase ~ Lock 'n' Chase (World)	3669564538
/path/to/roms/Sega Megadrive/Sonic The Hedgehog (W) (REV01) [!].gen.zip	Sonic The Hedgehog (Japan, Korea)	2950717166

When I launch Ludo, it recognizes the playlist and displays it. However when I try to launch a game, I'm getting a default core not set error. In the old playlist format you could specify a specific core for each entry in a playlist, however with this format you can't.

This is just IMHO and you probably already have a better idea about how to manage this issue, but maybe you could add a fourth field in your playlist format where you specify the default core to be used for each entry. Eventually you could also avoid to enter the fourth field or put the value "DETECT" (just like RetroArch) to let Ludo guess would be the most suited emulator core to use.

By adding a fourth field you can also solve another problem:
What happens if a core can emulate properly 99 games out of 100?
Someone could leave the default value for the 99 working games and use another core for the problematic game, for example:

/path/to/games/Balloon Fight (U) [!].nes.zip	Balloon Fight (USA)	3415201714	DETECT
/path/to/games/Contra (U) [!].nes.zip	Contra (USA)	3305800452	DETECT
/path/to/games/Donkey Kong Classics (U) [!].nes.zip	Donkey Kong Classics (USA, Europe)	401345735	DETECT
/path/to/games/Duck Tales (U) [!].nes.zip	DuckTales (USA)	3703128897	DETECT
/path/to/games/Elevator Action (U) [!].nes.zip	Elevator Action (USA)	3558168351	nestopia_libretro

Implement delta timing

Delta timing is a technique widely used in video games to achieve frame rate independence of animations.

Calculate the delta time between two frames, and multiply every speed or acceleration with it.

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.