init
This commit is contained in:
commit
c281b94d6a
6 changed files with 1321 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
_drafts
|
||||||
|
run
|
||||||
|
TODO
|
22
LICENSE
Normal file
22
LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
Copyright (c) 2019-2021, mord0d and their slaves
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
123
README.md
Normal file
123
README.md
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
gamelib
|
||||||
|
=======
|
||||||
|
|
||||||
|
`gamelib` is a shell script for gaming on [FreeBSD](https://www.freebsd.org).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Supported emulators:
|
||||||
|
|
||||||
|
- amd64
|
||||||
|
- dolphin
|
||||||
|
- dosbox
|
||||||
|
- gzdoom
|
||||||
|
- pcsxr
|
||||||
|
- renpy
|
||||||
|
- wine
|
||||||
|
- wine32 (lib32 required)
|
||||||
|
- i386 **\[UNTESTED\]**
|
||||||
|
- dolphin
|
||||||
|
- dosbox
|
||||||
|
- gzdoom
|
||||||
|
- pcsxr
|
||||||
|
- renpy
|
||||||
|
- wine
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Pre-requirements:
|
||||||
|
|
||||||
|
- Running X11.
|
||||||
|
- `pkg` (any version with `fetch` subcommand but **not** 1.13.1, it's broken!)
|
||||||
|
installed;
|
||||||
|
- Binary repo(s) with supported emulators/engines enabled;
|
||||||
|
- No need to install any packages (except `pkg` itself), they'll never be used;
|
||||||
|
- **\[OPTIONAL\]** amd64 with lib32 support (used by `i386-wine`);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Setup games:
|
||||||
|
|
||||||
|
### The structure of the directory with games:
|
||||||
|
|
||||||
|
- `$GAMELIB_GAMES_DIR`
|
||||||
|
- `gamename/` (without spaces)
|
||||||
|
- `gamelib.conf` (see below)
|
||||||
|
- `game/` (place here game files)
|
||||||
|
- `prefix/` (do **not** create it manually!)
|
||||||
|
|
||||||
|
### The structure of `gamelib.conf`:
|
||||||
|
|
||||||
|
| Function | Description |
|
||||||
|
| :---: | --- |
|
||||||
|
| `prerun()` | Function that triggered any time before game run |
|
||||||
|
| `prerun_first()` | Function that triggered after prefix was created |
|
||||||
|
|
||||||
|
These functions available for all supported emulators/engines, even if
|
||||||
|
`gamelib.conf` does not required.
|
||||||
|
|
||||||
|
#### dolphin
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
| :---: | --- |
|
||||||
|
| `dolphin_file=` | GameCube/Wii disk image file (relative from the `game/`, see above) |
|
||||||
|
|
||||||
|
#### dosbox
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
| :---: | --- |
|
||||||
|
| `dosbox_file=` | MS-DOS executable (relative from the `game/`, see above) |
|
||||||
|
|
||||||
|
#### gzdoom
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
| :---: | --- |
|
||||||
|
| `gzdoom_file=` | WAD file (relative from the `game/`, see above) |
|
||||||
|
|
||||||
|
#### pcsxr
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
| :---: | --- |
|
||||||
|
| `pcsxr_file=` | Sony PlayStation (PSX) image file (relative from the `game/`, see above) |
|
||||||
|
| `pcsxr_plugins_dir=` | Absolute path to the directory with plugins, they will be symlinked to the prefix |
|
||||||
|
| `pcsxr_bios_dir=` | Absolute path to the directory with bios, they will be symlinked to the prefix |
|
||||||
|
|
||||||
|
#### renpy
|
||||||
|
|
||||||
|
No `gamelib.conf` required.
|
||||||
|
|
||||||
|
#### wine (any arch)
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
| :---: | --- |
|
||||||
|
| `wine_file=` | Microsoft Windows executable (PE32/PE32+) (relative from the `game/`, see above) |
|
||||||
|
| `wine_args=` | Additional arguments for the executable |
|
||||||
|
| `wine_dlls=` | Space-separated dlls that will be installed by winetricks |
|
||||||
|
| `wine_settings=` | Space-separated settings that will be configured by winetricks |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Pre-run:
|
||||||
|
|
||||||
|
```
|
||||||
|
export GAMELIB_GAMES_DIR="${HOME}/games"
|
||||||
|
```
|
||||||
|
|
||||||
|
Optional, you can set `GAMELIB_DEBUG` to enable stdout/stderr (in any case,
|
||||||
|
everything will be logged to `$GAMELIB_GAMES_DIR/.gamelib/gamelib.log`):
|
||||||
|
|
||||||
|
```
|
||||||
|
export GAMELIB_DEBUG=1
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run gamelib:
|
||||||
|
|
||||||
|
```
|
||||||
|
/path/to/gamelib/gamelib help
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## License:
|
||||||
|
|
||||||
|
This project is licensed under the terms of [2-Clause BSD](./LICENSE).
|
975
gamelib
Executable file
975
gamelib
Executable file
|
@ -0,0 +1,975 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 2019-2021, mord0d and their slaves
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
# are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
# list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
VERSION="0.5.3"
|
||||||
|
PROGNAME="gamelib"
|
||||||
|
|
||||||
|
arch="$(uname -m)"
|
||||||
|
euid="$(id -u)"
|
||||||
|
uid="$(id -ur)"
|
||||||
|
user="$(id -urn)"
|
||||||
|
group="$(id -grn)"
|
||||||
|
|
||||||
|
orig_HOME="${HOME}"
|
||||||
|
orig_XDG_CONFIG_HOME="${XDG_CONFIG_HOME}"
|
||||||
|
orig_XDG_CACHE_HOME="${XDG_CACHE_HOME}"
|
||||||
|
orig_XDG_DATA_HOME="${XDG_DATA_HOME}"
|
||||||
|
|
||||||
|
orig_PATH="${PATH}"
|
||||||
|
orig_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}"
|
||||||
|
orig_LD_32_LIBRARY_PATH_RPATH="${LD_32_LIBRARY_PATH_RPATH}"
|
||||||
|
orig_LD_32_LIBRARY_PATH="${LD_32_LIBRARY_PATH}"
|
||||||
|
orig_PYTHONPATH="${PYTHONPATH}"
|
||||||
|
|
||||||
|
MY_LOCKFILE="${TMPDIR:-/tmp}/.${PROGNAME}-$uid.lock"
|
||||||
|
|
||||||
|
MY_DATEFORMAT="${GAMELIB_DATE_FORMAT:-%Y-%m-%d %H:%M:%S}"
|
||||||
|
MY_DEBUG="${GAMELIB_DEBUG:-0}"
|
||||||
|
|
||||||
|
MY_TEMPDIR="${TMPDIR:-/tmp}/.${PROGNAME}}"
|
||||||
|
|
||||||
|
|
||||||
|
# cmd:iscmd {{{
|
||||||
|
cmd:iscmd() {
|
||||||
|
command -v "${1}" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# cmd:ls {{{
|
||||||
|
cmd:ls() {
|
||||||
|
ls --color=never -1 "${@}" 2>/dev/null
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# cmd:ln {{{
|
||||||
|
cmd:ln() {
|
||||||
|
ln -s "${1}" "${2}" >/dev/null 2>&1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# cmd:mkdir {{{
|
||||||
|
cmd:mkdir() {
|
||||||
|
mkdir -p "${1}" >/dev/null 2>&1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
|
# hlpr:startup {{{
|
||||||
|
hlpr:startup() {
|
||||||
|
export MY_GAMESDIR="${GAMELIB_GAMES_DIR}"
|
||||||
|
if [ -n "${MY_GAMESDIR}" -a -d "${MY_GAMESDIR}" -a -r "${MY_GAMESDIR}" -a -w "${MY_GAMESDIR}" -a -x "${MY_GAMESDIR}" ]; then
|
||||||
|
export MY_DIR="${MY_GAMESDIR}/.gamelib"
|
||||||
|
else
|
||||||
|
hlpr:die "\$GAMELIB_GAMES_DIR is not set or it is not a directory or have wrong permissions"
|
||||||
|
fi
|
||||||
|
cmd:mkdir "${MY_DIR}"
|
||||||
|
[ -n "${MY_DIR}" -a -d "${MY_DIR}" -a -r "${MY_DIR}" -a -w "${MY_DIR}" -a -x "${MY_DIR}" ] || hlpr:die "\$GAMELIB_GAMES_DIR has wrong permissions"
|
||||||
|
export MY_LIBDIR="${MY_DIR}/lib"
|
||||||
|
export MY_BINDIR="${MY_DIR}/bin"
|
||||||
|
export MY_TEMPDIR="${MY_DIR}/tmp"
|
||||||
|
export MY_LOGFILE="${MY_DIR}/gamelib.log"
|
||||||
|
for dir in "${MY_LIBDIR}" "${MY_BINDIR}"; do
|
||||||
|
cmd:mkdir "${dir}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# hlpr:shutdown {{{
|
||||||
|
hlpr:shutdown() {
|
||||||
|
if cmd:iscmd "xrandr"; then
|
||||||
|
for out in $(xrandr -q | awk '/ connected /{print $1}'); do
|
||||||
|
xrandr --output "${out}" --auto --gamma 1.0
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
unset LIBGL_DRIVERS_PATH LC_ALL TZ
|
||||||
|
unset bin path
|
||||||
|
if [ -n "${orig_PATH}" ]; then
|
||||||
|
export PATH="${orig_PATH}"
|
||||||
|
else
|
||||||
|
unset PATH
|
||||||
|
fi
|
||||||
|
if [ -n "${orig_HOME}" ]; then
|
||||||
|
export HOME="${orig_HOME}"
|
||||||
|
else
|
||||||
|
unset HOME
|
||||||
|
fi
|
||||||
|
if [ -n "${orig_XDG_CONFIG_HOME}" ]; then
|
||||||
|
export XDG_CONFIG_HOME="${orig_XDG_CONFIG_HOME}"
|
||||||
|
else
|
||||||
|
unset XDG_CONFIG_HOME
|
||||||
|
fi
|
||||||
|
if [ -n "${orig_XDG_CACHE_HOME}" ]; then
|
||||||
|
export XDG_CACHE_HOME="${orig_XDG_CACHE_HOME}"
|
||||||
|
else
|
||||||
|
unset XDG_CACHE_HOME
|
||||||
|
fi
|
||||||
|
if [ -n "${orig_XDG_DATA_HOME}" ]; then
|
||||||
|
export XDG_DATA_HOME="${orig_XDG_DATA_HOME}"
|
||||||
|
else
|
||||||
|
unset XDG_DATA_HOME
|
||||||
|
fi
|
||||||
|
if [ -n "${orig_LD_LIBRARY_PATH}" ]; then
|
||||||
|
export LD_LIBRARY_PATH="${orig_LD_LIBRARY_PATH}"
|
||||||
|
else
|
||||||
|
unset LD_LIBRARY_PATH
|
||||||
|
fi
|
||||||
|
if [ -n "${orig_LD_32_LIBRARY_PATH}" ]; then
|
||||||
|
export LD_32_LIBRARY_PATH="${orig_LD_32_LIBRARY_PATH}"
|
||||||
|
else
|
||||||
|
unset LD_32_LIBRARY_PATH
|
||||||
|
fi
|
||||||
|
if [ -n "${orig_LD_32_LIBRARY_PATH_RPATH}" ]; then
|
||||||
|
export LD_32_LIBRARY_PATH_RPATH="${orig_LD_32_LIBRARY_PATH_RPATH}"
|
||||||
|
else
|
||||||
|
unset LD_32_LIBRARY_PATH_RPATH
|
||||||
|
fi
|
||||||
|
if [ -n "${orig_PYTHONPATH}" ]; then
|
||||||
|
export PYTHONPATH="${orig_PYTHONPATH}"
|
||||||
|
else
|
||||||
|
unset PYTHONPATH
|
||||||
|
fi
|
||||||
|
rm -R "${MY_TEMPDIR}" >/dev/null 2>&1
|
||||||
|
rm "${MY_LOCKFILE}" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# hlpr:msg_log {{{
|
||||||
|
hlpr:msg_log() {
|
||||||
|
c_reset="\033[0m"
|
||||||
|
c_bold="\033[1m"
|
||||||
|
c_black="\033[30m"
|
||||||
|
c_red="\033[31m"
|
||||||
|
c_green="\033[32m"
|
||||||
|
c_yellow="\033[33m"
|
||||||
|
c_blue="\033[34m"
|
||||||
|
c_magenta="\033[35m"
|
||||||
|
c_cyan="\033[36m"
|
||||||
|
b_black="\033[30;1m"
|
||||||
|
b_red="\033[31;1m"
|
||||||
|
b_green="\033[32;1m"
|
||||||
|
b_yellow="\033[33;1m"
|
||||||
|
b_blue="\033[34;1m"
|
||||||
|
b_magenta="\033[35;1m"
|
||||||
|
b_cyan="\033[36;1m"
|
||||||
|
d="$(date "+${MY_DATEFORMAT}")"
|
||||||
|
lvl="${1}"
|
||||||
|
shift
|
||||||
|
case "${lvl}" in
|
||||||
|
(INF) clr="${b_green}" ;;
|
||||||
|
(WRN) clr="${b_yellow}" ;;
|
||||||
|
(ERR) clr="${b_red}" ;;
|
||||||
|
(FTL) clr="${b_red}" ;;
|
||||||
|
esac
|
||||||
|
if [ -z "${MY_LOGFILE}" -o "${MY_DEBUG}" != "0" ]; then
|
||||||
|
echo -e "[${clr}${lvl}${c_reset}] ${c_cyan}${d}${c_reset} ${c_bold}${*}${c_reset}" >&2
|
||||||
|
fi
|
||||||
|
echo "[${lvl}:${$}] ${d} ${*}" >>"${MY_LOGFILE:-/dev/null}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# hlpr:err {{{
|
||||||
|
hlpr:err() {
|
||||||
|
hlpr:msg_log "ERR" "${@}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# hlpr:wrn {{{
|
||||||
|
hlpr:wrn() {
|
||||||
|
hlpr:msg_log "WRN" "${@}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# hlpr:inf {{{
|
||||||
|
hlpr:inf() {
|
||||||
|
hlpr:msg_log "INF" "${@}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# hlpr:die {{{
|
||||||
|
hlpr:die() {
|
||||||
|
hlpr:msg_log "FTL" "${@}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# hlpr:ask {{{
|
||||||
|
hlpr:ask() {
|
||||||
|
while true; do
|
||||||
|
read -p "${1}? [y/n] " answer
|
||||||
|
case "${answer}" in
|
||||||
|
([Yy]) return 0 ;;
|
||||||
|
([Nn]) return 1 ;;
|
||||||
|
(*) MY_DEBUG=1 hlpr:err "incorrect input; only \"y\" or \"n\"" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# hlpr:pkgline {{{
|
||||||
|
hlpr:pkgline() {
|
||||||
|
case "${1}" in
|
||||||
|
(dolphin) pkg_line="^dolphin-emu-[0-9]" ;;
|
||||||
|
(dosbox) pkg_line="^dosbox-[0-9]" ;;
|
||||||
|
(gzdoom) pkg_line="^gzdoom-[0-9]" ;;
|
||||||
|
(pcsxr) pkg_line="^pcsxr-[0-9]" ;;
|
||||||
|
(renpy) pkg_line="^renpy-[0-9]" ;;
|
||||||
|
(renpy6) pkg_line="^renpy[0-9]-[0-9]" ;;
|
||||||
|
(wine) pkg_line="^wine-devel-[0-9]" ;; # TODO:BROKEN
|
||||||
|
# (wine) pkg_line="^wine-[0-9]" ;;
|
||||||
|
(wine32) pkg_line="^i386-wine-devel-[0-9]" ;;
|
||||||
|
(*) return 1 ;;
|
||||||
|
esac
|
||||||
|
echo "${pkg_line}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
|
# get:pkgname {{{
|
||||||
|
get:pkgname() {
|
||||||
|
pkg search "$(hlpr:pkgline "${1}")" 2>/dev/null | awk '{print $1}' | sort -V | tail -n1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# get:gametype {{{
|
||||||
|
get:gametype() {
|
||||||
|
unset wine_file wine_args wine_dlls wine_settings
|
||||||
|
unset -f prerun prerun_first
|
||||||
|
unset dolphin_file
|
||||||
|
unset gzdoom_file
|
||||||
|
unset dosbox_file
|
||||||
|
unset ft sv pv
|
||||||
|
if [ -d "${MY_GAMESDIR}/${1}/game" ]; then
|
||||||
|
if [ -f "${MY_GAMESDIR}/${1}/gamelib.conf" ]; then
|
||||||
|
. "${MY_GAMESDIR}/${1}/gamelib.conf"
|
||||||
|
if [ -n "${dolphin_file}" -a -f "${MY_GAMESDIR}/${1}/game/${dolphin_file}" ]; then
|
||||||
|
ft="$(file -Lbr "${MY_GAMESDIR}/${1}/game/${dolphin_file}")"
|
||||||
|
if echo "${ft}" | grep -qE '^Nintendo (Wii|GameCube) disc image \(GCZ format\)$'; then
|
||||||
|
echo "dolphin"
|
||||||
|
else
|
||||||
|
hlpr:err "\"${dolphin_file}\" is not a dolphin image file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
elif [ -n "${dosbox_file}" -a -f "${MY_GAMESDIR}/${1}/game/${dosbox_file}" ]; then
|
||||||
|
ft="$(file -Lbr "${MY_GAMESDIR}/${1}/game/${dosbox_file}")"
|
||||||
|
# MS-DOS executable, LE executable for MS-DOS, DOS4GW DOS extender
|
||||||
|
# MS-DOS executable
|
||||||
|
if echo "${ft}" | grep -qE '^MS-DOS executable.*$'; then
|
||||||
|
echo "dosbox"
|
||||||
|
else
|
||||||
|
hlpr:err "\"${dosbox_file}\" is not a dosbox executable file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
elif [ -n "${gzdoom_file}" -a -f "${MY_GAMESDIR}/${1}/game/${gzdoom_file}" ]; then
|
||||||
|
ft="$(file -Lbr "${MY_GAMESDIR}/${1}/game/${gzdoom_file}")"
|
||||||
|
if echo "${ft}" | grep -qE '^doom main IWAD data containing [0-9]+ lumps$'; then
|
||||||
|
echo "gzdoom"
|
||||||
|
else
|
||||||
|
hlpr:err "\"${gzdoom_file}\" is not a gzdoom WAD file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
elif [ -n "${pcsxr_file}" -a -f "${MY_GAMESDIR}/${1}/game/${pcsxr_file}" ]; then
|
||||||
|
if run:pcsxr:disktype "${MY_GAMESDIR}/${1}/game/${pcsxr_file}" | grep -q '^ Application "PLAYSTATION"$'; then
|
||||||
|
echo "pcsxr"
|
||||||
|
else
|
||||||
|
hlpr:err "\"${pcsxr_file}\" is not a PlayStation (PSX) disk image"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
elif [ -n "${wine_file}" -a -f "${MY_GAMESDIR}/${1}/game/${wine_file}" ]; then
|
||||||
|
ft="$(file -Lbr "${MY_GAMESDIR}/${1}/game/${wine_file}" 2>/dev/null)"
|
||||||
|
# PE32 executable (GUI) Intel 80386, for MS Windows
|
||||||
|
# PE32 executable (GUI) Intel 80386 (stripped to external PDB), for MS Windows
|
||||||
|
# PE32 executable (GUI) Intel 80386, for MS Windows, Nullsoft Installer self-extracting archive
|
||||||
|
# PE32+ executable (GUI) x86-64, for MS Windows
|
||||||
|
# PE32+ executable (GUI) x86-64 (stripped to external PDB), for MS Windows
|
||||||
|
# MS-DOS executable PE32 executable (GUI) Intel 80386, for MS Windows, MZ for MS-DOS
|
||||||
|
if echo "${ft}" | grep -qE '^PE32 executable.*Intel 80386.*for MS Windows' \
|
||||||
|
|| echo "${ft}" | grep -qE '^MS-DOS executable.*Intel 80386.*for MS Windows'; then
|
||||||
|
if [ "${arch}" = "amd64" ]; then
|
||||||
|
if [ -f "/libexec/ld-elf32.so.1" ]; then
|
||||||
|
echo "wine32"
|
||||||
|
else
|
||||||
|
hlpr:err "you can not run win32 executables on ${arch} without lib32 support"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
elif [ "${arch}" = "i386" ]; then
|
||||||
|
echo "wine"
|
||||||
|
fi
|
||||||
|
elif echo "${ft}" | grep -qE '^PE32\+ executable.*x86-64.*for MS Windows$'; then
|
||||||
|
if [ "${arch}" = "amd64" ]; then
|
||||||
|
echo "wine"
|
||||||
|
else
|
||||||
|
hlpr:err "you can not run win64 executables on ${arch}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
hlpr:err "\"${1}\": unknown game type"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ -f "${MY_GAMESDIR}/${1}/game/archive.rpa" ]; then
|
||||||
|
sv="$(grep -o '[0-9]' "${MY_GAMESDIR}/${1}/game/script_version.txt" 2>/dev/null | head -n1)"
|
||||||
|
pv="$(pkg rquery '%v' 'renpy' 2>/dev/null | sed 's/\..*//')"
|
||||||
|
if [ -n "${sv}" -a -n "${pv}" -a "${sv}" = "${pv}" ]; then
|
||||||
|
echo "renpy"
|
||||||
|
else
|
||||||
|
hlpr:wrn "old versions of RenPy not supported (yet)"
|
||||||
|
echo "renpy6"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
hlpr:err "\"${1}\": unknown game type"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
|
# prnt:license {{{
|
||||||
|
prnt:license() {
|
||||||
|
sed -n 's/^# //; s/^#$//; 4,25p' "${0}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# prnt:version {{{
|
||||||
|
prnt:version() {
|
||||||
|
echo "${PROGNAME} ${VERSION}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# prnt:usage {{{
|
||||||
|
prnt:usage() {
|
||||||
|
cat <<-__EOF__ | column -ts'|'
|
||||||
|
run <game> [args]|run game
|
||||||
|
clean|available in: renpy
|
||||||
|
cfg, cmd, reg|available in: wine
|
||||||
|
reinit|available in: dosbox, wine
|
||||||
|
gui|available in: dolphin, pcsxr
|
||||||
|
list|show games list
|
||||||
|
help|show this help
|
||||||
|
version|print ${PROGNAME} version
|
||||||
|
upgrade|upgrade existing libs (emulators)
|
||||||
|
license|print license
|
||||||
|
__EOF__
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# prnt:list {{{
|
||||||
|
prnt:list() {
|
||||||
|
orig_MY_DEBUG="${MY_DEBUG}"
|
||||||
|
MY_DEBUG=0
|
||||||
|
for i in $(cmd:ls "${MY_GAMESDIR}"); do
|
||||||
|
gametype="$(get:gametype "${i}")"
|
||||||
|
if [ -n "${gametype}" ]; then
|
||||||
|
echo "${i}|${gametype}"
|
||||||
|
fi
|
||||||
|
done | column -ts'|'
|
||||||
|
MY_DEBUG="${orig_MY_DEBUG}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# prnt:list_libs {{{
|
||||||
|
prnt:list_libs() {
|
||||||
|
for lib in $(cmd:ls "${MY_LIBDIR}"); do
|
||||||
|
gameline="$(hlpr:pkgline "${lib#*.}")"
|
||||||
|
if [ ${?} -eq 0 ]; then
|
||||||
|
ver="$(grep "${gameline}" "${MY_LIBDIR}/${lib}/.packages.${PROGNAME}" | grep -oE '\-[0-9].*' | sed 's/^-//')"
|
||||||
|
echo -n "${lib#*.}|${ver}"
|
||||||
|
if [ -d "${MY_LIBDIR}/${lib}.old" ]; then
|
||||||
|
oldver="$(grep "${gameline}" "${MY_LIBDIR}/${lib}.old/.packages.${PROGNAME}" | grep -oE '\-[0-9].*' | sed 's/^-//')"
|
||||||
|
echo "|${oldver}"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done | column -ts'|'
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
|
# gamelib:add {{{
|
||||||
|
gamelib:add() {
|
||||||
|
pkg="$(get:pkgname "${1}")"
|
||||||
|
pkg_tmp="${MY_TEMPDIR}/.${PROGNAME}-${uid}-${1}"
|
||||||
|
pkg_unpack="${pkg_tmp}/Unpack"
|
||||||
|
pkg_workdir="${pkg_tmp}/Workdir"
|
||||||
|
cmd:mkdir "${pkg_tmp}"
|
||||||
|
cmd:mkdir "${pkg_unpack}"
|
||||||
|
# cmd:mkdir "${pkg_workdir}"
|
||||||
|
if ! pkg fetch -q -U -d -o "${pkg_tmp}" -y "${pkg}" >/dev/null 2>&1; then
|
||||||
|
cd "${MY_DIR}"
|
||||||
|
rm -fR "${pkg_tmp}" >/dev/null 2>&1
|
||||||
|
hlpr:die "fetch packages for \"${1}\" failed"
|
||||||
|
fi
|
||||||
|
for p in $(find "${pkg_tmp}/All" -type f -print 2>/dev/null); do
|
||||||
|
if ! tar -x -C "${pkg_unpack}" -f "${p}" >/dev/null 2>&1; then
|
||||||
|
cd "${MY_DIR}"
|
||||||
|
rm -fR "${pkg_tmp}" >/dev/null 2>&1
|
||||||
|
hlpr:die "cannot unpack \"${p##*/}\" for \"${1}\""
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
chflags -R 0 "${pkg_unpack}" >/dev/null 2>&1
|
||||||
|
chown -R ${user}:${group} "${pkg_unpack}" >/dev/null 2>&1
|
||||||
|
chmod -R u+rw,go-w "${pkg_unpack}" >/dev/null 2>&1
|
||||||
|
mv "${pkg_unpack}/usr/local" "${pkg_workdir}" >/dev/null 2>&1
|
||||||
|
rm -R "${pkg_unpack}" >/dev/null 2>&1
|
||||||
|
cd "${pkg_workdir}"
|
||||||
|
for i in "include" "libdata/pkgconfig" "man" "var" "share/aclocal" \
|
||||||
|
"share/applications" "share/certs" "share/cmake" "share/bash-completion" \
|
||||||
|
"share/doc" "share/emacs" "share/examples" "share/ffmpeg/examples" \
|
||||||
|
"share/gtk-doc" "share/info" "share/licenses" "share/locale" "share/pciids" \
|
||||||
|
"share/readline"; do
|
||||||
|
[ -d "${pkg_workdir}/${i}" ] && rm -R "${pkg_workdir}/${i}" >/dev/null 2>&1
|
||||||
|
done
|
||||||
|
cmd:ls "${pkg_tmp}/All" | sed 's/\.[a-z]*$//' > "${pkg_workdir}/.packages.${PROGNAME}"
|
||||||
|
mv "${pkg_workdir}" "${MY_LIBDIR}/${arch}.${1}" >/dev/null 2>&1
|
||||||
|
rm -R "${pkg_tmp}" >/dev/null 2>&1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# gamelib:upgrade {{{
|
||||||
|
gamelib:upgrade() {
|
||||||
|
for lib in $(cmd:ls "${MY_LIBDIR}"); do
|
||||||
|
gameline="$(hlpr:pkgline "${lib#*.}")"
|
||||||
|
if [ ${?} -eq 0 ]; then
|
||||||
|
i="$(grep "${gameline}" "${MY_LIBDIR}/${lib}/.packages.${PROGNAME}")"
|
||||||
|
p="$(get:pkgname "${lib#*.}")"
|
||||||
|
if [ "${i}" != "${p}" ]; then
|
||||||
|
if hlpr:ask "upgrade ${lib#*.}"; then
|
||||||
|
hlpr:inf "upgrade ${lib}..."
|
||||||
|
if [ -d "${MY_LIBDIR}/${lib}.old" ]; then
|
||||||
|
rm -R "${MY_LIBDIR}/${lib}.old"
|
||||||
|
fi
|
||||||
|
mv "${MY_LIBDIR}/${lib}" "${MY_LIBDIR}/${lib}.old"
|
||||||
|
gamelib:add "${lib#*.}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# gamelib:rollback {{{
|
||||||
|
gamelib:rollback() {
|
||||||
|
if [ -d "${MY_LIBDIR}/${arch}.${1}.old" ]; then
|
||||||
|
if [ -d "${MY_LIBDIR}/${arch}.${1}" ]; then
|
||||||
|
rm -R "${MY_LIBDIR}/${arch}.${1}" >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
mv "${MY_LIBDIR}/${arch}.${1}.old" "${MY_LIBDIR}/${arch}.${1}"
|
||||||
|
else
|
||||||
|
hlpr:die "\"${1}\" can't be rolled back"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
|
# run:gamelib:configure {{{
|
||||||
|
run:gamelib:configure() {
|
||||||
|
# export LC_ALL="C"
|
||||||
|
# export LC_ALL="ru_RU.UTF-8"
|
||||||
|
export TZ="UTC"
|
||||||
|
export HOME="${MY_GAMESDIR}/${1}/prefix"
|
||||||
|
export XDG_CONFIG_HOME="${HOME}/.config"
|
||||||
|
export XDG_CACHE_HOME="${HOME}/.cache"
|
||||||
|
export XDG_DATA_HOME="${HOME}/.local/share"
|
||||||
|
for dir in "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${XDG_DATA_HOME}"; do
|
||||||
|
cmd:mkdir "${dir}" || hlpr:die "can't create \"${dir}\""
|
||||||
|
done
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:dolphin {{{
|
||||||
|
run:dolphin() {
|
||||||
|
export path="${MY_LIBDIR}/${arch}.dolphin"
|
||||||
|
export bin="${path}/bin/dolphin-emu"
|
||||||
|
export PATH="${path}/bin:${PATH}"
|
||||||
|
export LD_LIBRARY_PATH="${path}/lib:${path}/lib/pulseaudio:${LD_LIBRARY_PATH}"
|
||||||
|
cmd:mkdir "${PREFIX_DIR}"
|
||||||
|
run:gamelib:configure "${1}"
|
||||||
|
cd "${GAME_DIR}"
|
||||||
|
. ../gamelib.conf
|
||||||
|
[ -f "${GAME_DIR}/${dolphin_file}" ] || hlpr:die "\"${dolphin_file}\" not found"
|
||||||
|
case "${2}" in
|
||||||
|
(gui) "${bin}" >>"${PREFIX_DIR}/gamelib.log" 2>&1; return ;;
|
||||||
|
('') ;;
|
||||||
|
(*) hlpr:wrn "unknown argument \"${2}\""; return ;;
|
||||||
|
esac
|
||||||
|
if [ -f "${HOME}/.config/dolphin-emu/Dolphin.ini" ]; then
|
||||||
|
"${bin}-nogui" "${dolphin_file}" >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
else
|
||||||
|
"${bin}" >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
fi
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:dosbox:configure {{{
|
||||||
|
run:dosbox:configure() {
|
||||||
|
cat > "${GAME_DIR}/dosbox.conf" <<-__EOF__
|
||||||
|
[sdl]
|
||||||
|
fullscreen=false
|
||||||
|
fulldouble=false
|
||||||
|
fullresolution=desktop
|
||||||
|
windowresolution=original
|
||||||
|
output=opengl
|
||||||
|
autolock=true
|
||||||
|
sensitivity=100
|
||||||
|
waitonerror=true
|
||||||
|
priority=higher,normal
|
||||||
|
mapperfile=mapper-0.74-3.map
|
||||||
|
usescancodes=false
|
||||||
|
|
||||||
|
[dosbox]
|
||||||
|
language=
|
||||||
|
machine=vesa_nolfb
|
||||||
|
captures=capture
|
||||||
|
memsize=64
|
||||||
|
|
||||||
|
[render]
|
||||||
|
frameskip=0
|
||||||
|
aspect=true
|
||||||
|
scaler=none
|
||||||
|
|
||||||
|
[cpu]
|
||||||
|
core=auto
|
||||||
|
cputype=auto
|
||||||
|
cycles=auto
|
||||||
|
cycleup=10
|
||||||
|
cycledown=20
|
||||||
|
|
||||||
|
[mixer]
|
||||||
|
nosound=false
|
||||||
|
rate=44100
|
||||||
|
blocksize=1024
|
||||||
|
prebuffer=512
|
||||||
|
|
||||||
|
[midi]
|
||||||
|
mpu401=intelligent
|
||||||
|
mididevice=default
|
||||||
|
midiconfig=
|
||||||
|
|
||||||
|
[sblaster]
|
||||||
|
sbtype=sb16
|
||||||
|
sbbase=220
|
||||||
|
irq=7
|
||||||
|
dma=1
|
||||||
|
hdma=5
|
||||||
|
sbmixer=true
|
||||||
|
oplmode=auto
|
||||||
|
oplemu=default
|
||||||
|
oplrate=44100
|
||||||
|
|
||||||
|
[gus]
|
||||||
|
gus=false
|
||||||
|
gusrate=44100
|
||||||
|
gusbase=240
|
||||||
|
gusirq=5
|
||||||
|
gusdma=3
|
||||||
|
ultradir=C:\ULTRASND
|
||||||
|
|
||||||
|
[speaker]
|
||||||
|
pcspeaker=true
|
||||||
|
pcrate=44100
|
||||||
|
tandy=auto
|
||||||
|
tandyrate=44100
|
||||||
|
disney=false
|
||||||
|
|
||||||
|
[joystick]
|
||||||
|
joysticktype=auto
|
||||||
|
timed=false
|
||||||
|
autofire=false
|
||||||
|
swap34=false
|
||||||
|
buttonwrap=false
|
||||||
|
|
||||||
|
[serial]
|
||||||
|
serial1=dummy
|
||||||
|
serial2=disabled
|
||||||
|
serial3=disabled
|
||||||
|
serial4=disabled
|
||||||
|
|
||||||
|
[dos]
|
||||||
|
xms=true
|
||||||
|
ems=true
|
||||||
|
umb=true
|
||||||
|
keyboardlayout=none
|
||||||
|
|
||||||
|
[ipx]
|
||||||
|
ipx=false
|
||||||
|
|
||||||
|
[autoexec]
|
||||||
|
echo off
|
||||||
|
cls
|
||||||
|
MOUNT C: ${1}
|
||||||
|
C:
|
||||||
|
${2}
|
||||||
|
EXIT
|
||||||
|
__EOF__
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:dosbox {{{
|
||||||
|
run:dosbox() {
|
||||||
|
export path="${MY_LIBDIR}/${arch}.dosbox"
|
||||||
|
export bin="${path}/bin/dosbox"
|
||||||
|
export PATH="${path}/bin:${PATH}"
|
||||||
|
export LD_LIBRARY_PATH="${path}/lib:${LD_LIBRARY_PATH}"
|
||||||
|
cmd:mkdir "${PREFIX_DIR}"
|
||||||
|
run:gamelib:configure "${1}"
|
||||||
|
cd "${GAME_DIR}"
|
||||||
|
. ../gamelib.conf
|
||||||
|
[ -f "${GAME_DIR}/${dosbox_file}" ] || hlpr:die "\"${dosbox_file}\" not found"
|
||||||
|
if [ ! -f "${GAME_DIR}/dosbox.conf" ]; then
|
||||||
|
run:dosbox:configure "$(pwd)" "${dosbox_file}"
|
||||||
|
fi
|
||||||
|
case "${2}" in
|
||||||
|
(reinit) run:dosbox:configure "$(pwd)" "${dosbox_file}"; return ;;
|
||||||
|
('') ;;
|
||||||
|
(*) hlpr:wrn "unknown argument \"${2}\""; return ;;
|
||||||
|
esac
|
||||||
|
${bin} "${GAME_DIR}/${dosbox_file}" >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:gzdoom {{{
|
||||||
|
run:gzdoom() {
|
||||||
|
export path="${MY_LIBDIR}/${arch}.gzdoom"
|
||||||
|
export bin="${path}/bin/gzdoom"
|
||||||
|
export PATH="${path}/bin:${PATH}"
|
||||||
|
export LD_LIBRARY_PATH="${path}/lib:${LD_LIBRARY_PATH}"
|
||||||
|
cmd:mkdir "${PREFIX_DIR}"
|
||||||
|
run:gamelib:configure "${1}"
|
||||||
|
cd "${GAME_DIR}"
|
||||||
|
. ../gamelib.conf
|
||||||
|
[ -f "${GAME_DIR}/${gzdoom_file}" ] || hlpr:die "\"${gzdoom_file}\" not found"
|
||||||
|
if [ ! -f "${XDG_CONFIG_HOME}/gzdoom/gzdoom.pk3" ]; then
|
||||||
|
${bin} -iwad "/dev/null" >/dev/null 2>&1
|
||||||
|
cmd:mkdir "${XDG_CONFIG_HOME}/gzdoom"
|
||||||
|
cmd:ln "${path}/share/doom/gzdoom/gzdoom.pk3" "${XDG_CONFIG_HOME}/gzdoom/gzdoom.pk3"
|
||||||
|
fi
|
||||||
|
${bin} -iwad "${GAME_DIR}/${gzdoom_file}" >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:pcsxr:disktype {{{
|
||||||
|
run:pcsxr:disktype() {
|
||||||
|
if [ ! -x "${MY_BINDIR}/disktype.${arch}" ]; then
|
||||||
|
pkg_tmp="${MY_TEMPDIR}/.${PROGNAME}-${uid}-disktype"
|
||||||
|
pkg fetch -q -U -d -o "${pkg_tmp}" -y "disktype" >/dev/null 2>&1
|
||||||
|
cd "${pkg_tmp}" \
|
||||||
|
tar -x -C "${pkg_tmp}" -f "${pkg_tmp}"/All/disktype* >/dev/null 2>&1
|
||||||
|
chflags -R 0 "${pkg_tmp}" >/dev/null 2>&1
|
||||||
|
chown -R ${user}:${group} "${pkg_tmp}" >/dev/null 2>&1
|
||||||
|
chmod -R u+rw,go-w "${pkg_tmp}" >/dev/null 2>&1
|
||||||
|
mv "${pkg_tmp}/usr/local/bin/disktype" "${MY_BINDIR}/disktype.${arch}" >/dev/null 2>&1
|
||||||
|
cd "${MY_DIR}"
|
||||||
|
rm -R "${pkg_tmp}" >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
"${MY_BINDIR}/disktype.${arch}" "${1}" 2>/dev/null
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:pcsxr:configure {{{
|
||||||
|
run:pcsxr:configure() {
|
||||||
|
cmd:mkdir "${HOME}/.pcsxr/bios"
|
||||||
|
cmd:mkdir "${HOME}/.pcsxr/plugins"
|
||||||
|
for plugin in $(cmd:ls "${path}/lib/pcsxr"); do
|
||||||
|
if [ ! -f "${HOME}/.pcsxr/plugins/${plugin}" ]; then
|
||||||
|
cmd:ln "${path}/lib/pcsxr/${plugin}" "${HOME}/.pcsxr/plugins/${plugin}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:pcsxr {{{
|
||||||
|
run:pcsxr() {
|
||||||
|
local first=0
|
||||||
|
export path="${MY_LIBDIR}/${arch}.pcsxr"
|
||||||
|
export bin="${path}/bin/pcsxr"
|
||||||
|
export PATH="${path}/bin:${PATH}"
|
||||||
|
export LD_LIBRARY_PATH="${path}/lib:${LD_LIBRARY_PATH}"
|
||||||
|
cmd:mkdir "${PREFIX_DIR}"
|
||||||
|
run:gamelib:configure "${1}"
|
||||||
|
if [ ! -d "${HOME}/.pcsxr" ]; then
|
||||||
|
run:pcsxr:configure
|
||||||
|
first=1
|
||||||
|
fi
|
||||||
|
cd "${GAME_DIR}"
|
||||||
|
. ../gamelib.conf
|
||||||
|
if [ -n "${pcsxr_plugins_dir}" -a -d "${pcsxr_plugins_dir}" ]; then
|
||||||
|
cmd:mkdir "${HOME}/.pcsxr/plugins"
|
||||||
|
IFS=$'\n'
|
||||||
|
for plugin in $(cmd:ls "${pcsxr_plugins_dir}"); do
|
||||||
|
if [ ! -f "${HOME}/.pcsxr/plugins/${plugin}" ]; then
|
||||||
|
cmd:ln "${pcsxr_plugins_dir}/${plugin}" "${HOME}/.pcsxr/plugins/${plugin}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if [ -n "${pcsxr_bios_dir}" -a -d "${pcsxr_bios_dir}" ]; then
|
||||||
|
cmd:mkdir "${HOME}/.pcsxr/bios"
|
||||||
|
IFS=$'\n'
|
||||||
|
for bios in $(cmd:ls "${pcsxr_bios_dir}"); do
|
||||||
|
if [ ! -f "${HOME}/.pcsxr/plugins/${bios}" ]; then
|
||||||
|
cmd:ln "${pcsxr_bios_dir}/${bios}" "${HOME}/.pcsxr/bios/${bios}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
case "${2}" in
|
||||||
|
(gui) ${bin} >>"${PREFIX_DIR}/gamelib.log" 2>&1; return ;;
|
||||||
|
(reinit) run:pcsxr:configure; return ;;
|
||||||
|
('') ;;
|
||||||
|
(*) hlpr:wrn "unknown argument \"${2}\""; return ;;
|
||||||
|
esac
|
||||||
|
if [ ${first} -eq 1 ]; then
|
||||||
|
prerun_first >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
prerun >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
if [ -f "${HOME}/.pcsxr/pcsxr.cfg" ]; then
|
||||||
|
${bin} -nogui -cdfile "${GAME_DIR}/${pcsxr_file}" >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
else
|
||||||
|
${bin} >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
fi
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:renpy:common {{{
|
||||||
|
run:renpy:common() {
|
||||||
|
# if [ "x${path}" != "x" ]; then
|
||||||
|
# return 1
|
||||||
|
# fi
|
||||||
|
export bin="${path}/bin/renpy"
|
||||||
|
export PATH="${path}/bin:${PATH}"
|
||||||
|
export LD_LIBRARY_PATH="${path}/lib:${LD_LIBRARY_PATH}"
|
||||||
|
if head -n1 "${bin}" | grep -q '^#!/usr/local/bin'; then
|
||||||
|
sed -i '' 's,^#!/usr/local/bin/,#!/usr/bin/env ,' "$(readlink -f -- "${bin}")"
|
||||||
|
fi
|
||||||
|
p="$(head -n1 "${bin}" | awk '{print $2}')"
|
||||||
|
export PYTHONPATH="${path}/lib:${path}/lib/${p}/site-packages:${PYTHONPATH}"
|
||||||
|
cmd:mkdir "${PREFIX_DIR}"
|
||||||
|
run:gamelib:configure "${1}"
|
||||||
|
cd "${GAME_DIR}"
|
||||||
|
case "${2}" in
|
||||||
|
(clean)
|
||||||
|
read -p "Are you REALLY sure? (type \"yes\" if so) " answer
|
||||||
|
if [ "${answer}" = "yes" ]; then
|
||||||
|
[ -f "${GAME_DIR}/traceback.txt" ] && rm "${GAME_DIR}/traceback.txt" >/dev/null 2>&1
|
||||||
|
[ -f "${GAME_DIR}/log.txt" ] && rm "${GAME_DIR}/log.txt" >/dev/null 2>&1
|
||||||
|
[ -d "${GAME_DIR}/cache" ] && rm -R "${GAME_DIR}/cache" >/dev/null 2>&1
|
||||||
|
# [ -d "${GAME_DIR}/saves" ] && rm -R "${GAME_DIR}/saves" >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
('') ;;
|
||||||
|
(*) hlpr:wrn "unknown argument \"${2}\""; return ;;
|
||||||
|
esac
|
||||||
|
${bin} "${GAME_DIR}" >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
run:renpy() {
|
||||||
|
export path="${MY_LIBDIR}/${arch}.renpy"
|
||||||
|
run:renpy:common "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
run:renpy6() {
|
||||||
|
export path="${MY_LIBDIR}/${arch}.renpy6"
|
||||||
|
run:renpy:common "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# run:wine:winetricks {{{
|
||||||
|
run:wine:winetricks() {
|
||||||
|
if [ ! -x "${MY_BINDIR}/winetricks" ]; then
|
||||||
|
url="https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks"
|
||||||
|
fetch -qo "${MY_BINDIR}/winetricks" "${url}" >/dev/null 2>&1
|
||||||
|
chmod ug+x go-w "${MY_BINDIR}/winetricks" >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
"${MY_BINDIR}/winetricks" --self-update
|
||||||
|
fi
|
||||||
|
export WINE="${bin}"
|
||||||
|
"${MY_BINDIR}/winetricks" ${@} >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:wine:configure {{{
|
||||||
|
run:wine:configure() {
|
||||||
|
${bin} wineboot.exe -i >/dev/null 2>&1
|
||||||
|
if [ ! -h "${HOME}/.wine/dosdevices/e:" -a ! -d "${HOME}/.wine/dosdevices/e:" ]; then
|
||||||
|
cmd:ln "${GAME_DIR}" "${HOME}/.wine/dosdevices/e:"
|
||||||
|
fi
|
||||||
|
run:wine:winetricks settings \
|
||||||
|
"autostart_winedbg=disabled" "csmt=on" "fontfix" "fontsmooth=gray" \
|
||||||
|
"glsl=enabled" "grabfullscreen=y" "hidewineexports=enable" "isolate_home" \
|
||||||
|
"mimeassoc=off" "multisampling=enabled" "nocrashdialog" "remove_mono" \
|
||||||
|
"sandbox" "sound=oss" "vd=off" "videomemorysize=default" "win7" \
|
||||||
|
"windowmanagerdecorated=y" "windowmanagermanaged=y" >/dev/null 2>&1
|
||||||
|
run:wine:winetricks corefonts
|
||||||
|
for i in $(cmd:ls "${HOME}/.wine/dosdevices/"); do
|
||||||
|
if [ "${i}" != "c:" -a "${i}" != "e:" ]; then
|
||||||
|
rm "${HOME}/.wine/dosdevices/${i}" >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
${bin} winecfg.exe >/dev/null 2>&1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:wine:common {{{
|
||||||
|
run:wine:common() {
|
||||||
|
local first=0
|
||||||
|
export PATH="${MY_BINDIR}:${PATH}"
|
||||||
|
run:gamelib:configure "${1}"
|
||||||
|
cmd:mkdir "${PREFIX_DIR}"
|
||||||
|
if [ ! -d "${HOME}/.wine" ]; then
|
||||||
|
run:wine:configure "${1}"
|
||||||
|
first=1
|
||||||
|
fi
|
||||||
|
cd "${GAME_DIR}"
|
||||||
|
. ../gamelib.conf
|
||||||
|
[ -f "${GAME_DIR}/${wine_file}" ] || hlpr:die "\"${wine_file}\" not found"
|
||||||
|
if [ -n "${wine_dlls}" ]; then
|
||||||
|
# run:wine:winetricks dlls ${wine_dlls} >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
run:wine:winetricks ${wine_dlls} >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
fi
|
||||||
|
if [ -n "${wine_settings}" ]; then
|
||||||
|
run:wine:winetricks settings ${wine_settings} >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
fi
|
||||||
|
case "${2}" in
|
||||||
|
(cfg) ${bin} winecfg.exe >>"${PREFIX_DIR}/gamelib.log" 2>&1; return ;;
|
||||||
|
(cmd) ${bin} cmd.exe >>"${PREFIX_DIR}/gamelib.log" 2>&1; return ;;
|
||||||
|
(reg) ${bin} regedit.exe >>"${PREFIX_DIR}/gamelib.log" 2>&1; return ;;
|
||||||
|
(reinit)
|
||||||
|
run:wine:configure "${1}"
|
||||||
|
prerun_first >/dev/null 2>&1
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
(sh) sh; return ;;
|
||||||
|
('') ;;
|
||||||
|
(*) hlpr:wrn "unknown argument \"${2}\""; return ;;
|
||||||
|
esac
|
||||||
|
if [ ${first} -eq 1 ]; then
|
||||||
|
prerun_first >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
prerun >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
${bin} "${GAME_DIR}/${wine_file}" ${wine_args} >>"${PREFIX_DIR}/gamelib.log" 2>&1
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:wine32 {{{
|
||||||
|
run:wine32() {
|
||||||
|
export path="${MY_LIBDIR}/${arch}.wine32"
|
||||||
|
export bin="${path}/bin32/wine"
|
||||||
|
# export bin="${path}/bin32/wine"
|
||||||
|
export PATH="${path}/bin:${path}/bin32:${PATH}"
|
||||||
|
export LIBGL_DRIVERS_PATH="${path}/lib32/.libGL/dri"
|
||||||
|
# export LD_32_LIBRARY_PATH="${path}/lib32:${path}/lib32/wine:${path}/lib32/.libGL:${path}/lib32/.libGL/dri/:${LD_32_LIBRARY_PATH}"
|
||||||
|
export LD_32_LIBRARY_PATH="${path}/lib32:${path}/lib32/wine/i386-unix:${path}/lib32/wine/i386-windows:${path}/lib32/.libGL:${path}/lib32/.libGL/dri/:${LD_32_LIBRARY_PATH}"
|
||||||
|
export LD_32_LIBRARY_PATH_RPATH=y
|
||||||
|
run:wine:common "${@}"
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:wine {{{
|
||||||
|
run:wine() {
|
||||||
|
export path="${MY_LIBDIR}/${arch}.wine"
|
||||||
|
[ "${arch}" = "amd64" ] && suf="64"
|
||||||
|
export bin="${path}/bin/wine${suf}"
|
||||||
|
export PATH="${path}/bin:${PATH}"
|
||||||
|
export LD_LIBRARY_PATH="${path}/lib:${path}/lib/wine:${path}/lib32/wine/i386-unix:${path}/lib32/wine/i386-windows:${LD_LIBRARY_PATH}"
|
||||||
|
run:wine:common "${@}"
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# run:gamelib {{{
|
||||||
|
run:gamelib() {
|
||||||
|
[ -n "${DISPLAY}" ] || hlpr:die "graphical session needed"
|
||||||
|
gamelib="$(get:gametype "${1}")"
|
||||||
|
[ ${?} -eq 0 ] || return 1
|
||||||
|
if [ -f "${MY_LOCKFILE}" ]; then
|
||||||
|
trap '' EXIT INT ABRT TERM
|
||||||
|
hlpr:die "another instance of ${PROGNAME} is running with PID $(cat "${MY_LOCKFILE}")"
|
||||||
|
else
|
||||||
|
trap hlpr:shutdown EXIT INT ABRT TERM
|
||||||
|
echo ${$} > "${MY_LOCKFILE}"
|
||||||
|
fi
|
||||||
|
if [ ! -d "${MY_LIBDIR}/${arch}.${gamelib}" ]; then
|
||||||
|
hlpr:inf "prepare ${gamelib}..."
|
||||||
|
gamelib:add "${gamelib}"
|
||||||
|
fi
|
||||||
|
export GAME_DIR="${MY_GAMESDIR}/${1}/game"
|
||||||
|
export PREFIX_DIR="${MY_GAMESDIR}/${1}/prefix"
|
||||||
|
run:${gamelib} "${@}"
|
||||||
|
return ${?}
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
|
[ ${euid} -ne 0 ] || hlpr:die "do not run this program as root!"
|
||||||
|
[ ${euid} -eq ${uid} ] || hlpr:die "EUID and UID does not match"
|
||||||
|
|
||||||
|
case "${arch}" in
|
||||||
|
(amd64) ;;
|
||||||
|
(i386) hlpr:wrn "\"${arch}\" is not tested" ;;
|
||||||
|
(*) hlpr:die "unsupported architecture \"${arch}\"" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
hlpr:startup
|
||||||
|
|
||||||
|
case "${1}" in
|
||||||
|
(run) shift; run:gamelib "${@}" ;;
|
||||||
|
(list) prnt:list ;;
|
||||||
|
(help) prnt:usage ;;
|
||||||
|
(version) prnt:version ;;
|
||||||
|
(license) prnt:license ;;
|
||||||
|
(list-libs) prnt:list_libs ;;
|
||||||
|
(upgrade) gamelib:upgrade ;;
|
||||||
|
(rollback) shift; gamelib:rollback "${@}" ;;
|
||||||
|
(*) MY_DEBUG=1 hlpr:die "unknown action \"${1}\", try \"help\"" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit ${?}
|
||||||
|
|
||||||
|
# vim: foldlevel=0
|
70
gamelib.gui
Executable file
70
gamelib.gui
Executable file
|
@ -0,0 +1,70 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
VERSION="0.2"
|
||||||
|
|
||||||
|
PROGNAME="gamelib.gui"
|
||||||
|
|
||||||
|
GAMELIB="$(dirname -- "$(readlink -f -- "${0}")")/gamelib"
|
||||||
|
|
||||||
|
hlpr:die() {
|
||||||
|
echo "${@}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
[ $(${GAMELIB} list | wc -l) -ne 0 ] || hlpr:die "you have no games"
|
||||||
|
|
||||||
|
orig_IFS="${IFS}"
|
||||||
|
IFS=$'\n'
|
||||||
|
for game in $(${GAMELIB} list); do
|
||||||
|
img="${GAMELIB_GAMES_DIR}/${game%% *}/gamelib_gui.png"
|
||||||
|
if [ -r "${img}" ]; then
|
||||||
|
image="${img}"
|
||||||
|
else
|
||||||
|
image="applications-games"
|
||||||
|
fi
|
||||||
|
conf="${GAMELIB_GAMES_DIR}/${game%% *}/gamelib_gui.conf"
|
||||||
|
if [ -f "${conf}" ]; then
|
||||||
|
. "${conf}"
|
||||||
|
[ -n "${name}" ] || name="$(echo "${game%% *}" | sed 's/-/ /g')"
|
||||||
|
[ -n "${description}" ] || description="${game##* }"
|
||||||
|
else
|
||||||
|
name="$(echo "${game%% *}" | sed 's/-/ /g')"
|
||||||
|
description="${game##* }"
|
||||||
|
fi
|
||||||
|
games="${games}
|
||||||
|
${game%% *} ${game##* } '${image}' '${name}' ' ${description} '"
|
||||||
|
done
|
||||||
|
games="$(echo "${games}" | sed '/^$/d')"
|
||||||
|
gnum="$(echo "${games}" | wc -l | sed 's/^[[:space:]]*//')"
|
||||||
|
|
||||||
|
# game: 96×32
|
||||||
|
|
||||||
|
game="$(eval yad \
|
||||||
|
--width 600 --height 600 --center \
|
||||||
|
--class "'${PROGNAME%.*}'" \
|
||||||
|
--title "'${PROGNAME}'" \
|
||||||
|
--text "'$(${GAMELIB} version) (gui: ${VERSION})\n${gnum} games found:'" \
|
||||||
|
--image "'applications-games'" --image-on-top \
|
||||||
|
--buttons-layout "'center'" \
|
||||||
|
--button "'_cancel:1'" \
|
||||||
|
--button "'_run:0'" \
|
||||||
|
--list --no-headers \
|
||||||
|
--print-column 1 \
|
||||||
|
--search-column 0 \
|
||||||
|
--expand-column 4 \
|
||||||
|
--tooltip-column 5 \
|
||||||
|
--ellipsize-cols 4,5 \
|
||||||
|
--separator "''" \
|
||||||
|
--column game:HD --column type:HD --column icon:IMG --column name:TEXT --column description:HD \
|
||||||
|
${games})"
|
||||||
|
exitcode=${?}
|
||||||
|
|
||||||
|
|
||||||
|
case ${exitcode} in
|
||||||
|
(0) ${GAMELIB} run "${game}" ;;
|
||||||
|
(1) echo "${PROGNAME}: canceled" >&2 ;;
|
||||||
|
(252) echo "${PROGNAME}: escaped" >&2 ;;
|
||||||
|
(*) echo "${PROGNAME}: exited with ${exitcode}" >&2 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit ${exitcode}
|
128
gamelib.new
Executable file
128
gamelib.new
Executable file
|
@ -0,0 +1,128 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 2019-2021, mord0d and their slaves
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
# are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
# list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
VERSION="0.6"
|
||||||
|
PROGNAME="gamelib"
|
||||||
|
|
||||||
|
arch="$(uname -m)"
|
||||||
|
uid="$(id -u)"
|
||||||
|
gid="$(id -g)"
|
||||||
|
|
||||||
|
: ${TMPDIR:=/tmp}
|
||||||
|
: ${GAMELIB_DEBUG:=0}
|
||||||
|
|
||||||
|
LOCKFILE="${TMPDIR}/.${PROGNAME}-${uid}.lock"
|
||||||
|
TEMPDIR="${TMPDIR}/.${PROGNAME}-${uid}"
|
||||||
|
|
||||||
|
# gl_log {{{
|
||||||
|
gl_log() {
|
||||||
|
local lvl="${1}"
|
||||||
|
shift
|
||||||
|
if [ "${lvl}" = "FTL" ] || [ "${GAMELIB_DEBUG}" -ne 0 ] || [ -z "${LOGFILE}" -o ! -w "${LOGFILE}" ]; then
|
||||||
|
echo "[${lvl}] ${*}" >&2
|
||||||
|
fi
|
||||||
|
echo "[${lvl}:${$}] $(date -j '+%Y-%m-%d %H:%M:%S') ${*}" >> "${LOGFILE:=/dev/null}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
gl_run() {
|
||||||
|
}
|
||||||
|
gl_edit() {
|
||||||
|
}
|
||||||
|
gl_upgrade() {
|
||||||
|
}
|
||||||
|
gl_rollback() {
|
||||||
|
}
|
||||||
|
gl_usage() {
|
||||||
|
}
|
||||||
|
|
||||||
|
# gl_version {{{
|
||||||
|
gl_version() {
|
||||||
|
echo "${PROGNAME} ${VERSION}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# gl_license {{{
|
||||||
|
gl_license() {
|
||||||
|
sed -n 's/^# //; s/^#$//; 4,25p' "${0}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
gl_list() {
|
||||||
|
}
|
||||||
|
|
||||||
|
game=''
|
||||||
|
subcommands=''
|
||||||
|
upgrade=0
|
||||||
|
rollback=0
|
||||||
|
edit=0
|
||||||
|
|
||||||
|
while :; do
|
||||||
|
case "${1}" in
|
||||||
|
('') break ;;
|
||||||
|
(-h|--help) gl_usage; exit 0 ;;
|
||||||
|
(-V|--version) gl_version; exit 0 ;;
|
||||||
|
(-L|--license) gl_license; exit 0 ;;
|
||||||
|
(-l|--list) gl_list; exit 0 ;;
|
||||||
|
(-v|--verbose) GAMELIB_DEBUG=1; shift ;;
|
||||||
|
(-u|--upgrade) upgrade=1; rollback=0; shift ;;
|
||||||
|
(-b|--rollback) rollback=1; upgrade=0; shift ;;
|
||||||
|
(-r|--run) shift; subcommands="${subcommands} ${1}"; shift ;;
|
||||||
|
(-e|--edit) edit=1; shift ;;
|
||||||
|
(-w|--workdir) shift; GAMELIB_GAMES_DIR="${1}"; shift ;;
|
||||||
|
(-*) gl_log ERR "Unknown option \"${1}\"!"; exit 1 ;;
|
||||||
|
(*) game="${1}"; shift ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "${GAMELIB_GAMES_DIR}" ]; then
|
||||||
|
gl_log FTL "\"\$GAMELIB_GAMES_DIR\" is not defined!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ ! -d "${GAMELIB_GAMES_DIR}" ]; then
|
||||||
|
gl_log FTL "\"\$GAMELIB_GAMES_DIR\" is not a directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${game}" ]; then
|
||||||
|
gl_log FTL "No game specified!"
|
||||||
|
gl_list
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${edit} -eq 1 ]; then
|
||||||
|
gl_edit "${game}"
|
||||||
|
exit ${?}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${upgrade} -eq 1 ]; then
|
||||||
|
gl_upgrade "${game}"
|
||||||
|
elif [ ${rollback} -eq 1 ]; then
|
||||||
|
gl_rollback "${game}"
|
||||||
|
else
|
||||||
|
gl_run "${game}" "${subcommands}"
|
||||||
|
fi
|
Loading…
Reference in a new issue