diff --git a/games-fps/sauerbraten/Manifest b/games-fps/sauerbraten/Manifest new file mode 100644 index 00000000..f2223833 --- /dev/null +++ b/games-fps/sauerbraten/Manifest @@ -0,0 +1,7 @@ +AUX sauerbraten-2013.01.04-QA.patch 2037 SHA256 baddf2bb64ad33df6ad11bbdfaf7d7c918a4f6c26f62bd641d43633051be83c4 SHA512 1725945f0373f03e5ae81b8e9eee4e2a9260d9362ad424e4198bb71af2e69055439268197f784d2acbd9e17ff977e8b1a7f5193d378a036488ff758d0ead4b5a WHIRLPOOL 312c17a2fa83a8fa73cdba080c8d74291f5572098ab05ee29e5238b672ad2e7540949e4f0a78e557ae96c9062e584e313dfb82d8e1b9d5aa72d6a207db0b316f +AUX sauerbraten-2013.01.04-master.patch 9577 SHA256 ccbb0e3cb50a60f94f5f5ed76dc6904634b232aa3077fc55bf71b3ec2a5e2afe SHA512 93932305b543bf4095170fdb4e3b0bd334437b5a2d373257f7f2cc642e493dad76f7a32f414ed1cb33e0f048fb51d0207f92363a0c56ba8537872751570b640e WHIRLPOOL 7131d4f0039a037ab469d558d9ba962cbde52c822616389803d4e50ca9203c59919e741e3d0a0959a92ee3b6b28d2657f5078e8918eae2fde225975dff9e28a8 +AUX sauerbraten-2013.01.04-system-enet.patch 1880 SHA256 3dddd4fca0c0176121b72d180f9046a28a026a68666a228503b1a4cebb44f597 SHA512 b53e7db4e6b7ce012ee292a24cbf6e84e1c6bce01cde1a41985d0b471a68c1d2978f8272bc359a81beb317b5ab2ff88a13a1e73aaeb7f5c643e778ffe9861c7a WHIRLPOOL 38d88521ab507735d744b4f186a495fd25b73cbbd24d8b0b0adaca4219cabf56342e25bc12e55c782e6a86c418bcf54cf3802752a41009ff2dd641dc8b123067 +AUX sauerbraten.conf 605 SHA256 6e0694718370b126034bc569229d91b63cbfbd87f86af0a03d20e08833069811 SHA512 685b7358ad7267b1b19ac00f879a82205f346b32fda8cb460c4f8c50e9f20263c102b0fca62ab437dabe67ebbdd281f130f28f3b8ef2bcf064ae45fbd23cce67 WHIRLPOOL c1f4de209300898333856a027e5587a2b1d5f978b653f8085b47b40f72ef533462e5810d79757675742998206c9db445ca94d904aea3563807d3300b872a47b1 +AUX sauerbraten.init 1950 SHA256 6d7b46186b368ea5edee77f72d9772d5ca42fb8ad14c3e90c0caa7e663666159 SHA512 a4e159aeee9536aac0d47f4a8bf33db1b4dde69f999b1c21d8a0f373969fb38d2130129fb080b97cd98048f3a10f98d30e6d4ea53efb29c3c38ba74b66f47f14 WHIRLPOOL c48c3fcad3b19d1b2791dede723a60a5930e1c4f607d5030dfefe1766a5b951a262ba75d4023ed8c75df968c6bc440cc9bf280bb3271e776c148d69bc7ab47f7 +DIST sauerbraten_2013_01_04_collect_edition_linux.tar.bz2 589939261 SHA256 3ecc27c318125883763130e45805eb7ba3a426234e5766ab0d00522f4a437bd1 SHA512 f89c9e69bb69596829661f551e4b63b2f2af96a01f075cb94a80e2bfae4f8664b7dab8f4850b91499817240e0311b64b049ea985c761ff7bb6d39ed75e6198cd WHIRLPOOL d10e354942180064ab44a2f8c8b13819240fde3537825908768d1ddda24f600971641b8a9cee4abee9539ec912bf265cb1771c001ad81a33e287c99e0f6906b8 +EBUILD sauerbraten-2013.01.04.ebuild 3383 SHA256 a7bbe159758e00cf4fcbb9bee74defd880206939c7ed5e1d9d7559a1a590308c SHA512 5514385469e5cad568fd553062e03f91a77b7be5fdc3d4703c10961aa43c6b1bda6f592be23562a8986b496357229b90d0b7b2c829b5bc719b997539821632d1 WHIRLPOOL c2e59c6ade5426a72d421065270ac6fdc80a265cd985c0036a20379bccaabd7fe5d64f0414e10c7ccb6de10c9bac0cba540b2a22485256c42b969b1f7db14246 diff --git a/games-fps/sauerbraten/files/sauerbraten-2013.01.04-QA.patch b/games-fps/sauerbraten/files/sauerbraten-2013.01.04-QA.patch new file mode 100644 index 00000000..21f1b13c --- /dev/null +++ b/games-fps/sauerbraten/files/sauerbraten-2013.01.04-QA.patch @@ -0,0 +1,50 @@ +applied on top of sauerbraten-2013.01.04-system-enet.patch + +respect LDFLAGS, CXXFLAGS and CPPFLAGS +--- sauerbraten/src/Makefile ++++ sauerbraten/src/Makefile +@@ -1,4 +1,4 @@ +-CXXFLAGS= -O3 -fomit-frame-pointer ++CXXFLAGS ?= -O3 -fomit-frame-pointer + override CXXFLAGS+= -Wall -fsigned-char -fno-exceptions -fno-rtti + + PLATFORM= $(shell uname -s) +@@ -139,11 +139,11 @@ + -$(RM) $(CLIENT_PCH) $(CLIENT_OBJS) $(SERVER_OBJS) $(MASTER_OBJS) sauer_client sauer_server sauer_master + + %.h.gch: %.h +- $(CXX) $(CXXFLAGS) -o $(subst .h.gch,.tmp.h.gch,$@) $(subst .h.gch,.h,$@) ++ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(subst .h.gch,.tmp.h.gch,$@) $(subst .h.gch,.h,$@) + $(MV) $(subst .h.gch,.tmp.h.gch,$@) $@ + + %-standalone.o: %.cpp +- $(CXX) $(CXXFLAGS) -c -o $@ $(subst -standalone.o,.cpp,$@) ++ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(subst -standalone.o,.cpp,$@) + + $(CLIENT_OBJS): CXXFLAGS += $(CLIENT_INCLUDES) + $(filter shared/%,$(CLIENT_OBJS)): $(filter shared/%,$(CLIENT_PCH)) +@@ -168,19 +168,19 @@ + install: all + else + client: $(CLIENT_OBJS) +- $(CXX) $(CXXFLAGS) -o sauer_client $(CLIENT_OBJS) $(CLIENT_LIBS) ++ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o sauer_client $(CLIENT_OBJS) $(CLIENT_LIBS) + + server: $(SERVER_OBJS) +- $(CXX) $(CXXFLAGS) -o sauer_server $(SERVER_OBJS) $(SERVER_LIBS) ++ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o sauer_server $(SERVER_OBJS) $(SERVER_LIBS) + + master: $(MASTER_OBJS) +- $(CXX) $(CXXFLAGS) -o sauer_master $(MASTER_OBJS) $(MASTER_LIBS) ++ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o sauer_master $(MASTER_OBJS) $(MASTER_LIBS) + + shared/cube2font.o: shared/cube2font.c +- $(CXX) $(CXXFLAGS) -c -o $@ $< `freetype-config --cflags` ++ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< `freetype-config --cflags` + + cube2font: shared/cube2font.o +- $(CXX) $(CXXFLAGS) -o cube2font shared/cube2font.o `freetype-config --libs` -lz ++ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o cube2font shared/cube2font.o `freetype-config --libs` -lz + + install: all + cp sauer_client ../bin_unix/$(PLATFORM_PREFIX)_client diff --git a/games-fps/sauerbraten/files/sauerbraten-2013.01.04-master.patch b/games-fps/sauerbraten/files/sauerbraten-2013.01.04-master.patch new file mode 100644 index 00000000..730a69a2 --- /dev/null +++ b/games-fps/sauerbraten/files/sauerbraten-2013.01.04-master.patch @@ -0,0 +1,323 @@ +http://sourceforge.net/p/sauerbraten/code/4699/ + +--- a/src/shared/iengine.h ++++ b/src/shared/iengine.h +@@ -415,23 +415,6 @@ + extern int getservermtu(); + extern int getnumclients(); + extern uint getclientip(int n); +-extern void putint(ucharbuf &p, int n); +-extern void putint(packetbuf &p, int n); +-extern void putint(vector &p, int n); +-extern int getint(ucharbuf &p); +-extern void putuint(ucharbuf &p, int n); +-extern void putuint(packetbuf &p, int n); +-extern void putuint(vector &p, int n); +-extern int getuint(ucharbuf &p); +-extern void putfloat(ucharbuf &p, float f); +-extern void putfloat(packetbuf &p, float f); +-extern void putfloat(vector &p, float f); +-extern float getfloat(ucharbuf &p); +-extern void sendstring(const char *t, ucharbuf &p); +-extern void sendstring(const char *t, packetbuf &p); +-extern void sendstring(const char *t, vector &p); +-extern void getstring(char *t, ucharbuf &p, int len = MAXTRANS); +-extern void filtertext(char *dst, const char *src, bool whitespace = true, int len = sizeof(string)-1); + extern void localconnect(); + extern const char *disconnectreason(int reason); + extern void disconnect_client(int n, int reason); +--- a/src/engine/server.cpp ++++ b/src/engine/server.cpp +@@ -99,125 +99,6 @@ + va_end(args); + } + #endif +- +-// all network traffic is in 32bit ints, which are then compressed using the following simple scheme (assumes that most values are small). +- +-template +-static inline void putint_(T &p, int n) +-{ +- if(n<128 && n>-127) p.put(n); +- else if(n<0x8000 && n>=-0x8000) { p.put(0x80); p.put(n); p.put(n>>8); } +- else { p.put(0x81); p.put(n); p.put(n>>8); p.put(n>>16); p.put(n>>24); } +-} +-void putint(ucharbuf &p, int n) { putint_(p, n); } +-void putint(packetbuf &p, int n) { putint_(p, n); } +-void putint(vector &p, int n) { putint_(p, n); } +- +-int getint(ucharbuf &p) +-{ +- int c = (char)p.get(); +- if(c==-128) { int n = p.get(); n |= char(p.get())<<8; return n; } +- else if(c==-127) { int n = p.get(); n |= p.get()<<8; n |= p.get()<<16; return n|(p.get()<<24); } +- else return c; +-} +- +-// much smaller encoding for unsigned integers up to 28 bits, but can handle signed +-template +-static inline void putuint_(T &p, int n) +-{ +- if(n < 0 || n >= (1<<21)) +- { +- p.put(0x80 | (n & 0x7F)); +- p.put(0x80 | ((n >> 7) & 0x7F)); +- p.put(0x80 | ((n >> 14) & 0x7F)); +- p.put(n >> 21); +- } +- else if(n < (1<<7)) p.put(n); +- else if(n < (1<<14)) +- { +- p.put(0x80 | (n & 0x7F)); +- p.put(n >> 7); +- } +- else +- { +- p.put(0x80 | (n & 0x7F)); +- p.put(0x80 | ((n >> 7) & 0x7F)); +- p.put(n >> 14); +- } +-} +-void putuint(ucharbuf &p, int n) { putuint_(p, n); } +-void putuint(packetbuf &p, int n) { putuint_(p, n); } +-void putuint(vector &p, int n) { putuint_(p, n); } +- +-int getuint(ucharbuf &p) +-{ +- int n = p.get(); +- if(n & 0x80) +- { +- n += (p.get() << 7) - 0x80; +- if(n & (1<<14)) n += (p.get() << 14) - (1<<14); +- if(n & (1<<21)) n += (p.get() << 21) - (1<<21); +- if(n & (1<<28)) n |= -1<<28; +- } +- return n; +-} +- +-template +-static inline void putfloat_(T &p, float f) +-{ +- lilswap(&f, 1); +- p.put((uchar *)&f, sizeof(float)); +-} +-void putfloat(ucharbuf &p, float f) { putfloat_(p, f); } +-void putfloat(packetbuf &p, float f) { putfloat_(p, f); } +-void putfloat(vector &p, float f) { putfloat_(p, f); } +- +-float getfloat(ucharbuf &p) +-{ +- float f; +- p.get((uchar *)&f, sizeof(float)); +- return lilswap(f); +-} +- +-template +-static inline void sendstring_(const char *t, T &p) +-{ +- while(*t) putint(p, *t++); +- putint(p, 0); +-} +-void sendstring(const char *t, ucharbuf &p) { sendstring_(t, p); } +-void sendstring(const char *t, packetbuf &p) { sendstring_(t, p); } +-void sendstring(const char *t, vector &p) { sendstring_(t, p); } +- +-void getstring(char *text, ucharbuf &p, int len) +-{ +- char *t = text; +- do +- { +- if(t>=&text[len]) { text[len-1] = 0; return; } +- if(!p.remaining()) { *t = 0; return; } +- *t = getint(p); +- } +- while(*t++); +-} +- +-void filtertext(char *dst, const char *src, bool whitespace, int len) +-{ +- for(int c = uchar(*src); c; c = uchar(*++src)) +- { +- if(c == '\f') +- { +- if(!*++src) break; +- continue; +- } +- if(iscubeprint(c) || (iscubespace(c) && whitespace)) +- { +- *dst++ = c; +- if(!--len) break; +- } +- } +- *dst = '\0'; +-} + + enum { ST_EMPTY, ST_LOCAL, ST_TCPIP }; + +--- a/src/shared/tools.h ++++ b/src/shared/tools.h +@@ -1178,5 +1178,24 @@ + extern uint randomMT(); + extern int guessnumcpus(); + +-#endif +- ++extern void putint(ucharbuf &p, int n); ++extern void putint(packetbuf &p, int n); ++extern void putint(vector &p, int n); ++extern int getint(ucharbuf &p); ++extern void putuint(ucharbuf &p, int n); ++extern void putuint(packetbuf &p, int n); ++extern void putuint(vector &p, int n); ++extern int getuint(ucharbuf &p); ++extern void putfloat(ucharbuf &p, float f); ++extern void putfloat(packetbuf &p, float f); ++extern void putfloat(vector &p, float f); ++extern float getfloat(ucharbuf &p); ++extern void sendstring(const char *t, ucharbuf &p); ++extern void sendstring(const char *t, packetbuf &p); ++extern void sendstring(const char *t, vector &p); ++extern void getstring(char *t, ucharbuf &p, int len); ++template static inline void getstring(T (&t)[N], ucharbuf &p) { getstring(t, p, N); } ++extern void filtertext(char *dst, const char *src, bool whitespace = true, int len = sizeof(string)-1); ++ ++#endif ++ +--- a/src/engine/master.cpp ++++ b/src/engine/master.cpp +@@ -514,7 +514,7 @@ + authreq &a = c.authreqs.add(); + a.reqtime = servtime; + a.id = id; +- uint seed[3] = { starttime, servtime, randomMT() }; ++ uint seed[3] = { uint(starttime), servtime, randomMT() }; + static vector buf; + buf.setsize(0); + a.answer = genchallenge(u->pubkey, seed, sizeof(seed), buf); +--- a/src/shared/tools.cpp ++++ b/src/shared/tools.cpp +@@ -53,3 +53,124 @@ + return y; + } + ++///////////////////////// network /////////////////////// ++ ++// all network traffic is in 32bit ints, which are then compressed using the following simple scheme (assumes that most values are small). ++ ++template ++static inline void putint_(T &p, int n) ++{ ++ if(n<128 && n>-127) p.put(n); ++ else if(n<0x8000 && n>=-0x8000) { p.put(0x80); p.put(n); p.put(n>>8); } ++ else { p.put(0x81); p.put(n); p.put(n>>8); p.put(n>>16); p.put(n>>24); } ++} ++void putint(ucharbuf &p, int n) { putint_(p, n); } ++void putint(packetbuf &p, int n) { putint_(p, n); } ++void putint(vector &p, int n) { putint_(p, n); } ++ ++int getint(ucharbuf &p) ++{ ++ int c = (char)p.get(); ++ if(c==-128) { int n = p.get(); n |= char(p.get())<<8; return n; } ++ else if(c==-127) { int n = p.get(); n |= p.get()<<8; n |= p.get()<<16; return n|(p.get()<<24); } ++ else return c; ++} ++ ++// much smaller encoding for unsigned integers up to 28 bits, but can handle signed ++template ++static inline void putuint_(T &p, int n) ++{ ++ if(n < 0 || n >= (1<<21)) ++ { ++ p.put(0x80 | (n & 0x7F)); ++ p.put(0x80 | ((n >> 7) & 0x7F)); ++ p.put(0x80 | ((n >> 14) & 0x7F)); ++ p.put(n >> 21); ++ } ++ else if(n < (1<<7)) p.put(n); ++ else if(n < (1<<14)) ++ { ++ p.put(0x80 | (n & 0x7F)); ++ p.put(n >> 7); ++ } ++ else ++ { ++ p.put(0x80 | (n & 0x7F)); ++ p.put(0x80 | ((n >> 7) & 0x7F)); ++ p.put(n >> 14); ++ } ++} ++void putuint(ucharbuf &p, int n) { putuint_(p, n); } ++void putuint(packetbuf &p, int n) { putuint_(p, n); } ++void putuint(vector &p, int n) { putuint_(p, n); } ++ ++int getuint(ucharbuf &p) ++{ ++ int n = p.get(); ++ if(n & 0x80) ++ { ++ n += (p.get() << 7) - 0x80; ++ if(n & (1<<14)) n += (p.get() << 14) - (1<<14); ++ if(n & (1<<21)) n += (p.get() << 21) - (1<<21); ++ if(n & (1<<28)) n |= -1<<28; ++ } ++ return n; ++} ++ ++template ++static inline void putfloat_(T &p, float f) ++{ ++ lilswap(&f, 1); ++ p.put((uchar *)&f, sizeof(float)); ++} ++void putfloat(ucharbuf &p, float f) { putfloat_(p, f); } ++void putfloat(packetbuf &p, float f) { putfloat_(p, f); } ++void putfloat(vector &p, float f) { putfloat_(p, f); } ++ ++float getfloat(ucharbuf &p) ++{ ++ float f; ++ p.get((uchar *)&f, sizeof(float)); ++ return lilswap(f); ++} ++ ++template ++static inline void sendstring_(const char *t, T &p) ++{ ++ while(*t) putint(p, *t++); ++ putint(p, 0); ++} ++void sendstring(const char *t, ucharbuf &p) { sendstring_(t, p); } ++void sendstring(const char *t, packetbuf &p) { sendstring_(t, p); } ++void sendstring(const char *t, vector &p) { sendstring_(t, p); } ++ ++void getstring(char *text, ucharbuf &p, int len) ++{ ++ char *t = text; ++ do ++ { ++ if(t>=&text[len]) { text[len-1] = 0; return; } ++ if(!p.remaining()) { *t = 0; return; } ++ *t = getint(p); ++ } ++ while(*t++); ++} ++ ++void filtertext(char *dst, const char *src, bool whitespace, int len) ++{ ++ for(int c = uchar(*src); c; c = uchar(*++src)) ++ { ++ if(c == '\f') ++ { ++ if(!*++src) break; ++ continue; ++ } ++ if(iscubeprint(c) || (iscubespace(c) && whitespace)) ++ { ++ *dst++ = c; ++ if(!--len) break; ++ } ++ } ++ *dst = '\0'; ++} ++ diff --git a/games-fps/sauerbraten/files/sauerbraten-2013.01.04-system-enet.patch b/games-fps/sauerbraten/files/sauerbraten-2013.01.04-system-enet.patch new file mode 100644 index 00000000..e87b280b --- /dev/null +++ b/games-fps/sauerbraten/files/sauerbraten-2013.01.04-system-enet.patch @@ -0,0 +1,64 @@ +--- sauerbraten/src/Makefile ++++ sauerbraten/src/Makefile +@@ -4,7 +4,7 @@ + PLATFORM= $(shell uname -s) + PLATFORM_PREFIX= native + +-INCLUDES= -Ishared -Iengine -Ifpsgame -Ienet/include ++INCLUDES= -Ishared -Iengine -Ifpsgame + + STRIP= + ifeq (,$(findstring -g,$(CXXFLAGS))) +@@ -36,8 +36,8 @@ + endif + CLIENT_LIBS= -mwindows $(STD_LIBS) -L$(WINBIN) -L$(WINLIB) -lSDL -lSDL_image -lSDL_mixer -lzlib1 -lopengl32 -lenet -lws2_32 -lwinmm + else +-CLIENT_INCLUDES= $(INCLUDES) -I/usr/X11R6/include `sdl-config --cflags` +-CLIENT_LIBS= -Lenet/.libs -lenet -L/usr/X11R6/lib -lX11 `sdl-config --libs` -lSDL_image -lSDL_mixer -lz -lGL ++CLIENT_INCLUDES= $(INCLUDES) `sdl-config --cflags` ++CLIENT_LIBS= -lenet -lX11 `sdl-config --libs` -lSDL_image -lSDL_mixer -lz -lGL + endif + ifeq ($(PLATFORM),Linux) + CLIENT_LIBS+= -lrt +@@ -106,7 +106,7 @@ + MASTER_LIBS= $(STD_LIBS) -L$(WINBIN) -L$(WINLIB) -lzlib1 -lenet -lws2_32 -lwinmm + else + SERVER_INCLUDES= -DSTANDALONE $(INCLUDES) +-SERVER_LIBS= -Lenet/.libs -lenet -lz ++SERVER_LIBS= -lenet -lz + MASTER_LIBS= $(SERVER_LIBS) + endif + SERVER_OBJS= \ +@@ -135,15 +135,6 @@ + + all: client server + +-enet/Makefile: +- cd enet; ./configure --enable-shared=no --enable-static=yes +- +-libenet: enet/Makefile +- $(MAKE) -C enet/ all +- +-clean-enet: enet/Makefile +- $(MAKE) -C enet/ clean +- + clean: + -$(RM) $(CLIENT_PCH) $(CLIENT_OBJS) $(SERVER_OBJS) $(MASTER_OBJS) sauer_client sauer_server sauer_master + +@@ -176,13 +167,13 @@ + + install: all + else +-client: libenet $(CLIENT_OBJS) ++client: $(CLIENT_OBJS) + $(CXX) $(CXXFLAGS) -o sauer_client $(CLIENT_OBJS) $(CLIENT_LIBS) + +-server: libenet $(SERVER_OBJS) ++server: $(SERVER_OBJS) + $(CXX) $(CXXFLAGS) -o sauer_server $(SERVER_OBJS) $(SERVER_LIBS) + +-master: libenet $(MASTER_OBJS) ++master: $(MASTER_OBJS) + $(CXX) $(CXXFLAGS) -o sauer_master $(MASTER_OBJS) $(MASTER_LIBS) + + shared/cube2font.o: shared/cube2font.c diff --git a/games-fps/sauerbraten/files/sauerbraten.conf b/games-fps/sauerbraten/files/sauerbraten.conf new file mode 100644 index 00000000..8d93bf62 --- /dev/null +++ b/games-fps/sauerbraten/files/sauerbraten.conf @@ -0,0 +1,28 @@ +# Config file for /etc/init.d/sauerbraten + +# Owner of Sauerbraten server processes (must be existing) +USER="%GAMES_USER_DED%" +GROUP="%GAMES_GROUP%" + + +# Whether to run the dedicated server +RUNSERVER="Yes" + +# Location of the dedicated server config directory +SERVERCONFIG="%SYSCONFDIR%" + +# Additional command line arguments to the dedicated server +SERVERARGS="" + + +# Whether to run the master server +RUNMASTER="No" + +# Location of the master server config directory +MASTERCONFIG="%SYSCONFDIR%" + +# What port should the masterserver use +MASTERPORT="28787" + +# What ip should the masterserver bind to +MASTERIP="" diff --git a/games-fps/sauerbraten/files/sauerbraten.init b/games-fps/sauerbraten/files/sauerbraten.init new file mode 100644 index 00000000..95ca105d --- /dev/null +++ b/games-fps/sauerbraten/files/sauerbraten.init @@ -0,0 +1,74 @@ +#!/sbin/runscript + +depend() { + use net +} + +start() { + [ $(echo ${RUNMASTER} | tr '[:upper:]' '[:lower:]') = "yes" ] && start_master + [ $(echo ${RUNSERVER} | tr '[:upper:]' '[:lower:]') = "yes" ] && start_server + true +} + +start_server() { + ebegin "Starting Sauerbraten dedicated server" + + # Make sure necessary parameters are set + SERVERCONFIG="${SERVERCONFIG:-%SYSCONFDIR%}" + + if [ ! -d ${SERVERCONFIG} ]; then + einfo "No ${SERVERCONFIG} around. Creating new..." + mkdir ${SERVERCONFIG} + chown ${USER}:${GROUP} ${SERVERCONFIG} + fi + + start-stop-daemon \ + --quiet --start --user ${USER}:${GROUP} --chdir ${SERVERCONFIG} \ + --make-pidfile --pidfile %GAMES_STATEDIR%/run/sauerbraten/server.pid \ + --background --exec %LIBEXECDIR%/sauer_server -- ${SERVERARGS} + eend $? +} + +start_master() { + ebegin "Starting Sauerbraten master server" + + # Make sure necessary parameters are set + MASTERCONFIG="${MASTERCONFIG:-%SYSCONFDIR%}" + [ -n "${MASTERIP}" ] && MASTERPORT="${MASTERPORT:-28787}" + MASTERARGS="${MASTERCONFIG}/ ${MASTERPORT} ${MASTERIP}" + + if [ ! -d ${MASTERCONFIG} ]; then + einfo "No ${MASTERCONFIG} around. Creating new..." + mkdir ${MASTERCONFIG} + chown ${USER}:${GROUP} ${MASTERCONFIG} + fi + + start-stop-daemon \ + --quiet --start --user ${USER}:${GROUP} \ + --make-pidfile --pidfile %GAMES_STATEDIR%/run/sauerbraten/master.pid \ + --background --exec %LIBEXECDIR%/sauer_master -- ${MASTERARGS} + eend $? +} + +stop() { + [ $(echo ${RUNSERVER} | tr '[:upper:]' '[:lower:]') = "yes" ] && stop_server + [ $(echo ${RUNMASTER} | tr '[:upper:]' '[:lower:]') = "yes" ] && stop_master + true +} + +stop_server() { + ebegin "Stopping Sauerbraten dedicated server" + start-stop-daemon --stop --retry 3 --pidfile %GAMES_STATEDIR%/run/sauerbraten/server.pid + eend $? +} + +stop_master() { + ebegin "Stopping Sauerbraten master server" + start-stop-daemon --stop --retry 3 --pidfile %GAMES_STATEDIR%/run/sauerbraten/master.pid + eend $? +} + +restart() { + svc_stop + svc_start +} diff --git a/games-fps/sauerbraten/sauerbraten-2013.01.04.ebuild b/games-fps/sauerbraten/sauerbraten-2013.01.04.ebuild new file mode 100644 index 00000000..1d8d6e43 --- /dev/null +++ b/games-fps/sauerbraten/sauerbraten-2013.01.04.ebuild @@ -0,0 +1,127 @@ +# Copyright 1999-2013 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/games-fps/sauerbraten/sauerbraten-2013.01.04.ebuild,v 1.1 2013/01/05 18:23:48 hasufell Exp $ + +EAPI=5 +inherit eutils flag-o-matic gnome2-utils games + +EDITION="collect_edition" +DESCRIPTION="Cube 2: Sauerbraten is an open source game engine (Cube 2) with freeware game data (Sauerbraten)" +HOMEPAGE="http://sauerbraten.org/" +SRC_URI="mirror://sourceforge/sauerbraten/sauerbraten/2013_01_04/sauerbraten_${PV//./_}_${EDITION}_linux.tar.bz2" + +LICENSE="ZLIB freedist" +SLOT="0" +KEYWORDS="~amd64 ~x86" +IUSE="debug dedicated server" + +RDEPEND=" + sys-libs/zlib + >=net-libs/enet-1.3.6:1.3 + !dedicated? ( + media-libs/libsdl[X,opengl] + media-libs/sdl-mixer[vorbis] + media-libs/sdl-image[png,jpeg] + virtual/opengl + virtual/glu + x11-libs/libX11 )" +DEPEND="${RDEPEND}" + +S=${WORKDIR}/${PN} + +src_prepare() { + ecvs_clean + rm -rf sauerbraten_unix bin_unix src/{include,lib,vcpp} + + # Patch makefile to use system enet instead of bundled + # respect CXXFLAGS, LDFLAGS + epatch "${FILESDIR}"/${P}-{system-enet,QA,master}.patch + + # Fix links so they point to the correct directory + sed -i \ + -e 's:docs/::' \ + README.html \ + || die +} + +src_compile() { + use debug && append-cppflags -D_DEBUG + emake -C src master $(usex dedicated "server" "$(usex server "server client" "client")") +} + +src_install() { + local LIBEXECDIR="${GAMES_PREFIX}/lib" + local DATADIR="${GAMES_DATADIR}/${PN}" + local STATEDIR="${GAMES_STATEDIR}/${PN}" + + if ! use dedicated ; then + # Install the game data + insinto "${DATADIR}" + doins -r data packages + + # Install the client executable + exeinto "${LIBEXECDIR}" + doexe src/sauer_client + + # Install the client wrapper + games_make_wrapper "${PN}-client" "${LIBEXECDIR}/sauer_client -q\$HOME/.${PN} -r" "${DATADIR}" + + # Create menu entry + newicon -s 256 data/cube.png ${PN}.png + make_desktop_entry "${PN}-client" "Cube 2: Sauerbraten" + fi + + # Install the server config files + insinto "${STATEDIR}" + doins "server-init.cfg" + + # Install the server executables + exeinto "${LIBEXECDIR}" + doexe src/sauer_master + use dedicated || use server && doexe src/sauer_server + + games_make_wrapper "${PN}-server" \ + "${LIBEXECDIR}/sauer_server -k${DATADIR} -q${STATEDIR}" + games_make_wrapper "${PN}-master" \ + "${LIBEXECDIR}/sauer_master ${STATEDIR}" + + # Install the server init script + keepdir "${GAMES_STATEDIR}/run/${PN}" + cp "${FILESDIR}"/${PN}.init "${T}" || die + sed -i \ + -e "s:%SYSCONFDIR%:${STATEDIR}:g" \ + -e "s:%LIBEXECDIR%:${LIBEXECDIR}:g" \ + -e "s:%GAMES_STATEDIR%:${GAMES_STATEDIR}:g" \ + "${T}"/${PN}.init || die + newinitd "${T}"/${PN}.init ${PN} + cp "${FILESDIR}"/${PN}.conf "${T}" || die + sed -i \ + -e "s:%SYSCONFDIR%:${STATEDIR}:g" \ + -e "s:%LIBEXECDIR%:${LIBEXECDIR}:g" \ + -e "s:%GAMES_USER_DED%:${GAMES_USER_DED}:g" \ + -e "s:%GAMES_GROUP%:${GAMES_GROUP}:g" \ + "${T}"/${PN}.conf || die + newconfd "${T}"/${PN}.conf ${PN} + + nonfatal dodoc src/*.txt docs/dev/*.txt + nonfatal dohtml -r README.html docs/* + + prepgamesdirs +} + +pkg_preinst() { + games_pkg_preinst + gnome2_icon_savelist +} + +pkg_postinst() { + games_pkg_postinst + gnome2_icon_cache_update + + elog "If you plan to use map editor feature copy all map data from ${DATADIR}" + elog "to corresponding folder in your HOME/.${PN}" +} + +pkg_postrm() { + gnome2_icon_cache_update +}