]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Person.cpp
Remove some extra declarations of "channels"
[lugaru.git] / Source / Person.cpp
index ee9ab1f027efc042f902d54263a41d7205f24d60..66d268ff75f592e4a3f4de9c509c09e4b120fc26 100644 (file)
@@ -1,14 +1,36 @@
+/*
+Copyright (C) 2003, 2010 - Wolfire Games
+
+This file is part of Lugaru.
+
+Lugaru is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+*/
+
 /**> HEADER FILES <**/
 #include "Person.h"
+#include "openal_wrapper.h"
+#include "Animation.h"
+#include "Sounds.h"
+#include "Awards.h"
+#include "Game.h"
 
 extern float multiplier;
-extern Animation animation[animation_count];
-extern FSOUND_SAMPLE   *samp[100];
-extern int channels[100];
 extern Terrain terrain;
 extern float gravity;
 extern int environment;
-extern Sprites sprites;
 extern int detail;
 extern FRUSTUM frustum;
 extern XYZ viewer;
@@ -30,11 +52,8 @@ extern float terraindetail;
 extern float viewdistance;
 extern float blackout;
 extern int difficulty;
-extern Weapons weapons;
 extern bool decals;
 extern float fadestart;
-extern Person player[maxplayers];
-extern int numplayers;
 extern bool freeze;
 extern bool winfreeze;
 extern float flashamount,flashr,flashg,flashb;
@@ -47,15 +66,10 @@ extern bool tiltweird;
 extern bool midweird;
 extern bool proportionweird;
 extern bool vertexweird[6];
-extern GLubyte texturearray[512*512*3];
 extern XYZ envsound[30];
 extern float envsoundvol[30];
 extern float envsoundlife[30];
 extern int numenvsounds;
-extern int bonus;
-extern float bonusvalue;
-extern float bonustotal;
-extern float bonustime;
 extern int tutoriallevel;
 extern float smoketex;
 extern int tutorialstage;
@@ -63,112 +77,72 @@ extern bool reversaltrain;
 extern bool canattack;
 extern bool cananger;
 extern float damagedealt;
-extern float damagetaken;
 extern int hostile;
 extern float hostiletime;
 
-extern int mainmenu;
-
-extern int numfalls;
-extern int numflipfail;
-extern int numseen;
-extern int numswordattack;
-extern int numknifeattack;
-extern int numunarmedattack;
-extern int numescaped;
-extern int numflipped;
-extern int numwallflipped;
-extern int numthrowkill;
-extern int numafterkill;
-extern int numreversals;
-extern int numattacks;
-extern int maxalarmed;
 extern int indialogue;
 
 extern bool gamestarted;
 
-extern FSOUND_STREAM * strm[20];
-extern "C"     void PlaySoundEx(int channel, FSOUND_SAMPLE *sptr, FSOUND_DSPUNIT *dsp, signed char startpaused);
-extern "C" void PlayStreamEx(int chan, FSOUND_STREAM *sptr, FSOUND_DSPUNIT *dsp, signed char startpaused);
-
-void Person::CheckKick(){
-       static XYZ relative;
-       static int i;
-
-       float damagemult=1*power;
-       if(creature==wolftype)damagemult=2.5*power;
-       damagemult*=power;
-
-       if(hasvictim)
-               if(targetanimation==rabbitkickanim&&victim&&victim!=this&&currentframe>=2&&currentanimation==rabbitkickanim){
-                       if(findDistancefast(&coords,&victim->coords)<1.2){
-                               if(!victim->skeleton.free){
-                                       relative=velocity;
-                                       Normalise(&relative);
-                                       relative=coords+relative*1;
-                                       if(animation[victim->targetanimation].height!=lowheight){
-                                               victim->spurt=1;
-                                               DoBlood(.2,250);
-                                               float gLoc[3];
-                                               float vel[3];
-                                               gLoc[0]=victim->coords.x;
-                                               gLoc[1]=victim->coords.y;
-                                               gLoc[2]=victim->coords.z;
-                                               vel[0]=velocity.x;
-                                               vel[1]=velocity.y;
-                                               vel[2]=velocity.z;
-                                               if(tutoriallevel!=1){
-                                                       PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                       FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                       FSOUND_SetVolume(channels[heavyimpactsound], 128);
-                                                       FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
-                                               }
-                                               victim->RagDoll(0);
-                                               relative=velocity;
-                                               relative.y=0;
-                                               Normalise(&relative);
-                                               for(i=0;i<victim->skeleton.num_joints;i++){
-                                                       victim->skeleton.joints[i].velocity+=relative*120*damagemult;
-                                               }
-                                               victim->Puff(neck);
-                                               victim->DoDamage(100*damagemult/victim->protectionhigh);
-                                               if(id==0)camerashake+=.4;
-
-                                               target=0;
-                                               currentframe=3;
-                                               targetanimation=backflipanim;
-                                               targetframe=4;
-                                               velocity=facing*-10;
-                                               velocity.y=5;
-                                               skeleton.free=0;
-                                               if(id==0)FSOUND_SetPaused(channels[whooshsound], FALSE);
-
-                                               //if(victim->damage>victim->damagetolerance){
-                                               if(id==0){
-                                                       bonus=cannon;
-                                                       bonustime=0;
-                                                       bonusvalue=100;
-                                               }
-                                               //}
-                                       }
-                                       else if (victim->isCrouch()){
-                                               targetanimation=rabbitkickreversedanim;
-                                               currentanimation=rabbitkickreversedanim;
-                                               victim->currentanimation=rabbitkickreversalanim;
-                                               victim->targetanimation=rabbitkickreversalanim;
-                                               targettilt2=0;
-                                               currentframe=0;
-                                               targetframe=1;
-                                               target=0;
-                                               velocity=0;
-                                               victim->oldcoords=victim->coords;
-                                               coords=victim->coords;
-                                               victim->targetrotation=targetrotation;
-                                               victim->victim=this;
-                                       }
-                               }
-                       }
-               }
+void Person::CheckKick()
+{
+  if (!(hasvictim
+       && (targetanimation == rabbitkickanim
+           && victim
+           && victim != this
+           && currentframe >= 2
+           && currentanimation == rabbitkickanim)
+       && (findDistancefast(&coords,&victim->coords) < 1.2)
+       && (!victim->skeleton.free)))
+    return;
+
+  if (animation[victim->targetanimation].height!=lowheight)
+    {
+      float damagemult = (creature == wolftype ? 2.5 : 1.) * power * power;
+      XYZ relative = velocity;
+      relative.y=0;
+      Normalise(&relative);
+
+      victim->spurt=1;
+      DoBlood(.2,250);
+      if(tutoriallevel!=1)
+       emit_sound_at(heavyimpactsound, victim->coords);
+      victim->RagDoll(0);
+      for(int i=0;i<victim->skeleton.num_joints;i++){
+       victim->skeleton.joints[i].velocity+=relative*120*damagemult;
+      }
+      victim->Puff(neck);
+      victim->DoDamage(100*damagemult/victim->protectionhigh);
+      if(id==0)camerashake+=.4;
+
+      target=0;
+      currentframe=3;
+      targetanimation=backflipanim;
+      targetframe=4;
+      velocity=facing*-10;
+      velocity.y=5;
+      skeleton.free=0;
+      if(id==0)
+       resume_stream(whooshsound);
+
+      award_bonus(id, cannon);
+    }
+  else if (victim->isCrouch())
+    {
+      targetanimation=rabbitkickreversedanim;
+      currentanimation=rabbitkickreversedanim;
+      victim->currentanimation=rabbitkickreversalanim;
+      victim->targetanimation=rabbitkickreversalanim;
+      targettilt2=0;
+      currentframe=0;
+      targetframe=1;
+      target=0;
+      velocity=0;
+      victim->oldcoords=victim->coords;
+      coords=victim->coords;
+      victim->targetrotation=targetrotation;
+      victim->victim=this;
+    }
 }
 
 void Person::CatchFire(){
@@ -180,62 +154,20 @@ void Person::CatchFire(){
                if(skeleton.free)flatvelocity=skeleton.joints[howmany].velocity;
                if(!skeleton.free)flatfacing=DoRotation(DoRotation(DoRotation(skeleton.joints[howmany].position,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords;
                if(skeleton.free)flatfacing=skeleton.joints[howmany].position*scale+coords;
-               sprites.MakeSprite(flamesprite, flatfacing,flatvelocity, 1,1,1, 2, 1);
+               Sprite::MakeSprite(flamesprite, flatfacing,flatvelocity, 1,1,1, 2, 1);
        }
 
        onfiredelay=0.5;
 
-       float gLoc[3];
-       float vel[3];
-       gLoc[0]=coords.x;
-       gLoc[1]=coords.y;
-       gLoc[2]=coords.z;
-       vel[0]=0;
-       vel[1]=0;
-       vel[2]=0;
-       PlaySoundEx( firestartsound, samp[firestartsound], NULL, TRUE);
-       FSOUND_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-       FSOUND_SetVolume(channels[firestartsound], 256);
-       FSOUND_SetPaused(channels[firestartsound], FALSE);
-
-       vel[0]=velocity.x;
-       vel[1]=velocity.y;
-       vel[2]=velocity.z;
-       //PlaySoundEx( firesound, samp[firesound], NULL, TRUE);
-       PlayStreamEx( stream_firesound, strm[stream_firesound], NULL, TRUE);
-       FSOUND_3D_SetAttributes(channels[stream_firesound], gLoc, vel);
-       FSOUND_SetVolume(channels[stream_firesound], 256);
-       FSOUND_SetPaused(channels[stream_firesound], FALSE);
+       emit_sound_at(firestartsound, coords);
+
+       emit_stream_at(stream_firesound, coords);
 
        flamedelay=0;
 
        onfire=1;
 }
 
-bool Person::isIdle(){
-       if(targetanimation==sleepanim||targetanimation==sitanim||targetanimation==talkidleanim||targetanimation==hurtidleanim||targetanimation==bounceidleanim||targetanimation==talkidleanim||targetanimation==fightidleanim||targetanimation==knifefightidleanim||targetanimation==swordfightidleanim||targetanimation==swordfightidlebothanim||targetanimation==fightsidestep||targetanimation==wolfidle)return 1;
-       else return 0;
-}
-
-bool Person::isSitting(){
-       if(targetanimation==sitanim)return 1;
-       if(targetanimation==sitwallanim)return 1;
-       else return 0;
-}
-
-bool Person::isSleeping(){
-       if(targetanimation==sleepanim)return 1;
-       if(targetanimation==dead1anim)return 1;
-       if(targetanimation==dead2anim)return 1;
-       if(targetanimation==dead3anim)return 1;
-       if(targetanimation==dead4anim)return 1;
-       else return 0;
-}
-
-bool Person::wasIdle(){
-       if(currentanimation==sleepanim||currentanimation==talkidleanim||currentanimation==sitanim||currentanimation==hurtidleanim||currentanimation==bounceidleanim||currentanimation==fightidleanim||currentanimation==swordfightidleanim||currentanimation==swordfightidlebothanim||currentanimation==knifefightidleanim||currentanimation==fightsidestep||currentanimation==wolfidle)return 1;
-       else return 0;
-}
 int Person::getIdle(){
        if(indialogue!=-1&&howactive==typeactive&&creature==rabbittype)return talkidleanim;
        if(hasvictim&&victim!=this/*||(id==0&&attackkeydown)*/)if(/*(id==0&&attackkeydown)||*/(!victim->dead&&victim->aitype!=passivetype&&victim->aitype!=searchtype&&aitype!=passivetype&&aitype!=searchtype&&victim->id<numplayers)){
@@ -264,32 +196,12 @@ int Person::getIdle(){
        return 0;
 }
 
-bool Person::isCrouch(){
-       if(targetanimation==crouchanim||targetanimation==wolfcrouchanim)return 1;
-       else return 0;
-}
-
-
-bool Person::wasCrouch(){
-       if(currentanimation==crouchanim||currentanimation==wolfcrouchanim)return 1;
-       else return 0;
-}
 int Person::getCrouch(){
        if(creature==rabbittype)return crouchanim;
        if(creature==wolftype)return wolfcrouchanim;
        return 0;
 }
 
-bool Person::isRun(){
-       if(targetanimation==runanim||targetanimation==wolfrunanim||targetanimation==wolfrunninganim||targetanimation==rabbitrunninganim)return 1;
-       else return 0;
-}
-
-
-bool Person::wasRun(){
-       if(currentanimation==runanim||currentanimation==wolfrunanim||currentanimation==wolfrunninganim||currentanimation==rabbitrunninganim)return 1;
-       else return 0;
-}
 int Person::getRun(){
        if(creature==rabbittype&&(!superruntoggle||weaponactive!=-1))return runanim;
        if(creature==wolftype&&(!superruntoggle))return wolfrunanim;
@@ -299,99 +211,31 @@ int Person::getRun(){
        return 0;
 }
 
-bool Person::isStop(){
-       if(targetanimation==stopanim||targetanimation==wolfstopanim)return 1;
-       else return 0;
-}
-
-
-bool Person::wasStop(){
-       if(currentanimation==stopanim||currentanimation==wolfstopanim)return 1;
-       else return 0;
-}
 int Person::getStop(){
        if(creature==rabbittype)return stopanim;
        if(creature==wolftype)return wolfstopanim;
        return 0;
 }
 
-
-bool Person::isLanding(){
-       if(targetanimation==landanim||targetanimation==wolflandanim)return 1;
-       else return 0;
-}
-
-
-bool Person::wasLanding(){
-       if(currentanimation==landanim||currentanimation==wolflandanim)return 1;
-       else return 0;
-}
 int Person::getLanding(){
        if(creature==rabbittype)return landanim;
        if(creature==wolftype)return wolflandanim;
        return 0;
 }
 
-
-bool Person::isLandhard(){
-       if(targetanimation==landhardanim||targetanimation==wolflandhardanim)return 1;
-       else return 0;
-}
-
-
-bool Person::wasLandhard(){
-       if(currentanimation==landhardanim||currentanimation==wolflandhardanim)return 1;
-       else return 0;
-}
 int Person::getLandhard(){
        if(creature==rabbittype)return landhardanim;
        if(creature==wolftype)return wolflandhardanim;
        return 0;
 }
 
-
-bool Person::isFlip(){
-       if(targetanimation==flipanim||targetanimation==frontflipanim||targetanimation==backflipanim||targetanimation==rightflipanim||targetanimation==leftflipanim||targetanimation==walljumprightkickanim||targetanimation==walljumpleftkickanim)return 1;
-       else return 0;
-}
-
-bool Person::wasFlip(){
-       if(currentanimation==flipanim||currentanimation==frontflipanim||currentanimation==backflipanim||currentanimation==rightflipanim||currentanimation==leftflipanim||currentanimation==walljumprightkickanim||currentanimation==walljumpleftkickanim)return 1;
-       else return 0;
-}
-
-bool Person::isWallJump(){
-       if(targetanimation==walljumpfrontanim||targetanimation==walljumpbackanim||targetanimation==walljumpleftanim||targetanimation==walljumprightanim)return 1;
-       else return 0;
-}
-
-void SolidHitBonus();
-void SolidHitBonus(){
-       if(bonustime<1.5&&(bonus==fourxcombo||bonus==megacombo)){
-               bonus=megacombo;
-               bonustime=0;
-               bonusvalue=160;
-       }
-       else if(bonustime<1.5&&bonus==threexcombo){
-               bonus=fourxcombo;
-               bonustime=0;
-               bonusvalue=80;
-       }
-       else if(bonustime<1.5&&bonus==twoxcombo){
-               bonus=threexcombo;
-               bonustime=0;
-               bonusvalue=40;
-       }
-       else if(bonustime<1.5&&bonus==solidhit){
-               bonus=twoxcombo;
-               bonustime=0;
-               bonusvalue=20;
-       }
-       else {
-               bonus=solidhit;
-               bonustime=0;
-               bonusvalue=10;
-       }
+static void
+SolidHitBonus(int playerid)
+{
+  if (bonustime < 1.5 && bonus >= solidhit && bonus <= megacombo)
+    award_bonus(playerid, bonus == megacombo ? bonus : bonus + 1);
+  else
+    award_bonus(playerid, solidhit);
 }
 
 void Person::DoBlood(float howmuch,int which){
@@ -413,36 +257,33 @@ void Person::DoBlood(float howmuch,int which){
                                if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
                                if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
                                if(skeleton.free){
-                                       sprites.MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
-                                       sprites.MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .3, 1);
+                                       Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
+                                       Sprite::MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .3, 1);
                                }
                                if(!skeleton.free){
-                                       sprites.MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
-                                       sprites.MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .3, 1);
-                               }               
+                                       Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
+                                       Sprite::MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .3, 1);
+                               }
                        }
                        if(Random()%2==0)
                                for(int i=0;i<3;i++){
                                        if(Random()%2!=0){
                                                bloodvel=0;
-                                               if(!skeleton.free){
+                                               if(skeleton.free) {
+                                                       bloodvel-=DoRotation(skeleton.forward*10*scale,((float)(Random()%100))/4,((float)(Random()%100))/4,0);
+                                                       bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
+                                               } else {
                                                        bloodvel.z=10;
                                                        bloodvel=DoRotation(bloodvel,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
+                                                       bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
                                                }
-                                               if(skeleton.free){
-                                                       bloodvel-=DoRotation(skeleton.forward*10*scale,((float)(Random()%100))/4,((float)(Random()%100))/4,0);
-                                               }
-                                               if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
-                                               if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
                                                bloodvel*=.2;
                                                if(skeleton.free){
-                                                       sprites.MakeSprite(splintersprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
-                                                       sprites.special[sprites.numsprites-1]=3;
-                                               }
-                                               if(!skeleton.free){
-                                                       sprites.MakeSprite(splintersprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
-                                                       sprites.special[sprites.numsprites-1]=3;
+                                                       Sprite::MakeSprite(splintersprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
+                                               } else {
+                                                       Sprite::MakeSprite(splintersprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
                                                }
+                                               Sprite::setLastSpriteSpecial(3);
                                        }
                                }
                }
@@ -456,16 +297,16 @@ void Person::DoBlood(float howmuch,int which){
                                        bleedxint=abs(Random()%512);
                                        bleedyint=abs(Random()%512);
                                }
-                               if(creature==wolftype)
-                                       while(wolfbloodText[bleedxint*512*3+bleedyint*3+0]>which+4||wolfbloodText[bleedxint*512*3+bleedyint*3+0]<which-4||bleedxint<10||bleedyint<10||bleedxint>500||bleedyint>500){
-                                               bleedxint=abs(Random()%512);
-                                               bleedyint=abs(Random()%512);
-                                       }
-                                       bleedy=bleedxint;
-                                       bleedx=bleedyint;
-                                       bleedy/=realtexdetail;
-                                       bleedx/=realtexdetail;
-                                       direction=abs(Random()%2)*2-1;
+                       if(creature==wolftype)
+                               while(wolfbloodText[bleedxint*512*3+bleedyint*3+0]>which+4||wolfbloodText[bleedxint*512*3+bleedyint*3+0]<which-4||bleedxint<10||bleedyint<10||bleedxint>500||bleedyint>500){
+                                       bleedxint=abs(Random()%512);
+                                       bleedyint=abs(Random()%512);
+                               }
+                       bleedy=bleedxint;
+                       bleedx=bleedyint;
+                       bleedy/=realtexdetail;
+                       bleedx/=realtexdetail;
+                       direction=abs(Random()%2)*2-1;
                }
 
        }
@@ -480,14 +321,6 @@ void Person::DoBloodBig(float howmuch,int which){
        if(tutoriallevel!=1||id==0)
                if(aitype!=playercontrolled&&howmuch>0){
                        int whichsound=-1;
-                       float gLoc[3];
-                       float vel[3];
-                       gLoc[0]=coords.x;
-                       gLoc[1]=coords.y;
-                       gLoc[2]=coords.z;
-                       vel[0]=velocity.x;
-                       vel[1]=velocity.y;
-                       vel[2]=velocity.z;
 
                        if(creature==wolftype){
                                int i=abs(Random()%2);
@@ -509,12 +342,8 @@ void Person::DoBloodBig(float howmuch,int which){
                                //if(i==2)whichsound=rabbitpain2sound;
                        }
 
-                       if(whichsound!=-1){
-                               PlaySoundEx( whichsound, samp[whichsound], NULL, TRUE);
-                               FSOUND_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                               FSOUND_SetVolume(channels[whichsound], 512);
-                               FSOUND_SetPaused(channels[whichsound], FALSE);
-                       }
+                       if(whichsound!=-1)
+                         emit_sound_at(whichsound, coords);
                }
 
                if(id==0&&howmuch>0){
@@ -540,13 +369,13 @@ void Person::DoBloodBig(float howmuch,int which){
                                        if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
                                        if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
                                        if(skeleton.free){
-                                               sprites.MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
-                                               sprites.MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .3, 1);
+                                               Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
+                                               Sprite::MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .3, 1);
                                        }
                                        if(!skeleton.free){
-                                               sprites.MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
-                                               sprites.MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .3, 1);
-                                       }       
+                                               Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
+                                               Sprite::MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .3, 1);
+                                       }
                                }
                        }
                        int offsetx=0,offsety=0;
@@ -587,7 +416,7 @@ void Person::DoBloodBig(float howmuch,int which){
                                                        if(i>endx)endx=i;
                                                        if(j>endy)endy=j;
                                                }
-                                       }       
+                                       }
                                }
                                if(creature==wolftype)
                                        for(i=0;i<512;i++){
@@ -598,7 +427,7 @@ void Person::DoBloodBig(float howmuch,int which){
                                                                if(i>endx)endx=i;
                                                                if(j>endy)endy=j;
                                                        }
-                                               }       
+                                               }
                                        }
 
                                        startx+=offsetx;
@@ -645,8 +474,7 @@ void Person::DoBloodBig(float howmuch,int which){
                                                                }
                                                        }
                                                        glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
-                                                       if(detail!=2||osx)DoMipmaps(5,0,0,skeleton.skinsize,skeleton.skinsize);
-                                                       else DoMipmaps(0,startx/realtexdetail,endx/realtexdetail,starty/realtexdetail,endy/realtexdetail);
+                                                       DoMipmaps();
 
                                                        bleedxint=0;
                                                        bleedyint=0;
@@ -676,7 +504,7 @@ void Person::DoBloodBig(float howmuch,int which){
                bloodloss+=bleeding*3;
 
                if(tutoriallevel!=1&&aitype!=playercontrolled&&bloodloss>damagetolerance*2/3&&bloodloss<damagetolerance&&creature==rabbittype){
-                       if(abs(Random()%2)==0){aitype=gethelptype; 
+                       if(abs(Random()%2)==0){aitype=gethelptype;
                        lastseentime=12;
                        }
                        else aitype=attacktypecutoff;
@@ -767,13 +595,13 @@ bool Person::DoBloodBigWhere(float howmuch,int which, XYZ where){
                                        if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
                                        if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
                                        if(skeleton.free){
-                                               sprites.MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
-                                               sprites.MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .3, 1);
+                                               Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
+                                               Sprite::MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .3, 1);
                                        }
                                        if(!skeleton.free){
-                                               sprites.MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
-                                               sprites.MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .3, 1);
-                                       }       
+                                               Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
+                                               Sprite::MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .3, 1);
+                                       }
                                }
                        }
                        int offsetx=0,offsety=0;
@@ -803,7 +631,7 @@ bool Person::DoBloodBigWhere(float howmuch,int which, XYZ where){
                                                        if(i>endx)endx=i;
                                                        if(j>endy)endy=j;
                                                }
-                                       }       
+                                       }
                                }
                                if(creature==wolftype)
                                        for(i=0;i<512;i++){
@@ -814,7 +642,7 @@ bool Person::DoBloodBigWhere(float howmuch,int which, XYZ where){
                                                                if(i>endx)endx=i;
                                                                if(j>endy)endy=j;
                                                        }
-                                               }       
+                                               }
                                        }
                                        startx+=offsetx;
                                        endx+=offsetx;
@@ -874,8 +702,7 @@ bool Person::DoBloodBigWhere(float howmuch,int which, XYZ where){
                                                                }
                                                        }
                                                        glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
-                                                       if(detail!=2||osx)DoMipmaps(5,0,0,skeleton.skinsize,skeleton.skinsize);
-                                                       else DoMipmaps(0,startx/realtexdetail,endx/realtexdetail,starty/realtexdetail,endy/realtexdetail);
+                                                       DoMipmaps();
 
                                                        bleedy=(1+coordsy)*512;
                                                        bleedx=coordsx*512;
