Version 1.08 with public source code release.
@@ -0,0 +1,10 @@
|
||||
# Pumptools documentation
|
||||
This folder contains all documentation for pumptools in markdown format.
|
||||
|
||||
Index:
|
||||
* [api](api/api.md): Various documentation about the API, using and configuring the provided API implementations, e.g.
|
||||
PIUIO, PIUBTN
|
||||
* [development](development/development.md): Get started with developing for pumptools, development setup, architecture
|
||||
and notes about various efforts for future reference.
|
||||
* [game](game/game.md): Information about the games including trivia, pad codes, unlocks etc.
|
||||
* [hook](hook/hook.md): How to setup and configure pumptools with the games supported.
|
||||
@@ -0,0 +1,8 @@
|
||||
# Pumptools API
|
||||
The *api* sub-folder contains various headers that allow you to develop your own libraries to hook into various places
|
||||
inside pumptools.
|
||||
|
||||
## IO
|
||||
* [PIUBTN](io/piubtn.md): The button board introduced with Pump It Up Pro
|
||||
* [PIUIO](io/piuio.md): Also known as the MK6 IO, the main IO board for pads and lights
|
||||
* [X11 input hook](io/x11-input-hook.md): Hook input processing to X11 to receive keyboard events
|
||||
@@ -0,0 +1,58 @@
|
||||
# PIUBTN API
|
||||
This contains various PIUBTN related tools and libraries. PIUBTN is the button board that was first introduced with
|
||||
Pump PRO and officially works as an optional peripheral on all classic pump games starting Fiesta.
|
||||
|
||||
## Pumptools PIUBTN API implementations
|
||||
The following libraries implement pumptool's PIUBTN API interface. Set the configuration value `patch.piubtn.emu_lib`
|
||||
in your hook configuration to point to the library you want to use, e.g.
|
||||
`patch.piubtn.emu_lib=./ptapi-io-piubtn-null.so`.
|
||||
|
||||
### Null: ptapi-io-piubtn-null.so
|
||||
A null implementation for API dummy testing against libraries/applications calling API implementations.
|
||||
|
||||
### Real PIUIO: ptapi-io-piubtn-real.so
|
||||
Support for a real USB PIUBTN. This library is not useful for games that already support the hardware natively.
|
||||
However, games that require an emulation layer need this.
|
||||
|
||||
### Joystick/Gamepad: ptapi-io-piubtn-joystick.so
|
||||
Support all (USB) Joysticks and Gamepads that are detected by the Linux kernel. This uses the Kernel's joystick API.
|
||||
|
||||
Button mappings are configured by using the `ptapi-io-piubtn-joystick-conf` (this is an executable!) tool. You might
|
||||
have to `chmod +x ptapi-io-piubtn-joystick-conf` it prior being able to run it: `./ptapi-io-piubtn-joystick-conf`. Run
|
||||
the tool and follow the instructions. Once successfully completed, a `piubtn-joystick-conf.bin` configuration file is
|
||||
located in the same folder. This must be located next to the `ptapi-io-piubtn-joystick.so` file which should be located
|
||||
next to your `piu` executable.
|
||||
|
||||
Configure your `hook.conf` file accordingly:
|
||||
```
|
||||
patch.piubtn.emu_lib=./ptapi-io-piubtn-joystick.so
|
||||
```
|
||||
|
||||
### Keyboard: ptapi-io-piubtn-keyboard.so
|
||||
Support for inputs via your standard keyboard using the X11 API.
|
||||
|
||||
Button mappings are configured by using the `ptapi-io-piubtn-keyboard-conf` (this is an executable!) tool. You might
|
||||
have to `chmod +x ptapi-io-piubtn-keyboard-conf` it prior being able to run it: `./ptapi-io-piubtn-keyboard-conf`. Run
|
||||
the tool and follow the instructions. Once successfully completed, a `piubtn-keyboard-conf.bin` configuration file is
|
||||
located in the same folder. This must be located next to the `ptapi-io-piubtn-keyboard.so` file which should be located
|
||||
next to your `piu` executable.
|
||||
|
||||
Configure your `hook.conf` file accordingly:
|
||||
```
|
||||
patch.piubtn.emu_lib=./ptapi-io-piubtn-keyboard.so
|
||||
patch_hook_main_loop.x11_input_handler=./ptapi-io-piubtn-keyboard.so
|
||||
```
|
||||
|
||||
Setting the key `patch_hook_main_loop.x11_input_handler` is important. Otherwise, the library does not receive any
|
||||
input events from X11 and your configured keyboard input does not work in the game.
|
||||
|
||||
## Pumptools PIUBTN API tester: ptapi-io-piubtn-test
|
||||
The tool *ptapi-io-piubtn-test* lets you easily test and debug your library implementing pumptool's piubtn API without
|
||||
having to setup and/or run any games.
|
||||
|
||||
## Development
|
||||
The [piubtn header](../../src/api/ptapi/io/piubtn.h) contains all the prototypes to be implemented by your library to
|
||||
provide your own implementation for a PIUBTN. Checkout the header file for documentation.
|
||||
|
||||
Checkout the [stub implementation](../../dist/api/ptapi-io-piubtn-stub.c) to get started with a simple example.
|
||||
Instructions are located in the header comment of the file.
|
||||
@@ -0,0 +1,57 @@
|
||||
# PIUIO API
|
||||
This contains various MK6 USB PIUIO related tools and libraries. The hardware was first introduced with Exceed 2 and
|
||||
is supported by all games up to this day.
|
||||
|
||||
## Pumptools PIUIO API implementations
|
||||
The following libraries implement pumptool's PIUIO API interface. Set the configuration value `patch.piuio.emu_lib`
|
||||
in your hook configuration to point to the library you want to use, e.g. `patch.piuio.emu_lib=./ptapi-io-piuio-null.so`.
|
||||
|
||||
### Null: ptapi-io-piuio-null.so
|
||||
A null implementation for API dummy testing against libraries/applications calling API implementations.
|
||||
|
||||
### Real PIUIO: ptapi-io-piuio-real.so
|
||||
Support for a real USB PIUIO. This library is not useful for games that already support the hardware natively.
|
||||
However, games that require an emulation layer need this to run on real PIUIO hardware, e.g. Exceed (1).
|
||||
|
||||
### Joystick/Gamepad: ptapi-io-piuio-joystick.so
|
||||
Support all (USB) Joysticks and Gamepads that are detected by the Linux kernel. This uses the Kernel's joystick API.
|
||||
|
||||
Button mappings are configured by using the `ptapi-io-piuio-joystick-conf` (this is an executable!) tool. You might have
|
||||
to `chmod +x ptapi-io-piuio-joystick-conf` it prior being able to run it: `./ptapi-io-piuio-joystick-conf`. Run the tool
|
||||
and follow the instructions. Once successfully completed, a `piuio-joystick-conf.bin` configuration file is located in
|
||||
the same folder. This must be located next to the `ptapi-io-piuio-joystick.so` file which should be located next to your
|
||||
`piu` executable.
|
||||
|
||||
Configure your `hook.conf` file accordingly:
|
||||
```
|
||||
patch.piuio.emu_lib=./ptapi-io-piuio-joystick.so
|
||||
```
|
||||
|
||||
### Keyboard: ptapi-io-piuio-keyboard.so
|
||||
Support for inputs via your standard keyboard using the X11 API.
|
||||
|
||||
Button mappings are configured by using the `ptapi-io-piuio-keyboard-conf` (this is an executable!) tool. You might have
|
||||
to `chmod +x ptapi-io-piuio-keyboard-conf` it prior being able to run it: `./ptapi-io-piuio-keyboard-conf`. Run the tool
|
||||
and follow the instructions. Once successfully completed, a `piuio-keyboard-conf.bin` configuration file is located in
|
||||
the same folder. This must be located next to the `ptapi-io-piuio-keyboard.so` file which should be located next to your
|
||||
`piu` executable.
|
||||
|
||||
Configure your `hook.conf` file accordingly:
|
||||
```
|
||||
patch.piuio.emu_lib=./ptapi-io-piuio-keyboard.so
|
||||
patch_hook_main_loop.x11_input_handler=./ptapi-io-piuio-keyboard.so
|
||||
```
|
||||
|
||||
Setting the key `patch_hook_main_loop.x11_input_handler` is important. Otherwise, the library does not receive any
|
||||
input events from X11 and your configured keyboard input does not work in the game.
|
||||
|
||||
## Pumptools PIUIO API tester: ptapi-io-piuio-test
|
||||
The tool *ptapi-io-piuio-test* lets you easily test and debug your library implementing pumptool's piuio API without
|
||||
having to setup and/or run any games.
|
||||
|
||||
## Development
|
||||
The [piuio header](../../src/api/ptapi/io/piuio.h) contains all the prototypes to be implemented by your library to
|
||||
provide your own implementation for a PIUIO. Checkout the header file for documentation.
|
||||
|
||||
Checkout the [stub implementation](../../dist/api/ptapi-io-piuio-stub.c) to get started with a simple example.
|
||||
Instructions are located in the header comment of the file.
|
||||
@@ -0,0 +1,9 @@
|
||||
# X11 input hook API
|
||||
The [x11-input-hook header](../../src/api/ptapi/io/x11-input-hook.h) allows you to hook into the main loop of the game
|
||||
to receive X11 keyboard inputs. This might be useful for implementations of other APIs, e.g. PIUIO, to trigger PIUIO
|
||||
inputs when pressing keys on the keyboard.
|
||||
|
||||
You have to configure your `hook.conf` accordingly that your implementation gets loaded by the hook library:
|
||||
```
|
||||
patch_hook_main_loop.x11_input_handler=./ptapi-io-my-x11-input-hook.so
|
||||
```
|
||||
@@ -0,0 +1,43 @@
|
||||
# Architecture
|
||||
The follow image shows a rough outline of pumptools's architecture based on the project's namespacing. Arrows indicate
|
||||
architectural dependencies. Modules in red colored boxes expose APIs and blue colored boxes expose application/library
|
||||
binaries.
|
||||
|
||||

