From 0a0649f950771e34f3b6e4137723c5bb23892ec0 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Wed, 23 Nov 2016 10:57:44 -0800 Subject: [PATCH 1/2] Add a contrib script for using correct aspect ratio in an xterm --- contrib/gearhead-xterm.png | Bin 0 -> 48847 bytes contrib/gearhead-xterm.sh | 71 +++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 contrib/gearhead-xterm.png create mode 100755 contrib/gearhead-xterm.sh diff --git a/contrib/gearhead-xterm.png b/contrib/gearhead-xterm.png new file mode 100644 index 0000000000000000000000000000000000000000..a16ec93bedfd4e481250a1328bf1a42256142bba GIT binary patch literal 48847 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 TVXp9ofIlU9HMx?9CPDuJ1&T@* literal 0 HcmV?d00001 diff --git a/contrib/gearhead-xterm.sh b/contrib/gearhead-xterm.sh new file mode 100755 index 0000000..f73321d --- /dev/null +++ b/contrib/gearhead-xterm.sh @@ -0,0 +1,71 @@ +#!/bin/sh +# Start gearhead in an xterm, with proper aspect ratio. +# This does make text look funny to read at first, but you get used to it. +# Better alternatives involving code changes: +# * Use DECDWL. +# Pro: Simple to implement. +# Con: Can only be applied to whole lines, so single-width can only +# be used for the messages at the bottom of the screen, not for +# right-side-of-screen messages and popup dialogs. +# * Use double-width codepoint range starting at U+ff00. +# Pro: Can be disabled for *all* text, and enabled only for the screen. +# Con: Only ASCII. Currently fine, but disallows future new glyphs. + +real_gearhead=${REAL_GEARHEAD:-/usr/games/gearhead} +font_name='mono' +# Pick something that gives you 60-70 lines on your screen and is readable. +# This works for me on a 768-pixel-tall (minus taskbars) screen. +font_size=7 +# Most fonts are 8x16 or so. Double the width for them. +font_stretch=2 + +# I'm not sure if gearhead takes any command-line arguments yet, but +# just in case, build the xterm argument list backwards to preserve them. +set -- -e "$real_gearhead" "$@" +# Important bit: set a TrueType font with the proper ratio. +# Xterm usually uses bitmap fonts, but they can't be scaled. +# With most fonts, hinting must be disabled, or they will violate the +# bounding box. This often shows as the last line of an "m" disappearing. +# You *could* try to use 'XTerm*useClipping' or 'XTerm*scaleHeight', but +# I haven't had any luck with that. +set -- -fa "$font_name"':matrix='"$font_stretch"' 0 0 1:hinting=False' -fs "$font_size" "$@" +# Force xterm to draw the line-drawing characters itself. Most TTFs don't +# line up *quite* right, especially when stretched. +set -- +fbx "$@" +# Gearhead emits the 'bold' code when it really just wants to change +# the color to the "bright" version. +set -- -pc -xrm 'XTerm*allowBoldFonts:false' "$@" +# Set the palette explicitly. This is the VGA palette, but with darker grays. +# (otherwise it is really hard to tell height-2 from height-3 hills). +# Currently, gearhead uses: +# * default background, when it wants color0 +# * default foreground, when it wants color7 +# * bold + default foreground, when it wants color15 +# The first two are easy enough to equalize, but the third is "interesting". +set -- -xrm 'XTerm*vt100.background: rgb:00/00/00' "$@" # dim black +set -- -xrm 'XTerm*vt100.color0: rgb:00/00/00' "$@" +set -- -xrm 'XTerm*vt100.color1: rgb:aa/00/00' "$@" # dim red +set -- -xrm 'XTerm*vt100.color2: rgb:00/aa/00' "$@" # dim green +set -- -xrm 'XTerm*vt100.color3: rgb:aa/55/00' "$@" # dim yellow -> brown +set -- -xrm 'XTerm*vt100.color4: rgb:00/00/aa' "$@" # dim blue +set -- -xrm 'XTerm*vt100.color5: rgb:aa/00/aa' "$@" # dim magenta +set -- -xrm 'XTerm*vt100.color6: rgb:00/aa/aa' "$@" # dim cyan +set -- -xrm 'XTerm*vt100.foreground: rgb:80/80/80' "$@" # dim white -> light gray +set -- -xrm 'XTerm*vt100.color7: rgb:80/80/80' "$@" +set -- -xrm 'XTerm*vt100.color8: rgb:40/40/40' "$@" # light black -> dark gray +set -- -xrm 'XTerm*vt100.color9: rgb:ff/55/55' "$@" # light red +set -- -xrm 'XTerm*vt100.color10: rgb:55/ff/55' "$@" # light green +set -- -xrm 'XTerm*vt100.color11: rgb:ff/ff/55' "$@" # light yellow +set -- -xrm 'XTerm*vt100.color12: rgb:55/55/ff' "$@" # light blue +set -- -xrm 'XTerm*vt100.color13: rgb:ff/55/ff' "$@" # light magenta +set -- -xrm 'XTerm*vt100.color14: rgb:55/ff/ff' "$@" # light cyan +set -- -xrm 'XTerm*vt100.colorBD: rgb:ff/ff/ff' "$@" # light white +set -- -xrm 'XTerm*vt100.color15: rgb:ff/ff/ff' "$@" +set -- -xrm 'XTerm*vt100.colorBDMode: true' "$@" +set -- -xrm 'XTerm*vt100.veryBoldColors: 0' "$@" + +# Wait for window to be shown. Fixes a nondeterministic resize bug. +set -- -wf "$@" +# Or -fullscreen for a few more lines. +set -- -maximized "$@" +exec xterm "$@" From 1e91582081f23d4c4540e60e29ce9fc27176f934 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Wed, 23 Nov 2016 18:48:33 -0800 Subject: [PATCH 2/2] Add a configure script and Makefile --- .gitignore | 77 ++++---- Makefile.in | 277 +++++++++++++++++++++++++++ configure | 172 +++++++++++++++++ boxdraw.inc => inc/boxdraw.inc | 0 ability.pp => src/ability.pp | 0 action.pp => src/action.pp | 0 aibrain.pp => src/aibrain.pp | 0 arenacfe.pp => src/arenacfe.pp | 0 arenahq.pp => src/arenahq.pp | 0 arenaplay.pp => src/arenaplay.pp | 0 arenascript.pp => src/arenascript.pp | 0 backpack.pp => src/backpack.pp | 0 colormenu.pp => src/colormenu.pp | 0 congfx.pp => src/congfx.pp | 0 coninfo.pp => src/coninfo.pp | 0 conmap.pp => src/conmap.pp | 0 conmenus.pp => src/conmenus.pp | 0 context.pp => src/context.pp | 0 cosplay.pas => src/cosplay.pas | 0 damage.pp => src/damage.pp | 0 effects.pp => src/effects.pp | 0 factory.pp => src/factory.pp | 0 gears.pp => src/gears.pp | 0 gearutil.pp => src/gearutil.pp | 0 gflooker.pp => src/gflooker.pp | 0 gharena.pas => src/gharena.pas | 0 ghchars.pp => src/ghchars.pp | 0 ghcpit.pp => src/ghcpit.pp | 0 gheffect.pp => src/gheffect.pp | 0 ghguard.pp => src/ghguard.pp | 0 ghholder.pp => src/ghholder.pp | 0 ghintrinsic.pp => src/ghintrinsic.pp | 0 ghmecha.pp => src/ghmecha.pp | 0 ghmodule.pp => src/ghmodule.pp | 0 ghmovers.pp => src/ghmovers.pp | 0 ghparser.pp => src/ghparser.pp | 0 ghprop.pp => src/ghprop.pp | 0 ghsensor.pp => src/ghsensor.pp | 0 ghsupport.pp => src/ghsupport.pp | 0 ghswag.pp => src/ghswag.pp | 0 ghweapon.pp => src/ghweapon.pp | 0 grabgear.pp => src/grabgear.pp | 0 interact.pp => src/interact.pp | 0 locale.pp => src/locale.pp | 0 mapedit.pp => src/mapedit.pp | 0 menugear.pp => src/menugear.pp | 0 movement.pp => src/movement.pp | 0 navigate.pp => src/navigate.pp | 0 pcaction.pp => src/pcaction.pp | 0 playwright.pp => src/playwright.pp | 0 randchar.pp => src/randchar.pp | 0 randmaps.pp => src/randmaps.pp | 0 rpgdice.pp => src/rpgdice.pp | 0 sdlgfx.pp => src/sdlgfx.pp | 0 sdlinfo.pp => src/sdlinfo.pp | 0 sdlmap.pp => src/sdlmap.pp | 0 sdlmenus.pp => src/sdlmenus.pp | 0 services.pp => src/services.pp | 0 skilluse.pp => src/skilluse.pp | 0 texutil.pp => src/texutil.pp | 0 ui4gh.pp => src/ui4gh.pp | 0 wmonster.pp => src/wmonster.pp | 0 xxran.pas => src/xxran.pas | 0 63 files changed, 482 insertions(+), 44 deletions(-) create mode 100644 Makefile.in create mode 100755 configure rename boxdraw.inc => inc/boxdraw.inc (100%) rename ability.pp => src/ability.pp (100%) rename action.pp => src/action.pp (100%) rename aibrain.pp => src/aibrain.pp (100%) rename arenacfe.pp => src/arenacfe.pp (100%) rename arenahq.pp => src/arenahq.pp (100%) rename arenaplay.pp => src/arenaplay.pp (100%) rename arenascript.pp => src/arenascript.pp (100%) rename backpack.pp => src/backpack.pp (100%) rename colormenu.pp => src/colormenu.pp (100%) rename congfx.pp => src/congfx.pp (100%) rename coninfo.pp => src/coninfo.pp (100%) rename conmap.pp => src/conmap.pp (100%) rename conmenus.pp => src/conmenus.pp (100%) rename context.pp => src/context.pp (100%) rename cosplay.pas => src/cosplay.pas (100%) rename damage.pp => src/damage.pp (100%) rename effects.pp => src/effects.pp (100%) rename factory.pp => src/factory.pp (100%) rename gears.pp => src/gears.pp (100%) rename gearutil.pp => src/gearutil.pp (100%) rename gflooker.pp => src/gflooker.pp (100%) rename gharena.pas => src/gharena.pas (100%) rename ghchars.pp => src/ghchars.pp (100%) rename ghcpit.pp => src/ghcpit.pp (100%) rename gheffect.pp => src/gheffect.pp (100%) rename ghguard.pp => src/ghguard.pp (100%) rename ghholder.pp => src/ghholder.pp (100%) rename ghintrinsic.pp => src/ghintrinsic.pp (100%) rename ghmecha.pp => src/ghmecha.pp (100%) rename ghmodule.pp => src/ghmodule.pp (100%) rename ghmovers.pp => src/ghmovers.pp (100%) rename ghparser.pp => src/ghparser.pp (100%) rename ghprop.pp => src/ghprop.pp (100%) rename ghsensor.pp => src/ghsensor.pp (100%) rename ghsupport.pp => src/ghsupport.pp (100%) rename ghswag.pp => src/ghswag.pp (100%) rename ghweapon.pp => src/ghweapon.pp (100%) rename grabgear.pp => src/grabgear.pp (100%) rename interact.pp => src/interact.pp (100%) rename locale.pp => src/locale.pp (100%) rename mapedit.pp => src/mapedit.pp (100%) rename menugear.pp => src/menugear.pp (100%) rename movement.pp => src/movement.pp (100%) rename navigate.pp => src/navigate.pp (100%) rename pcaction.pp => src/pcaction.pp (100%) rename playwright.pp => src/playwright.pp (100%) rename randchar.pp => src/randchar.pp (100%) rename randmaps.pp => src/randmaps.pp (100%) rename rpgdice.pp => src/rpgdice.pp (100%) rename sdlgfx.pp => src/sdlgfx.pp (100%) rename sdlinfo.pp => src/sdlinfo.pp (100%) rename sdlmap.pp => src/sdlmap.pp (100%) rename sdlmenus.pp => src/sdlmenus.pp (100%) rename services.pp => src/services.pp (100%) rename skilluse.pp => src/skilluse.pp (100%) rename texutil.pp => src/texutil.pp (100%) rename ui4gh.pp => src/ui4gh.pp (100%) rename wmonster.pp => src/wmonster.pp (100%) rename xxran.pas => src/xxran.pas (100%) diff --git a/.gitignore b/.gitignore index 3b64a1e..d0361b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,45 +1,34 @@ -*.py[cod] -*.o -*.ppu +# Generated by `configure` +**/Makefile +**/config.make +**/config.status + +# Generated by `make` +**/obj/*.o +**/obj/*.ppu + +**/bin/gharena +**/bin/cosplay +**/bin/xxran +**/bin/*.exe + +**/patched/crt.pp +**/patched/crth.inc + + +# Generated by `make dist` and `make bindist` +*.zip +*.tar.gz +*.tar.bz2 +*.tar.xz + + +# Generated by running the game SaveGame/ -arena -gharena -cosplay -xxran -*.exe -*.dll - -# C extensions -*.so - -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg -lib -lib64 - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox -nosetests.xml - -# Translations -*.mo - -# Mr Developer -.mr.developer.cfg -.project -.pydevproject -*.bak + + +# Editor files, being personal to you, do not belong in this file. +# Instead, add them to one of: +# $XDG_CONFIG_HOME/git/ignore (if XDG_CONFIG_HOME is set) +# $HOME/.config/git/ignore (if XDG_CONFIG_HOME is not set) +# $GIT_DIR/info/exclude (where $GIT_DIR is usually .git, unless it is a file) diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..989698f --- /dev/null +++ b/Makefile.in @@ -0,0 +1,277 @@ +# This is a Makefile, useful for compiling GearHead on Unix platforms. + +### CONFIGURATION +# Running `./configure` will copy `Makefile.in` to `Makefile`, +# and store options in `config.make`. You can also store your own options +# in `local.make`. + +ENABLE_XTERM_BOXDRAWING = yes +WITH_SDL = no + +# Compiler and flags. +FPC = fpc +FPCFLAGS = -g -O2 +PPDEP = ppdep +PPDEPFLAGS = + +# Used for tarballs. Cross-compiling is a little more complicated. +FPC_ARCH := $(shell ${FPC} ${FPCFLAGS} -iTP) +FPC_OS := $(shell ${FPC} ${FPCFLAGS} -iTO) +# Used when applying the xterm-boxdrawing patch. +FPC_VERSION := $(shell ${FPC} ${FPCFLAGS} -iV) +FPC_SOURCE := /usr/share/fpcsrc/${FPC_VERSION}/ + +SRC_MAIN = gharena +# Allow co-installation +BIN_MAIN = $(if $(filter yes,${WITH_SDL}),gearhead-sdl,gearhead) +PACKAGE = ${BIN_MAIN} + +# Name of tarballs/zips for distribution, excluding extension. +SRC_TARBALL=${PACKAGE}-${PACKAGE_VERSION}-src +BIN_TARBALL=${PACKAGE}-${PACKAGE_VERSION}-${FPC_ARCH}-${FPC_OS} + +# Prefix used for installation. Useful for making tarballs. +DISTDIR = + +PREFIX = /usr/local +EPREFIX = ${PREFIX} +BINDIR = ${EPREFIX}/games +DATAROOTDIR = ${PREFIX}/share +DATADIR = ${DATAROOTDIR}/games +DOCDIR = ${PREFIX}/doc/${PACKAGE} +# Other autoconf directories not needed. + +.DEFAULT_GOAL = all + +include config.make +ALL_MAIN := $(patsubst ${SRC_DIR}/src/%.pas,bin/%,$(wildcard ${SRC_DIR}/src/*.pas)) +PACKAGE_VERSION := $(shell cd ${SRC_DIR}; if test -e .git; then git describe --dirty; else sed -n "s/^\s*Version = '\(.*\)';\r\?$$/\1/; T; p" src/gharena.pas; fi) +-include local.make + +############################################################ +### No user-servicable parts beyond this point. ### +############################################################ + +### OVERRIDES + +ifeq '${WITH_SDL}' 'yes' +override FPCFLAGS += -dSDLMODE +override PPDEPFLAGS += -dSDLMODE +ENABLE_XTERM_BOXDRAWING = no +else +ALL_MAIN := $(filter-out bin/cosplay,${ALL_MAIN}) +endif + +ifeq '${ENABLE_XTERM_BOXDRAWING}' 'yes' +${ALL_MAIN}: maint-apply-xterm-boxdrawing +override FPCFLAGS += -Fi${SRC_DIR}/xterm-boxdrawing -Fu./patched/ +else +${ALL_MAIN}: maint-unapply-xterm-boxdrawing +endif +override FPCFLAGS += -Fi${SRC_DIR}/inc/ + + +### RULES + +.SECONDARY: +.DELETE_ON_ERROR: + +# TODO use `ppdep` once it is no longer buggy and/or we apply the workaround. +.PHONY: all +all: ${ALL_MAIN} +.PHONY: clean +clean: + rm -rf bin/ obj/ +.PHONY: distclean +distclean: clean +distclean: maint-unapply-xterm-boxdrawing +distclean: maint-unconfigure +bin/%: ${SRC_DIR}/src/%.pas + mkdir -p bin obj + ${FPC} ${FPCFLAGS} $< -FE./bin/ -FU./obj/ + +# If this rule is executed, Make will restart with the *new* makefile +Makefile: ${SRC_DIR}/Makefile.in + ./config.status + +### CHECK +.PHONY: test +test: check +.PHONY: check +check: all + +### INSTALL +# Since `install` is (often) run as root, it must *not* depend on `all` +# (or anything else that might write a file outside of DESTDIR) +# Also note: we must *not* glob too aggressively, to avoid picking up +# backup files. +.PHONY: install +install: install-bin install-data install-doc +# This has to be done via a variable to look pretty on output. +# $1: root directory to copy from +# $2: directories to copy from, under that root +# $3: files patterns to copy within those directories +# $4: directory to create all these under +x_nothing = +x_space = ${x_nothing} ${x_nothing} +define x_newline + + +endef +nl2sp = $(subst ${x_newline},${x_space},$1) +define do_install +$(foreach dir,$(call nl2sp,$2), + install -d ${DESTDIR}$4/${dir} + $(foreach file,$(call nl2sp,$3), + $(if $(wildcard $1/${dir}/${file}), + install -m 0644 $1/${dir}/${file} ${DESTDIR}$4/${dir} + ) + ) +) +endef +.PHONY: install-bin +install-bin: +# not using do_install because it renames and uses +x + install -d ${DESTDIR}${BINDIR} + install -T bin/${SRC_MAIN} ${DESTDIR}${BINDIR}/${BIN_MAIN} +define install_data_dirs + Design + GameData + Image + Series +endef +define install_data_files + *.png + *.ttf + *.txt +endef +.PHONY: install-data +install-data: + $(call do_install,${SRC_DIR},${install_data_dirs},${install_data_files},${DATADIR}/${PACKAGE}) +.PHONY: install-doc +install-doc: + $(call do_install,${SRC_DIR},. contrib,*.md *.png *.sh *.txt,${DOCDIR}) + $(call do_install,${SRC_DIR}/doc,.,*.md *.txt,${DOCDIR}) + +### DISTRIBUTION +# Manually list everything from `git ls-files`, without relying on git. +# The fact that `make dist` can be called from within its own output is +# an important sanity check. +define dist_dirs + . + Design + GameData + Image + Series + contrib + dist + doc + inc + src + xterm-boxdrawing +endef + +define dist_files + *.diff + *.inc + *.md + *.pas + *.png + *.pp + *.sh + *.ttf + *.txt + .gitignore + Makefile.in + README + configure +endef + +# This has to be done via a variable to look pretty on output. +# $1: root directory to copy from +# $2: directories to copy from, under that root +# $3: files patterns to copy within those directories +# $4: directory to create all these under +define do_copy +$(foreach dir,$(call nl2sp,$2), + mkdir -p $4/${dir} + $(foreach file,$(call nl2sp,$3), + $(if $(wildcard $1/${dir}/${file}), + cp $1/${dir}/${file} $4/${dir} + ) + ) +) +endef + +.PHONY: dist/temp-destdir/${SRC_TARBALL} +dist/tmp-destdir/${SRC_TARBALL}: + rm -rf $@ + $(call do_copy,${SRC_DIR},${dist_dirs},${dist_files},$@) +.PHONY: dist +dist: dist/${SRC_TARBALL}.zip +dist: dist/${SRC_TARBALL}.tar.gz +dist: dist/${SRC_TARBALL}.tar.bz2 +dist: dist/${SRC_TARBALL}.tar.xz +dist: + rm -r dist/tmp-destdir/${SRC_TARBALL} + rm dist/${SRC_TARBALL}.tar +.PHONY: dist/tmp-destdir/${BIN_TARBALL} +dist/tmp-destdir/${BIN_TARBALL}: + rm -rf $@ + ${MAKE} all + ${MAKE} install DESTDIR=$@ +.PHONY: bindist +bindist: dist/${BIN_TARBALL}.zip +bindist: dist/${BIN_TARBALL}.tar.gz +bindist: dist/${BIN_TARBALL}.tar.bz2 +bindist: dist/${BIN_TARBALL}.tar.xz +bindist: + rm -r dist/tmp-destdir/${BIN_TARBALL} + rm dist/${BIN_TARBALL}.tar + +dist/%.tar: dist/tmp-destdir/% + rm -f $@ + (cd ./dist/tmp-destdir && tar cf ../$*.tar $*) +dist/%.zip: dist/tmp-destdir/% + rm -f $@ + (cd ./dist/tmp-destdir && zip -q -r ../$*.zip $*) +dist/%.tar.gz: dist/%.tar + gzip -n < $< > $@ +dist/%.tar.bz2: dist/%.tar + bzip2 < $< > $@ +dist/%.tar.xz: dist/%.tar + xz < $< > $@ + +distcheck: dist/${SRC_TARBALL}.tar.gz + test -e ${SRC_DIR}/.git # `distcheck` is only supported from git clones. + (cd ${SRC_DIR} && git ls-files) > obj/files-git + tar tf $< | sort | sed '/^\(.*\/\)\?$$/d; s/${SRC_TARBALL}\///' > obj/files-dist + diff -u obj/files-git obj/files-dist + rm obj/files-git obj/files-dist + +# Call this during development if something went wrong previously. +.PHONY: maint-undist +maint-undist: + rm -f dist/${SRC_TARBALL}.zip dist/${SRC_TARBALL}.tar.* + rm -f dist/${BIN_TARBALL}.zip dist/${BIN_TARBALL}.tar.* +.PHONY: maint-apply-xterm-boxdrawing +maint-apply-xterm-boxdrawing: + mkdir -p patched + cp ${FPC_SOURCE}/packages/rtl-console/src/unix/crt.pp patched/ + cp ${FPC_SOURCE}/packages/rtl-console/src/inc/crth.inc patched/ + patch patched/crt.pp < ${SRC_DIR}/xterm-boxdrawing/crt.pp.diff + +.PHONY: maint-unapply-xterm-boxdrawing +maint-unapply-xterm-boxdrawing: + rm -rf patched/ + +.PHONY: maint-unconfigure +maint-unconfigure: + rm -f config.status config.make Makefile +# Table of contents: +### CONFIGURATION +### OVERRIDES +### RULES +### CHECK +### INSTALL +### DISTRIBUTION diff --git a/configure b/configure new file mode 100755 index 0000000..282d99d --- /dev/null +++ b/configure @@ -0,0 +1,172 @@ +#!/bin/bash + +set -e + +trap 'echo Configure failed!' EXIT + +# Dead-simple hand-written configure script. + +die() +{ + printf '%s\n' "$@" >&2 + exit 1 +} + +src_dir="$(dirname "$0")" + +for arg +do + case "$arg" in + -h | --help) + cat << EOF +Usage: $0 [--flags | variables] [...] + +Core Flags: + --help this help + +Installation directories: + --prefix architecture-independent files [/usr/local] + --exec-prefix architecture-dependent files [PREFIX] + --bindir user executables [EPREFIX/games] + --datarootdir read-only data root [PREFIX/share] + --datadir read-only non-documentation data [DATAROOTDIR] + --docdir documentation [DATAROOTDIR/doc/PACKAGE] + + (other well-known directory options are accepted but ignored) + +Variables: + FPC compiler name [fpc] + FPCFLAGS compiler flags [-g -O2] + +Optional features: + (--enable-FEATURE is a shortcut for --enable-FEATURE=yes) + (--disable-FEATURE is a shortcut for --enable-FEATURE=no) + + --enable-xterm-boxdrawing + patch standard library to work with modern terminals [yes] + +Optional packages: + (--with-PACKAGE is a shortcut for --with-PACKAGE=yes) + (--without-PACKAGE is a shortcut for --with-PACKAGE=no) + + --with-sdl build the SDL frontend rather than the console one [no] +EOF + trap - EXIT + exit + ;; + esac +done + +exec 3>config.make.tmp + +for arg +do + case "$arg" in + --disable-*=* |\ + --without-*=*) + die "negative options can't have an argument" + ;; + --disable-*) + arg=--enable-"${arg#--disable-}"=no + ;; + --without-*) + arg=--with-"${arg#--without-}"=no + ;; + --enable-*=* |\ + --with-*=*) + # Just prevent the below from matching. + ;; + --enable-*) + arg="$arg"=yes + ;; + --with-*) + arg="$arg"=yes + ;; + --*=* |\ + *=*) + # Just prevent the below from matching. + ;; + --*) + die "missing argument: $arg";; + -*) + die "there are no short options: $arg";; + *) + die "invalid option $arg";; + esac + key="${arg%%=*}" + val="${arg#*=}" + case "$key" in + --prefix) + key=PREFIX + ;; + --exec-prefix) + key=EPREFIX + ;; + --bindir) + key=BINDIR + ;; + --datarootdir) + key=DATAROOTDIR + ;; + --datadir) + key=DATADIR + ;; + --docdir) + key=DOCDIR + ;; + FPC | FPCFLAGS) + ;; + --enable-xterm-boxdrawing) + key=ENABLE_XTERM_BOXDRAWING + ;; + --with-sdl) + key=WITH_SDL + ;; + --sbindir |\ + --libexecdir |\ + --sysconfdir |\ + --sharedstatedir |\ + --localstatedir |\ + --libdir |\ + --includedir |\ + --oldincludedir |\ + --infodir |\ + --localedir |\ + --mandir |\ + --htmldir |\ + --dvidir |\ + --pdfdir |\ + --psdir) + printf 'Warning: well-unknown but unused option: %s\n' "$key" >&2 + continue + ;; + --build | --host | --target | CC | CFLAGS | CXX | CXXFLAGS | LDFLAGS | LIBS) + printf 'Warning: FPC is not a C compiler: %s\n' "$key" >&2 + continue + ;; + *) + printf 'Warning: unknown option: %s\n' "$key" >&2 + continue + ;; + esac + echo "$key = $val" >&3 +done +echo "SRC_DIR = $src_dir" >&3 +exec 3>&- +mv config.make.tmp config.make + +exec 3>config.status.tmp +printf '#!/bin/sh\n' >&3 +printf '# Re-run this script to re-use a saved configuration.\n' >&3 +printf 'exec' >&3 +printf ' %q' "$0" "$@" >&3 +printf '\n' >&3 +exec 3>&- +chmod +x config.status.tmp +mv config.status.tmp config.status + +cp "$src_dir"/Makefile.in ./Makefile.tmp +mv Makefile.tmp Makefile + +trap - EXIT +echo 'Successfully (re?)configured!' diff --git a/boxdraw.inc b/inc/boxdraw.inc similarity index 100% rename from boxdraw.inc rename to inc/boxdraw.inc diff --git a/ability.pp b/src/ability.pp similarity index 100% rename from ability.pp rename to src/ability.pp diff --git a/action.pp b/src/action.pp similarity index 100% rename from action.pp rename to src/action.pp diff --git a/aibrain.pp b/src/aibrain.pp similarity index 100% rename from aibrain.pp rename to src/aibrain.pp diff --git a/arenacfe.pp b/src/arenacfe.pp similarity index 100% rename from arenacfe.pp rename to src/arenacfe.pp diff --git a/arenahq.pp b/src/arenahq.pp similarity index 100% rename from arenahq.pp rename to src/arenahq.pp diff --git a/arenaplay.pp b/src/arenaplay.pp similarity index 100% rename from arenaplay.pp rename to src/arenaplay.pp diff --git a/arenascript.pp b/src/arenascript.pp similarity index 100% rename from arenascript.pp rename to src/arenascript.pp diff --git a/backpack.pp b/src/backpack.pp similarity index 100% rename from backpack.pp rename to src/backpack.pp diff --git a/colormenu.pp b/src/colormenu.pp similarity index 100% rename from colormenu.pp rename to src/colormenu.pp diff --git a/congfx.pp b/src/congfx.pp similarity index 100% rename from congfx.pp rename to src/congfx.pp diff --git a/coninfo.pp b/src/coninfo.pp similarity index 100% rename from coninfo.pp rename to src/coninfo.pp diff --git a/conmap.pp b/src/conmap.pp similarity index 100% rename from conmap.pp rename to src/conmap.pp diff --git a/conmenus.pp b/src/conmenus.pp similarity index 100% rename from conmenus.pp rename to src/conmenus.pp diff --git a/context.pp b/src/context.pp similarity index 100% rename from context.pp rename to src/context.pp diff --git a/cosplay.pas b/src/cosplay.pas similarity index 100% rename from cosplay.pas rename to src/cosplay.pas diff --git a/damage.pp b/src/damage.pp similarity index 100% rename from damage.pp rename to src/damage.pp diff --git a/effects.pp b/src/effects.pp similarity index 100% rename from effects.pp rename to src/effects.pp diff --git a/factory.pp b/src/factory.pp similarity index 100% rename from factory.pp rename to src/factory.pp diff --git a/gears.pp b/src/gears.pp similarity index 100% rename from gears.pp rename to src/gears.pp diff --git a/gearutil.pp b/src/gearutil.pp similarity index 100% rename from gearutil.pp rename to src/gearutil.pp diff --git a/gflooker.pp b/src/gflooker.pp similarity index 100% rename from gflooker.pp rename to src/gflooker.pp diff --git a/gharena.pas b/src/gharena.pas similarity index 100% rename from gharena.pas rename to src/gharena.pas diff --git a/ghchars.pp b/src/ghchars.pp similarity index 100% rename from ghchars.pp rename to src/ghchars.pp diff --git a/ghcpit.pp b/src/ghcpit.pp similarity index 100% rename from ghcpit.pp rename to src/ghcpit.pp diff --git a/gheffect.pp b/src/gheffect.pp similarity index 100% rename from gheffect.pp rename to src/gheffect.pp diff --git a/ghguard.pp b/src/ghguard.pp similarity index 100% rename from ghguard.pp rename to src/ghguard.pp diff --git a/ghholder.pp b/src/ghholder.pp similarity index 100% rename from ghholder.pp rename to src/ghholder.pp diff --git a/ghintrinsic.pp b/src/ghintrinsic.pp similarity index 100% rename from ghintrinsic.pp rename to src/ghintrinsic.pp diff --git a/ghmecha.pp b/src/ghmecha.pp similarity index 100% rename from ghmecha.pp rename to src/ghmecha.pp diff --git a/ghmodule.pp b/src/ghmodule.pp similarity index 100% rename from ghmodule.pp rename to src/ghmodule.pp diff --git a/ghmovers.pp b/src/ghmovers.pp similarity index 100% rename from ghmovers.pp rename to src/ghmovers.pp diff --git a/ghparser.pp b/src/ghparser.pp similarity index 100% rename from ghparser.pp rename to src/ghparser.pp diff --git a/ghprop.pp b/src/ghprop.pp similarity index 100% rename from ghprop.pp rename to src/ghprop.pp diff --git a/ghsensor.pp b/src/ghsensor.pp similarity index 100% rename from ghsensor.pp rename to src/ghsensor.pp diff --git a/ghsupport.pp b/src/ghsupport.pp similarity index 100% rename from ghsupport.pp rename to src/ghsupport.pp diff --git a/ghswag.pp b/src/ghswag.pp similarity index 100% rename from ghswag.pp rename to src/ghswag.pp diff --git a/ghweapon.pp b/src/ghweapon.pp similarity index 100% rename from ghweapon.pp rename to src/ghweapon.pp diff --git a/grabgear.pp b/src/grabgear.pp similarity index 100% rename from grabgear.pp rename to src/grabgear.pp diff --git a/interact.pp b/src/interact.pp similarity index 100% rename from interact.pp rename to src/interact.pp diff --git a/locale.pp b/src/locale.pp similarity index 100% rename from locale.pp rename to src/locale.pp diff --git a/mapedit.pp b/src/mapedit.pp similarity index 100% rename from mapedit.pp rename to src/mapedit.pp diff --git a/menugear.pp b/src/menugear.pp similarity index 100% rename from menugear.pp rename to src/menugear.pp diff --git a/movement.pp b/src/movement.pp similarity index 100% rename from movement.pp rename to src/movement.pp diff --git a/navigate.pp b/src/navigate.pp similarity index 100% rename from navigate.pp rename to src/navigate.pp diff --git a/pcaction.pp b/src/pcaction.pp similarity index 100% rename from pcaction.pp rename to src/pcaction.pp diff --git a/playwright.pp b/src/playwright.pp similarity index 100% rename from playwright.pp rename to src/playwright.pp diff --git a/randchar.pp b/src/randchar.pp similarity index 100% rename from randchar.pp rename to src/randchar.pp diff --git a/randmaps.pp b/src/randmaps.pp similarity index 100% rename from randmaps.pp rename to src/randmaps.pp diff --git a/rpgdice.pp b/src/rpgdice.pp similarity index 100% rename from rpgdice.pp rename to src/rpgdice.pp diff --git a/sdlgfx.pp b/src/sdlgfx.pp similarity index 100% rename from sdlgfx.pp rename to src/sdlgfx.pp diff --git a/sdlinfo.pp b/src/sdlinfo.pp similarity index 100% rename from sdlinfo.pp rename to src/sdlinfo.pp diff --git a/sdlmap.pp b/src/sdlmap.pp similarity index 100% rename from sdlmap.pp rename to src/sdlmap.pp diff --git a/sdlmenus.pp b/src/sdlmenus.pp similarity index 100% rename from sdlmenus.pp rename to src/sdlmenus.pp diff --git a/services.pp b/src/services.pp similarity index 100% rename from services.pp rename to src/services.pp diff --git a/skilluse.pp b/src/skilluse.pp similarity index 100% rename from skilluse.pp rename to src/skilluse.pp diff --git a/texutil.pp b/src/texutil.pp similarity index 100% rename from texutil.pp rename to src/texutil.pp diff --git a/ui4gh.pp b/src/ui4gh.pp similarity index 100% rename from ui4gh.pp rename to src/ui4gh.pp diff --git a/wmonster.pp b/src/wmonster.pp similarity index 100% rename from wmonster.pp rename to src/wmonster.pp diff --git a/xxran.pas b/src/xxran.pas similarity index 100% rename from xxran.pas rename to src/xxran.pas