@@ -894,7 +721,7 @@ bool Person::DoBloodBigWhere(float howmuch,int which, XYZ where){
        bloodloss+=bleeding*3;
 
        if(tutoriallevel!=1&&aitype!=playercontrolled&&bloodloss>damagetolerance*2/3&&bloodloss<damagetolerance&&creature==rabbittype){
-               if(abs(Random()%2)==0){aitype=gethelptype; 
+               if(abs(Random()%2)==0){aitype=gethelptype;
                lastseentime=12;
                }
                else aitype=attacktypecutoff;
@@ -905,427 +732,326 @@ bool Person::DoBloodBigWhere(float howmuch,int which, XYZ where){
 }
 
 
-void Person::DoMipmaps(int howmanylevels,float startx, float endx, float starty, float endy){
-       int i,j,k;
-       static float temp;
-       static int bytesPerPixel=3;
-       static int newsize,totalsize,rowsize,bigstep,smallstep,sum;
-       static int newstartx,newstarty,newendx,newendy;
-       static int newnewstartx,newnewstarty,newnewendx,newnewendy;
-       static int which;
-       static float sizemult;
-       /*
-       for(i=0;i<skeleton.skinsize*skeleton.skinsize*bytesPerPixel;i++){
-       texture[i]=skeleton.skinText[i];
-       }
-       */
-       if((!osx||howmanylevels)){
-
-               if(startx<0)startx=0;
-               if(starty<0)starty=0;
-               if(endx>skeleton.skinsize-1)endx=skeleton.skinsize-1;
-               if(endy>skeleton.skinsize-1)endy=skeleton.skinsize-1;
-               if((endx>startx&&endy>starty)||howmanylevels){
-
-                       newstartx=startx;
-                       newstarty=starty;
-                       newendx=endx;
-                       newendy=endy;
-
-                       for(i=startx;i<endx;i++){
-                               for(j=starty;j<endy;j++){
-                                       texturearray[(i-newstartx)*(newendy-newstarty)*3+(j-newstarty)*3+0]=skeleton.skinText[i*skeleton.skinsize*3+j*3+0];
-                                       texturearray[(i-newstartx)*(newendy-newstarty)*3+(j-newstarty)*3+1]=skeleton.skinText[i*skeleton.skinsize*3+j*3+1];
-                                       texturearray[(i-newstartx)*(newendy-newstarty)*3+(j-newstarty)*3+2]=skeleton.skinText[i*skeleton.skinsize*3+j*3+2];
-                               }
-                       }
 
-                       glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
-
-                       if(!howmanylevels){
-                               if(!osx)glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,GL_TRUE);
-                               glTexSubImage2D(GL_TEXTURE_2D,0,starty,startx,endy-starty,endx-startx,GL_RGB,GL_UNSIGNED_BYTE,texturearray);
-                               if(!osx)glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,GL_FALSE);
-                       }
-
-                       newsize=skeleton.skinsize;
-
-                       if(howmanylevels)
-                               gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGB, skeleton.skinsize, skeleton.skinsize, GL_RGB, GL_UNSIGNED_BYTE, &skeleton.skinText[0] );
-               }
-               /*for(j=1;j<=howmanylevels;j++){
-               if(j==1)texpointer=&skeleton.skinText[0];
-               else texpointer=&texture[0];
-
-               totalsize=int( newsize*newsize*bytesPerPixel);
-               rowsize=int( newsize*bytesPerPixel );
-               bigstep=bytesPerPixel*newsize*2;
-               smallstep=bytesPerPixel*2;
-
-               which=0;
-
-
-
-               glTexSubImage2D(GL_TEXTURE_2D,j,0,0,newsize/2,newsize/2,GL_RGB,GL_UNSIGNED_BYTE,texture);
-               newsize/=2;
-               }*/
+void Person::Reverse()
+{
+  if (!((victim->aitype == playercontrolled
+        || hostiletime > 1
+        || staggerdelay <= 0)
+       && victim->targetanimation != jumpupanim
+       && victim->targetanimation != jumpdownanim
+       && (tutoriallevel != 1 || cananger)
+       && hostile))
+    return;
+
+  if (normaldotproduct (victim->facing, victim->coords-coords) > 0
+      && (victim->id != 0 || difficulty >= 2)
+      && (creature != wolftype || victim->creature == wolftype))
+    return;
+
+  if(targetanimation==sweepanim){
+    targetanimation=sweepreversedanim;
+    currentanimation=sweepreversedanim;
+    victim->currentanimation=sweepreversalanim;
+    victim->targetanimation=sweepreversalanim;
+  }
+  if(targetanimation==spinkickanim){
+    targetanimation=spinkickreversedanim;
+    currentanimation=spinkickreversedanim;
+    victim->currentanimation=spinkickreversalanim;
+    victim->targetanimation=spinkickreversalanim;
+  }
+  if(targetanimation==upunchanim||targetanimation==rabbittacklinganim){
+    if(targetanimation==rabbittacklinganim){
+      currentframe=6;
+      targetframe=7;
+      victim->currentframe=6;
+      victim->targetframe=7;
+    }
+    targetanimation=upunchreversedanim;
+    currentanimation=upunchreversedanim;
+    victim->currentanimation=upunchreversalanim;
+    victim->targetanimation=upunchreversalanim;
+  }
+  if(targetanimation==staffhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
+    if(victim->weaponactive!=-1){
+      victim->throwtogglekeydown=1;
+      weapons.owner[victim->weaponids[0]]=-1;
+      weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
+      if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
+      weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
+      weapons.missed[victim->weaponids[0]]=1;
+      weapons.freetime[victim->weaponids[0]]=0;
+      weapons.firstfree[victim->weaponids[0]]=1;
+      weapons.physics[victim->weaponids[0]]=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[victim->num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
+
+      victim->weaponactive=-1;
+      for(int j=0;j<numplayers;j++){
+       player[j].wentforweapon=0;
+      }
+    }
+
+    targetanimation=staffhitreversedanim;
+    currentanimation=staffhitreversedanim;
+    victim->currentanimation=staffhitreversalanim;
+    victim->targetanimation=staffhitreversalanim;
+  }
+  if(targetanimation==staffspinhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%2==0)){
+    if(victim->weaponactive!=-1){
+      victim->throwtogglekeydown=1;
+      weapons.owner[victim->weaponids[0]]=-1;
+      weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
+      if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
+      weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
+      weapons.missed[victim->weaponids[0]]=1;
+      weapons.freetime[victim->weaponids[0]]=0;
+      weapons.firstfree[victim->weaponids[0]]=1;
+      weapons.physics[victim->weaponids[0]]=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[victim->num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
+
+      victim->weaponactive=-1;
+      for(int j=0;j<numplayers;j++){
+       player[j].wentforweapon=0;
+      }
+    }
+    targetanimation=staffspinhitreversedanim;
+    currentanimation=staffspinhitreversedanim;
+    victim->currentanimation=staffspinhitreversalanim;
+    victim->targetanimation=staffspinhitreversalanim;
+  }
+  if(targetanimation==swordslashanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
+    if(victim->weaponactive!=-1){
+      victim->throwtogglekeydown=1;
+      weapons.owner[victim->weaponids[0]]=-1;
+      weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
+      if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
+      weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
+      weapons.missed[victim->weaponids[0]]=1;
+      weapons.freetime[victim->weaponids[0]]=0;
+      weapons.firstfree[victim->weaponids[0]]=1;
+      weapons.physics[victim->weaponids[0]]=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[victim->num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
+
+      victim->weaponactive=-1;
+      for(int j=0;j<numplayers;j++){
+       player[j].wentforweapon=0;
+      }
+    }
+    targetanimation=swordslashreversedanim;
+    currentanimation=swordslashreversedanim;
+    victim->currentanimation=swordslashreversalanim;
+    victim->targetanimation=swordslashreversalanim;
+  }
+  if(targetanimation==knifeslashstartanim&&findDistancefast(&victim->coords,&coords)<2&&(victim->id==0||Random()%4==0)){
+    if(victim->weaponactive!=-1){
+      victim->throwtogglekeydown=1;
+      weapons.owner[victim->weaponids[0]]=-1;
+      weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
+      if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
+      weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
+      weapons.missed[victim->weaponids[0]]=1;
+      weapons.freetime[victim->weaponids[0]]=0;
+      weapons.firstfree[victim->weaponids[0]]=1;
+      weapons.physics[victim->weaponids[0]]=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[victim->num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
+
+      victim->weaponactive=-1;
+      for(int j=0;j<numplayers;j++){
+       player[j].wentforweapon=0;
+      }
+    }
+    targetanimation=knifeslashreversedanim;
+    currentanimation=knifeslashreversedanim;
+    victim->currentanimation=knifeslashreversalanim;
+    victim->targetanimation=knifeslashreversalanim;
+  }
+  if(targetanimation!=knifeslashstartanim&&targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim&&targetanimation!=winduppunchanim&&targetanimation!=wolfslapanim&&targetanimation!=swordslashanim&&targetanimation!=swordslashanim){
+    victim->targettilt2=targettilt2;
+    victim->currentframe=currentframe;
+    victim->targetframe=targetframe;
+    victim->target=target;
+    victim->velocity=0;
+    victim->oldcoords=victim->coords;
+    victim->coords=coords;
+    victim->targetrotation=targetrotation;
+    victim->rotation=targetrotation;
+    victim->victim=this;
+  }
+  if(targetanimation==winduppunchanim){
+    targetanimation=winduppunchblockedanim;
+    victim->targetanimation=blockhighleftanim;
+    victim->targetframe=1;
+    victim->target=.5;
+    victim->victim=this;
+    victim->targetrotation=targetrotation+180;
+  }
+  if(targetanimation==wolfslapanim){
+    targetanimation=winduppunchblockedanim;
+    victim->targetanimation=blockhighleftanim;
+    victim->targetframe=1;
+    victim->target=.5;
+    victim->victim=this;
+    victim->targetrotation=targetrotation+180;
+  }
+  if((targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim)&&victim->weaponactive!=-1){
+    targetanimation=swordslashparriedanim;
+    parriedrecently=.4;
+    victim->parriedrecently=0;
+    victim->targetanimation=swordslashparryanim;
+    victim->targetframe=1;
+    victim->target=.5;
+    victim->victim=this;
+    victim->targetrotation=targetrotation+180;
+
+    if(abs(Random()%20)==0||weapons.type[victim->weaponids[victim->weaponactive]]==knife){
+      if(victim->weaponactive!=-1){
+       if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
+         if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
+         if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
+         emit_sound_at(swordstaffsound, victim->coords);
        }
-}
-
-
-void Person::Reverse(){
-       if(victim->aitype==playercontrolled||hostiletime>1)
-               if(victim->targetanimation!=jumpupanim&&victim->targetanimation!=jumpdownanim&&((tutoriallevel!=1||cananger)&&hostile)){
-                       if(normaldotproduct(victim->facing,victim->coords-coords)>0&&!(victim->id==0&&difficulty<2)&&(creature!=wolftype||victim->creature==wolftype))return;
-                       if(victim->aitype!=playercontrolled&&staggerdelay>0)return;
-                       if(targetanimation==sweepanim){
-                               targetanimation=sweepreversedanim;
-                               currentanimation=sweepreversedanim;
-                               victim->currentanimation=sweepreversalanim;
-                               victim->targetanimation=sweepreversalanim;
-                       }
-                       if(targetanimation==spinkickanim){
-                               targetanimation=spinkickreversedanim;
-                               currentanimation=spinkickreversedanim;
-                               victim->currentanimation=spinkickreversalanim;
-                               victim->targetanimation=spinkickreversalanim;
-                       }
-                       if(targetanimation==upunchanim||targetanimation==rabbittacklinganim){
-                               if(targetanimation==rabbittacklinganim){
-                                       currentframe=6;
-                                       targetframe=7;
-                                       victim->currentframe=6;
-                                       victim->targetframe=7;
-                               }
-                               targetanimation=upunchreversedanim;
-                               currentanimation=upunchreversedanim;
-                               victim->currentanimation=upunchreversalanim;
-                               victim->targetanimation=upunchreversalanim;
-                       }
-                       if(targetanimation==staffhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
-                               if(victim->weaponactive!=-1){
-                                       victim->throwtogglekeydown=1;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
-                                       if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
-                                       weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[victim->num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-
-                                       victim->weaponactive=-1;
-                                       for(int j=0;j<numplayers;j++){
-                                               player[j].wentforweapon=0;
-                                }
-                               }
-
-                               targetanimation=staffhitreversedanim;
-                               currentanimation=staffhitreversedanim;
-                               victim->currentanimation=staffhitreversalanim;
-                               victim->targetanimation=staffhitreversalanim;
-                       }
-                       if(targetanimation==staffspinhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%2==0)){
-                               if(victim->weaponactive!=-1){
-                                       victim->throwtogglekeydown=1;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
-                                       if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
-                                       weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[victim->num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-
-                                       victim->weaponactive=-1;
-                                       for(int j=0;j<numplayers;j++){
-                                               player[j].wentforweapon=0;
-                                }
-                               }
-                               targetanimation=staffspinhitreversedanim;
-                               currentanimation=staffspinhitreversedanim;
-                               victim->currentanimation=staffspinhitreversalanim;
-                               victim->targetanimation=staffspinhitreversalanim;
-                       }
-                       if(targetanimation==swordslashanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
-                               if(victim->weaponactive!=-1){
-                                       victim->throwtogglekeydown=1;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
-                                       if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
-                                       weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[victim->num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-
-                                       victim->weaponactive=-1;
-                                       for(int j=0;j<numplayers;j++){
-                                               player[j].wentforweapon=0;
-                                }
-                               }
-                               targetanimation=swordslashreversedanim;
-                               currentanimation=swordslashreversedanim;
-                               victim->currentanimation=swordslashreversalanim;
-                               victim->targetanimation=swordslashreversalanim;
-                       }
-                       if(targetanimation==knifeslashstartanim&&findDistancefast(&victim->coords,&coords)<2&&(victim->id==0||Random()%4==0)){
-                               if(victim->weaponactive!=-1){
-                                       victim->throwtogglekeydown=1;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
-                                       if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
-                                       weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[victim->num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-
-                                       victim->weaponactive=-1;
-                                       for(int j=0;j<numplayers;j++){
-                                               player[j].wentforweapon=0;
-                                }
-                               }
-                               targetanimation=knifeslashreversedanim;
-                               currentanimation=knifeslashreversedanim;
-                               victim->currentanimation=knifeslashreversalanim;
-                               victim->targetanimation=knifeslashreversalanim;
-                       }
-                       if(targetanimation!=knifeslashstartanim&&targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim&&targetanimation!=winduppunchanim&&targetanimation!=wolfslapanim&&targetanimation!=swordslashanim&&targetanimation!=swordslashanim){
-                               victim->targettilt2=targettilt2;
-                               victim->currentframe=currentframe;
-                               victim->targetframe=targetframe;
-                               victim->target=target;
-                               victim->velocity=0;
-                               victim->oldcoords=victim->coords;
-                               victim->coords=coords;
-                               victim->targetrotation=targetrotation;
-                               victim->rotation=targetrotation;
-                               victim->victim=this;
-                       }
-                       if(targetanimation==winduppunchanim){
-                               targetanimation=winduppunchblockedanim;
-                               victim->targetanimation=blockhighleftanim;
-                               victim->targetframe=1;
-                               victim->target=.5;
-                               victim->victim=this;
-                               victim->targetrotation=targetrotation+180;
-                       }
-                       if(targetanimation==wolfslapanim){
-                               targetanimation=winduppunchblockedanim;
-                               victim->targetanimation=blockhighleftanim;
-                               victim->targetframe=1;
-                               victim->target=.5;
-                               victim->victim=this;
-                               victim->targetrotation=targetrotation+180;
-                       }
-                       if((targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim)&&victim->weaponactive!=-1){
-                               targetanimation=swordslashparriedanim;
-                               parriedrecently=.4;
-                               victim->parriedrecently=0;
-                               victim->targetanimation=swordslashparryanim;
-                               victim->targetframe=1;
-                               victim->target=.5;
-                               victim->victim=this;
-                               victim->targetrotation=targetrotation+180;
-
-                               if(abs(Random()%20)==0||weapons.type[victim->weaponids[victim->weaponactive]]==knife){
-                                       float gLoc[3];
-                                       float vel[3];
-                                       gLoc[0]=victim->coords.x;
-                                       gLoc[1]=victim->coords.y;
-                                       gLoc[2]=victim->coords.z;
-                                       vel[0]=velocity.x;
-                                       vel[1]=velocity.y;
-                                       vel[2]=velocity.z;
-                                       if(victim->weaponactive!=-1){
-                                               if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
-                                                       if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
-                                                       if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
-
-                                                       PlaySoundEx( swordstaffsound, samp[swordstaffsound], NULL, TRUE);
-                                                       FSOUND_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
-                                                       FSOUND_SetVolume(channels[swordstaffsound], 512);
-                                                       FSOUND_SetPaused(channels[swordstaffsound], FALSE);
-                                               }
-                                               else{
-                                                       PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, TRUE);
-                                                       FSOUND_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                                       FSOUND_SetVolume(channels[metalhitsound], 512);
-                                                       FSOUND_SetPaused(channels[metalhitsound], FALSE);
-                                               }
-                                       }
-                                       XYZ aim;
-                                       victim->Puff(righthand);
-                                       victim->target=0;
-                                       victim->targetframe=0;
-                                       victim->targetanimation=staggerbackhighanim;
-                                       victim->targetrotation=targetrotation+180;
-                                       victim->target=0;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       aim=DoRotation(facing,0,90,0)*21;
-                                       aim.y+=7;
-                                       weapons.velocity[victim->weaponids[0]]=aim*-.2;
-                                       weapons.tipvelocity[victim->weaponids[0]]=aim;
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.hitsomething[victim->weaponids[0]]=0;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-                                       victim->weaponactive=-1;
-                                       for(int i=0;i<numplayers;i++){
-                                               player[i].wentforweapon=0;
-                                }
-
-
-
-
-
-                                       /*PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, TRUE);
-                                       FSOUND_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                       FSOUND_SetVolume(channels[metalhitsound], 512);
-                                       FSOUND_SetPaused(channels[metalhitsound], FALSE);*/
-                               }
-
-                               if(abs(Random()%20)==0){
-                                       float gLoc[3];
-                                       float vel[3];
-                                       gLoc[0]=coords.x;
-                                       gLoc[1]=coords.y;
-                                       gLoc[2]=coords.z;
-                                       vel[0]=velocity.x;
-                                       vel[1]=velocity.y;
-                                       vel[2]=velocity.z;
-                                       if(weaponactive!=-1){
-                                               if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
-                                                       if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
-                                                       if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
-
-                                                       PlaySoundEx( swordstaffsound, samp[swordstaffsound], NULL, TRUE);
-                                                       FSOUND_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
-                                                       FSOUND_SetVolume(channels[swordstaffsound], 512);
-                                                       FSOUND_SetPaused(channels[swordstaffsound], FALSE);
-                                               }
-                                               else{
-                                                       PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, TRUE);
-                                                       FSOUND_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                                       FSOUND_SetVolume(channels[metalhitsound], 512);
-                                                       FSOUND_SetPaused(channels[metalhitsound], FALSE);
-                                               }
-                                       }
-
-                                       XYZ aim;
-                                       Puff(righthand);
-                                       target=0;
-                                       targetframe=0;
-                                       targetanimation=staggerbackhighanim;
-                                       targetrotation=targetrotation+180;
-                                       target=0;
-                                       weapons.owner[weaponids[0]]=-1;
-                                       aim=DoRotation(facing,0,90,0)*21;
-                                       aim.y+=7;
-                                       weapons.velocity[weaponids[0]]=aim*-.2;
-                                       weapons.tipvelocity[weaponids[0]]=aim;
-                                       weapons.hitsomething[weaponids[0]]=0;
-                                       weapons.missed[weaponids[0]]=1;
-                                       weapons.freetime[weaponids[0]]=0;
-                                       weapons.firstfree[weaponids[0]]=1;
-                                       weapons.physics[weaponids[0]]=1;
-                                       num_weapons--;
-                                       if(num_weapons){
-                                               weaponids[0]=weaponids[num_weapons];
-                                               if(weaponstuck==num_weapons)weaponstuck=0;
-                                }
-                                       weaponactive=-1;
-                                       for(int i=0;i<numplayers;i++){
-                                               player[i].wentforweapon=0;
-                                }
-
-
-                                       /*PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, TRUE);
-                                       FSOUND_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                       FSOUND_SetVolume(channels[metalhitsound], 512);
-                                       FSOUND_SetPaused(channels[metalhitsound], FALSE);*/
-                               }
-                       }
-                       if(hasvictim)
-                               if(targetanimation==knifeslashstartanim||targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim){
-                                       if((targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim)||findDistancefast(&coords,&victim->coords)>.2){
-                                               //victim->targetanimation=sweepanim;
-                                               victim->targetanimation=dodgebackanim;
-                                               victim->targetframe=0;
-                                               victim->target=0;
-                                               //victim->velocity=0;
-
-                                               XYZ rotatetarget;
-                                               rotatetarget=coords-victim->coords;
-                                               Normalise(&rotatetarget);
-                                               victim->targetrotation=-asin(0-rotatetarget.x);
-                                               victim->targetrotation*=360/6.28;
-                                               if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
-
-                                               victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
-
-                                               victim->lastattack3=victim->lastattack2;
-                                               victim->lastattack2=victim->lastattack;
-                                               victim->lastattack=victim->targetanimation;
-                                       }
-                                       else
-                                       {
-                                               victim->targetanimation=sweepanim;
-                                               victim->targetframe=0;
-                                               victim->target=0;
-
-                                               XYZ rotatetarget;
-                                               rotatetarget=coords-victim->coords;
-                                               Normalise(&rotatetarget);
-                                               victim->targetrotation=-asin(0-rotatetarget.x);
-                                               victim->targetrotation*=360/6.28;
-                                               if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
-
-                                               victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
-
-                                               victim->lastattack3=victim->lastattack2;
-                                               victim->lastattack2=victim->lastattack;
-                                               victim->lastattack=victim->targetanimation;
-                                       }
-                               }
+       else{
+         emit_sound_at(metalhitsound, victim->coords);
+       }
+      }
+      XYZ aim;
+      victim->Puff(righthand);
+      victim->target=0;
+      victim->targetframe=0;
+      victim->targetanimation=staggerbackhighanim;
+      victim->targetrotation=targetrotation+180;
+      victim->target=0;
+      weapons.owner[victim->weaponids[0]]=-1;
+      aim=DoRotation(facing,0,90,0)*21;
+      aim.y+=7;
+      weapons.velocity[victim->weaponids[0]]=aim*-.2;
+      weapons.tipvelocity[victim->weaponids[0]]=aim;
+      weapons.missed[victim->weaponids[0]]=1;
+      weapons.hitsomething[victim->weaponids[0]]=0;
+      weapons.freetime[victim->weaponids[0]]=0;
+      weapons.firstfree[victim->weaponids[0]]=1;
+      weapons.physics[victim->weaponids[0]]=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
+      victim->weaponactive=-1;
+      for(int i=0;i<numplayers;i++){
+       player[i].wentforweapon=0;
+      }
+    }
+
+    if(abs(Random()%20)==0){
+      if(weaponactive!=-1){
+       if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
+         if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
+         if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
+
+         emit_sound_at(swordstaffsound, coords);
+       }
+       else{
+         emit_sound_at(metalhitsound, coords);
+       }
+      }
+
+      XYZ aim;
+      Puff(righthand);
+      target=0;
+      targetframe=0;
+      targetanimation=staggerbackhighanim;
+      targetrotation=targetrotation+180;
+      target=0;
+      weapons.owner[weaponids[0]]=-1;
+      aim=DoRotation(facing,0,90,0)*21;
+      aim.y+=7;
+      weapons.velocity[weaponids[0]]=aim*-.2;
+      weapons.tipvelocity[weaponids[0]]=aim;
+      weapons.hitsomething[weaponids[0]]=0;
+      weapons.missed[weaponids[0]]=1;
+      weapons.freetime[weaponids[0]]=0;
+      weapons.firstfree[weaponids[0]]=1;
+      weapons.physics[weaponids[0]]=1;
+      num_weapons--;
+      if(num_weapons){
+       weaponids[0]=weaponids[num_weapons];
+       if(weaponstuck==num_weapons)weaponstuck=0;
+      }
+      weaponactive=-1;
+      for(int i=0;i<numplayers;i++){
+       player[i].wentforweapon=0;
+      }
+
+
+    }
+  }
+  if(hasvictim)
+    if(targetanimation==knifeslashstartanim||targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim){
+      if((targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim)||findDistancefast(&coords,&victim->coords)>.2){
+       victim->targetanimation=dodgebackanim;
+       victim->targetframe=0;
+       victim->target=0;
+
+       XYZ rotatetarget;
+       rotatetarget=coords-victim->coords;
+       Normalise(&rotatetarget);
+       victim->targetrotation=-asin(0-rotatetarget.x);
+       victim->targetrotation*=360/6.28;
+       if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
+
+       victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
+
+       victim->lastattack3=victim->lastattack2;
+       victim->lastattack2=victim->lastattack;
+       victim->lastattack=victim->targetanimation;
+      }
+      else
+       {
+         victim->targetanimation=sweepanim;
+         victim->targetframe=0;
+         victim->target=0;
+
+         XYZ rotatetarget;
+         rotatetarget=coords-victim->coords;
+         Normalise(&rotatetarget);
+         victim->targetrotation=-asin(0-rotatetarget.x);
+         victim->targetrotation*=360/6.28;
+         if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
+
+         victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
+
+         victim->lastattack3=victim->lastattack2;
+         victim->lastattack2=victim->lastattack;
+         victim->lastattack=victim->targetanimation;
+       }
+    }
 
-                               velocity=0;
-                               victim->velocity=0;
+  velocity=0;
+  victim->velocity=0;
 
-                               if(aitype!=playercontrolled)feint=0;
-                               if(aitype!=playercontrolled&&Random()%3==0&&escapednum<2&&difficulty==2)feint=1;
-                               if(aitype!=playercontrolled&&Random()%5==0&&escapednum<2&&difficulty==1)feint=1;
-                               if(aitype!=playercontrolled&&Random()%10==0&&escapednum<2&&difficulty==0)feint=1;
+  if(aitype!=playercontrolled)feint=0;
+  if(aitype!=playercontrolled&&Random()%3==0&&escapednum<2&&difficulty==2)feint=1;
+  if(aitype!=playercontrolled&&Random()%5==0&&escapednum<2&&difficulty==1)feint=1;
+  if(aitype!=playercontrolled&&Random()%10==0&&escapednum<2&&difficulty==0)feint=1;
 
-                               if(victim->id==0&&animation[victim->targetanimation].attack==reversal)numreversals++;
-               }
+  if(victim->id==0&&animation[victim->targetanimation].attack==reversal)numreversals++;
 }
 
 void Person::DoDamage(float howmuch){
@@ -1345,7 +1071,7 @@ void Person::DoDamage(float howmuch){
 
        if(aitype==passivetype&&damage<damagetolerance&&((tutoriallevel!=1||cananger)&&hostile))aitype=attacktypecutoff;
        if(tutoriallevel!=1&&aitype!=playercontrolled&&damage<damagetolerance&&damage>damagetolerance*2/3&&creature==rabbittype){
-               if(abs(Random()%2)==0){aitype=gethelptype; 
+               if(abs(Random()%2)==0){aitype=gethelptype;
                lastseentime=12;
                }
                else aitype=attacktypecutoff;
@@ -1363,23 +1089,12 @@ void Person::DoDamage(float howmuch){
                        flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
                        flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
                        flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
-                       sprites.MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, 3, 1);
-                       sprites.MakeSprite(bloodsprite, flatfacing2,flatvelocity2, 1,1,1, .4, 1);
-                       sprites.MakeSprite(cloudsprite, flatfacing2,flatvelocity2*0, .6,0,0, 1, .5);
+                       Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, 3, 1);
+                       Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2, 1,1,1, .4, 1);
+                       Sprite::MakeSprite(cloudsprite, flatfacing2,flatvelocity2*0, .6,0,0, 1, .5);
                }
 
-               float gLoc[3];
-               float vel[3];
-               gLoc[0]=coords.x;
-               gLoc[1]=coords.y;
-               gLoc[2]=coords.z;
-               vel[0]=0;
-               vel[1]=0;
-               vel[2]=0;
-               PlaySoundEx( splattersound, samp[splattersound], NULL, TRUE);
-               FSOUND_3D_SetAttributes(channels[splattersound], gLoc, vel);
-               FSOUND_SetVolume(channels[splattersound], 256);
-               FSOUND_SetPaused(channels[splattersound], FALSE);
+               emit_sound_at(splattersound, coords);
 
                skeleton.free=2;
                DoDamage(10000);
@@ -1389,9 +1104,7 @@ void Person::DoDamage(float howmuch){
                slomodelay=.2;
                }*/
                if(!dead&&creature==wolftype){
-                       bonus=Wolfbonus;
-                       bonustime=0;
-                       bonusvalue=300; 
+                 award_bonus(0, Wolfbonus);
                }
                dead=2;
                coords=20;
@@ -1400,14 +1113,6 @@ void Person::DoDamage(float howmuch){
        if(tutoriallevel!=1||id==0)
                if(speechdelay<=0&&!dead&&aitype!=playercontrolled){
                        int whichsound=-1;
-                       float gLoc[3];
-                       float vel[3];
-                       gLoc[0]=coords.x;
-                       gLoc[1]=coords.y;
-                       gLoc[2]=coords.z;
-                       vel[0]=velocity.x;
-                       vel[1]=velocity.y;
-                       vel[2]=velocity.z;
 
                        if(creature==wolftype){
                                int i=abs(Random()%2);
@@ -1430,10 +1135,7 @@ void Person::DoDamage(float howmuch){
                        }
 
                        if(whichsound!=-1){
-                               PlaySoundEx( whichsound, samp[whichsound], NULL, TRUE);
-                               FSOUND_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                               FSOUND_SetVolume(channels[whichsound], 512);
-                               FSOUND_SetPaused(channels[whichsound], FALSE);
+                               emit_sound_at(whichsound, coords);
                        }
                }
                speechdelay=.3;
@@ -1447,7 +1149,7 @@ void Person::DoHead(){
        static XYZ facing;
        static float lookspeed=500;
 
-       if(!freeze&&!winfreeze&&(!mainmenu||!gamestarted)){
+       if(!freeze&&!winfreeze){
 
                //head facing
                targetheadrotation=(float)((int)((0-rotation-targetheadrotation+180)*100)%36000)/100;
@@ -1685,7 +1387,7 @@ void Person::FootLand(int which, float opacity){
                        if(which==0)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
                        if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
                        //footpoint.y=coords.y;
-                       if(findDistancefast(&footpoint,&viewer))sprites.MakeSprite(cloudsprite, footpoint,footvel, 1,1,1, .5, .2*opacity);
+                       if(findDistancefast(&footpoint,&viewer))Sprite::MakeSprite(cloudsprite, footpoint,footvel, 1,1,1, .5, .2*opacity);
                }
                else if(environment==snowyenvironment&&onterrain&&terrain.getOpacity(coords.x,coords.z)<.2){
                        footvel=velocity/5;
@@ -1694,7 +1396,7 @@ void Person::FootLand(int which, float opacity){
                        if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
                        footpoint.y=terrain.getHeight(footpoint.x,footpoint.z);
                        terrainlight=terrain.getLighting(footpoint.x,footpoint.z);
-                       if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)sprites.MakeSprite(cloudsprite, footpoint,footvel*.6, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7*opacity);
+                       if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)Sprite::MakeSprite(cloudsprite, footpoint,footvel*.6, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7*opacity);
                        if(opacity>=1||detail==2)if(detail==2)if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)terrain.MakeDecal(footprintdecal,footpoint,.2,1*opacity,rotation);
                }
                else if(environment==grassyenvironment&&onterrain&&terrain.getOpacity(coords.x,coords.z)<.2){
@@ -1704,7 +1406,7 @@ void Person::FootLand(int which, float opacity){
                        if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
                        footpoint.y=terrain.getHeight(footpoint.x,footpoint.z);
                        terrainlight=terrain.getLighting(footpoint.x,footpoint.z);
-                       if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)sprites.MakeSprite(cloudsprite, footpoint,footvel*.6, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5*opacity);
+                       if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)Sprite::MakeSprite(cloudsprite, footpoint,footvel*.6, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5*opacity);
                }
                else if(environment==desertenvironment&&onterrain&&terrain.getOpacity(coords.x,coords.z)<.2){
                        footvel=velocity/5;
@@ -1713,7 +1415,7 @@ void Person::FootLand(int which, float opacity){
                        if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
                        footpoint.y=terrain.getHeight(footpoint.x,footpoint.z);
                        terrainlight=terrain.getLighting(footpoint.x,footpoint.z);
-                       if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)sprites.MakeSprite(cloudsprite, footpoint,footvel*.6, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7*opacity);
+                       if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)Sprite::MakeSprite(cloudsprite, footpoint,footvel*.6, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7*opacity);
                        if(opacity>=1||detail==2)if(detail==2)if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)terrain.MakeDecal(footprintdecal,footpoint,.2,.25*opacity,rotation);
                }
                else if(isLanding()||targetanimation==jumpupanim||isLandhard())
@@ -1723,7 +1425,7 @@ void Person::FootLand(int which, float opacity){
                        if(which==0)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
                        if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
                        //footpoint.y=coords.y;
-                       if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)sprites.MakeSprite(cloudsprite, footpoint,footvel*.6, 1,1,1, .5, .2*opacity);
+                       if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)Sprite::MakeSprite(cloudsprite, footpoint,footvel*.6, 1,1,1, .5, .2*opacity);
                }
 }
 