|
||||
|
||||
## util
|
||||
The kitchen sink, basically used by everything. Not going to elaborate the details here as it is quite self-explanatory
|
||||
when taking a look at its modules.
|
||||
|
||||
## crypt
|
||||
Kitchen sink for everything crypto related. Could be with `util` but I somewhat felt the need to have this separated.
|
||||
|
||||
## asset
|
||||
Modules for handling various types of asserts from pump games, e.g. usb profiles.
|
||||
|
||||
## pumpnet
|
||||
Modules to talk to pumpnet for usb profiles over sockets. Used by NX2 to Fiesta 2.
|
||||
|
||||
## sec
|
||||
Contains several sub-modules for security/dongle related topics such as full software emulation.
|
||||
|
||||
## capnhook
|
||||
This is the heart of pumptools to enable hooking of system and library calls. `capnhook` has two sub-modules, `hook`
|
||||
and `hooklib`. `hook` provides the foundation for hooking various things, typically IO related, such as files,
|
||||
filesystem, hardware IO (e.g. USB), signal handlers. `hooklib` provides helper modules based on `hook` that take care
|
||||
of common tasks such as path based redirects, USB device emulation and IO call monitoring.
|
||||
|
||||
## ptapi
|
||||
Pumptools's API package exposing APIs to the end-user. Also contains any libraries and tools used by the APIs.
|
||||
|
||||
## io
|
||||
Contains modules to talk to real IO hardware, e.g. `piuio`, `piubtn`.
|
||||
|
||||
## patch
|
||||
`patch` is a common package for various modules that are shared with multiple pump versions. A patch module takes care
|
||||
of patching, i.e. hooking and detouring usually, a single aspect like fixing a API quirk, enabling window mode etc.
|
||||
|
||||
# game hooks
|
||||
`game hooks` are composed of multiple `patch` modules making up the final hook library that you preload to the target
|
||||
application. The structure of each `game hook` is identical and only the patches and hooks applied differ per game
|
||||
version.
|
||||
@@ -0,0 +1,163 @@
|
||||
# Development
|
||||
This document covers various aspects of developing for pumptools. For developing using the API, see
|
||||
[the dedicated readme](../api/api.md).
|
||||
|
||||
## Architecture
|
||||
[This document](architecture.md) gives an introduction to the architecture of pumptools. This helps you to get familiar
|
||||
with the codebase and its features, definitely recommended to read this first.
|
||||
|
||||
## Development environment setup
|
||||
Pumptools is written entirely in C and built using cmake. Various helper scripts are written as bash/shell scripts.
|
||||
Therefore, you need the following tools on your development setup:
|
||||
* gcc
|
||||
* cmake
|
||||
* make
|
||||
* bash or compatible shell
|
||||
|
||||
Pumptools requires the following dependencies to be installed on your development OS:
|
||||
* libcurl4 i386
|
||||
* libusb 1.0 i386
|
||||
|
||||
Furthermore, header files, which come with the development packages of the libs, of the following libraries are
|
||||
required:
|
||||
* fmodex
|
||||
* libconfig
|
||||
* X11
|
||||
* libalsa
|
||||
* libusb-0.1 (**not** 1.0)
|
||||
|
||||
The project does not depend on any specific IDE. However, if you use CLion, the project can be imported easily.
|
||||
|
||||
## Code style
|
||||
The main style guidelines are defined by the `.clang-format` file and the code style can be easily applied to the
|
||||
whole `src` directory using the following command from the root folder:
|
||||
```shell script
|
||||
make clang-format
|
||||
```
|
||||
|
||||
Make sure that your contributions follow the style and apply it before submitting your changes.
|
||||
|
||||
For other source files like shell scripts, cmake, makefile or markdown documents, please follow the already established
|
||||
style in the existing documents.
|
||||
|
||||
## Building
|
||||
See the [main readme](../../README.md#building).
|
||||
|
||||
## Compatibility issues with newer glibc versions
|
||||
We have experienced various issues with different glibc versions which had a major impact on the builds. The following
|
||||
table gives you a list of tested glibc versions and issues that are either present or not with each version listed.
|
||||
"ok" indicates that the specified glibc version is compatible and the specific issue does not occur, "bad" indicates
|
||||
incompatibility and that the specific issue does occur when using a binary compiled with that glibc version.
|
||||
|
||||
| Issue/glibc version | 2.23 | 2.30 |
|
||||
|---------------------|------|------|
|
||||
| Issue 1 | ok | bad |
|
||||
| Issue 2 | ok | bad |
|
||||
|
||||
The issues are further described in the following sub-sections
|
||||
|
||||
### Issue 1: Crash during static initialization
|
||||
For a detailed report on this issue, see the [dedicated notes](notes/f2-crashing-on-modern-linux-post-mortem.md).
|
||||
|
||||
Summarized: Fiesta 2 and newer will segfault before even running the application's main method. The application fails
|
||||
on runtime initialization when initializing the static context. This is caused by ABI incompatibility of inlined code
|
||||
of C++'s STL, first occurring with string allocations during static initialization.
|
||||
|
||||
### Issue 2: sscanf not being detoured
|
||||
With NX2, Andamiro locked the USB drives to be used to a specific brand which they sold back then. That lock is patched
|
||||
out by detouring `sscanf` and manipulating the VID/PID and serial number parsing logic in the game to always return
|
||||
the values, the game wants to see to accept the connected USB drive.
|
||||
|
||||
However, some incompatibility on newer glibc versions does not setup the `sscanf` detour properly. The detour function
|
||||
is there and gets called by various parts of the game code in the beginning, but later calls to `sscanf` always go
|
||||
to the real function instead. Thus, the usb unlock feature does not work.
|
||||
|
||||
## Unit tests
|
||||
Unfortunately, this was started very late in the development of pumptools, but it's not too late to keep extending this
|
||||
with every change to ensure existing features don't break and future ones work.
|
||||
|
||||
When you have a change to commit, check if there is an existing unit-test which needs to be aligned with your change(s).
|
||||
If not, create one.
|
||||
|
||||
For testing code that gets hooked, there is a specific pattern that needs to be applied in order to allow testing
|
||||
hooks without having to actually hook them. As an example, you can take a look at the
|
||||
[usb-fix module](../../src/main/hook/propatch/usb-fix.h) for piu pro and the
|
||||
[corresponding test](../../src/test/hook/propatch/usb-fix/main.c). It shows you how to setup the hooks and create
|
||||
mocks for the functions that you can trap the calls to the real detoured functions to check if they are getting called
|
||||
or return fixed values for testing.
|
||||
|
||||
## Debugging
|
||||
### Pumptool's built-in tooling
|
||||
Pumptools has a few basic debugging features built in which helps analyzing common issues very quickly without the
|
||||
need of external tools.
|
||||
|
||||
#### Help and usage message of hook library
|
||||
When running a game with any of pumptools's `hook.so` libs attached, you can always add the parameter `-h` to display a
|
||||
help/usage message with all available command line and configuration parameters.
|
||||
|
||||
For example, when using `piueb` for bootstrapping:
|
||||
```
|
||||
./piueb run -h
|
||||
```
|
||||
|
||||
The `-h` is passed on as a parameter and appended to the execution command. You can make use of that with other
|
||||
available cmd parameters as well (see usage information).
|
||||
|
||||
#### Logging
|
||||
Logging to console and file as well as the level of verbosity can be controlled using the `hook.conf` configuration file
|
||||
or via command line arguments provided on execution.
|
||||
|
||||
All hooks implement various sanity checks for parameters provided, file checks etc. so there is a good coverage of
|
||||
common mistakes and misconfiguration that can be easily detected by watching out for any ERROR or WARNING level messages
|
||||
showing up in the log.
|
||||
|
||||
Example in configuration file:
|
||||
```
|
||||
util.log.file=pumptools.log
|
||||
util.log.level=4
|
||||
```
|
||||
|
||||
Furthermore, `piueb` outputs a separate log file `piueb.log` which contains logging data of the environment setup
|
||||
process of `piueb`.
|
||||
|
||||
#### File and IO hook monitoring
|
||||
In the configuration file or via cmd args, you can enable monitoring of file, filesystem, usb and/or open system calls
|
||||
for tracing and debugging. This can be useful, to check if the game cannot find certain files like game assets.
|
||||
|
||||
Example in configuration file:
|
||||
```
|
||||
patch.hook_mon.file=0
|
||||
patch.hook_mon.fs=0
|
||||
patch.hook_mon.io=0
|
||||
patch.hook_mon.open=1
|
||||
patch.hook_mon.usb=0
|
||||
```
|
||||
|
||||
#### Halt on SIGSEGV and attach debugger
|
||||
Also enabled via configuration or cmd args, the application is halted on SIGSEGV to allow attaching a debugger.
|
||||
|
||||
Example in configuration file:
|
||||
```
|
||||
patch.sigsegv.halt_on_segv=1
|
||||
```
|
||||
|
||||
### External tooling
|
||||
#### Remote debugging
|
||||
You can run the application with `gdbserver` using `piueb`:
|
||||
```shell script
|
||||
./piueb debug
|
||||
```
|
||||
|
||||
And connect with your favorite debugger (e.g. IDA).
|
||||
|
||||
#### strace
|
||||
You can run the application with `strace` using `piueb`:
|
||||
```shell script
|
||||
./piueb strace
|
||||
```
|
||||
|
||||
#### valgrind
|
||||
You can run the application with `valgrind` using `piueb`:
|
||||
```shell script
|
||||
./piueb valgrind
|
||||
```
|
||||
|
After Width: | Height: | Size: 32 KiB |
@@ -0,0 +1,55 @@
|
||||
# Notes about Exceed's implementation of a sound manager
|
||||
## Pre-face
|
||||
To understand what the developers of AM did here, you should have some knowledge about how they had to handle sound on
|
||||
the MK3 hardware which is the predecessor of the MK5 hardware that was used with Exceed. Exceed builds on the codebase
|
||||
of the previous game(s), Prex 3 and Premiere 3, that ran on MK3/MK5. However, moving from Dos (MK3)/Windows XP Embedded
|
||||
(MK5) to Linux (MK5), the code had to be adjusted to work on the different kind of hardware and operating system.
|
||||
Their engine was targeted and optimized for the MK3 hardware platform and had to use various pieces of custom hardware
|
||||
to implement stuff like: security using the lock chip, MP3 decoding and effect playback and IO.
|
||||
|
||||
## Sound playback, higher level view
|
||||
For sound playback, the game had the following requirements:
|
||||
1. For playing a song, menu background music, title screen intro music or any other music tracks, sound data encoded as
|
||||
MP3 files are used. These needed to be loaded, decoded and played back whenever the game reaches certain points in the
|
||||
game scene.
|
||||
1. Various short sound effects, e.g. to give the user confirmation about hitting a button, have to be played back when
|
||||
a certain event is triggered, e.g. user input or a scripted event in a scene. On exceed, these are stored as WAV files.
|
||||
1. Audio played back by the above two items needs to be mixed because playback of both can happen simultaneously.
|
||||
|
||||
## MK3 hardware for decoding and audio playback
|
||||
The MK3 hardware came with a dedicated piece of hardware, a [MP3 decoder and playback chip](hardware.md). Therefore,
|
||||
audio data from disc was streamed encoded to the hardware for decoding and playback, and effects were triggered by
|
||||
commands to the appropriate chips as their audio data is stored in a ROM chip on the board.
|
||||
|
||||
## Exceed's sound manager
|
||||
With the move to Linux and less specialized hardware closer to a normal PC, the audio pipeline changed a lot. On Linux,
|
||||
alsa/libasound is used for sending data to the underlying audio driver. Decoding of the MP3 song data is done by the
|
||||
CPU. Effects are stored as WAV files and also played back using libasound.
|
||||
|
||||
The sound manager relies on hardware mixing using the same sound device, e.g. hw:0. This device is opened once on game
|
||||
init for playing back sound effects and another time for every song/background music to be played back for the current
|
||||
scene.
|
||||
|
||||
### Hardware sound tracks specs
|
||||
#### Effect track
|
||||
* Channels: 2
|
||||
* Buffer size in frames: 4096
|
||||
* Periods: 2
|
||||
* Sample format: 16-bit signed LE
|
||||
* Sample rate: 44100
|
||||
* Sample order: FL, FR
|
||||
|
||||
#### Song track
|
||||
* Channels: 2
|
||||
* Buffer size in frames: 16384
|
||||
* Periods: 8
|
||||
* Sample format: 16-bit signed LE
|
||||
* Sample rate: 44100
|
||||
* Sample order: FL, FR
|
||||
|
||||
### Issues on todays distros
|
||||
However, this way of mixing is not supported anymore by alsa. Instead, you have to use software mixing using dmix which
|
||||
is supported by alsa's built in plugin system today. But, that doesn't seem to work properly with different
|
||||
configurations from different versions of alsa on today's available distros.
|
||||
|
||||
Fortunately, this got fixed already on Exceed 2 which implements its own software mixer in the pump engine.
|
||||
@@ -0,0 +1,217 @@
|
||||
# Notes about song unlocks in Exceed 2
|
||||
Executable of v1.02, build 7th December 2004.
|
||||
|
||||
A bunch of copy-pastes from IDA checking which songs can be unlocked permanently.
|
||||
|
||||
## Internal song list and state structure
|
||||
```
|
||||
00000000 SongList struc ; (sizeof=0x48, mappedto_187) ; XREF: .data:songList/r
|
||||
00000000 trackNum dd ?
|
||||
00000004 ptrArtistNameKr dd ?
|
||||
00000008 ptrArtistNameEn dd ?
|
||||
0000000C ptrSongNameKr dd ? ; XREF: sub_805186E+7A/r
|
||||
0000000C ; sub_805186E+B4/r ...
|
||||
00000010 ptrSongNameEn dd ?
|
||||
00000014 ptrBpm dd ?
|
||||
00000018 channelInfo dd ?
|
||||
0000001C level dd 6 dup(?)
|
||||
00000034 enableSong db ?
|
||||
00000035 hiddenSong db ?
|
||||
00000036 enableDemoPlay db ?
|
||||
00000037 censor db ?
|
||||
00000038 pad db ?
|
||||
00000039 censorLock db ?
|
||||
0000003A enable_play db ?
|
||||
0000003B hidden_play db ?
|
||||
0000003C enableMode db 6 dup(?) ; string(C)
|
||||
00000042 enableMode_play db 6 dup(?) ; string(C)
|
||||
00000048 SongList ends
|
||||
```
|
||||
|
||||
## Internal song list
|
||||
```
|
||||
.data:080890E4 ; SongList songList
|
||||
.data:080890E4 songList dd 101h ; trackNum
|
||||
.data:080890E4 ; DATA XREF: sub_8062D22+38o
|
||||
.data:080890E4 ; GetSongRealIndex+33o ...
|
||||
.data:080890E4 dd 807BC28h ; ptrArtistNameKr
|
||||
.data:080890E4 dd 807BC2Dh ; ptrArtistNameEn
|
||||
.data:080890E4 dd 807BC33h ; ptrSongNameKr
|
||||
.data:080890E4 dd 0 ; ptrSongNameEn
|
||||
.data:080890E4 dd 0 ; ptrBpm
|
||||
.data:080890E4 dd 40624000h ; channelInfo
|
||||
.data:080890E4 dd 0, 0FFFFFFFFh, 6, 0Ch, 7, 0FFFFFFFFh; level
|
||||
.data:080890E4 db 1 ; enableSong
|
||||
.data:080890E4 db 0 ; hiddenSong
|
||||
.data:080890E4 db 1 ; enableDemoPlay
|
||||
.data:080890E4 db 0 ; censor
|
||||
.data:080890E4 db 0FFh ; pad
|
||||
.data:080890E4 db 0FFh ; censorLock
|
||||
.data:080890E4 db 0FFh ; enable_play
|
||||
.data:080890E4 db 0FFh ; hidden_play
|
||||
.data:080890E4 db 0,0,0,0,0,0 ; enableMode
|
||||
.data:080890E4 db 0,0,1,0,0,0 ; enableMode_play
|
||||
.data:080890E4 dd 102h ; trackNum
|
||||
.data:080890E4 dd 807BC28h ; ptrArtistNameKr
|
||||
.data:080890E4 dd 807BC2Dh ; ptrArtistNameEn
|
||||
.data:080890E4 dd 807BC44h ; ptrSongNameKr
|
||||
.data:080890E4 dd 0 ; ptrSongNameEn
|
||||
.data:080890E4 dd 0 ; ptrBpm
|
||||
.data:080890E4 dd 40668000h ; channelInfo
|
||||
.data:080890E4 dd 0, 0FFFFFFFFh, 6, 0Ch, 7, 0Fh; level
|
||||
.data:080890E4 db 1 ; enableSong
|
||||
.data:080890E4 db 0 ; hiddenSong
|
||||
.data:080890E4 db 1 ; enableDemoPlay
|
||||
.data:080890E4 db 0 ; censor
|
||||
.data:080890E4 db 0FFh ; pad
|
||||
.data:080890E4 db 0FFh ; censorLock
|
||||
.data:080890E4 db 0FFh ; enable_play
|
||||
.data:080890E4 db 0FFh ; hidden_play
|
||||
.data:080890E4 db 0,0,0,0,0,0 ; enableMode
|
||||
.data:080890E4 db 0,0,2,0,0,0 ; enableMode_play
|
||||
...
|
||||
```
|
||||
|
||||
## Settings struct first few fields
|
||||
```
|
||||
00000000 settings_struct struc ; (sizeof=0x162B, mappedto_186)
|
||||
00000000 ff_area db 1307 dup(?) ; string(C)
|
||||
0000051B unlocks_maybe db 16 dup(?) ; string(C)
|
||||
0000052B blacklist db 139 dup(?) ; string(C)
|
||||
000005B6 unkn2 db 117 dup(?) ; string(C)
|
||||
0000062B remain db 4096 dup(?) ; string(C)
|
||||
0000162B settings_struct ends
|
||||
```
|
||||
|
||||
## Function that checks for song unlocks
|
||||
Located at 0x0806307E
|
||||
|
||||
```
|
||||
int __usercall unlock_song@<eax>(int a1@<esi>, _DWORD *arg_0, _DWORD *songid)
|
||||
{
|
||||
int v3; // eax@1
|
||||
int v4; // ecx@1
|
||||
signed int v5; // edi@3
|
||||
int v6; // eax@6
|
||||
signed int v7; // eax@16
|
||||
signed int v8; // eax@23
|
||||
signed int v9; // eax@30
|
||||
signed int v10; // eax@37
|
||||
signed int v11; // eax@42
|
||||
int v13; // [sp+0h] [bp-18h]@3
|
||||
char result_unlocked_song; // [sp+7h] [bp-11h]@1
|
||||
|
||||
result_unlocked_song = 0;
|
||||
v3 = sub_8061C62(dword_80BED54, "PLAY");
|
||||
v4 = v3 - 200696;
|
||||
if ( !v3 )
|
||||
v4 = 0;
|
||||
v5 = 0;
|
||||
v13 = v4;
|
||||
do
|
||||
{
|
||||
if ( v5 )
|
||||
{
|
||||
if ( v5 != 1 )
|
||||
goto LABEL_11;
|
||||
if ( !(dword_80BECD4 & 2) )
|
||||
goto LABEL_43;
|
||||
v6 = sub_8056E76(v13, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !(dword_80BECD4 & 1) )
|
||||
goto LABEL_43;
|
||||
v6 = sub_8056E76(v13, 0);
|
||||
}
|
||||
a1 = v6;
|
||||
LABEL_11:
|
||||
if ( currentStateCount > 2
|
||||
&& !stationCurrentlySelected // 0 = arcade station
|
||||
&& *(&songList.trackNum + 18 * sub_8062DC6(dword_80BECE4)) == 0xB13// ill give you all my love
|
||||
&& byte_80BECF5 & 2
|
||||
&& *(_DWORD *)(a1 + 456) <= 10 )
|
||||
{
|
||||
v7 = GetSongRealIndex(0xB19); // canon-d
|
||||
*arg_0 = 0;
|
||||
result_unlocked_song = 1;
|
||||
*songid = 0xB19; // canon-d
|
||||
songList.enableMode[72 * v7 + 4] = 0; // +4 mode offset = nightmare
|
||||
}
|
||||
if ( currentStateCount == 1 )
|
||||
{
|
||||
if ( stationCurrentlySelected == 1 // 1 = remix station
|
||||
&& *(&songList.trackNum + 18 * sub_8062DC6(dword_80BECDC)) == 0xB31// diva's remix
|
||||
&& *(_DWORD *)(a1 + 400) <= 20
|
||||
&& !*(_DWORD *)(a1 + 448)
|
||||
&& *(float *)(a1 + 368) >= 1.0 )
|
||||
{
|
||||
v8 = GetSongRealIndex(0xB54); // 2nd hidden remix
|
||||
*arg_0 = 3;
|
||||
result_unlocked_song = 1;
|
||||
*songid = 0xB54; // 2nd hidden remix
|
||||
songList.enableMode[72 * v8 + 4] = 0; // +4 mode offset = nightmare
|
||||
}
|
||||
if ( currentStateCount == 1 )
|
||||
{
|
||||
if ( stationCurrentlySelected == 1
|
||||
&& *(&songList.trackNum + 18 * sub_8062DC6(dword_80BECDC)) == 0xB30// deux remix
|
||||
&& *(_DWORD *)(a1 + 400) <= 20
|
||||
&& !*(_DWORD *)(a1 + 448)
|
||||
&& *(float *)(a1 + 368) >= 1.0 )
|
||||
{
|
||||
v9 = GetSongRealIndex(0xB29); // banya classic remix
|
||||
*arg_0 = 3;
|
||||
result_unlocked_song = 1;
|
||||
*songid = 0xB29; // banya classic remix
|
||||
songList.enableMode[72 * v9 + 4] = 0; // +4 mode offset = nightmare
|
||||
}
|
||||
if ( currentStateCount == 1 )
|
||||
{
|
||||
if ( stationCurrentlySelected == 1
|
||||
&& *(&songList.trackNum + 18 * sub_8062DC6(dword_80BECDC)) == 0xB29// banya classic remix
|
||||
&& *(_DWORD *)(a1 + 400) <= 20
|
||||
&& !*(_DWORD *)(a1 + 448)
|
||||
&& *(float *)(a1 + 368) >= 1.0 )
|
||||
{
|
||||
v10 = GetSongRealIndex(0xB51); // dignity full remix
|
||||
*arg_0 = 3;
|
||||
result_unlocked_song = 1;
|
||||
*songid = 0xB51; // dignity full remix
|
||||
songList.enableMode[72 * v10 + 2] = 0;// +2 mode offset = crazy
|
||||
}
|
||||
if ( currentStateCount == 1
|
||||
&& stationCurrentlySelected == 1
|
||||
&& *(&songList.trackNum + 18 * sub_8062DC6(dword_80BECDC)) == 0xB28// treme vook of the war
|
||||
&& byte_80BECED & 2 )
|
||||
{
|
||||
*(&songList.hiddenSong + 72 * GetSongRealIndex(0xB58)) = 0;// disable this song as a hidden song
|
||||
v11 = GetSongRealIndex(0xB58); // treme of the vook war another
|
||||
*arg_0 = 3;
|
||||
result_unlocked_song = 1;
|
||||
*(&songList.enableSong + 72 * v11) = 1;
|
||||
*songid = 0xB58;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
LABEL_43:
|
||||
++v5;
|
||||
}
|
||||
while ( v5 <= 1 );
|
||||
if ( result_unlocked_song )
|
||||
sub_8074CA8(9, 0);
|
||||
if ( settings->unlocks_maybe[10] == 1 && stationCurrentlySelected == 1 )
|
||||
{
|
||||
*(&songList.hiddenSong + 0x48 * GetSongRealIndex(0xB57)) = 0;// disable this song as a hidden song
|
||||
*(&songList.enableSong + 0x48 * GetSongRealIndex(0xB57)) = 1;
|
||||
if ( !result_unlocked_song )
|
||||
{
|
||||
*arg_0 = 3;
|
||||
*songid = 0xB57; // canon-d full mix
|
||||
}
|
||||
result_unlocked_song = 1;
|
||||
}
|
||||
return (unsigned __int8)result_unlocked_song;
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,141 @@
|
||||
# Extracting song list from game
|
||||
## NX2 and NXA
|
||||
The song list is compiled into the game's executable as a big table with the following structure:
|
||||
```c
|
||||
struct SongList_t
|
||||
{
|
||||
int IndexNum; // Index in the song list array
|
||||
int TrackNum; // Song ID
|
||||
int szArtistName_kr; // const char* to the null terminated string
|
||||
int szArtistName_en; // const char* to the null terminated string
|
||||
int szSongName_kr; // const char* to the null terminated string
|
||||
int szSongName_en; // const char* to the null terminated string
|
||||
int BPM;
|
||||
int ChannelInfo;
|
||||
int Level[6]; // Array indices correspond to the following and the content is the difficulty level for that mode
|
||||
// See GetRandomTrack()
|
||||
// 0 - eStepNormal
|
||||
// 1 - eStepHard
|
||||
// 2 - eStepCrazy
|
||||
// 3 - eStepHalfDouble
|
||||
// 4 - eStepFreestyle
|
||||
// 5 - eStepNightmare
|
||||
bool bEnable_m;
|
||||
bool bHidden_m;
|
||||
bool bEnableDemoPlay; // Allow playing in attract mode
|
||||
bool bCensor; // Don't show song in game (configurable)
|
||||
bool bPad;
|
||||
bool bCensorLock; // Permanently censored (not configurable)
|
||||
bool bEnable_play;
|
||||
bool bHidden_play;
|
||||
int TexID;
|
||||
bool bEnableMode_m[6]; // Modes where this song is allowed
|
||||
bool bEnableMode_play[6];
|
||||
short unknown1;
|
||||
short time; // Time value used to calculate kcal and VO2
|
||||
short SongMileage; // Cost to unlock this song
|
||||
short ModeMileage[3]; // Mileage required to play this song on the different modes
|
||||
} __attribute__((packed));
|
||||
```
|
||||
|
||||
Probably the easiest method to locate that table is to find a string that any of the entries points to using your
|
||||
favorite decompiler. Song names are good candidates as most of them should be unique and easy to locate when your tool
|
||||
can expose all strings of the binary. Follow any references to the string and you should easily find a chunk of that
|
||||
that looks like this:
|
||||
```text
|
||||
.data:08130FDF db 0
|
||||
.data:08130FE0 ; int g_songListWithouBlazeEmotion[]
|
||||
.data:08130FE0 g_songListWithouBlazeEmotion dd 0F02h ; DATA XREF: HandleSongUnlocksMaybe:loc_806A5B5r
|
||||
.data:08130FE0 ; HandleSongUnlocksMaybe+26Br ...
|
||||
.data:08130FE4 dd offset aACn ; "8¥¦ 8ûì "
|
||||
.data:08130FE8 dd offset aYahpp ; "YAHPP "
|
||||
.data:08130FEC dd offset aRieX_1 ; "8¦Édà+ X.1 "
|
||||
.data:08130FF0 dd offset aCannonX_1 ; "Cannon X.1 "
|
||||
.data:08130FF4 dd offset a185 ; "185 "
|
||||
.data:08130FF8 dd 0
|
||||
.data:08130FFC dd 3
|
||||
.data:08131000 dd 0Ah
|
||||
.data:08131004 dd 14h
|
||||
.data:08131008 dd 0Dh
|
||||
.data:0813100C dd 16h
|
||||
.data:08131010 db 1
|
||||
.data:08131011 db 1
|
||||
.data:08131012 db 0
|
||||
.data:08131013 db 1
|
||||
.data:08131014 db 0
|
||||
.data:08131015 db 1
|
||||
.data:08131016 db 0
|
||||
.data:08131017 db 0
|
||||
.data:08131018 dd 0FFFFFFFFh
|
||||
.data:0813101C db 1
|
||||
.data:0813101D db 1
|
||||
.data:0813101E db 1
|
||||
.data:0813101F db 1
|
||||
.data:08131020 db 1
|
||||
.data:08131021 db 0
|
||||
.data:08131022 db 0
|
||||
.data:08131023 db 0
|
||||
.data:08131024 db 0
|
||||
.data:08131025 db 0
|
||||
.data:08131026 db 0
|
||||
.data:08131027 db 0
|
||||
.data:08131028 dw 79h
|
||||
.data:0813102A dw 0
|
||||
.data:0813102C dw 0
|
||||
.data:0813102E dw 0
|
||||
.data:08131030 dw 0
|
||||
.data:08131032 dw 0
|
||||
.data:08131034 dw 0
|
||||
.data:08131036 dw 0
|
||||
.data:08131038 dw 2
|
||||
.data:0813103A dw 0
|
||||
.data:0813103C dd 0F03h
|
||||
```
|
||||
|
||||
Find the beginning by going backwards and checking where the first valid entry with pointers to artist, title etc
|
||||
start. Usually, the first entry is also the primary reference for the game to address the song list.
|
||||
|
||||
This should allow you to find the function `GetSongRealIndex`. From there, you can easily find out the total length
|
||||
of the song list.
|
||||
```c
|
||||
int __cdecl GetSongRealIndex(int songNo)
|
||||
{
|
||||
signed int v1; // ebx@1
|
||||
int v2; // ecx@2
|
||||
int v3; // edx@3
|
||||
int v4; // eax@4
|
||||
|
||||
v1 = GetTotalTrackNum(); // 324
|
||||
if ( v1 <= 0 )
|
||||
return -1;
|
||||
v2 = 0;
|
||||
if ( g_songIdBlazingEmotion[0] != songNo )
|
||||
{
|
||||
v2 = 0;
|
||||
v3 = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
++v2;
|
||||
if ( v2 == v1 )
|
||||
break;
|
||||
v4 = g_songListWithouBlazeEmotion[v3];
|
||||
v3 += 23;
|
||||
if ( v4 == songNo )
|
||||
return *(&g_songList[0].TrackNum + 23 * v2);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
return *(&g_songList[0].TrackNum + 23 * v2);
|
||||
}
|
||||
```
|
||||
|
||||
With that info, you can dump the list straight from the binary, e.g. using `dd`:
|
||||
```shell script
|
||||
dd if=./piu bs=1 skip=954240 count=31200 of=songlist.bin
|
||||
```
|
||||
|
||||
Requires you to manually calculate the size by using the above struct as reference.
|
||||
|
||||
Note: This part does not cover the dumping of the referenced strings to build a full song list. This process was mainly
|
||||
used to get a song index mapping table for mapping absolute indices of the song table array to the song IDs and vice
|
||||
versa (for pumpnet).
|
||||
@@ -0,0 +1,255 @@
|
||||
# Post mortem: Fiesta 2 crashing on modern linux
|
||||
Date of writing: 17th November 2019
|
||||
|
||||
This is a port mortem about an issue that was puzzling me for months. In the following sections, I am documenting the
|
||||
whole story as detailed as possible hoping this is going to be useful for anyone else (or even myself) in the future.
|
||||
|
||||
## What happened?
|
||||
I have been running a multidisk setup with all pump games on it for a few years now and have been maintaining and
|
||||
improving pumptools in the process. I always kept things quite up to date because once you need some more tooling
|
||||
even on something like a dedicated machine, updating the system after it has not been updated for months or years
|
||||
becomes very difficult. Furthermore, things might stop working that have worked before because of one or even multiple
|
||||
issues that got introduced with the update.
|
||||
|
||||
Anyway, my cabinet with the multidisk setup yields the following on `uname -a`:
|
||||
`Linux piumd 4.15.11-1-ARCH #1 SMP PREEMPT Mon Mar 19 18:21:03 UTC 2018 x86_64 GNU/Linux`
|
||||
|
||||
My workstation is a bit more up-to-date with (though, I am behind a few months...):
|
||||
`Linux ambient 5.2.3-arch1-1-ARCH #1 SMP PREEMPT Fri Jul 26 08:13:47 UTC 2019 x86_64 GNU/Linux`
|
||||
|
||||
In the past, like more than a year ago, my workstation was also running a newer kernel, version of runtime libraries
|
||||
etc. but running Fiesta 2 and newer with pumptools wasn't an issue. However, Fiesta 2 and newer stopped working when
|
||||
I was continuing with my development efforts and just crashed with a segmentation fault. All old versions prior
|
||||
Fiesta 2 were still working perfectly fine.
|
||||
|
||||
## Error analysis: first information and debugging steps
|
||||
First, I enabled f2hooks built in logging to yield more output `util.log.level=4` and enabled halting on crashes to
|
||||
be able to attach a debugger `patch.sigsegv.halt_on_segv=1`. This is the output I got:
|
||||
```
|
||||
[I][f2hook][main.c:155]: Hooking finished
|
||||
[M][f2hook][main.c:168]: Calling orig_init
|
||||
[E][patch-sigsegv][sigsegv.c:18]: ===================
|
||||
[E][patch-sigsegv][sigsegv.c:19]: !!!!! SIGSEGV !!!!!
|
||||
[E][patch-sigsegv][sigsegv.c:28]: Backtrace (3 frames):
|
||||
[E][patch-sigsegv][sigsegv.c:31]: ./f2hook.so(+0x6a02) [0xf7e20a02]
|
||||
[E][patch-sigsegv][sigsegv.c:31]: ./f2hook.so(+0xf827) [0xf7e29827]
|
||||
[E][patch-sigsegv][sigsegv.c:31]: linux-gate.so.1(__kernel_sigreturn+0) [0xf7f07940]
|
||||
[E][patch-sigsegv][sigsegv.c:37]: Halting for debugger...
|
||||
```
|
||||
|
||||
Ok, so it seems like something crashed in f2hook.so. However, hooking up the debugger did not yield anything useful
|
||||
and this was just pointing to the sigsegv handler (thought it worked with debugging other issues and actually pointed
|
||||
to the location where it crashed...strange).
|
||||
|
||||
Next, I started removing stuff from f2hook to get a minimal version which still boots up to that point, no changes.
|
||||
|
||||
Then, I hooked up gdb, set a breakpoint before the crash happened and stepped my way through the whole libc
|
||||
runtime setup. I figured out, that the crash happens when the libc runtime is calling handler functions of the
|
||||
target application which setup various parts of the runtime environment, like static initialization.
|
||||
|
||||
And this is the place where the crash happened. There is one function in the piu executable which setups up all static
|
||||
variables, for example constructing static strings or other objects. Once it tried to construct the first static string
|
||||
of that static setup function, it crashed. To be more precise, it crashed in the string constructor when allocating
|
||||
memory for the string.
|
||||
|
||||
Great, we found the root cause for that. Let's figure out why that happens and what's different now that it crashes
|
||||
there.
|
||||
|
||||
## Tracing the bug down to libstdc++ and being totally mislead by various things
|
||||
Because there have been issues with incompatible libc/libcstd++ versions previously, I quickly came to the idea of
|
||||
comparing the version that worked on my cabinet and the version that did not work on my workstation. Indeed, these
|
||||
were different versions (considering the age gap of the two OSes, that wasn't very surprising).
|
||||
|
||||
I started digging into the libstdc++ source code, especially looking at what is going on when strings are allocated.
|
||||
Navigating the libstdc++ source is not a nice task. The naming is very confusing and, imo, non intuitive. With
|
||||
templating all over the place, this makes it even worse.
|
||||
|
||||
Finally, I found something that sounded very related to what I have discovered so far:
|
||||
In the file include/bits/basic_string.h, search for
|
||||
```
|
||||
_GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
3076. basic_string CTAD ambiguity
|
||||
```
|
||||
|
||||
and you will end up at a string constructor call. From that, I concluded that something was fixed related to
|
||||
constructor calls. I compared the string allocation call of both versions, the non working and working ones. The
|
||||
allocation for strings has changed.
|
||||
|
||||
Going back to the location of the crash in the piu executable, I saw that the string allocation was even inlined and
|
||||
not going to a library call of...boost filesystem. The first static object created is the path "../" which is used by
|
||||
a path object by boost filesystem. Because boost filesystem is a header only library, I assume that's why this got
|
||||
inlined.
|
||||
|
||||
However, I was using the libstdc++ version of my local machine where the string allocation scheme was different. This
|
||||
still did not truly explain why it crashed there with a jump to address 0, but things aligned pretty well so far.
|
||||
|
||||
So, the first idea for a solution was to use the old libstdc++ version from the machine where everything was fine
|
||||
and working. However, using it did not change anything. I went on and grabbed more libraries from the machine until
|
||||
I had all of them on my workstation and hooked them up with a `LD_LIBRARY_PATH`. But now, the application did crash
|
||||
very early and did not even get to setting up the runtime at all. I did some poking but could not figure out what
|
||||
was happening there. It just crashed with another jump to 0 very early in launching the elf.
|
||||
|
||||
Debugging continued for a bunch of weeks, on and off. I got more focused on digging deeper into the string allocation
|
||||
thing as this was giving me a direction and was aligning with my findings so far. I came up with a "solution" to hook
|
||||
and overwrite the string constructor calls of the newer libstdc++ version.
|
||||
|
||||
I started replacing them one by one to re-implement the old allocation scheme. However, this was not enough as many
|
||||
function calls that are working with string objects rely on the used allocation scheme, too. Therefore, I also started
|
||||
patching these until I realized that I have to re-implement, at least, everything basic_string related.
|
||||
|
||||
At that point, I was quite sure that this is the wrong way to go and stopped with this approach.
|
||||
|
||||
A few more months passed, I got back at this multiple times but couldn't come up with another solution or even
|
||||
direction.
|
||||
|
||||
## AppImage
|
||||
In a talk with a buddy, I had the idea of using some sort of sandboxing or environment boxing to pack things up nicely
|
||||
into a single blob to make it easier to handle, even distributable and maybe even more platform independent.
|
||||
|
||||
After some internet research, I found a solution that looked like it fits the pump game use-case very well which was
|
||||
AppImage. AppImage packs all your stuff into a single binary blob which is basically just a sqash fs image with a
|
||||
special runtime bootstrapping the whole image and running a bash script once the image is mounted. The provided features
|
||||
are very minimalistic but solve all our needs for packing pump games nicely.
|
||||
|
||||
The reference documentation also pointed out a few things about packing runtime libraries and how to set them up using
|
||||
`LD_LIBRARY_PATH` which I was already doing but just using a naked bash script. However, this reading was starting to
|
||||
point me into the right direction.
|
||||
|
||||
## Providing a platform/distro independent environment for your application down to the linker
|
||||
I started playing around with the libraries I used for Fiesta 2. First, I grabbed _all_ libraries from my cabinet which
|
||||
are required to run the game (using `ldd`). Then I started trying different combinations of including them using
|
||||
`LD_LIBRARY_PATH` and some used by my native system. Nope, either I was running into the static init crashing issue
|
||||
or things crashed even earlier on.
|
||||
|
||||
Wait, have I ever looked into why the application crashed so early, even before spinning up the runtime environment?
|
||||
After working on this on and off for months and totally losing track by getting to deep into this libstdc++ thing, I
|
||||
realized I didn't.
|
||||
|
||||
I set up the application to use all libraries from my cabinet and started debugging. First, I tried my luck with `gdb`
|
||||
but didn't get very far as it just showed me a jump to 0, again. Next, I got pointed out to using `valgrind`. This was
|
||||
a great hint as valgrind hooks into the bootstrapping process of the application and even displays a lot of information
|
||||
about library loading and setting up the environment even way before the runtime is set up. Recommendation: Use
|
||||
`valgrind -v -v -v` to get a lot of output.
|
||||
|
||||
However, in the end, valgrind also just pointed out the jump to 0 being the reason for the crash but not why this
|
||||
happened. The additional information was good to figure out the steps happening in the application setup process but
|
||||
did not yield any additional insights.
|
||||
|
||||
After giving this some more thought and making sure I used all runtime libraries from the cabinet, I did some
|
||||
internet research again and tried go get more information on how ELFs are bootstrapped and what happens. It turned out
|
||||
that information on that topic very sparse and difficult to find. However, this brought me to the following thread
|
||||
from the gnu mailing list:
|
||||
```
|
||||
Hi all;
|
||||
|
||||
I have a need to use a different runtime linker (ld-linux.so) for some
|
||||
of my applications. I _don't_ want to change the executables themselves
|
||||
(changing the path to the runtime linker in the ELF image for example).
|
||||
|
||||
I know that I can just run my application as an argument to ld-linux.so,
|
||||
and that actually does work very well. But, I am left with two
|
||||
problems:
|
||||
|
||||
* Some of my applications fork/exec other programs, and those other
|
||||
programs also need to use the other runtime linker. Just as I don't
|
||||
want to change the ELF image, I certainly don't want to have to
|
||||
recompile the programs to exec the runtime linker!
|
||||
|
||||
* Debugging: I can't debug because I can't find a way to convince GDB
|
||||
to invoke the program-to-be-debugged using an alternative runtime
|
||||
linker.
|
||||
|
||||
I was wondering if anyone has any ideas about how to do this? I checked
|
||||
the man pages and didn't see anything (I was looking for something like
|
||||
an environment variable that ld-linux.so might obey to re-exec a
|
||||
different version, or some such thing--not likely, I know).
|
||||
|
||||
If there's nothing like that available another idea is to use LD_PRELOAD
|
||||
to install a private version of the execve() system call, which would
|
||||
set the alternative ld-linux.so as the first argument. Any thoughts on
|
||||
this approach? Do you think it would solve the GDB problem as well?
|
||||
I'm going to proceed to work on this idea but I wanted to see if anyone
|
||||
had other thoughts about it.
|
||||
|
||||
|
||||
|
||||
PS. In case anyone's curious, I'm trying to run some programs natively
|
||||
on my desktop system which were actually compiled for a different
|
||||
system, and the native and target systems have different versions of
|
||||
glibc installed. I can't change either of the versions of glibc,
|
||||
but I do have the complete root filesystem of the target box in a
|
||||
subdirectory of my native box and I can use LD_LIBRARY_PATH, etc. to
|
||||
use them... I just need a way to get the runtime environment to
|
||||
initialize properly.
|
||||
|
||||
--
|
||||
-------------------------------------------------------------------------------
|
||||
Paul D. Smith <address@hidden> HASMAT--HA Software Mthds & Tools
|
||||
"Please remain calm...I may be mad, but I am a professional." --Mad Scientist
|
||||
-------------------------------------------------------------------------------
|
||||
These are my opinions---Nortel Networks takes no responsibility for them.
|
||||
```
|
||||
|
||||
Source: https://lists.gnu.org/archive/html/help-gnu-utils/2004-06/msg00020.html
|
||||
|
||||
Oh, wow. I was amazed that someone else was having a very similar use-case of running applications from legacy systems
|
||||
on a newer machine with different library versions and conflicts.
|
||||
|
||||
Reading on, this answer was finally revealing the last piece of the puzzle to understand the issue I was facing with
|
||||
Fiesta 2:
|
||||
```
|
||||
If you have an old a.elf main executable program that was linked
|
||||
to run with libc.so.6, and you want to run that a.elf on a machine
|
||||
whose libc.so.6 differs from the one which a.elf was linked against,
|
||||
and you want a reasonable guarantee that it will work, then it may
|
||||
be necessary to use something like rtldi to choose the matching
|
||||
ld-linux.so.2 and libc.so.6 and other libraries as of the time of
|
||||
static binding of a.elf. In theory, libc.so.6 is backwards compatibile
|
||||
(a given a.elf should run the same under any subsequent libc.so.6),
|
||||
but in practice there have been too many bugs in {ld-linux.so.2,
|
||||
libc.so.6, ...}. For example, many programs linked for libc.so.6
|
||||
under RedHat Linux 7.2 and earlier won't run under glibc-2.3.2.
|
||||
The most effective way to run such a program may be to install the
|
||||
old glibc-x.y.z[.rpm] in a different location, binary edit the PT_INTERP
|
||||
string of the a.elf, and use rtldi. This makes the old [edited] a.elf
|
||||
simultaneously interoperable with other programs from different
|
||||
libc.so.6 generations, and only the "oddball" program has to know.
|
||||
|
||||
...
|
||||
|
||||
ld-linux.so.2, libc.so.6, libdl.so, libnss*.so, and _many_ other shared
|
||||
libraries of a given released version, are a matched set. They must be
|
||||
used together, all from the same release, or not at all. Mixing and
|
||||
matching pieces from different glibc-x.y.z need not work. In order to
|
||||
use a consistent set that differs from the default set, you must invoke
|
||||
the ld-linux.so.2 using "--library-path PATH" to specify the location
|
||||
of the rest of the set. Using --library-path supersedes LD_LIBRARY_PATH
|
||||
for one execve() only, and does not interfere with chilren, execve()
|
||||
with no fork(), or other processes.
|
||||
```
|
||||
|
||||
Oh, I was not aware about ld-linux.so being THAT important to this set of libc.sp, libdl.so etc. Therefore, I grabbed
|
||||
the ld-linux.so file from my cabinet and ran the application with all libraries (except the GPU driver specific ones)
|
||||
on my workstation like this:
|
||||
```
|
||||
LD_PRELOAD="./f2hook.so" ./ld-linux.so.2 --library-path ./lib ./piu ./game/ --options ./hook.conf
|
||||
```
|
||||
|
||||
And the application starts up, passes runtime initializing, hits main and the game works.
|
||||
|
||||
I don't think there is anything else to add to the copy-pasted explanations above. Make sure to read them carefully to
|
||||
understand the whole issue. Once you know what is going on, the whole thing is not even super complex.
|
||||
|
||||
## Conclusions
|
||||
I would consider this being one of the major issues I have resolved so far for pumptools as this was so misleading,
|
||||
difficult to debug and find any general information on. The reason behind that and the solution are super simple, once
|
||||
you know them.
|
||||
|
||||
As we have already discussed various times in the past, this issue further points out how important proper solutions
|
||||
for sandboxing, containerizing or how you want to call it for legacy applications like pump games are. The naked
|
||||
bash script setting up everything is already quite good and doing the job. AppImage further enhances this by making
|
||||
the whole application more portable.
|
||||
|
||||
However, understanding the whole process behind ELF loading, library linking, setting up the process environment and
|
||||
setting up the runtime environment is very important. Otherwise, rather simple incompatibilities are the result which
|
||||
have a major impact on running the application.
|
||||
@@ -0,0 +1,107 @@
|
||||
# Hardware used by Pump It Up Games
|
||||
## Main PC/CPU hardware
|
||||
### MK 1
|
||||
We have not seen this piece of hardware and the chances these boards still exist and are sold somewhere is rather low.
|
||||
However, there are pointers in the code of the game and the evolution of the hardware that it existed for the first
|
||||
few versions of PIU:
|
||||
* Songs were played back entirely from CD requiring to store them as 16-bit PCM audio. Therefore, the hardware did not
|
||||
have a chip for decoding MP3.
|
||||
* Absence of hardware security/lockchip.
|
||||
|
||||
We assume that this hardware was shipped and used with 1st, 2nd and 3rd. Starting 3rd SE, song files were stored as
|
||||
encoded MP3 files on the CD requiring a MP3 decoder available with [MK3 hardware](###MK 3).
|
||||
|
||||
### MK 3
|
||||
All games from 1st to Prex3/Premiere 3 are running on this revision of hardware. 1st to 3rd are compatible with this
|
||||
hardware.
|
||||
|
||||
System configuration dump using PC-DOCTOR DOS 3.0
|
||||
```
|
||||
SYSTEM CONFIGURATION=====================================================
|
||||
|
||||
Operating System - DOS 7.10 in HMA
|
||||
CPU Type - 333 MHz Intel Celeron 333
|
||||
CPUID - "GenuineIntel", Family 6, Model 6, Step 5
|
||||
- MMX available
|
||||
Coprocessor Type - 686
|
||||
Expansion Bus Type - ISA, PCI
|
||||
ROM BIOS Date - 04/20/99
|
||||
ROM BIOS Copyright - COPYRIGHT Award Software Inc.
|
||||
Additional ROM - C800[8kB]
|
||||
Base Memory - 640 kB
|
||||
Expanded Memory - N/A
|
||||
Extended Memory - 64512 kB (CMOS Configuration)
|
||||
XMS Memory - 62400 kB (XMS 3.00, Driver 3.95) A20=ON
|
||||
Serial Ports - None Installed
|
||||
Parallel Ports - None Installed
|
||||
Video Adapter - VGA: 3Dfx Interactive, Inc.
|
||||
- Total Memory : 8192 kB
|
||||
Fixed Disk Drives - 42 MB
|
||||
Floppy Disk Drives - 1 - 1=3.5"/1.44M
|
||||
Mouse - No Mouse
|
||||
Joysticks - None
|
||||
Sound Card - N/A
|
||||
CAS Fax/Modem Card - N/A
|
||||
Disk Compression - N/A
|
||||
CD-ROM Driver Version - MSCDEX V2.25, Drive: D:
|
||||
Disk Cache - Smartdrive 5.02, Hits 76%, Size 2048 kB
|
||||
Primary IDE Master - ATAPI: HL-DT-STDVD-ROM GDR8164B
|
||||
Primary IDE Slave - IDE: QUANTUM FIREBALL_TM1280A, S/N:692708422782
|
||||
Secondary IDE Master - No Drive
|
||||
Secondary IDE Slave - No Drive
|
||||
SCSI - N/A
|
||||
Network - N/A
|
||||
Power Management - APM V1.2, Power On
|
||||
USB Port - Installed on IRQ 10
|
||||
Chipset Type - Intel 440BX
|
||||
L2 Cache Type - 128 kB
|
||||
DRAM Row 0 - 64 MB
|
||||
DRAM Row 1 - Empty
|
||||
DRAM Row 2 - Empty
|
||||
DRAM Row 3 - Empty
|
||||
DRAM Row 4 - Empty
|
||||
DRAM Row 5 - Empty
|
||||
DRAM Row 6 - Empty
|
||||
DRAM Row 7 - Empty
|
||||
|
||||
|
||||
PC-DOCTOR DOS 3.0 Copyr 2004 PC-Doctor, Inc. 16:15 9/25/2000
|
||||
```
|
||||
|
||||
A bunch of custom chips for handling the following:
|
||||
* Sound
|
||||
* YAMAHA YMZ280B-F (8-Channel PCM/ADPCM Decoder)
|
||||
* 16-bit PCM sound effects are played from external memory
|
||||
* YAMAHA YAC516 (Delta Sigma Modulation D/A Converter with 8 times Over-sampling Filter)
|
||||
* MICRONAS DAC3550A C2 (Stereo Audio DAC)
|
||||
* MICRONAS MAS3507D F10 (MPEG 1/2 Layer 2/3 Audio Decoder)
|
||||
* Songs are stored MP3 encoded
|
||||
|
||||
### MK 5
|
||||
|
||||
### MK 6
|
||||
|
||||
### MK 7
|
||||
|
||||
### MK 9
|
||||
|
||||
### MK X
|
||||
|
||||
## IO hardware
|
||||
### ISA PIUIO
|
||||
|
||||
### USB PIUIO
|
||||
|
||||
### USB PIUIO 2
|
||||
|
||||
### PIUBTN
|
||||
|
||||
### XX Card reader
|
||||
|
||||
## Security
|
||||
### Lockchip
|
||||
|
||||
### USB dongles
|
||||
|
||||
### ds1963s
|
||||
Used for Pro 1/2 (and ITG 1/2).
|
||||
@@ -0,0 +1,141 @@
|
||||
# Notes about how NX2 handles saving and loading usb profile data
|
||||
Executable of v1.54.
|
||||
|
||||
This document outlines the relevant parts regarding how NX2 loads and stores profiles and how this had an impact on the
|
||||
design of the patch module `net-profile`, that hooks up usb profile loading over socket to a remote server.
|
||||
|
||||
## Syscall flow
|
||||
The game calls the following system calls in order per player, here player 1 (id 0), when loading usb profile data
|
||||
(assume all calls are successful here):
|
||||
```c
|
||||
// Simplified pseudo-like C code omitting non relevant parameters
|
||||
fopen("/mnt/0/nx2save.bin")
|
||||
fread(fd_save) // stats area
|
||||
fread(fd_save) // encrypted area
|
||||
fclose(fd_save)
|
||||
|
||||
fopen("/mnt/0/nx2rank.bin")
|
||||
fread(fd_rank) // encrypted area
|
||||
fclose(fd_rank)
|
||||
```
|
||||
|
||||
For saving the profile, this is the call flow:
|
||||
```c
|
||||
// Simplified pseudo-like C code omitting non relevant parameters
|
||||
fopen("/mnt/0/nx2save.bin")
|
||||
fseek(fd_save) // beginning
|
||||
fwrite(fd_save) // stats area
|
||||
fwrite(fd_save) // encrypted area
|
||||
fclose(fd_save)
|
||||
|
||||
fopen("/mnt/0/nx2rank.bin")
|
||||
fseek(fd_rank) // beginning
|
||||
fwrite(fd_rank) // encrypted area
|
||||
fclose(fd_rank)
|
||||
```
|
||||
|
||||
We can see that in both scenarios, for loading and saving, the game first takes care of a single file before moving on
|
||||
to the next one.
|
||||
|
||||
There is another flow that is slightly different when playing World Max. After playing a song in World Max, the game
|
||||
writes the changes of the `nx2save.bin` file back:
|
||||
```c
|
||||
// Simplified pseudo-like C code omitting non relevant parameters
|
||||
fopen("/mnt/0/nx2save.bin")
|
||||
fseek(fd_save) // beginning
|
||||
fwrite(fd_save) // stats area
|
||||
fwrite(fd_save) // encrypted area
|
||||
fclose(fd_save)
|
||||
```
|
||||
|
||||
## Pumpnet RPCs
|
||||
The above set the requirements for how pumpnet needs to handle file loading and storing.
|
||||
|
||||
### First solution
|
||||
The initial solution was combining the loading and storing process of both files, `nx2save.bin` and `nx2rank.bin`
|
||||
into a single download/upload call.
|
||||
|
||||
Load phase:
|
||||
```c
|
||||
// Simplified pseudo-like C code omitting non relevant parameters
|
||||
fopen("/mnt/0/nx2save.bin")
|
||||
pumpnet_download_profiles()
|
||||
fread(fd_save) // read from buffered data
|
||||
fread(fd_save) // read from buffered data
|
||||
fclose(fd_save)
|
||||
|
||||
fopen("/mnt/0/nx2rank.bin") // skip, data already buffered
|
||||
fread(fd_rank) // read from buffered data
|
||||
fclose(fd_rank) // clear all buffers and reset internal state
|
||||
```
|
||||
|
||||
Save phase:
|
||||
```c
|
||||
// Simplified pseudo-like C code omitting non relevant parameters
|
||||
fopen("/mnt/0/nx2save.bin")
|
||||
pumpnet_download_profiles()
|
||||
fseek(fd_save) // seek for buffers
|
||||
fwrite(fd_save) // write to buffers
|
||||
fwrite(fd_save) // write to buffers
|
||||
fclose(fd_save) // skip, do nothing
|
||||
|
||||
fopen("/mnt/0/nx2rank.bin") // skip, data already buffered
|
||||
fseek(fd_rank) // seek for buffers
|
||||
fwrite(fd_rank) // write to buffers
|
||||
pumpnet_upload_profiles()
|
||||
fclose(fd_rank) // clear all buffers and reset internal state
|
||||
```
|
||||
|
||||
However, with the additional flow during World Max, this solution didn't work and broke internal state handling.
|
||||
Modifying this solution to incorporate saving just the `nx2save.bin` file wasn't feasible with the above architecture.
|
||||
|
||||
### Second solution
|
||||
Therefore, the pumpnet backend was re-designed to operate on on a single file level and separate for saving and
|
||||
loading.
|
||||
|
||||
Load phase:
|
||||
```c
|
||||
// Simplified pseudo-like C code omitting non relevant parameters
|
||||
fopen("/mnt/0/nx2save.bin")
|
||||
pumpnet_download_save()
|
||||
fread(fd_save) // read from buffered data
|
||||
fread(fd_save) // read from buffered data
|
||||
fclose(fd_save)
|
||||
pumpnet_clear_save_cache()
|
||||
|
||||
fopen("/mnt/0/nx2rank.bin")
|
||||
pumpnet_download_rank()
|
||||
fread(fd_rank) // read from buffered data
|
||||
fclose(fd_rank)
|
||||
pumpnet_clear_rank_cache()
|
||||
```
|
||||
|
||||
Save phase:
|
||||
```c
|
||||
// Simplified pseudo-like C code omitting non relevant parameters
|
||||
fopen("/mnt/0/nx2save.bin")
|
||||
pumpnet_download_save()
|
||||
fseek(fd_save) // seek for buffers
|
||||
fwrite(fd_save) // write to buffers
|
||||
fwrite(fd_save) // write to buffers
|
||||
fclose(fd_save)
|
||||
pumpnet_upload_save()
|
||||
pumpnet_clear_save_cache()
|
||||
|
||||
fopen("/mnt/0/nx2rank.bin")
|
||||
fseek(fd_rank) // seek for buffers
|
||||
fwrite(fd_rank) // write to buffers
|
||||
fclose(fd_rank)
|
||||
pumpnet_upload_rank()
|
||||
pumpnet_clear_rank_cache()
|
||||
```
|
||||
|
||||
Buffer modifications are detected when `fwrite` is called and flagged accordingly that the module is aware of having
|
||||
to write back dirty data on the call to `fclose`.
|
||||
|
||||
State handling is also simplified as it only needs to be taken care of on a file level between `fopen` and `fclose`
|
||||
calls and not on a multi-file level.
|
||||
|
||||
This solution is definitely more robust and flexible than the previous one that operated on a full profile level.
|
||||
However, the call overhead to the remote server is four times higher compared to the previous solution. Considering
|
||||
that these calls are not being issued on a high frequency, server load is unlikely to be an issue.
|
||||
@@ -0,0 +1,448 @@
|
||||
# Pad command codes notes
|
||||
Raw data and notes about pad command codes which were extracted directly from the games because I could not find a
|
||||
complete and 100% accurate list per game.
|
||||
|
||||
All codes extracted from the MK3 games are based on the Linux port executables.
|
||||
|
||||
How did I find these? I used the `ac_sound_play_effect` with the second parameter set to the value `3` as my entry
|
||||
point. This plays the sound effect that you can hear when you entered the modifier code correctly. After I have found
|
||||
the right call, it's next to some code like this (taken from 03_3rd):
|
||||
```
|
||||
...
|
||||
if ( modFlags & 1 )
|
||||
{
|
||||
if ( modFlagsSpeed1P & 1 )
|
||||
result = func_2a2dc(0, 1);
|
||||
if ( modFlagsSpeed1P & 2 )
|
||||
result = func_2a2dc(0, 2);
|
||||
if ( modFlagsSpeed1P & 4 )
|
||||
result = func_2a2dc(0, 4);
|
||||
if ( modFlagsSpeed1P & 8 )
|
||||
result = func_2a2dc(0, 8);
|
||||
if ( modFlagsSpeed1P & 0x10 )
|
||||
result = func_2a2dc(0, 16);
|
||||
}
|
||||
if ( modFlags & 2 )
|
||||
{
|
||||
if ( modFlagsSpeed2P & 1 )
|
||||
result = func_2a2dc(1, 1);
|
||||
if ( modFlagsSpeed2P & 2 )
|
||||
result = func_2a2dc(1, 2);
|
||||
if ( modFlagsSpeed2P & 4 )
|
||||
result = func_2a2dc(1, 4);
|
||||
if ( modFlagsSpeed2P & 8 )
|
||||
result = func_2a2dc(1, 8);
|
||||
if ( modFlagsSpeed2P & 0x10 )
|
||||
result = func_2a2dc(1, 16);
|
||||
}
|
||||
if ( modFlagsSpeed1P & 0x1F )
|
||||
{
|
||||
checkIfModifierSet2();
|
||||
result = ac_sound_play_effect(0, 3u, 2u);
|
||||
}
|
||||
if ( modFlagsSpeed2P & 0x1F )
|
||||
{
|
||||
checkIfModifierSet();
|
||||
result = ac_sound_play_effect(0, 3u, 2u);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
```
|
||||
|
||||
I already renamed the function that is called prior the `ac_sound_play_effect` to `checkIfModifierSet` here. That
|
||||
function checks the last eight pad inputs from a list against a list of command codes. Once a code matches, flags are
|
||||
set accordingly.
|
||||
|
||||
Excerpt, again from 03_3rd:
|
||||
```
|
||||
signed int checkIfModifierSet()
|
||||
{
|
||||
const char *v0; // edx@1
|
||||
int v1; // ebp@1
|
||||
signed int v2; // ebx@1
|
||||
const char *v3; // edx@19
|
||||
unsigned int v4; // ebx@19
|
||||
signed int result; // eax@41
|
||||
signed int v6; // [sp+0h] [bp-1Ch]@1
|
||||
|
||||
v0 = (const char *)&codeList; // THIS is the code list
|
||||
v1 = *(_DWORD *)&modFlags;
|
||||
v2 = 0;
|
||||
v6 = *(_DWORD *)&data_3299a4;
|
||||
while ( memcmp((const char *)&data_44e9e8, v0, 8) )// iterate command list and currently post 8 inputs
|
||||
{
|
||||
++v2;
|
||||
v0 += 8; // each modifier code is 8 commands
|
||||
if ( v2 >= 13 ) // beyond command list size
|
||||
goto jump_2a17f;
|
||||
}
|
||||
switch ( v2 ) // found command id
|
||||
{
|
||||
case 0:
|
||||
*(_DWORD *)&data_3299a4 = 0;
|
||||
*(_DWORD *)&modFlags = *(_WORD *)&modFlags & 0xFFF;
|
||||
break;
|
||||
```
|
||||
|
||||
## 03_3rd
|
||||
```
|
||||
1 = DL
|
||||
2 = DR
|
||||
4 = C
|
||||
8 = UL
|
||||
16 = UR
|
||||
|
||||
-- cancel
|
||||
.data:0810833A db 4
|
||||
.data:0810833B db 4
|
||||
.data:0810833C db 4
|
||||
.data:0810833D db 4
|
||||
|
||||
.data:0810833E db 4
|
||||
.data:0810833F db 4
|
||||
.data:08108340 db 4
|
||||
.data:08108341 db 4
|
||||
--------------------------- vanish
|
||||
.data:08108342 db 4 center
|
||||
.data:08108343 db 4 center
|
||||
.data:08108344 db 10h up right
|
||||
.data:08108345 db 8 up left
|
||||
.data:08108346 db 4 center
|
||||
.data:08108347 db 2 down right
|
||||
.data:08108348 db 1 down left
|
||||
.data:08108349 db 4 center
|
||||
----------------- mirror
|
||||
.data:0810834A db 4
|
||||
.data:0810834B db 4
|
||||
.data:0810834C db 1
|
||||
.data:0810834D db 4
|
||||
.data:0810834E db 10h
|
||||
.data:0810834F db 2
|
||||
.data:08108350 db 4
|
||||
.data:08108351 db 8
|
||||
---- 8X
|
||||
.data:08108352 db 4
|
||||
.data:08108353 db 4
|
||||
.data:08108354 db 1
|
||||
.data:08108355 db 4
|
||||
.data:08108356 db 2
|
||||
.data:08108357 db 4
|
||||
.data:08108358 db 4
|
||||
.data:08108359 db 4
|
||||
- 4 X
|
||||
.data:0810835A db 4
|
||||
.data:0810835B db 4
|
||||
.data:0810835C db 2
|
||||
.data:0810835D db 4
|
||||
.data:0810835E db 4
|
||||
.data:0810835F db 8
|
||||
.data:08108360 db 4
|
||||
.data:08108361 db 4
|
||||
2X
|
||||
.data:08108362 db 4
|
||||
.data:08108363 db 4
|
||||
.data:08108364 db 8
|
||||
.data:08108365 db 4
|
||||
.data:08108366 db 4
|
||||
.data:08108367 db 4
|
||||
.data:08108368 db 10h
|
||||
.data:08108369 db 4
|
||||
random step
|
||||
.data:0810836A db 4
|
||||
.data:0810836B db 1
|
||||
.data:0810836C db 4
|
||||
.data:0810836D db 2
|
||||
.data:0810836E db 4
|
||||
.data:0810836F db 10h
|
||||
.data:08108370 db 4
|
||||
.data:08108371 db 8
|
||||
nonstep
|
||||
.data:08108372 db 8
|
||||
.data:08108373 db 10h
|
||||
.data:08108374 db 4
|
||||
.data:08108375 db 8
|
||||
.data:08108376 db 10h
|
||||
.data:08108377 db 4
|
||||
.data:08108378 db 8
|
||||
.data:08108379 db 10h
|
||||
synchro
|
||||
.data:0810837A db 4
|
||||
.data:0810837B db 4
|
||||
.data:0810837C db 8
|
||||
.data:0810837D db 10h
|
||||
.data:0810837E db 8
|
||||
.data:0810837F db 10h
|
||||
.data:08108380 db 4
|
||||
.data:08108381 db 4
|
||||
couple
|
||||
.data:08108382 db 4
|
||||
.data:08108383 db 4
|
||||
.data:08108384 db 10h
|
||||
.data:08108385 db 8
|
||||
.data:08108386 db 10h
|
||||
.data:08108387 db 8
|
||||
.data:08108388 db 4
|
||||
.data:08108389 db 4
|
||||
union
|
||||
.data:0810838A db 1
|
||||
.data:0810838B db 2
|
||||
.data:0810838C db 4
|
||||
.data:0810838D db 8
|
||||
.data:0810838E db 2
|
||||
.data:0810838F db 1
|
||||
.data:08108390 db 4
|
||||
.data:08108391 db 10h
|
||||
random vanish
|
||||
.data:08108392 db 8
|
||||
.data:08108393 db 10h
|
||||
.data:08108394 db 4
|
||||
.data:08108395 db 1
|
||||
.data:08108396 db 2
|
||||
.data:08108397 db 4
|
||||
.data:08108398 db 8
|
||||
.data:08108399 db 10h
|
||||
random speed
|
||||
.data:0810839A db 8
|
||||
.data:0810839B db 10h
|
||||
.data:0810839C db 2
|
||||
.data:0810839D db 4
|
||||
.data:0810839E db 1
|
||||
.data:0810839F db 4
|
||||
.data:081083A0 db 2
|
||||
.data:081083A1 db 1
|
||||
|
||||
```
|
||||
|
||||
Looking further into the code, there seems to be another command list with three entries right after that and it's
|
||||
checked in the same function. This time, the number of inputs are 10 instead of 8:
|
||||
```
|
||||
v3 = (const char *)&data_108d84; // THIS is the code list
|
||||
v4 = 0;
|
||||
while ( memcmp(data_44e9f8, v3, 10) )
|
||||
{
|
||||
++v4;
|
||||
v3 += 10;
|
||||
if ( (signed int)v4 >= 3 )
|
||||
goto jump_2a289;
|
||||
}
|
||||
if ( v4 < 1 )
|
||||
{
|
||||
if ( !v4 && data_44ea30 == 2 )
|
||||
data_108bad |= 0x80u;
|
||||
}
|
||||
else if ( v4 <= 1 )
|
||||
{
|
||||
if ( data_108bad & 4 )
|
||||
{
|
||||
*(_WORD *)&modFlags |= 0x820u;
|
||||
qmemcpy(data_44e488, &data_388e00[20 * (4 * data_108ba8 + 52)], 0x50u);
|
||||
}
|
||||
}
|
||||
else if ( v4 == 2
|
||||
&& (data_108bad & 2 && data_108ba8 >= 2 || data_108bad & 4 && !(modFlags & 0x20) && data_108ba8 == 1) )
|
||||
{
|
||||
data_108bae |= 1u;
|
||||
}
|
||||
```
|
||||
|
||||
Code list:
|
||||
```
|
||||
1 = DL
|
||||
2 = DR
|
||||
4 = C
|
||||
8 = UL
|
||||
16 = UR
|
||||
|
||||
.data:081083A2 data_108d84 db 2 ; DATA XREF: func_29ce8:jump_29e70o
|
||||
.data:081083A2 ; checkIfModifierSet:jump_2a17fo
|
||||
.data:081083A3 db 1
|
||||
.data:081083A4 db 8
|
||||
.data:081083A5 db 10h
|
||||
.data:081083A6 db 18h
|
||||
.data:081083A7 db 20h
|
||||
.data:081083A8 db 12h
|
||||
.data:081083A9 db 11h
|
||||
.data:081083AA db 10h
|
||||
.data:081083AB db 18h
|
||||
|
||||
.data:081083AC db 12h
|
||||
.data:081083AD db 18h
|
||||
.data:081083AE db 10h
|
||||
.data:081083AF db 1
|
||||
.data:081083B0 db 8
|
||||
.data:081083B1 db 2
|
||||
.data:081083B2 db 11h
|
||||
.data:081083B3 db 20h
|
||||
.data:081083B4 db 11h
|
||||
.data:081083B5 db 10h
|
||||
|
||||
.data:081083B6 db 8
|
||||
.data:081083B7 db 2
|
||||
.data:081083B8 db 18h
|
||||
.data:081083B9 db 12h
|
||||
.data:081083BA db 1
|
||||
.data:081083BB db 10h
|
||||
.data:081083BC db 11h
|
||||
.data:081083BD db 20h
|
||||
.data:081083BE db 2
|
||||
.data:081083BF db 18h
|
||||
```
|
||||
|
||||
However, the code list seems to have inputs with multiple bit fields set, e.g. 0x12, 0x11. Untested.
|
||||
|
||||
## 04_3se
|
||||
List of previous version extended by 3 more codes (last ones in the list).
|
||||
|
||||
```
|
||||
1 = DL
|
||||
2 = DR
|
||||
4 = C
|
||||
8 = UL
|
||||
16 = UR
|
||||
|
||||
data_12ae8c db 4 ; DATA XREF: func_2a8c0+23o
|
||||
.data:08123643 ; func_2ab98+23o
|
||||
.data:08123644 db 4
|
||||
.data:08123645 db 4
|
||||
.data:08123646 db 4
|
||||
.data:08123647 db 4
|
||||
.data:08123648 db 4
|
||||
.data:08123649 db 4
|
||||
.data:0812364A db 4
|
||||
|
||||
.data:0812364B db 4
|
||||
.data:0812364C db 4
|
||||
.data:0812364D db 10h
|
||||
.data:0812364E db 8
|
||||
.data:0812364F db 4
|
||||
.data:08123650 db 2
|
||||
.data:08123651 db 1
|
||||
.data:08123652 db 4
|
||||
|
||||
.data:08123653 db 4
|
||||
.data:08123654 db 4
|
||||
.data:08123655 db 1
|
||||
.data:08123656 db 4
|
||||
.data:08123657 db 10h
|
||||
.data:08123658 db 2
|
||||
.data:08123659 db 4
|
||||
.data:0812365A db 8
|
||||
|
||||
.data:0812365B db 4
|
||||
.data:0812365C db 4
|
||||
.data:0812365D db 1
|
||||
.data:0812365E db 4
|
||||
.data:0812365F db 2
|
||||
.data:08123660 db 4
|
||||
.data:08123661 db 4
|
||||
.data:08123662 db 4
|
||||
|
||||
.data:08123663 db 4
|
||||
.data:08123664 db 4
|
||||
.data:08123665 db 2
|
||||
.data:08123666 db 4
|
||||
.data:08123667 db 4
|
||||
.data:08123668 db 8
|
||||
.data:08123669 db 4
|
||||
.data:0812366A db 4
|
||||
|
||||
.data:0812366B db 4
|
||||
.data:0812366C db 4
|
||||
.data:0812366D db 8
|
||||
.data:0812366E db 4
|
||||
.data:0812366F db 4
|
||||
.data:08123670 db 4
|
||||
.data:08123671 db 10h
|
||||
.data:08123672 db 4
|
||||
|
||||
.data:08123673 db 4
|
||||
.data:08123674 db 1
|
||||
.data:08123675 db 4
|
||||
.data:08123676 db 2
|
||||
.data:08123677 db 4
|
||||
.data:08123678 db 10h
|
||||
.data:08123679 db 4
|
||||
.data:0812367A db 8
|
||||
|
||||
.data:0812367B db 8
|
||||
.data:0812367C db 10h
|
||||
.data:0812367D db 4
|
||||
.data:0812367E db 8
|
||||
.data:0812367F db 10h
|
||||
.data:08123680 db 4
|
||||
.data:08123681 db 8
|
||||
.data:08123682 db 10h
|
||||
|
||||
.data:08123683 db 4
|
||||
.data:08123684 db 4
|
||||
.data:08123685 db 8
|
||||
.data:08123686 db 10h
|
||||
.data:08123687 db 8
|
||||
.data:08123688 db 10h
|
||||
.data:08123689 db 4
|
||||
.data:0812368A db 4
|
||||
|
||||
.data:0812368B db 4
|
||||
.data:0812368C db 4
|
||||
.data:0812368D db 10h
|
||||
.data:0812368E db 8
|
||||
.data:0812368F db 10h
|
||||
.data:08123690 db 8
|
||||
.data:08123691 db 4
|
||||
.data:08123692 db 4
|
||||
|
||||
.data:08123693 db 1
|
||||
.data:08123694 db 2
|
||||
.data:08123695 db 4
|
||||
.data:08123696 db 8
|
||||
.data:08123697 db 2
|
||||
.data:08123698 db 1
|
||||
.data:08123699 db 4
|
||||
.data:0812369A db 10h
|
||||
|
||||
.data:0812369B db 8
|
||||
.data:0812369C db 10h
|
||||
.data:0812369D db 4
|
||||
.data:0812369E db 1
|
||||
.data:0812369F db 2
|
||||
.data:081236A0 db 4
|
||||
.data:081236A1 db 8
|
||||
.data:081236A2 db 10h
|
||||
|
||||
.data:081236A3 db 8
|
||||
.data:081236A4 db 10h
|
||||
.data:081236A5 db 2
|
||||
.data:081236A6 db 4
|
||||
.data:081236A7 db 1
|
||||
.data:081236A8 db 4
|
||||
.data:081236A9 db 2
|
||||
.data:081236AA db 1
|
||||
--- remix double
|
||||
.data:081236AB db 1
|
||||
.data:081236AC db 8
|
||||
.data:081236AD db 1
|
||||
.data:081236AE db 4
|
||||
.data:081236AF db 10h
|
||||
.data:081236B0 db 2
|
||||
.data:081236B1 db 10h
|
||||
.data:081236B2 db 4
|
||||
---- crazy mode
|
||||
.data:081236B3 db 4
|
||||
.data:081236B4 db 1
|
||||
.data:081236B5 db 4
|
||||
.data:081236B6 db 2
|
||||
.data:081236B7 db 4
|
||||
.data:081236B8 db 1
|
||||
.data:081236B9 db 4
|
||||
.data:081236BA db 2
|
||||
--- all select code? doesn't make sense and doesn't seem to work, probably unused
|
||||
.data:081236BB db 10h
|
||||
.data:081236BC db 4
|
||||
.data:081236BD db 1
|
||||
.data:081236BE db 10h
|
||||
.data:081236BF db 8
|
||||
.data:081236C0 db 4
|
||||
.data:081236C1 data_12af0a db 2 ; DATA XREF: func_2c380+139r
|
||||
.data:081236C1 ; func_2c51c+559r
|
||||
.data:081236C2 db 8
|
||||
```
|
||||
@@ -0,0 +1,9 @@
|
||||
# Notes about working with Pump It Up Pro
|
||||
## Enable game's log output in arcade mode
|
||||
Go to `data0.zip/Data/Static/ini` and change the following lines under the category `[Options-arcade]`:
|
||||
```text
|
||||
LogToDisk=1
|
||||
ShowLogOutput=1
|
||||
```
|
||||
|
||||
The game logs all log levels including trace level.
|
||||
@@ -0,0 +1,134 @@
|
||||
# Pump it Up: The 1st Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: September 1999
|
||||
* Korea exclusive
|
||||
* First game in the series
|
||||
* 15 songs
|
||||
* 4 non-stop remixes
|
||||
* 4 battle songs
|
||||
|
||||
## Game modes
|
||||
* Easy
|
||||
* Hard
|
||||
* Double
|
||||
* Non-stop remix
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu (after selecting easy, hard, double, non-stop remix or battle). When
|
||||
a code was entered successfully, a sound effect is played. For some modifiers, an icon is also displayed on left side
|
||||
of the screen for player 1 and on the right side of the screen for player 2.
|
||||
|
||||
### Velocity 2x
|
||||
Arrow scroll speed 2x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 4x
|
||||
Arrow scroll speed 4x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 8x
|
||||
Arrow scroll speed 8x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Synchro
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Couple
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,188 @@
|
||||
# Pump it Up: The 2nd Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: December 1999
|
||||
* Korea exclusive
|
||||
* Only 4 songs and one remix taken over from previous version
|
||||
* 17 new songs
|
||||
* 6 new non-stop remixes
|
||||
|
||||
# Game modes
|
||||
* Easy
|
||||
* Hard
|
||||
* Double
|
||||
* Non-stop remix
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
* Non-stop remix double: Needs to be unlocked [using a code](###Non-stop remix double) which needs to be entered on the
|
||||
non-stop remix screen.
|
||||
|
||||
When the second player joined by also pressing the center panel, battle modes is available on the mode select screen
|
||||
instead of double.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu (after selecting easy, hard, double, non-stop remix or battle) except
|
||||
the [non-stop remix double code](###Non-stop remix double). When a code was entered successfully, a sound effect is
|
||||
played. For some modifiers, an icon is also displayed on left side of the screen for player 1 and on the right side of
|
||||
the screen for player 2.
|
||||
|
||||
### Velocity 2x
|
||||
Arrow scroll speed 2x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 4x
|
||||
Arrow scroll speed 4x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 8x
|
||||
Arrow scroll speed 8x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Synchro
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Couple
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Non-stop remix double
|
||||
Must be entered on the non-step remix select screen.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Union
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### All Select
|
||||
Enter this code on the select mode screen (easy, hard, double, non-stop). When entered correctly, the game transitions
|
||||
automatically to a selection screen with all available songs.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,182 @@
|
||||
# Pump it Up The O.B.G: The 3rd Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: May 2000
|
||||
* Korea exclusive
|
||||
* 23 new songs but only 2 old songs taken over
|
||||
|
||||
# Game modes
|
||||
* Easy
|
||||
* Hard
|
||||
* Double
|
||||
* Non-stop remix
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
|
||||
When the second player joined by also pressing the center panel, battle modes is available on the mode select screen
|
||||
instead of double.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu (after selecting easy, hard, double, non-stop remix or battle). When a
|
||||
code was entered successfully, a sound effect is played. For some modifiers, an icon is also displayed on left side of
|
||||
the screen for player 1 and on the right side of the screen for player 2.
|
||||
|
||||
### Velocity 2x
|
||||
Arrow scroll speed 2x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 4x
|
||||
Arrow scroll speed 4x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 8x
|
||||
Arrow scroll speed 8x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Synchro
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Couple
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Union
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Vanish
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Speed
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,211 @@
|
||||
# Pump it Up The O.B.G: The Season Evolution Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: September 2000
|
||||
* Korea exclusive
|
||||
* First version to feature the `Crazy` game mode
|
||||
* 14 new songs, 1 new remix
|
||||
* First game to introduce a non-unlockable songwheel
|
||||
|
||||
# Game modes
|
||||
* Easy
|
||||
* Hard
|
||||
* Crazy: Must be unlocked [using a code](#crazy-mode)
|
||||
* Double
|
||||
* Non-stop remix double: Needs to be unlocked [using a code](#non-stop-remix-double) which needs to be entered on the
|
||||
non-stop remix screen.
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
|
||||
When the second player joined by also pressing the center panel, battle modes is available on the mode select screen
|
||||
instead of double.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu (after selecting easy, hard, double, non-stop remix or battle) except
|
||||
the [non-stop remix double code](#non-stop-remix-double). When a code was entered successfully, a sound effect is
|
||||
played. For some modifiers, an icon is also displayed on left side of the screen for player 1 and on the right side of
|
||||
the screen for player 2.
|
||||
|
||||
### Velocity 2x
|
||||
Arrow scroll speed 2x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 4x
|
||||
Arrow scroll speed 4x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 8x
|
||||
Arrow scroll speed 8x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Synchro
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Couple
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Union
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Vanish
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Speed
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Non-stop remix double
|
||||
Must be entered on the non-step remix select screen.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Crazy mode
|
||||
Must be entered on the mode select screen. When entered successful, the "Non-stop remix" panel is replaced with "Crazy".
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,211 @@
|
||||
# Pump it Up: The Collection
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: November 2000
|
||||
* Korea exclusive
|
||||
* As the name implies, this game is a collection of all the songs of the past versions except for the song "Kiss"
|
||||
* Same interface as O.B.G SE
|
||||
* A total of 66 songs and 18 non-stop remixes
|
||||
|
||||
# Game modes
|
||||
* Easy
|
||||
* Hard
|
||||
* Crazy: Must be unlocked [using a code](#crazy-mode)
|
||||
* Double
|
||||
* Non-stop remix double: Needs to be unlocked [using a code](#non-stop-remix-double) which needs to be entered on the
|
||||
non-stop remix screen.
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
|
||||
When the second player joined by also pressing the center panel, battle modes is available on the mode select screen
|
||||
instead of double.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu (after selecting easy, hard, double, non-stop remix or battle) except
|
||||
the [non-stop remix double code](#non-stop-remix-double). When a code was entered successfully, a sound effect is
|
||||
played. For some modifiers, an icon is also displayed on left side of the screen for player 1 and on the right side of
|
||||
the screen for player 2.
|
||||
|
||||
### Velocity 2x
|
||||
Arrow scroll speed 2x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 4x
|
||||
Arrow scroll speed 4x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 8x
|
||||
Arrow scroll speed 8x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Synchro
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Couple
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Union
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Vanish
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Speed
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Non-stop remix double
|
||||
Must be entered on the non-step remix select screen.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Crazy mode
|
||||
Must be entered on the mode select screen. When entered successful, the "Non-stop remix" panel is replaced with "Crazy".
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,199 @@
|
||||
# Pump it Up: The Perfect Collection
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: December 2000
|
||||
* Korea exclusive
|
||||
* As the name implies, this game extends the previous version "The Collection" by adding 17 new songs
|
||||
* Game mode select re-designed to allow selecting `Crazy` mode without a code.
|
||||
* A total of 83 songs and 18 non-stop remixes
|
||||
|
||||
# Game modes
|
||||
* Easy
|
||||
* Hard
|
||||
* Crazy
|
||||
* Double
|
||||
* Non-stop remix double: Needs to be unlocked [using a code](#non-stop-remix-double) which needs to be entered on the
|
||||
non-stop remix screen.
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
|
||||
When the second player joined by also pressing the center panel, battle modes is available on the mode select screen
|
||||
instead of double.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu (after selecting easy, hard, double, non-stop remix or battle) except
|
||||
the [non-stop remix double code](#non-stop-remix-double). When a code was entered successfully, a sound effect is
|
||||
played. For some modifiers, an icon is also displayed on left side of the screen for player 1 and on the right side of
|
||||
the screen for player 2.
|
||||
|
||||
### Velocity 2x
|
||||
Arrow scroll speed 2x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 4x
|
||||
Arrow scroll speed 4x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 8x
|
||||
Arrow scroll speed 8x the BPM.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Synchro
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Couple
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Union
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Vanish
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Speed
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Non-stop remix double
|
||||
Must be entered on the non-step remix select screen.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,183 @@
|
||||
# Pump it Up Extra
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: February 2001
|
||||
* Korea exclusive
|
||||
* Crazy-mode was renamed to "Extra Expert" (XX)
|
||||
* Introduction of hold/long arrows
|
||||
* Double charts for Extra Expert and Non-stop Remix are available in the songwheel (no unlock code needed)
|
||||
* New interface and pad navigation
|
||||
* A game mode does not have to be selected prior selecting a song but can be switched on a per song basis
|
||||
* This version of the game was produced by F2System, a partner of Andamiro. F2System also produced Techno Motion
|
||||
* 58 songs and 9 non-stop remixes
|
||||
|
||||
# Game modes
|
||||
* Normal
|
||||
* Hard
|
||||
* Extra Expert
|
||||
* Double
|
||||
* Non-stop remix
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. When
|
||||
a modifier was activated, an icon is displayed either on the left side of the screen for player 1 and on the right side
|
||||
of the screen for player 2.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 2x, 4x, 8x
|
||||
Arrow scroll speed 2x, 4x or 8x the BPM. The following code must be entered one time for 2x, two times for 4x,
|
||||
three times for 8x.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Synchro
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Speed
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Vanish
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Rush
|
||||
???
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Noteskin select
|
||||
Select a different noteskin. For the blank (second to last arrow), fill in one of the four directions to get a different
|
||||
noteskin. There are two noteskin select codes.
|
||||
|
||||
#### Code 1
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
For blank:<br>
|
||||
: Star and moon<br>
|
||||
: UFO<br>
|
||||
: Snowman<br>
|
||||
: Restroom sign and poop (yep, poop)<br>
|
||||
|
||||
#### Code 2:
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
For blank:<br>
|
||||
: Octopus and fish<br>
|
||||
: Card<br>
|
||||
: Pineapple <br>
|
||||
: Disk jockey<br>
|
||||
@@ -0,0 +1,113 @@
|
||||
# Pump it Up The Premiere: The International Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: June 2001
|
||||
* First official international release
|
||||
* New interface
|
||||
* 87 songs
|
||||
|
||||
# Game modes
|
||||
* Normal
|
||||
* Hard
|
||||
* Crazy
|
||||
* Double
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. When
|
||||
a modifier was activated, an icon is displayed either on the left side of the screen for player 1 and on the right side
|
||||
of the screen for player 2.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Change arrow scroll speed
|
||||
Using the two codes below, you cycle through the following scroll speeds: off (1x), 2x, 4x, 8x, random
|
||||
Random changes the scroll speed during the song to any of the four speeds above.
|
||||
|
||||
#### Next/increase scroll speed
|
||||

|
||||

|
||||

|
||||
|
||||
#### Previous/decrease scroll speed
|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The steps fade out about halfway to the target.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Synchro
|
||||
When choosing a single player game mode and a second player joins, this plays the same step chart on the other players
|
||||
side. If this is not activated, no step chart is played for the second player.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Couple
|
||||
When choosing a single player game mode and a second player joins, this plays the same step chart on the other players
|
||||
side by mirrored along the "y axis". If this or [synchro](#synchro) is not activated, no step chart is played for the
|
||||
second player.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Vanish
|
||||
Steps are visible at the bottom of the screen, disappear midfield and re-appear before hitting the targets.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,112 @@
|
||||
# Pump it Up The PREX: The International Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: November 2001
|
||||
* PREX = The **PR**emiere and **EX**tra
|
||||
* 87 songs
|
||||
|
||||
# Game modes
|
||||
* Normal
|
||||
* Hard
|
||||
* Crazy
|
||||
* Double
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. When
|
||||
a modifier was activated, an icon is displayed either on the left side of the screen for player 1 and on the right side
|
||||
of the screen for player 2.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Change arrow scroll speed
|
||||
Using the two codes below, you cycle through the following scroll speeds: off (1x), 2x, 4x, 8x, random
|
||||
Random changes the scroll speed during the song to any of the four speeds above.
|
||||
|
||||
#### Next/increase scroll speed
|
||||

|
||||

|
||||

|
||||
|
||||
#### Previous/decrease scroll speed
|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The steps fade out about halfway to the target.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Synchro
|
||||
When choosing a single player game mode and a second player joins, this plays the same step chart on the other players
|
||||
side. If this is not activated, no step chart is played for the second player.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Couple
|
||||
When choosing a single player game mode and a second player joins, this plays the same step chart on the other players
|
||||
side by mirrored along the "y axis". If this or [synchro](#synchro) is not activated, no step chart is played for the
|
||||
second player.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Vanish
|
||||
Steps are visible at the bottom of the screen, disappear midfield and re-appear before hitting the targets.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,92 @@
|
||||
# Pump it Up The Rebirth: The 8th Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: January 2002
|
||||
* Korea exclusive version
|
||||
* 87 songs
|
||||
|
||||
# Game modes
|
||||
* Normal
|
||||
* Hard
|
||||
* Crazy
|
||||
* Double
|
||||
* Half-Double
|
||||
* Division
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. When
|
||||
a modifier was activated, an icon is displayed either on the left side of the screen for player 1 and on the right side
|
||||
of the screen for player 2.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
#### Change arrow scroll speed: Next/increase scroll speed
|
||||
Using this code to cycle through the following scroll speeds: off (1x), 2x, 3x, 4x.
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
#### Random arrow scroll speed
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
#### Change difficulty
|
||||
Allows you to change the difficulty on the song select screen.
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The steps fade out about halfway to the target.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,92 @@
|
||||
# Pump it Up The Premiere 2: The International 2nd Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: March 2002
|
||||
* International version of Rebirth
|
||||
* 102 songs
|
||||
|
||||
# Game modes
|
||||
* Normal
|
||||
* Hard
|
||||
* Crazy
|
||||
* Double
|
||||
* Half-Double
|
||||
* Division
|
||||
* Battle: When player 2 joins in the mode select screen, battle mode becomes visible by replacing double mode.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. When
|
||||
a modifier was activated, an icon is displayed either on the left side of the screen for player 1 and on the right side
|
||||
of the screen for player 2.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
#### Change arrow scroll speed: Next/increase scroll speed
|
||||
Using this code to cycle through the following scroll speeds: off (1x), 2x, 3x, 4x.
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
#### Random arrow scroll speed
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
#### Change difficulty
|
||||
Allows you to change the difficulty on the song select screen.
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The steps fade out about halfway to the target.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||
All steps are mirrored along the "x axis", i.e. arrows <br>
|
||||
 <-> 
|
||||
<br>and<br>
|
||||
 <-> 
|
||||
<br> are switched.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,98 @@
|
||||
# Pump it Up The PREX 2
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: November 2002
|
||||
* 93 songs
|
||||
|
||||
# Game modes/difficulties
|
||||
* Normal
|
||||
* Hard
|
||||
* Crazy
|
||||
* Double
|
||||
* Battle: Can be selected once player 2 joined the game
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. For
|
||||
some modifiers, an icon is also displayed on left side of the screen for player 1 and on the right side of the screen
|
||||
for player 2.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 2x, 3x, 4x
|
||||
Arrow scroll speed 2x, 3x or 4x or 8x the BPM. The following code must be entered one time for 2x, two times for 3x and
|
||||
three times for 4x.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Velocity
|
||||
The arrow scroll speed changes randomly during the song.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,99 @@
|
||||
# Pump it Up The Premiere 3: The International 3rd Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: May 2003
|
||||
* 56 songs
|
||||
|
||||
# Game modes/difficulties
|
||||
* Normal
|
||||
* Hard
|
||||
* Crazy
|
||||
* Double
|
||||
* Half-Double
|
||||
* Battle: Can be selected once player 2 joined the game
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. For
|
||||
some modifiers, an icon is also displayed on left side of the screen for player 1 and on the right side of the screen
|
||||
for player 2.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 2x, 3x, 4x
|
||||
Arrow scroll speed 2x, 3x or 4x or 8x the BPM. The following code must be entered one time for 2x, two times for 3x and
|
||||
three times for 4x.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Velocity
|
||||
The arrow scroll speed changes randomly during the song.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,100 @@
|
||||
# Pump it Up The PREX 3: The International 4th Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: October 2003
|
||||
* 77 songs
|
||||
|
||||
# Game modes/difficulties
|
||||
* Normal
|
||||
* Hard
|
||||
* Crazy
|
||||
* Freestyle
|
||||
* Nightmare
|
||||
* Half-Double
|
||||
* Battle: Can be selected once player 2 joined the game
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. For
|
||||
some modifiers, an icon is also displayed on left side of the screen for player 1 and on the right side of the screen
|
||||
for player 2.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 2x, 3x, 4x
|
||||
Arrow scroll speed 2x, 3x or 4x or 8x the BPM. The following code must be entered one time for 2x, two times for 3x and
|
||||
three times for 4x.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Velocity
|
||||
The arrow scroll speed changes randomly during the song.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,145 @@
|
||||
# Pump it Up Exceed: The International 5th Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: April 2004
|
||||
* First game to run on Linux and MK5 hardware
|
||||
* 24 new songs
|
||||
* 102 songs total
|
||||
* Songs are separated into channels: Banya, Pop and K-Pop
|
||||
* Three hidden songs that have to be [unlocked using a code](#hidden-songs-unlock)
|
||||
|
||||
# Game modes/difficulties
|
||||
* Normal
|
||||
* Hard
|
||||
* Crazy
|
||||
* Freestyle
|
||||
* Nightmare
|
||||
* Battle: Can be selected once player 2 joined the game
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. For
|
||||
some modifiers, an icon is also displayed on left side of the screen for player 1 and on the right side of the screen
|
||||
for player 2.
|
||||
|
||||
### Hidden songs unlock
|
||||
This code unlocks the following songs:
|
||||
* Monkey Fingers
|
||||
* Oh Rosa (same song/steps on the select screen but music switchd to spanish version)
|
||||
* First Love (same song/steps on the select screen but music switchd to spanish version)
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 2x, 3x, 4x
|
||||
Arrow scroll speed 2x, 3x, 4x or 8x the BPM. The following code must be entered one time for 2x, two times for 3x,
|
||||
three times for 4x and four times for 8x.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Velocity
|
||||
The arrow scroll speed changes randomly during the song.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Earthworm
|
||||
Makes the arrows wave back and fourth as they scroll to the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Exceed Mode
|
||||
Arrows travel diagonally towards the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,295 @@
|
||||
# Pump it Up Exceed 2: The International 6th Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: November 2004
|
||||
* First game to run on Linux, MK6 hardware and the USB PIUIO
|
||||
* 18 new songs
|
||||
* 136 songs total
|
||||
* Based on Exceed's interface
|
||||
|
||||
# Game modes/difficulties
|
||||
* Normal
|
||||
* Hard
|
||||
* Crazy
|
||||
* Freestyle
|
||||
* Nightmare
|
||||
* Battle: Can be selected once player 2 joined the game
|
||||
* Remix Station
|
||||
|
||||
## Game play unlocks
|
||||
The following songs are unlockable by fulfilling the described conditions.
|
||||
|
||||
### Arcade station: Canon-D, nightmare
|
||||
Naturally, this only works as a single player. This unlock is not permanent.
|
||||
|
||||
1. Select arcade station
|
||||
1. Play any two songs and get an A ranking on both
|
||||
1. Play "I'll Give You All My Love" on crazy difficulty as your 3rd song and get an A ranking with less than 10 misses
|
||||
1. You will receive a bonus stage and the nightmare difficulty on Canon-D is unlocked
|
||||
|
||||
### Remix station: 2nd Hidden Remix, nightmare
|
||||
Naturally, this only works as a single player. This unlock is only temporary.
|
||||
|
||||
1. Select remix station
|
||||
1. Play "Diva Remix" on freestyle difficult and get an S ranking
|
||||
1. The nightmare difficulty on "2nd Hidden Remix" is unlocked
|
||||
|
||||
### Remix station: Raw, nightmare
|
||||
Raw (as it's known) is the same song (and background movie) as the opening movie of Exceed 2. Auto-fail (Stage Break)
|
||||
is not on during this song, and the game will not stop if you get a 50+ miss combo. This song is not a selectable song
|
||||
(ever), and you cannot choose your modifiers or difficulties before this song, as the game will bleed into it after your
|
||||
last remix song and will start automatically after giving you a greeting screen for the song. It is set on double mode.
|
||||
|
||||
This unlock is not permanent.
|
||||
|
||||
1. Select remix station
|
||||
1. Play any remix songs and get an S ranking on all of them
|
||||
1. The game automatically starts the song "Raw" as your last song
|
||||
|
||||
### Remix station: Banya Classic Remix, nightmare
|
||||
Naturally, this only works as a single player. This unlock is only temporary.
|
||||
|
||||
1. Select remix station
|
||||
1. Play "Deux Remix" on fresstyle and get an S ranking
|
||||
1. The nightmare difficulty on "Banya Classic Remix" is unlocked
|
||||
|
||||
### Remix station: Dignity Remix, crazy
|
||||
Naturally, this only works as a single player. This unlock is only temporary.
|
||||
|
||||
1. Select remix station
|
||||
1. Play "Banya Classic Remix" on hard and get an S ranking with a full combo
|
||||
1. The crazy difficulty on "Dignity Remix" is unlocked
|
||||
|
||||
### Remix station: Treme Vook of the War Another
|
||||
Naturally, this only works as a single player. This unlock is only temporary.
|
||||
|
||||
1. Select remix station
|
||||
1. Play "Treme Vook of the War" on crazy and get an A ranking
|
||||
1. The songs "Treme Vook of the War Another" is unlocked
|
||||
|
||||
### Remix station: Turbo Remix, nightmare
|
||||
Naturally, this only works as a single player. This unlock is only temporary.
|
||||
|
||||
1. Select remix station
|
||||
1. Play "Diva Remix" on crazy and get an S ranking, without any goods or bads
|
||||
1. The nightmare difficulty on "Turbo Remix" is unlocked
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. For
|
||||
some modifiers, an icon is also displayed on left side of the screen for player 1 and on the right side of the screen
|
||||
for player 2.
|
||||
|
||||
### Unlock: Solitary 2
|
||||
This code unlocks the song "Solitary 2" and must be entered in the song select menu. When entered correctly, the song
|
||||
appears immediately. This unlock is only temporary.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Unlock: Canon-D Full Mix
|
||||
This code unlocks the song "Canon-D Full Mix" and must be entered on the select screen of the **Remix Station**. When
|
||||
entered correctly. This unlock is permanent.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 2x, 3x, 4x, 8x
|
||||
Arrow scroll speed 2x, 3x, 4x or 8x the BPM. The following code must be entered one time for 2x, two times for 3x,
|
||||
three times for 4x and four times for 8x.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Velocity
|
||||
The arrow scroll speed changes randomly during the song.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Earthworm
|
||||
Makes the arrows wave back and fourth as they scroll to the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Exceed Mode
|
||||
Arrows travel diagonally towards the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Freedom
|
||||
Stationary arrows at the top are invisible.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Acceleration
|
||||
Arrows start scrolling slowly at the bottom of the screen and accelerate when scrolling towards the top stationary
|
||||
arrows.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Deceleration
|
||||
Arrows start scrolling fast at the bottom of the screen and decelerate when scrolling towards the top stationary
|
||||
arrows.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Extra mix noteskin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Flower card noteskin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,312 @@
|
||||
# Pump it Up Zero: International 7th Dance Floor
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: February 2006
|
||||
* Entirely new interface. First mix to feature BG video preview playback on the song select screen. Furthermore, when
|
||||
playing with a second player, each player can select a different difficulty level.
|
||||
* 130 songs total
|
||||
|
||||
# Game modes
|
||||
* Arcade Station: Separated into 4 channels. Each channel contains songs with chart difficulties Normal, Hard, Crazy, Freestyle,
|
||||
Nightmare
|
||||
* Banya
|
||||
* K-Pop
|
||||
* Pop
|
||||
* Another: Many songs/charts of this channel must be unlocked, first.
|
||||
* Easy Station
|
||||
* Remix Station
|
||||
* Mission Station: Clear missions to unlock content
|
||||
|
||||
## Game play unlocks
|
||||
The game has an internal point system. Points are earned by simply playing the game, passing songs etc. A lot of
|
||||
content can be unlocked using this point system. However, certain content is bound to specific missions and cannot be
|
||||
unlocked by earning points.
|
||||
|
||||
### Point unlocks
|
||||
These are either unlocked by just playing the game or once a certain mission becomes available.
|
||||
|
||||
* Eres Para Mi - Another Freestyle - unlocked upon unlock of Another station
|
||||
* Final Audition 2 - Another Crazy - unlocked upon unlock of Another station
|
||||
* Final Audition 3 U.F - Another Nightmare - unlocked upon unlock of Another station
|
||||
* Mexi Mexi - Another Nightmare - unlocked upon unlock of Another station
|
||||
* My Friend - Another Freestyle - unlocked upon unlock of Another station
|
||||
* Solitary 2 - Another Crazy - unlocked upon unlock of Another station
|
||||
* Extravaganza - Another Crazy - time/point-release unlock - after opening of mission 7
|
||||
* Final Audition 2 - Another Nightmare - time/point-release unlock - after opening of mission 11
|
||||
* Love is a Danger Zone 2 - Another Hard - time/point-release unlock - after opening of mission 13
|
||||
* Love is a Danger Zone 2 - Another Crazy - time/point-release unlock - after opening of mission 13
|
||||
* Love is a Danger Zone 2 - Another Nightmare - time/point-release unlock - after opening of mission 13
|
||||
* Naissance 2 - Another Nightmare - time/point-release unlock - after opening of mission 15
|
||||
* Final Audition - Another Nightmare - time/point-release unlock - after opening of mission 17
|
||||
* Do it Yourself - Another Nightmare - time/point-release unlock - after opening of mission 19
|
||||
* Solitary 2 - Another Nightmare - time/point-release unlock - after opening of mission 21
|
||||
* Mr. Larpus - Another Nightmare - time/point-release unlock - after opening of mission 23
|
||||
* Extravaganza - Another Nightmare - time/point-release unlock - after opening of mission 25
|
||||
* Another Truth - Another Nightmare - time/point-release unlock - after opening of mission 27
|
||||
* Witch Doctor - Another Nightmare - time/point-release unlock - after opening of mission 29
|
||||
|
||||
### Mission station unlocks
|
||||
The following songs/step charts can only be unlocked by unlocking specific missions.
|
||||
|
||||
* [New arrow skin](#new-arrow-skin) - clear mission 9
|
||||
* [Music note skin](#musical-note-skin) - clear mission 10
|
||||
* [Extra mix skin](#extra-mix-skin) - clear mission 11
|
||||
* [Grade reverse modifier](#grade-reverse) - clear mission 12
|
||||
* Love is a Danger Zone - Another Freestyle - mission unlock (mission 16)
|
||||
* Love is a Danger Zone - Another Nightmare - mission unlock (mission 16)
|
||||
* Witch Doctor - Another Crazy - mission unlock (mission 17)
|
||||
* [Canon-D eye skin](#canon-d-eye-skin) - clear mission 18
|
||||
* Final Audition - Another Crazy - mission unlock (mission 19)
|
||||
* Join The Party - Another Nightmare - mission unlock (mission 20)
|
||||
* [Flower card skin](#flower-card-skin) - clear mission 24
|
||||
* Circus Magic - Another Nightmare - mission unlock (mission 26), note: only mode playable for this song in the entire
|
||||
game
|
||||
* Vook - Another Freestyle - mission unlock (mission 27)
|
||||
* Vook - Another Nightmare - mission unlock (mission 27)
|
||||
* I'll Give You All My Love - Another Nightmare - mission unlock (mission 28)
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. An
|
||||
icon on the left/right side of the screen indicates if the modifier is active for player 1/2.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 2x, 3x, 4x, 8x
|
||||
Arrow scroll speed 2x, 3x, 4x or 8x the BPM. The following code must be entered one time for 2x, two times for 3x,
|
||||
three times for 4x and four times for 8x.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Velocity
|
||||
The arrow scroll speed changes randomly during the song.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Earthworm
|
||||
Makes the arrows wave back and fourth as they scroll to the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Exceed Mode
|
||||
Arrows travel diagonally towards the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Freedom
|
||||
Stationary arrows at the top are invisible.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Acceleration
|
||||
Arrows start scrolling slowly at the bottom of the screen and accelerate when scrolling towards the top stationary
|
||||
arrows.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Deceleration
|
||||
Arrows start scrolling fast at the bottom of the screen and decelerate when scrolling towards the top stationary
|
||||
arrows.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Battle mode
|
||||
In arcade station, player 2 must have joined that the game shows "1P + 2P mode" at the top left. Entering the code
|
||||
below actives battle mode and shows "1P VS. 2P mode" at the top left.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Grade reverse
|
||||
Shows inverse judgements during game play, i.e. perfect = miss, great = bad
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### New arrow skin
|
||||
Requirement: Clear mission 9
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Musical note skin
|
||||
Requirement: Clear mission 10
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Extra mix skin
|
||||
Requirement: Clear mission 11
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Canon-D eye skin
|
||||
Requirement: Clear mission 18
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Flower card skin
|
||||
Requirement: Clear mission 24
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,281 @@
|
||||
# Pump it Up NX: New Xenesis
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: December 2006
|
||||
|
||||
# Game modes
|
||||
* Arcade Station: Separated into 3 channels. Each channel contains songs with chart difficulties Normal, Hard, Crazy,
|
||||
Freestyle, Nightmare
|
||||
* New Tunes
|
||||
* Banya
|
||||
* K-Pop
|
||||
* Pop
|
||||
* Training Station
|
||||
* Special Station: Full versions, remixes and another step (charts)
|
||||
* World Tour: Clear missions to unlock further locked missions and content in Special Station
|
||||
|
||||
## Game play unlocks
|
||||
The song *Final Audition Episode 2-2* is the only locked song in the whole game. This song can be unlocked by playing
|
||||
the song *Final Audition Episode 2-1* 100 times. You do not have to pass the song, failing the song also counts
|
||||
towards this play count.
|
||||
|
||||
Clearing missions in World Tour unlocks further missions and content in Special Zone. However, all locked content of
|
||||
World Tour and Special Station is also unlocked when the total play count on the machine reaches about 20000 plays.
|
||||
|
||||
## Unlock and modifier codes
|
||||
All codes must be entered in the song select menu. When a code was entered successfully, a sound effect is played. An
|
||||
icon on the left/right side of the screen indicates if the modifier is active for player 1/2. These codes do not work
|
||||
on World Tour (Station).
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Velocity 2x, 3x, 4x, 8x
|
||||
Arrow scroll speed 2x, 3x, 4x or 8x the BPM. The following code must be entered one time for 2x, two times for 3x,
|
||||
three times for 4x and four times for 8x.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Velocity
|
||||
The arrow scroll speed changes randomly during the song.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Earthworm
|
||||
Makes the arrows wave back and fourth as they scroll to the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Exceed Mode
|
||||
Arrows travel diagonally towards the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Freedom
|
||||
Stationary arrows at the top are invisible.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Acceleration
|
||||
Arrows start scrolling slowly at the bottom of the screen and accelerate when scrolling towards the top stationary
|
||||
arrows.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Deceleration
|
||||
Arrows start scrolling fast at the bottom of the screen and decelerate when scrolling towards the top stationary
|
||||
arrows.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Battle mode
|
||||
In arcade station, player 2 must have joined that the game shows "1P + 2P mode" at the top left. Entering the code
|
||||
below actives battle mode and shows "1P VS. 2P mode" at the top left.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Under attack
|
||||
Point mirror the target (grey) area with the center of the screen as the origin. This results in the P1 target area
|
||||
positioned upside down in bottom right corner and the P2 target area positioned upside down in the bottom left corner.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Flash
|
||||
Arrows are disappearing and appearing in short intervals ("flashing") when moving towards the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### NX mode
|
||||
Tilts the perspective of the arrows scrolling towards the targets from an "overhead" perspective to a "distant"
|
||||
perspective.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Grade reverse
|
||||
Shows inverse judgements during game play, i.e. perfect = miss, great = bad
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
### Extra mix skin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Canon-D eye skin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Flower card skin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,295 @@
|
||||
# Pump it Up NX2: Next Xenesis
|
||||
This document collects various information about the game itself.
|
||||
|
||||
## Trivia
|
||||
* Release: October 2007
|
||||
* First version to allow storing player scores and unlock state on a usb thumb drive. The original game only allows
|
||||
special brand of usb thumb drives. Other drives are not accepted by the game. Profiles were managed and uploaded by
|
||||
the player using a proprietary software called "PUMBI" which is no longer supported.
|
||||
|
||||
# Game modes
|
||||
* Arcade Station: Separated into 3 channels. Each channel contains songs with chart difficulties Normal, Hard, Crazy,
|
||||
Freestyle, Nightmare
|
||||
* New Tunes
|
||||
* Banya
|
||||
* K-Pop
|
||||
* Pop
|
||||
* Training Station
|
||||
* Special Station: Full versions, remixes and another step (charts)
|
||||
* World Max: Clear missions to unlock further locked missions and content in Special Station
|
||||
|
||||
## World max guide and unlocks
|
||||
Either take a look at the `missions.txt` file in the `game` data folder or use [Turkeyslam's guide](guide/nx2.pdf) which
|
||||
was published on ph-online back in the days.
|
||||
|
||||
### Cancel
|
||||
Clear all modifiers previously enabled.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Increase arrow scroll speed
|
||||
Arrow scroll speed 2x, 3x, 4x or 8x the BPM. The following code must be entered one time for 2x, two times for 3x,
|
||||
three times for 4x and four times for 8x.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Decrease arrow scroll speed
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Vanish
|
||||
The arrows vanish before reaching the target at the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Nonstep
|
||||
Hide all steps.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Mirror
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Step
|
||||
Randomizes the step chart.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random Velocity
|
||||
The arrow scroll speed changes randomly during the song.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Earthworm
|
||||
Makes the arrows wave back and fourth as they scroll to the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Exceed Mode
|
||||
Arrows travel diagonally towards the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Freedom
|
||||
Stationary arrows at the top are invisible.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Acceleration
|
||||
Arrows start scrolling slowly at the bottom of the screen and accelerate when scrolling towards the top stationary
|
||||
arrows.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Deceleration
|
||||
Arrows start scrolling fast at the bottom of the screen and decelerate when scrolling towards the top stationary
|
||||
arrows.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Under attack
|
||||
Point mirror the target (grey) area with the center of the screen as the origin. This results in the P1 target area
|
||||
positioned upside down in bottom right corner and the P2 target area positioned upside down in the bottom left corner.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Flash
|
||||
Arrows are disappearing and appearing in short intervals ("flashing") when moving towards the top.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### NX mode
|
||||
Tilts the perspective of the arrows scrolling towards the targets from an "overhead" perspective to a "distant"
|
||||
perspective.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Grade reverse
|
||||
Shows inverse judgements during game play, i.e. perfect = miss, great = bad
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
### Extra mix skin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Canon-D eye skin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Flower card skin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Playing card skin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Random skin
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
@@ -0,0 +1,23 @@
|
||||
# Game Documentations
|
||||
This kind of documentation provides various information about the game itself like some trivia, available features like
|
||||
game modes, unlock and modifier codes etc.
|
||||
|
||||
* [The 1st Dance Floor](01-1st.md)
|
||||
* [The 2nd Dance Floor](02-2nd.md)
|
||||
* [The O.B.G: The 3rd Dance Floor](03-3rd.md)
|
||||
* [The O.B.G: The Season Evolution Dance Floor](04-3se.md)
|
||||
* [The Collection](05-tc.md)
|
||||
* [The Perfect Collection](06-pc.md)
|
||||
* [Extra](07-extra.md)
|
||||
* [The Premiere: The International Dance Floor](08-prem1.md)
|
||||
* [The PREX: The International Dance Floor](09-prex1.md)
|
||||
* [The Rebirth: The 8th Dance Floor](10-reb.md)
|
||||
* [The Premiere 2: The International 2nd Dance Floor](11-prem2.md)
|
||||
* [The PREX 2](12-prex2.md)
|
||||
* [The Premiere 3: The International 3rd Dance Floor](13-prem3.md)
|
||||
* [The PREX 3: The International 4th Dance Floor](14-prex3.md)
|
||||
* [Exceed: The International 5th Dance Floor](15-exc.md)
|
||||
* [Exceed 2: The International 6th Dance Floor](16-exc2.md)
|
||||
* [Pump it Up Zero: International 7th Dance Floor](17-zero.md)
|
||||
* [Pump it Up NX: New Xenesis](18-nx.md)
|
||||
* [Pump it Up NX2: Next Xenesis](20-nx2.md)
|
||||
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
@@ -0,0 +1,54 @@
|
||||
# exchook: Exceed
|
||||
This readme covers any matters that are relevant for this hook, only. Anything that applies to **all** hooks is covered
|
||||
in a [main hook readme file](../hook.md) including general data setup and a quick start guide.
|
||||
|
||||
## Additional notable features
|
||||
* Full MK5IO emulation with API hook: Keyboard, MK6 PIUIO or your own custom IO
|
||||
* Fixed infamous hold glitch, i.e. make the damn game playable, finally
|
||||
|
||||
## Versions supported
|
||||
* 20040325
|
||||
* 20040408
|
||||
|
||||
Any other version won't work, period. Pumptools has to memory patch various things like I/O because hooking them is not
|
||||
possible (at least not right now).
|
||||
|
||||
## Dependencies
|
||||
Make sure to read the different methods of dependency resolution available in the [main hook readme file](../hook.md),
|
||||
first.
|
||||
|
||||
The following **direct** dependencies (cmd: `readelf -d piu`) are required:
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libpthread.so.0
|
||||
* libasound.so.2
|
||||
* libz.so.1
|
||||
* libpng12.so.0
|
||||
* libc.so.6
|
||||
* libm.so.6
|
||||
* libX11.so.6
|
||||
* libstdc++.so.5
|
||||
|
||||
Additionally, when using `piuio.so`, you need the following library as well:
|
||||
* libusb-1.0.so.0
|
||||
|
||||
As for method 1, when using Ubuntu, the dependencies can be found in the following packages:
|
||||
* libc-bin (or gcc-multilib on a 64-bit platform)
|
||||
* libusb-1.0-0
|
||||
* libx11-6
|
||||
* zlib1g
|
||||
* libasound2
|
||||
|
||||
## Data setup
|
||||
In additional to the [general information applying to **all** hooks](../hook.md#data-setup), this game requires all
|
||||
files and folders in the `game` folder to be in **UPPERCASE** on a case-sensitive file system.
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
Make sure to also check the
|
||||
[troubleshooting and FAQ section of the main hook readme](../hook.md#troubleshooting-and-faq). This covers various
|
||||
things that apply to **all** hooks. The following sub-sections apply mainly to this hook.
|
||||
|
||||
### The game crashes when using the sound device hw:0
|
||||
The game's sound manager relies on hardware mixing using the same device which is not supported by newer versions of
|
||||
alsa anymore. Instead, you have to use software mixing using the `dmix` device,
|
||||
[see here](#the-game's-music-plays-too-fast-or-sounds-weird).
|
||||
@@ -0,0 +1,96 @@
|
||||
# Notable features
|
||||
|
||||
* Runs on recent kernel versions thanks to various fixes
|
||||
* Runs on 32-bit and 64-bit distros (64-bit distros require additional 32-bit libs to be installed)
|
||||
* Full dongle emulation
|
||||
* Remove HDD checks to run this on "non legit" drives
|
||||
* Full MK6IO emulation with API hook: Keyboard or your own custom IO
|
||||
* Real IO passthrough (for MK6 usb io)
|
||||
|
||||
# Versions supported
|
||||
All known versions supported.
|
||||
|
||||
# Data setup
|
||||
You are expected to get a clean set of data from a prestine drive. Ensure that
|
||||
the game version matches one of the supported versions listed.
|
||||
|
||||
You need two main folders:
|
||||
* data
|
||||
* settings
|
||||
|
||||
## Data folder
|
||||
Contents of the folder:
|
||||
* game: The binaries of the custom "AMFS". File names must be lower case.
|
||||
* lib: Put any libraries (especially older versions of libraries that can't be
|
||||
installed anymore using the package manager) the game uses and aren't installed
|
||||
on your system in here.
|
||||
* piu: The piu executable
|
||||
|
||||
## Settings folder
|
||||
The contents of the folder are auto generated if the files don't exist.
|
||||
Otherwise, this folder contains:
|
||||
* PIUFESTA2.INI
|
||||
* RANK.DATA
|
||||
|
||||
## Executable dependencies
|
||||
All dependencies must be compiled as 32-bit binaries. Here is a list of
|
||||
dependencies (with versions) required to run the game:
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libasound.so.2
|
||||
* libusb-0.1.so.4
|
||||
* libmad.so.0
|
||||
* libmpeg2.so.0
|
||||
* libmpeg2convert.so.0
|
||||
* libftgl.so.2
|
||||
* libstdc++.so.6
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libm.so.6
|
||||
* libX11.so.6
|
||||
* libpthread.so.0
|
||||
* libdl.so.2
|
||||
* librt.so.1
|
||||
* libnvidia-tls.so.340.96
|
||||
* libnvidia-glcore.so.340.96
|
||||
* libXext.so.6
|
||||
* libusb-1.0.so.0
|
||||
* libfreetype.so.6
|
||||
* libxcb.so.1
|
||||
* libudev.so.1
|
||||
* libz.so.1
|
||||
* libbz2.so.1.0
|
||||
* libpng16.so.16
|
||||
* libharfbuzz.so.0
|
||||
* libXau.so.6
|
||||
* libXdmcp.so.6
|
||||
* libcap.so.2
|
||||
* libresolv.so.2
|
||||
* libglib-2.0.so.0
|
||||
* libgraphite2.so.3
|
||||
* libpcre.so.1
|
||||
|
||||
# Hook module configuration file
|
||||
Checkout the usage information of the hook and set the option values according
|
||||
to your needs. Here is an example option configuration file:
|
||||
```
|
||||
log_file_path=/tmp/pumptools.log
|
||||
log_level=3
|
||||
enable_file_monitor=0
|
||||
enable_io_monitor=0
|
||||
piuio_emu_lib_path=/pumptools/lib/piuio-emu.so
|
||||
piuio_exit_test_service=1
|
||||
game_settings_path=/save/f2
|
||||
sound_device=hw:0
|
||||
keyboard_dev=/dev/input/by-id/usb-Logitech_USB_Receiver-if02-event-mouse
|
||||
halt_on_segv=0
|
||||
```
|
||||
|
||||
# Run the game
|
||||
Ensure you are running an X screen. Otherwise, you have to start one along with the game. Various library/system-calls
|
||||
require root privileges. Make sure to run the game as root or with sudo (otherwise you get various sorts of errors,
|
||||
typically permission denied). Use the included *run.sh* file to start the game on a desktop environment.
|
||||
|
||||
# Further notes
|
||||
## Vsync
|
||||
The game is required to run with vsync on.
|
||||
@@ -0,0 +1,88 @@
|
||||
# Notable features
|
||||
|
||||
* Runs on recent kernel versions thanks to various fixes
|
||||
* Runs on 32-bit and 64-bit distros (64-bit distros require additional 32-bit libs to be installed)
|
||||
* Full dongle emulation
|
||||
* Remove HDD checks to run this on "non legit" drives
|
||||
* Full MK6IO emulation with API hook: Keyboard or your own custom IO
|
||||
* Real IO passthrough (for MK6 usb io)
|
||||
|
||||
# Versions supported
|
||||
All known versions supported.
|
||||
|
||||
# Data setup
|
||||
You are expected to get a clean set of data from a prestine drive. Ensure that
|
||||
the game version matches one of the supported versions listed.
|
||||
|
||||
You need two main folders:
|
||||
* data
|
||||
* settings
|
||||
|
||||
## Data folder
|
||||
Contents of the folder:
|
||||
* game: The binaries of the custom "Fiesta FS". These are stored in raw areas
|
||||
of the HDD and have to be extraced. File names must be lower case.
|
||||
* lib: Put any libraries (especially older versions of libraries that can't be
|
||||
installed anymore using the package manager) the game uses and aren't installed
|
||||
on your system in here.
|
||||
* piu: The piu executable
|
||||
|
||||
## Settings folder
|
||||
The contents of the folder are auto generated if the files don't exist.
|
||||
Otherwise, this folder contains:
|
||||
* PIUFESTAEX.INI
|
||||
* RANK.DATA
|
||||
|
||||
## Executable dependencies
|
||||
All dependencies must be compiled as 32-bit binaries. Here is a list of
|
||||
dependencies (with versions) required to run the game:
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libasound.so.2
|
||||
* libusb-0.1.so.4
|
||||
* libmad.so.0
|
||||
* libmpeg2.so.0
|
||||
* libmpeg2convert.so.0
|
||||
* libstdc++.so.6
|
||||
* libm.so.6
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libX11.so.6
|
||||
* libpthread.so.0
|
||||
* libdl.so.2
|
||||
* librt.so.1
|
||||
* libnvidia-tls.so.340.96
|
||||
* libnvidia-glcore.so.340.96
|
||||
* libXext.so.6
|
||||
* libusb-1.0.so.0
|
||||
* libxcb.so.1
|
||||
* libudev.so.1
|
||||
* libXau.so.6
|
||||
* libXdmcp.so.6
|
||||
* libcap.so.2
|
||||
* libresolv.so.2
|
||||
|
||||
# Hook module configuration file
|
||||
Checkout the usage information of the hook and set the option values according
|
||||
to your needs. Here is an example option configuration file:
|
||||
```
|
||||
log_file_path=/tmp/pumptools.log
|
||||
log_level=3
|
||||
enable_file_monitor=0
|
||||
enable_io_monitor=0
|
||||
piuio_emu_lib_path=/pumptools/lib/piuio-emu.so
|
||||
piuio_exit_test_service=1
|
||||
game_settings_path=/save/fex
|
||||
sound_device=hw:0
|
||||
keyboard_dev=/dev/input/by-id/usb-Logitech_USB_Receiver-if02-event-mouse
|
||||
halt_on_segv=0
|
||||
```
|
||||
|
||||
# Run the game
|
||||
Ensure you are running an X screen. Otherwise, you have to start one along with the game. Various library/system-calls
|
||||
require root privileges. Make sure to run the game as root or with sudo (otherwise you get various sorts of errors,
|
||||
typically permission denied). Use the included *run.sh* file to start the game on a desktop environment.
|
||||
|
||||
# Further notes
|
||||
## Vsync
|
||||
The game is required to run with vsync on.
|
||||
@@ -0,0 +1,89 @@
|
||||
# Notable features
|
||||
|
||||
* Runs on recent kernel versions thanks to various fixes
|
||||
* Runs on 32-bit and 64-bit distros (64-bit distros require additional 32-bit libs to be installed)
|
||||
* Full dongle emulation
|
||||
* Remove HDD checks to run this on "non legit" drives
|
||||
* Full MK6IO emulation with API hook: Keyboard or your own custom IO
|
||||
* Real IO passthrough (for MK6 usb io)
|
||||
|
||||
# Versions supported
|
||||
All known versions supported.
|
||||
|
||||
# Data setup
|
||||
You are expected to get a clean set of data from a prestine drive. Ensure that
|
||||
the game version matches one of the supported versions listed.
|
||||
|
||||
You need two main folders:
|
||||
* data
|
||||
* settings
|
||||
|
||||
## Data folder
|
||||
Contents of the folder:
|
||||
* game: The binaries of the custom "Fiesta FS". These are stored in raw areas
|
||||
of the HDD and have to be extraced. File names must be lower case.
|
||||
* lib: Put any libraries (especially older versions of libraries that can't be
|
||||
installed anymore using the package manager) the game uses and aren't installed
|
||||
on your system in here.
|
||||
* piu: The piu executable
|
||||
|
||||
## Settings folder
|
||||
The contents of the folder are auto generated if the files don't exist.
|
||||
Otherwise, this folder contains:
|
||||
* PIUFESTA.INI
|
||||
* RANK.DATA
|
||||
|
||||
## Executable dependencies
|
||||
All dependencies must be compiled as 32-bit binaries. Here is a list of
|
||||
dependencies (with versions) required to run the game:
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libasound.so.2
|
||||
* libusb-0.1.so.4
|
||||
* libmad.so.0
|
||||
* libmpeg2.so.0
|
||||
* libmpeg2convert.so.0
|
||||
* libstdc++.so.6
|
||||
* libm.so.6
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libX11.so.6
|
||||
* libpthread.so.0
|
||||
* libdl.so.2
|
||||
* librt.so.1
|
||||
* libnvidia-tls.so.340.96
|
||||
* libnvidia-glcore.so.340.96
|
||||
* libXext.so.6
|
||||
* libusb-1.0.so.0
|
||||
* libxcb.so.1
|
||||
* libudev.so.1
|
||||
* libXau.so.6
|
||||
* libXdmcp.so.6
|
||||
* libcap.so.2
|
||||
* libresolv.so.2
|
||||
|
||||
# Hook module configuration file
|
||||
Checkout the usage information of the hook and set the option values according
|
||||
to your needs. Here is an example option configuration file:
|
||||
```
|
||||
log_file_path=/tmp/pumptools.log
|
||||
log_level=3
|
||||
enable_file_monitor=0
|
||||
enable_io_monitor=0
|
||||
piuio_emu_lib_path=/pumptools/lib/piuio-emu.so
|
||||
piuio_exit_test_service=1
|
||||
game_settings_path=/save/fst
|
||||
sound_device=hw:0
|
||||
keyboard_dev=/dev/input/by-id/usb-Logitech_USB_Receiver-if02-event-mouse
|
||||
halt_on_segv=0
|
||||
```
|
||||
|
||||
# Run the game
|
||||
Ensure you are running an X screen. Run the game using
|
||||
Ensure you are running an X screen. Otherwise, you have to start one along with the game. Various library/system-calls
|
||||
require root privileges. Make sure to run the game as root or with sudo (otherwise you get various sorts of errors,
|
||||
typically permission denied). Use the included *run.sh* file to start the game on a desktop environment.
|
||||
|
||||
# Further notes
|
||||
## Vsync
|
||||
The game is required to run with vsync on.
|
||||
@@ -0,0 +1,201 @@
|
||||
# Pumptool's hook libraries
|
||||
A collection of libraries that need to be pre-loaded when running vanilla dumps of Pump It Up games. These hooks allow
|
||||
you to run any of the supported games on any* Linux distribution and hardware.
|
||||
|
||||
Each game might require a different hook library as the software evolved as well as the hardware and original
|
||||
operating system changed a few times as well.
|
||||
|
||||
## General features
|
||||
A few notable features:
|
||||
|
||||
* Run any supported gam on recent kernel versions thanks to various fixes
|
||||
* Run any supported game on 32-bit and 64-bit distros (64-bit distros require additional 32-bit libs to be installed)
|
||||
* Full dongle emulation
|
||||
* Remove HDD checks to run this on "non legit" drives
|
||||
* Full IO hardware emulation: MK6 PIUIO, Pro Button board (PIUBTN)
|
||||
* Real IO passthrough
|
||||
* API: Implement support for your own custom IO
|
||||
|
||||
## Supported games and versions
|
||||
Check each of the dedicated hook readmes which games and versions are supported.
|
||||
|
||||
## Hardware, operating system and environment
|
||||
A general outline is given by [this readme](os.md) if you want to setup something yourself. Otherwise, you should
|
||||
checkout the `pumpos` project in a repository nearby which takes care of installing a fully configured OS to a physical
|
||||
disk to run the games on dedicated hardware for cabinets.
|
||||
|
||||
## Quick start: how to run (official release)
|
||||
The following steps apply to any game of the "officially" supported release data.
|
||||
|
||||
1. Install the required dependencies which can vary per game. Check the section "required dependencies" in the dedicated
|
||||
readme files of each hook.
|
||||
1. Unpack `game.zip` and `lib-local.zip` to a folder of your choice.
|
||||
1. Your folder should contain the following files and folders: `game`, `lib`, `piu`, `version`
|
||||
1. Unpack the hook which supports the game you have chosen, e.g. for Exceed use `exchook.zip`, from the
|
||||
`pumptools-X.XX.zip` release package next to the `piu` executable
|
||||
1. Unpack the `piuio.zip` from the `pumptools-X.XX.zip` release package next to the `piu` executable
|
||||
1. Rename the hook library, e.g. for Exceed `exchook.so`, to `hook.so` and the hook configuration file, e.g. for
|
||||
Exceed `exchook.conf`, to `hook.conf`
|
||||
1. Open `hook.conf` with a text editor and set the `patch.piuio.emu_lib` property accordingly:
|
||||
* For keyboard usage: `patch.piuio.emu_lib=./ptapi-io-piuio-keyboard.so` and
|
||||
`patch_hook_main_loop.x11_input_handler=./ptapi-io-piuio-keyboard.so"`
|
||||
* Configure your keyboard mappings using `./ptapi-io-piuio-keyboard-conf`
|
||||
* For USB PIUIO usage: Do not set the `patch.piuio.emu_lib` property and have the hardware plugged in.
|
||||
1. Run the game as logged in root user: `./piueb run` or if you have `sudo` installed and configured: `sudo ./piueb run`
|
||||
|
||||
Details to specific games are given in the hook read files dedicated to each supported version. Further general
|
||||
configuration and technical details as well as troubleshooting known issues are described in following sections.
|
||||
|
||||
## Dependencies
|
||||
A list of dependencies is provided in the dedicated hook readme files for each game. The following is a general guide
|
||||
on how dependencies of the games can be resolved to run them.
|
||||
|
||||
Right now, there are two methods for resolving the dependencies and which dependencies to use for the game:
|
||||
* __Method 1__: Install as many dependencies as possible using the package manager of your distribution. Usually, you want
|
||||
to go for method 1 and if the game runs, you don't have to bother with method 2. A few less common libraries are
|
||||
provided with the official data release and are loaded from the local `lib` folder instead.
|
||||
* __Method 2__: Provide **all** libraries except GPU related ones and a dedicated ld-linux loader with the game
|
||||
independent from your system. Theoretically, this gives you full distribution independence but it is more complicated
|
||||
and comes with a few unresolved issues so far. If method 1 doesn't work for you, try this method. For details, see the
|
||||
[following section](#local-data-folder).
|
||||
|
||||
## Data setup
|
||||
You are expected to get a clean set of data from a pristine drive. Ensure that the game is supported by one of the
|
||||
hook libraries coming with pumptools and the game's version is on the list supported versions.
|
||||
|
||||
You are not required to have the pulled data in the same locations as on the original drive as the hook library can
|
||||
be configured to have everything in a single local folder. These settings can be found and tweaked in the `hook.conf`
|
||||
file which is created after you started the game once.
|
||||
|
||||
### Local data folder
|
||||
Your local data folder must contain the following folders and files:
|
||||
* `game`: The `game` asset folder from the HDD. Filename casing depends on the games and is relevant on case-sensitive
|
||||
file systems. Exact requirements are explained in the readme files of each hook. Otherwise, the game crashes because of
|
||||
files/folders it cannot find. Furthermore, put any additional files/folders that are game assets and not located in
|
||||
the original `game` folder into the `game` folder, e.g. `mission.txt`, `SCRIPT` folder etc. which are located in
|
||||
the cramfs on some games.
|
||||
* `lib`: Put any libraries (especially older versions of libraries that can't be installed anymore using the package
|
||||
manager) the game uses and aren't installed on your system in here. Using piueb, you have two options with potential
|
||||
different (in-)compatibility issues:
|
||||
1. Have **all** libraries the game requires to run (except GPU driver specific libs) with compatible version in that
|
||||
folder including a dedicated `ld-linux.so`. See [piueb script header documentation](../../dist/piueb).
|
||||
1. Have only additional libraries that are not common/available on with your package manager **without** a dedicated
|
||||
`ld-linux.so`.
|
||||
* `save`: Empty folder where the the game stores configuration. These files are created by the game automatically and
|
||||
contain default values if missing.
|
||||
* `piu`: The Linux port `piu` executable.
|
||||
|
||||
## Configure IO
|
||||
The hooks allow you to hook any implementation of [pumptools's API](../api/api.md) to the game to drive any type of IO
|
||||
hardware. See the [dedicated readme](../api/io/piuio.md) on how to configure the PIUIO with the different types
|
||||
of implementations available, e.g. keyboard, joystick, ...
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
The following sub-sections apply to all hooks.
|
||||
|
||||
### USB 3.0 vs 2.0 issues with USB thumb drives/profiles
|
||||
This affects *ALL* games that make use of USB thumb drives for storing player profile related data.
|
||||
|
||||
Due to how the Linux kernel treats bus-port mappings for USB 3.0 and USB 2.0 different, it is recommended to limit the
|
||||
usage of USB thumb drives either to 3.0 or 2.0 drives only after having configured the port assignment for the affected
|
||||
games.
|
||||
|
||||
For example, you use a USB 2.0 thumb drive to assign one physical USB ports on your machine to each player side using
|
||||
NX2's operator menu configuration option. However, the configured assignment is only working for USB 2.0 drives. If
|
||||
you repeat this configuration step with a USB 3.0 drive (if your mainboard supports them because it has a USB 3.0
|
||||
host controller), you will get different `bus:port` values shown on the configuration screen. Keep this in mind when
|
||||
setting up the game, assigning the ports and using USB thumb drives with the games.
|
||||
|
||||
### My USB thumb drive is not detected by the game at all
|
||||
Which means you cannot use it to even map the USB ports in the test menu.
|
||||
|
||||
Make sure to try at least another one by a different brand. There have been reports of some thumb drives simply not
|
||||
working, e.g. a fairly old Kingston 1GB. In general, everything that gets detected fine by Linux should work.
|
||||
|
||||
### My USB thumb drive works when mapping the ports in the test menu but is not recognized on the game login screen
|
||||
Might be the same issue as [here](#my-usb-thumb-drive-is-not-detected-by-the-game-at-all). Try out different USB thumb
|
||||
drives. Be aware of the [USB 3.0 vs 2.0 issue](#usb-30-vs-20-issues-with-usb-thumb-drivesprofiles) as well.
|
||||
|
||||
### The game enters the operator menu when I start it
|
||||
This is known to happen consistently on NX but was observed on other versions like Exceed 2 and Zero in the past. The
|
||||
cause for this is unknown so far. Even with all usb emulation layers removed from pumptools and a real MK6 PIUIO
|
||||
attached this still happens. If the game is run without the PIUIO attached, everything's fine. Therefore, we suspect
|
||||
this is a bug within the game's PIUIO driver, likely some uninitialized buffers (due to the randomness of this bug
|
||||
being triggered).
|
||||
|
||||
### How to I generate a fresh configuration file with default values
|
||||
If you deleted your `hook.conf` file or you just want a clean start with default values, the hook creates a clean
|
||||
`hook.conf` file if none exists once you run `piueb`.
|
||||
|
||||
### What are the command line arguments supported by the hook
|
||||
Just run `piueb run -h` to get help output from the hook library. This also provides you with shortened command line
|
||||
parameters for all options available from the configuration file.
|
||||
|
||||
### How do I provide command line arguments to quickly change configuration settings for the game
|
||||
Just run `piueb run` with the shortened command line parameter, e.g. `piueb run -w`.
|
||||
|
||||
### The game's music plays too fast, too slow, or sounds weird
|
||||
Depending on the game version you play, the audio subsystem is set to either render to an output device with a
|
||||
frequency of 44100hz or 48000hz in SE16_LE format. Alsa needs to be configured accordingly to play back the audio
|
||||
data at the right sample rate to make it sound right.
|
||||
|
||||
Games and audio settings required:
|
||||
* 44100hz: MK3 Linux ports 1st to Prex 3, Exceed (1), Pro 1 and Pro 2
|
||||
* 48000hz: Exceed 2 and newer
|
||||
|
||||
One possibility to fix that is change the values in your config, e.g. `/usr/share/alsa/pcm/dmix.conf` when using the
|
||||
`dmix` device (the location and config can differ depending on your setup). In case you have to set them to 48000hz,
|
||||
search for the following configuration values and replace them with these values:
|
||||
```
|
||||
format S16_LE
|
||||
rate 48000
|
||||
```
|
||||
|
||||
If the contents of the files are just variables, check `/usr/share/alsa/alsa.conf` something similar like this:
|
||||
```text
|
||||
defaults.pcm.dmix.rate 44100
|
||||
defaults.pcm.dmix.format "S16_LE"
|
||||
```
|
||||
|
||||
The same method applies to replacing 44100hz with 48000hz.
|
||||
|
||||
### How do I figure out which sound device to select
|
||||
You can list the currently connected devices/sound cards using the following command:
|
||||
```shell script
|
||||
cat /proc/asound/cards
|
||||
```
|
||||
|
||||
Example output:
|
||||
```text
|
||||
0 [PCH ]: HDA-Intel - HDA Intel PCH
|
||||
HDA Intel PCH at 0xfb610000 irq 51
|
||||
1 [NVidia ]: HDA-Intel - HDA NVidia
|
||||
HDA NVidia at 0xfb080000 irq 52
|
||||
```
|
||||
|
||||
You can see two audio devices available: `0` being the built-in sound chip and `1` the audio output on the installed
|
||||
GPU (i.e. HDMI audio out).
|
||||
|
||||
To route the audio to the device of your choice, e.g. device `0`, add the number to the `hw:` path: `hw:0` for device
|
||||
`0`. Set `hw:0` in the configuration file:
|
||||
|
||||
```text
|
||||
patch.sound.device=hw:0
|
||||
```
|
||||
|
||||
### The game plays/renders too fast
|
||||
The game relies on vsync to lock to the target framerate of 60 FPS. Ensure vsync is turned on in your GPU settings.
|
||||
|
||||
### libGL.so.1: cannot open shared object file: No such file or directory
|
||||
Install your GPU drivers. This library depends on the GPU driver and is not included with the distributed data.
|
||||
|
||||
### There's no sound at all, even with the correct sound device selected
|
||||
On certain setups, the sound output only seems to work after already having attempted to use the sound device once.
|
||||
In a shell, try running the following command twice:
|
||||
|
||||
```shell script
|
||||
aplay -q /usr/share/sounds/alsa/Front_Center.wav
|
||||
```
|
||||
|
||||
If after a fresh boot the sound plays after the second attempt, your setup suffers from this issue.
|
||||
Simply putting the above command once in a boot script will make sure the sound device is activated.
|
||||
@@ -0,0 +1,283 @@
|
||||
# mk3hook: 1st to Prex 3/Premiere 3 Linux ports
|
||||
This readme covers any matters that are relevant for this hook, only. Anything that applies to **all** hooks is covered
|
||||
in a [main hook readme file](../hook.md) including general data setup and a quick start guide.
|
||||
|
||||
First and foremost, the MK3 Linux ports are runnable without this hook as well. The ports were created from the original
|
||||
fully disassembled DOS binaries and reassembled for 32-bit Linux. To make the games run on modern non-MK3 hardware,
|
||||
additional features were added to the disassembly:
|
||||
* Software lockchip emulation
|
||||
* ISA PIUIO to USB PIUIO (over libusb)
|
||||
* MP3 audio decoding and playback using fmodex
|
||||
* Software sound effect playback
|
||||
* Software EEPROM data reading/writing
|
||||
|
||||
However, since modifying the (decompiled) source code is a very complex task, various additional features and fixes
|
||||
are applied using a hook library. This lacks certain flexibility but is so far sufficient to fix various bugs and add
|
||||
some more quality of life features.
|
||||
|
||||
## Additional notable features
|
||||
* Audio subsystem using fmodex: Bugfixes and audio device selection
|
||||
* Relocate game data to `game` sub-folder to have identical data layout to newer generation games
|
||||
* Additional development/debugging features, e.g. file, io, open logging and tracing
|
||||
* Hardcoded OpenGL bugfix
|
||||
* Utilize pumptools configuration infrastructure to unify configuration of all games
|
||||
|
||||
## Versions supported
|
||||
Basically, "all" versions are supported considering there was only one Linux binary per game released so far.
|
||||
|
||||
## Quick start: how to run (official release), additional steps
|
||||
Start with the quick start guide from the [main hook readme](../hook.md#quick-start-how-to-run-official-release) and
|
||||
add the additional steps at the very end:
|
||||
1. **1st and 2nd only**: Open the `hook.conf` file and set the following property: `game.1st_2nd_fs=1`. For details, see
|
||||
[this section](#1st-or-2nd-errors-about-failed-resource-loading)
|
||||
1. **1st only**: Go straight to the operator menu by pressing `G` on your keyboard. Go to `GAME OPTION`, select and
|
||||
confirm `DEFAULT SETTING` and `SAVE AND EXIT`. Next, go to `COIN OPTION`, `DEFAULT SETTING` and `SAVE AND EXIT`. See
|
||||
[this section](#1st-crashes-right-after-the-andamiro-logo-or-the-intro-sequence-when-i-should-see-the-title-screen-with-a-floating-point-exception)
|
||||
for details.
|
||||
|
||||
## Dependencies
|
||||
Make sure to read the different methods of dependency resolution available in the [main hook readme file](../hook.md),
|
||||
first.
|
||||
|
||||
The following **direct** dependencies (cmd: `readelf -d piu`) are required by all Linux ports:
|
||||
* libGL.so.1
|
||||
* libX11.so.6
|
||||
* libXxf86vm.so.1
|
||||
* libXrandr.so.2
|
||||
* libpthread.so.0
|
||||
* libXi.so.6
|
||||
* libXcursor.so.1
|
||||
* libXinerama.so.1
|
||||
* libm.so.6
|
||||
* libncurses.so.5
|
||||
* libtinfo.so.5
|
||||
* libfmodex.so
|
||||
* libconfig.so.9
|
||||
* libusb-0.1.so.4
|
||||
* libc.so.6
|
||||
|
||||
As for method 1, when using Ubuntu, the dependencies can be found in the following packages:
|
||||
* libc-bin (or gcc-multilib on a 64-bit platform)
|
||||
* libusb-0.1-4
|
||||
* libconfig++9v5
|
||||
* tinfo5
|
||||
* ncurses5
|
||||
* libxcursor1
|
||||
* libxinerama1
|
||||
* libxi6
|
||||
* libxrandr2
|
||||
* libxxf86vm1
|
||||
* libx11-6
|
||||
* libasound2
|
||||
|
||||
## Data setup
|
||||
In additional to the [general information applying to **all** hooks](../hook.md#data-setup), the following information
|
||||
goes for a clean set of data from a pristine/non-bootleg CD.
|
||||
|
||||
If you have the official release, this might not be relevant to you as it just explains some important technical details
|
||||
about the data.
|
||||
|
||||
In general, get a clean set of data from a pristine/non-bootleg CD.
|
||||
|
||||
However, 1st, 2nd and 3rd and Extra (IIRC) are the exception here. These games have their textures packed in an odd
|
||||
format (IIRC something about an odd color format and/or textures being flipped) that cannot be used with the Linux port
|
||||
versions. These versions require file modification and repacking to make everything look correct with the linux
|
||||
binaries.
|
||||
|
||||
Furthermore, because the old games ran on case-insensitive file systems, everything goes with file naming depending on
|
||||
the version of the game, e.g. full upper/lower-case files, folders and even mixed ones, e.g. Stage.cfg (*sigh*).
|
||||
In order to make this less painful for the the hook library, some file names were modified to create some sort of
|
||||
consistency.
|
||||
|
||||
You are not required to have the pulled data in the same location and layout as given by the original layout on the
|
||||
disc as this can be configured with the hook library. Everything can be located locally in a single folder. The settings
|
||||
for this can be found and tweaked in the `hook.conf` file which is created after you started the game once
|
||||
([see below](#mk3hook-features)).
|
||||
|
||||
#### The game data subfolder
|
||||
This differs slightly from newer generation games, i.e. MK6-based and newer. The hook library takes care of this by
|
||||
implementing a consistent directory structure on all versions of the game. Therefore, all game data from the CD of MK3
|
||||
games goes into a `game` folder as well. Example of `games` contents for Prex 3:
|
||||
* `AUDIO`
|
||||
* `BGA`
|
||||
* `STEP`
|
||||
* `TITLE`
|
||||
* `PIU.BIN`
|
||||
* `STAGE.CFG`
|
||||
|
||||
Furthermore, the game needs to have the sound effects available as files. These were stored on a ROM chip on the MK3
|
||||
hardware. Luckily, newer PC-based games have these as normal files with the correct naming in the `game/WAVE` subfolder.
|
||||
These also go into `game/EFFECTS`.
|
||||
|
||||
Some other and older versions come with different files and folders but the process is identical. The first three games,
|
||||
1st, 2nd and 3rd, had their audio files stored on disc as PCM audio data next to the other game assets. These audio
|
||||
files need to be ripped and provided as MP3 encoded audio files in the sub-folder `game/track`.
|
||||
|
||||
## Linux port features
|
||||
This section covers the features that were added to the Linux ports and therefore not available on the original DOS
|
||||
versions.
|
||||
|
||||
### Configuration file
|
||||
A configuration file with different options can be provided to the game's bare executable. The configuration is provided
|
||||
as a command line argument when running the game, e.g.
|
||||
```
|
||||
./piu ./save/config.cfg
|
||||
```
|
||||
|
||||
Example contents:
|
||||
```
|
||||
fullscreen = 1;
|
||||
allow_exit = 1;
|
||||
save_file = "./save/EEPROM.BIN";
|
||||
effect_path = "./EFFECTS/";
|
||||
track_path = "./track/";
|
||||
sync_offset = 115;
|
||||
sync_multiplier = 4.16666666666666696272613990004;
|
||||
music_volume = 1.0;
|
||||
sfx_volume = 1.0;
|
||||
```
|
||||
|
||||
Most entries are self-explanatory. However, there are two parameters that can be tweaked to control synchronisation of
|
||||
the stepchart to the music.
|
||||
|
||||
The `sync_offset` parameter (in ms) is used to offset the stepchart to the music. However, as you might be used to such
|
||||
a parameter from other music games, this offset is **NOT** entirely identical to adjusting the music to your sound
|
||||
system's latency. You can use this value to shift the synchronisation point forward and backward but keep in mind that
|
||||
it will not match any other offset values you determined in other games.
|
||||
|
||||
The `sync_multiplier` is also a variable that was depending on the sound hardware of the target platform. It was
|
||||
already determined and there should be **NO** reason to change it unless you know what it does and how it is used in
|
||||
synchronizing the stepchart to the song in the engine.
|
||||
|
||||
All these configuration values are exposed via the `hook.conf` file and hooked to the pumptools configuration
|
||||
infrastructure. Usually, there is no need to deal with this directly, so this is section is mainly for documenting its
|
||||
presence.
|
||||
|
||||
### Built-in keyboard controls
|
||||
Ignore this section if you are using the `mk3hook` because it will disable this feature entirely. See
|
||||
[this section](#configure-io).
|
||||
|
||||
The following keyboard controls are available with the Linux ports.
|
||||
|
||||
PIUIO hooked controls:
|
||||
```
|
||||
Test: Key G
|
||||
Service: Key H
|
||||
Clear: Key J
|
||||
Coin 1: Key K
|
||||
Coin 2: Key L
|
||||
|
||||
Pads (Player 2 on numpad):
|
||||
Q E 7 9
|
||||
S 5
|
||||
Z C 1 3
|
||||
```
|
||||
|
||||
Keyboard controls supported by the game engine (won't work on very early versions of the game, e.g. 1st, 2nd, 3rd):
|
||||
```
|
||||
Test: F1
|
||||
Service: F2
|
||||
Clear: F3
|
||||
```
|
||||
|
||||
### USB PIUIO
|
||||
Ignore this section if you are using the `mk3hook` because it will disable this feature entirely. See
|
||||
[this section](#configure-io).
|
||||
|
||||
When a USB PIUIO is plugged it, the game will automatically detect and use it.
|
||||
|
||||
### Exit the game
|
||||
Use `Test` + `Service` on the USB PIUIO (controls) to exit the game. This can also be blocked in the configuration.
|
||||
|
||||
## mk3hook features
|
||||
Check the `hook.conf` file which is located in the same folder as the `piu` executable once you have started the game.
|
||||
The available settings are explained in the `hook.conf` file.
|
||||
|
||||
### Configure IO
|
||||
See [this section of the main hook readme](../hook.md#configure-io).
|
||||
|
||||
### Select another audio device
|
||||
If the default sound card is not working, e.g. see [here](#no-sound-and-fmod-errors-in-log), you might want to
|
||||
select another audio device/card instead.
|
||||
|
||||
In order to find out which cards are available and which configuration value to set, you have to run the game once.
|
||||
Check the log and you will see a list of available devices printed somewhere at the beginning of the log, for example:
|
||||
```
|
||||
Output type: 11
|
||||
Num available drivers 43
|
||||
Driver 0: default
|
||||
Driver 1: null
|
||||
Driver 2: jack
|
||||
Driver 3: sysdefault:CARD=PCH
|
||||
Driver 4: front:CARD=PCH,DEV=0
|
||||
...
|
||||
```
|
||||
|
||||
By default and if you have not configured any sound device, yet, this will pick the first, usually, `default` device.
|
||||
Pick another one by copying the name, e.g. `sysdefault:CARD=PCH`, and setting it in the `hook.conf` file:
|
||||
```
|
||||
patch.sound.device=sysdefault:CARD=PCH
|
||||
```
|
||||
|
||||
When you restart the game, check the log if the device got picked up properly. This is indicated by a log message
|
||||
right after the device list is printed.
|
||||
|
||||
### Debugging fmodex issues
|
||||
You can also debug issues with fmodex, e.g. why
|
||||
[the selected sound device does not work](#no-sound-and-fmod-errors-in-log).
|
||||
|
||||
You need to replace the normal `fmodex.so` library in the game local `lib` folder with a `fmodexL.so` version. Just
|
||||
rename the "L"-version to `fmodex.so` and have it in the game local `lib` folder. Furthermore, you have to enable
|
||||
debug output by setting the following configuration value in the `hook.conf` file:
|
||||
```
|
||||
patch.sound.debug_output=0
|
||||
```
|
||||
|
||||
After that's done, you should see additional log output by fmodex on the console.
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
Make sure to also check the
|
||||
[troubleshooting and FAQ section of the main hook readme](../hook.md#troubleshooting-and-faq). This covers various
|
||||
things that apply to **all** hooks. The following sub-sections apply mainly to this hook.
|
||||
|
||||
### No sound and FMOD errors in log
|
||||
If you see one or multiple of the following error messages in the log output
|
||||
```
|
||||
FMOD error! (60) Error initializing output device.
|
||||
FMOD error! (79) This command failed because System::init or System::setDriver was not called.
|
||||
FMOD error! (37) An invalid parameter was passed to this function.
|
||||
```
|
||||
it is very likely that fmod cannot use the default/currently selected audio device for playback. This can have various
|
||||
reasons from non suitable configuration to device being used by another process and therefore blocked if not supporting
|
||||
software mixing.
|
||||
|
||||
Choose another device for playback instead, see [this section](#select-another-audio-device), or you can enable
|
||||
fmodex debug output to further debug this issue, see [this section](#debugging-fmodex-issues).
|
||||
|
||||
### 1st/2nd is missing the "Insert Coin" text on the title screen and several other graphics, e.g. life bar during gameplay
|
||||
This is a known bug and we do not have a fix for this so far. However, this is not always triggered and if you keep
|
||||
restarting the game (with a few seconds of waiting between restarts), you will start the game without this bug being
|
||||
active eventually.
|
||||
|
||||
### 1st or 2nd errors about failed resource loading
|
||||
For example:
|
||||
```
|
||||
FAIL: res_load( piu.dat )
|
||||
```
|
||||
|
||||
This error indicates that one or multiple game files are not placed in the right location(s), your configured `game`
|
||||
sub-directory path is not correct or you forgot to switch on the "1st/2nd filesystem" feature switch in the hook
|
||||
configuration. For the latter, set the following in your `hook.conf` file:
|
||||
```
|
||||
game.1st_2nd_fs=1
|
||||
```
|
||||
|
||||
### 1st crashes right after the Andamiro logo or the intro sequence when I should see the title screen with a floating point exception
|
||||
1st does not detect if no EEPROM data is available and does not write defaults on first start or when you deleted the
|
||||
`save/EEPROM.BIN` file. Therefore, all settings values for the game are considered "0". This is fine with all settings
|
||||
except the coin settings. This causes the floating point exception though I assume it was actually caused by a division
|
||||
by zero.
|
||||
|
||||
To fix this, go right to the operator menu when you booted up the game and are still on the Andamiro logo screen. Go
|
||||
to `GAME OPTION`, select and confirm `DEFAULT SETTING` and `SAVE AND EXIT`. Next, go to `COIN OPTION`, `DEFAULT SETTING`
|
||||
and `SAVE AND EXIT`. This writes a fresh `EEPROM.bin` file with all default settings and you are good to go.
|
||||
@@ -0,0 +1,154 @@
|
||||
# nx2hook: NX2
|
||||
This readme covers any matters that are relevant for this hook, only. Anything that applies to **all** hooks is covered
|
||||
in a [main hook readme file](../hook.md) including general data setup and a quick start guide.
|
||||
|
||||
## Additional notable features
|
||||
* Removed USB flash drive vendor lock, i.e. use _ANY_ USB flash drive to store game profiles
|
||||
* Auto generate new profiles if no profile is found on the connected USB flash drive
|
||||
|
||||
## Versions supported
|
||||
All known versions supported.
|
||||
|
||||
## Dependencies
|
||||
Make sure to read the different methods of dependency resolution available in the [main hook readme file](../hook.md),
|
||||
first.
|
||||
|
||||
The following **direct** dependencies (cmd: `readelf -d piu`) are required:
|
||||
* libfreetype.so.6
|
||||
* librt.so.1
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libusb-0.1.so.4
|
||||
* libpthread.so.0
|
||||
* libXxf86vm.so.1
|
||||
* libpng12.so.0
|
||||
* libasound.so.2
|
||||
* libmad.so.0
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libm.so.6
|
||||
* libX11.so.6
|
||||
* libstdc++.so.6
|
||||
* libz.so.1
|
||||
|
||||
As for method 1, when using Ubuntu, the dependencies can be found in the following packages:
|
||||
* libc-bin (or gcc-multilib on a 64-bit platform)
|
||||
* libx11-6
|
||||
* zlib1g
|
||||
* libusb-0.1-4
|
||||
* libasound2
|
||||
|
||||
## Data setup
|
||||
In additional to the [general information applying to **all** hooks](../hook.md#data-setup), this game requires all
|
||||
files and folders from the original `game` folder to be in **UPPERCASE** on a case-sensitive file system with the
|
||||
exception of `*.txt` and `*.ttf` files in the root of game. Further game asset files and folders from cramfs need to be
|
||||
copied to the `game` directory. `nx.ttf`, `nxcn.ttf`, `nxpt.ttf`, `nxtw.ttf` and `mission.txt` must be **lowercase** but
|
||||
`SCRIPT` and its contents must be **UPPERCASE**.
|
||||
|
||||
## Pumpnet setup
|
||||
Instead of using plain usb profiles like on the vanilla version without pumptools (which is still possible with
|
||||
pumptools), pumptools provides a patch module to upload/download usb profiles to/from a remote server over TCP IP
|
||||
networks.
|
||||
|
||||
This feature can be enabled by setting the following configuration properties in the `hook.conf` file:
|
||||
```text
|
||||
patch.net_profile.server=<put the server address of the pumpnet server here>
|
||||
patch.net_profile.machine_id=<put your machine id that's registered with the server here>
|
||||
```
|
||||
|
||||
If the network offers or even requires secure communication using https, you should have received a package with a
|
||||
client certificate, a client key and a certificate authority bundle. Place the files named `ca-bundle-crt.pem`,
|
||||
`client-crt.pem` and `client-key.pem` in a folder, e.g. `cert` next to the `piu` executable and configure the hook
|
||||
to use these for the encrypted communication by setting the property key `patch.net_profile.cert_dir_path`
|
||||
accordingly, e.g. `patch.net_profile.cert_dir_path=./cert`. Note: The server URL that you set for the properties key
|
||||
`patch.net_profile.server` has to be a https based URL in order to work correctly, e.g. `https://localhost`. Your
|
||||
network provided of your choice should provide you the URL you have to use.
|
||||
|
||||
When everything's configured correctly, the log tells you so:
|
||||
```text
|
||||
Initialized pumpnet for game 20, serveraddr localhost:8080, main endpoint version /usbprofile/v1
|
||||
Initialized: game 20, server XXXXXXX, machine id XXXXXXX
|
||||
```
|
||||
|
||||
How you acquire an address to a remote server and a machine ID is out of this document's scope.
|
||||
|
||||
Once these parameters are present, pumptools is looking for a file called `pumpnet.bin` on connected usb sticks. As
|
||||
long as this file is in the root directory of your usb drive, the game will ignore the the regular `nx2save.bin` and
|
||||
`nx2rank.bin` files and always try to connect to the remote server. When you remove `pumpnet.bin`, it will pick up the
|
||||
local profiles and not connect to the server, even if enabled.
|
||||
|
||||
`pumpnet.bin` contains an identifier for the player to login. This file needs to be provided by the network service
|
||||
somehow. The how is out of the scope of this document.
|
||||
|
||||
Ensure you have mapped the usb ports in the game correctly. Go to the operator menu and the "usb drive" item. Plug
|
||||
**exactly one** usb thumb drive into the usb port you want to assign as P1 and hit the test button. The menu item
|
||||
should change from `---` to a numerical value, e.g. `03:00` which describes the bus and port the drive got detected on.
|
||||
Repeat this for P2.
|
||||
|
||||
When you start the game, have your usb stick plugged in and it is recognized correctly by the game, the log output
|
||||
tells you if it found the `pumpnet.bin` file and connected to the server correctly for downloading your profile data:
|
||||
```text
|
||||
Found pumpnet profile file /mnt/0/pumpnet.bin
|
||||
Profile file player 0, file_type 0, refId XXXXXXXXXXXXXX downloading from server...
|
||||
Downloading file player 0, file_type 0, refId XXXXXXXXXXXXXX successful
|
||||
```
|
||||
|
||||
If it cannot connect to the server, the log tells you that as well and retries to connect to it a few times before
|
||||
giving up:
|
||||
```text
|
||||
Performing curl request failed: Couldn't connect to server
|
||||
Failed, http code 0, retrying (0)...
|
||||
...
|
||||
```
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
Make sure to also check the
|
||||
[troubleshooting and FAQ section of the main hook readme](../hook.md#troubleshooting-and-faq). This covers various
|
||||
things that apply to **all** hooks. The following sub-sections apply mainly to this hook.
|
||||
|
||||
### How do I unlock 'Tell Me' on the non korean version?
|
||||
Put an empty file called `KEY.LUA` into the `game/SCRIPT` folder and change the language to korean in the operator menu.
|
||||
This loads the korean version of the game (yes, that's how it actually worked originally) and 'Tell Me' will be
|
||||
available.
|
||||
|
||||
Note: You can't switch back to English unless you delete the file `game/SCRIPT/KEY.LUA`.
|
||||
|
||||
### When using pumpnet, the game does not detect any usb sticks
|
||||
Make sure that you have configured the usb ports in the game's operator menu `USB DRIVE` menu item. For instructions,
|
||||
refer to the [above section](#pumpnet-setup).
|
||||
|
||||
### When using pumpnet, the game tells me to register my usb drive on login
|
||||
If you see the message "Please REGISTER your USB drive at www.piugame.com prior to using the product." when logging in
|
||||
with pumpnet enable, your login got rejected for one of the following reasons:
|
||||
* Your machine ID is invalid or not whitelisted on the server
|
||||
* Your player ID is invalid or no such player exists on the server
|
||||
* No NX2 profile was created for the player ID on the server
|
||||
|
||||
On any of the above cases, verify that you ensured you have configured everything correctly on the user web interface
|
||||
of pumpnet. Otherwise, contact the server administrator.
|
||||
|
||||
### When using pumpnet, the game apparently gets stuck on the usb drive login screen
|
||||
This can happen if the game cannot reach the server or on some other errors that might be temporarily. Therefore, the
|
||||
game retries for up to ten times currently to reach the server or complete an outstanding operation. This is also
|
||||
reflected in the logs with warning messages telling you the game is retrying.
|
||||
|
||||
### Curl requests fail: Problem with the SSL CA cert
|
||||
When you get the following error message:
|
||||
```text
|
||||
Performing curl request failed: Problem with the SSL CA cert (path? access rights?)
|
||||
```
|
||||
|
||||
Make sure the path you configured for the property key `patch.net_profile.cert_dir_path` is pointing to an existing
|
||||
directory containing the files `ca-bundle-crt.pem`, `client-crt.pem` and `client-key.pem` that you received from the
|
||||
the network you are trying to connect to.
|
||||
|
||||
### Curl requests fail: SSL peer certificate or SSH remote key was not OK
|
||||
When you get the following error message:
|
||||
```text
|
||||
Performing curl request failed: SSL peer certificate or SSH remote key was not OK
|
||||
```
|
||||
|
||||
Make sure that you have the files `ca-bundle-crt.pem`, `client-crt.pem` and `client-key.pem` that you have received
|
||||
from the network you are trying to connect to placed in a directory. The path to the **directory** needs to be set in
|
||||
the hook configuration file by setting the key `patch.net_profile.cert_dir_path`, e.g.
|
||||
`patch.net_profile.cert_dir_path=./cert` if the files are placed next to the `piu` exec in the folder `cert`.
|
||||
@@ -0,0 +1,55 @@
|
||||
# nxahook: NXA
|
||||
This readme covers any matters that are relevant for this hook, only. Anything that applies to **all** hooks is covered
|
||||
in a [main hook readme file](../hook.md) including general data setup and a quick start guide.
|
||||
|
||||
## Additional notable features
|
||||
* Removed USB flash drive vendor lock, i.e. use _ANY_ USB flash drive to store game profiles
|
||||
* Auto generate new profiles if no profile is found on the connected USB flash drive
|
||||
|
||||
# Versions supported
|
||||
All known versions supported.
|
||||
|
||||
## Dependencies
|
||||
Make sure to read the different methods of dependency resolution available in the [main hook readme file](../hook.md),
|
||||
first.
|
||||
|
||||
The following **direct** dependencies (cmd: `readelf -d piu`) are required:
|
||||
* libfreetype.so.6
|
||||
* librt.so.1
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libusb-0.1.so.4
|
||||
* libpthread.so.0
|
||||
* libXxf86vm.so.1
|
||||
* libpng12.so.0
|
||||
* libasound.so.2
|
||||
* libmad.so.0
|
||||
* libboost_regex-mt.so.3
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libm.so.6
|
||||
* libX11.so.6
|
||||
* libdl.so.2
|
||||
* libstdc++.so.6
|
||||
* libz.so.1
|
||||
|
||||
As for method 1, when using Ubuntu, the dependencies can be found in the following packages:
|
||||
* libc-bin (or gcc-multilib on a 64-bit platform)
|
||||
* libx11-6
|
||||
* zlib1g
|
||||
* libusb-0.1-4
|
||||
* libasound2
|
||||
|
||||
## Data setup
|
||||
In additional to the [general information applying to **all** hooks](../hook.md#data-setup), this game requires all
|
||||
files and folders from the original `game` folder to be in **UPPERCASE** on a case-sensitive file system. Further game
|
||||
asset files and folders from cramfs need to be copied to the `game` directory. `nx.ttf`, `nxcn.ttf`, `nxpt.ttf`,
|
||||
`nxtw.ttf`, `mission.txt` and `ufo.txt` must be **lowercase** but `SCRIPT` and its contents must be **UPPERCASE**.
|
||||
|
||||
The `config` (or `CONFIG`) folder and its contents must be available in **UPPER** _AND_ **lowercase**. The `BrainQuest`
|
||||
folder name must be kept like this and its contents must be **lowercase**.
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
Make sure to also check the
|
||||
[troubleshooting and FAQ section of the main hook readme](../hook.md#troubleshooting-and-faq). This covers various
|
||||
things that apply to **all** hooks. The following sub-sections apply mainly to this hook.
|
||||
@@ -0,0 +1,52 @@
|
||||
# nxhook: NX
|
||||
This readme covers any matters that are relevant for this hook, only. Anything that applies to **all** hooks is covered
|
||||
in a [main hook readme file](../hook.md) including general data setup and a quick start guide.
|
||||
|
||||
## Versions supported
|
||||
All known versions supported.
|
||||
|
||||
## Dependencies
|
||||
Make sure to read the different methods of dependency resolution available in the [main hook readme file](../hook.md),
|
||||
first.
|
||||
|
||||
The following **direct** dependencies (cmd: `readelf -d piu`) are required:
|
||||
* librt.so.1
|
||||
* liblua50.so.5.0
|
||||
* liblualib50.so.5.0
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libusb-0.1.so.4
|
||||
* libpthread.so.0
|
||||
* libpng12.so.0
|
||||
* libasound.so.2
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libm.so.6
|
||||
* libXext.so.6
|
||||
* libX11.so.6
|
||||
* libstdc++.so.5
|
||||
* libz.so.1
|
||||
|
||||
As for method 1, when using Ubuntu, the dependencies can be found in the following packages:
|
||||
* libc-bin (or gcc-multilib on a 64-bit platform)
|
||||
* libx11-6
|
||||
* zlib1g
|
||||
* libusb-0.1-4
|
||||
* libasound2
|
||||
|
||||
## Data setup
|
||||
In additional to the [general information applying to **all** hooks](../hook.md#data-setup), this game requires all
|
||||
files and folders in the `game` folder to be in **UPPERCASE** on a case-sensitive file system.
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
Make sure to also check the
|
||||
[troubleshooting and FAQ section of the main hook readme](../hook.md#troubleshooting-and-faq). This covers various
|
||||
things that apply to **all** hooks. The following sub-sections apply mainly to this hook.
|
||||
|
||||
### Fully unlock the game
|
||||
This hook has an option to fully unlock the game by setting the following property in the configuration file:
|
||||
```text
|
||||
game.force_unlock=1
|
||||
```
|
||||
|
||||
This will unlock all missions in "World Tour" as well any locked songs in "Special Zone", and the song "FAEP 2-2".
|
||||
@@ -0,0 +1,59 @@
|
||||
# Hardware
|
||||
Everything runs on original hardware MK6 and up. However, newer games might be slightly more demanding and will not
|
||||
run smoothly on the old MK6 anymore.
|
||||
|
||||
As for custom hardware, everything that's at least of MK6 specs should do the job. GPU-wise you are not bound to nVidia
|
||||
cards. Though, the card of your choice has to support at least the OpenGL 2.0 standard.
|
||||
|
||||
However, not that we have seen graphical glitches on AMD and Intel GPUs with NX2 which we haven't seen on older pump
|
||||
versions. The game starts and runs but after some time you might encounter graphical glitches.
|
||||
|
||||
You can also run the games in a VM. Recommended settings: 2 vCPUs, 2 GB RAM, OpenGL 2.0 hardware acceleration enabled
|
||||
(requires installing drivers/kernel modules on your guest).
|
||||
|
||||
# Operating system and environment setup
|
||||
This document outlines common stuff that is required to run any of the games supported by pumptools. Make sure to follow
|
||||
these properly and have your system prepared for the hooks before you continue with their dedicated readme files.
|
||||
|
||||
## Linux distributions supported
|
||||
If you have the required knowledge, you should be able to get this to run on any distribution available. However, there
|
||||
are a few things to consider:
|
||||
* The game is a 32-bit binary, you need to be able to run 32-bit binaries
|
||||
* Naturally, the game requires 32-bit versions of the libraries it depends on
|
||||
* The game is built with glibc. You might have a hard time on distributions not shipping with them by default, e.g.
|
||||
Alpine Linux
|
||||
* Kernel-wise, the latest kernels and everything that's not pre 2.6 should work. Due to various hook sub-modules, many
|
||||
quirks in different games have been fixed to run all games on the latest upstream kernel versions of Linux.
|
||||
|
||||
Recommendation: Use a 64-bit Linux distribution of your choice. You can also use a 32-bit distribution as this is the
|
||||
arch these games were built for but it does not come with any benefits. Prepare yourself to upgrade to 64-bit once any
|
||||
of the newer games (finally) moves to that target architecture.
|
||||
|
||||
## Dependencies
|
||||
Each game and hook comes with a list of dependencies you might have to install. This depends on which type of dependency
|
||||
resolution you pick.
|
||||
|
||||
When running this on a 64-bit Ubuntu, all packages must be installed as lib32 packages! When you are on Debian/Ubuntu
|
||||
(based) distros and you are using apt, you have to enable multiarch support first:
|
||||
```shell script
|
||||
sudo dpkg --add-architecture i386
|
||||
apt update
|
||||
```
|
||||
|
||||
Then, install the 32-bit packages like this where `<pkgname>` must be replaced accordingly:
|
||||
```shell script
|
||||
apt install pkgname:i386
|
||||
```
|
||||
|
||||
Note: The `:386` postfix does not apply to packages like `gccmultilib` as this already covers the i386 part.
|
||||
|
||||
## GPU drivers
|
||||
For `libGL`, you need to install a GPU driver and have hardware acceleration enabled. The `libGL` library provided also
|
||||
needs to be 32-bit compatible.
|
||||
|
||||
To check if everything's installed and HW acceleration is working, just run `glxgears`. If that doesn't error and you
|
||||
see the rendered gears spinning, you should be fine.
|
||||
|
||||
## Sound drivers
|
||||
Naturally, you also have to have sound stuff installed. Having alsa with its libraries available is sufficient. Pulse
|
||||
and similar audio systems are not required, e.g. when running on a cabinet.
|
||||
@@ -0,0 +1,108 @@
|
||||
# Notable features
|
||||
|
||||
* Runs on recent kernel versions thanks to various fixes
|
||||
* Runs on 32-bit and 64-bit distros (64-bit distros require additional 32-bit libs to be installed)
|
||||
* Full dongle emulation
|
||||
* Remove HDD checks to run this on "non legit" drives
|
||||
* Full MK6IO emulation with API hook: Keyboard or your own custom IO
|
||||
* Real IO passthrough (for MK6 usb io)
|
||||
|
||||
# Versions supported
|
||||
All known versions supported.
|
||||
|
||||
# Data setup
|
||||
You are expected to get a clean set of data from a prestine drive. Ensure that
|
||||
the game version matches one of the supported versions listed.
|
||||
|
||||
You need two main folders:
|
||||
* data
|
||||
* settings
|
||||
|
||||
## Data folder
|
||||
Contents of the folder:
|
||||
* game: The binaries of the custom "AMFS". File names must be lower case.
|
||||
* lib: Put any libraries (especially older versions of libraries that can't be
|
||||
installed anymore using the package manager) the game uses and aren't installed
|
||||
on your system in here.
|
||||
* piu: The piu executable
|
||||
|
||||
## Settings folder
|
||||
The contents of the folder are auto generated if the files don't exist.
|
||||
Otherwise, this folder contains:
|
||||
* PIUPRIME.INI
|
||||
* RANK.DATA
|
||||
|
||||
## Executable dependencies
|
||||
All dependencies must be compiled as 32-bit binaries. Here is a list of
|
||||
dependencies (with versions) required to run the game:
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libasound.so.2
|
||||
* libcurl.so.4
|
||||
* libsodium.so.13
|
||||
* libusb-0.1.so.4
|
||||
* libmad.so.0
|
||||
* libmpeg2.so.0
|
||||
* libmpeg2convert.so.0
|
||||
* libftgl.so.2
|
||||
* libstdc++.so.6
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libm.so.6
|
||||
* libXext.so.6
|
||||
* libX11.so.6
|
||||
* libpthread.so.0
|
||||
* libdl.so.2
|
||||
* librt.so.1
|
||||
* libnvidia-tls.so.340.96
|
||||
* libnvidia-glcore.so.340.96
|
||||
* libidn.so.11
|
||||
* libssh2.so.1
|
||||
* libssl.so.1.0.0
|
||||
* libcrypto.so.1.0.0
|
||||
* libgssapi_krb5.so.2
|
||||
* libkrb5.so.3
|
||||
* libk5crypto.so.3
|
||||
* libcom_err.so.2
|
||||
* libz.so.1
|
||||
* libusb-1.0.so.0
|
||||
* libfreetype.so.6
|
||||
* libxcb.so.1
|
||||
* libkrb5support.so.0
|
||||
* libkeyutils.so.1
|
||||
* libresolv.so.2
|
||||
* libudev.so.1
|
||||
* libbz2.so.1.0
|
||||
* libpng16.so.16
|
||||
* libharfbuzz.so.0
|
||||
* libXau.so.6
|
||||
* libXdmcp.so.6
|
||||
* libcap.so.2
|
||||
* libglib-2.0.so.0
|
||||
* libgraphite2.so.3
|
||||
* libpcre.so.1
|
||||
|
||||
# Hook module configuration file
|
||||
Checkout the usage information of the hook and set the option values according
|
||||
to your needs. Here is an example option configuration file:
|
||||
```
|
||||
log_file_path=/tmp/pumptools.log
|
||||
log_level=3
|
||||
enable_file_monitor=0
|
||||
enable_io_monitor=0
|
||||
piuio_emu_lib_path=/pumptools/lib/piuio-emu.so
|
||||
piuio_exit_test_service=1
|
||||
game_settings_path=/save/pri
|
||||
sound_device=hw:0
|
||||
keyboard_dev=/dev/input/by-id/usb-Logitech_USB_Receiver-if02-event-mouse
|
||||
halt_on_segv=0
|
||||
```
|
||||
|
||||
# Run the game
|
||||
Ensure you are running an X screen. Otherwise, you have to start one along with the game. Various library/system-calls
|
||||
require root privileges. Make sure to run the game as root or with sudo (otherwise you get various sorts of errors,
|
||||
typically permission denied). Use the included *run.sh* file to start the game on a desktop environment.
|
||||
|
||||
# Further notes
|
||||
## Vsync
|
||||
The game is required to run with vsync on.
|
||||
@@ -0,0 +1,91 @@
|
||||
# Notable features
|
||||
|
||||
* Runs on recent kernel versions
|
||||
* Runs on 32-bit and 64-bit distros (64-bit distros require additional 32-bit libs to be installed)
|
||||
* Dongle stuff must be patched out
|
||||
* You need decrypted data zips to run this
|
||||
* Full MK6IO emulation with API hook: Keyboard or your own custom IO
|
||||
* Full PIUBTN emulation with API hook: Keyboard or your own custom IO
|
||||
* Real IO passthrough (for MK6 usb io and PIUBTN)
|
||||
|
||||
# Versions supported
|
||||
Currently, only the latest revision is supported (I think that's R5?)
|
||||
|
||||
# Data setup
|
||||
A clean set of data won't work here. Glenn protected the data with his own life
|
||||
(pretty much) and made it as obnoxious as possible to unpack it. So good luck
|
||||
getting the original data out of a drive image (if you didn't get it already
|
||||
from somewhere).
|
||||
|
||||
All access to files and folders are detoured to two folders which makes setting
|
||||
up everything easier.
|
||||
|
||||
You need one main folder:
|
||||
* game/pro2 (contains all the game data, stepmania layout)
|
||||
|
||||
## Executable dependencies
|
||||
All dependencies must be compiled as 32-bit binaries. Here is a list of
|
||||
dependencies (with versions) required to run the game:
|
||||
* libXtst.so.6
|
||||
* libXrandr.so.2
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libdl.so.2
|
||||
* libavformat.so.51
|
||||
* libavcodec.so.51
|
||||
* libavutil.so.49
|
||||
* libusb-0.1.so.4
|
||||
* libpthread.so.0
|
||||
* librt.so.1
|
||||
* libstdc++.so.5
|
||||
* libm.so.6
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libX11.so.6
|
||||
* libXext.so.6
|
||||
* libXi.so.6
|
||||
* libXrender.so.1
|
||||
* libnvidia-tls.so.340.106
|
||||
* libnvidia-glcore.so.340.106
|
||||
* libstdc++.so.6
|
||||
* libxcb.so.1
|
||||
* libXau.so.6
|
||||
* libXdmcp.so.6
|
||||
|
||||
# Hook module configuration file
|
||||
Checkout the usage information of the hook and set the option values according
|
||||
to your needs. Here is an example option configuration file:
|
||||
```
|
||||
log_file_path=./pumptools.log
|
||||
log_level=3
|
||||
enable_file_monitor=0
|
||||
enable_io_monitor=0
|
||||
piubtn_emu_lib_path=
|
||||
piubtn_real_passthrough=1
|
||||
piuio_emu_lib_path=./piuio.so
|
||||
piuio_real_passthrough=1
|
||||
piuio_exit_test_service=1
|
||||
game_data_path=./game
|
||||
```
|
||||
|
||||
# Run the game
|
||||
Ensure you are running an X screen. Run the game using
|
||||
Ensure you are running an X screen. Otherwise, you have to start one along with the game. Various library/system-calls
|
||||
require root privileges. Make sure to run the game as root or with sudo (otherwise you get various sorts of errors,
|
||||
typically permission denied). Use the included *run.sh* file to start the game on a desktop environment.
|
||||
|
||||
# Further notes
|
||||
## ITG2 PIUIO kernel module hack
|
||||
If you don't have the original kernel module installed and you are running a
|
||||
real PIUIO, you have to hook the *piuio.so* lib which implements the piuio api.
|
||||
The "emulation" part which simply calls back to a real piuio driver takes
|
||||
care of handling the kernel hack path then. If you run on a real IO without
|
||||
hooking that module, you won't get an inputs or outputs.
|
||||
|
||||
## The game is crashing very early
|
||||
This is probably due to not having the right IO hardware connected/emulated.
|
||||
The game doesn't have any proper error handling if either the PIUIO or the
|
||||
button IO is missing/not connected (or not emulated).
|
||||
|
||||
## Vsync
|
||||
The game is required to run with vsync on.
|
||||
@@ -0,0 +1,107 @@
|
||||
# prohook: Pro (1)
|
||||
This readme covers any matters that are relevant for this hook, only. Anything that applies to **all** hooks is covered
|
||||
in a [main hook readme file](../hook.md) including general data setup and a quick start guide.
|
||||
|
||||
## Versions supported
|
||||
All known versions supported if no-dongle patched at this time.
|
||||
|
||||
## Dependencies
|
||||
Make sure to read the different methods of dependency resolution available in the [main hook readme file](../hook.md),
|
||||
first.
|
||||
|
||||
The following **direct** dependencies (cmd: `readelf -d piu`) are required:
|
||||
* libXtst.so.6
|
||||
* libXrandr.so.2
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libdl.so.2
|
||||
* libavformat.so.51
|
||||
* libavcodec.so.51
|
||||
* libavutil.so.49
|
||||
* libusb-0.1.so.4
|
||||
* libpthread.so.0
|
||||
* librt.so.1
|
||||
* libstdc++.so.5
|
||||
* libm.so.6
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libX11.so.6
|
||||
|
||||
As for method 1, when using Ubuntu, the dependencies can be found in the following packages:
|
||||
* libc-bin (or gcc-multilib on a 64-bit platform)
|
||||
* libx11-6
|
||||
* libusb-0.1-4
|
||||
* libasound2
|
||||
|
||||
## Data setup
|
||||
A clean set of data won't work here. You need the decrypted data zip files and a patched executable that uses plain zip
|
||||
files instead of encrypted ones.
|
||||
|
||||
All access to files and folders are detoured to two folders which makes setting up everything easier.
|
||||
|
||||
You need two main folders:
|
||||
* `game` folder with the following contents
|
||||
* All data zip files (e.g. `data0.zip`, `data1.zip`, ..., `encore.zip`)
|
||||
* An empty file `FX` (if you run this on a FX or other cabinet with a widescreen monitor)
|
||||
* `save ` folder. Contents are generated automatically if empty.
|
||||
|
||||
## USB thumb drive/profile support
|
||||
Without any patches, the game's way of handling USB thumb drives is incompatible to the kernels of the last years.
|
||||
This is fixed by prohook but requires some additional configuration effort.
|
||||
|
||||
1. Decide which physical USB ports of your machine you are going to use for the player 1 and player 2 sides.
|
||||
1. Plug in *one* USB thumb drive into the player 1 port. Now you have to figure out two things:
|
||||
1. The device node the drive got assigned to by the kernel, e.g. `sdb`. For example, use the command `fdisk` or
|
||||
`lsblk` for this and take a note.
|
||||
1. The USB bus and port number the thumb drive is plugged into. `ls -la /sys/block` shows you all currently
|
||||
available block devices, including USB thumb drives. Find the thumb drive you plugged into the physical port and
|
||||
check the path the symlink gets resolved to. For example:
|
||||
`sdc -> ../devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0/host7/target7:0:0/7:0:0:0/block/sdd`
|
||||
You can identify the bus and port by taking a look at the part after the `usb2` directory here: `2-2`. The format
|
||||
is `bus-port` which means that in this example the drive is plugged into port 1 of bus 2. Take a note of that.
|
||||
1. Repeat the previous step for the physical port you consider using for player 2.
|
||||
1. Create two folders that will serve as mount points for the two player sides in the `/mnt` directory, e.g.
|
||||
`mkdir /mnt/0 && mkdir /mnt/1` (or re-using these folders if they already exist from other piu games).
|
||||
1. Add the following entry to the `/etc/fstab` file on the machine you want to run the game on:
|
||||
```text
|
||||
/dev/sdb1 /mnt/0 auto noauto,owner 0 0
|
||||
/dev/sdc1 /mnt/1 auto noauto,owner 0 0
|
||||
```
|
||||
Note: This does not create a fixed assignment of `/dev/sdb1` or `/dev/sdc1` to a specific physical USB port. It just
|
||||
ensures that any block device that gets enumerated as `/dev/sdb` will get its first partition mounted to `/mnt/0`
|
||||
(same concept applies to `/dev/sdc1/`).
|
||||
1. Modify the `hook.conf` file used with `prohook.so` by inserting the device nodes and bus-port combinations into the
|
||||
respective fields, for example:
|
||||
```text
|
||||
patch.usb_profile.p1.bus_port=2-1
|
||||
patch.usb_profile.p2.bus_port=2-2
|
||||
# Note: No partitions, e.g. sdb1, here
|
||||
patch.usb_profile.dev_nodes=sdb,sdc
|
||||
```
|
||||
|
||||
Once you plug-in a USB thumb drive to the configured ports, it should show up on the correct player side.
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
Make sure to also check the
|
||||
[troubleshooting and FAQ section of the main hook readme](../hook.md#troubleshooting-and-faq). This covers various
|
||||
things that apply to **all** hooks. The following sub-sections apply mainly to this hook.
|
||||
|
||||
## Enable log output from the game
|
||||
If you run into any issues, consider enabling the game's log output to console which might help you figuring out
|
||||
what's going on. This can be done by editing the `data.Static.ini` file in the `data0.zip` file. Go to the section
|
||||
`[Options-arcade]` and change the property `ShowLogOutput=0` to `ShowLogOutput=1`.
|
||||
|
||||
## Switch screen aspect ratio: 4:3 and 16:9
|
||||
The game supports 4:3 and 16:9 aspect ratios. To enable 16:9 mode, ensure that an empty file called `FX` is placed
|
||||
next to the data zip files inside the `game` directory. For 4:3 mode, simply delete the `FX` file if it exists.
|
||||
|
||||
## ITG2 PIUIO kernel module hack
|
||||
If you don't have the original kernel module installed and you are running a real PIUIO, you have to hook the
|
||||
`ptapi-io-piuio-real.so` lib which implements the piuio api. The "emulation" part which simply calls back to a real
|
||||
piuio driver takes care of handling the kernel hack path then. If you run on a real IO without hooking that module,
|
||||
you won't get any inputs or outputs.
|
||||
|
||||
## The game is crashing very early
|
||||
The log might show something about "ptrace failing" and not being able to "load libformat". However, the actual problem
|
||||
is probably not having all the necessary IO hardware connected (or emulation enabled). The game doesn't have any proper
|
||||
error handling if either the PIUIO or the button IO is missing/not connected (or not emulated).
|
||||
@@ -0,0 +1,60 @@
|
||||
# x2hook: Exceed 2
|
||||
This readme covers any matters that are relevant for this hook, only. Anything that applies to **all** hooks is covered
|
||||
in a [main hook readme file](../hook.md) including general data setup and a quick start guide.
|
||||
|
||||
## Versions supported
|
||||
* 102
|
||||
|
||||
Any other version won't work, period. The hook has to memory patch a weird bug causing the sound thread to crash.
|
||||
|
||||
## Dependencies
|
||||
Make sure to read the different methods of dependency resolution available in the [main hook readme file](../hook.md),
|
||||
first.
|
||||
|
||||
The following **direct** dependencies (cmd: `readelf -d piu`) are required:
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libpthread.so.0
|
||||
* libmad.so.0
|
||||
* libasound.so.2
|
||||
* libz.so.1
|
||||
* libpng12.so.0
|
||||
* libmpeg2.so.0
|
||||
* libmpeg2convert.so.0
|
||||
* libusb-0.1.so.4
|
||||
* liblua50.so.5.0
|
||||
* liblualib50.so.5.0
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libm.so.6
|
||||
* libX11.so.6
|
||||
* libstdc++.so.5
|
||||
|
||||
As for method 1, when using Ubuntu, the dependencies can be found in the following packages:
|
||||
* libc-bin (or gcc-multilib on a 64-bit platform)
|
||||
* libx11-6
|
||||
* zlib1g
|
||||
* libusb-0.1-4
|
||||
* libasound2
|
||||
|
||||
## Data setup
|
||||
In additional to the [general information applying to **all** hooks](../hook.md#data-setup), this game requires all
|
||||
files and folders in the `game` folder to be in **UPPERCASE** on a case-sensitive file system.
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
Make sure to also check the
|
||||
[troubleshooting and FAQ section of the main hook readme](../hook.md#troubleshooting-and-faq). This covers various
|
||||
things that apply to **all** hooks. The following sub-sections apply mainly to this hook.
|
||||
|
||||
### Fully unlock the game
|
||||
This hook has an option to fully unlock the game (well, unlock Canon-D Full Mix without entering the code because that's
|
||||
the only permanent unlock) by setting the following property in the configuration file:
|
||||
```text
|
||||
game.force_unlock=1
|
||||
```
|
||||
|
||||
### Using the unlock option to unlock Canon-D full remix does not work when enabled
|
||||
When the game cannot read from an existing `PIUEXCEED.INI` file, the settings are created in-memory and written to disk.
|
||||
Therefore, the unlock mechanism of the hook cannot apply this to the contents in-memory but only when the
|
||||
`PIUEXCEED.INI` file is re-loaded. To achieve this, once you started the game to create a new `PIUEXCEED.INI` with
|
||||
default values, simply quit the game and restart.
|
||||
@@ -0,0 +1,50 @@
|
||||
# zerohook: Zero
|
||||
This readme covers any matters that are relevant for this hook, only. Anything that applies to **all** hooks is covered
|
||||
in a [main hook readme file](../hook.md) including general data setup and a quick start guide.
|
||||
|
||||
## Versions supported
|
||||
All known versions supported.
|
||||
|
||||
## Dependencies
|
||||
Make sure to read the different methods of dependency resolution available in the [main hook readme file](../hook.md),
|
||||
first.
|
||||
|
||||
The following **direct** dependencies (cmd: `readelf -d piu`) are required:
|
||||
* libGL.so.1
|
||||
* libGLU.so.1
|
||||
* libpthread.so.0
|
||||
* libasound.so.2
|
||||
* libz.so.1
|
||||
* libpng12.so.0
|
||||
* libusb-0.1.so.4
|
||||
* liblua50.so.5.0
|
||||
* liblualib50.so.5.0
|
||||
* libgcc_s.so.1
|
||||
* libc.so.6
|
||||
* libm.so.6
|
||||
* libX11.so.6
|
||||
* libstdc++.so.5
|
||||
|
||||
As for method 1, when using Ubuntu, the dependencies can be found in the following packages:
|
||||
* libc-bin (or gcc-multilib on a 64-bit platform)
|
||||
* libx11-6
|
||||
* zlib1g
|
||||
* libusb-0.1-4
|
||||
* libasound2
|
||||
|
||||
## Data setup
|
||||
In additional to the [general information applying to **all** hooks](../hook.md#data-setup), this game requires all
|
||||
files and folders in the `game` folder to be in **UPPERCASE** on a case-sensitive file system.
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
Make sure to also check the
|
||||
[troubleshooting and FAQ section of the main hook readme](../hook.md#troubleshooting-and-faq). This covers various
|
||||
things that apply to **all** hooks. The following sub-sections apply mainly to this hook.
|
||||
|
||||
### Fully unlock the game
|
||||
This hook has an option to fully unlock the game by setting the following property in the configuration file:
|
||||
```text
|
||||
game.force_unlock=1
|
||||
```
|
||||
|
||||
This will unlock all missions on mission station as well as any locked songs and stepcharts.
|
||||