# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5
inherit eutils check-reqs gnome2-utils flag-o-matic games

# BASE_DATA_PV=1.0
# BASE_DATA_P=${PN}_${BASE_DATA_PV}_unified
DATA_PV=1.51
UPDATE_P=${PN}_${DATA_PV}_update
ENGINE_PV=1.51
ENGINE_P=${PN}_${ENGINE_PV}_sdk

DESCRIPTION="Multiplayer FPS based on the QFusion engine (evolved from Quake 2)"
HOMEPAGE="http://www.warsow.net/"
SRC_URI="http://www.warsow.eu/${ENGINE_P}.tar.gz
	http://www.warsow.eu/warsow_${DATA_PV}_unified.tar.gz
	mirror://gentoo/warsow.png
	mirror://gentoo/${P}-build.patch.gz"

# ZLIB: bundled angelscript
LICENSE="GPL-2 ZLIB warsow"
SLOT="0"
KEYWORDS="amd64 x86"
IUSE="debug dedicated irc openal server"

RDEPEND=">=dev-libs/libRocket-1.2.1_p20130110
	<dev-libs/libRocket-1.3.0.0
	media-libs/freetype
	net-misc/curl
	sys-libs/zlib
	!dedicated? (
		media-libs/libpng:0
		media-libs/libsdl
		media-libs/libtheora
		media-libs/libvorbis
		x11-libs/libX11
		x11-libs/libXi
		x11-libs/libXinerama
		x11-libs/libXrandr
		x11-libs/libXxf86dga
		x11-libs/libXxf86vm
		virtual/jpeg:0
		virtual/opengl
		openal? ( media-libs/openal )
	)"
DEPEND="${RDEPEND}
	app-arch/unzip
	x11-misc/makedepend
	!dedicated? (
		x11-proto/xineramaproto
		x11-proto/xf86dgaproto
		x11-proto/xf86vidmodeproto
	)
	openal? ( virtual/pkgconfig )"

S=${WORKDIR}/source/source

CHECKREQS_DISK_BUILD="1G"
CHECKREQS_DISK_USR="500M"

src_prepare() {
	if [[ $(tc-getCC) =~ clang ]]; then
		einfo "disabling -ffast-math due to clang bug"
		einfo "http://llvm.org/bugs/show_bug.cgi?id=13745"
		append-cflags -fno-fast-math
		append-cxxflags -fno-fast-math
	fi

	sed -i \
		-e "/fs_basepath =/ s:\.:${GAMES_DATADIR}/${PN}:" \
		qcommon/files.c \
		|| die "sed files.c failed"

	# edos2unix breaks whitespace files
	einfo "removing dos line breaks"
	find . -type f -exec sed -i 's/\r$//' '{}' + || die

	cd "${S}"/.. || die
	epatch "${WORKDIR}"/${P}-build.patch \
		"${FILESDIR}"/${P}-pic.patch \
		"${FILESDIR}"/${P}-openal.patch
	epatch_user
}

src_compile() {
	emake -C ../libsrcs/angelscript/sdk/angelscript/projects/gnuc

	local arch
	if use amd64 ; then
		arch=x86_64
	elif use x86 ; then
		arch=i386
	fi

	local myconf
	if use dedicated ; then
		myconf=(
			BUILD_CLIENT=NO
			BUILD_IRC=NO
			BUILD_SND_OPENAL=NO
			BUILD_SND_QF=NO
			BUILD_CIN=NO
			BUILD_SERVER=YES
			BUILD_TV_SERVER=YES
			BUILD_REF_GL=NO
		)
	else
		myconf=(
			BUILD_CLIENT=YES
			BUILD_IRC=$(usex irc YES NO)
			BUILD_SND_OPENAL=$(usex openal YES NO)
			BUILD_SND_QF=YES
			BUILD_CIN=YES
			BUILD_SERVER=$(usex server YES NO)
			BUILD_TV_SERVER=$(usex server YES NO)
			BUILD_REF_GL=YES
		)
	fi

	emake \
		V=YES \
		SYSTEM_LIBS=YES \
		BASE_ARCH=${arch} \
		BINDIR=lib \
		BUILD_ANGELWRAP=YES \
		DEBUG_BUILD=$(usex debug YES NO) \
		${myconf[@]}
}

src_install() {
	cd lib

	if ! use dedicated ; then
		newgamesbin ${PN}.* ${PN}
		doicon -s 48 "${DISTDIR}"/${PN}.png
		make_desktop_entry ${PN} Warsow
	fi

	if use dedicated || use server ; then
		newgamesbin wsw_server.* ${PN}-ded
		newgamesbin wswtv_server.* ${PN}-tv
	fi

	exeinto "$(games_get_libdir)"/${PN}
	doexe */*.so

	insinto "${GAMES_DATADIR}"/${PN}
	doins -r "${WORKDIR}"/${PN}_15/basewsw

	local so
	for so in basewsw/*.so ; do
		dosym "$(games_get_libdir)"/${PN}/${so##*/} \
			"${GAMES_DATADIR}"/${PN}/${so}
	done

	if [[ -e libs ]] ; then
		dodir "${GAMES_DATADIR}"/${PN}/libs
		for so in libs/*.so ; do
			dosym "$(games_get_libdir)"/${PN}/${so##*/} \
				"${GAMES_DATADIR}"/${PN}/${so}
		done
	fi

	dodoc "${WORKDIR}"/${PN}_15/docs/*
	prepgamesdirs
}

pkg_preinst() {
	games_pkg_preinst
	gnome2_icon_savelist
}

pkg_postinst() {
	games_pkg_postinst
	gnome2_icon_cache_update
}

pkg_postrm() {
	gnome2_icon_cache_update
}