@@ -1732,180 +1434,11 @@ void Person::Puff(int whichlabel){
 
        footvel=0;
        footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[whichlabel]].position,0,rotation,0)*scale+coords;
-       sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .9, .3);
+       Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .9, .3);
 }
 
 
-/*
-HitStruct      Person::BulletCollideWithPlayer(XYZ start, XYZ end){
-float damage=20;
-XYZ tempbulletloc[2];
-XYZ collisionpoint;
-XYZ sparkpos;
-GLfloat M[16];
-int collide;
-float howfar;
-XYZ average;
-XYZ facing;
-int howmany;
-float distancemax;
-HitStruct hitstruct;
-hitstruct.collision=0;
-//Make bounding sphere
-average=0;
-howmany=0;
-for(int j=0;j<skeleton.num_joints;j++){
-average.x=average.x+skeleton.joints[j].position.x;
-average.y=average.y+skeleton.joints[j].position.y;
-average.z=average.z+skeleton.joints[j].position.z;
-howmany++;
-}
-average=average/howmany;
-distancemax=0;
-for(int j=0;j<skeleton.num_joints;j++){
-if(findDistancefast(average,skeleton.joints[j].position)>distancemax){
-distancemax=findDistancefast(average,skeleton.joints[j].position);
-}
-}
-distancemax=fast_sqrt(distancemax);
-//Collide with player
-if(skeleton.free<1){
-start=start-coords;
-end=end-coords;
-if(rotation)start=DoRotation(start,0,-rotation,0);
-if(rotation)end=DoRotation(end,0,-rotation,0);
-}
-tempbulletloc[0]=start;
-tempbulletloc[1]=end;
-if(sphere_line_intersection(tempbulletloc[0].x,tempbulletloc[0].y,tempbulletloc[0].z,
-tempbulletloc[1].x,tempbulletloc[1].y,tempbulletloc[1].z,
-average.x, average.y, average.z, distancemax)){
-for(int j=0;j<skeleton.num_joints;j++){
-if(skeleton.joints[j].hasparent&&skeleton.joints[j].visible){
-tempbulletloc[0]=start;
-tempbulletloc[1]=end;
-glPushMatrix();
-glLoadIdentity();
-glScalef(1,1/skeleton.joints[j].length,1);
-glRotatef(skeleton.joints[j].rotate2-90,0,0,1);
-glRotatef(skeleton.joints[j].rotate1-90,0,1,0);
-glTranslatef(  (-(skeleton.joints[j].position.x+skeleton.joints[j].parent->position.x)/2),
-(-(skeleton.joints[j].position.y+skeleton.joints[j].parent->position.y)/2),
-(-(skeleton.joints[j].position.z+skeleton.joints[j].parent->position.z)/2));
-glTranslatef(tempbulletloc[0].x,tempbulletloc[0].y,tempbulletloc[0].z);
-glGetFloatv(GL_MODELVIEW_MATRIX,M);
-tempbulletloc[0].x=M[12];
-tempbulletloc[0].y=M[13];
-tempbulletloc[0].z=M[14];
-glPopMatrix();
-glPushMatrix();
-glLoadIdentity();
-glScalef(1,1/skeleton.joints[j].length,1);
-glRotatef(skeleton.joints[j].rotate2-90,0,0,1);
-glRotatef(skeleton.joints[j].rotate1-90,0,1,0);
-glTranslatef(  (-(skeleton.joints[j].position.x+skeleton.joints[j].parent->position.x)/2),
-(-(skeleton.joints[j].position.y+skeleton.joints[j].parent->position.y)/2),
-(-(skeleton.joints[j].position.z+skeleton.joints[j].parent->position.z)/2));
-glTranslatef(tempbulletloc[1].x,tempbulletloc[1].y,tempbulletloc[1].z);
-glGetFloatv(GL_MODELVIEW_MATRIX,M);
-tempbulletloc[1].x=M[12];
-tempbulletloc[1].y=M[13];
-tempbulletloc[1].z=M[14];
-glPopMatrix();
-collide=skeletonmodels[skeleton.joints[j].modelnum].LineCheck(tempbulletloc[0],tempbulletloc[1],&collisionpoint);
-if(collide!=-1)
-{
-glPushMatrix();
-glLoadIdentity();
-glTranslatef(  (skeleton.joints[j].position.x+skeleton.joints[j].parent->position.x)/2,
-(skeleton.joints[j].position.y+skeleton.joints[j].parent->position.y)/2,
-(skeleton.joints[j].position.z+skeleton.joints[j].parent->position.z)/2);
-glRotatef(-skeleton.joints[j].rotate1+90,0,1,0);
-glRotatef(-skeleton.joints[j].rotate2+90,0,0,1);
-glScalef(1,skeleton.joints[j].length,1);
-glTranslatef(collisionpoint.x,collisionpoint.y,collisionpoint.z);
-glGetFloatv(GL_MODELVIEW_MATRIX,M);
-collisionpoint.x=M[12];
-collisionpoint.y=M[13];
-collisionpoint.z=M[14];
-glPopMatrix();
-hitstruct.collision=1;
-hitstruct.hitlocation=collisionpoint;
-hitstruct.joint1=&skeleton.joints[j];
-hitstruct.joint2=skeleton.joints[j].parent;
-}
-}
-}
-for(int j=0;j<skeleton.num_muscles;j++){
-if(skeleton.muscles[j].visible){
-tempbulletloc[0]=start;
-tempbulletloc[1]=end;
-glPushMatrix();
-glLoadIdentity();
-glScalef(1,1/skeleton.muscles[j].length,1);
-glRotatef(skeleton.muscles[j].rotate3,0,1,0);
-glRotatef(skeleton.muscles[j].rotate2-90,0,0,1);
-glRotatef(skeleton.muscles[j].rotate1-90,0,1,0);
-glTranslatef(  (-(skeleton.muscles[j].parent1->position.x+skeleton.muscles[j].parent2->position.x)/2),
-(-(skeleton.muscles[j].parent1->position.y+skeleton.muscles[j].parent2->position.y)/2),
-(-(skeleton.muscles[j].parent1->position.z+skeleton.muscles[j].parent2->position.z)/2));
-
-glTranslatef(tempbulletloc[0].x,tempbulletloc[0].y,tempbulletloc[0].z);
-glGetFloatv(GL_MODELVIEW_MATRIX,M);
-tempbulletloc[0].x=M[12];
-tempbulletloc[0].y=M[13];
-tempbulletloc[0].z=M[14];
-glPopMatrix();
-glPushMatrix();
-glLoadIdentity();
-glScalef(1,1/skeleton.muscles[j].length,1);
-glRotatef(skeleton.muscles[j].rotate3,0,1,0);
-glRotatef(skeleton.muscles[j].rotate2-90,0,0,1);
-glRotatef(skeleton.muscles[j].rotate1-90,0,1,0);
-
-glTranslatef(  (-(skeleton.muscles[j].parent1->position.x+skeleton.muscles[j].parent2->position.x)/2),
-(-(skeleton.muscles[j].parent1->position.y+skeleton.muscles[j].parent2->position.y)/2),
-(-(skeleton.muscles[j].parent1->position.z+skeleton.muscles[j].parent2->position.z)/2));
-glTranslatef(tempbulletloc[1].x,tempbulletloc[1].y,tempbulletloc[1].z);
-glGetFloatv(GL_MODELVIEW_MATRIX,M);
-tempbulletloc[1].x=M[12];
-tempbulletloc[1].y=M[13];
-tempbulletloc[1].z=M[14];
-glPopMatrix();
-collide=skeletonmodels[skeleton.muscles[j].parent1->modelnum].LineCheck(tempbulletloc[0],tempbulletloc[1],&collisionpoint);
-if(collide!=-1)
-{
-glPushMatrix();
-glLoadIdentity();
-glTranslatef(  (skeleton.muscles[j].parent1->position.x+skeleton.muscles[j].parent2->position.x)/2,
-(skeleton.muscles[j].parent1->position.y+skeleton.muscles[j].parent2->position.y)/2,
-(skeleton.muscles[j].parent1->position.z+skeleton.muscles[j].parent2->position.z)/2);
-glRotatef(-skeleton.muscles[j].rotate1+90,0,1,0);
-glRotatef(-skeleton.muscles[j].rotate2+90,0,0,1);
-glRotatef(-skeleton.muscles[j].rotate3,0,1,0);
-glScalef(1,findDistance(skeleton.muscles[j].parent1->position,skeleton.muscles[j].parent2->position),1);
-glTranslatef(collisionpoint.x,collisionpoint.y,collisionpoint.z);
-glGetFloatv(GL_MODELVIEW_MATRIX,M);
-collisionpoint.x=M[12];
-collisionpoint.y=M[13];
-collisionpoint.z=M[14];
-glPopMatrix();
-hitstruct.collision=1;
-hitstruct.hitlocation=collisionpoint;
-hitstruct.joint1=skeleton.muscles[j].parent1;
-hitstruct.joint2=skeleton.muscles[j].parent2;
-}
-}
-}
-}
-if(skeleton.free<1){
-if(rotation)hitstruct.hitlocation=DoRotation(hitstruct.hitlocation,0,rotation,0);
-hitstruct.hitlocation=hitstruct.hitlocation+coords;
-}
-return hitstruct;
-}
-*/
-void   Person::DoAnimations(){ 
+void   Person::DoAnimations(){
        if(!skeleton.free){
                int i = 0;
                static float oldtarget;
@@ -1913,7 +1446,7 @@ void      Person::DoAnimations(){
                if(isIdle()&&currentanimation!=getIdle())normalsupdatedelay=0;
 
                if(targetanimation==tempanim||currentanimation==tempanim){
-                       animation[tempanim]=tempanimation;                      
+                       animation[tempanim]=tempanimation;
                }
                if(targetanimation==jumpupanim||targetanimation==jumpdownanim||isFlip()){
                        float gLoc[3];
@@ -1926,10 +1459,10 @@ void    Person::DoAnimations(){
                        vel[2]=velocity.z;
 
                        if(id==0){
-                               FSOUND_3D_SetAttributes(channels[whooshsound], gLoc, vel);
-                               FSOUND_SetVolume(channels[whooshsound], 64*findLength(&velocity)/5);
+                               OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[whooshsound], 64*findLength(&velocity)/5);
                        }
-                       if(((velocity.y<-15)||(crouchkeydown&&velocity.y<-8))&&abs(velocity.y)*4>fast_sqrt(velocity.x*velocity.x*velocity.z*velocity.z))landhard=1;                     
+                       if(((velocity.y<-15)||(crouchkeydown&&velocity.y<-8))&&abs(velocity.y)*4>fast_sqrt(velocity.x*velocity.x*velocity.z*velocity.z))landhard=1;
                        if(!crouchkeydown&&velocity.y>=-15)landhard=0;
                }
                if((currentanimation==jumpupanim||targetanimation==jumpdownanim)/*&&velocity.y<40*/&&!isFlip()&&(!isLanding()&&!isLandhard())&&((crouchkeydown&&!crouchtogglekeydown))){
@@ -1953,7 +1486,7 @@ void      Person::DoAnimations(){
                        crouchtogglekeydown=0;
                        if(aitype==playercontrolled)feint=0;
                }
-               else 
+               else
                {
                        if(!crouchtogglekeydown&&animation[targetanimation].attack==reversed&&aitype==playercontrolled&&(escapednum<2||reversaltrain))feint=1;
                        if(!isFlip())crouchtogglekeydown=1;
@@ -1967,19 +1500,8 @@ void     Person::DoAnimations(){
                if(target>=1){
                        if(targetanimation==rollanim&&targetframe==3&&onfire){
                                onfire=0;
-                               float gLoc[3];
-                               float vel[3];
-                               gLoc[0]=coords.x;
-                               gLoc[1]=coords.y;
-                               gLoc[2]=coords.z;
-                               vel[0]=0;
-                               vel[1]=0;
-                               vel[2]=0;
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, TRUE);
-                               FSOUND_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               FSOUND_SetVolume(channels[fireendsound], 256);
-                               FSOUND_SetPaused(channels[fireendsound], FALSE);
-                               FSOUND_SetPaused(channels[stream_firesound], TRUE);
+                               emit_sound_at(fireendsound, coords);
+                               pause_sound(stream_firesound);
                                deathbleeding=0;
                        }
 
@@ -1997,27 +1519,12 @@ void    Person::DoAnimations(){
                                        //victim->DoDamage(30);
                                        if(creature==wolftype){
                                                DoBloodBig(0,255);
-                                               float gLoc[3];
-                                               float vel[3];
-                                               gLoc[0]=victim->coords.x;
-                                               gLoc[1]=victim->coords.y;
-                                               gLoc[2]=victim->coords.z;
-                                               vel[0]=velocity.x;
-                                               vel[1]=velocity.y;
-                                               vel[2]=velocity.z;
-                                               PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                               FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                               FSOUND_SetVolume(channels[clawslicesound], 128);
-                                               FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                               emit_sound_at(clawslicesound, victim->coords);
                                                victim->spurt=1;
                                                victim->DoBloodBig(1/victim->armorhead,210);
                                        }
-                                       if(id==0){
-                                               bonus=TackleBonus;
-                                               bonustime=0;
-                                               bonusvalue=5;
-                                               if(victim->aitype==gethelptype)bonusvalue=50;
-                                       }
+                                       award_bonus(id, TackleBonus,
+                                                   victim->aitype == gethelptype ? 50 : 0);
                                }
                        }
 
@@ -2027,34 +1534,10 @@ void    Person::DoAnimations(){
                                        else if(weaponactive==0)weaponactive=-1;
 
                                        if(weaponactive==-1){
-                                               float gLoc[3];
-                                               float vel[3];
-                                               gLoc[0]=coords.x;
-                                               gLoc[1]=coords.y;
-                                               gLoc[2]=coords.z;
-                                               vel[0]=velocity.x;
-                                               vel[1]=velocity.y;
-                                               vel[2]=velocity.z;
-
-                                               PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, TRUE);
-                                               FSOUND_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                               FSOUND_SetVolume(channels[knifesheathesound], 128);
-                                               FSOUND_SetPaused(channels[knifesheathesound], FALSE);   
+                                               emit_sound_at(knifesheathesound, coords);
                                        }
                                        if(weaponactive!=-1){
-                                               float gLoc[3];
-                                               float vel[3];
-                                               gLoc[0]=coords.x;
-                                               gLoc[1]=coords.y;
-                                               gLoc[2]=coords.z;
-                                               vel[0]=velocity.x;
-                                               vel[1]=velocity.y;
-                                               vel[2]=velocity.z;
-
-                                               PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, TRUE);
-                                               FSOUND_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                               FSOUND_SetVolume(channels[knifedrawsound], 128);
-                                               FSOUND_SetPaused(channels[knifedrawsound], FALSE);      
+                                               emit_sound_at(knifedrawsound, coords, 128);
                                        }
                                }
                                drawtogglekeydown=1;
@@ -2063,14 +1546,6 @@ void     Person::DoAnimations(){
                        if(tutoriallevel!=1||id==0)
                                if((animation[targetanimation].label[targetframe]&&(animation[targetanimation].label[targetframe]<5||animation[targetanimation].label[targetframe]==8))/*||(targetanimation==rollanim&&targetframe==animation[rollanim].numframes-1)*/){
                                        int whichsound;
-                                       float gLoc[3];
-                                       float vel[3];
-                                       gLoc[0]=coords.x;
-                                       gLoc[1]=coords.y;
-                                       gLoc[2]=coords.z;
-                                       vel[0]=velocity.x;
-                                       vel[1]=velocity.y;
-                                       vel[2]=velocity.z;
                                        if(onterrain){
                                                if(terrain.getOpacity(coords.x,coords.z)<.2){
                                                        if(animation[targetanimation].label[targetframe]==1)whichsound=footstepsound;
@@ -2082,11 +1557,11 @@ void    Person::DoAnimations(){
                                                                FootLand(0,1);
                                                        }
 
-                                               }       
+                                               }
                                                if(terrain.getOpacity(coords.x,coords.z)>=.2){
                                                        if(animation[targetanimation].label[targetframe]==1)whichsound=footstepsound3;
                                                        else whichsound=footstepsound4;
-                                               }                       
+                                               }
                                        }
                                        if(!onterrain){
                                                if(animation[targetanimation].label[targetframe]==1)whichsound=footstepsound3;
@@ -2104,12 +1579,7 @@ void     Person::DoAnimations(){
                                        else if(animation[targetanimation].label[targetframe]==4)whichsound=knifeswishsound;
                                        if(animation[targetanimation].label[targetframe]==8&&tutoriallevel!=1)whichsound=landsound2;
 
-                                       PlaySoundEx( whichsound, samp[whichsound], NULL, TRUE);
-                                       FSOUND_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                                       if(whichsound!=knifeswishsound)FSOUND_SetVolume(channels[whichsound], 128);
-                                       if(whichsound!=knifeswishsound&&(targetanimation==staffhitanim||targetanimation==staffgroundsmashanim||targetanimation==staffspinhitanim))FSOUND_SetVolume(channels[whichsound], 256);
-                                       if(whichsound==knifeswishsound)FSOUND_SetVolume(channels[whichsound], 512);
-                                       FSOUND_SetPaused(channels[whichsound], FALSE);
+                                       emit_sound_at(whichsound, coords, 256.);
 
                                        if(id==0)
                                                if(whichsound==footstepsound||whichsound==footstepsound2||whichsound==footstepsound3||whichsound==footstepsound4){
@@ -2122,10 +1592,7 @@ void     Person::DoAnimations(){
 
                                                if(animation[targetanimation].label[targetframe]==3){
                                                        whichsound--;
-                                                       PlaySoundEx( whichsound, samp[whichsound], NULL, TRUE);
-                                                       FSOUND_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                                                       FSOUND_SetVolume(channels[whichsound], 128);
-                                                       FSOUND_SetPaused(channels[whichsound], FALSE);
+                                                       emit_sound_at(whichsound, coords, 128.);
                                                }
                                }
 
@@ -2135,14 +1602,6 @@ void     Person::DoAnimations(){
                                                if(targetanimation!=crouchstabanim&&targetanimation!=swordgroundstabanim&&targetanimation!=staffgroundsmashanim)
                                                        if((animation[targetanimation].label[targetframe]&&(animation[targetanimation].label[targetframe]<5||animation[targetanimation].label[targetframe]==8))/*||(targetanimation==rollanim&&targetframe==animation[rollanim].numframes-1)*/){
                                                                int whichsound=-1;
-                                                               float gLoc[3];
-                                                               float vel[3];
-                                                               gLoc[0]=coords.x;
-                                                               gLoc[1]=coords.y;
-                                                               gLoc[2]=coords.z;
-                                                               vel[0]=velocity.x;
-                                                               vel[1]=velocity.y;
-                                                               vel[2]=velocity.z;
                                                                if(animation[targetanimation].label[targetframe]==4&&aitype!=playercontrolled){
                                                                        if(animation[targetanimation].attack!=neutral){
                                                                                i=abs(Random()%4);
@@ -2166,16 +1625,13 @@ void    Person::DoAnimations(){
                                                                //if(animation[targetanimation].label[targetframe]==8)whichsound=landsound2;
 
                                                                if(whichsound!=-1){
-                                                                       PlaySoundEx( whichsound, samp[whichsound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[whichsound], 512);
-                                                                       FSOUND_SetPaused(channels[whichsound], FALSE);
+                                                                       emit_sound_at(whichsound, coords);
                                                                }
                                                        }
 
 
 
-                                                       if((!wasLanding()&&!wasLandhard())&&currentanimation!=getIdle()&&(isLanding()||isLandhard())){                          
+                                                       if((!wasLanding()&&!wasLandhard())&&currentanimation!=getIdle()&&(isLanding()||isLandhard())){
                                                                FootLand(0,1);
                                                                FootLand(1,1);
                                                        }
@@ -2192,18 +1648,7 @@ void     Person::DoAnimations(){
                                                                                if(findDistancefastflat(&coords,&weapons.position[i])<4&&weaponactive==-1){
                                                                                        if(findDistancefast(&coords,&weapons.position[i])>=1){
                                                                                                if(weapons.type[i]!=staff){
-                                                                                                       float gLoc[3];
-                                                                                                       float vel[3];
-                                                                                                       gLoc[0]=coords.x;
-                                                                                                       gLoc[1]=coords.y;
-                                                                                                       gLoc[2]=coords.z;
-                                                                                                       vel[0]=velocity.x;
-                                                                                                       vel[1]=velocity.y;
-                                                                                                       vel[2]=velocity.z;
-                                                                                                       PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, TRUE);
-                                                                                                       FSOUND_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                                                       FSOUND_SetVolume(channels[knifedrawsound], 128);
-                                                                                                       FSOUND_SetPaused(channels[knifedrawsound], FALSE);
+                                                                                                       emit_sound_at(knifedrawsound, coords, 128.);
                                                                                                }
 
                                                                                                weaponactive=0;
@@ -2229,14 +1674,6 @@ void     Person::DoAnimations(){
                                                                        if((/*weapons.velocity[i].x==0&&weapons.velocity[i].y==0&&weapons.velocity[i].z==0&&*/weapons.owner[i]==-1)||(hasvictim&&weapons.owner[i]==victim->id&&victim->skeleton.free))
                                                                                if(willwork&&findDistancefastflat(&coords,&weapons.position[i])<3&&weaponactive==-1){
                                                                                        if(findDistancefast(&coords,&weapons.position[i])<1||hasvictim){
-                                                                                               float gLoc[3];
-                                                                                               float vel[3];
-                                                                                               gLoc[0]=coords.x;
-                                                                                               gLoc[1]=coords.y;
-                                                                                               gLoc[2]=coords.z;
-                                                                                               vel[0]=velocity.x;
-                                                                                               vel[1]=velocity.y;
-                                                                                               vel[2]=velocity.z;
                                                                                                bool fleshstuck=0;
                                                                                                if(weapons.owner[i]!=-1)
                                                                                                        if(victim->weaponstuck!=-1){
@@ -2246,17 +1683,11 @@ void    Person::DoAnimations(){
                                                                                                        }
                                                                                                        if(!fleshstuck){
                                                                                                                if(weapons.type[i]!=staff){
-                                                                                                                       PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, TRUE);
-                                                                                                                       FSOUND_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                                                                       FSOUND_SetVolume(channels[knifedrawsound], 128);
-                                                                                                                       FSOUND_SetPaused(channels[knifedrawsound], FALSE);
+                                                                                                                       emit_sound_at(knifedrawsound, coords, 128.);
                                                                                                                }
                                                                                                        }
                                                                                                        if(fleshstuck){
-                                                                                                               PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, TRUE);
-                                                                                                               FSOUND_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
-                                                                                                               FSOUND_SetVolume(channels[fleshstabremovesound], 128);
-                                                                                                               FSOUND_SetPaused(channels[fleshstabremovesound], FALSE);
+                                                                                                               emit_sound_at(fleshstabremovesound, coords, 128.);
                                                                                                        }
                                                                                                        weaponactive=0;
                                                                                                        if(weapons.owner[i]!=-1){
@@ -2284,7 +1715,7 @@ void      Person::DoAnimations(){
                                                                                                                footpoint=weapons.position[i];
                                                                                                                if(victim->weaponstuck!=-1){
                                                                                                                        if(victim->weaponids[victim->weaponstuck]==i){
-                                                                                                                               if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
+                                                                                                                               if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
                                                                                                                                weapons.bloody[i]=2;
                                                                                                                                weapons.blooddrip[i]=5;
                                                                                                                                victim->weaponstuck=-1;
@@ -2324,34 +1755,10 @@ void    Person::DoAnimations(){
                                                                        }
                                                                }
                                                                if(weaponactive==-1){
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=coords.x;
-                                                                       gLoc[1]=coords.y;
-                                                                       gLoc[2]=coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
-
-                                                                       PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[knifesheathesound], 128);
-                                                                       FSOUND_SetPaused(channels[knifesheathesound], FALSE);   
+                                                                       emit_sound_at(knifesheathesound, coords, 128.);
                                                                }
                                                                if(weaponactive!=-1){
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=coords.x;
-                                                                       gLoc[1]=coords.y;
-                                                                       gLoc[2]=coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
-
-                                                                       PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[knifedrawsound], 128);
-                                                                       FSOUND_SetPaused(channels[knifedrawsound], FALSE);      
+                                                                       emit_sound_at(knifedrawsound, coords, 128.);
                                                                }
                                                        }
 
@@ -2376,19 +1783,7 @@ void     Person::DoAnimations(){
                                                                if((targetanimation==rabbitrunninganim||targetanimation==wolfrunninganim)&&id==0){
                                                                        targetanimation=rabbittackleanim;
                                                                        targetframe=0;
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=coords.x;
-                                                                       gLoc[1]=coords.y;
-                                                                       gLoc[2]=coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
-
-                                                                       PlaySoundEx( jumpsound, samp[jumpsound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[jumpsound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[jumpsound], 128);
-                                                                       FSOUND_SetPaused(channels[jumpsound], FALSE);
+                                                                       emit_sound_at(jumpsound, coords);
                                                                }
 
                                                                float closestdist;
@@ -2424,19 +1819,7 @@ void     Person::DoAnimations(){
                                                                                        if(rotatetarget.z<0)targetrotation=180-targetrotation;
                                                                                }
                                                                                if(targetanimation!=rabbitrunninganim){
-                                                                                       float gLoc[3];
-                                                                                       float vel[3];
-                                                                                       gLoc[0]=coords.x;
-                                                                                       gLoc[1]=coords.y;
-                                                                                       gLoc[2]=coords.z;
-                                                                                       vel[0]=velocity.x;
-                                                                                       vel[1]=velocity.y;
-                                                                                       vel[2]=velocity.z;
-
-                                                                                       PlaySoundEx( jumpsound, samp[jumpsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[jumpsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[jumpsound], 128);
-                                                                                       FSOUND_SetPaused(channels[jumpsound], FALSE);
+                                                                                       emit_sound_at(jumpsound, coords, 128.);
                                                                                }
                                                                        }
                                                        }
@@ -2456,25 +1839,11 @@ void    Person::DoAnimations(){
                                                                                        DoBlood(.2,250);
                                                                                        if(creature==wolftype)DoBloodBig(0,250);
                                                                                }
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
                                                                                if(tutoriallevel!=1){
-                                                                                       PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[heavyimpactsound], 128);
-                                                                                       FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
+                                                                                       emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                                }
                                                                                if(creature==wolftype){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                                       FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2/victim->armorhead,175);
                                                                                }
@@ -2492,9 +1861,7 @@ void      Person::DoAnimations(){
                                                                                victim->Puff(head);
                                                                                victim->DoDamage(damagemult*100/victim->protectionhead);
 
-                                                                               if(id==0){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               SolidHitBonus(id);
                                                                        }
                                                                }
 
@@ -2506,23 +1873,9 @@ void     Person::DoAnimations(){
                                                                                        victim->spurt=1;
                                                                                        if(creature==wolftype)DoBloodBig(0,235);
                                                                                }
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-                                                                               PlaySoundEx( whooshhitsound, samp[whooshhitsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[whooshhitsound], 512);
-                                                                               FSOUND_SetPaused(channels[whooshhitsound], FALSE);
+                                                                               emit_sound_at(whooshhitsound, victim->coords);
                                                                                if(creature==wolftype){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                                       FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2,175);
                                                                                }
@@ -2550,25 +1903,11 @@ void    Person::DoAnimations(){
                                                                                if(id==0)camerashake+=.4;
                                                                                victim->spurt=1;
                                                                                DoBlood(.2,250);
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
                                                                                if(tutoriallevel!=1){
-                                                                                       PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[heavyimpactsound], 160);
-                                                                                       FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
+                                                                                       emit_sound_at(heavyimpactsound, victim->coords, 160.);
                                                                                }
                                                                                if(creature==wolftype){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                                       FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2/victim->armorhead,175);
                                                                                }
@@ -2586,16 +1925,10 @@ void    Person::DoAnimations(){
                                                                                victim->Puff(head);
                                                                                victim->DoDamage(damagemult*150/victim->protectionhead);
 
-                                                                               if(victim->damage>victim->damagetolerance){
-                                                                                       if(id==0){
-                                                                                               bonus=style;
-                                                                                               bonustime=0;
-                                                                                               bonusvalue=150;
-                                                                                       }
-                                                                               }
-                                                                               else if(id==0){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               if(victim->damage>victim->damagetolerance)
+                                                                                 award_bonus(id, style);
+                                                                               else
+                                                                                 SolidHitBonus(id);
                                                                        }
                                                                }
 
@@ -2605,25 +1938,11 @@ void    Person::DoAnimations(){
                                                                                if(id==0)camerashake+=.4;
                                                                                victim->spurt=1;
                                                                                DoBlood(.2,250);
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
                                                                                if(tutoriallevel!=1){
-                                                                                       PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[heavyimpactsound], 160);
-                                                                                       FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
+                                                                                       emit_sound_at(heavyimpactsound, victim->coords, 160.);
                                                                                }
                                                                                if(creature==wolftype){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                                       FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2/victim->armorhead,175);
                                                                                }
@@ -2641,16 +1960,10 @@ void    Person::DoAnimations(){
                                                                                victim->Puff(head);
                                                                                victim->DoDamage(damagemult*150/victim->protectionhead);
 
-                                                                               if(victim->damage>victim->damagetolerance){
-                                                                                       if(id==0){
-                                                                                               bonus=style;
-                                                                                               bonustime=0;
-                                                                                               bonusvalue=150;
-                                                                                       }
-                                                                               }
-                                                                               else if(id==0){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               if(victim->damage>victim->damagetolerance)
+                                                                                 award_bonus(id, style);
+                                                                               else
+                                                                                 SolidHitBonus(id);
                                                                        }
                                                                }
 
@@ -2662,18 +1975,7 @@ void     Person::DoAnimations(){
                                                                                        victim->spurt=1;
                                                                                        DoBlood(.2,235);
                                                                                }
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-                                                                               PlaySoundEx( whooshhitsound, samp[whooshhitsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[whooshhitsound], 512);
-                                                                               FSOUND_SetPaused(channels[whooshhitsound], FALSE);
+                                                                               emit_sound_at(whooshhitsound, victim->coords);
                                                                                victim->RagDoll(0);
                                                                                XYZ relative;
                                                                                relative=victim->coords-coords;
@@ -2693,23 +1995,7 @@ void     Person::DoAnimations(){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&victim->dead){
                                                                                escapednum=0;
                                                                                if(id==0)camerashake+=.2;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-                                                                               /*PlaySoundEx( landsound2, samp[landsound2], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[landsound2], 128);
-                                                                               FSOUND_SetPaused(channels[landsound2], FALSE);
-                                                                               */
-                                                                               PlaySoundEx( movewhooshsound, samp[movewhooshsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[movewhooshsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[movewhooshsound], 128);
-                                                                               FSOUND_SetPaused(channels[movewhooshsound], FALSE);
+                                                                               emit_sound_at(whooshhitsound, victim->coords, 128.);
 
                                                                                victim->skeleton.longdead=0;
                                                                                victim->skeleton.free=1;
@@ -2742,19 +2028,8 @@ void     Person::DoAnimations(){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9&&victim->dead){
                                                                                escapednum=0;
                                                                                if(id==0)camerashake+=.4;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=coords.x;
-                                                                               gLoc[1]=coords.y;
-                                                                               gLoc[2]=coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
                                                                                if(tutoriallevel!=1){
-                                                                                       PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[heavyimpactsound], 128);
-                                                                                       FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
+                                                                                       emit_sound_at(heavyimpactsound, coords, 128.);
                                                                                }
                                                                                XYZ relative;
                                                                                relative=victim->coords-coords;
@@ -2777,19 +2052,8 @@ void     Person::DoAnimations(){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9&&victim->skeleton.free){
                                                                                escapednum=0;
                                                                                if(id==0)camerashake+=.4;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=coords.x;
-                                                                               gLoc[1]=coords.y;
-                                                                               gLoc[2]=coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
                                                                                if(tutoriallevel!=1){
-                                                                                       PlaySoundEx( thudsound, samp[thudsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[thudsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[thudsound], 400);
-                                                                                       FSOUND_SetPaused(channels[thudsound], FALSE);
+                                                                                       emit_sound_at(thudsound, coords);
                                                                                }
 
                                                                                victim->skeleton.longdead=0;
@@ -2810,9 +2074,8 @@ void      Person::DoAnimations(){
                                                                                for(i=0;i<victim->skeleton.num_joints;i++){
                                                                                        victim->skeleton.joints[i].velocity+=relative*damagemult*20;
                                                                                }
-                                                                               if(id==0&&!victim->dead){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               if(!victim->dead)
+                                                                                 SolidHitBonus(id);
 
                                                                                victim->Puff(abdomen);
                                                                                victim->DoDamage(damagemult*20/victim->protectionhigh);
@@ -2825,26 +2088,14 @@ void    Person::DoAnimations(){
                                                                }
 
                                                                if((targetanimation==crouchstabanim||targetanimation==swordgroundstabanim)&&animation[targetanimation].label[currentframe]==5){
-                                                                       // if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9){
                                                                        //if(id==0)camerashake+=.4;
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=coords.x;
-                                                                       gLoc[1]=coords.y;
-                                                                       gLoc[2]=coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
 
                                                                        if(hasvictim)
                                                                                if(!victim->skeleton.free)hasvictim=0;
 
                                                                        if(!hasvictim){
                                                                                terrain.MakeDecal(blooddecalfast,(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2),.08,.6,Random()%360);
-                                                                               PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[knifesheathesound], 128);
-                                                                               FSOUND_SetPaused(channels[knifesheathesound], FALSE);
+                                                                               emit_sound_at(knifesheathesound, coords, 128.);
                                                                        }
 
                                                                        if(victim&&hasvictim){
@@ -2890,11 +2141,8 @@ void     Person::DoAnimations(){
                                                                                        if(whichtri!=-1){
                                                                                                if(victim->dead!=2){
                                                                                                        victim->DoDamage(abs((victim->damagetolerance-victim->permanentdamage)*2));
-                                                                                                       if(id==0&&!victim->dead){
-                                                                                                               bonus=FinishedBonus;
-                                                                                                               bonustime=0;
-                                                                                                               bonusvalue=200;
-                                                                                                       }
+                                                                                                       if (!victim->dead)
+                                                                                                         award_bonus(id, FinishedBonus);
                                                                                                }
                                                                                                if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
 
@@ -2907,10 +2155,7 @@ void     Person::DoAnimations(){
                                                                                                        victim->skeleton.joints[i].locked=0;
                                                                                                        //victim->skeleton.joints[i].velocity=0;
                                                                                                }
-                                                                                               PlaySoundEx( fleshstabsound, samp[fleshstabsound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[fleshstabsound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[fleshstabsound], 128);
-                                                                                               FSOUND_SetPaused(channels[fleshstabsound], FALSE);
+                                                                                               emit_sound_at(fleshstabsound, coords, 128);
 
                                                                                        }
                                                                                        if(whichtri!=-1||weapons.bloody[weaponids[weaponactive]]){
@@ -2919,40 +2164,21 @@ void    Person::DoAnimations(){
                                                                                        }
                                                                                        if(whichtri==-1){
                                                                                                hasvictim=0;
-                                                                                               PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[knifesheathesound], 128);
-                                                                                               FSOUND_SetPaused(channels[knifesheathesound], FALSE);                                                           
+                                                                                               emit_sound_at(knifesheathesound, coords, 128.);
                                                                                        }
                                                                                }
                                                                        }
                                                                }
 
                                                                if((targetanimation==crouchstabanim||targetanimation==swordgroundstabanim)&&animation[targetanimation].label[currentframe]==6){
-                                                                       // if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9){
-                                                                       //if(id==0)camerashake+=.4;
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=coords.x;
-                                                                       gLoc[1]=coords.y;
-                                                                       gLoc[2]=coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
                                                                        if(!hasvictim){
-                                                                               PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[knifedrawsound], 128);
-                                                                               FSOUND_SetPaused(channels[knifedrawsound], FALSE);                                                      
+                                                                               emit_sound_at(knifedrawsound, coords, 128);
                                                                        }
 
                                                                        if(victim&&hasvictim){
-                                                                               XYZ footvel,footpoint;  
+                                                                               XYZ footvel,footpoint;
 
-                                                                               PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[fleshstabremovesound], 128);
-                                                                               FSOUND_SetPaused(channels[fleshstabremovesound], FALSE);
+                                                                               emit_sound_at(fleshstabremovesound, coords, 128.);
 
                                                                                footvel=0;
                                                                                footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
@@ -3012,7 +2238,7 @@ void      Person::DoAnimations(){
 
                                                                                                for(i=0;i<victim->skeleton.num_joints;i++){
                                                                                                        victim->skeleton.joints[i].velchange=0;
-                                                                                                       victim->skeleton.joints[i].locked=0;                                                            
+                                                                                                       victim->skeleton.joints[i].locked=0;
                                                                                                        //victim->skeleton.joints[i].velocity=0;
                                                                                                }
 
@@ -3021,7 +2247,7 @@ void      Person::DoAnimations(){
                                                                                                relative.y=10;
                                                                                                Normalise(&relative);
                                                                                                //victim->Puff(abdomen);
-                                                                                               if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
+                                                                                               if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
 
                                                                                                if(victim->bloodloss<victim->damagetolerance){
                                                                                                        victim->bloodloss+=1000;
@@ -3035,7 +2261,7 @@ void      Person::DoAnimations(){
                                                                        if(!hasvictim&&onterrain){
                                                                                weapons.bloody[weaponids[weaponactive]]=0;
                                                                                weapons.blooddrip[weaponids[weaponactive]]=0;
-                                                                       }                                       
+                                                                       }
                                                                }
 
                                                                if(targetanimation==upunchanim&&animation[targetanimation].label[currentframe]==5){
@@ -3046,33 +2272,10 @@ void    Person::DoAnimations(){
                                                                                        victim->spurt=1;
                                                                                        DoBlood(.2,235);
                                                                                }
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-                                                                               //if(!victim->isIdle()||victim->damage>victim->damagetolerance-60){
-                                                                               if(1==1){
-                                                                                       if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[heavyimpactsound], 128);
-                                                                                               FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
-                                                                                       }
-                                                                               }
-                                                                               else {
-                                                                                       if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( landsound2, samp[landsound2], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[landsound2], 256);
-                                                                                               FSOUND_SetPaused(channels[landsound2], FALSE);                                                  
-                                                                                       }
+                                                                               if(tutoriallevel!=1){
+                                                                                 emit_sound_at(heavyimpactsound, victim->coords, 128);
                                                                                }
 
-                                                                               //if(!victim->isIdle()||victim->damage>victim->damagetolerance-60)
                                                                                victim->RagDoll(0);
                                                                                XYZ relative;
                                                                                relative=victim->coords-coords;
@@ -3093,9 +2296,7 @@ void      Person::DoAnimations(){
                                                                                victim->Puff(abdomen);
                                                                                victim->DoDamage(damagemult*60/victim->protectionhigh);
 
-                                                                               if(id==0){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               SolidHitBonus(id);
                                                                        }
                                                                }
 
@@ -3104,38 +2305,20 @@ void    Person::DoAnimations(){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*2){
                                                                                escapednum=0;
                                                                                if(id==0)camerashake+=.4;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-                                                                               //if(!victim->isIdle()||victim->damage>victim->damagetolerance-60){
                                                                                if(victim->damage<=victim->damagetolerance-60&&normaldotproduct(victim->facing,victim->coords-coords)<(scale*5)*(scale*5)*0&&animation[victim->targetanimation].height!=lowheight){
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( thudsound, samp[thudsound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[thudsound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[thudsound], 512);
-                                                                                               FSOUND_SetPaused(channels[thudsound], FALSE);
+                                                                                               emit_sound_at(thudsound, victim->coords);
                                                                                        }
                                                                                }
                                                                                else if(victim->damage<=victim->damagetolerance-60&&normaldotproduct(victim->facing,victim->coords-coords)<(scale*5)*(scale*5)*0&&animation[victim->targetanimation].height==lowheight){
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( whooshhitsound, samp[whooshhitsound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[whooshhitsound], 512);
-                                                                                               FSOUND_SetPaused(channels[whooshhitsound], FALSE);
+                                                                                               emit_sound_at(whooshhitsound, victim->coords);
                                                                                        }
                                                                                }
                                                                                else {
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[heavyimpactsound], 256);
-                                                                                               FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
-                                                                                       }                                                       
+                                                                                               emit_sound_at(heavyimpactsound, victim->coords);
+                                                                                       }
                                                                                }
 
                                                                                if(victim->damage>victim->damagetolerance-60||normaldotproduct(victim->facing,victim->coords-coords)>0||animation[victim->targetanimation].height==lowheight)
@@ -3160,28 +2343,14 @@ void    Person::DoAnimations(){
                                                                                victim->Puff(abdomen);
                                                                                victim->DoDamage(damagemult*60/victim->protectionhigh);
 
-                                                                               if(id==0){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               SolidHitBonus(id);
                                                                        }
                                                                }
 
                                                                if(targetanimation==blockhighleftanim&&animation[targetanimation].label[currentframe]==5){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*4){
                                                                                if(victim->id==0)camerashake+=.4;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-
-                                                                               PlaySoundEx( landsound2, samp[landsound2], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[landsound2], 256);
-                                                                               FSOUND_SetPaused(channels[landsound2], FALSE);
+                                                                               emit_sound_at(landsound2, victim->coords);
 
                                                                                Puff(righthand);
                                                                        }
@@ -3190,30 +2359,16 @@ void    Person::DoAnimations(){
                                                                if(targetanimation==swordslashparryanim&&animation[targetanimation].label[currentframe]==5){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*4){
                                                                                if(victim->id==0)camerashake+=.4;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
 
                                                                                if(weaponactive!=-1){
                                                                                        if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
                                                                                                if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
                                                                                                if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
 
-                                                                                               PlaySoundEx( swordstaffsound, samp[swordstaffsound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[swordstaffsound], 512);
-                                                                                               FSOUND_SetPaused(channels[swordstaffsound], FALSE);
+                                                                                               emit_sound_at(swordstaffsound, victim->coords);
                                                                                        }
                                                                                        else{
-                                                                                               PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[metalhitsound], 512);
-                                                                                               FSOUND_SetPaused(channels[metalhitsound], FALSE);
+                                                                                               emit_sound_at(metalhitsound, victim->coords);
                                                                                        }
                                                                                }
 
@@ -3226,7 +2381,7 @@ void      Person::DoAnimations(){
                                                                                escapednum=0;
                                                                                XYZ aim;
                                                                                weapons.owner[weaponids[0]]=-1;
-                                                                               aim=victim->coords+DoRotation(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position,0,victim->rotation,0)*victim->scale+victim->velocity*findDistance(&victim->coords,&coords)/50-(coords+DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position,0,rotation,0)*scale);                                          
+                                                                               aim=victim->coords+DoRotation(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position,0,victim->rotation,0)*victim->scale+victim->velocity*findDistance(&victim->coords,&coords)/50-(coords+DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position,0,rotation,0)*scale);
                                                                                Normalise(&aim);
                                                                                /*if(victim->targetanimation==jumpupanim||victim->targetanimation==jumpdownanim){
                                                                                aim=DoRotation(aim,(float)abs(Random()%15)-7,(float)abs(Random()%15)-7,0);
@@ -3243,35 +2398,18 @@ void    Person::DoAnimations(){
                                                                                        weaponids[0]=weaponids[num_weapons];
                                                                                }
                                                                                weaponactive=-1;
-                                                                       }               
+                                                                       }
                                                                }
 
                                                                if(targetanimation==knifeslashstartanim&&animation[targetanimation].label[currentframe]==5){
                                                                        if(hasvictim)
                                                                                if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*4.5&&/*animation[victim->targetanimation].height!=lowheight&&*/victim->targetanimation!=dodgebackanim&&victim->targetanimation!=rollanim){
                                                                                        escapednum=0;
-                                                                                       //if(Random()%2){
                                                                                        if(tutoriallevel!=1)victim->DoBloodBig(1.5/victim->armorhigh,225);
-                                                                                       //}
 
-                                                                                       if(id==0){
-                                                                                               bonus=Slicebonus;
-                                                                                               bonustime=0;
-                                                                                               bonusvalue=10;
-                                                                                       }
+                                                                                       award_bonus(id, Slicebonus);
                                                                                        if(tutoriallevel!=1){
-                                                                                               float gLoc[3];
-                                                                                               float vel[3];
-                                                                                               gLoc[0]=victim->coords.x;
-                                                                                               gLoc[1]=victim->coords.y;
-                                                                                               gLoc[2]=victim->coords.z;
-                                                                                               vel[0]=velocity.x;
-                                                                                               vel[1]=velocity.y;
-                                                                                               vel[2]=velocity.z;
-                                                                                               PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[knifeslicesound], 512);
-                                                                                               FSOUND_SetPaused(channels[knifeslicesound], FALSE);
+                                                                                               emit_sound_at(knifeslicesound, victim->coords);
                                                                                        }
                                                                                        //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
                                                                                        if(animation[victim->targetanimation].attack&&(victim->aitype!=playercontrolled||victim->targetanimation==knifeslashstartanim)&&(victim->creature==rabbittype||victim->deathbleeding<=0)){
@@ -3289,25 +2427,25 @@ void    Person::DoAnimations(){
                                                                                        if(tutoriallevel!=1)if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
                                                                                        if(tutoriallevel!=1)weapons.blooddrip[weaponids[weaponactive]]+=3;
 
-                                                                                       XYZ footvel,footpoint;  
+                                                                                       XYZ footvel,footpoint;
                                                                                        footvel=0;
                                                                                        if(skeleton.free){
                                                                                                footpoint=(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2*victim->scale+victim->coords;
                                                                                        }
                                                                                        if(!skeleton.free){
                                                                                                footpoint=DoRotation((victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2,0,victim->rotation,0)*victim->scale+victim->coords;
-                                                                                       }               
+                                                                                       }
                                                                                        if(tutoriallevel!=1){
-                                                                                               if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .6, .3);
+                                                                                               if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .6, .3);
                                                                                                footvel=DoRotation(facing,0,90,0)*.8;
                                                                                                //footvel.y-=.3;
-                                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .2, 1);
-                                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .2, 1);
+                                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .2, 1);
+                                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .2, 1);
                                                                                        }
                                                                                        if(tutoriallevel==1){
-                                                                                               sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .6, .3);
+                                                                                               Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .6, .3);
                                                                                        }
                                                                                        victim->DoDamage(damagemult*0);
                                                                                }
@@ -3315,40 +2453,21 @@ void    Person::DoAnimations(){
                                                                if(targetanimation==swordslashanim&&animation[targetanimation].label[currentframe]==5&&victim->targetanimation!=rollanim){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5&&victim->targetanimation!=dodgebackanim){
                                                                                if(victim->weaponactive==-1||normaldotproduct(victim->facing,victim->coords-coords)>0||(Random()%2==0)){
-                                                                                       if(id==0){
-                                                                                               bonus=Slashbonus;
-                                                                                               bonustime=0;
-                                                                                               bonusvalue=40;
-                                                                                       }
-                                                                                       escapednum=0; 
+                                                                                       award_bonus(id, Slashbonus);
+                                                                                       escapednum=0;
                                                                                        if(tutoriallevel!=1){
                                                                                                if(normaldotproduct(victim->facing,victim->coords-coords)<0)victim->DoBloodBig(2/victim->armorhigh,190);
                                                                                                else victim->DoBloodBig(2/victim->armorhigh,185);
                                                                                                victim->deathbleeding=1;
-                                                                                               float gLoc[3];
-                                                                                               float vel[3];
-                                                                                               gLoc[0]=victim->coords.x;
-                                                                                               gLoc[1]=victim->coords.y;
-                                                                                               gLoc[2]=victim->coords.z;
-                                                                                               vel[0]=velocity.x;
-                                                                                               vel[1]=velocity.y;
-                                                                                               vel[2]=velocity.z;
-                                                                                               PlaySoundEx( swordslicesound, samp[swordslicesound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[swordslicesound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[swordslicesound], 512);
-                                                                                               FSOUND_SetPaused(channels[swordslicesound], FALSE);
+                                                                                               emit_sound_at(swordslicesound, victim->coords);
                                                                                        }
                                                                                        //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
-                                                                                       //if(animation[victim->targetanimation].attack){
-                                                                                       //if(victim->creature==rabbittype){
                                                                                        if(tutoriallevel!=1){
                                                                                                victim->targetframe=0;
                                                                                                victim->targetanimation=staggerbackhardanim;
                                                                                                victim->targetrotation=targetrotation+180;
                                                                                                victim->target=0;
                                                                                        }
-                                                                                       //}
-                                                                                       //}
 
                                                                                        if(tutoriallevel!=1){
                                                                                                if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
@@ -3360,49 +2479,33 @@ void    Person::DoAnimations(){
                                                                                                //victim->bloodloss+=100*(6.5-findDistancefast(&coords,&victim->coords));
                                                                                                victim->DoDamage(damagemult*0);
 
-                                                                                               XYZ footvel,footpoint;  
+                                                                                               XYZ footvel,footpoint;
                                                                                                footvel=0;
                                                                                                if(skeleton.free){
                                                                                                        footpoint=(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2*victim->scale+victim->coords;
                                                                                                }
                                                                                                if(!skeleton.free){
                                                                                                        footpoint=DoRotation((victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2,0,victim->rotation,0)*victim->scale+victim->coords;
-                                                                                               }               
-                                                                                               if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
+                                                                                               }
+                                                                                               if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
                                                                                                footvel=DoRotation(facing,0,90,0)*.8;
                                                                                                footvel.y-=.3;
-                                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
-                                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
+                                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
+                                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
                                                                                        }
                                                                                }
                                                                                else {
-
-
-                                                                                       float gLoc[3];
-                                                                                       float vel[3];
-                                                                                       gLoc[0]=victim->coords.x;
-                                                                                       gLoc[1]=victim->coords.y;
-                                                                                       gLoc[2]=victim->coords.z;
-                                                                                       vel[0]=velocity.x;
-                                                                                       vel[1]=velocity.y;
-                                                                                       vel[2]=velocity.z;
                                                                                        if(victim->weaponactive!=-1){
                                                                                                if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
                                                                                                        if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
                                                                                                        if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
 
-                                                                                                       PlaySoundEx( swordstaffsound, samp[swordstaffsound], NULL, TRUE);
-                                                                                                       FSOUND_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
-                                                                                                       FSOUND_SetVolume(channels[swordstaffsound], 512);
-                                                                                                       FSOUND_SetPaused(channels[swordstaffsound], FALSE);
+                                                                                                       emit_sound_at(swordstaffsound, victim->coords);
                                                                                                }
                                                                                                else{
-                                                                                                       PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, TRUE);
-                                                                                                       FSOUND_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                                                                                       FSOUND_SetVolume(channels[metalhitsound], 512);
-                                                                                                       FSOUND_SetPaused(channels[metalhitsound], FALSE);
+                                                                                                       emit_sound_at(metalhitsound, victim->coords);
                                                                                                }
                                                                                        }
 
@@ -3434,11 +2537,6 @@ void     Person::DoAnimations(){
                                                                                                player[i].wentforweapon=0;
                                                                                        }
 
-                                                                                       /*PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[metalhitsound], 512);
-                                                                                       FSOUND_SetPaused(channels[metalhitsound], FALSE);*/
-
                                                                                }
                                                                        }
                                                                }
@@ -3452,18 +2550,7 @@ void     Person::DoAnimations(){
                                                                                        if(Random()%2||creature==wolftype){
                                                                                                victim->spurt=1;
                                                                                        }
-                                                                                       float gLoc[3];
-                                                                                       float vel[3];
-                                                                                       gLoc[0]=victim->coords.x;
-                                                                                       gLoc[1]=victim->coords.y;
-                                                                                       gLoc[2]=victim->coords.z;
-                                                                                       vel[0]=velocity.x;
-                                                                                       vel[1]=velocity.y;
-                                                                                       vel[2]=velocity.z;
-                                                                                       PlaySoundEx( staffheadsound, samp[staffheadsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[staffheadsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[staffheadsound], 256);
-                                                                                       FSOUND_SetPaused(channels[staffheadsound], FALSE);
+                                                                                       emit_sound_at(staffheadsound, victim->coords);
                                                                                }
                                                                                victim->RagDoll(0);
                                                                                XYZ relative;
@@ -3483,11 +2570,7 @@ void     Person::DoAnimations(){
                                                                                if(tutoriallevel!=1){
                                                                                        victim->DoDamage(damagemult*120/victim->protectionhigh);
 
-                                                                                       if(id==0){
-                                                                                               bonus=solidhit;
-                                                                                               bonustime=0;
-                                                                                               bonusvalue=30;
-                                                                                       }
+                                                                                       award_bonus(id, solidhit, 30);
                                                                                }
                                                                        }
                                                                }
@@ -3501,18 +2584,7 @@ void     Person::DoAnimations(){
                                                                                        if(Random()%2||creature==wolftype){
                                                                                                victim->spurt=1;
                                                                                        }
-                                                                                       float gLoc[3];
-                                                                                       float vel[3];
-                                                                                       gLoc[0]=victim->coords.x;
-                                                                                       gLoc[1]=victim->coords.y;
-                                                                                       gLoc[2]=victim->coords.z;
-                                                                                       vel[0]=velocity.x;
-                                                                                       vel[1]=velocity.y;
-                                                                                       vel[2]=velocity.z;
-                                                                                       PlaySoundEx( staffheadsound, samp[staffheadsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[staffheadsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[staffheadsound], 256);
-                                                                                       FSOUND_SetPaused(channels[staffheadsound], FALSE);
+                                                                                       emit_sound_at(staffheadsound, victim->coords);
                                                                                }
                                                                                victim->RagDoll(0);
                                                                                XYZ relative;
@@ -3529,11 +2601,7 @@ void     Person::DoAnimations(){
                                                                                victim->Puff(head);
                                                                                if(tutoriallevel!=1){victim->DoDamage(damagemult*350/victim->protectionhead);
 
-                                                                               if(id==0){
-                                                                                       bonus=solidhit;
-                                                                                       bonustime=0;
-                                                                                       bonusvalue=60;
-                                                                               }
+                                                                               award_bonus(id, solidhit, 60);
                                                                                }
                                                                        }
                                                                }
@@ -3547,18 +2615,7 @@ void     Person::DoAnimations(){
                                                                                        if(Random()%2||creature==wolftype){
                                                                                                victim->spurt=1;
                                                                                        }
-                                                                                       float gLoc[3];
-                                                                                       float vel[3];
-                                                                                       gLoc[0]=victim->coords.x;
-                                                                                       gLoc[1]=victim->coords.y;
-                                                                                       gLoc[2]=victim->coords.z;
-                                                                                       vel[0]=velocity.x;
-                                                                                       vel[1]=velocity.y;
-                                                                                       vel[2]=velocity.z;
-                                                                                       PlaySoundEx( staffbodysound, samp[staffbodysound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[staffbodysound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[staffbodysound], 256);
-                                                                                       FSOUND_SetPaused(channels[staffbodysound], FALSE);
+                                                                                       emit_sound_at(staffbodysound, victim->coords);
                                                                                }
                                                                                victim->skeleton.longdead=0;
                                                                                victim->skeleton.free=1;
@@ -3566,7 +2623,7 @@ void      Person::DoAnimations(){
 
                                                                                for(i=0;i<victim->skeleton.num_joints;i++){
                                                                                        victim->skeleton.joints[i].velchange=0;
-                                                                                       victim->skeleton.joints[i].locked=0;                                                            
+                                                                                       victim->skeleton.joints[i].locked=0;
                                                                                        //victim->skeleton.joints[i].velocity=0;
                                                                                }
 
@@ -3597,11 +2654,7 @@ void     Person::DoAnimations(){
                                                                                if(tutoriallevel!=1){victim->DoDamage(damagemult*100/victim->protectionhigh);
 
                                                                                if(!victim->dead){
-                                                                                       if(id==0){
-                                                                                               bonus=solidhit;
-                                                                                               bonustime=0;
-                                                                                               bonusvalue=40;
-                                                                                       }
+                                                                                 award_bonus(id, solidhit, 40);
                                                                                }
                                                                                }
                                                                        }
@@ -3611,22 +2664,12 @@ void    Person::DoAnimations(){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&animation[victim->targetanimation].height!=highheight){
                                                                                escapednum=0;
                                                                                if(id==0)camerashake+=.4;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
                                                                                XYZ relative;
                                                                                relative=victim->coords-coords;
                                                                                relative.y=0;
                                                                                Normalise(&relative);
 
-                                                                               if(id==0){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               SolidHitBonus(id);
 
                                                                                if(animation[victim->targetanimation].height==lowheight){
                                                                                        if(Random()%2){
@@ -3639,19 +2682,13 @@ void    Person::DoAnimations(){
                                                                                        }
                                                                                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[heavyimpactsound], 128);
-                                                                                               FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
+                                                                                               emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                                        }
                                                                                        victim->Puff(head);
                                                                                        victim->DoDamage(damagemult*100/victim->protectionhead);
                                                                                        if(victim->howactive==typesleeping)victim->DoDamage(damagemult*150/victim->protectionhead);
                                                                                        if(creature==wolftype){
-                                                                                               PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                                               FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                                               emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                                victim->spurt=1;
                                                                                                victim->DoBloodBig(2/victim->armorhead,175);
                                                                                        }
@@ -3667,18 +2704,12 @@ void    Person::DoAnimations(){
                                                                                        victim->targetrotation=targetrotation+180;
                                                                                        victim->target=0;
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( landsound2, samp[landsound2], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[landsound2], 128);
-                                                                                               FSOUND_SetPaused(channels[landsound2], FALSE);
+                                                                                               emit_sound_at(landsound2, victim->coords, 128.);
                                                                                        }
                                                                                        victim->Puff(abdomen);
                                                                                        victim->DoDamage(damagemult*30/victim->protectionhigh);
                                                                                        if(creature==wolftype){
-                                                                                               PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                                               FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                                               emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                                victim->spurt=1;
                                                                                                victim->DoBloodBig(2/victim->armorhigh,170);
                                                                                        }
@@ -3691,19 +2722,8 @@ void     Person::DoAnimations(){
                                                                        if(victim->targetanimation!=jumpupanim&&findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&victim!=this){
                                                                                escapednum=0;
                                                                                if(id==0)camerashake+=.2;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
                                                                                if(tutoriallevel!=1){
-                                                                                       PlaySoundEx( landsound2, samp[landsound2], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[landsound2], 128);
-                                                                                       FSOUND_SetPaused(channels[landsound2], FALSE);
+                                                                                       emit_sound_at(landsound2, victim->coords, 128.);
                                                                                }
                                                                                XYZ relative;
                                                                                relative=victim->coords-coords;
@@ -3742,22 +2762,17 @@ void    Person::DoAnimations(){
                                                                                        victim->targetrotation=targetrotation+180;
                                                                                        victim->target=0;
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( landsound2, samp[landsound2], NULL, TRUE);
-                                                                                               FSOUND_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                                               FSOUND_SetVolume(channels[landsound2], 128);
-                                                                                               FSOUND_SetPaused(channels[landsound2], FALSE);
+                                                                                               emit_sound_at(landsound2, victim->coords, 128.);
                                                                                        }
                                                                                        victim->Puff(abdomen);
                                                                                        victim->DoDamage(damagemult*30/victim->protectionlow);
                                                                                }
 
-                                                                               if(id==0){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               SolidHitBonus(id);
 
                                                                        }
                                                                }
-                                                       }                               
+                                                       }
                                                        if(animation[targetanimation].attack==reversal&&(!victim->feint||(victim->lastattack==victim->lastattack2&&victim->lastattack2==victim->lastattack3&&Random()%2)||targetanimation==knifefollowanim)){
                                                                if(targetanimation==spinkickreversalanim&&animation[targetanimation].label[currentframe]==7){
                                                                        escapednum=0;
@@ -3766,25 +2781,11 @@ void    Person::DoAnimations(){
                                                                                victim->spurt=1;
                                                                                DoBlood(.2,230);
                                                                        }
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=victim->coords.x;
-                                                                       gLoc[1]=victim->coords.y;
-                                                                       gLoc[2]=victim->coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
                                                                        if(tutoriallevel!=1){
-                                                                               PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[heavyimpactsound], 128);
-                                                                               FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
+                                                                               emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                        }
                                                                        if(creature==wolftype){
-                                                                               PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                               FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                               emit_sound_at(clawslicesound, victim->coords, 128);
                                                                                victim->spurt=1;
                                                                                victim->DoBloodBig(2/victim->armorhigh,170);
                                                                        }
@@ -3802,11 +2803,7 @@ void     Person::DoAnimations(){
                                                                        victim->Puff(abdomen);
                                                                        victim->DoDamage(damagemult*150/victim->protectionhigh);
 
-                                                                       if(id==0){
-                                                                               bonus=Reversal;
-                                                                               bonustime=0;
-                                                                               bonusvalue=60;
-                                                                       }
+                                                                       award_bonus(id, Reversal);
                                                                }
 
                                                                if((targetanimation==swordslashreversalanim||targetanimation==knifeslashreversalanim||targetanimation==staffhitreversalanim||targetanimation==staffspinhitreversalanim)&&animation[targetanimation].label[currentframe]==5){
@@ -3836,18 +2833,7 @@ void     Person::DoAnimations(){
                                                                                victim->spurt=1;
                                                                                DoBlood(.2,230);
                                                                        }
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=victim->coords.x;
-                                                                       gLoc[1]=victim->coords.y;
-                                                                       gLoc[2]=victim->coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
-                                                                       PlaySoundEx( whooshhitsound, samp[whooshhitsound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[whooshhitsound], 128);
-                                                                       FSOUND_SetPaused(channels[whooshhitsound], FALSE);
+                                                                       emit_sound_at(whooshhitsound, victim->coords, 128.);
                                                                        victim->RagDoll(0);
                                                                        XYZ relative;
                                                                        relative=victim->coords-oldcoords;
@@ -3870,33 +2856,14 @@ void    Person::DoAnimations(){
                                                                                victim->spurt=1;
                                                                                DoBlood(.2,230);
                                                                        }
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=victim->coords.x;
-                                                                       gLoc[1]=victim->coords.y;
-                                                                       gLoc[2]=victim->coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
 
-                                                                       if(id==0){
-                                                                               bonus=staffreversebonus;
-                                                                               bonustime=0;
-                                                                               bonusvalue=100;
-                                                                       }
+                                                                       award_bonus(id, staffreversebonus);
 
                                                                        if(tutoriallevel!=1){
-                                                                               PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[heavyimpactsound], 128);
-                                                                               FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
+                                                                               emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                        }
                                                                        victim->RagDoll(0);
-                                                                       if(id==0){
-                                                                               bonus=staffreversebonus;
-                                                                               bonustime=0;
-                                                                               bonusvalue=100;
-                                                                       }
+                                                                       award_bonus(id, staffreversebonus); // Huh, again?
 
                                                                        XYZ relative;
                                                                        relative=victim->coords-oldcoords;
@@ -3936,39 +2903,21 @@ void    Person::DoAnimations(){
                                                                        victim->Puff(abdomen);
                                                                        victim->DoDamage(damagemult*90/victim->protectionhigh);
 
-                                                                       if(id==0){
-                                                                               bonus=Reversal;
-                                                                               bonustime=0;
-                                                                               bonusvalue=60;
-                                                                       }
+                                                                       award_bonus(id, Reversal);
 
                                                                        bool doslice;
                                                                        doslice=0;
                                                                        if(weaponactive!=-1||creature==wolftype)doslice=1;
                                                                        if(creature==rabbittype&&weaponactive!=-1)if(weapons.type[weaponids[0]]==staff)doslice=0;
                                                                        if(doslice){
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
                                                                                if(weaponactive!=-1){
                                                                                        victim->DoBloodBig(2/victim->armorhigh,225);
-                                                                                       PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[knifeslicesound], 512);
-                                                                                       FSOUND_SetPaused(channels[knifeslicesound], FALSE);
+                                                                                       emit_sound_at(knifeslicesound, victim->coords);
                                                                                        if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
                                                                                        weapons.blooddrip[weaponids[weaponactive]]+=3;
                                                                                }
-                                                                               if(weaponactive==-1&&creature==wolftype){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                                       FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                               if(weaponactive==-1&&creature==wolftype){;
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2/victim->armorhigh,175);
                                                                                }
@@ -3998,30 +2947,7 @@ void     Person::DoAnimations(){
                                                                        victim->skeleton.joints[victim->skeleton.jointlabels[rightelbow]].velocity*=.5-1;
                                                                        victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity*=.7-1;
 
-                                                                       if(id==0){
-                                                                               bonus=swordreversebonus;
-                                                                               bonustime=0;
-                                                                               bonusvalue=100;
-                                                                       }
-                                                                       //victim->DoDamage(90);
-
-                                                                       /*if(weaponactive!=-1){
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=victim->coords.x;
-                                                                       gLoc[1]=victim->coords.y;
-                                                                       gLoc[2]=victim->coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
-                                                                       victim->DoBloodBig(2,225);
-                                                                       PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[knifeslicesound], 512);
-                                                                       FSOUND_SetPaused(channels[knifeslicesound], FALSE);
-                                                                       if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
-                                                                       weapons.blooddrip[weaponids[weaponactive]]+=3;
-                                                                       }*/
+                                                                       award_bonus(id, swordreversebonus);
                                                                }
 
                                                                if(hasvictim&&targetanimation==knifeslashreversalanim&&animation[targetanimation].label[currentframe]==7){
@@ -4031,19 +2957,8 @@ void     Person::DoAnimations(){
                                                                                victim->spurt=1;
                                                                                DoBlood(.2,230);
                                                                        }
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=victim->coords.x;
-                                                                       gLoc[1]=victim->coords.y;
-                                                                       gLoc[2]=victim->coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
                                                                        if(tutoriallevel!=1){
-                                                                               PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[heavyimpactsound], 128);
-                                                                               FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
+                                                                               emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                        }
                                                                        victim->RagDoll(0);
                                                                        XYZ relative;
@@ -4059,11 +2974,7 @@ void     Person::DoAnimations(){
                                                                        victim->Puff(abdomen);
                                                                        victim->DoDamage(damagemult*30/victim->protectionhigh);
 
-                                                                       if(id==0){
-                                                                               bonus=Reversal;
-                                                                               bonustime=0;
-                                                                               bonusvalue=60;
-                                                                       }
+                                                                       award_bonus(id, Reversal);
                                                                }
 
                                                                if(hasvictim&&targetanimation==sneakattackanim&&animation[targetanimation].label[currentframe]==7){
@@ -4086,38 +2997,20 @@ void    Person::DoAnimations(){
                                                                        if(weaponactive!=-1||creature==wolftype)doslice=1;
                                                                        if(creature==rabbittype&&weaponactive!=-1)if(weapons.type[weaponids[0]]==staff)doslice=0;
                                                                        if(doslice){
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
                                                                                if(weaponactive!=-1){
                                                                                        victim->DoBloodBig(200,225);
-                                                                                       PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[knifeslicesound], 512);
-                                                                                       FSOUND_SetPaused(channels[knifeslicesound], FALSE);
+                                                                                       emit_sound_at(knifeslicesound, victim->coords);
                                                                                        if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
                                                                                        weapons.blooddrip[weaponids[weaponactive]]+=5;
                                                                                }
 
                                                                                if(creature==wolftype&&weaponactive==-1){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                                       FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2,175);
                                                                                }
                                                                        }
-                                                                       if(id==0){
-                                                                               bonus=spinecrusher;
-                                                                               bonustime=0;
-                                                                               bonusvalue=100;
-                                                                       }
+                                                                       award_bonus(id, spinecrusher);
                                                                }
 
                                                                if(hasvictim&&(targetanimation==knifefollowanim||targetanimation==knifesneakattackanim)&&animation[targetanimation].label[currentframe]==5){
@@ -4131,57 +3024,36 @@ void    Person::DoAnimations(){
                                                                                        bloodvel.z=20;
                                                                                        bloodvel.y=5;
                                                                                        bloodvel=DoRotation(bloodvel,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
-                                                                                       sprites.MakeSprite(bloodsprite, DoRotation(skeleton.joints[skeleton.jointlabels[neck]].position,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
+                                                                                       Sprite::MakeSprite(bloodsprite, DoRotation(skeleton.joints[skeleton.jointlabels[neck]].position,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
                                                                                        */
-                                                                                       XYZ footvel,footpoint;  
+                                                                                       XYZ footvel,footpoint;
                                                                                        footvel=0;
                                                                                        footpoint=weapons.tippoint[weaponids[0]];
-                                                                                       if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
+                                                                                       if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
                                                                                        footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]]);
-                                                                                       sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                                       sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                                       sprites.MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
-                                                                                       sprites.MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
+                                                                                       Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                                       Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                                       Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
+                                                                                       Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
                                                                                        victim->DoBloodBig(200,195);
-                                                                                       if(id==0){
-                                                                                               bonus=tracheotomy;
-                                                                                               bonustime=0;
-                                                                                               bonusvalue=100;
-                                                                                       }
-
-                                                                                       //victim->neckspurtamount=5;
+                                                                                       award_bonus(id, tracheotomy);
                                                                                }
                                                                                if(targetanimation==knifefollowanim){
-                                                                                       if(id==0){
-                                                                                               bonus=Stabbonus;
-                                                                                               bonustime=0;
-                                                                                               bonusvalue=40;
-                                                                                       }
-                                                                                       XYZ footvel,footpoint;  
+                                                                                       award_bonus(id, Stabbonus);
+                                                                                       XYZ footvel,footpoint;
                                                                                        footvel=0;
                                                                                        footpoint=weapons.tippoint[weaponids[0]];
-                                                                                       if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
+                                                                                       if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
                                                                                        footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
-                                                                                       sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                                       sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                                       sprites.MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .2, 1);
-                                                                                       sprites.MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .2, 1);
+                                                                                       Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                                       Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                                       Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .2, 1);
+                                                                                       Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .2, 1);
 
                                                                                }
                                                                                victim->bloodloss+=10000;
                                                                                victim->velocity=0;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-                                                                               PlaySoundEx( fleshstabsound, samp[fleshstabsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[fleshstabsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[fleshstabsound], 512);
-                                                                               FSOUND_SetPaused(channels[fleshstabsound], FALSE);
+                                                                               emit_sound_at(fleshstabsound, victim->coords);
                                                                                if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
                                                                                weapons.blooddrip[weaponids[weaponactive]]+=5;
                                                                        }
@@ -4200,68 +3072,42 @@ void    Person::DoAnimations(){
                                                                                }
                                                                        }
                                                                        if(weaponactive!=-1&&animation[victim->targetanimation].attack!=reversal){
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-                                                                               PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[fleshstabremovesound], 512);
-                                                                               FSOUND_SetPaused(channels[fleshstabremovesound], FALSE);
+                                                                               emit_sound_at(fleshstabremovesound, victim->coords);
                                                                                if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
                                                                                weapons.blooddrip[weaponids[weaponactive]]+=5;
 
-                                                                               XYZ footvel,footpoint;  
+                                                                               XYZ footvel,footpoint;
                                                                                footvel=0;
                                                                                footpoint=weapons.tippoint[weaponids[0]];
-                                                                               if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
+                                                                               if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
                                                                                footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
-                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
-                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
+                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
+                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
                                                                        }
                                                                }
 
                                                                if(hasvictim&&(targetanimation==swordsneakattackanim)&&animation[targetanimation].label[currentframe]==5){
                                                                        if(weaponactive!=-1&&victim->bloodloss<victim->damagetolerance){
-                                                                               if(id==0){
-                                                                                       bonus=backstab;
-                                                                                       bonustime=0;
-                                                                                       bonusvalue=100;
-                                                                               }
+                                                                               award_bonus(id, backstab);
 
                                                                                escapednum=0;
 
-                                                                               XYZ footvel,footpoint;  
+                                                                               XYZ footvel,footpoint;
                                                                                footvel=0;
                                                                                footpoint=(weapons.tippoint[weaponids[0]]+weapons.position[weaponids[0]])/2;
-                                                                               if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
+                                                                               if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
                                                                                footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]]);
-                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,DoRotation(footvel*5,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .3, 1);
-                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .3, 1);
+                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,DoRotation(footvel*5,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .3, 1);
+                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .3, 1);
                                                                                victim->DoBloodBig(200,180);
                                                                                victim->DoBloodBig(200,215);
                                                                                victim->bloodloss+=10000;
                                                                                victim->velocity=0;
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-                                                                               PlaySoundEx( fleshstabsound, samp[fleshstabsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[fleshstabsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[fleshstabsound], 512);
-                                                                               FSOUND_SetPaused(channels[fleshstabsound], FALSE);
+                                                                               emit_sound_at(fleshstabsound, victim->coords);
                                                                                if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
                                                                                weapons.blooddrip[weaponids[weaponactive]]+=5;
                                                                        }
@@ -4274,30 +3120,19 @@ void    Person::DoAnimations(){
                                                                                victim->skeleton.joints[i].velocity=0;
                                                                        }
                                                                        if(weaponactive!=-1){
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=victim->coords.x;
-                                                                               gLoc[1]=victim->coords.y;
-                                                                               gLoc[2]=victim->coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-                                                                               PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[fleshstabremovesound], 512);
-                                                                               FSOUND_SetPaused(channels[fleshstabremovesound], FALSE);
+                                                                               emit_sound_at(fleshstabremovesound, victim->coords);
                                                                                if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
                                                                                weapons.blooddrip[weaponids[weaponactive]]+=5;
 
-                                                                               XYZ footvel,footpoint;  
+                                                                               XYZ footvel,footpoint;
                                                                                footvel=0;
                                                                                footpoint=weapons.tippoint[weaponids[0]];
-                                                                               if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
+                                                                               if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
                                                                                footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
-                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                               sprites.MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
-                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
-                                                                               sprites.MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
+                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                               Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
+                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
+                                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
                                                                        }
                                                                }
 
@@ -4308,20 +3143,9 @@ void     Person::DoAnimations(){
                                                                                victim->spurt=1;
                                                                                DoBlood(.2,240);
                                                                        }
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=victim->coords.x;
-                                                                       gLoc[1]=victim->coords.y;
-                                                                       gLoc[2]=victim->coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
                                                                        if(weaponactive==-1){
                                                                                if(tutoriallevel!=1){
-                                                                                       PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[heavyimpactsound], 128);
-                                                                                       FSOUND_SetPaused(channels[heavyimpactsound], FALSE);
+                                                                                       emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                                }
                                                                        }
                                                                        bool doslice;
@@ -4331,28 +3155,18 @@ void    Person::DoAnimations(){
                                                                        if(doslice){
                                                                                if(weaponactive!=-1){
                                                                                        victim->DoBloodBig(2/victim->armorhead,225);
-                                                                                       PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[knifeslicesound], 512);
-                                                                                       FSOUND_SetPaused(channels[knifeslicesound], FALSE);
+                                                                                       emit_sound_at(knifeslicesound, victim->coords);
                                                                                        if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
                                                                                        weapons.blooddrip[weaponids[weaponactive]]+=3;
                                                                                }
-                                                                               if(weaponactive==-1&&creature==wolftype){       
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, TRUE);
-                                                                                       FSOUND_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       FSOUND_SetVolume(channels[clawslicesound], 128);
-                                                                                       FSOUND_SetPaused(channels[clawslicesound], FALSE);
+                                                                               if(weaponactive==-1&&creature==wolftype){
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2/victim->armorhead,175);
                                                                                }
                                                                        }
 
-                                                                       if(id==0){
-                                                                               bonus=Reversal;
-                                                                               bonustime=0;
-                                                                               bonusvalue=60;
-                                                                       }
+                                                                       award_bonus(id, Reversal);
 
                                                                        victim->Puff(neck);
 
@@ -4392,11 +3206,7 @@ void     Person::DoAnimations(){
 
                                                                if(hasvictim&&(targetanimation==spinkickreversalanim||targetanimation==sweepreversalanim||targetanimation==rabbitkickreversalanim||targetanimation==upunchreversalanim||targetanimation==jumpreversalanim||targetanimation==swordslashreversalanim||targetanimation==knifeslashreversalanim||targetanimation==rabbittacklereversal||targetanimation==wolftacklereversal||targetanimation==staffhitreversalanim||targetanimation==staffspinhitreversalanim))
                                                                        if(victim->damage>victim->damagetolerance&&bonus!=reverseko){
-                                                                               if(id==0){
-                                                                                       bonus=reverseko;
-                                                                                       bonustime=0;
-                                                                                       bonusvalue=100;
-                                                                               }
+                                                                         award_bonus(id, reverseko);
                                                                        }
                                                        }
 
@@ -4412,19 +3222,7 @@ void     Person::DoAnimations(){
                                                                if(currentanimation==rabbittackleanim||currentanimation==rabbittacklinganim){
                                                                        targetanimation=rollanim;
                                                                        targetframe=3;
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=coords.x;
-                                                                       gLoc[1]=coords.y;
-                                                                       gLoc[2]=coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
-
-                                                                       PlaySoundEx( movewhooshsound, samp[movewhooshsound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[movewhooshsound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[movewhooshsound], 128);
-                                                                       FSOUND_SetPaused(channels[movewhooshsound], FALSE);
+                                                                       emit_sound_at(movewhooshsound, coords, 128.);
                                                                }
                                                                if(currentanimation==staggerbackhighanim){
                                                                        targetanimation=getIdle();
@@ -4464,34 +3262,10 @@ void    Person::DoAnimations(){
                                                                        }
 
                                                                        if(weaponactive==-1){
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=coords.x;
-                                                                               gLoc[1]=coords.y;
-                                                                               gLoc[2]=coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-
-                                                                               PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[knifesheathesound], 128);
-                                                                               FSOUND_SetPaused(channels[knifesheathesound], FALSE);   
+                                                                               emit_sound_at(knifesheathesound, coords, 128.);
                                                                        }
                                                                        if(weaponactive!=-1){
-                                                                               float gLoc[3];
-                                                                               float vel[3];
-                                                                               gLoc[0]=coords.x;
-                                                                               gLoc[1]=coords.y;
-                                                                               gLoc[2]=coords.z;
-                                                                               vel[0]=velocity.x;
-                                                                               vel[1]=velocity.y;
-                                                                               vel[2]=velocity.z;
-
-                                                                               PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, TRUE);
-                                                                               FSOUND_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                               FSOUND_SetVolume(channels[knifedrawsound], 128);
-                                                                               FSOUND_SetPaused(channels[knifedrawsound], FALSE);      
+                                                                               emit_sound_at(knifedrawsound, coords, 128.);
                                                                        }
                                                                }
                                                                if(currentanimation==rollanim){
@@ -4566,7 +3340,8 @@ void      Person::DoAnimations(){
                                                                                targetframe=3;
                                                                                velocity=facing*-8;
                                                                                velocity.y=4;
-                                                                               if(id==0)FSOUND_SetPaused(channels[whooshsound], FALSE);
+                                                                               if(id==0)
+                                                                                 resume_stream(whooshsound);
                                                                        }
                                                                        if(targetanimation==walljumprightanim){
                                                                                targetanimation=rightflipanim;
@@ -4584,7 +3359,8 @@ void      Person::DoAnimations(){
                                                                                velocity=facing*8;
                                                                                velocity.y=4;
                                                                        }
-                                                                       if(id==0)FSOUND_SetPaused(channels[whooshsound], FALSE);
+                                                                       if(id==0)
+                                                                         resume_stream(whooshsound);
                                                                }
                                                                if(targetanimation==walljumpleftanim){
                                                                        if(attackkeydown){
@@ -4624,7 +3400,8 @@ void      Person::DoAnimations(){
                                                                                velocity=DoRotation(facing,0,-30,0)*-8;
                                                                                velocity.y=4;
                                                                        }
-                                                                       if(id==0)FSOUND_SetPaused(channels[whooshsound], FALSE);
+                                                                       if(id==0)
+                                                                         resume_stream(whooshsound);
                                                                }
                                                                if(targetanimation==sneakattackanim){
                                                                        float ycoords=oldcoords.y;
@@ -4711,18 +3488,7 @@ void     Person::DoAnimations(){
                                                                        if(targetanimation==sweepreversedanim)targetrotation+=90;
                                                                        targetanimation=backhandspringanim;
                                                                        targetframe=2;
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=coords.x;
-                                                                       gLoc[1]=coords.y;
-                                                                       gLoc[2]=coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
-                                                                       PlaySoundEx( landsound, samp[landsound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[landsound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[landsound], 128);
-                                                                       FSOUND_SetPaused(channels[landsound], FALSE);
+                                                                       emit_sound_at(landsound, coords, 128);
 
                                                                        if(currentanimation==upunchreversedanim||currentanimation==swordslashreversedanim){
                                                                                targetanimation=rollanim;
@@ -4782,13 +3548,13 @@ void    Person::DoAnimations(){
                                                                                //DoDamage(100);
                                                                                RagDoll(0);
                                                                                skeleton.spinny=0;
-                                                                               if(id!=0)SolidHitBonus();
+                                                                               SolidHitBonus(!id); // FIXME: tricky id
                                                                        }
                                                                        if(feint){
                                                                                escapednum++;
                                                                                targetanimation=rollanim;
                                                                                coords+=facing;
-                                                                               if(id==0)FSOUND_SetPaused(channels[whooshsound], TRUE);
+                                                                               if(id==0)pause_sound(whooshsound);
                                                                        }
                                                                        lastfeint=0;
                                                                }
@@ -4805,13 +3571,13 @@ void    Person::DoAnimations(){
                                                                                //DoDamage(100);
                                                                                RagDoll(0);
                                                                                skeleton.spinny=0;
-                                                                               if(id!=0)SolidHitBonus();
+                                                                               SolidHitBonus(!id); // FIXME: tricky id
                                                                        }
                                                                        if(feint){
                                                                                escapednum++;
                                                                                targetanimation=rollanim;
                                                                                coords+=facing*2;
-                                                                               if(id==0)FSOUND_SetPaused(channels[whooshsound], TRUE);
+                                                                               if(id==0)pause_sound(whooshsound);
                                                                        }
                                                                        lastfeint=0;
                                                                }
@@ -4843,7 +3609,7 @@ void      Person::DoAnimations(){
                                                                targetanimation=jumpdownanim;
                                                        }
                }
-               if(!skeleton.free){             
+               if(!skeleton.free){
                        oldtarget=target;
                        if(!transspeed&&animation[targetanimation].attack!=2&&animation[targetanimation].attack!=3){
                                if(!isRun()||!wasRun()){
@@ -4883,7 +3649,7 @@ void      Person::DoAnimations(){
                        if(currentanimation!=oldcurrentanimation||targetanimation!=oldtargetanimation||((currentframe!=oldcurrentframe||targetframe!=oldtargetframe)&&!calcrot)){
                                //Old rotates
                                for(i=0;i<skeleton.num_joints;i++){
-                                       skeleton.joints[i].position=animation[currentanimation].position[i][currentframe];      
+                                       skeleton.joints[i].position=animation[currentanimation].position[i][currentframe];
                                }
 
                                skeleton.FindForwards();
@@ -4905,7 +3671,7 @@ void      Person::DoAnimations(){
 
                                //New rotates
                                for(i=0;i<skeleton.num_joints;i++){
-                                       skeleton.joints[i].position=animation[targetanimation].position[i][targetframe];        
+                                       skeleton.joints[i].position=animation[targetanimation].position[i][targetframe];
                                }
 
                                skeleton.FindForwards();
@@ -4954,20 +3720,18 @@ void    Person::DoAnimations(){
                }
 
                if(isLanding()&&landhard){
-                       //if(abs(velocity.y)>fast_sqrt(velocity.x*velocity.x*velocity.z*velocity.z)){
                        if(id==0)camerashake+=.4;
                        targetanimation=getLandhard();
                        targetframe=0;
                        target=0;
                        landhard=0;
                        transspeed=15;
-                       //}
                }
        }
        //skeleton.DoConstraints();
 }
 
-void   Person::DoStuff(){
+void   Person::DoStuff(){
        static XYZ terrainnormal;
        static XYZ flatfacing;
        static XYZ flatvelocity;
@@ -5032,12 +3796,6 @@ void     Person::DoStuff(){
                        targetanimation=getRun();
                        targetframe=0;
                }
-               /*static float toggledelay;
-               toggledelay-=multiplier;
-               if(toggledelay<0){
-               toggledelay=1;
-               if(Random()%3==0)superruntoggle=1-superruntoggle;
-               }*/
        }
        if(weaponactive==-1&&num_weapons>0){
                if(weapons.type[weaponids[0]]==staff){
@@ -5051,7 +3809,7 @@ void      Person::DoStuff(){
                /*if(aitype!=playercontrolled)*/
                deathbleeding=1;
                if(burnt>.6)burnt=.6;
-               FSOUND_SetVolume(channels[stream_firesound], 256+256*findLength(&velocity)/3);
+               OPENAL_SetVolume(channels[stream_firesound], 256+256*findLength(&velocity)/3);
 
                if(targetanimation==jumpupanim||targetanimation==jumpdownanim||isFlip()){
                        float gLoc[3];
@@ -5064,8 +3822,8 @@ void      Person::DoStuff(){
                        vel[2]=velocity.z;
 
                        if(id==0){
-                               FSOUND_3D_SetAttributes(channels[whooshsound], gLoc, vel);
-                               FSOUND_SetVolume(channels[whooshsound], 64*findLength(&velocity)/5);
+                               OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[whooshsound], 64*findLength(&velocity)/5);
                        }
                }
        }
@@ -5076,7 +3834,7 @@ void      Person::DoStuff(){
                if(skeleton.free)flatvelocity=skeleton.joints[howmany].velocity*scale/2;
                if(!skeleton.free)flatfacing=DoRotation(DoRotation(DoRotation(skeleton.joints[howmany].position,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords;
                if(skeleton.free)flatfacing=skeleton.joints[howmany].position*scale+coords;
-               sprites.MakeSprite(flamesprite, flatfacing,flatvelocity, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
+               Sprite::MakeSprite(flamesprite, flatfacing,flatvelocity, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
        }
 
        while(flamedelay<0&&!onfire&&tutoriallevel==1&&id!=0){
@@ -5086,14 +3844,14 @@ void    Person::DoStuff(){
                if(skeleton.free)flatvelocity=skeleton.joints[howmany].velocity*scale/2;
                if(!skeleton.free)flatfacing=DoRotation(DoRotation(DoRotation(skeleton.joints[howmany].position,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords;
                if(skeleton.free)flatfacing=skeleton.joints[howmany].position*scale+coords;
-               sprites.MakeSprite(breathsprite, flatfacing,flatvelocity, 1,1,1, .6+(float)abs(Random()%100)/200-.25, .3);      
+               Sprite::MakeSprite(breathsprite, flatfacing,flatvelocity, 1,1,1, .6+(float)abs(Random()%100)/200-.25, .3);
        }
 
        if(bleeding>0){
                bleeding-=multiplier*.3;
                if(bloodtoggle==2){
                        glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
-                       if(bleeding<=0&&(detail!=2||osx))DoMipmaps(5,0,0,skeleton.skinsize,skeleton.skinsize);
+                       if(bleeding<=0&&(detail!=2||osx))DoMipmaps();
                }
        }
 
@@ -5113,8 +3871,8 @@ void      Person::DoStuff(){
                        }
                        if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/40,rotation+((float)(Random()%100))/40,0)*scale;
                        if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/40,((float)(Random()%100))/40,0)*scale;
-                       if(skeleton.free)sprites.MakeSprite(bloodsprite, (skeleton.joints[skeleton.jointlabels[neck]].position+(skeleton.joints[skeleton.jointlabels[neck]].position-skeleton.joints[skeleton.jointlabels[head]].position)/5)*scale+coords,bloodvel, 1,1,1, .05, .9);
-                       if(!skeleton.free)sprites.MakeSprite(bloodsprite, DoRotation(skeleton.joints[skeleton.jointlabels[neck]].position+(skeleton.joints[skeleton.jointlabels[neck]].position-skeleton.joints[skeleton.jointlabels[head]].position)/5,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, .9);
+                       if(skeleton.free)Sprite::MakeSprite(bloodsprite, (skeleton.joints[skeleton.jointlabels[neck]].position+(skeleton.joints[skeleton.jointlabels[neck]].position-skeleton.joints[skeleton.jointlabels[head]].position)/5)*scale+coords,bloodvel, 1,1,1, .05, .9);
+                       if(!skeleton.free)Sprite::MakeSprite(bloodsprite, DoRotation(skeleton.joints[skeleton.jointlabels[neck]].position+(skeleton.joints[skeleton.jointlabels[neck]].position-skeleton.joints[skeleton.jointlabels[head]].position)/5,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, .9);
                        neckspurtparticledelay=.05;
                }
                if(neckspurtdelay<0){
@@ -5132,18 +3890,14 @@ void    Person::DoStuff(){
                                bloodvel=0;
                                if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[abdomen]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
                                if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
-                               if(skeleton.free)sprites.MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[abdomen]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
-                               if(!skeleton.free)sprites.MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[abdomen]].position+skeleton.joints[skeleton.jointlabels[abdomen]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
-                       }                       
+                               if(skeleton.free)Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[abdomen]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
+                               if(!skeleton.free)Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[abdomen]].position+skeleton.joints[skeleton.jointlabels[abdomen]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
+                       }
                }
-               /*if(id==0){
-               bloodloss+=deathbleeding*40;
-               deathbleeding=0;
-               }*/
                bloodloss+=deathbleeding*multiplier*80;
                deathbleeding-=multiplier*1.6;
                //if(id==0)deathbleeding-=multiplier*.2;
-               if(deathbleeding<0)deathbleeding=0;     
+               if(deathbleeding<0)deathbleeding=0;
                if(bloodloss>damagetolerance&&animation[targetanimation].attack==neutral){
                        if(weaponactive!=-1){
                                weapons.owner[weaponids[0]]=-1;
@@ -5175,9 +3929,7 @@ void      Person::DoStuff(){
                        }
 
                        if(!dead&&creature==wolftype){
-                               bonus=Wolfbonus;
-                               bonustime=0;
-                               bonusvalue=300; 
+                         award_bonus(0, Wolfbonus);
                        }
                        dead=2;
                        if(targetanimation==knifefollowedanim&&!skeleton.free){
@@ -5213,10 +3965,6 @@ void     Person::DoStuff(){
                if(endy>skeleton.skinsize-1){endy=skeleton.skinsize-1;bleeding=0;}
                if(endx<startx)endx=startx;
                if(endy<starty)endy=starty;
-               /*int startx=0;
-               int starty=0;
-               int endx=256;
-               int endy=256;*/
 
                for(i=startx;i<endx;i++){
                        for(j=starty;j<endy;j++){
@@ -5230,7 +3978,7 @@ void      Person::DoStuff(){
                }
                if(!osx&&detail>1){
                        glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
-                       DoMipmaps(0,startx,endx,starty,endy);
+                       DoMipmaps();
                }
 
                if(!skeleton.free){
@@ -5359,7 +4107,7 @@ void      Person::DoStuff(){
                                if(!skeleton.free)footpoint=DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords;
                                if(skeleton.free)footpoint=((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2)*scale+coords;
                                if(targetanimation==sleepanim)footvel=DoRotation(footvel,0,90,0);
-                               sprites.MakeSprite(breathsprite, footpoint+footvel*.2,footvel*.4, 1,1,1, .4, .3);                                                       
+                               Sprite::MakeSprite(breathsprite, footpoint+footvel*.2,footvel*.4, 1,1,1, .4, .3);
                        }
                }
 
@@ -5447,7 +4195,7 @@ void      Person::DoStuff(){
                        }
                }
        }
-       if(creature==wolftype){                         
+       if(creature==wolftype){
                twitchdelay2-=multiplier*1.5;
                if(tailmorphend!=0)
                        if((isRun()||targetanimation==jumpupanim||targetanimation==jumpdownanim||targetanimation==backflipanim)&&!skeleton.free){
@@ -5556,9 +4304,7 @@ void      Person::DoStuff(){
                unconscioustime=0;
 
                if(creature==wolftype){
-                       bonus=Wolfbonus;
-                       bonustime=0;
-                       bonusvalue=300; 
+                 award_bonus(0, Wolfbonus);
                }
 
                RagDoll(0);
@@ -5592,12 +4338,6 @@ void     Person::DoStuff(){
                }
 
                damage+=20;
-
-               /*
-               if(bloodloss<damagetolerance)
-               for(i=0;i<skeleton.num_joints;i++){
-               skeleton.joints[i].velocity*=1.5;       
-               }*/
        }
 
        //if(dead)damage-=multiplier/4;
@@ -5622,7 +4362,7 @@ void      Person::DoStuff(){
                skeleton.free=1;
                damage-=20;
                for(i=0;i<skeleton.num_joints;i++){
-                       skeleton.joints[i].velocity=0;  
+                       skeleton.joints[i].velocity=0;
                }
        }
        if(permanentdamage>damagetolerance&&dead!=2){
@@ -5652,16 +4392,11 @@ void    Person::DoStuff(){
                bled=0;
 
                if(!dead&&creature==wolftype){
-                       bonus=Wolfbonus;
-                       bonustime=0;
-                       bonusvalue=300; 
+                 award_bonus(0, Wolfbonus);
                }
 
-               if(id!=0&&unconscioustime<.1&&(bonus!=spinecrusher||bonustime>1)&&(bonus!=FinishedBonus||bonustime>1)&&bloodloss<damagetolerance){
-                       bonus=touchofdeath;
-                       bonustime=0;
-                       bonusvalue=150;
-               }
+               if(unconscioustime<.1&&(bonus!=spinecrusher||bonustime>1)&&(bonus!=FinishedBonus||bonustime>1)&&bloodloss<damagetolerance)
+                 award_bonus(id, touchofdeath);
                if(id!=0&&unconscioustime>.1){
                        numafterkill++;
                }
@@ -5670,26 +4405,11 @@ void    Person::DoStuff(){
 
                skeleton.free=1;
 
-               float gLoc[3];
-               float vel[3];
-               gLoc[0]=coords.x;
-               gLoc[1]=coords.y;
-               gLoc[2]=coords.z;
-               vel[0]=velocity.x;
-               vel[1]=velocity.y;
-               vel[2]=velocity.z;
-               PlaySoundEx( breaksound, samp[breaksound], NULL, TRUE);
-               FSOUND_3D_SetAttributes(channels[breaksound], gLoc, vel);
-               FSOUND_SetVolume(channels[breaksound], 512);
-               FSOUND_SetPaused(channels[breaksound], FALSE);
-               /*if(id==0||findDistancefast(&coords,&viewer)<50){
-               slomo=1;
-               slomodelay=.2;
-               }*/
+               emit_sound_at(breaksound, coords);
        }
 
        if(skeleton.free==1){
-               if(id==0)FSOUND_SetPaused(channels[whooshsound], TRUE);
+               if(id==0)pause_sound(whooshsound);
 
                if(!dead){
                        //If knocked over, open hands and close mouth
@@ -5711,11 +4431,8 @@ void     Person::DoStuff(){
                skeleton.DoGravity(&scale);
                float damageamount;
                damageamount=skeleton.DoConstraints(&coords,&scale)*5;
-               if(id!=0&&damage>damagetolerance-damageamount&&!dead&&(bonus!=spinecrusher||bonustime>1)&&(bonus!=style||bonustime>1)&&(bonus!=cannon||bonustime>1)){
-                       bonus=deepimpact;
-                       bonustime=0;
-                       bonusvalue=50;
-               }
+               if(damage>damagetolerance-damageamount&&!dead&&(bonus!=spinecrusher||bonustime>1)&&(bonus!=style||bonustime>1)&&(bonus!=cannon||bonustime>1))
+                 award_bonus(id, deepimpact);
                DoDamage(damageamount/((protectionhigh+protectionhead+protectionlow)/3));
 
                average=0;
@@ -5755,7 +4472,7 @@ void      Person::DoStuff(){
                        skeleton.longdead+=(2000-findLength(&average))*multiplier+multiplier;
                        if(skeleton.longdead>2000){
                                if(skeleton.longdead>6000){
-                                       if(id==0)FSOUND_SetPaused(channels[whooshsound], TRUE);
+                                       if(id==0)pause_sound(whooshsound);
                                        skeleton.free=3;
                                        DrawSkeleton();
                                        skeleton.free=2;
@@ -5811,7 +4528,7 @@ void      Person::DoStuff(){
                                if(objects.type[i]!=treeleavestype&&objects.type[i]!=bushtype&&objects.type[i]!=firetype){
                                        colviewer=startpoint;
                                        coltarget=endpoint;
-                                       if(objects.model[i].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[i],&objects.rotation[i])!=-1)canrecover=0;      
+                                       if(objects.model[i].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[i],&objects.rotation[i])!=-1)canrecover=0;
                                }
                        }
                        if(canrecover){
@@ -5839,12 +4556,8 @@ void     Person::DoStuff(){
                                if(terrainnormal.z<0)targetrotation=180-targetrotation;
                                rotation=targetrotation;
 
-                               //if(skeleton.forward.y<0){
                                targetframe=0;
-                               //}
-                               //if(skeleton.forward.y>-.3){
                                //      targetframe=2;
-                               //}
                                targetanimation=flipanim;
                                crouchtogglekeydown=1;
                                target=0;
@@ -5868,7 +4581,7 @@ void      Person::DoStuff(){
                if(findLength(&average)<10&&!dead&&skeleton.free){
                        skeleton.longdead+=(2000-findLength(&average))*multiplier+multiplier;
                        if(skeleton.longdead>(damage+500)*1.5){
-                               if(id==0)FSOUND_SetPaused(channels[whooshsound], TRUE);
+                               if(id==0)pause_sound(whooshsound);
                                skeleton.free=0;
                                velocity=0;
                                XYZ middle;
@@ -5987,18 +4700,7 @@ void     Person::DoStuff(){
                                }
                                target=0;
 
-                               float gLoc[3];
-                               float vel[3];
-                               gLoc[0]=coords.x;
-                               gLoc[1]=coords.y;
-                               gLoc[2]=coords.z;
-                               vel[0]=velocity.x;
-                               vel[1]=velocity.y;
-                               vel[2]=velocity.z;
-                               PlaySoundEx( movewhooshsound, samp[movewhooshsound], NULL, TRUE);
-                               FSOUND_3D_SetAttributes(channels[movewhooshsound], gLoc, vel);
-                               FSOUND_SetVolume(channels[movewhooshsound], 128);
-                               FSOUND_SetPaused(channels[movewhooshsound], FALSE);
+                               emit_sound_at(movewhooshsound, coords, 128.);
 
                                currentanimation=targetanimation;
                                currentframe=targetframe-1;
@@ -6027,18 +4729,7 @@ void     Person::DoStuff(){
                                        if(findDistancefastflat(&coords,&objects.position[i])<objects.scale[i]*objects.scale[i]*12&&findDistancefast(&coords,&objects.position[i])<objects.scale[i]*objects.scale[i]*49){
                                                if(onfire){
                                                        if(!objects.onfire[i]){
-                                                               float gLoc[3];
-                                                               float vel[3];
-                                                               gLoc[0]=objects.position[i].x;
-                                                               gLoc[1]=objects.position[i].y;
-                                                               gLoc[2]=objects.position[i].z;
-                                                               vel[0]=0;
-                                                               vel[1]=0;
-                                                               vel[2]=0;
-                                                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, TRUE);
-                                                               FSOUND_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                                                               FSOUND_SetVolume(channels[firestartsound], 256);
-                                                               FSOUND_SetPaused(channels[firestartsound], FALSE);
+                                                               emit_sound_at(firestartsound, objects.position[i]);
                                                        }
                                                        objects.onfire[i]=1;
                                                }
@@ -6052,18 +4743,7 @@ void     Person::DoStuff(){
                                                if(findDistancefastflat(&coords,&objects.position[i])<objects.scale[i]*objects.scale[i]*12&&findDistancefast(&coords,&objects.position[i])<objects.scale[i]*objects.scale[i]*49){
                                                        if(onfire){
                                                                if(!objects.onfire[i]){
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=objects.position[i].x;
-                                                                       gLoc[1]=objects.position[i].y;
-                                                                       gLoc[2]=objects.position[i].z;
-                                                                       vel[0]=0;
-                                                                       vel[1]=0;
-                                                                       vel[2]=0;
-                                                                       PlaySoundEx( firestartsound, samp[firestartsound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[firestartsound], 256);
-                                                                       FSOUND_SetPaused(channels[firestartsound], FALSE);
+                                                                       emit_sound_at(firestartsound, objects.position[i]);
                                                                }
                                                                objects.onfire[i]=1;
                                                        }
@@ -6077,18 +4757,7 @@ void     Person::DoStuff(){
                                                                XYZ tempvel;
                                                                XYZ pos;
 
-                                                               float gLoc[3];
-                                                               float vel[3];
-                                                               gLoc[0]=coords.x;
-                                                               gLoc[1]=coords.y;
-                                                               gLoc[2]=coords.z;
-                                                               vel[0]=velocity.x;
-                                                               vel[1]=velocity.y;
-                                                               vel[2]=velocity.z;
-                                                               PlaySoundEx( bushrustle, samp[bushrustle], NULL, TRUE);
-                                                               FSOUND_3D_SetAttributes(channels[bushrustle], gLoc, vel);
-                                                               FSOUND_SetVolume(channels[bushrustle], 40*findLength(&velocity));
-                                                               FSOUND_SetPaused(channels[bushrustle], FALSE);
+                                                               emit_sound_at(bushrustle, coords, 40*findLength(&velocity));
 
                                                                if(id==0){
                                                                        envsound[numenvsounds]=coords;
@@ -6111,8 +4780,8 @@ void      Person::DoStuff(){
                                                                                        pos.x+=float(abs(Random()%100)-50)/200;
                                                                                        pos.y+=float(abs(Random()%100)-50)/200;
                                                                                        pos.z+=float(abs(Random()%100)-50)/200;
-                                                                                       sprites.MakeSprite(splintersprite, pos,tempvel*.5+velocity*float(abs(Random()%100))/100, 165/255+float(abs(Random()%100)-50)/400,0,0, .2+float(abs(Random()%100)-50)/1300, 1);
-                                                                                       sprites.special[sprites.numsprites-1]=1;
+                                                                                       Sprite::MakeSprite(splintersprite, pos,tempvel*.5+velocity*float(abs(Random()%100))/100, 165/255+float(abs(Random()%100)-50)/400,0,0, .2+float(abs(Random()%100)-50)/1300, 1);
+                                                                                       Sprite::setLastSpriteSpecial(1);
                                                                                }
                                                                                howmany=findLength(&velocity)*4;
                                                                                if(detail==2)
@@ -6126,12 +4795,12 @@ void    Person::DoStuff(){
                                                                                                        pos.x+=float(abs(Random()%100)-50)/200;
                                                                                                        pos.y+=float(abs(Random()%100)-50)/200;
                                                                                                        pos.z+=float(abs(Random()%100)-50)/200;
-                                                                                                       sprites.MakeSprite(splintersprite, pos,tempvel*.3+velocity*float(abs(Random()%100))/100/2, 1,1,1, .1, 1);
-                                                                                                       sprites.special[sprites.numsprites-1]=2;
+                                                                                                       Sprite::MakeSprite(splintersprite, pos,tempvel*.3+velocity*float(abs(Random()%100))/100/2, 1,1,1, .1, 1);
+                                                                                                       Sprite::setLastSpriteSpecial(2);
                                                                                                }
                                                        }
                                                        objects.rotx[i]+=velocity.x*multiplier*6;
-                                                       objects.roty[i]+=velocity.z*multiplier*6;       
+                                                       objects.roty[i]+=velocity.z*multiplier*6;
                                                        objects.messedwith[i]=.5;
                                                }
                                                XYZ tempcoord;
@@ -6144,39 +4813,11 @@ void    Person::DoStuff(){
                                                                tempcoord+=objects.position[i];
                                                        }
                                                        if(findDistancefastflat(&tempcoord,&objects.position[i])<objects.scale[i]*objects.scale[i]*8&&findDistancefast(&tempcoord,&objects.position[i])<objects.scale[i]*objects.scale[i]*300&&tempcoord.y>objects.position[i].y+3*objects.scale[i]){
-                                                               /*if(onfire){
-                                                               if(!objects.onfire[i]){
-                                                               float gLoc[3];
-                                                               float vel[3];
-                                                               gLoc[0]=objects.position[i].x;
-                                                               gLoc[1]=objects.position[i].y;
-                                                               gLoc[2]=objects.position[i].z;
-                                                               vel[0]=0;
-                                                               vel[1]=0;
-                                                               vel[2]=0;
-                                                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, TRUE);
-                                                               FSOUND_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                                                               FSOUND_SetVolume(channels[firestartsound], 256);
-                                                               FSOUND_SetPaused(channels[firestartsound], FALSE);
-                                                               objects.onfire[i]=1;
-                                                               }
-                                                               }*/
                                                                if(objects.messedwith[i]<=0){
                                                                        XYZ tempvel;
                                                                        XYZ pos;
 
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=coords.x;
-                                                                       gLoc[1]=coords.y;
-                                                                       gLoc[2]=coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
-                                                                       PlaySoundEx( bushrustle, samp[bushrustle], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[bushrustle], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[bushrustle], 40*findLength(&velocity));
-                                                                       FSOUND_SetPaused(channels[bushrustle], FALSE);
+                                                                       emit_sound_at(bushrustle, coords, 40*findLength(&velocity));
 
                                                                        if(id==0){
                                                                                envsound[numenvsounds]=coords;
@@ -6200,8 +4841,8 @@ void      Person::DoStuff(){
                                                                                                pos.x+=float(abs(Random()%100)-50)/150;
                                                                                                pos.y+=float(abs(Random()%100)-50)/150;
                                                                                                pos.z+=float(abs(Random()%100)-50)/150;
-                                                                                               sprites.MakeSprite(splintersprite, pos,tempvel*.5+velocity*float(abs(Random()%100))/100, 165/255+float(abs(Random()%100)-50)/400,0,0, .2+float(abs(Random()%100)-50)/1300, 1);
-                                                                                               sprites.special[sprites.numsprites-1]=1;
+                                                                                               Sprite::MakeSprite(splintersprite, pos,tempvel*.5+velocity*float(abs(Random()%100))/100, 165/255+float(abs(Random()%100)-50)/400,0,0, .2+float(abs(Random()%100)-50)/1300, 1);
+                                                                                               Sprite::setLastSpriteSpecial(1);
                                                                                        }
                                                                                        howmany=findLength(&velocity)*4;
                                                                                        if(detail==2)
@@ -6216,16 +4857,16 @@ void    Person::DoStuff(){
                                                                                                                pos.x+=float(abs(Random()%100)-50)/150;
                                                                                                                pos.y+=float(abs(Random()%100)-50)/150;
                                                                                                                pos.z+=float(abs(Random()%100)-50)/150;
-                                                                                                               sprites.MakeSprite(splintersprite, pos,tempvel*.3+velocity*float(abs(Random()%100))/100/2, 1,1,1, .1, 1);
-                                                                                                               sprites.special[sprites.numsprites-1]=2;
+                                                                                                               Sprite::MakeSprite(splintersprite, pos,tempvel*.3+velocity*float(abs(Random()%100))/100/2, 1,1,1, .1, 1);
+                                                                                                               Sprite::setLastSpriteSpecial(2);
                                                                                                        }
                                                                }
                                                                objects.messedwith[i]=.5;
-                                                       }       
+                                                       }
                                                }
                        }
 
-                       if(!skeleton.free){     
+                       if(!skeleton.free){
                                bool play;
                                play=0;
                                if((stunned>0||surprised>0)&&numplayers>2&&aitype!=passivetype)play=1;
@@ -6234,14 +4875,6 @@ void     Person::DoStuff(){
                                if(tutoriallevel==1&&id!=0)play=0;
                                if(play&&aitype!=playercontrolled){
                                        int whichsound=-1;
-                                       float gLoc[3];
-                                       float vel[3];
-                                       gLoc[0]=coords.x;
-                                       gLoc[1]=coords.y;
-                                       gLoc[2]=coords.z;
-                                       vel[0]=velocity.x;
-                                       vel[1]=velocity.y;
-                                       vel[2]=velocity.z;
                                        i=abs(Random()%4);
                                        if(speechdelay<=0){
                                                if(creature==rabbittype){
@@ -6254,16 +4887,11 @@ void    Person::DoStuff(){
                                                }
                                        }
                                        speechdelay=.3;
-                                       //else if(animation[targetanimation].label[targetframe]==4)whichsound=knifeswishsound;
-                                       //if(animation[targetanimation].label[targetframe]==8)whichsound=landsound2;
 
                                        if(whichsound!=-1){
-                                               PlaySoundEx( whichsound, samp[whichsound], NULL, TRUE);
-                                               FSOUND_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                                               FSOUND_SetVolume(channels[whichsound], 512);
-                                               FSOUND_SetPaused(channels[whichsound], FALSE);
-                                       }       
-                               }       
+                                               emit_sound_at(whichsound, coords);
+                                       }
+                               }
 
                                if(targetanimation==staggerbackhighanim)staggerdelay=1;
                                if(targetanimation==staggerbackhardanim)staggerdelay=1;
@@ -6295,7 +4923,6 @@ void      Person::DoStuff(){
 
                                if(targetanimation==bounceidleanim||targetanimation==wolfidle||targetanimation==walkanim||targetanimation==drawrightanim||targetanimation==crouchdrawrightanim||targetanimation==drawleftanim||targetanimation==fightidleanim||targetanimation==fightsidestep||targetanimation==hanganim||isCrouch()||targetanimation==backhandspringanim){
                                        //open hands and close mouth
-                                       //if(targetanimation!=wolfidle){
                                        if(righthandmorphend!=0&&righthandmorphness==targetrighthandmorphness){
                                                righthandmorphness=0;
                                                righthandmorphend=0;
@@ -6307,7 +4934,6 @@ void      Person::DoStuff(){
                                                lefthandmorphend=0;
                                                targetlefthandmorphness=1;
                                        }
-                                       //s}
 
                                        if(headmorphend!=3&&headmorphend!=5&&headmorphstart!=3&&headmorphstart!=5&&headmorphend!=0&&headmorphness==targetheadmorphness){
                                                headmorphness=0;
@@ -6379,7 +5005,7 @@ void      Person::DoStuff(){
                                        }
                                }
                                /*
-                               if(speechdelay>.25){                    
+                               if(speechdelay>.25){
                                if(headmorphend!=2)headmorphness=0;
                                headmorphend=2;
                                targetheadmorphness=1;
@@ -6427,7 +5053,7 @@ void      Person::DoStuff(){
 
                                        flatfacing=DoRotation(flatfacing,0,rotation,0);
                                        facing=flatfacing;
-                                       ReflectVector(&facing,&terrainnormal);
+                                       ReflectVector(&facing,terrainnormal);
                                        Normalise(&facing);
 
                                        if(isRun()||targetanimation==sneakanim||targetanimation==rollanim||targetanimation==walkanim){
@@ -6473,36 +5099,36 @@ void    Person::DoStuff(){
                                        //if(!creature==wolftype||targetanimation==rabbitkickanim)
                                        if(targetanimation==rabbittackleanim){
                                                velocity+=facing*multiplier*speed*700*scale;
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                if(velspeed>speed*65*scale){
                                                        velocity/=velspeed;
                                                        velspeed=speed*65*scale;
                                                        velocity*=velspeed;
                                                }
                                                velocity.y+=gravity*multiplier*20;
-                                               ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                               velspeed=findLength(&velocity); 
+                                               ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                               velspeed=findLength(&velocity);
                                                velocity=flatfacing*velspeed;
                                        }
                                        if(targetanimation!=rabbitrunninganim&&targetanimation!=wolfrunninganim){
                                                if(isRun()||targetanimation==rabbitkickanim){
                                                        velocity+=facing*multiplier*speed*700*scale;
-                                                       velspeed=findLength(&velocity); 
+                                                       velspeed=findLength(&velocity);
                                                        if(velspeed>speed*45*scale){
                                                                velocity/=velspeed;
                                                                velspeed=speed*45*scale;
                                                                velocity*=velspeed;
                                                        }
                                                        velocity.y+=gravity*multiplier*20;
-                                                       ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                                       velspeed=findLength(&velocity); 
+                                                       ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                                       velspeed=findLength(&velocity);
                                                        if(velspeed<speed*30*scale)velspeed=speed*30*scale;
                                                        velocity=flatfacing*velspeed;
                                                }
                                        }
                                        else if(isRun()){
                                                velocity+=facing*multiplier*speed*700*scale;
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                if(creature==rabbittype){
                                                        if(velspeed>speed*55*scale){
                                                                velocity/=velspeed;
@@ -6518,109 +5144,94 @@ void   Person::DoStuff(){
                                                        }
                                                }
                                                velocity.y+=gravity*multiplier*20;
-                                               ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                               velspeed=findLength(&velocity); 
+                                               ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                               velspeed=findLength(&velocity);
                                                velocity=flatfacing*velspeed;
                                        }
 
-                                       /*if(creature==wolftype)
-                                       if(isRun()){
-                                       velocity+=facing*multiplier*speed*700*scale;
-                                       velspeed=findLength(&velocity); 
-                                       if(velspeed>speed*55*scale){
-                                       velocity/=velspeed;
-                                       velspeed=speed*55*scale;
-                                       velocity*=velspeed;
-                                       }
-                                       velocity.y+=gravity*multiplier*20;
-                                       ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                       velspeed=findLength(&velocity); 
-                                       velocity=flatfacing*velspeed;
-                                       }*/
-
                                        if(targetanimation==rollanim&&animation[targetanimation].label[targetframe]!=6){
                                                velocity+=facing*multiplier*speed*700*scale;
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                if(velspeed>speed*45*scale){
                                                        velocity/=velspeed;
                                                        velspeed=speed*45*scale;
                                                        velocity*=velspeed;
                                                }
                                                velocity.y+=gravity*multiplier*20;
-                                               ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                               velspeed=findLength(&velocity); 
+                                               ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                               velspeed=findLength(&velocity);
                                                velocity=flatfacing*velspeed;
                                        }
 
 
                                        /*if(currentanimation==rollanim&&(isCrouch()||isIdle())){
                                        velocity+=facing*multiplier*speed*700*scale;
-                                       velspeed=findLength(&velocity); 
+                                       velspeed=findLength(&velocity);
                                        if(velspeed>speed*25*scale){
                                        velocity/=velspeed;
                                        velspeed=speed*25*scale;
                                        velocity*=velspeed;
                                        }
                                        velocity.y+=gravity*multiplier*20;
-                                       ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                       velspeed=findLength(&velocity); 
+                                       ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                       velspeed=findLength(&velocity);
                                        velocity=flatfacing*velspeed;
                                        }*/
 
                                        if(targetanimation==sneakanim||targetanimation==walkanim){
                                                velocity+=facing*multiplier*speed*700*scale;
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                if(velspeed>speed*12*scale){
                                                        velocity/=velspeed;
                                                        velspeed=speed*12*scale;
                                                        velocity*=velspeed;
                                                }
                                                velocity.y+=gravity*multiplier*20;
-                                               ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                               velspeed=findLength(&velocity); 
+                                               ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                               velspeed=findLength(&velocity);
                                                velocity=flatfacing*velspeed;
                                        }
 
                                        if((targetanimation==fightidleanim||targetanimation==knifefightidleanim)&&(currentanimation==bounceidleanim||currentanimation==hurtidleanim)){
                                                velocity+=facing*multiplier*speed*700*scale;
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                if(velspeed>speed*2*scale){
                                                        velocity/=velspeed;
                                                        velspeed=speed*2*scale;
                                                        velocity*=velspeed;
                                                }
                                                velocity.y+=gravity*multiplier*20;
-                                               ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                               velspeed=findLength(&velocity); 
+                                               ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                               velspeed=findLength(&velocity);
                                                velocity=flatfacing*velspeed;
                                        }
 
 
                                        if((targetanimation==bounceidleanim||currentanimation==hurtidleanim)&&(currentanimation==fightidleanim||currentanimation==knifefightidleanim)){
                                                velocity-=facing*multiplier*speed*700*scale;
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                if(velspeed>speed*2*scale){
                                                        velocity/=velspeed;
                                                        velspeed=speed*2*scale;
                                                        velocity*=velspeed;
                                                }
                                                velocity.y+=gravity*multiplier*20;
-                                               ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                               velspeed=findLength(&velocity); 
+                                               ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                               velspeed=findLength(&velocity);
                                                velocity=flatfacing*velspeed*-1;
                                        }
 
                                        if(targetanimation==fightsidestep){
                                                velocity+=DoRotation(facing*multiplier*speed*700*scale,0,-90,0);
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                if(velspeed>speed*12*scale){
                                                        velocity/=velspeed;
                                                        velspeed=speed*12*scale;
                                                        velocity*=velspeed;
                                                }
                                                velocity.y+=gravity*multiplier*20;
-                                               ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                               velspeed=findLength(&velocity); 
+                                               ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                               velspeed=findLength(&velocity);
                                                velocity=DoRotation(flatfacing*velspeed,0,-90,0);
                                        }
 
@@ -6636,34 +5247,34 @@ void    Person::DoStuff(){
                                        if(targetanimation==backhandspringanim){
                                                //coords-=facing*multiplier*50*scale;
                                                velocity+=facing*multiplier*speed*700*scale*-1;
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                if(velspeed>speed*50*scale){
                                                        velocity/=velspeed;
                                                        velspeed=speed*50*scale;
                                                        velocity*=velspeed;
                                                }
                                                velocity.y+=gravity*multiplier*20;
-                                               ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                               velspeed=findLength(&velocity); 
+                                               ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                               velspeed=findLength(&velocity);
                                                velocity=flatfacing*velspeed*-1;
                                        }
                                        if(targetanimation==dodgebackanim){
                                                //coords-=facing*multiplier*50*scale;
                                                velocity+=facing*multiplier*speed*700*scale*-1;
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                if(velspeed>speed*60*scale){
                                                        velocity/=velspeed;
                                                        velspeed=speed*60*scale;
                                                        velocity*=velspeed;
                                                }
                                                velocity.y+=gravity*multiplier*20;
-                                               ReflectVector(&velocity,&terrain.getNormal(coords.x,coords.z));
-                                               velspeed=findLength(&velocity); 
+                                               ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
+                                               velspeed=findLength(&velocity);
                                                velocity=flatfacing*velspeed*-1;
                                        }
 
                                        if(targetanimation==jumpupanim||targetanimation==jumpdownanim||isFlip()){
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                        }
 
 
@@ -6678,29 +5289,18 @@ void    Person::DoStuff(){
 
                                                if(targetanimation==jumpupanim){jumppower=-4;targetanimation=getIdle();}
                                                target=0;
-                                               targetframe=0;  
+                                               targetframe=0;
                                                onterrain=1;
 
                                                if(id==0){
-                                                       FSOUND_SetPaused(channels[whooshsound], TRUE);
-                                                       FSOUND_SetVolume(channels[whooshsound], 0);
+                                                       pause_sound(whooshsound);
+                                                       OPENAL_SetVolume(channels[whooshsound], 0);
                                                }
 
                                                if(targetanimation==jumpdownanim||isFlip()){
                                                        if(isFlip())jumppower=-4;
                                                        targetanimation=getLanding();
-                                                       float gLoc[3];
-                                                       float vel[3];
-                                                       gLoc[0]=coords.x;
-                                                       gLoc[1]=coords.y;
-                                                       gLoc[2]=coords.z;
-                                                       vel[0]=velocity.x;
-                                                       vel[1]=velocity.y;
-                                                       vel[2]=velocity.z;
-                                                       PlaySoundEx( landsound, samp[landsound], NULL, TRUE);
-                                                       FSOUND_3D_SetAttributes(channels[landsound], gLoc, vel);
-                                                       FSOUND_SetVolume(channels[landsound], 128);
-                                                       FSOUND_SetPaused(channels[landsound], FALSE);
+                                                       emit_sound_at(landsound, coords, 128.);
 
                                                        if(id==0){
                                                                envsound[numenvsounds]=coords;
@@ -6719,7 +5319,7 @@ void      Person::DoStuff(){
 
 
                                        if(isIdle()||targetanimation==drawrightanim||targetanimation==drawleftanim||targetanimation==crouchdrawrightanim||targetanimation==crouchstabanim||targetanimation==swordgroundstabanim||isStop()||targetanimation==removeknifeanim||targetanimation==crouchremoveknifeanim||isLanding()||isCrouch()||animation[targetanimation].attack||(targetanimation==rollanim&&animation[targetanimation].label[targetframe]==6)){
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                velocity.y=0;
                                                if(velspeed<multiplier*300*scale){
                                                        velocity=0;
@@ -6736,7 +5336,7 @@ void      Person::DoStuff(){
                                        }
 
                                        if(isLandhard()){
-                                               velspeed=findLength(&velocity); 
+                                               velspeed=findLength(&velocity);
                                                velocity.y=0;
                                                if(velspeed<multiplier*600*scale){
                                                        velocity=0;
@@ -6756,25 +5356,11 @@ void    Person::DoStuff(){
                                        if(skiddingdelay<0)skiddingdelay+=multiplier;
                                        if(skiddingdelay>.02&&!forwardkeydown&&!backkeydown&&!leftkeydown&&!rightkeydown&&!jumpkeydown&&isLanding()&&!landhard){
                                                skiddingdelay=-1;
-                                               float gLoc[3];
-                                               float vel[3];
-                                               gLoc[0]=coords.x;
-                                               gLoc[1]=coords.y;
-                                               gLoc[2]=coords.z;
-                                               vel[0]=velocity.x;
-                                               vel[1]=velocity.y;
-                                               vel[2]=velocity.z;
                                                if(!onterrain||environment==grassyenvironment){
-                                                       PlaySoundEx( skidsound, samp[skidsound], NULL, TRUE);
-                                                       FSOUND_3D_SetAttributes(channels[skidsound], gLoc, vel);
-                                                       FSOUND_SetVolume(channels[skidsound], 128*velspeed/10);
-                                                       FSOUND_SetPaused(channels[skidsound], FALSE);
+                                                       emit_sound_at(skidsound, coords, 128*velspeed/10);
                                                }
                                                else {
-                                                       PlaySoundEx( snowskidsound, samp[snowskidsound], NULL, TRUE);
-                                                       FSOUND_3D_SetAttributes(channels[snowskidsound], gLoc, vel);
-                                                       FSOUND_SetVolume(channels[snowskidsound], 128*velspeed/10);
-                                                       FSOUND_SetPaused(channels[snowskidsound], FALSE);
+                                                       emit_sound_at(snowskidsound, coords, 128*velspeed/10);
                                                }
                                        }
 
@@ -6794,7 +5380,7 @@ void      Person::DoStuff(){
                                                coords=victim->coords;
                                        }
                        }
-                       skeleton.oldfree=skeleton.free; 
+                       skeleton.oldfree=skeleton.free;
 
                        XYZ midterrain;
                        midterrain=0;
@@ -6813,7 +5399,7 @@ void      Person::DoStuff(){
 
 int Person::DrawSkeleton(){
        int oldplayerdetail;
-       if((frustum.SphereInFrustum(coords.x,coords.y+scale*3,coords.z,scale*8)&&findDistancefast(&viewer,&coords)<viewdistance*viewdistance)||skeleton.free==3){  
+       if((frustum.SphereInFrustum(coords.x,coords.y+scale*3,coords.z,scale*8)&&findDistancefast(&viewer,&coords)<viewdistance*viewdistance)||skeleton.free==3){
                if(onterrain&&(isIdle()||isCrouch()||wasIdle()||wasCrouch())&&!skeleton.free){
                        calcrot=1;
                }
@@ -6842,9 +5428,12 @@ int Person::DrawSkeleton(){
                if(findDistancefast(&viewer,&coords)<viewdistance*viewdistance/256&&(detail!=1&&detail!=2)){
                        playerdetail=1;
                }
-               if(id==0)playerdetail=1;
-               if(playerdetail!=oldplayerdetail)updatedelay=0;
-               if(playerdetail!=oldplayerdetail)normalsupdatedelay=0;
+               if(id==0)
+                       playerdetail=1;
+               if(playerdetail!=oldplayerdetail) {
+                       updatedelay=0;
+                       normalsupdatedelay=0;
+               }
                static float updatedelaychange;
                static float morphness;
                static float framemult;
@@ -6992,7 +5581,8 @@ int Person::DrawSkeleton(){
                                        }
                                }
                        }
-                       if(!skeleton.free&&(!animation[targetanimation].attack&&targetanimation!=getupfrombackanim&&targetanimation!=getupfrombackanim&&((targetanimation!=rollanim&&!isFlip())||animation[targetanimation].label[targetframe]==6)&&targetanimation!=getupfromfrontanim&&targetanimation!=wolfrunninganim&&targetanimation!=rabbitrunninganim&&targetanimation!=backhandspringanim&&targetanimation!=walljumpfrontanim&&targetanimation!=hurtidleanim&&!isLandhard()&&!isSleeping()))DoHead();
+                       if(!skeleton.free&&(!animation[targetanimation].attack&&targetanimation!=getupfrombackanim&&((targetanimation!=rollanim&&!isFlip())||animation[targetanimation].label[targetframe]==6)&&targetanimation!=getupfromfrontanim&&targetanimation!=wolfrunninganim&&targetanimation!=rabbitrunninganim&&targetanimation!=backhandspringanim&&targetanimation!=walljumpfrontanim&&targetanimation!=hurtidleanim&&!isLandhard()&&!isSleeping()))
+                               DoHead();
                        else {
                                targetheadrotation=-targetrotation;
                                targetheadrotation2=0;
@@ -7059,35 +5649,11 @@ int Person::DrawSkeleton(){
 
                                                skeleton.muscles[i].lastrotate3=skeleton.muscles[i].rotate3;
                                                glRotatef(-skeleton.muscles[i].lastrotate3,0,1,0);
-                                               /*
-                                               if(!isnormal(proportionbody.x)||!isnormal(proportionbody.y)||!isnormal(proportionbody.z)){
-                                               proportionbody=1;
-                                               proportionweird=1;
-                                               }
-                                               if(!isnormal(proportionarms.x)||!isnormal(proportionarms.y)||!isnormal(proportionarms.z)){
-                                               proportionarms=1;
-                                               proportionweird=1;
-                                               }
-                                               if(!isnormal(proportionhead.x)||!isnormal(proportionhead.y)||!isnormal(proportionhead.z)){
-                                               proportionhead=1;
-                                               proportionweird=1;
-                                               }
-                                               if(!isnormal(proportionlegs.x)||!isnormal(proportionlegs.y)||!isnormal(proportionlegs.z)){
-                                               proportionlegs=1;
-                                               proportionweird=1;
-                                               }*/
 
                                                if(playerdetail||skeleton.free==3)
                                                {
                                                        for(j=0;j<skeleton.muscles[i].numvertices;j++)
                                                        {
-                                                               /*if(!isnormal(skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x))vertexweird[0]=1;
-                                                               if(!isnormal(skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y))vertexweird[1]=1;
-                                                               if(!isnormal(skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z))vertexweird[2]=1;
-                                                               if(!isnormal(skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x))vertexweird[3]=1;
-                                                               if(!isnormal(skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y))vertexweird[4]=1;
-                                                               if(!isnormal(skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z))vertexweird[5]=1;
-                                                               if(skeleton.muscles[i].vertices[j]<skeleton.model[start].vertexNum&&skeleton.muscles[i].vertices[j]>=0){*/
                                                                glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
                                                                glPushMatrix();
                                                                        if(skeleton.muscles[i].parent1->label==abdomen||skeleton.muscles[i].parent2->label==abdomen)
@@ -7108,24 +5674,18 @@ int Person::DrawSkeleton(){
                                                                                (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z*morphness)*proportionhead.z);
                                                                        glGetFloatv(GL_MODELVIEW_MATRIX,M);
                                                                        //if(!isnormal(M[12])||!isnormal(M[13])||!isnormal(M[14]))test=0;
-                                                                       //if(isnormal(M[12])&&isnormal(M[13])&&isnormal(M[14])){
                                                                        //if(!isnormal(scale))test=1;
-                                                                       //if(isnormal(scale)){
                                                                        skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].x=M[12]*scale;
                                                                        skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].y=M[13]*scale;
                                                                        skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].z=M[14]*scale;
                                                                        //test=2;
-                                                                       //}
-                                                                       //}
                                                                glPopMatrix();
-                                                               //}
                                                        }
                                                }
                                                if(!playerdetail||skeleton.free==3)
                                                {
                                                        for(j=0;j<skeleton.muscles[i].numverticeslow;j++)
                                                        {
-                                                               //if(skeleton.muscles[i].verticeslow[j]<skeleton.modellow.vertexNum&&skeleton.muscles[i].verticeslow[j]>=0){
                                                                glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
                                                                glPushMatrix();
                                                                        if(skeleton.muscles[i].parent1->label==abdomen||skeleton.muscles[i].parent2->label==abdomen)
@@ -7150,7 +5710,6 @@ int Person::DrawSkeleton(){
                                                                        skeleton.drawmodellow.vertex[skeleton.muscles[i].verticeslow[j]].y=M[13]*scale;
                                                                        skeleton.drawmodellow.vertex[skeleton.muscles[i].verticeslow[j]].z=M[14]*scale;
                                                                glPopMatrix();
-                                                               //}
                                                        }
                                                }
                                        glPopMatrix();
@@ -7296,12 +5855,12 @@ int Person::DrawSkeleton(){
                        }
                        if(playerdetail){
                                if(!showpoints){
-                                       if((tutoriallevel&&id!=0))skeleton.drawmodel.drawdifftex(sprites.cloudimpacttexture);
+                                       if((tutoriallevel&&id!=0))skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture);
                                        else skeleton.drawmodel.draw();
                                }
                        }
                        if(!playerdetail){
-                               if((tutoriallevel&&id!=0))skeleton.drawmodellow.drawdifftex(sprites.cloudimpacttexture);
+                               if((tutoriallevel&&id!=0))skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture);
                                else skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr);
                        }
 
@@ -7325,12 +5884,12 @@ int Person::DrawSkeleton(){
                                                glTranslatef(smoketex*.6,0,0);
                                                if(playerdetail){
                                                        if(!showpoints){
-                                                               if((tutoriallevel&&id!=0))skeleton.drawmodel.drawdifftex(sprites.cloudimpacttexture);
+                                                               if((tutoriallevel&&id!=0))skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture);
                                                                else skeleton.drawmodel.draw();
                                                        }
                                                }
                                                if(!playerdetail){
-                                                       if((tutoriallevel&&id!=0))skeleton.drawmodellow.drawdifftex(sprites.cloudimpacttexture);
+                                                       if((tutoriallevel&&id!=0))skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture);
                                                        else skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr);
                                                }
                                }
@@ -7354,7 +5913,7 @@ int Person::DrawSkeleton(){
                if(num_weapons>0){
                        for(k=0;k<num_weapons;k++){
                                i=weaponids[k];
-                               if(weaponactive==k){                                            
+                               if(weaponactive==k){
                                        if(weapons.type[i]!=staff){
                                                for(j=0;j<skeleton.num_muscles;j++){
                                                        if((skeleton.muscles[j].parent1->label==righthand||skeleton.muscles[j].parent2->label==righthand)&&skeleton.muscles[j].numvertices>0){
@@ -7389,16 +5948,9 @@ int Person::DrawSkeleton(){
                                                CrossProduct(&vec1,&vec2,&tempnormthing);
                                                Normalise(&tempnormthing);
                                                if(targetanimation!=staffhitanim&&currentanimation!=staffhitanim&&targetanimation!=staffgroundsmashanim&&currentanimation!=staffgroundsmashanim&&targetanimation!=staffspinhitanim&&currentanimation!=staffspinhitanim)weaponpoint+=tempnormthing*.1-skeleton.specialforward[1]*.3+(skeleton.joints[skeleton.jointlabels[rightwrist]].position-skeleton.joints[skeleton.jointlabels[rightelbow]].position);
-                                               /*if(targetanimation==staffhitanim||currentanimation==staffhitanim){
-                                               XYZ weaptargnorm;
-                                               weaptargnorm=DoRotation(weapons.tippoint[i]-weapons.position[i],0,-rotation,0);
-                                               //weaptargnorm=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
-                                               Normalise(&weaptargnorm);
-                                               weaponpoint-=weaptargnorm*2;
-                                               }*/
                                        }
                                }
-                               if(weaponactive!=k&&weaponstuck!=k){                                            
+                               if(weaponactive!=k&&weaponstuck!=k){
                                        if(weapons.type[i]==knife)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[righthip]].position-skeleton.joints[skeleton.jointlabels[lefthip]].position)*.1+(skeleton.joints[skeleton.jointlabels[rightshoulder]].position-skeleton.joints[skeleton.jointlabels[leftshoulder]].position)*.35;
                                        if(weapons.type[i]==sword)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[lefthip]].position-skeleton.joints[skeleton.jointlabels[righthip]].position)*.09+(skeleton.joints[skeleton.jointlabels[leftshoulder]].position-skeleton.joints[skeleton.jointlabels[rightshoulder]].position)*.33;
                                        if(weapons.type[i]==staff)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[lefthip]].position-skeleton.joints[skeleton.jointlabels[righthip]].position)*.09+(skeleton.joints[skeleton.jointlabels[leftshoulder]].position-skeleton.joints[skeleton.jointlabels[rightshoulder]].position)*.33;
@@ -7408,7 +5960,7 @@ int Person::DrawSkeleton(){
                                                }
                                        }
                                }
-                               if(weaponstuck==k){                                             
+                               if(weaponstuck==k){
                                        if(weaponstuckwhere==0)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position*.5+skeleton.joints[skeleton.jointlabels[neck]].position*.5-skeleton.forward*.8;
                                        else weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position*.5+skeleton.joints[skeleton.jointlabels[neck]].position*.5+skeleton.forward*.8;
                                        for(j=0;j<skeleton.num_muscles;j++){
@@ -7458,7 +6010,7 @@ int Person::DrawSkeleton(){
                                                        weapons.rotation3[i]=0;
                                                        weapons.smallrotation[i]=-90;
                                                        weapons.smallrotation2[i]=0;
-                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];                                                     
+                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
                                                }
                                                if((currentanimation==knifeslashreversalanim&&targetanimation==knifeslashreversalanim)||(currentanimation==knifeslashreversedanim&&targetanimation==knifeslashreversedanim)){
                                                        XYZ temppoint1,temppoint2,tempforward;
@@ -7476,7 +6028,7 @@ int Person::DrawSkeleton(){
                                                        weapons.rotation3[i]=0;
                                                        weapons.smallrotation[i]=90;
                                                        weapons.smallrotation2[i]=0;
-                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];                                                     
+                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
                                                }
                                                if(targetanimation==knifethrowanim){
                                                        weapons.smallrotation[i]=90;
@@ -7519,7 +6071,7 @@ int Person::DrawSkeleton(){
                                                        weapons.rotation3[i]=0;
                                                        weapons.smallrotation[i]=90;
                                                        weapons.smallrotation2[i]=0;
-                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];                     
+                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
                                                }
                                        }
                                        if(weapons.type[i]==staff){
@@ -7541,7 +6093,7 @@ int Person::DrawSkeleton(){
                                                        weapons.rotation3[i]=0;
                                                        weapons.smallrotation[i]=90;
                                                        weapons.smallrotation2[i]=0;
-                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];                     
+                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
                                                }
                                        }
                                }
@@ -7563,8 +6115,6 @@ int Person::DrawSkeleton(){
                                        if(weaponstuckwhere==0)weapons.smallrotation[i]=180;
                                        else weapons.smallrotation[i]=0;
                                        weapons.smallrotation2[i]=10;
-                                       //if(animation[targetanimation].height==lowheight&&animation[targetanimation].attack==neutral){
-                                       //}
                                }
                        }
                }
@@ -7628,29 +6178,18 @@ int Person::SphereCheck(XYZ *p1,float radius, XYZ *p, XYZ *move, float *rotate,
 
                                                                if(targetanimation==jumpupanim){jumppower=-4;targetanimation=getIdle();}
                                                                target=0;
-                                                               targetframe=0;  
+                                                               targetframe=0;
                                                                onterrain=1;
 
                                                                if(id==0){
-                                                                       FSOUND_SetPaused(channels[whooshsound], TRUE);
-                                                                       FSOUND_SetVolume(channels[whooshsound], 0);
+                                                                       pause_sound(whooshsound);
+                                                                       OPENAL_SetVolume(channels[whooshsound], 0);
                                                                }
 
                                                                if((targetanimation==jumpdownanim||isFlip())&&!wasLanding()&&!wasLandhard()){
                                                                        if(isFlip())jumppower=-4;
                                                                        targetanimation=getLanding();
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       gLoc[0]=coords.x;
-                                                                       gLoc[1]=coords.y;
-                                                                       gLoc[2]=coords.z;
-                                                                       vel[0]=velocity.x;
-                                                                       vel[1]=velocity.y;
-                                                                       vel[2]=velocity.z;
-                                                                       PlaySoundEx( landsound, samp[landsound], NULL, TRUE);
-                                                                       FSOUND_3D_SetAttributes(channels[landsound], gLoc, vel);
-                                                                       FSOUND_SetVolume(channels[landsound], 128);
-                                                                       FSOUND_SetPaused(channels[landsound], FALSE);
+                                                                       emit_sound_at(landsound, coords, 128.);
 
                                                                        if(id==0){
                                                                                envsound[numenvsounds]=coords;
@@ -7704,281 +6243,3 @@ int Person::SphereCheck(XYZ *p1,float radius, XYZ *p, XYZ *move, float *rotate,
        *p1+=*move;
        return firstintersecting;
 }
-
-Person::Person()
-{
-       whichpatchx = 0;
-       whichpatchz = 0;
-
-       currentframe = 0;
-       targetframe = 0;
-       currentanimation = 0;
-       targetanimation = 0;
-       oldcurrentframe = 0;
-       oldtargetframe = 0;
-       oldcurrentanimation = 0;
-       oldtargetanimation = 0;
-
-       howactive = 0;
-
-       parriedrecently = 0;
-
-       superruntoggle = 0;
-
-       lastattack = 0,lastattack2 = 0,lastattack3 = 0;
-
-       currentoffset = 0,targetoffset = 0,offset = 0;
-       target = 0;
-       transspeed = 0;
-
-       realoldcoords = 0;
-       oldcoords = 0;
-       coords = 0;
-       originalcoords = 0;
-       velocity = 0;
-
-       proportionhead = 0;
-       proportionlegs = 0;
-       proportionarms = 0;
-       proportionbody = 0;
-
-       heightleft = 0;
-       heightright = 0;
-
-       unconscioustime = 0;
-
-       immobile = 0;
-
-       velspeed = 0;
-       targetrotation = 0;
-       targetrot = 0;
-       rot = 0;
-       oldrot = 0;
-       lookrotation = 0;
-       lookrotation2 = 0;
-       rotation = 0;
-       rotation2 = 0;
-       lowrotation = 0;
-       tilt = 0;
-       targettilt = 0;
-       tilt2 = 0;
-       targettilt2 = 0;
-       rabbitkickenabled = 0;
-
-       bloodloss = 0;
-       bleeddelay = 0;
-       skiddelay = 0;
-       skiddingdelay = 0;
-       deathbleeding = 0;
-       tempdeltav = 0;
-
-       damagetolerance = 0;
-       damage = 0;
-       permanentdamage = 0;
-       superpermanentdamage = 0;       lastcollide = 0;
-       dead = 0;
-
-       jumppower = 0;
-       onground = 0;
-       madskills = 0;
-
-       wentforweapon = 0;
-
-       calcrot = 0;
-
-       backwardsanim = 0;
-
-       facing = 0;
-
-       bleeding = 0;
-       bleedx = 0,bleedy;
-       direction = 0;
-       texupdatedelay = 0;
-
-       headrotation = 0,headrotation2 = 0;
-       targetheadrotation = 0,targetheadrotation2 = 0;
-
-       onterrain = 0;
-       pause = 0;
-
-       grabdelay = 0;
-
-       victim = 0;
-       hasvictim = 0;
-
-       updatedelay = 0;
-       normalsupdatedelay = 0;
-
-       jumpstart = 0;
-
-       forwardkeydown = 0;
-       forwardstogglekeydown = 0;
-       rightkeydown = 0;
-       leftkeydown = 0;
-       backkeydown = 0;
-       jumpkeydown = 0;
-       jumptogglekeydown = 0;
-       crouchkeydown = 0;
-       crouchtogglekeydown = 0;
-       drawkeydown = 0;
-       drawtogglekeydown = 0;
-       throwkeydown = 0;
-       throwtogglekeydown = 0;
-       attackkeydown = 0;
-       feint = 0;
-       lastfeint = 0;
-       headless = 0;
-
-       crouchkeydowntime = 0;
-       jumpkeydowntime = 0;
-       freefall = 0;
-
-
-       turnspeed = 0;
-
-       aitype = 0;
-       aitarget = 0;
-       aiupdatedelay = 0;
-       losupdatedelay = 0;
-       ally = 0;
-       movetarget = 0;
-       collide = 0;
-       collided = 0;
-       avoidcollided = 0;
-       loaded = 0;
-       whichdirection = 0;
-       whichdirectiondelay = 0;
-       avoidsomething = 0;     avoidwhere = 0;
-       blooddimamount = 0;
-
-       staggerdelay = 0;
-       blinkdelay = 0;
-       twitchdelay = 0;
-       twitchdelay2 = 0;
-       twitchdelay3 = 0;
-       lefthandmorphness = 0;
-       righthandmorphness = 0;
-       headmorphness = 0;
-       chestmorphness = 0;
-       tailmorphness = 0;
-       targetlefthandmorphness = 0;
-       targetrighthandmorphness = 0;
-       targetheadmorphness = 0;
-       targetchestmorphness = 0;
-       targettailmorphness = 0;
-       lefthandmorphstart = 0,lefthandmorphend = 0;
-       righthandmorphstart = 0,righthandmorphend = 0;
-       headmorphstart = 0,headmorphend = 0;
-       chestmorphstart = 0,chestmorphend = 0;
-       tailmorphstart = 0,tailmorphend = 0;
-
-       weaponmissdelay = 0;
-       highreversaldelay = 0;
-       lowreversaldelay = 0;
-       nocollidedelay = 0;
-
-       creature = 0;
-
-       id = 0;
-
-       //Skeleton skeleton;
-
-       speed = 0;
-       scale = 0;
-       power = 0;
-       speedmult = 0;
-
-       protectionhead = 0;
-       protectionhigh = 0;
-       protectionlow = 0;
-       armorhead = 0;
-       armorhigh = 0;
-       armorlow = 0;
-       metalhead = 0;
-       metalhigh = 0;
-       metallow = 0;
-
-       numclothes = 0;
-
-       memset(clothes, 0, sizeof(clothes));
-       memset(clothestintr, 0, sizeof(clothestintr));
-       memset(clothestintg, 0, sizeof(clothestintg));
-       memset(clothestintb, 0, sizeof(clothestintb));
-
-       landhard = 0;
-       bled = 0;
-       spurt = 0;
-       onfire = 0;
-       onfiredelay = 0;        burnt = 0;
-       fireduration = 0;
-
-       flamedelay = 0;
-       updatestuffdelay = 0;
-
-       playerdetail = 0;
-
-       num_weapons = 0;
-
-       memset(weaponids, 0, sizeof(weaponids));
-
-       weaponactive = 0;
-       weaponstuck = 0;
-       weaponstuckwhere = 0;
-       weaponwhere = 0;
-
-       numwaypoints = 0;
-
-       memset(waypoints, 0, sizeof(waypoints));
-       memset(waypointtype, 0, sizeof(waypointtype));
-
-       pausetime = 0;
-       hastempwaypoint = 0;
-       tempwaypoint = 0;
-
-       headtarget = 0;
-       interestdelay = 0;
-
-       finalfinaltarget = 0;
-       finaltarget = 0;
-       finalpathfindpoint = 0;
-       targetpathfindpoint = 0;
-       lastpathfindpoint = 0;
-       lastpathfindpoint2 = 0;
-       lastpathfindpoint3 = 0;
-       lastpathfindpoint4 = 0;
-       onpath = 0;
-
-       waypoint = 0;
-       jumppath = 0;
-
-       lastseen = 0;
-       lastseentime = 0;
-       lastchecktime = 0;
-       stunned = 0;
-       surprised = 0;
-       runninghowlong = 0;     lastoccluded = 0;
-       laststanding = 0;
-       escapednum = 0;
-
-       speechdelay = 0;
-       neckspurtdelay = 0;
-       neckspurtparticledelay = 0;
-       neckspurtamount = 0;
-
-       whichskin = 0;
-       rabbitkickragdoll = 0;
-
-       averageloc = 0;
-       oldaverageloc = 0;
-
-       //Animation tempanimation;
-
-       occluded = 0;
-
-       jumpclimb = 0;
-}
-
-Person::~Person()
-{
-}
-