aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beich <jbeich@FreeBSD.org>2017-05-09 20:57:05 +0000
committerJan Beich <jbeich@FreeBSD.org>2017-05-09 20:57:05 +0000
commit68a8fbed3e6fb7060797f900405452eac95d1c11 (patch)
tree7406297ed136a6b92280eff13ef6a79b4fbb6826
parent309e6c96ce6aef149ad5f9b53b1832abd3c2f879 (diff)
downloadports-68a8fbed3e6fb7060797f900405452eac95d1c11.tar.gz
ports-68a8fbed3e6fb7060797f900405452eac95d1c11.zip
Notes
-rw-r--r--games/Makefile4
-rw-r--r--games/openbor/Makefile44
-rw-r--r--games/openbor/distinfo6
-rw-r--r--games/openbor/files/patch-openbor.c85
-rw-r--r--games/openbor/files/patch-source_ramlib_ram.c8
-rw-r--r--games/openbor/files/patch-source_utils.c11
-rw-r--r--games/openbor/files/pkg-message.in10
-rw-r--r--games/openbor/pkg-message10
-rw-r--r--games/openbor3482/Makefile12
-rw-r--r--games/openbor3482/distinfo3
-rw-r--r--games/openbor3482/files/patch-openbor.c30
-rw-r--r--games/openbor3482/files/patch-sdl_menu.c13
-rw-r--r--games/openbor3482/files/patch-sdl_sdlport.c30
-rw-r--r--games/openbor3482/files/patch-source_gamelib_packfile.c13
-rw-r--r--games/openbor3482/files/patch-source_gamelib_packfile.h13
-rw-r--r--games/openbor3482/files/patch-source_ramlib_ram.c224
-rw-r--r--games/openbor3711/Makefile12
-rw-r--r--games/openbor3711/distinfo3
-rw-r--r--games/openbor3979/Makefile12
-rw-r--r--games/openbor3979/distinfo3
-rw-r--r--games/openbor3979/files/patch-openbor.c34
-rw-r--r--games/openbor3979/files/patch-sdl_menu.c13
-rw-r--r--games/openbor3979/files/patch-sdl_sdlport.c31
-rw-r--r--games/openbor3979/files/patch-source_gamelib_packfile.c13
-rw-r--r--games/openbor3979/files/patch-source_gamelib_packfile.h13
-rw-r--r--games/openbor3979/files/patch-source_ramlib_ram.c224
-rw-r--r--games/openbor3979/files/patch-source_scriptlib_Parser.c13
-rw-r--r--games/openbor4432/Makefile12
-rw-r--r--games/openbor4432/distinfo3
-rw-r--r--games/openbor4432/files/patch-openbor.c93
-rw-r--r--games/openbor4432/files/patch-sdl_menu.c13
-rw-r--r--games/openbor4432/files/patch-sdl_sdlport.c30
-rw-r--r--games/openbor4432/files/patch-source_gamelib_packfile.c13
-rw-r--r--games/openbor4432/files/patch-source_gamelib_packfile.h13
-rw-r--r--games/openbor4432/files/patch-source_ramlib_ram.c190
-rw-r--r--games/openbor4432/files/patch-source_scriptlib_Parser.c13
36 files changed, 1189 insertions, 78 deletions
diff --git a/games/Makefile b/games/Makefile
index db0e7d2dba59..30921a0bf22f 100644
--- a/games/Makefile
+++ b/games/Makefile
@@ -684,6 +684,10 @@
SUBDIR += openarena-server
SUBDIR += openastromenace
SUBDIR += openbor
+ SUBDIR += openbor3482
+ SUBDIR += openbor3711
+ SUBDIR += openbor3979
+ SUBDIR += openbor4432
SUBDIR += openbubbles
SUBDIR += opencity
SUBDIR += openclonk
diff --git a/games/openbor/Makefile b/games/openbor/Makefile
index 81439ddb5c42..68ab2f71a288 100644
--- a/games/openbor/Makefile
+++ b/games/openbor/Makefile
@@ -2,28 +2,39 @@
PORTNAME= openbor
# Hint: svn revision is git rev-list --count ${GH_TAGNAME}
-PORTVERSION= 3.0.r4432
+PORTVERSION?= 4504
CATEGORIES= games
MAINTAINER= jbeich@FreeBSD.org
COMMENT= Moddable fighting game engine (aka Beats of Rage)
-LICENSE= BSD3CLAUSE GPLv2+ ISCL
+LICENSE= BSD3CLAUSE GPLv2+
+.if ${PORTVERSION} >= 4134
+LICENSE+= ISCL
+.endif
LICENSE_COMB= multi
LICENSE_FILE_BSD3CLAUSE=${WRKSRC}/LICENSE
LICENSE_FILE_GPLv2+ = ${_LICENSE_STORE}/GPLv2 # source/gfxlib/hq2x.c
LICENSE_FILE_ISCL= ${WRKSRC}/source/webmlib/nestegg/LICENSE
-LIB_DEPENDS= libpng.so:graphics/png \
- libvpx.so:multimedia/libvpx
+LIB_DEPENDS= libpng.so:graphics/png
+.if ${PORTVERSION} >= 4134
+LIB_DEPENDS+= libvpx.so:multimedia/libvpx
+.endif
USE_GITHUB= yes
GH_ACCOUNT= DCurrent
-GH_TAGNAME= ba1eb4f # git v4432 is actually svn r4437
+GH_TAGNAME?= 4dfdb66
-USES= gmake pkgconfig
+USES+= gmake pkgconfig
+.if ${PORTVERSION} < 4433
USE_CSTD= gnu89
+.endif
+.if ${PORTVERSION} < 4108
+USE_SDL= gfx
+.else
USE_SDL= gfx2
+.endif
WRKSRC_SUBDIR= engine
MAKE_ENV= BUILD_LINUX=1 SDKPATH="${LOCALBASE}" \
GCC_TARGET="${CONFIGURE_TARGET:S/amd64/x86_64/}"
@@ -31,14 +42,17 @@ MAKE_ARGS= CC="${CC}" LIBRARIES="${LOCALBASE}/lib" \
TARGET_ARCH=${ARCH:S/i386/x86/} ARCHFLAGS="" \
TARGET_FINAL='${TARGET}' BUILD_MMX="" ECHO="${ECHO}"
LDFLAGS+= -Wl,--as-needed # ogg, pthread, zlib
-PLIST_FILES= bin/${PORTNAME} \
- share/pixmaps/${PORTNAME}.png
+SUB_FILES= pkg-message
+SUB_LIST= PKGBASE=${PKGBASE}
+PLIST_FILES= bin/${PKGBASE} \
+ share/pixmaps/${PKGBASE}.png
+DOCSDIR= ${PREFIX}/share/doc/${PKGBASE}
PORTDOCS= README
-DESKTOP_ENTRIES="OpenBOR" \
+DESKTOP_ENTRIES="OpenBOR v3.0 Build ${PORTVERSION}" \
"" \
- "${PORTNAME}" \
- "${PORTNAME}" \
+ "${PKGBASE}" \
+ "${PKGBASE}" \
"Game;ArcadeGame;" \
""
@@ -63,10 +77,12 @@ post-patch:
-e 's/@echo/@$$(ECHO)/' \
-e 's/$$(LIBS)/$$(LDFLAGS) &/' \
${WRKSRC}/Makefile
+ @${REINPLACE_CMD} -e 's/\.openbor/.${PKGBASE}/' \
+ ${WRKSRC}/sdl/sdlport.c
@${GREP} -Flr 'malloc.h' ${WRKSRC} | ${XARGS} ${REINPLACE_CMD} \
's,malloc\.h,stdlib.h,'
@${REINPLACE_CMD} -e 's/^function \(.*\) {/\1() {/' \
- -e 's/^get_revnum$$/VERSION_BUILD=${PORTVERSION:E:S/^r//}/' \
+ -e 's/^get_revnum$$/VERSION_BUILD=${PORTVERSION}/' \
${WRKSRC}/version.sh
do-configure:
@@ -74,9 +90,9 @@ do-configure:
do-install:
${INSTALL_PROGRAM} ${WRKSRC}/OpenBOR.elf \
- ${STAGEDIR}${PREFIX}/bin/${PORTNAME}
+ ${STAGEDIR}${PREFIX}/bin/${PKGBASE}
${INSTALL_DATA} ${WRKSRC}/resources/OpenBOR_Icon_128x128.png \
- ${STAGEDIR}${PREFIX}/share/pixmaps/${PORTNAME}.png
+ ${STAGEDIR}${PREFIX}/share/pixmaps/${PKGBASE}.png
(cd ${WRKSRC} && ${COPYTREE_SHARE} \
"${PORTDOCS}" ${STAGEDIR}${DOCSDIR})
diff --git a/games/openbor/distinfo b/games/openbor/distinfo
index 73649735fc4d..f449e59f8094 100644
--- a/games/openbor/distinfo
+++ b/games/openbor/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1485387608
-SHA256 (DCurrent-openbor-3.0.r4432-ba1eb4f_GH0.tar.gz) = 0c26130127d1ec1d98c6c5e68b38a11df3e405ed7e43b7c61762f6ae862538c5
-SIZE (DCurrent-openbor-3.0.r4432-ba1eb4f_GH0.tar.gz) = 6087650
+TIMESTAMP = 1494074450
+SHA256 (DCurrent-openbor-4504-4dfdb66_GH0.tar.gz) = 1387fe221642c109d209f35c711222a6718028e7d435ef56f83668f90d69ca3c
+SIZE (DCurrent-openbor-4504-4dfdb66_GH0.tar.gz) = 66890491
diff --git a/games/openbor/files/patch-openbor.c b/games/openbor/files/patch-openbor.c
index 1cab90006f74..94f2d6cfeaab 100644
--- a/games/openbor/files/patch-openbor.c
+++ b/games/openbor/files/patch-openbor.c
@@ -2,36 +2,36 @@ Fix potential crashes found by ASan/Clang/GCC
Fix an infinite loop in lcmScriptDeleteMain()
Avoid accidental rounding from abs()
---- openbor.c.orig 2016-12-22 13:02:02 UTC
+--- openbor.c.orig 2017-04-22 14:20:08 UTC
+++ openbor.c
@@ -5810,7 +5810,7 @@ s_collision_attack **collision_alloc_att
- size_t alloc_size;
-
- // Get amount of memory we'll need.
-- alloc_size = sizeof(*result);
-+ alloc_size = max_collisons * sizeof(*result);
-
- // Allocate memory and get pointer.
- result = malloc(alloc_size);
+ size_t alloc_size;
+
+ // Get amount of memory we'll need.
+- alloc_size = sizeof(*result);
++ alloc_size = max_collisons * sizeof(*result);
+
+ // Allocate memory and get pointer.
+ result = malloc(alloc_size);
@@ -5859,7 +5859,7 @@ s_collision_body **collision_alloc_body_
- size_t alloc_size;
-
- // Get amount of memory we'll need.
-- alloc_size = sizeof(*result);
-+ alloc_size = max_collisons * sizeof(*result);
-
- // Allocate memory and get pointer.
- result = malloc(alloc_size);
+ size_t alloc_size;
+
+ // Get amount of memory we'll need.
+- alloc_size = sizeof(*result);
++ alloc_size = max_collisons * sizeof(*result);
+
+ // Allocate memory and get pointer.
+ result = malloc(alloc_size);
@@ -8204,7 +8204,8 @@ size_t lcmScriptCopyBuffer(ArgList *argl
-
- size_t lcmScriptDeleteMain(char **buf)
- {
-- size_t len = 0, i = 0;
-+ size_t len = 0;
-+ long i = 0;
- ptrdiff_t pos = 0;
- char *newbuf = NULL;
-
+
+ size_t lcmScriptDeleteMain(char **buf)
+ {
+- size_t len = 0, i = 0;
++ size_t len = 0;
++ long i = 0;
+ ptrdiff_t pos = 0;
+ char *newbuf = NULL;
+
@@ -13933,7 +13933,7 @@ void generate_basemap(int map_index, flo
void load_level(char *filename)
@@ -53,30 +53,21 @@ Avoid accidental rounding from abs()
if (value > maxvalue)
{
value = maxvalue;
-@@ -20471,7 +20476,7 @@ void common_dot()
- entity *eOpp; //Owner of dot effect.
- s_collision_attack attack; //Attack struct.
+@@ -21710,8 +21716,8 @@ int reset_backpain(entity *ent)
+ if (ent->normaldamageflipdir == DIRECTION_RIGHT) ent->direction = DIRECTION_RIGHT;
+ else ent->direction = DIRECTION_LEFT;
-- for(iIndex = 0; iIndex <= MAX_DOTS; iIndex++) //Loop through all DOT indexes.
-+ for(iIndex = 0; iIndex < MAX_DOTS; iIndex++) //Loop through all DOT indexes.
- {
- iDot_time = self->dot_time[iIndex]; //Get expire time.
- iDot_cnt = self->dot_cnt[iIndex]; //Get next tick time.
-@@ -21710,8 +21716,8 @@ int reset_backpain(entity *ent)
- if (ent->normaldamageflipdir == DIRECTION_RIGHT) ent->direction = DIRECTION_RIGHT;
- else ent->direction = DIRECTION_LEFT;
-
-- if(ent->direction == DIRECTION_RIGHT) ent->velocity.x = -1*abs(ent->velocity.x);
-- else ent->velocity.x = abs(ent->velocity.x);
-+ if(ent->direction == DIRECTION_RIGHT) ent->velocity.x = -1*ABS(ent->velocity.x);
-+ else ent->velocity.x = ABS(ent->velocity.x);
-
- return 1;
- }
+- if(ent->direction == DIRECTION_RIGHT) ent->velocity.x = -1*abs(ent->velocity.x);
+- else ent->velocity.x = abs(ent->velocity.x);
++ if(ent->direction == DIRECTION_RIGHT) ent->velocity.x = -1*ABS(ent->velocity.x);
++ else ent->velocity.x = ABS(ent->velocity.x);
+
+ return 1;
+ }
@@ -25831,7 +25837,7 @@ int common_try_wander(entity *target, in
mod = -mod;
}
- //if ((self->sortid / 100) % 2)
+ //if ((self->sortid / 100) % 2)
- if (abs(rand32()) % 2)
+ if (rand32() % 2)
{
@@ -85,7 +76,7 @@ Avoid accidental rounding from abs()
@@ -34607,7 +34612,7 @@ void keyboard_setup(int player)
strncpy(buttonnames[SDID_SPECIAL], "Special", 16);
strncpy(buttonnames[SDID_START], "Start", 16);
- strncpy(buttonnames[SDID_SCREENSHOT], "Screenshot", 16);
+ strncpy(buttonnames[SDID_SCREENSHOT], "Screenshot", 16);
- strncpy(buttonnames[SDID_ESC], "Exit", 16);
+ //strncpy(buttonnames[SDID_ESC], "Exit", 16);
diff --git a/games/openbor/files/patch-source_ramlib_ram.c b/games/openbor/files/patch-source_ramlib_ram.c
index 5a32a492ed5c..f8980f677d3e 100644
--- a/games/openbor/files/patch-source_ramlib_ram.c
+++ b/games/openbor/files/patch-source_ramlib_ram.c
@@ -1,6 +1,6 @@
Implement Linux-like memory stats for BSDs
---- source/ramlib/ram.c.orig 2015-04-18 21:21:56 UTC
+--- source/ramlib/ram.c.orig 2017-04-22 14:20:08 UTC
+++ source/ramlib/ram.c
@@ -25,6 +25,21 @@
#include <mach/task.h>
@@ -133,12 +133,12 @@ Implement Linux-like memory stats for BSDs
#elif LINUX
struct sysinfo info;
sysinfo(&info);
-@@ -180,7 +262,10 @@ void setSystemRam()
+@@ -183,7 +265,10 @@ void setSystemRam()
stackSize = 0x00000000;
systemRam = getFreeRam(BYTES);
#endif
--#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || defined(SYMBIAN))
-+#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || defined(SYMBIAN) || \
+-#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || defined(SYMBIAN) || defined(VITA))
++#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || defined(SYMBIAN) || defined(VITA) || \
+ defined(__DragonFly__) || defined(__FreeBSD__) || \
+ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || \
+ defined(__OpenBSD__))
diff --git a/games/openbor/files/patch-source_utils.c b/games/openbor/files/patch-source_utils.c
new file mode 100644
index 000000000000..d737e7cff108
--- /dev/null
+++ b/games/openbor/files/patch-source_utils.c
@@ -0,0 +1,11 @@
+--- source/utils.c.bak 2017-04-22 14:20:08 UTC
++++ source/utils.c
+@@ -295,7 +295,7 @@ void *checkAlloc(void *ptr, size_t size, const char *f
+ "\n* Shutting Down *\n\n");
+ writeToLogFile("Out of memory!\n");
+ writeToLogFile("Allocation of size %i failed in function '%s' at %s:%i.\n", size, func, file, line);
+-#ifndef WIN
++#if defined(__GLIBC__) || defined(ANDROID) || defined(VITA)
+ writeToLogFile("Memory usage at exit: %u\n", mallinfo().arena);
+ #endif
+ exit(2);
diff --git a/games/openbor/files/pkg-message.in b/games/openbor/files/pkg-message.in
new file mode 100644
index 000000000000..b948355fecdf
--- /dev/null
+++ b/games/openbor/files/pkg-message.in
@@ -0,0 +1,10 @@
+To play a game copy its .pak file under ~/.%%PKGBASE%%/Paks/ directory.
+If only one file is there OpenBOR would run the game on startup,
+otherwise game launcher would appear.
+
+In case a game has data/ directory unpacked you may need to run it
+as follows:
+
+ $ cd /path/to/game
+ $ cp -R ~/.%%PKGBASE%%/Saves .
+ $ OPENBOR_USE_CURDIR=1 %%PKGBASE%%
diff --git a/games/openbor/pkg-message b/games/openbor/pkg-message
deleted file mode 100644
index 6cb325cfbbb5..000000000000
--- a/games/openbor/pkg-message
+++ /dev/null
@@ -1,10 +0,0 @@
-To play a module copy its .pak file under ~/.openbor/Paks/ directory.
-If only one file is there OpenBOR would run the module on startup,
-otherwise module launcher would appear.
-
-In case a module has data/ directory unpacked you may need to run it
-as follows:
-
- $ cd /path/to/module
- $ cp -R ~/.openbor/Saves .
- $ OPENBOR_USE_CURDIR=1 openbor
diff --git a/games/openbor3482/Makefile b/games/openbor3482/Makefile
new file mode 100644
index 000000000000..dbe24202a4ad
--- /dev/null
+++ b/games/openbor3482/Makefile
@@ -0,0 +1,12 @@
+# $FreeBSD$
+
+PORTVERSION= 3482
+PKGNAMESUFFIX= ${PORTVERSION}
+
+MASTERDIR= ${.CURDIR}/../openbor
+PATCHDIR= ${.CURDIR}/files
+DISTINFO_FILE= ${.CURDIR}/distinfo
+
+GH_TAGNAME= 2c1ecd7
+
+.include "${MASTERDIR}/Makefile"
diff --git a/games/openbor3482/distinfo b/games/openbor3482/distinfo
new file mode 100644
index 000000000000..3c269cc92332
--- /dev/null
+++ b/games/openbor3482/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1317171905
+SHA256 (DCurrent-openbor-3482-2c1ecd7_GH0.tar.gz) = 9e92378bd1f97f9d3c6af05faabe9372cbc36f82d41dfa4e1083f9ff2bcf51d3
+SIZE (DCurrent-openbor-3482-2c1ecd7_GH0.tar.gz) = 3024595
diff --git a/games/openbor3482/files/patch-openbor.c b/games/openbor3482/files/patch-openbor.c
new file mode 100644
index 000000000000..33e7f6f41244
--- /dev/null
+++ b/games/openbor3482/files/patch-openbor.c
@@ -0,0 +1,30 @@
+Fix potential crashes found by ASan/Clang/GCC
+
+--- openbor.c.orig 2011-09-28 01:05:05 UTC
++++ openbor.c
+@@ -8843,7 +8843,7 @@ char* llHandleCommandSpawnscript(ArgList
+
+
+ void load_level(char *filename){
+- char *buf;
++ char *buf = NULL;
+ size_t size, len;
+ ptrdiff_t pos, oldpos;
+ char *command;
+@@ -9820,6 +9820,7 @@ void bar(int x, int y, int value, int ma
+ else if(pstatus->orientation==verticalbar) max = pstatus->sizey;
+ else return;
+
++ if (value < 0) value = 0;
+ if (value > maxvalue) value = maxvalue;
+
+ if(pstatus->type==valuebar)
+@@ -12884,7 +12885,7 @@ void common_dot()
+ entity* eOpp; //Owner of dot effect.
+ s_attack attack; //Attack struct.
+
+- for(iIndex=0; iIndex<=MAX_DOTS; iIndex++) //Loop through all DOT indexes.
++ for(iIndex=0; iIndex<MAX_DOTS; iIndex++) //Loop through all DOT indexes.
+ {
+ iDot_time = self->dot_time[iIndex]; //Get expire time.
+ iDot_cnt = self->dot_cnt[iIndex]; //Get next tick time.
diff --git a/games/openbor3482/files/patch-sdl_menu.c b/games/openbor3482/files/patch-sdl_menu.c
new file mode 100644
index 000000000000..023fb8417e64
--- /dev/null
+++ b/games/openbor3482/files/patch-sdl_menu.c
@@ -0,0 +1,13 @@
+Don't crash with empty Paks/ directory.
+
+--- sdl/menu.c.orig 2015-04-18 21:21:56 UTC
++++ sdl/menu.c
+@@ -747,7 +747,7 @@ void Menu()
+ }
+ freeAllLogs();
+ termMenu();
+- if(ctrl == 2)
++ if(dListTotal == 0 || ctrl == 2)
+ {
+ if (filelist)
+ {
diff --git a/games/openbor3482/files/patch-sdl_sdlport.c b/games/openbor3482/files/patch-sdl_sdlport.c
new file mode 100644
index 000000000000..ef9aaa54a148
--- /dev/null
+++ b/games/openbor3482/files/patch-sdl_sdlport.c
@@ -0,0 +1,30 @@
+Store settings under ~/.openbor instead of current directory
+
+--- sdl/sdlport.c.orig 2011-04-08 16:22:58 UTC
++++ sdl/sdlport.c
+@@ -11,6 +11,9 @@
+ #include "ram.h"
+ #include "video.h"
+ #include "menu.h"
++#include <sys/stat.h>
++#include <err.h>
++#include <unistd.h>
+
+ #ifdef DARWIN
+ #include <CoreFoundation/CoreFoundation.h>
+@@ -83,6 +86,15 @@ int main(int argc, char *argv[])
+
+ packfile_mode(0);
+
++ if(!getenv("OPENBOR_USE_CURDIR"))
++ {
++ if (chdir(getenv("HOME")) != 0)
++ err(1, "cannot cd to $HOME");
++ if (mkdir(".openbor", 0755) != 0 && errno != EEXIST)
++ err(1, "cannot mkdir $HOME/.openbor");
++ if (chdir(".openbor") != 0)
++ err(1, "cannot cd to $HOME/.openbor");
++ }
+ dirExists(paksDir, 1);
+ dirExists(savesDir, 1);
+ dirExists(logsDir, 1);
diff --git a/games/openbor3482/files/patch-source_gamelib_packfile.c b/games/openbor3482/files/patch-source_gamelib_packfile.c
new file mode 100644
index 000000000000..2d01c44f70ca
--- /dev/null
+++ b/games/openbor3482/files/patch-source_gamelib_packfile.c
@@ -0,0 +1,13 @@
+Reset seek position for BGM with more than 64 tracks
+
+--- source/gamelib/packfile.c.orig 2011-09-28 01:05:05 UTC
++++ source/gamelib/packfile.c
+@@ -1137,7 +1137,7 @@ void packfile_music_read(fileliststruct *filelist, int
+ getBasePath(packfile, filelist[i].filename, 1);
+ if(stristr(packfile, ".pak"))
+ {
+- memset(filelist[i].bgmTracks, 0, 256);
++ memset(filelist[i].bgmTracks, 0, sizeof(filelist[i].bgmTracks));
+ filelist[i].nTracks = 0;
+ fd = fopen(packfile, "rb");
+ if(fd == NULL) continue;
diff --git a/games/openbor3482/files/patch-source_gamelib_packfile.h b/games/openbor3482/files/patch-source_gamelib_packfile.h
new file mode 100644
index 000000000000..956ff25dcbf5
--- /dev/null
+++ b/games/openbor3482/files/patch-source_gamelib_packfile.h
@@ -0,0 +1,13 @@
+Don't crash with > 80 tracks.
+
+--- source/gamelib/packfile.h.orig 2011-04-08 16:22:58 UTC
++++ source/gamelib/packfile.h
+@@ -40,7 +40,7 @@ typedef struct pnamestruct{
+ typedef struct fileliststruct{
+ char filename[128];
+ int nTracks;
+- char bgmFileName[80][256];
++ char bgmFileName[256][80];
+ int bgmTrack;
+ unsigned int bgmTracks[256];
+ #ifdef SDL
diff --git a/games/openbor3482/files/patch-source_ramlib_ram.c b/games/openbor3482/files/patch-source_ramlib_ram.c
new file mode 100644
index 000000000000..ea89f1717897
--- /dev/null
+++ b/games/openbor3482/files/patch-source_ramlib_ram.c
@@ -0,0 +1,224 @@
+Implement Linux-like memory stats for BSDs
+
+--- source/ramlib/ram.c.orig 2011-04-08 16:22:58 UTC
++++ source/ramlib/ram.c
+@@ -27,6 +27,21 @@
+ #include <mach/task.h>
+ #include <mach/mach.h>
+ #include <mach/mach_init.h>
++#elif defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#include <unistd.h>
++# if defined(__DragonFly__)
++#include <sys/kinfo.h> // struct kinfo_proc
++#include <sys/vmmeter.h> // struct vmstats
++# elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++#include <sys/user.h> // struct kinfo_proc
++# elif defined(__NetBSD__)
++#include <uvm/uvm_extern.h> // struct uvmexp_sysctl
++# elif defined(__OpenBSD__)
++#include <uvm/uvmexp.h> // struct uvmexp
++# endif
+ #elif LINUX
+ #include <sys/sysinfo.h>
+ #include <unistd.h>
+@@ -54,12 +69,22 @@ static u64 systemRam = 0x00000000;
+ #ifndef WIN
+ #ifndef XBOX
+ #ifndef LINUX
++#ifndef __DragonFly__
++#ifndef __FreeBSD__
++#ifndef __FreeBSD_kernel__
++#ifndef __NetBSD__
++#ifndef __OpenBSD__
+ static unsigned long elfOffset = 0x00000000;
+ static unsigned long stackSize = 0x00000000;
+ #endif
+ #endif
+ #endif
+ #endif
++#endif
++#endif
++#endif
++#endif
++#endif
+
+ /////////////////////////////////////////////////////////////////////////////
+ // Symbols
+@@ -68,6 +93,11 @@ static unsigned long stackSize = 0x00000
+ #ifndef WIN
+ #ifndef XBOX
+ #ifndef LINUX
++#ifndef __DragonFly__
++#ifndef __FreeBSD__
++#ifndef __FreeBSD_kernel__
++#ifndef __NetBSD__
++#ifndef __OpenBSD__
+ #if (__GNUC__ > 3)
+ extern unsigned long _end;
+ extern unsigned long _start;
+@@ -81,6 +111,11 @@ extern unsigned long start;
+ #endif
+ #endif
+ #endif
++#endif
++#endif
++#endif
++#endif
++#endif
+
+ /////////////////////////////////////////////////////////////////////////////
+ // Functions
+@@ -101,6 +136,49 @@ u64 getFreeRam(int byte_size)
+ if(host_page_size(hostPort, &size) != KERN_SUCCESS) return 0;
+ if(host_statistics(hostPort, HOST_VM_INFO, (host_info_t)&vms, &count) != KERN_SUCCESS) return 0;
+ return (u64)(((vms.inactive_count+vms.free_count)*size)/byte_size);
++#elif defined(__DragonFly__)
++ struct vmstats vms;
++ size_t sz = sizeof(vms);
++ if (sysctlbyname("vm.vmstats", &vms, &sz, NULL, 0))
++ {
++ return 0;
++ }
++ return (u64)((vms.v_free_count + vms.v_inactive_count
++ + vms.v_cache_count) * getpagesize()) / byte_size;
++#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++ u_int v_free_count, v_inactive_count, v_cache_count;
++ size_t sz = sizeof(u_int);
++ v_free_count = v_inactive_count = v_cache_count = 0;
++ sysctlbyname("vm.stats.vm.v_free_count",
++ &v_free_count, &sz, NULL, 0);
++ sysctlbyname("vm.stats.vm.v_inactive_count",
++ &v_inactive_count, &sz, NULL, 0);
++ sysctlbyname("vm.stats.vm.v_cache_count",
++ &v_cache_count, &sz, NULL, 0);
++ return (u64)((v_free_count + v_inactive_count + v_cache_count)
++ * getpagesize()) / byte_size;
++#elif defined(__NetBSD__) || defined(__OpenBSD__)
++# if defined(__NetBSD__)
++#undef VM_UVMEXP
++#define VM_UVMEXP VM_UVMEXP2
++#define uvmexp uvmexp_sysctl
++# else
++#define filepages vnodepages
++#define execpages vtextpages
++# endif
++ int mib[] = {
++ CTL_VM,
++ VM_UVMEXP,
++ };
++ u_int miblen = sizeof(mib) / sizeof(mib[0]);
++ struct uvmexp uvmexp;
++ size_t sz = sizeof(uvmexp);
++ if (sysctl(mib, miblen, &uvmexp, &sz, NULL, 0))
++ {
++ return 0;
++ }
++ return (u64)((uvmexp.free + uvmexp.inactive + uvmexp.filepages
++ + uvmexp.execpages) * uvmexp.pagesize) / byte_size;
+ #elif LINUX
+ struct sysinfo info;
+ sysinfo(&info);
+@@ -138,11 +216,29 @@ void setSystemRam()
+ stat.dwLength = sizeof(MEMORYSTATUS);
+ GlobalMemoryStatus(&stat);
+ systemRam = stat.dwTotalPhys;
+-#elif DARWIN
+- u64 mem;
+- size_t len = sizeof(mem);
+- sysctlbyname("hw.memsize", &mem, &len, NULL, 0);
+- systemRam = mem;
++#elif defined(DARWIN) || defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
++# if defined(HW_MEMSIZE) || defined(HW_PHYSMEM64)
++ uint64_t physmem;
++# else
++ u_long physmem;
++# endif
++ int mib[] = {
++ CTL_HW,
++# if defined(HW_MEMSIZE)
++ HW_MEMSIZE,
++# elif defined(HW_PHYSMEM64)
++ HW_PHYSMEM64,
++# else
++ HW_PHYSMEM,
++# endif
++ };
++ size_t sz = sizeof(physmem);
++ if (sysctl(mib, 2, &physmem, &sz, NULL, 0))
++ {
++ physmem = 0;
++ }
++ systemRam = physmem;
+ #elif LINUX
+ struct sysinfo info;
+ sysinfo(&info);
+@@ -183,12 +279,22 @@ void setSystemRam()
+ #ifndef XBOX
+ #ifndef LINUX
+ #ifndef SYMBIAN
++#ifndef __DragonFly__
++#ifndef __FreeBSD__
++#ifndef __FreeBSD_kernel__
++#ifndef __NetBSD__
++#ifndef __OpenBSD__
+ stackSize = (int)&_end - (int)&_start + ((int)&_start - elfOffset);
+ #endif
+ #endif
+ #endif
+ #endif
+ #endif
++#endif
++#endif
++#endif
++#endif
++#endif
+ getRamStatus(BYTES);
+ }
+
+@@ -215,6 +321,42 @@ u64 getUsedRam(int byte_size)
+ rval = task_info(task, TASK_BASIC_INFO, tptr, &tcnt);
+ if (!(rval == KERN_SUCCESS)) return 0;
+ return info.resident_size/byte_size;
++#elif defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
++# if defined(__NetBSD__)
++#undef KERN_PROC
++#define KERN_PROC KERN_PROC2
++#define KINFO_PROC struct kinfo_proc2
++# else
++#define KINFO_PROC struct kinfo_proc
++# endif
++# if defined(__DragonFly__)
++#define KP_RSS(kp) (kp.kp_vm_rssize * getpagesize())
++# elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++#define KP_RSS(kp) (kp.ki_rssize * getpagesize())
++# elif defined(__NetBSD__)
++#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize())
++# elif defined(__OpenBSD__)
++#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize())
++# endif
++ int mib[] = {
++ CTL_KERN,
++ KERN_PROC,
++ KERN_PROC_PID,
++ getpid(),
++# if defined(__NetBSD__) || defined(__OpenBSD__)
++ sizeof(KINFO_PROC),
++ 1,
++# endif
++ };
++ u_int miblen = sizeof(mib) / sizeof(mib[0]);
++ KINFO_PROC kp;
++ size_t sz = sizeof(KINFO_PROC);
++ if (sysctl(mib, miblen, &kp, &sz, NULL, 0))
++ {
++ return 0;
++ }
++ return (u64)KP_RSS(kp) / byte_size;
+ #elif LINUX
+ unsigned long vm = 0;
+ FILE *file = fopen("/proc/self/statm", "r");
diff --git a/games/openbor3711/Makefile b/games/openbor3711/Makefile
new file mode 100644
index 000000000000..6dbc51c8a709
--- /dev/null
+++ b/games/openbor3711/Makefile
@@ -0,0 +1,12 @@
+# $FreeBSD$
+
+PORTVERSION= 3711
+PKGNAMESUFFIX= ${PORTVERSION}
+
+MASTERDIR= ${.CURDIR}/../openbor
+PATCHDIR= ${.CURDIR}/../openbor3482/files
+DISTINFO_FILE= ${.CURDIR}/distinfo
+
+GH_TAGNAME= 6ec17fa
+
+.include "${MASTERDIR}/Makefile"
diff --git a/games/openbor3711/distinfo b/games/openbor3711/distinfo
new file mode 100644
index 000000000000..d5fcbc812db3
--- /dev/null
+++ b/games/openbor3711/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1341365279
+SHA256 (DCurrent-openbor-3711-6ec17fa_GH0.tar.gz) = adaebfb09d48c6a3bef6c11fce038cac63070fb47660bf1c63b72ccaeaa20e0c
+SIZE (DCurrent-openbor-3711-6ec17fa_GH0.tar.gz) = 3029909
diff --git a/games/openbor3979/Makefile b/games/openbor3979/Makefile
new file mode 100644
index 000000000000..d6b332322d88
--- /dev/null
+++ b/games/openbor3979/Makefile
@@ -0,0 +1,12 @@
+# $FreeBSD$
+
+PORTVERSION= 3979
+PKGNAMESUFFIX= ${PORTVERSION}
+
+MASTERDIR= ${.CURDIR}/../openbor
+PATCHDIR= ${.CURDIR}/files
+DISTINFO_FILE= ${.CURDIR}/distinfo
+
+GH_TAGNAME= 2bcf25b
+
+.include "${MASTERDIR}/Makefile"
diff --git a/games/openbor3979/distinfo b/games/openbor3979/distinfo
new file mode 100644
index 000000000000..b1883f9ba7e4
--- /dev/null
+++ b/games/openbor3979/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1377224669
+SHA256 (DCurrent-openbor-3979-2bcf25b_GH0.tar.gz) = 089a07e7a2ac921167687f8b21d637f85f1e6fcd56862f3d63be54e333358cc5
+SIZE (DCurrent-openbor-3979-2bcf25b_GH0.tar.gz) = 5683070
diff --git a/games/openbor3979/files/patch-openbor.c b/games/openbor3979/files/patch-openbor.c
new file mode 100644
index 000000000000..de51625b0b02
--- /dev/null
+++ b/games/openbor3979/files/patch-openbor.c
@@ -0,0 +1,34 @@
+Fix potential crashes found by ASan/Clang/GCC
+
+--- openbor.c.orig 2016-12-22 13:02:02 UTC
++++ openbor.c
+@@ -13933,7 +13933,7 @@ void generate_basemap(int map_index, flo
+
+ void load_level(char *filename)
+ {
+- char *buf;
++ char *buf = NULL;
+ size_t size, len, sblen;
+ ptrdiff_t pos, oldpos;
+ char *command;
+@@ -15210,6 +15210,11 @@ void bar(int x, int y, int value, int ma
+ return;
+ }
+
++ if (value < 0)
++ {
++ value = 0;
++ }
++
+ if (value > maxvalue)
+ {
+ value = maxvalue;
+@@ -20471,7 +20476,7 @@ void common_dot()
+ entity *eOpp; //Owner of dot effect.
+ s_collision_attack attack; //Attack struct.
+
+- for(iIndex = 0; iIndex <= MAX_DOTS; iIndex++) //Loop through all DOT indexes.
++ for(iIndex = 0; iIndex < MAX_DOTS; iIndex++) //Loop through all DOT indexes.
+ {
+ iDot_time = self->dot_time[iIndex]; //Get expire time.
+ iDot_cnt = self->dot_cnt[iIndex]; //Get next tick time.
diff --git a/games/openbor3979/files/patch-sdl_menu.c b/games/openbor3979/files/patch-sdl_menu.c
new file mode 100644
index 000000000000..023fb8417e64
--- /dev/null
+++ b/games/openbor3979/files/patch-sdl_menu.c
@@ -0,0 +1,13 @@
+Don't crash with empty Paks/ directory.
+
+--- sdl/menu.c.orig 2015-04-18 21:21:56 UTC
++++ sdl/menu.c
+@@ -747,7 +747,7 @@ void Menu()
+ }
+ freeAllLogs();
+ termMenu();
+- if(ctrl == 2)
++ if(dListTotal == 0 || ctrl == 2)
+ {
+ if (filelist)
+ {
diff --git a/games/openbor3979/files/patch-sdl_sdlport.c b/games/openbor3979/files/patch-sdl_sdlport.c
new file mode 100644
index 000000000000..ca62da11fbed
--- /dev/null
+++ b/games/openbor3979/files/patch-sdl_sdlport.c
@@ -0,0 +1,31 @@
+Store settings under ~/.openbor instead of current directory
+
+--- sdl/sdlport.c.orig 2015-04-18 21:21:56 UTC
++++ sdl/sdlport.c
+@@ -11,6 +11,9 @@
+ #include "ram.h"
+ #include "video.h"
+ #include "menu.h"
++#include <sys/stat.h>
++#include <err.h>
++#include <unistd.h>
+
+ #ifdef DARWIN
+ #include <CoreFoundation/CoreFoundation.h>
+@@ -103,6 +105,16 @@ int main(int argc, char *argv[])
+ #ifdef ANDROID
+ dirExists(rootDir, 1);
+ chdir(rootDir);
++#else
++ if(!getenv("OPENBOR_USE_CURDIR"))
++ {
++ if (chdir(getenv("HOME")) != 0)
++ err(1, "cannot cd to $HOME");
++ if (mkdir(".openbor", 0755) != 0 && errno != EEXIST)
++ err(1, "cannot mkdir $HOME/.openbor");
++ if (chdir(".openbor") != 0)
++ err(1, "cannot cd to $HOME/.openbor");
++ }
+ #endif
+ dirExists(paksDir, 1);
+ dirExists(savesDir, 1);
diff --git a/games/openbor3979/files/patch-source_gamelib_packfile.c b/games/openbor3979/files/patch-source_gamelib_packfile.c
new file mode 100644
index 000000000000..0faad2e22e68
--- /dev/null
+++ b/games/openbor3979/files/patch-source_gamelib_packfile.c
@@ -0,0 +1,13 @@
+Reset seek position for BGM with more than 64 tracks
+
+--- source/gamelib/packfile.c.orig 2015-04-18 21:22:03 UTC
++++ source/gamelib/packfile.c
+@@ -1399,7 +1399,7 @@ void packfile_music_read(fileliststruct
+ getBasePath(packfile, filelist[i].filename, 1);
+ if(stristr(packfile, ".pak"))
+ {
+- memset(filelist[i].bgmTracks, 0, 256);
++ memset(filelist[i].bgmTracks, 0, sizeof(filelist[i].bgmTracks));
+ filelist[i].nTracks = 0;
+ fd = fopen(packfile, "rb");
+ if(fd == NULL)
diff --git a/games/openbor3979/files/patch-source_gamelib_packfile.h b/games/openbor3979/files/patch-source_gamelib_packfile.h
new file mode 100644
index 000000000000..210607cc776c
--- /dev/null
+++ b/games/openbor3979/files/patch-source_gamelib_packfile.h
@@ -0,0 +1,13 @@
+Don't crash with > 80 tracks.
+
+--- source/gamelib/packfile.h.orig 2015-04-18 21:22:03 UTC
++++ source/gamelib/packfile.h
+@@ -42,7 +42,7 @@ typedef struct fileliststruct
+ {
+ char filename[128];
+ int nTracks;
+- char bgmFileName[80][256];
++ char bgmFileName[256][80];
+ int bgmTrack;
+ unsigned int bgmTracks[256];
+ #ifdef SDL
diff --git a/games/openbor3979/files/patch-source_ramlib_ram.c b/games/openbor3979/files/patch-source_ramlib_ram.c
new file mode 100644
index 000000000000..7fadd8587473
--- /dev/null
+++ b/games/openbor3979/files/patch-source_ramlib_ram.c
@@ -0,0 +1,224 @@
+Implement Linux-like memory stats for BSDs
+
+--- source/ramlib/ram.c.orig 2013-12-29 14:05:10 UTC
++++ source/ramlib/ram.c
+@@ -27,6 +27,21 @@
+ #include <mach/task.h>
+ #include <mach/mach.h>
+ #include <mach/mach_init.h>
++#elif defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#include <unistd.h>
++# if defined(__DragonFly__)
++#include <sys/kinfo.h> // struct kinfo_proc
++#include <sys/vmmeter.h> // struct vmstats
++# elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++#include <sys/user.h> // struct kinfo_proc
++# elif defined(__NetBSD__)
++#include <uvm/uvm_extern.h> // struct uvmexp_sysctl
++# elif defined(__OpenBSD__)
++#include <uvm/uvmexp.h> // struct uvmexp
++# endif
+ #elif LINUX
+ #include <sys/sysinfo.h>
+ #include <unistd.h>
+@@ -54,12 +69,22 @@ static u64 systemRam = 0x00000000;
+ #ifndef WIN
+ #ifndef XBOX
+ #ifndef LINUX
++#ifndef __DragonFly__
++#ifndef __FreeBSD__
++#ifndef __FreeBSD_kernel__
++#ifndef __NetBSD__
++#ifndef __OpenBSD__
+ static unsigned long elfOffset = 0x00000000;
+ static unsigned long stackSize = 0x00000000;
+ #endif
+ #endif
+ #endif
+ #endif
++#endif
++#endif
++#endif
++#endif
++#endif
+
+ /////////////////////////////////////////////////////////////////////////////
+ // Symbols
+@@ -68,6 +93,11 @@ static unsigned long stackSize = 0x00000
+ #ifndef WIN
+ #ifndef XBOX
+ #ifndef LINUX
++#ifndef __DragonFly__
++#ifndef __FreeBSD__
++#ifndef __FreeBSD_kernel__
++#ifndef __NetBSD__
++#ifndef __OpenBSD__
+ #if (__GNUC__ > 3)
+ extern unsigned long _end;
+ extern unsigned long _start;
+@@ -81,6 +111,11 @@ extern unsigned long start;
+ #endif
+ #endif
+ #endif
++#endif
++#endif
++#endif
++#endif
++#endif
+
+ /////////////////////////////////////////////////////////////////////////////
+ // Functions
+@@ -107,6 +142,49 @@ u64 getFreeRam(int byte_size)
+ return 0;
+ }
+ return (u64)(((vms.inactive_count + vms.free_count) * size) / byte_size);
++#elif defined(__DragonFly__)
++ struct vmstats vms;
++ size_t sz = sizeof(vms);
++ if (sysctlbyname("vm.vmstats", &vms, &sz, NULL, 0))
++ {
++ return 0;
++ }
++ return (u64)((vms.v_free_count + vms.v_inactive_count
++ + vms.v_cache_count) * getpagesize()) / byte_size;
++#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++ u_int v_free_count, v_inactive_count, v_cache_count;
++ size_t sz = sizeof(u_int);
++ v_free_count = v_inactive_count = v_cache_count = 0;
++ sysctlbyname("vm.stats.vm.v_free_count",
++ &v_free_count, &sz, NULL, 0);
++ sysctlbyname("vm.stats.vm.v_inactive_count",
++ &v_inactive_count, &sz, NULL, 0);
++ sysctlbyname("vm.stats.vm.v_cache_count",
++ &v_cache_count, &sz, NULL, 0);
++ return (u64)((v_free_count + v_inactive_count + v_cache_count)
++ * getpagesize()) / byte_size;
++#elif defined(__NetBSD__) || defined(__OpenBSD__)
++# if defined(__NetBSD__)
++#undef VM_UVMEXP
++#define VM_UVMEXP VM_UVMEXP2
++#define uvmexp uvmexp_sysctl
++# else
++#define filepages vnodepages
++#define execpages vtextpages
++# endif
++ int mib[] = {
++ CTL_VM,
++ VM_UVMEXP,
++ };
++ u_int miblen = sizeof(mib) / sizeof(mib[0]);
++ struct uvmexp uvmexp;
++ size_t sz = sizeof(uvmexp);
++ if (sysctl(mib, miblen, &uvmexp, &sz, NULL, 0))
++ {
++ return 0;
++ }
++ return (u64)((uvmexp.free + uvmexp.inactive + uvmexp.filepages
++ + uvmexp.execpages) * uvmexp.pagesize) / byte_size;
+ #elif LINUX
+ struct sysinfo info;
+ sysinfo(&info);
+@@ -147,11 +225,29 @@ void setSystemRam()
+ stat.dwLength = sizeof(MEMORYSTATUS);
+ GlobalMemoryStatus(&stat);
+ systemRam = stat.dwTotalPhys;
+-#elif DARWIN
+- u64 mem;
+- size_t len = sizeof(mem);
+- sysctlbyname("hw.memsize", &mem, &len, NULL, 0);
+- systemRam = mem;
++#elif defined(DARWIN) || defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
++# if defined(HW_MEMSIZE) || defined(HW_PHYSMEM64)
++ uint64_t physmem;
++# else
++ u_long physmem;
++# endif
++ int mib[] = {
++ CTL_HW,
++# if defined(HW_MEMSIZE)
++ HW_MEMSIZE,
++# elif defined(HW_PHYSMEM64)
++ HW_PHYSMEM64,
++# else
++ HW_PHYSMEM,
++# endif
++ };
++ size_t sz = sizeof(physmem);
++ if (sysctl(mib, 2, &physmem, &sz, NULL, 0))
++ {
++ physmem = 0;
++ }
++ systemRam = physmem;
+ #elif LINUX
+ struct sysinfo info;
+ sysinfo(&info);
+@@ -199,12 +295,22 @@ void setSystemRam()
+ #ifndef XBOX
+ #ifndef LINUX
+ #ifndef SYMBIAN
++#ifndef __DragonFly__
++#ifndef __FreeBSD__
++#ifndef __FreeBSD_kernel__
++#ifndef __NetBSD__
++#ifndef __OpenBSD__
+ stackSize = (int)&_end - (int)&_start + ((int)&_start - elfOffset);
+ #endif
+ #endif
+ #endif
+ #endif
+ #endif
++#endif
++#endif
++#endif
++#endif
++#endif
+ getRamStatus(BYTES);
+ }
+
+@@ -234,6 +340,42 @@ u64 getUsedRam(int byte_size)
+ return 0;
+ }
+ return info.resident_size / byte_size;
++#elif defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
++# if defined(__NetBSD__)
++#undef KERN_PROC
++#define KERN_PROC KERN_PROC2
++#define KINFO_PROC struct kinfo_proc2
++# else
++#define KINFO_PROC struct kinfo_proc
++# endif
++# if defined(__DragonFly__)
++#define KP_RSS(kp) (kp.kp_vm_rssize * getpagesize())
++# elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++#define KP_RSS(kp) (kp.ki_rssize * getpagesize())
++# elif defined(__NetBSD__)
++#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize())
++# elif defined(__OpenBSD__)
++#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize())
++# endif
++ int mib[] = {
++ CTL_KERN,
++ KERN_PROC,
++ KERN_PROC_PID,
++ getpid(),
++# if defined(__NetBSD__) || defined(__OpenBSD__)
++ sizeof(KINFO_PROC),
++ 1,
++# endif
++ };
++ u_int miblen = sizeof(mib) / sizeof(mib[0]);
++ KINFO_PROC kp;
++ size_t sz = sizeof(KINFO_PROC);
++ if (sysctl(mib, miblen, &kp, &sz, NULL, 0))
++ {
++ return 0;
++ }
++ return (u64)KP_RSS(kp) / byte_size;
+ #elif LINUX
+ unsigned long vm = 0;
+ FILE *file = fopen("/proc/self/statm", "r");
diff --git a/games/openbor3979/files/patch-source_scriptlib_Parser.c b/games/openbor3979/files/patch-source_scriptlib_Parser.c
new file mode 100644
index 000000000000..6e0cf39629c0
--- /dev/null
+++ b/games/openbor3979/files/patch-source_scriptlib_Parser.c
@@ -0,0 +1,13 @@
+Make room for terminating NUL added by sprintf()
+
+--- source/scriptlib/Parser.c.orig 2016-12-15 02:16:03 UTC
++++ source/scriptlib/Parser.c
+@@ -1828,7 +1828,7 @@ void Parser_Mult_expr2(Parser *pparser )
+
+ void Parser_Unary_expr(Parser *pparser )
+ {
+- static CHAR buf[MAX_TOKEN_LENGTH + 1];
++ static CHAR buf[MAX_TOKEN_LENGTH + 2];
+ Instruction *pInstruction = NULL;
+
+ if (ParserSet_First(&(pparser->theParserSet), postfix_expr, pparser->theNextToken.theType ))
diff --git a/games/openbor4432/Makefile b/games/openbor4432/Makefile
new file mode 100644
index 000000000000..0f4d9029ae61
--- /dev/null
+++ b/games/openbor4432/Makefile
@@ -0,0 +1,12 @@
+# $FreeBSD$
+
+PORTVERSION= 4432
+PKGNAMESUFFIX= ${PORTVERSION}
+
+MASTERDIR= ${.CURDIR}/../openbor
+PATCHDIR= ${.CURDIR}/files
+DISTINFO_FILE= ${.CURDIR}/distinfo
+
+GH_TAGNAME= ba1eb4f
+
+.include "${MASTERDIR}/Makefile"
diff --git a/games/openbor4432/distinfo b/games/openbor4432/distinfo
new file mode 100644
index 000000000000..c7c141e71833
--- /dev/null
+++ b/games/openbor4432/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1485387608
+SHA256 (DCurrent-openbor-4432-ba1eb4f_GH0.tar.gz) = 0c26130127d1ec1d98c6c5e68b38a11df3e405ed7e43b7c61762f6ae862538c5
+SIZE (DCurrent-openbor-4432-ba1eb4f_GH0.tar.gz) = 6087650
diff --git a/games/openbor4432/files/patch-openbor.c b/games/openbor4432/files/patch-openbor.c
new file mode 100644
index 000000000000..1cab90006f74
--- /dev/null
+++ b/games/openbor4432/files/patch-openbor.c
@@ -0,0 +1,93 @@
+Fix potential crashes found by ASan/Clang/GCC
+Fix an infinite loop in lcmScriptDeleteMain()
+Avoid accidental rounding from abs()
+
+--- openbor.c.orig 2016-12-22 13:02:02 UTC
++++ openbor.c
+@@ -5810,7 +5810,7 @@ s_collision_attack **collision_alloc_att
+ size_t alloc_size;
+
+ // Get amount of memory we'll need.
+- alloc_size = sizeof(*result);
++ alloc_size = max_collisons * sizeof(*result);
+
+ // Allocate memory and get pointer.
+ result = malloc(alloc_size);
+@@ -5859,7 +5859,7 @@ s_collision_body **collision_alloc_body_
+ size_t alloc_size;
+
+ // Get amount of memory we'll need.
+- alloc_size = sizeof(*result);
++ alloc_size = max_collisons * sizeof(*result);
+
+ // Allocate memory and get pointer.
+ result = malloc(alloc_size);
+@@ -8204,7 +8204,8 @@ size_t lcmScriptCopyBuffer(ArgList *argl
+
+ size_t lcmScriptDeleteMain(char **buf)
+ {
+- size_t len = 0, i = 0;
++ size_t len = 0;
++ long i = 0;
+ ptrdiff_t pos = 0;
+ char *newbuf = NULL;
+
+@@ -13933,7 +13933,7 @@ void generate_basemap(int map_index, flo
+
+ void load_level(char *filename)
+ {
+- char *buf;
++ char *buf = NULL;
+ size_t size, len, sblen;
+ ptrdiff_t pos, oldpos;
+ char *command;
+@@ -15210,6 +15210,11 @@ void bar(int x, int y, int value, int ma
+ return;
+ }
+
++ if (value < 0)
++ {
++ value = 0;
++ }
++
+ if (value > maxvalue)
+ {
+ value = maxvalue;
+@@ -20471,7 +20476,7 @@ void common_dot()
+ entity *eOpp; //Owner of dot effect.
+ s_collision_attack attack; //Attack struct.
+
+- for(iIndex = 0; iIndex <= MAX_DOTS; iIndex++) //Loop through all DOT indexes.
++ for(iIndex = 0; iIndex < MAX_DOTS; iIndex++) //Loop through all DOT indexes.
+ {
+ iDot_time = self->dot_time[iIndex]; //Get expire time.
+ iDot_cnt = self->dot_cnt[iIndex]; //Get next tick time.
+@@ -21710,8 +21716,8 @@ int reset_backpain(entity *ent)
+ if (ent->normaldamageflipdir == DIRECTION_RIGHT) ent->direction = DIRECTION_RIGHT;
+ else ent->direction = DIRECTION_LEFT;
+
+- if(ent->direction == DIRECTION_RIGHT) ent->velocity.x = -1*abs(ent->velocity.x);
+- else ent->velocity.x = abs(ent->velocity.x);
++ if(ent->direction == DIRECTION_RIGHT) ent->velocity.x = -1*ABS(ent->velocity.x);
++ else ent->velocity.x = ABS(ent->velocity.x);
+
+ return 1;
+ }
+@@ -25831,7 +25837,7 @@ int common_try_wander(entity *target, in
+ mod = -mod;
+ }
+ //if ((self->sortid / 100) % 2)
+- if (abs(rand32()) % 2)
++ if (rand32() % 2)
+ {
+ mod = 3 - mod;
+ }
+@@ -34607,7 +34612,7 @@ void keyboard_setup(int player)
+ strncpy(buttonnames[SDID_SPECIAL], "Special", 16);
+ strncpy(buttonnames[SDID_START], "Start", 16);
+ strncpy(buttonnames[SDID_SCREENSHOT], "Screenshot", 16);
+- strncpy(buttonnames[SDID_ESC], "Exit", 16);
++ //strncpy(buttonnames[SDID_ESC], "Exit", 16);
+
+ savesettings();
+ bothnewkeys = 0;
diff --git a/games/openbor4432/files/patch-sdl_menu.c b/games/openbor4432/files/patch-sdl_menu.c
new file mode 100644
index 000000000000..023fb8417e64
--- /dev/null
+++ b/games/openbor4432/files/patch-sdl_menu.c
@@ -0,0 +1,13 @@
+Don't crash with empty Paks/ directory.
+
+--- sdl/menu.c.orig 2015-04-18 21:21:56 UTC
++++ sdl/menu.c
+@@ -747,7 +747,7 @@ void Menu()
+ }
+ freeAllLogs();
+ termMenu();
+- if(ctrl == 2)
++ if(dListTotal == 0 || ctrl == 2)
+ {
+ if (filelist)
+ {
diff --git a/games/openbor4432/files/patch-sdl_sdlport.c b/games/openbor4432/files/patch-sdl_sdlport.c
new file mode 100644
index 000000000000..8a143220a1c5
--- /dev/null
+++ b/games/openbor4432/files/patch-sdl_sdlport.c
@@ -0,0 +1,30 @@
+Store settings under ~/.openbor instead of current directory
+
+--- sdl/sdlport.c.orig 2015-04-18 21:21:56 UTC
++++ sdl/sdlport.c
+@@ -11,6 +11,8 @@
+ #include "ram.h"
+ #include "video.h"
+ #include "menu.h"
++#include <sys/stat.h>
++#include <err.h>
+ #include <time.h>
+ #include <unistd.h>
+
+@@ -103,6 +105,16 @@ int main(int argc, char *argv[])
+ #ifdef ANDROID
+ dirExists(rootDir, 1);
+ chdir(rootDir);
++#else
++ if(!getenv("OPENBOR_USE_CURDIR"))
++ {
++ if (chdir(getenv("HOME")) != 0)
++ err(1, "cannot cd to $HOME");
++ if (mkdir(".openbor", 0755) != 0 && errno != EEXIST)
++ err(1, "cannot mkdir $HOME/.openbor");
++ if (chdir(".openbor") != 0)
++ err(1, "cannot cd to $HOME/.openbor");
++ }
+ #endif
+ dirExists(paksDir, 1);
+ dirExists(savesDir, 1);
diff --git a/games/openbor4432/files/patch-source_gamelib_packfile.c b/games/openbor4432/files/patch-source_gamelib_packfile.c
new file mode 100644
index 000000000000..0faad2e22e68
--- /dev/null
+++ b/games/openbor4432/files/patch-source_gamelib_packfile.c
@@ -0,0 +1,13 @@
+Reset seek position for BGM with more than 64 tracks
+
+--- source/gamelib/packfile.c.orig 2015-04-18 21:22:03 UTC
++++ source/gamelib/packfile.c
+@@ -1399,7 +1399,7 @@ void packfile_music_read(fileliststruct
+ getBasePath(packfile, filelist[i].filename, 1);
+ if(stristr(packfile, ".pak"))
+ {
+- memset(filelist[i].bgmTracks, 0, 256);
++ memset(filelist[i].bgmTracks, 0, sizeof(filelist[i].bgmTracks));
+ filelist[i].nTracks = 0;
+ fd = fopen(packfile, "rb");
+ if(fd == NULL)
diff --git a/games/openbor4432/files/patch-source_gamelib_packfile.h b/games/openbor4432/files/patch-source_gamelib_packfile.h
new file mode 100644
index 000000000000..210607cc776c
--- /dev/null
+++ b/games/openbor4432/files/patch-source_gamelib_packfile.h
@@ -0,0 +1,13 @@
+Don't crash with > 80 tracks.
+
+--- source/gamelib/packfile.h.orig 2015-04-18 21:22:03 UTC
++++ source/gamelib/packfile.h
+@@ -42,7 +42,7 @@ typedef struct fileliststruct
+ {
+ char filename[128];
+ int nTracks;
+- char bgmFileName[80][256];
++ char bgmFileName[256][80];
+ int bgmTrack;
+ unsigned int bgmTracks[256];
+ #ifdef SDL
diff --git a/games/openbor4432/files/patch-source_ramlib_ram.c b/games/openbor4432/files/patch-source_ramlib_ram.c
new file mode 100644
index 000000000000..5a32a492ed5c
--- /dev/null
+++ b/games/openbor4432/files/patch-source_ramlib_ram.c
@@ -0,0 +1,190 @@
+Implement Linux-like memory stats for BSDs
+
+--- source/ramlib/ram.c.orig 2015-04-18 21:21:56 UTC
++++ source/ramlib/ram.c
+@@ -25,6 +25,21 @@
+ #include <mach/task.h>
+ #include <mach/mach.h>
+ #include <mach/mach_init.h>
++#elif defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#include <unistd.h>
++# if defined(__DragonFly__)
++#include <sys/kinfo.h> // struct kinfo_proc
++#include <sys/vmmeter.h> // struct vmstats
++# elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++#include <sys/user.h> // struct kinfo_proc
++# elif defined(__NetBSD__)
++#include <uvm/uvm_extern.h> // struct uvmexp_sysctl
++# elif defined(__OpenBSD__)
++#include <uvm/uvmexp.h> // struct uvmexp
++# endif
+ #elif LINUX
+ #include <sys/sysinfo.h>
+ #include <unistd.h>
+@@ -48,7 +63,10 @@
+
+ static u64 systemRam = 0x00000000;
+
+-#if !(defined(WIN) || defined(LINUX) || defined(DARWIN))
++#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || \
++ defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || \
++ defined(__OpenBSD__))
+ static unsigned long elfOffset = 0x00000000;
+ static unsigned long stackSize = 0x00000000;
+ #endif
+@@ -56,7 +74,10 @@ static unsigned long stackSize = 0x00000
+ /////////////////////////////////////////////////////////////////////////////
+ // Symbols
+
+-#if !(defined(WIN) || defined(LINUX) || defined(DARWIN))
++#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || \
++ defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || \
++ defined(__OpenBSD__))
+ #if (__GNUC__ > 3)
+ extern unsigned long _end;
+ extern unsigned long _start;
+@@ -93,6 +114,49 @@ u64 getFreeRam(int byte_size)
+ return 0;
+ }
+ return (u64)(((vms.inactive_count + vms.free_count) * size) / byte_size);
++#elif defined(__DragonFly__)
++ struct vmstats vms;
++ size_t sz = sizeof(vms);
++ if (sysctlbyname("vm.vmstats", &vms, &sz, NULL, 0))
++ {
++ return 0;
++ }
++ return (u64)((vms.v_free_count + vms.v_inactive_count
++ + vms.v_cache_count) * getpagesize()) / byte_size;
++#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++ u_int v_free_count, v_inactive_count, v_cache_count;
++ size_t sz = sizeof(u_int);
++ v_free_count = v_inactive_count = v_cache_count = 0;
++ sysctlbyname("vm.stats.vm.v_free_count",
++ &v_free_count, &sz, NULL, 0);
++ sysctlbyname("vm.stats.vm.v_inactive_count",
++ &v_inactive_count, &sz, NULL, 0);
++ sysctlbyname("vm.stats.vm.v_cache_count",
++ &v_cache_count, &sz, NULL, 0);
++ return (u64)((v_free_count + v_inactive_count + v_cache_count)
++ * getpagesize()) / byte_size;
++#elif defined(__NetBSD__) || defined(__OpenBSD__)
++# if defined(__NetBSD__)
++#undef VM_UVMEXP
++#define VM_UVMEXP VM_UVMEXP2
++#define uvmexp uvmexp_sysctl
++# else
++#define filepages vnodepages
++#define execpages vtextpages
++# endif
++ int mib[] = {
++ CTL_VM,
++ VM_UVMEXP,
++ };
++ u_int miblen = sizeof(mib) / sizeof(mib[0]);
++ struct uvmexp uvmexp;
++ size_t sz = sizeof(uvmexp);
++ if (sysctl(mib, miblen, &uvmexp, &sz, NULL, 0))
++ {
++ return 0;
++ }
++ return (u64)((uvmexp.free + uvmexp.inactive + uvmexp.filepages
++ + uvmexp.execpages) * uvmexp.pagesize) / byte_size;
+ #elif LINUX
+ struct sysinfo info;
+ sysinfo(&info);
+@@ -133,11 +197,29 @@ void setSystemRam()
+ stat.dwLength = sizeof(MEMORYSTATUS);
+ GlobalMemoryStatus(&stat);
+ systemRam = stat.dwTotalPhys;
+-#elif DARWIN
+- u64 mem;
+- size_t len = sizeof(mem);
+- sysctlbyname("hw.memsize", &mem, &len, NULL, 0);
+- systemRam = mem;
++#elif defined(DARWIN) || defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
++# if defined(HW_MEMSIZE) || defined(HW_PHYSMEM64)
++ uint64_t physmem;
++# else
++ u_long physmem;
++# endif
++ int mib[] = {
++ CTL_HW,
++# if defined(HW_MEMSIZE)
++ HW_MEMSIZE,
++# elif defined(HW_PHYSMEM64)
++ HW_PHYSMEM64,
++# else
++ HW_PHYSMEM,
++# endif
++ };
++ size_t sz = sizeof(physmem);
++ if (sysctl(mib, 2, &physmem, &sz, NULL, 0))
++ {
++ physmem = 0;
++ }
++ systemRam = physmem;
+ #elif LINUX
+ struct sysinfo info;
+ sysinfo(&info);
+@@ -180,7 +262,10 @@ void setSystemRam()
+ stackSize = 0x00000000;
+ systemRam = getFreeRam(BYTES);
+ #endif
+-#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || defined(SYMBIAN))
++#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || defined(SYMBIAN) || \
++ defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || \
++ defined(__OpenBSD__))
+ stackSize = (int)&_end - (int)&_start + ((int)&_start - elfOffset);
+ #endif
+ getRamStatus(BYTES);
+@@ -212,6 +297,42 @@ u64 getUsedRam(int byte_size)
+ return 0;
+ }
+ return info.resident_size / byte_size;
++#elif defined(__DragonFly__) || defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
++# if defined(__NetBSD__)
++#undef KERN_PROC
++#define KERN_PROC KERN_PROC2
++#define KINFO_PROC struct kinfo_proc2
++# else
++#define KINFO_PROC struct kinfo_proc
++# endif
++# if defined(__DragonFly__)
++#define KP_RSS(kp) (kp.kp_vm_rssize * getpagesize())
++# elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++#define KP_RSS(kp) (kp.ki_rssize * getpagesize())
++# elif defined(__NetBSD__)
++#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize())
++# elif defined(__OpenBSD__)
++#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize())
++# endif
++ int mib[] = {
++ CTL_KERN,
++ KERN_PROC,
++ KERN_PROC_PID,
++ getpid(),
++# if defined(__NetBSD__) || defined(__OpenBSD__)
++ sizeof(KINFO_PROC),
++ 1,
++# endif
++ };
++ u_int miblen = sizeof(mib) / sizeof(mib[0]);
++ KINFO_PROC kp;
++ size_t sz = sizeof(KINFO_PROC);
++ if (sysctl(mib, miblen, &kp, &sz, NULL, 0))
++ {
++ return 0;
++ }
++ return (u64)KP_RSS(kp) / byte_size;
+ #elif LINUX
+ unsigned long vm = 0;
+ FILE *file = fopen("/proc/self/statm", "r");
diff --git a/games/openbor4432/files/patch-source_scriptlib_Parser.c b/games/openbor4432/files/patch-source_scriptlib_Parser.c
new file mode 100644
index 000000000000..6e0cf39629c0
--- /dev/null
+++ b/games/openbor4432/files/patch-source_scriptlib_Parser.c
@@ -0,0 +1,13 @@
+Make room for terminating NUL added by sprintf()
+
+--- source/scriptlib/Parser.c.orig 2016-12-15 02:16:03 UTC
++++ source/scriptlib/Parser.c
+@@ -1828,7 +1828,7 @@ void Parser_Mult_expr2(Parser *pparser )
+
+ void Parser_Unary_expr(Parser *pparser )
+ {
+- static CHAR buf[MAX_TOKEN_LENGTH + 1];
++ static CHAR buf[MAX_TOKEN_LENGTH + 2];
+ Instruction *pInstruction = NULL;
+
+ if (ParserSet_First(&(pparser->theParserSet), postfix_expr, pparser->theNextToken.theType ))