diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml new file mode 100644 index 0000000000..c24ef128b8 --- /dev/null +++ b/.github/workflows/linux.yml @@ -0,0 +1,48 @@ +# This is a basic workflow to help you get started with Actions + +name: Linux CI + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the master branch +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + # Setup CMake + - name: Setup CMake + uses: Symbitic/install-cmake@v0.1.1 + with: + platform: linux + # Submoudle + - name: Checkout Submodles + run: git submodule update --init --recursive + # Setup Packages + - name: Setup Packages + run: sudo apt update && sudo apt upgrade && sudo apt install curl ffmpeg git libao-dev libasound-dev libavcodec-dev libavformat-dev libbluetooth-dev libevdev-dev libgtk2.0-dev libhidapi-dev libmbedtls-dev libminiupnpc-dev libopenal-dev libpangocairo-1.0-0 libpulse-dev libsfml-dev libswscale-dev libudev-dev libusb-1.0-0-dev libxrandr-dev qt5-default qtbase5-private-dev + # Run CMake + - name: Run CMake + run: mkdir build && cd build && cmake .. -G Ninja -DLINUX_LOCAL_DEV=true + # Build Project + - name: Run Make + run: cd build && ninja -j4 + # Configure Dolphin + - name: Configure Dolphin + run: cd build && cp -r ../Data/Sys/ Binaries/ && cp -r ../Data/User/ Binaries/ && cp -r ../Data/dolphin-emu.png Binaries/ && touch Binaries/portable.txt + # Upload Artifact + - name: Upload Build Artifact + uses: actions/upload-artifact@v2 + with: + name: DolphinMPN-Linux + path: /home/runner/work/dolphin-mpn-advanced-src/dolphin-mpn-advanced-src/build/Binaries/ diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 0000000000..8e49b1319e --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,51 @@ +# This is a basic workflow to help you get started with Actions + +name: macOS CI + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the master branch +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: macos-latest + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + # Setup CMake + - name: Setup CMake + uses: Symbitic/install-cmake@v0.1.1 + with: + platform: mac + # Setup Packages + - name: Setup Packages + run: brew install qt5 pkgconfig + # Use Static ZSTD + - name: Remove ZSTD + run: brew uninstall zstd curl php --force --ignore-dependencies + # Submoudle + - name: Checkout Submodles + run: git submodule update --init --recursive + # Run CMake + - name: Run CMake + run: mkdir -p build && cd build && cmake .. -G Ninja -DCMAKE_CXX_FLAGS="-Xclang -fcolor-diagnostics" -DCMAKE_PREFIX_PATH=$(brew --prefix qt5) + # Build Project + - name: Run Ninja + run: cd build && ninja -j4 + # Configure Dolphin + - name: Configure Dolphin + run: cd build && cp -r ../Data/Sys/ Binaries/ && cp -r ../Data/User/ Binaries/ && cp -r ../Data/dolphin-emu.png Binaries/ && touch Binaries/portable.txt + # Upload Artifact + - name: Upload Build Artifact + uses: actions/upload-artifact@v2 + with: + name: DolphinMPN-macOS + path: /Users/runner/work/dolphin-mpn-advanced-src/dolphin-mpn-advanced-src/build/Binaries/ diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 7242192251..5f458879d7 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -31,10 +31,10 @@ jobs: vs-version: '16.6.2' # Run MSBuild - name: Build Solution - run: msbuild "D:\a\dolphin-mpn-src\dolphin-mpn-src\Source\dolphin-emu.sln" /verbosity:minimal /property:Configuration=Release /property:Platform=x64 + run: msbuild "D:\a\dolphin-mpn-advanced-src\dolphin-mpn-advanced-src\Source\dolphin-emu.sln" /verbosity:minimal /property:Configuration=Release /property:Platform=x64 # Upload Artifact - name: Upload Build Artifact uses: actions/upload-artifact@v2 with: name: DolphinMPN-win32 - path: D:\a\dolphin-mpn-src\dolphin-mpn-src\Binary\x64 + path: D:\a\dolphin-mpn-advanced-src\dolphin-mpn-advanced-src\Binary\x64 \ No newline at end of file diff --git a/Data/dolphin-emu.png b/Data/dolphin-emu.png index c9d5b6836a..2ae36a4903 100644 Binary files a/Data/dolphin-emu.png and b/Data/dolphin-emu.png differ diff --git a/Readme.md b/Readme.md index 80f0f1424f..1f1d3c3578 100644 --- a/Readme.md +++ b/Readme.md @@ -1,252 +1,50 @@ -# Dolphin - A GameCube and Wii Emulator +# Dolphin MPN -[Homepage](https://dolphin-emu.org/) | [Project Site](https://github.com/dolphin-emu/dolphin) | [Buildbot](https://dolphin.ci) | [Forums](https://forums.dolphin-emu.org/) | [Wiki](https://wiki.dolphin-emu.org/) | [Issue Tracker](https://bugs.dolphin-emu.org/projects/emulator/issues) | [Coding Style](https://github.com/dolphin-emu/dolphin/blob/master/Contributing.md) | [Transifex Page](https://www.transifex.com/projects/p/dolphin-emu/) +Dolphin MPN is an emulator for running GameCube and Wii games on Windows, macOS, and Linux -Dolphin is an emulator for running GameCube and Wii games on Windows, -Linux, macOS, and recent Android devices. It's licensed under the terms -of the GNU General Public License, version 2 or later (GPLv2+). -Please read the [FAQ](https://dolphin-emu.org/docs/faq/) before using Dolphin. +## Info +This emulator bundled a modified version of Dolphin -## System Requirements +## Installation +(note: ROMs will need to be downloaded separately) -### Desktop +## Compiling -* OS - * Windows (7 SP1 or higher). - * Linux. - * macOS (10.13 High Sierra or higher). - * Unix-like systems other than Linux are not officially supported but might work. -* Processor - * A CPU with SSE2 support. - * A modern CPU (3 GHz and Dual Core, not older than 2008) is highly recommended. -* Graphics - * A reasonably modern graphics card (Direct3D 11.1 / OpenGL 3.3). - * A graphics card that supports Direct3D 11.1 / OpenGL 4.4 is recommended. +Windows: +1) Install [Git](https://gitforwindows.org/) and [Visual Studio 2019](https://visualstudio.microsoft.com/downloads/) (community is fine) if you haven't already +1) Clone the Git Repo `git clone https://github.com/MarioPartyNetplay/dolphin-mpn --recursive` +2) Open the **Source/dolphin-emu.sln** project in Visual Studio 2019 +3) Set Build Path to **Release** -> **x64** +4) Click Build +5: Open Dolphin +**Dolphin is Located at Binaries/x64/** -### Android +Linux: +1) Open Terminal +2) Install Required Packages: + **Ubuntu** `sudo apt install curl ffmpeg git libao-dev libasound-dev libavcodec-dev libavformat-dev libbluetooth-dev libevdev-dev libgtk2.0-dev libhidapi-dev libmbedtls-dev libminiupnpc-dev libopenal-dev libpangocairo-1.0-0 libpulse-dev libsfml-dev libswscale-dev libudev-dev libusb-1.0-0-dev libxrandr-dev qt5-default qtbase5-private-dev` +3) Clone the Git Repo: `git clone https://github.com/MarioPartyNetplay/dolphin-mpn` +4) Enter the Cloned Repo: `cd dolphin-mpn` +5) Make the Build Directory: `mkdir build && cd build` +6) Setup CMake: `cmake .. -G Ninja -DLINUX_LOCAL_DEV=true` +7) Build Dolphin `ninja` +8) Copy Important Files `cp -r ../Data/Sys/ Binaries/ && cp -r ../Data/User/ Binaries/ && cp -r ../Data/dolphin-emu.png Binaries/ && touch Binaries/portable.txt` +9) Run Dolphin +**Dolphin is Located at build/Binaries/dolphin-emu** -* OS - * Android (5.0 Lollipop or higher). -* Processor - * A processor with support for 64-bit applications (either ARMv8 or x86-64). -* Graphics - * A graphics processor that supports OpenGL ES 3.0 or higher. Performance varies heavily with [driver quality](https://dolphin-emu.org/blog/2013/09/26/dolphin-emulator-and-opengl-drivers-hall-fameshame/). - * A graphics processor that supports standard desktop OpenGL features is recommended for best performance. +macOS: +1) Install [Xcode Command Line Tools](https://developer.apple.com/xcode/features/) & [Brew](https://brew.sh/) if you havent +2) Open a Terminal +3) Install Brew: `brew install cmake qt5 ninja pkgconfig git` +4) Clone the Git Repo: `git clone https://github.com/MarioPartyNetplay/dolphin-mpn` +5) Enter the Cloned Repo: `cd dolphin-mpn` +6) Make the Build Directory: `mkdir -p build && cd build` +7) Setup CMake: `cmake .. -G Ninja -DCMAKE_CXX_FLAGS="-Xclang -fcolor-diagnostics" -DCMAKE_PREFIX_PATH=$(brew --prefix qt5)` +8) Build Dolphin: `ninja` +9) Copy Important Files: `cp -r ../Data/Sys/ Binaries/ && cp -r ../Data/User/ Binaries/ && cp -r ../Data/dolphin-emu.png Binaries/ && touch Binaries/portable.txt` +10) Run Dolphin +**Dolphin is Located at build/Binaries/dolphin-emu** -Dolphin can only be installed on devices that satisfy the above requirements. Attempting to install on an unsupported device will fail and display an error message. - -## Building for Windows - -Use the solution file `Source/dolphin-emu.sln` to build Dolphin on Windows. -Visual Studio 2022 17.0 or later is a hard requirement. Other compilers might be -able to build Dolphin on Windows but have not been tested and are not -recommended to be used. Git and Windows 11 SDK must be installed when building. - -Make sure to pull submodules before building: -```sh -git submodule update --init -``` - -The "Release" solution configuration includes performance optimizations for the best user experience but complicates debugging Dolphin. -The "Debug" solution configuration is significantly slower, more verbose and less permissive but makes debugging Dolphin easier. - -An installer can be created by using the `Installer.nsi` script in the -Installer directory. This will require the Nullsoft Scriptable Install System -(NSIS) to be installed. Creating an installer is not necessary to run Dolphin -since the Binary directory contains a working Dolphin distribution. - -## Building for Linux and macOS - -Dolphin requires [CMake](https://cmake.org/) for systems other than Windows. Many libraries are -bundled with Dolphin and used if they're not installed on your system. CMake -will inform you if a bundled library is used or if you need to install any -missing packages yourself. - -Make sure to pull submodules before building: -```sh -git submodule update --init -``` - -### macOS Build Steps: - -A binary supporting a single architecture can be built using the following steps: - -1. `mkdir build` -2. `cd build` -3. `cmake ..` -4. `make` - -An application bundle will be created in `./Binaries`. - -A script is also provided to build universal binaries supporting both x64 and ARM in the same -application bundle using the following steps: - -1. `mkdir build` -2. `cd build` -3. `python ../BuildMacOSUniversalBinary.py` -4. Universal binaries will be available in the `universal` folder - -Doing this is more complex as it requires installation of library dependencies for both x64 and ARM (or universal library -equivalents) and may require specifying additional arguments to point to relevant library locations. -Execute BuildMacOSUniversalBinary.py --help for more details. - -### Linux Global Build Steps: - -To install to your system. - -1. `mkdir build` -2. `cd build` -3. `cmake ..` -4. `make` -5. `sudo make install` - -### Linux Local Build Steps: - -Useful for development as root access is not required. - -1. `mkdir Build` -2. `cd Build` -3. `cmake .. -DLINUX_LOCAL_DEV=true` -4. `make` -5. `ln -s ../../Data/Sys Binaries/` - -### Linux Portable Build Steps: - -Can be stored on external storage and used on different Linux systems. -Or useful for having multiple distinct Dolphin setups for testing/development/TAS. - -1. `mkdir Build` -2. `cd Build` -3. `cmake .. -DLINUX_LOCAL_DEV=true` -4. `make` -5. `cp -r ../Data/Sys/ Binaries/` -6. `touch Binaries/portable.txt` - -## Building for Android - -These instructions assume familiarity with Android development. If you do not have an -Android dev environment set up, see [AndroidSetup.md](AndroidSetup.md). - -Make sure to pull submodules before building: -```sh -git submodule update --init -``` - -If using Android Studio, import the Gradle project located in `./Source/Android`. - -Android apps are compiled using a build system called Gradle. Dolphin's native component, -however, is compiled using CMake. The Gradle script will attempt to run a CMake build -automatically while building the Java code. - -## Uninstalling - -When Dolphin has been installed with the NSIS installer, you can uninstall -Dolphin like any other Windows application. - -Linux users can run `cat install_manifest.txt | xargs -d '\n' rm` as root from the build directory -to uninstall Dolphin from their system. - -macOS users can simply delete Dolphin.app to uninstall it. - -Additionally, you'll want to remove the global user directory (see below to -see where it's stored) if you don't plan to reinstall Dolphin. - -## Command Line Usage - -`Usage: Dolphin [-h] [-d] [-l] [-e ] [-b] [-v ] [-a ]` - -* -h, --help Show this help message -* -d, --debugger Show the debugger pane and additional View menu options -* -l, --logger Open the logger -* -e, --exec= Load the specified file (DOL,ELF,WAD,GCM,ISO) -* -b, --batch Exit Dolphin with emulator -* -v, --video_backend= Specify a video backend -* -a, --audio_emulation= Low level (LLE) or high level (HLE) audio - -Available DSP emulation engines are HLE (High Level Emulation) and -LLE (Low Level Emulation). HLE is faster but less accurate whereas -LLE is slower but close to perfect. Note that LLE has two submodes (Interpreter and Recompiler) -but they cannot be selected from the command line. - -Available video backends are "D3D" and "D3D12" (they are only available on Windows), "OGL", and "Vulkan". -There's also "Null", which will not render anything, and -"Software Renderer", which uses the CPU for rendering and -is intended for debugging purposes only. - -## Sys Files - -* `wiitdb.txt`: Wii title database from [GameTDB](https://www.gametdb.com/) -* `totaldb.dsy`: Database of symbols (for devs only) -* `GC/font_western.bin`: font dumps -* `GC/font_japanese.bin`: font dumps -* `GC/dsp_coef.bin`: DSP dumps -* `GC/dsp_rom.bin`: DSP dumps -* `Wii/clientca.pem`: Wii network certificate -* `Wii/clientcakey.pem`: Wii network certificate key -* `Wii/rootca.pem`: Wii network certificate issuer / CA - -The DSP dumps included with Dolphin have been written from scratch and do not -contain any copyrighted material. They should work for most purposes, however -some games implement copy protection by checksumming the dumps. You will need -to dump the DSP files from a console and replace the default dumps if you want -to fix those issues. - -Wii network certificates must be extracted from a Wii IOS. A guide for that can be found [here](https://wiki.dolphin-emu.org/index.php?title=Wii_Network_Guide). - -## Folder Structure - -These folders are installed read-only and should not be changed: - -* `GameSettings`: per-game default settings database -* `GC`: DSP and font dumps -* `Shaders`: post-processing shaders -* `Themes`: icon themes for GUI -* `Resources`: icons that are theme-agnostic -* `Wii`: default Wii NAND contents - -## Packaging and udev - -The Data folder contains a udev rule file for the official GameCube controller -adapter and the Mayflash DolphinBar. Package maintainers can use that file in their packages for Dolphin. -Users compiling Dolphin on Linux can also just copy the file to their udev -rules folder. - -## User Folder Structure - -A number of user writeable directories are created for caching purposes or for -allowing the user to edit their contents. On macOS and Linux these folders are -stored in `~/Library/Application Support/Dolphin/` and `~/.dolphin-emu` -respectively, but can be overwritten by setting the environment variable -`DOLPHIN_EMU_USERPATH`. On Windows the user directory is stored in the `My Documents` -folder by default, but there are various way to override this behavior: - -* Creating a file called `portable.txt` next to the Dolphin executable will - store the user directory in a local directory called "User" next to the - Dolphin executable. -* If the registry string value `LocalUserConfig` exists in - `HKEY_CURRENT_USER/Software/Dolphin Emulator` and has the value **1**, - Dolphin will always start in portable mode. -* If the registry string value `UserConfigPath` exists in - `HKEY_CURRENT_USER/Software/Dolphin Emulator`, the user folders will be - stored in the directory given by that string. The other two methods will be - prioritized over this setting. - -List of user folders: - -* `Cache`: used to cache the ISO list -* `Config`: configuration files -* `Dump`: anything dumped from Dolphin -* `GameConfig`: additional settings to be applied per-game -* `GC`: memory cards and system BIOS -* `Load`: custom textures -* `Logs`: logs, if enabled -* `ScreenShots`: screenshots taken via Dolphin -* `StateSaves`: save states -* `Wii`: Wii NAND contents - -## Custom Textures - -Custom textures have to be placed in the user directory under -`Load/Textures/[GameID]/`. You can find the Game ID by right-clicking a game -in the ISO list and selecting "ISO Properties". +### License +Dolphin MPN is licensed under the [GNU General Public License v2.0](license.txt) diff --git a/Source/Core/Common/GLideN64.custom.ini b/Source/Core/Common/GLideN64.custom.ini new file mode 100644 index 0000000000..60de1e524b --- /dev/null +++ b/Source/Core/Common/GLideN64.custom.ini @@ -0,0 +1,318 @@ +; Custom game settings +[General] +version=13 + +[TWINE] +Good_Name=007 - The World Is Not Enough (E)(U) +frameBufferEmulation\N64DepthCompare=1 + +[40%20WINKS] +Good_Name=40 Winks (E) (M3) (Prototype) +graphics2D\enableNativeResTexrects=1 + +[BIOFREAKS] +Good_Name=Bio F.R.E.A.K.S. (E)(U) +frameBufferEmulation\copyToRDRAM=1 + +[BioHazard%20II] +frameBufferEmulation\copyFromRDRAM=1 +frameBufferEmulation\copyToRDRAM=0 +frameBufferEmulation\copyDepthToRDRAM=0 + +[52150A67] +Good_Name=Bokujou Monogatari 2 (J) +frameBufferEmulation\N64DepthCompare=1 + +[67000C2B] +Good_Name=Eikou no Saint Andrews (J) +frameBufferEmulation\forceDepthBufferClear=1 + +[CAL%20SPEED] +frameBufferEmulation\bufferSwapMode=1 + +[CASTLEVANIA2] +Good_Name=Castlevania - Legacy Of Darkness (E)(U) +frameBufferEmulation\copyToRDRAM=1 + +[DMPJ] +Good_Name=Mario Artist Paint Studio (J) (64DD) +frameBufferEmulation\copyAuxToRDRAM=1 +frameBufferEmulation\copyFromRDRAM=1 +frameBufferEmulation\nativeResFactor=1 +generalEmulation\rdramImageDitheringMode=0 + +[DMTJ] +Good_Name=Mario Artist Talent Studio (J) (64DD) +frameBufferEmulation\copyAuxToRDRAM=1 + +[DINO%20PLANET] +frameBufferEmulation\copyToRDRAM=1 +frameBufferEmulation\copyAuxToRDRAM=1 + +[DONKEY%20KONG%2064] +Good_Name=Donkey Kong 64 (E)(J)(U) +frameBufferEmulation\copyDepthToRDRAM=1 +frameBufferEmulation\N64DepthCompare=0 + +[DR.MARIO%2064] +Good_Name=Dr. Mario 64 (U) +frameBufferEmulation\fbInfoDisabled=0 +frameBufferEmulation\copyFromRDRAM=1 +frameBufferEmulation\copyToRDRAM=0 + +[EXTREME_G] +Good_Name=Extreme-G (E) +frameBufferEmulation\N64DepthCompare=1 + +[EXTREME-G] +Good_Name=Extreme-G (J) +frameBufferEmulation\N64DepthCompare=1 + +[EXTREMEG] +Good_Name=Extreme-G (U) +frameBufferEmulation\N64DepthCompare=1 + +[EXTREME%20G%202] +Good_Name=Extreme-G XG2 (E) (U) +frameBufferEmulation\N64DepthCompare=1 + +[208E05CD] +Good_Name=Extreme-G XG2 (J) +frameBufferEmulation\N64DepthCompare=1 + +[F1%20POLE%20POSITION%2064] +Good_Name=F-1 Pole Position 64 (E)(U) +frameBufferEmulation\copyToRDRAM=1 + +[FLAPPYBIRD64] +Good_Name=FlappyBird64 +frameBufferEmulation\fbInfoDisabled=0 +frameBufferEmulation\copyFromRDRAM=1 +frameBufferEmulation\copyToRDRAM=0 + +[GOEMON2%20DERODERO] +Good_Name=Ganbare Goemon - Dero Dero Douchuu Obake Tenkomori (J) +graphics2D\enableNativeResTexrects=1 + +[GOEMONS%20GREAT%20ADV] +Good_Name=Goemons Great Adventure (U) +graphics2D\enableNativeResTexrects=1 + +[HARVESTMOON64] +Good_Name=Harvest Moon 64 (U) +frameBufferEmulation\N64DepthCompare=1 + +[5CFA0A2E] +Good_Name=Heiwa Pachinko World 64 (J) +frameBufferEmulation\copyToRDRAM=1 + +[HEXEN] +Good_Name=Hexen (E)(F)(G)(J)(U) +frameBufferEmulation\copyToRDRAM=1 + +[HUMAN%20GRAND%20PRIX] +frameBufferEmulation\copyToRDRAM=1 + +[I%20S%20S%2064] +Good_Name=International Superstar Soccer 64 (E) (U) +frameBufferEmulation\N64DepthCompare=1 + +[JET%20FORCE%20GEMINI] +Good_Name=Jet Force Gemini (E)(U) +frameBufferEmulation\fbInfoDisabled=0 +frameBufferEmulation\copyAuxToRDRAM=1 + +[J%20F%20G%20DISPLAY] +; See Jet Force Gemini for notes +Good_Name=Jet Force Gemini Kiosk Demo (U) +frameBufferEmulation\fbInfoDisabled=0 +frameBufferEmulation\copyAuxToRDRAM=1 + +[J%20WORLD%20SOCCER3] +frameBufferEmulation\N64DepthCompare=1 + +[301E07CC] +Good_Name=Mahjong Master (J) +frameBufferEmulation\N64DepthCompare=1 + +[DMGJ] +Good_Name=Mario Artist Polygon Studio (J) +frameBufferEmulation\copyAuxToRDRAM=1 + +[KEN%20GRIFFEY%20SLUGFEST] +Good_Name=Ken Griffey Jr.'s Slugfest +frameBufferEmulation\fbInfoDisabled=0 + +[KIRBY64] +Good_Name=Kirby 64 - The Crystal Shards (E)(J)(U) +graphics2D\enableNativeResTexrects=1 + +[MARIOGOLF64] +Good_Name=Mario Golf (E)(J)(U) +frameBufferEmulation\copyDepthToRDRAM=0 + +[MARIOKART64] +Good_Name=Mario Kart 64 (E)(J)(U) +graphics2D\enableNativeResTexrects=1 +graphics2D\enableTexCoordBounds=1 + +[MARIO%20STORY] +Good_Name=Mario Story (J) +frameBufferEmulation\copyToRDRAM=1 + +[MEGA%20MAN%2064] +Good_Name=Mega Man 64 (U) +graphics2D\correctTexrectCoords=2 + +[MEGAMAN%2064] +Good_Name=Mega Man 64 (Proto) +graphics2D\correctTexrectCoords=2 + +[MLB%20FEATURING%20K%20G%20JR] +Good_Name=Major League Baseball Featuring Ken Griffey Jr. +frameBufferEmulation\fbInfoDisabled=0 + +[MYSTICAL%20NINJA2%20SG] +Good_Name=Mystical Ninja 2 Starring Goemon (E) +graphics2D\enableNativeResTexrects=1 + +[NASCAR%202000] +Good_Name=NASCAR 2000 (U) +frameBufferEmulation\copyToRDRAM=1 + +[NASCAR%2099] +Good_Name=NASCAR 99 (U) +frameBufferEmulation\copyToRDRAM=1 + +[NUD-DMPJ-JPN_convert] +Good_Name=Mario Paint Studio (cart hack) +frameBufferEmulation\copyFromRDRAM=1 + +[NUD-DMTJ-JPN_convert] +Good_Name=Mario Artist Talent Studio (cart hack) +frameBufferEmulation\copyAuxToRDRAM=1 + +[OGREBATTLE64] +Good_Name=Ogre Battle 64 - Person of Lordly Caliber (U) +graphics2D\enableTexCoordBounds=1 + +[OLYMPIC%20HOCKEY] +frameBufferEmulation\bufferSwapMode=1 + +[PAPER%20MARIO] +Good_Name=Paper Mario (E)(U) +frameBufferEmulation\copyToRDRAM=1 +graphics2D\enableTexCoordBounds=1 + +[PENNY%20RACERS] +Good_Name=Penny Racers (E)(U) +frameBufferEmulation\copyToRDRAM=0 + +[PERFECT%20STRIKER] +Good_Name=Jikkyou J.League Perfect Striker (J) +frameBufferEmulation\N64DepthCompare=1 + +[POKEMON%20SNAP] +Good_Name=Pokemon Snap (U) +generalEmulation\rdramImageDitheringMode=1 +frameBufferEmulation\copyAuxToRDRAM=1 +frameBufferEmulation\copyToRDRAM=1 +frameBufferEmulation\fbInfoDisabled=0 + +[POKEMON%20STADIUM] +Good_Name=Pokemon Stadium (U) +frameBufferEmulation\copyDepthToRDRAM=0 + +[POKEMON%20STADIUM%202] +Good_Name=Pokemon Stadium 2 (E)(F)(G)(I)(J)(S)(U) +frameBufferEmulation\copyToRDRAM=0 +frameBufferEmulation\copyDepthToRDRAM=0 + +[POKEMON%20STADIUM%20G%26S] +Good_Name=Pokemon Stadium Kin Gin (J) +frameBufferEmulation\copyToRDRAM=0 +frameBufferEmulation\copyDepthToRDRAM=0 + +[PUZZLE%20LEAGUE%20N64] +Good_Name=Pokemon Puzzle League (E)(F)(G)(U) +texture\enableHalosRemoval=1 + +[RAT%20ATTACK] +Good_Name=Rat Attack +frameBufferEmulation\fbInfoDisabled=0 + +[RESIDENT%20EVIL%20II] +frameBufferEmulation\copyFromRDRAM=1 +frameBufferEmulation\copyToRDRAM=0 +frameBufferEmulation\copyDepthToRDRAM=0 + +[ROCKMAN%20DASH] +Good_Name=Rockman Dash - Hagane no Boukenshin (J) +graphics2D\correctTexrectCoords=2 + +[RUSH%202] +frameBufferEmulation\bufferSwapMode=1 +graphics2D\correctTexrectCoords=2 + +[SAN%20FRANCISCO%20RUSH] +Good_Name=San Francisco Rush Extreme Racing (U) +frameBufferEmulation\bufferSwapMode=1 +graphics2D\enableNativeResTexrects=2 + +[S.F.RUSH] +Good_Name=San Francisco Rush Extreme Racing (E) +frameBufferEmulation\bufferSwapMode=1 +graphics2D\enableNativeResTexrects=2 + +[S.F.%20RUSH] +Good_Name=San Francisco Rush Extreme Racing (U) +frameBufferEmulation\bufferSwapMode=1 +graphics2D\enableNativeResTexrects=2 + +[SHADOWMAN] +Good_Name=Shadow Man (B)(E)(F)(G)(U) +frameBufferEmulation\copyDepthToRDRAM=0 + +[SPACE%20INVADERS] +Good_Name=Space Invaders (U) +frameBufferEmulation\copyToRDRAM=0 + +[STAR%20TWINS] +; See Jet Force Gemini for notes +Good_Name=Star Twins (J) +frameBufferEmulation\fbInfoDisabled=0 +frameBufferEmulation\copyAuxToRDRAM=1 + +[TEST] +Good_Name=Mario Artist Paint Studio (J) (1999-02-11 Prototype) (64DD) +frameBufferEmulation\copyAuxToRDRAM=1 +frameBufferEmulation\copyFromRDRAM=1 +generalEmulation\rdramImageDitheringMode=0 + +[TETRISPHERE] +Good_Name=Tetrisphere (U) +generalEmulation\correctTexrectCoords=2 + +[TIGGER%27S%20HONEY%20HUNT] +Good_Name=Tiggers Honey Hunt (E)(U) +frameBufferEmulation\N64DepthCompare=1 + +[TONIC%20TROUBLE] +Good_Name=Tonic Trouble (E)(U) +frameBufferEmulation\copyToRDRAM=1 + +[TG%20RALLY%202] +frameBufferEmulation\copyToRDRAM=1 + +[TOP%20GEAR%20RALLY%202] +frameBufferEmulation\copyToRDRAM=1 + +[TUROK_DINOSAUR_HUNTE] +Good_Name=Turok - Dinosaur Hunter (E)(G)(U)(J) +frameBufferEmulation\copyDepthToRDRAM=1 + +[W.G.%203DHOCKEY] +frameBufferEmulation\bufferSwapMode=1 + +[MARIOPARTY3] +frameBufferEmulation\N64DepthCompare=1 \ No newline at end of file diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index 4063e01562..f2f3df019b 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -404,6 +404,10 @@ add_library(core IOS/WFS/WFSSRV.h LibusbUtils.cpp LibusbUtils.h + MarioPartyNetplay/Discord.cpp + MarioPartyNetplay/Discord.h + MarioPartyNetplay/Gamestate.cpp + MarioPartyNetplay/Gamestate.h MemTools.cpp MemTools.h Movie.cpp diff --git a/Source/Core/DolphinQt/DolphinQt.vcxproj b/Source/Core/DolphinQt/DolphinQt.vcxproj index 0659189f9e..e675395aa2 100644 --- a/Source/Core/DolphinQt/DolphinQt.vcxproj +++ b/Source/Core/DolphinQt/DolphinQt.vcxproj @@ -17,6 +17,12 @@ + + Dolphin-MPN + + + Dolphin-MPN + @@ -401,7 +407,7 @@ - + diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index 321f9501d4..29f010940e 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -944,6 +944,110 @@ bool MainWindow::RequestStop() return true; } +bool MainWindow::RequestStopNetplay() +{ + if (!Core::IsRunning()) + { + Core::QueueHostJob([this] { OnStopComplete(); }, true); + return true; + } + + const bool rendered_widget_was_active = + m_render_widget->isActiveWindow() && !m_render_widget->isFullScreen(); + QWidget* confirm_parent = (!m_rendering_to_main && rendered_widget_was_active) ? + m_render_widget : + static_cast(this); + const bool was_cursor_locked = m_render_widget->IsCursorLocked(); + + if (!m_render_widget->isFullScreen()) + m_render_widget_geometry = m_render_widget->saveGeometry(); + else + FullScreen(); + + if (Config::Get(Config::MAIN_CONFIRM_ON_STOP)) + { + if (std::exchange(m_stop_confirm_showing, true)) + return true; + + Common::ScopeGuard confirm_lock([this] { m_stop_confirm_showing = false; }); + + const Core::State state = Core::GetState(); + + // Only pause the game, if NetPlay is not running + bool pause = !Settings::Instance().GetNetPlayClient(); + + if (pause) + Core::SetState(Core::State::Paused); + + if (rendered_widget_was_active) + { + // We have to do this before creating the message box, otherwise we might receive the window + // activation event before we know we need to lock the cursor again. + m_render_widget->SetCursorLockedOnNextActivation(was_cursor_locked); + } + + // This is to avoid any "race conditions" between the "Window Activate" message and the + // message box returning, which could break cursor locking depending on the order + m_render_widget->SetWaitingForMessageBox(true); + auto confirm = ModalMessageBox::question( + confirm_parent, tr("Quitter!"), + m_stop_requested ? tr("A user closed down their game from the netplay lobby. " + "This could the Netplay session has ended due to someone ragequitting! " + "Do you want to stop the current emulation?") : + tr("A user closed down their game from the netplay lobby. " + "This could the Netplay session has ended due to someone ragequitting" + "Do you want to stop the current emulation?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton, Qt::ApplicationModal); + + // If a user confirmed stopping the emulation, we do not capture the cursor again, + // even if the render widget will stay alive for a while. + // If a used rejected stopping the emulation, we instead capture the cursor again, + // and let them continue playing as if nothing had happened + // (assuming cursor locking is on). + if (confirm != QMessageBox::Yes) + { + m_render_widget->SetWaitingForMessageBox(false); + + if (pause) + Core::SetState(state); + + return false; + } + else + { + m_render_widget->SetCursorLockedOnNextActivation(false); + // This needs to be after SetCursorLockedOnNextActivation(false) as it depends on it + m_render_widget->SetWaitingForMessageBox(false); + } + } + + OnStopRecording(); + // TODO: Add Debugger shutdown + + if (!m_stop_requested && UICommon::TriggerSTMPowerEvent()) + { + m_stop_requested = true; + + // Unpause because gracefully shutting down needs the game to actually request a shutdown. + // TODO: Do not unpause in debug mode to allow debugging until the complete shutdown. + if (Core::GetState() == Core::State::Paused) + Core::SetState(Core::State::Running); + + // Tell NetPlay about the power event + if (NetPlay::IsNetPlayRunning()) + NetPlay::SendPowerButtonEvent(); + + return true; + } + + ForceStop(); +#ifdef Q_OS_WIN + // Allow windows to idle or turn off display again + SetThreadExecutionState(ES_CONTINUOUS); +#endif + return true; +} + void MainWindow::ForceStop() { Core::Stop(); @@ -1392,7 +1496,7 @@ void MainWindow::NetPlayInit() m_netplay_discord = new DiscordHandler(this); #endif - connect(m_netplay_dialog, &NetPlayDialog::Stop, this, &MainWindow::RequestStop); + connect(m_netplay_dialog, &NetPlayDialog::Stop, this, &MainWindow::RequestStopNetplay); connect(m_netplay_dialog, &NetPlayDialog::rejected, this, &MainWindow::NetPlayQuit); connect(m_netplay_setup_dialog, &NetPlaySetupDialog::Join, this, &MainWindow::NetPlayJoin); connect(m_netplay_setup_dialog, &NetPlaySetupDialog::Host, this, &MainWindow::NetPlayHost); diff --git a/Source/Core/DolphinQt/MainWindow.h b/Source/Core/DolphinQt/MainWindow.h index 6e53f2df10..d81b25baa3 100644 --- a/Source/Core/DolphinQt/MainWindow.h +++ b/Source/Core/DolphinQt/MainWindow.h @@ -87,6 +87,7 @@ private: // May ask for confirmation. Returns whether or not it actually stopped. bool RequestStop(); + bool RequestStopNetplay(); void ForceStop(); void Reset(); void FrameAdvance(); diff --git a/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.cpp b/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.cpp index d0af4c0e1c..2c718cc517 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.cpp @@ -507,12 +507,11 @@ void NetPlaySetupDialog::UpdateListBrowser() }); auto* hor_header = m_table_widget->horizontalHeader(); - + hor_header->setSectionResizeMode(0, QHeaderView::Stretch); hor_header->setSectionResizeMode(0, QHeaderView::Stretch); hor_header->setSectionResizeMode(1, QHeaderView::Stretch); - hor_header->setSectionResizeMode(2, QHeaderView::Stretch); + hor_header->setSectionResizeMode(2, QHeaderView::ResizeToContents); hor_header->setSectionResizeMode(3, QHeaderView::ResizeToContents); - hor_header->setSectionResizeMode(4, QHeaderView::ResizeToContents); hor_header->setHighlightSections(false); m_table_widget->setRowCount(session_count); @@ -531,10 +530,10 @@ void NetPlaySetupDialog::UpdateListBrowser() for (const auto& item : {name, game_id, player_count, in_game}) item->setFlags(enabled ? Qt::ItemIsEnabled | Qt::ItemIsSelectable : Qt::NoItemFlags); - m_table_widget->setItem(i, 1, name); - m_table_widget->setItem(i, 2, game_id); - m_table_widget->setItem(i, 3, player_count); - m_table_widget->setItem(i, 4, in_game); + m_table_widget->setItem(i, 0, name); + m_table_widget->setItem(i, 1, game_id); + m_table_widget->setItem(i, 2, player_count); + m_table_widget->setItem(i, 3, in_game); }