summaryrefslogtreecommitdiff
path: root/community
diff options
context:
space:
mode:
Diffstat (limited to 'community')
-rw-r--r--community/oath-toolkit/PKGBUILD13
-rw-r--r--community/opendkim/PKGBUILD13
-rw-r--r--community/python2-simplejson/PKGBUILD9
-rw-r--r--community/slock/PKGBUILD6
-rw-r--r--community/spacefm/PKGBUILD8
-rw-r--r--community/vdrift/PKGBUILD15
-rw-r--r--community/vdrift/vdrift-2012-07-22c_bullet281_patch.diff898
7 files changed, 933 insertions, 29 deletions
diff --git a/community/oath-toolkit/PKGBUILD b/community/oath-toolkit/PKGBUILD
index 7e4fcd265..d0d225d75 100644
--- a/community/oath-toolkit/PKGBUILD
+++ b/community/oath-toolkit/PKGBUILD
@@ -1,19 +1,19 @@
-# $Id: PKGBUILD 77539 2012-10-11 23:18:29Z seblu $
+# $Id: PKGBUILD 78852 2012-10-25 22:57:45Z seblu $
# Maintainer: Sébastien Luttringer <seblu@aur.archlinux.org>
# Contributor: Christian Hesse <mail@eworm.de>
# Contributor: L42y <423300@gmail.com>
pkgname=oath-toolkit
-pkgver=2.0.0
+pkgver=2.0.1
pkgrel=1
pkgdesc='OATH one-time password toolkit'
arch=('i686' 'x86_64')
url='http://www.nongnu.org/oath-toolkit/'
license=('GPL3')
-depends=('glibc' 'pam' 'libxml2')
+depends=('glibc' 'pam' 'xmlsec')
options=('!libtool')
source=("http://download.savannah.nongnu.org/releases/$pkgname/$pkgname-$pkgver.tar.gz")
-md5sums=('2da5d9211062dfd746539c783185fae1')
+md5sums=('529e5995ae0d95a94daa16f9b9c25e3c')
build() {
cd $pkgname-$pkgver
@@ -21,6 +21,11 @@ build() {
make
}
+check() {
+ cd $pkgname-$pkgver
+ make check
+}
+
package() {
cd $pkgname-$pkgver
make DESTDIR="$pkgdir" install
diff --git a/community/opendkim/PKGBUILD b/community/opendkim/PKGBUILD
index 8bfab528d..6e11bf0f4 100644
--- a/community/opendkim/PKGBUILD
+++ b/community/opendkim/PKGBUILD
@@ -1,24 +1,24 @@
-# $Id: PKGBUILD 78344 2012-10-17 14:52:24Z spupykin $
+# $Id: PKGBUILD 78840 2012-10-25 13:10:38Z spupykin $
# Maintainer: Sergej Pupykin <pupykin.s+arch@gmail.com>
# Maintainer: Thomas Jost <schnouki@schnouki.net>
pkgname=opendkim
-pkgver=2.6.7
-pkgrel=2
+pkgver=2.7.0
+pkgrel=1
pkgdesc="An open source implementation of the DKIM sender authentication system. Based on a fork of dkim-milter."
arch=(i686 x86_64)
url="http://www.opendkim.org/"
license=('BSD' 'custom:Sendmail')
depends=("db" "openssl")
makedepends=("libmilter")
-options=(!libtool)
+options=(!libtool !emptydirs)
backup=(etc/conf.d/opendkim)
install=opendkim.install
source=(http://downloads.sourceforge.net/project/$pkgname/$pkgname-$pkgver.tar.gz
opendkim.conf
opendkim.rc
opendkim.service)
-md5sums=('8dd327c1c3f3ffdbc436ef7df877940e'
+md5sums=('ec3f38e6b612c58cd3b4dabfd923274a'
'3e2bb1058ac0662f01e675aa6ac7ee8f'
'093f5c098a45cc68753f97e45a5b374c'
'bc1b73856bc1941faaa4842e00437cb5')
@@ -49,9 +49,6 @@ package() {
install -Dm644 "$srcdir/opendkim.conf" "$pkgdir/etc/conf.d/opendkim"
install -Dm755 "$srcdir/opendkim.rc" "$pkgdir/etc/rc.d/opendkim"
- # Remove empty dirs
- rmdir "$pkgdir/usr/share/man/man1" "$pkgdir/usr/share/man/man3"
-
# License
mkdir -p "$pkgdir/usr/share/licenses/opendkim"
for f in LICENSE LICENSE.Sendmail; do
diff --git a/community/python2-simplejson/PKGBUILD b/community/python2-simplejson/PKGBUILD
index 1ec0a97b5..d300ee192 100644
--- a/community/python2-simplejson/PKGBUILD
+++ b/community/python2-simplejson/PKGBUILD
@@ -4,8 +4,8 @@
# Contributor: David Moore <davidm@sjsoft.com>
pkgname=python2-simplejson
-pkgver=2.6.1
-pkgrel=3
+pkgver=2.6.2
+pkgrel=1
pkgdesc="Simple, fast, extensible JSON encoder/decoder for Python"
license=('MIT')
arch=('i686' 'x86_64')
@@ -18,13 +18,16 @@ replaces=('python-simplejson')
changelog=$pkgname.changelog
source=($pkgname-$pkgver.tar.gz::https://github.com/simplejson/simplejson/tarball/v${pkgver})
sha256sums=('484b4cf0a545fc59a19ea8eed3a957919a89be116804b53712ec63466d7c3a31')
+sha256sums=('c57ecbcbaf7013df2d555436838acd78c9bb05c3e34ebe3d4de4d8102a0ac2a5')
+sha256sums=('c57ecbcbaf7013df2d555436838acd78c9bb05c3e34ebe3d4de4d8102a0ac2a5')
+sha256sums=('c57ecbcbaf7013df2d555436838acd78c9bb05c3e34ebe3d4de4d8102a0ac2a5')
build() {
cd ${srcdir}/simplejson-simplejson-*
python2 setup.py install --root=${pkgdir}
-# License
+ # License
install -Dm644 ${srcdir}/simplejson-simplejson-*/LICENSE.txt \
${pkgdir}/usr/share/licenses/$pkgname/LICENSE
}
diff --git a/community/slock/PKGBUILD b/community/slock/PKGBUILD
index b297f6690..b6fbb2ebe 100644
--- a/community/slock/PKGBUILD
+++ b/community/slock/PKGBUILD
@@ -1,9 +1,9 @@
-# $Id: PKGBUILD 64276 2012-02-11 10:23:57Z bluewind $
+# $Id: PKGBUILD 78848 2012-10-25 20:30:11Z spupykin $
# Maintainer: Sergej Pupykin <pupykin.s+arch@gmail.com>
# Contributor: Sebastian A. Liem <sebastian at liem dot se>
pkgname=slock
-pkgver=1.0
+pkgver=1.1
pkgrel=1
pkgdesc="A simple screen locker for X"
arch=('i686' 'x86_64')
@@ -12,7 +12,7 @@ license=('MIT')
depends=('libxext')
source=("http://dl.suckless.org/tools/$pkgname-$pkgver.tar.gz")
#source=("slock-$pkgver.tar.bz2::http://hg.suckless.org/slock/archive/$_pkgver.tar.gz")
-md5sums=('98503f0dae5acc15c90b81ffd423f987')
+md5sums=('e3b25abdfd54c81562de4d63d3565be7')
build() {
cd "$srcdir/slock-$pkgver"
diff --git a/community/spacefm/PKGBUILD b/community/spacefm/PKGBUILD
index 6b51e42a0..561b2ef5b 100644
--- a/community/spacefm/PKGBUILD
+++ b/community/spacefm/PKGBUILD
@@ -1,15 +1,15 @@
-# $Id: PKGBUILD 78679 2012-10-22 19:59:29Z bpiotrowski $
+# $Id: PKGBUILD 78846 2012-10-25 18:08:49Z bpiotrowski $
# Maintainer: Bartłomiej Piotrowski <nospam@bpiotrowski.pl>
# Contributor: IgnorantGuru http://igurublog.wordpress.com/contact-ignorantguru/
# Contributor: ridikulus_rat <the.ridikulus.rat@gmail.com>
pkgname=spacefm
-pkgver=0.8.1
+pkgver=0.8.2
pkgrel=1
pkgdesc='A multi-panel tabbed file manager'
arch=('i686' 'x86_64')
url='http://ignorantguru.github.com/spacefm/'
-license=('GPL2')
+license=('GPL3')
install=$pkgname.install
depends=('gtk2' 'shared-mime-info' 'desktop-file-utils' 'startup-notification' 'udev')
makedepends=('intltool' 'gettext')
@@ -22,7 +22,7 @@ optdepends=('lsof: device processes'
'udisks: mount as non-root user'
'udisks2: mount as non-root user')
source=(https://raw.github.com/IgnorantGuru/spacefm/master/packages/${pkgver}/spacefm-${pkgver}.tar.xz)
-md5sums=('4120611f138b3dd530d8f65319366ba1')
+md5sums=('fbae23404d44a7eea5453217f0102eb7')
build() {
cd $srcdir/$pkgname-$pkgver
diff --git a/community/vdrift/PKGBUILD b/community/vdrift/PKGBUILD
index a5369d307..f30ed8bdb 100644
--- a/community/vdrift/PKGBUILD
+++ b/community/vdrift/PKGBUILD
@@ -1,22 +1,23 @@
-# $Id: PKGBUILD 75820 2012-09-01 20:39:43Z heftig $
+# $Id: PKGBUILD 78854 2012-10-26 01:19:11Z ebelanger $
# Maintainer: Sven-Hendrik Haase <sh@lutzhaase.com>
# Contributor: Anton Bazhenov <anton.bazhenov at gmail>
# Contributor: Lone_Wolf lonewolf@xs4all.nl
pkgname=vdrift
pkgver=2012.07.22
-pkgrel=1
+pkgrel=2
pkgdesc="Open source driving simulation made with drift racing in mind"
arch=('i686' 'x86_64')
url="http://vdrift.net/"
license=('GPL')
-depends=('bullet' 'curl' 'sdl_gfx' 'sdl_image' 'glew' 'libvorbis' 'vdrift-data'
+depends=('bullet' 'curl' 'sdl_gfx' 'sdl_image' 'glew' 'libvorbis' "vdrift-data=2:$pkgver"
'gtk-update-icon-cache' 'hicolor-icon-theme' 'libarchive')
-makedepends=('scons' 'boost' 'asio')
+makedepends=('scons' 'boost' 'asio' 'mesa')
+install=vdrift.install
source=(http://downloads.sourceforge.net/sourceforge/$pkgname/$pkgname-${pkgver//./-}.tar.bz2
- http://downloads.sourceforge.net/sourceforge/$pkgname/$pkgname-${pkgver//./-}c_patch.diff)
+ vdrift-2012-07-22c_bullet281_patch.diff)
md5sums=('fcfd6b65724d32dfe383df216d7afb74'
- '981cd26709f97cdf85100b720290177f')
+ '67ff3037575c3aa74393971d1475ef54')
build() {
cd VDrift
@@ -28,7 +29,7 @@ build() {
_sconsarch="686"
fi
- patch -Np0 < $srcdir/$pkgname-${pkgver//./-}c_patch.diff
+ patch -Np0 < "$srcdir"/vdrift-2012-07-22c_bullet281_patch.diff
# build and install
scons $MAKEFLAGS \
diff --git a/community/vdrift/vdrift-2012-07-22c_bullet281_patch.diff b/community/vdrift/vdrift-2012-07-22c_bullet281_patch.diff
new file mode 100644
index 000000000..c8509ff1b
--- /dev/null
+++ b/community/vdrift/vdrift-2012-07-22c_bullet281_patch.diff
@@ -0,0 +1,898 @@
+--- data/skins/simple/menus/AssignControl Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/AssignControl Mon Jan 19 23:26:36 1970
+@@ -46,7 +46,7 @@
+ image = white.png
+ color = 0.172, 0.161, 0.169
+ alpha = 0.7
+-left = 0.2
+-right = 0.2
++left = 0.1
++right = 0.1
+ top = 0.48
+ height = 0.04
+--- data/skins/simple/menus/GuiControls Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/GuiControls Mon Jan 19 23:26:36 1970
+@@ -82,7 +82,7 @@
+ onselect = controledit.string:gui_select:0
+ onmoveleft = widget-01d
+ onmoveright = widget-01c
+-onmoveup = widget-13b
++onmoveup = widget-08b
+ onmovedown = widget-02b
+ onfocus = widget-01b.sat:0.56
+ onblur = widget-01b.sat:0.0
+@@ -101,7 +101,7 @@
+ onselect = controledit.string:gui_select:1
+ onmoveleft = widget-01b
+ onmoveright = widget-01d
+-onmoveup = widget-13b
++onmoveup = widget-08b
+ onmovedown = widget-02c
+ onfocus = widget-01c.sat:0.56
+ onblur = widget-01c.sat:0.0
+@@ -120,7 +120,7 @@
+ onselect = controledit.string:gui_select:2
+ onmoveleft = widget-01c
+ onmoveright = widget-01b
+-onmoveup = widget-13b
++onmoveup = widget-08b
+ onmovedown = widget-02d
+ onfocus = widget-01d.sat:0.56
+ onblur = widget-01d.sat:0.0
+--- data/skins/simple/menus/InGameMain Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/InGameMain Mon Jan 19 23:26:36 1970
+@@ -44,10 +44,10 @@
+
+
+ [ widget-01 ]
+-text = Return to Game
++text = Continue
+ fontsize = 0.035
+ align = left
+-tip = Leave the menu and unpause the game.
++tip = Leave the menu and continue the game.
+ onselect = ReturnToGame
+ onmoveup = widget-05
+ onmovedown = widget-02
+@@ -72,7 +72,7 @@
+
+
+ [ widget-02 ]
+-text = Restart Game
++text = Restart
+ fontsize = 0.035
+ align = left
+ tip = Restart this game using the same car and track settings.
+@@ -100,7 +100,7 @@
+
+
+ [ widget-03 ]
+-text = Leave Game
++text = Abort
+ fontsize = 0.035
+ align = left
+ tip = Leave game and return to the Main menu.
+--- data/skins/simple/menus/InputDevice Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/InputDevice Mon Jan 19 23:26:36 1970
+@@ -82,7 +82,7 @@
+ onselect = joystick.type.prev
+ onmoveleft = joystick.type.prev
+ onmoveright = joystick.type.next
+-onmoveup = widget-13b
++onmoveup = widget-11b
+ onmovedown = widget-02b
+ onfocus = widget-01b.alpha:1 widget-01c.alpha:1 widget-01d.sat:0.56
+ onblur = widget-01b.alpha:0 widget-01c.alpha:0 widget-01d.sat:0.0
+@@ -102,7 +102,7 @@
+ onselect = joystick.type.next
+ onmoveleft = joystick.type.prev
+ onmoveright = joystick.type.next
+-onmoveup = widget-13b
++onmoveup = widget-11b
+ onmovedown = widget-02b
+ onfocus = widget-01b.alpha:1 widget-01c.alpha:1 widget-01d.sat:0.56
+ onblur = widget-01b.alpha:0 widget-01c.alpha:0 widget-01d.sat:0.0
+--- data/skins/simple/menus/SingleRace Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/SingleRace Mon Jan 19 23:26:36 1970
+@@ -860,7 +860,7 @@
+ onmoveleft = game.vehicle_damage.prev
+ onmoveright = game.vehicle_damage.next
+ onmoveup = widget-14b
+-onmovedown = widget-16
++onmovedown = widget-16b
+ onfocus = widget-15b.alpha:1 widget-15c.alpha:1 widget-15d.sat:0.56
+ onblur = widget-15b.alpha:0 widget-15c.alpha:0 widget-15d.sat:0.0
+ focus = false
+--- src/camera.h Mon Jan 19 23:26:36 1970
++++ src/camera.h Mon Jan 19 23:26:36 1970
+@@ -16,7 +16,7 @@
+
+ const std::string & GetName() const { return name; }
+
+- void SetFOV(float value) { fov = std::max(40.0f, std::min(160.0f, value)); }
++ void SetFOV(float value) { fov = std::max(0.0f, std::min(120.0f, value)); }
+
+ float GetFOV() const { return fov; }
+
+--- src/carcontrolmap_local.cpp Mon Jan 19 23:26:36 1970
++++ src/carcontrolmap_local.cpp Mon Jan 19 23:26:36 1970
+@@ -830,16 +830,6 @@
+ keycodes["y"] = SDLK_y;
+ keycodes["z"] = SDLK_z;
+ keycodes["DELETE"] = SDLK_DELETE;
+- keycodes["KP0"] = SDLK_KP_0;
+- keycodes["KP1"] = SDLK_KP_1;
+- keycodes["KP2"] = SDLK_KP_2;
+- keycodes["KP3"] = SDLK_KP_3;
+- keycodes["KP4"] = SDLK_KP_4;
+- keycodes["KP5"] = SDLK_KP_5;
+- keycodes["KP6"] = SDLK_KP_6;
+- keycodes["KP7"] = SDLK_KP_7;
+- keycodes["KP8"] = SDLK_KP_8;
+- keycodes["KP9"] = SDLK_KP_9;
+ keycodes["KP_PERIOD"] = SDLK_KP_PERIOD;
+ keycodes["KP_DIVIDE"] = SDLK_KP_DIVIDE;
+ keycodes["KP_MULTIPLY"] = SDLK_KP_MULTIPLY;
+@@ -872,20 +862,50 @@
+ keycodes["F14"] = SDLK_F14;
+ keycodes["F15"] = SDLK_F15;
+ keycodes["MENU"] = SDLK_MENU;
+- keycodes["APPLICATION"] = SDLK_APPLICATION;
+- keycodes["NUMLOCK"] = SDLK_NUMLOCKCLEAR;
+ keycodes["CAPSLOCK"] = SDLK_CAPSLOCK;
+- keycodes["SCROLLLOCK"] = SDLK_SCROLLLOCK;
+ keycodes["RSHIFT"] = SDLK_RSHIFT;
+ keycodes["LSHIFT"] = SDLK_LSHIFT;
+ keycodes["RCTRL"] = SDLK_RCTRL;
+ keycodes["LCTRL"] = SDLK_LCTRL;
+ keycodes["RALT"] = SDLK_RALT;
+ keycodes["LALT"] = SDLK_LALT;
++#if SDL_VERSION_ATLEAST(2,0,0)
++ keycodes["KP0"] = SDLK_KP_0;
++ keycodes["KP1"] = SDLK_KP_1;
++ keycodes["KP2"] = SDLK_KP_2;
++ keycodes["KP3"] = SDLK_KP_3;
++ keycodes["KP4"] = SDLK_KP_4;
++ keycodes["KP5"] = SDLK_KP_5;
++ keycodes["KP6"] = SDLK_KP_6;
++ keycodes["KP7"] = SDLK_KP_7;
++ keycodes["KP8"] = SDLK_KP_8;
++ keycodes["KP9"] = SDLK_KP_9;
++ keycodes["COMPOSE"] = SDLK_APPLICATION;
++ keycodes["NUMLOCK"] = SDLK_NUMLOCKCLEAR;
++ keycodes["SCROLLLOCK"] = SDLK_SCROLLLOCK;
+ keycodes["RMETA"] = SDLK_RGUI;
+ keycodes["LMETA"] = SDLK_LGUI;
+ keycodes["LSUPER"] = SDLK_LGUI;
+ keycodes["RSUPER"] = SDLK_RGUI;
++#else
++ keycodes["KP0"] = SDLK_KP0;
++ keycodes["KP1"] = SDLK_KP1;
++ keycodes["KP2"] = SDLK_KP2;
++ keycodes["KP3"] = SDLK_KP3;
++ keycodes["KP4"] = SDLK_KP4;
++ keycodes["KP5"] = SDLK_KP5;
++ keycodes["KP6"] = SDLK_KP6;
++ keycodes["KP7"] = SDLK_KP7;
++ keycodes["KP8"] = SDLK_KP8;
++ keycodes["KP9"] = SDLK_KP9;
++ keycodes["COMPOSE"] = SDLK_COMPOSE;
++ keycodes["NUMLOCK"] = SDLK_NUMLOCK;
++ keycodes["SCROLLLOCK"] = SDLK_SCROLLOCK;
++ keycodes["LMETA"] = SDLK_LMETA;
++ keycodes["RMETA"] = SDLK_RMETA;
++ keycodes["LSUPER"] = SDLK_LSUPER;
++ keycodes["RSUPER"] = SDLK_RSUPER;
++#endif
+ return keycodes;
+ }
+
+--- src/game.cpp Mon Jan 19 23:26:36 1970
++++ src/game.cpp Mon Jan 19 23:26:36 1970
+@@ -324,10 +324,6 @@
+
+ info_output << "Shutting down..." << std::endl;
+
+- // Stop the sound thread.
+- if (sound.Enabled())
+- sound.Pause(true);
+-
+ LeaveGame();
+
+ // Save settings first incase later deinits cause crashes.
+@@ -499,16 +495,7 @@
+ }
+
+ // Connect game actions to gui options
+- set_car_name.connect(gui.GetOption("game.car").signal_val);
+- set_car_paint.connect(gui.GetOption("game.car_paint").signal_val);
+- set_car_color_hue.connect(gui.GetOption("game.car_color_hue").signal_val);
+- set_car_color_sat.connect(gui.GetOption("game.car_color_sat").signal_val);
+- set_car_color_val.connect(gui.GetOption("game.car_color_val").signal_val);
+- set_car_ai_type.connect(gui.GetOption("game.ai_type").signal_val);
+- set_car_ai_level.connect(gui.GetOption("game.ai_level").signal_val);
+- set_cars_num.connect(gui.GetOption("game.cars_num").signal_val);
+- set_track_image.connect(gui.GetOption("game.track").signal_val);
+- set_control.connect(gui.GetOption("controledit.string").signal_val);
++ BindActionsToGUI();
+
+ // Set options from game settings.
+ std::map<std::string, std::string> optionmap;
+@@ -531,7 +518,6 @@
+ if (sound.Init(2048, info_output, error_output))
+ {
+ sound.SetVolume(settings.GetSoundVolume());
+- //sound.Pause(false);
+ content.setSound(sound.GetDeviceInfo());
+ }
+ else
+@@ -932,22 +918,18 @@
+ if (sound.Enabled())
+ {
+ bool pause_sound = pause || gui.Active();
+- sound.Pause(pause_sound);
+- if (!pause_sound)
+- {
+- PROFILER.beginBlock("sound");
+- MATHVECTOR <float, 3> pos;
+- QUATERNION <float> rot;
+- if (active_camera)
+- {
+- pos = active_camera->GetPosition();
+- rot = active_camera->GetOrientation();
+- }
+- sound.SetListenerPosition(pos[0], pos[1], pos[2]);
+- sound.SetListenerRotation(rot[0], rot[1], rot[2], rot[3]);
+- sound.Update();
+- PROFILER.endBlock("sound");
+- }
++ PROFILER.beginBlock("sound");
++ MATHVECTOR <float, 3> pos;
++ QUATERNION <float> rot;
++ if (active_camera)
++ {
++ pos = active_camera->GetPosition();
++ rot = active_camera->GetOrientation();
++ }
++ sound.SetListenerPosition(pos[0], pos[1], pos[2]);
++ sound.SetListenerRotation(rot[0], rot[1], rot[2], rot[3]);
++ sound.Update(pause_sound);
++ PROFILER.endBlock("sound");
+ }
+
+ //PROFILER.beginBlock("force-feedback");
+@@ -1798,9 +1780,12 @@
+ // get car start position marker for camera setup
+ MATHVECTOR<float, 3> car_pos = track.GetStart(0).first;
+
+- // car setup
++ // clear previous car
+ cars.clear();
+
++ // remove previous car sounds
++ sound.Update(true);
++
+ if (LoadCar(
+ cars_name[car_edit_id],
+ cars_paint[car_edit_id],
+@@ -1808,14 +1793,13 @@
+ car_pos, track.GetStart(0).second,
+ true, false))
+ {
+- // update car
++ // set car
+ CAR & car = cars.back();
+ dynamics.update(timestep);
+ car.Update(timestep);
+
+- // process car sound sources
+- // should they be loaded for garage car in the first place?
+- sound.Update();
++ // add car sounds
++ sound.Update(true);
+
+ // use car shape center for camera setup
+ car_pos = car.GetPosition();
+@@ -1958,7 +1942,7 @@
+ }
+
+ if (numreplays == 0)
+- replaylist.push_back(std::make_pair("", "None"));
++ replaylist.push_back(std::make_pair("none", "None"));
+
+ settings.SetSelectedReplay(replaylist.begin()->first);
+ }
+@@ -2411,6 +2395,7 @@
+
+ track.Clear();
+ cars.clear();
++ sound.Update(true);
+ hud.SetVisible(false);
+ inputgraph.Hide();
+ trackmap.Unload();
+@@ -2419,7 +2404,6 @@
+ pause = false;
+ race_laps = 0;
+ tire_smoke.Clear();
+- sound.Update();
+ }
+
+ void GAME::StartPractice()
+@@ -2473,7 +2457,7 @@
+
+ void GAME::StartReplay()
+ {
+- if (!settings.GetSelectedReplay().empty() && !NewGame(true))
++ if (settings.GetSelectedReplay() != "none" && !NewGame(true))
+ {
+ gui.ActivatePage("ReplayStartError", 0.25, error_output);
+ }
+@@ -2855,6 +2839,19 @@
+ EditControl();
+ }
+
++void GAME::BindActionsToGUI()
++{
++ set_car_name.connect(gui.GetOption("game.car").signal_val);
++ set_car_paint.connect(gui.GetOption("game.car_paint").signal_val);
++ set_car_color_hue.connect(gui.GetOption("game.car_color_hue").signal_val);
++ set_car_color_sat.connect(gui.GetOption("game.car_color_sat").signal_val);
++ set_car_color_val.connect(gui.GetOption("game.car_color_val").signal_val);
++ set_car_ai_type.connect(gui.GetOption("game.ai_type").signal_val);
++ set_car_ai_level.connect(gui.GetOption("game.ai_level").signal_val);
++ set_cars_num.connect(gui.GetOption("game.cars_num").signal_val);
++ set_track_image.connect(gui.GetOption("game.track").signal_val);
++ set_control.connect(gui.GetOption("controledit.string").signal_val);
++}
+
+ void GAME::RegisterActions()
+ {
+--- src/game.h Mon Jan 19 23:26:36 1970
++++ src/game.h Mon Jan 19 23:26:36 1970
+@@ -201,6 +201,7 @@
+ void SetTrackImage(const std::string & value);
+ void SetControl(const std::string & value);
+
++ void BindActionsToGUI();
+ void RegisterActions();
+ void InitActionMap(std::map<std::string, Slot0*> & actionmap);
+
+--- src/sound.cpp Mon Jan 19 23:26:36 1970
++++ src/sound.cpp Mon Jan 19 23:26:36 1970
+@@ -30,17 +30,20 @@
+ }
+
+ SOUND::SOUND() :
++ log_error(0),
+ deviceinfo(0, 0, 0, 0),
++ sound_volume(0),
+ initdone(false),
+ disable(false),
+- paused(true),
+ sampler_lock(0),
+ source_lock(0),
++ set_pause(true),
+ max_active_sources(64),
+ sources_num(0),
+- samplers_num(0)
++ sources_pause(true),
++ samplers_num(0),
++ samplers_pause(true)
+ {
+- volume_filter.SetFilterOrder0(1.0);
+ sources.reserve(64);
+ samplers.reserve(64);
+ }
+@@ -115,11 +118,13 @@
+ }
+
+ deviceinfo = SOUNDINFO(samples, frequency, channels, bytespersample);
+-
++ log_error = &error_output;
+ initdone = true;
+-
+ SetVolume(1.0);
+
++ // enable sound, run callback
++ SDL_PauseAudio(false);
++
+ return true;
+ }
+
+@@ -138,46 +143,21 @@
+ disable = true;
+ }
+
+-void SOUND::Pause(bool value)
+-{
+- if (paused != value)
+- {
+- SDL_PauseAudio(value);
+- paused = value;
+- }
+-}
+-
+-void SOUND::Update()
++void SOUND::Update(bool pause)
+ {
+ if (disable) return;
+
++ set_pause = pause;
++
+ GetSourceChanges();
+
+ ProcessSourceStop();
+
+- ProcessSourceRemove();
+-
+ ProcessSources();
+
+- SetSamplerChanges();
+-
+- // short circuit if paused(sound thread blocked)
+- if (paused)
+- {
+- GetSamplerChanges();
+-
+- ProcessSamplerAdd();
+-
+- ProcessSamplerRemove();
+-
+- SetSourceChanges();
+-
+- GetSourceChanges();
+-
+- ProcessSourceStop();
++ ProcessSourceRemove();
+
+- ProcessSourceRemove();
+- }
++ SetSamplerChanges();
+ }
+
+ void SOUND::SetMaxActiveSources(size_t value)
+@@ -192,18 +172,24 @@
+ size_t id = item_num;
+ if (id < items.size())
+ {
++ // reuse free slot
+ size_t idn = items[id].id;
+ if (idn != id)
+ {
+- // swap back redirected item
++ // free slot is redirecting to other item
+ assert(idn < id);
++
++ // swap redirected item back
+ items[id] = items[idn];
++
++ // use now free slot
+ id = idn;
+ }
+ items[id] = item;
+ }
+ else
+ {
++ // add item to new slot
+ items.push_back(item);
+ }
+ items[id].id = id;
+@@ -217,9 +203,14 @@
+ inline void RemoveItem(size_t id, std::vector<T> & items, size_t & item_num)
+ {
+ assert(id < items.size());
++
++ // get item true id
+ size_t idn = items[id].id;
+ assert(idn < item_num);
++
++ // pop last item
+ --item_num;
++
+ // swap last item with current
+ size_t idl = items[item_num].id;
+ if (idl != item_num)
+@@ -270,14 +261,13 @@
+ ns.id = -1;
+ sampler_add.getFirst().push_back(ns);
+
+- //std::cout << "Add sound source: " << id << " " << buffer->GetName() << std::endl;
++ //*log_error << "Add sound source: " << id << " " << buffer->GetName() << std::endl;
+ return id;
+ }
+
+ void SOUND::RemoveSource(size_t id)
+ {
+- // notify sound thread, it will notify main thread to remove the source
+- //std::cout << "To be removed source: " << id << " " << sources[sources[id].id].buffer->GetName() << std::endl;
++ // notify sound and main thread to remove the source/sampler
+ sampler_remove.getFirst().push_back(id);
+ }
+
+@@ -343,14 +333,13 @@
+
+ void SOUND::SetVolume(float value)
+ {
+- volume_filter.SetFilterOrder0(clamp(value, 0.f, 1.f));
++ sound_volume = value;
+ }
+
+ void SOUND::GetSourceChanges()
+ {
+ Lock(source_lock);
+ source_stop.swapFirst();
+- source_remove.swapFirst();
+ Unlock(source_lock);
+ }
+
+@@ -368,17 +357,18 @@
+
+ void SOUND::ProcessSourceRemove()
+ {
+- std::vector<size_t> & sremove = source_remove.getFirst();
++ std::vector<size_t> & sremove = sampler_remove.getFirst();
+ for (size_t i = 0; i < sremove.size(); ++i)
+ {
+ size_t id = sremove[i];
+ assert(id < sources.size());
++
+ size_t idn = sources[id].id;
+ assert(idn < sources_num);
+- //std::cout << "Remove sound source: " << id << " " << sources[idn].buffer->GetName() << std::endl;
++ //*log_error << "Remove sound source: " << id << " " << sources[idn].buffer->GetName() << std::endl;
++
+ RemoveItem(id, sources, sources_num);
+ }
+- sremove.clear();
+ }
+
+ void SOUND::ProcessSources()
+@@ -436,8 +426,11 @@
+ }
+ }
+
+- supdate[i].gain1 = gain1 * Sampler::denom;
+- supdate[i].gain2 = gain2 * Sampler::denom;
++ // fade sound volume
++ float volume = set_pause ? 0 : sound_volume;
++
++ supdate[i].gain1 = volume * gain1 * Sampler::denom;
++ supdate[i].gain2 = volume * gain2 * Sampler::denom;
+ supdate[i].pitch = src.pitch * Sampler::denom;
+ }
+
+@@ -471,6 +464,7 @@
+ if (sampler_update.getFirst().size()) sampler_update.swapFirst();
+ if (sampler_add.getFirst().size()) sampler_add.swapFirst();
+ if (sampler_remove.getFirst().size()) sampler_remove.swapFirst();
++ sources_pause = set_pause;
+ Unlock(sampler_lock);
+ }
+
+@@ -478,33 +472,41 @@
+ {
+ Lock(sampler_lock);
+ sampler_update.swapLast();
+- sampler_remove.swapLast();
+ sampler_add.swapLast();
++ sampler_remove.swapLast();
++ samplers_fade = samplers_pause != sources_pause;
++ samplers_pause = sources_pause;
+ Unlock(sampler_lock);
+ }
+
+ void SOUND::ProcessSamplerUpdate()
+ {
+ std::vector<SamplerUpdate> & supdate = sampler_update.getLast();
+- if (samplers_num == supdate.size())
++ if (supdate.empty()) return;
++
++ assert(samplers_num == supdate.size());
++ for (size_t i = 0; i < samplers_num; ++i)
+ {
+- for (size_t i = 0; i < samplers_num; ++i)
+- {
+- samplers[i].gain1 = supdate[i].gain1;
+- samplers[i].gain2 = supdate[i].gain2;
+- samplers[i].pitch = supdate[i].pitch;
+- }
++ samplers[i].gain1 = supdate[i].gain1;
++ samplers[i].gain2 = supdate[i].gain2;
++ samplers[i].pitch = supdate[i].pitch;
+ }
+ supdate.clear();
+ }
+
+ void SOUND::ProcessSamplers(unsigned char *stream, int len)
+ {
+- // set buffers and clear stream
++ // clear stream
++ memset(stream, 0, len);
++
++ // pause sampling
++ if (samplers_pause && !samplers_fade)
++ return;
++
++ // init sampling buffers
+ int len4 = len / 4;
+ buffer1.resize(len4);
+ buffer2.resize(len4);
+- memset(stream, 0, len);
+
+ // run samplers
+ short * sstream = (short*)stream;
+@@ -519,13 +521,17 @@
+ {
+ SampleAndAdvanceWithPitch16bit(smp, &buffer1[0], &buffer2[0], len4);
+
+- volume_filter.Filter(&buffer1[0], &buffer2[0], len4);
+-
+ for (int n = 0; n < len4; ++n)
+ {
+ int pos = n * 2;
+- sstream[pos] = clamp(sstream[pos] + buffer1[n], -32768, 32767);
+- sstream[pos + 1] = clamp(sstream[pos + 1] + buffer2[n], -32768, 32767);
++ int val1 = sstream[pos] + buffer1[n];
++ int val2 = sstream[pos + 1] + buffer2[n];
++
++ val1 = clamp(val1, -32768, 32767);
++ val2 = clamp(val2, -32768, 32767);
++
++ sstream[pos] = val1;
++ sstream[pos + 1] = val2;
+ }
+ }
+ else
+@@ -541,17 +547,13 @@
+ void SOUND::ProcessSamplerRemove()
+ {
+ std::vector<size_t> & sremove = sampler_remove.getLast();
+- if (!sremove.empty())
++ for (size_t i = 0; i < sremove.size(); ++i)
+ {
+- for (size_t i = 0; i < sremove.size(); ++i)
+- {
+- size_t id = sremove[i];
+- assert(id < samplers.size());
+- RemoveItem(id, samplers, samplers_num);
+- }
+- source_remove.getLast() = sremove;
+- sremove.clear();
++ size_t id = sremove[i];
++ assert(id < samplers.size());
++ RemoveItem(id, samplers, samplers_num);
+ }
++ sremove.clear();
+ }
+
+ void SOUND::ProcessSamplerAdd()
+@@ -589,7 +591,6 @@
+ {
+ Lock(source_lock);
+ if (source_stop.getLast().size()) source_stop.swapLast();
+- if (source_remove.getLast().size()) source_remove.swapLast();
+ Unlock(source_lock);
+ }
+
+@@ -600,12 +601,12 @@
+
+ GetSamplerChanges();
+
++ ProcessSamplerAdd();
++
+ ProcessSamplerUpdate();
+
+ ProcessSamplers(stream, len);
+
+- ProcessSamplerAdd();
+-
+ ProcessSamplerRemove();
+
+ SetSourceChanges();
+@@ -622,9 +623,10 @@
+ assert(len > 0);
+ assert(sampler.buffer);
+
+- // if not playing, fill output buffers with silence, should not happen
++ // if not playing, fill output buffers with silence
+ if (!sampler.playing)
+ {
++ // should be dealt with before getting here
+ assert(0);
+ for (int i = 0; i < len; ++i)
+ {
+--- src/sound.h Mon Jan 19 23:26:36 1970
++++ src/sound.h Mon Jan 19 23:26:36 1970
+@@ -33,11 +33,8 @@
+ // disable sound
+ void Disable();
+
+- // pause sound
+- void Pause(bool value);
+-
+ // commit state changes
+- void Update();
++ void Update(bool pause);
+
+ // active sources limit can be adjusted at runtime
+ void SetMaxActiveSources(size_t value);
+@@ -69,14 +66,14 @@
+ void SetVolume(float value);
+
+ private:
++ std::ostream * log_error;
+ SOUNDINFO deviceinfo;
+- SOUNDFILTER volume_filter;
+ MATHVECTOR<float, 3> listener_pos;
+ MATHVECTOR<float, 3> listener_vel;
+ QUATERNION<float> listener_rot;
++ float sound_volume;
+ bool initdone;
+ bool disable;
+- bool paused;
+
+ // state structs
+ struct Source
+@@ -95,8 +92,8 @@
+
+ struct Sampler
+ {
+- static const int denom = 1 << 15;
+- static const int max_gain_delta = (denom * 100) / 44100;
++ static const int denom = 32768;
++ static const int max_gain_delta = (denom * 173) / 44100; // 256 samples from min to max gain
+ const SOUNDBUFFER * buffer;
+ int samples_per_channel;
+ int sample_pos;
+@@ -135,21 +132,24 @@
+ TrippleBuffer<SamplerUpdate> sampler_update;
+ TrippleBuffer<SamplerAdd> sampler_add;
+ TrippleBuffer<size_t> sampler_remove;
+- TrippleBuffer<size_t> source_remove;
+ TrippleBuffer<size_t> source_stop;
+ SDL_mutex * sampler_lock;
+ SDL_mutex * source_lock;
++ bool set_pause;
+
+ // sound sources state
+ std::vector<SourceActive> sources_active;
+ std::vector<Source> sources;
+ size_t max_active_sources;
+ size_t sources_num;
++ bool sources_pause;
+
+ // sound thread state
+ std::vector<int> buffer1, buffer2;
+ std::vector<Sampler> samplers;
+ size_t samplers_num;
++ bool samplers_pause;
++ bool samplers_fade;
+
+ // main thread methods
+ void GetSourceChanges();
+--- src/texture.cpp Mon Jan 19 23:26:36 1970
++++ src/texture.cpp Mon Jan 19 23:26:36 1970
+@@ -179,6 +179,7 @@
+ else
+ {
+ error << "Error loading texture file: " + path << std::endl;
++ error << IMG_GetError();
+ return false;
+ }
+
+@@ -303,6 +304,7 @@
+ else
+ {
+ error << "Error loading texture file: " + path + " (" + cubefiles[i] + ")" << std::endl;
++ error << IMG_GetError();
+ return false;
+ }
+
+@@ -477,6 +479,7 @@
+ if (!orig_surface)
+ {
+ error << "Error loading texture file: " << path << std::endl;
++ error << IMG_GetError();
+ return false;
+ }
+ }
+--- src/cardynamics.cpp Mon Jan 19 23:26:36 1970
++++ src/cardynamics.cpp Mon Jan 19 23:26:36 1970
+@@ -1791,23 +1791,29 @@
+
+ bool CARDYNAMICS::WheelContactCallback(
+ btManifoldPoint& cp,
+- const btCollisionObject* colObj0,
+- int partId0,
++ const btCollisionObjectWrapper* col0,
++ int part0,
+ int index0,
+- const btCollisionObject* colObj1,
+- int partId1,
++ const btCollisionObjectWrapper* col1,
++ int part1,
+ int index1)
+ {
+- // cars are fracture bodies, wheel is a cylinder shape
+- const btCollisionShape* shape = colObj0->getCollisionShape();
+- if ((colObj0->getInternalType() & CO_FRACTURE_TYPE) &&
++#if (BT_BULLET_VERSION < 281)
++ const btCollisionObject* obj = col0;
++ const btCollisionShape* shape = obj->getCollisionShape();
++ const btCollisionShape* rootshape = obj->getRootCollisionShape();
++#else
++ const btCollisionObject* obj = col0->getCollisionObject();
++ const btCollisionShape* shape = col0->getCollisionShape();
++ const btCollisionShape* rootshape = obj->getCollisionShape();
++#endif
++ if ((obj->getInternalType() & CO_FRACTURE_TYPE) &&
+ (shape->getShapeType() == CYLINDER_SHAPE_PROXYTYPE))
+ {
+- // is contact within contact patch?
+- const btCompoundShape* car = static_cast<const btCompoundShape*>(colObj0->getRootCollisionShape());
+- const btCylinderShapeX* wheel = static_cast<const btCylinderShapeX*>(shape);
+- btVector3 contactPoint = cp.m_localPointA - car->getChildTransform(cp.m_index0).getOrigin();
+- if (-direction::up.dot(contactPoint) > 0.5 * wheel->getRadius())
++ const btCompoundShape* carshape = static_cast<const btCompoundShape*>(rootshape);
++ const btCylinderShapeX* wheelshape = static_cast<const btCylinderShapeX*>(shape);
++ btVector3 contactPoint = cp.m_localPointA - carshape->getChildTransform(cp.m_index0).getOrigin();
++ if (-direction::up.dot(contactPoint) > 0.5 * wheelshape->getRadius())
+ {
+ // break contact (hack)
+ cp.m_normalWorldOnB = btVector3(0, 0, 0);
+--- src/cardynamics.h Mon Jan 19 23:26:36 1970
++++ src/cardynamics.h Mon Jan 19 23:26:36 1970
+@@ -25,6 +25,12 @@
+ class FractureBody;
+ class PTree;
+
++#if (BT_BULLET_VERSION < 281)
++#define btCollisionObjectWrapper btCollisionObject
++#else
++struct btCollisionObjectWrapper;
++#endif
++
+ class CARDYNAMICS : public btActionInterface
+ {
+ friend class PERFORMANCE_TESTING;
+@@ -151,11 +157,11 @@
+
+ static bool WheelContactCallback(
+ btManifoldPoint& cp,
+- const btCollisionObject* colObj0,
+- int partId0,
++ const btCollisionObjectWrapper* col0,
++ int part0,
+ int index0,
+- const btCollisionObject* colObj1,
+- int partId1,
++ const btCollisionObjectWrapper* col1,
++ int part1,
+ int index1);
+
+ protected:
+--- src/dynamicsworld.cpp Mon Jan 19 23:26:36 1970
++++ src/dynamicsworld.cpp Mon Jan 19 23:26:36 1970
+@@ -105,7 +105,7 @@
+ int patch_id = -1;
+ const BEZIER * b = 0;
+ const TRACKSURFACE * s = TRACKSURFACE::None();
+- btCollisionObject * c = 0;
++ const btCollisionObject * c = 0;
+
+ MyRayResultCallback ray(origin, p, caster);
+ rayTest(origin, p, ray);
+@@ -221,6 +221,7 @@
+
+ void DynamicsWorld::fractureCallback()
+ {
++#if (BT_BULLET_VERSION < 281)
+ m_activeConnections.resize(0);
+
+ int numManifolds = getDispatcher()->getNumManifolds();
+@@ -268,4 +269,5 @@
+ btRigidBody* child = body->updateConnection(con_id);
+ if (child) addRigidBody(child);
+ }
++#endif
+ }