]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Person.cpp
Cleanup sound emission
[lugaru.git] / Source / Person.cpp
index d77c81e6b47b3cb341ccc12f691158970f1a79f8..818e6ce29c404ed5a61a206bc1d7362b814df377 100644 (file)
@@ -72,10 +72,6 @@ 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;
@@ -111,20 +107,8 @@ void Person::CheckKick(){
                                        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);
-                                                       OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[heavyimpactsound], 128);
-                                                       OPENAL_SetPaused(channels[heavyimpactsound], false);
-                                               }
+                                               if(tutoriallevel!=1)
+                                                 emit_sound_at(heavyimpactsound, victim->coords);
                                                victim->RagDoll(0);
                                                relative=velocity;
                                                relative.y=0;
@@ -145,13 +129,7 @@ void Person::CheckKick(){
                                                skeleton.free=0;
                                                if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
 
-                                               //if(victim->damage>victim->damagetolerance){
-                                               if(id==0){
-                                                       bonus=cannon;
-                                                       bonustime=0;
-                                                       bonusvalue=100;
-                                               }
-                                               //}
+                                               award_bonus(id, cannon);
                                        }
                                        else if (victim->isCrouch()){
                                                targetanimation=rabbitkickreversedanim;
@@ -187,27 +165,9 @@ void Person::CatchFire(){
 
        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);
-       OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-       OPENAL_SetVolume(channels[firestartsound], 256);
-       OPENAL_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, samp[stream_firesound], NULL, true);
-       OPENAL_3D_SetAttributes(channels[stream_firesound], gLoc, vel);
-       OPENAL_SetVolume(channels[stream_firesound], 256);
-       OPENAL_SetPaused(channels[stream_firesound], false);
+       emit_sound_at(firestartsound, coords);
+
+       emit_stream_at(stream_firesound, coords);
 
        flamedelay=0;
 
@@ -367,33 +327,13 @@ bool Person::isWallJump(){
        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){
@@ -479,14 +419,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);
@@ -508,12 +440,8 @@ void Person::DoBloodBig(float howmuch,int which){
                                //if(i==2)whichsound=rabbitpain2sound;
                        }
 
-                       if(whichsound!=-1){
-                               PlaySoundEx( whichsound, samp[whichsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[whichsound], 512);
-                               OPENAL_SetPaused(channels[whichsound], false);
-                       }
+                       if(whichsound!=-1)
+                         emit_sound_at(whichsound, coords);
                }
 
                if(id==0&&howmuch>0){
@@ -1149,29 +1077,14 @@ void Person::Reverse(){
                                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);
-                                                       OPENAL_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[swordstaffsound], 512);
-                                                       OPENAL_SetPaused(channels[swordstaffsound], false);
+                                                       emit_sound_at(swordstaffsound, victim->coords);
                                                }
                                                else{
-                                                       PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
-                                                       OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[metalhitsound], 512);
-                                                       OPENAL_SetPaused(channels[metalhitsound], false);
+                                                       emit_sound_at(metalhitsound, victim->coords);
                                                }
                                        }
                                        XYZ aim;
@@ -1212,29 +1125,15 @@ void Person::Reverse(){
                                }
 
                                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);
-                                                       OPENAL_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[swordstaffsound], 512);
-                                                       OPENAL_SetPaused(channels[swordstaffsound], false);
+                                                       emit_sound_at(swordstaffsound, coords);
                                                }
                                                else{
-                                                       PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
-                                                       OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[metalhitsound], 512);
-                                                       OPENAL_SetPaused(channels[metalhitsound], false);
+                                                       emit_sound_at(metalhitsound, coords);
                                                }
                                        }
 
@@ -1367,18 +1266,7 @@ void Person::DoDamage(float howmuch){
                        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);
-               OPENAL_3D_SetAttributes(channels[splattersound], gLoc, vel);
-               OPENAL_SetVolume(channels[splattersound], 256);
-               OPENAL_SetPaused(channels[splattersound], false);
+               emit_sound_at(splattersound, coords);
 
                skeleton.free=2;
                DoDamage(10000);
@@ -1388,9 +1276,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;
@@ -1399,14 +1285,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);
@@ -1429,10 +1307,7 @@ void Person::DoDamage(float howmuch){
                        }
 
                        if(whichsound!=-1){
-                               PlaySoundEx( whichsound, samp[whichsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[whichsound], 512);
-                               OPENAL_SetPaused(channels[whichsound], false);
+                               emit_sound_at(whichsound, coords);
                        }
                }
                speechdelay=.3;
@@ -1797,18 +1672,7 @@ 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);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
+                               emit_sound_at(fireendsound, coords);
                                OPENAL_SetPaused(channels[stream_firesound], true);
                                deathbleeding=0;
                        }
@@ -1827,27 +1691,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);
-                                               OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                               OPENAL_SetVolume(channels[clawslicesound], 128);
-                                               OPENAL_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);
                                }
                        }
 
@@ -1857,34 +1706,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);
-                                               OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                               OPENAL_SetVolume(channels[knifesheathesound], 128);
-                                               OPENAL_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);
-                                               OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                               OPENAL_SetVolume(channels[knifedrawsound], 128);
-                                               OPENAL_SetPaused(channels[knifedrawsound], false);
+                                               emit_sound_at(knifedrawsound, coords, 128);
                                        }
                                }
                                drawtogglekeydown=1;
@@ -1952,10 +1777,7 @@ void     Person::DoAnimations(){
 
                                                if(animation[targetanimation].label[targetframe]==3){
                                                        whichsound--;
-                                                       PlaySoundEx( whichsound, samp[whichsound], NULL, true);
-                                                       OPENAL_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[whichsound], 128);
-                                                       OPENAL_SetPaused(channels[whichsound], false);
+                                                       emit_sound_at(whichsound, coords, 128.);
                                                }
                                }
 
@@ -1965,14 +1787,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);
@@ -1996,10 +1810,7 @@ void     Person::DoAnimations(){
                                                                //if(animation[targetanimation].label[targetframe]==8)whichsound=landsound2;
 
                                                                if(whichsound!=-1){
-                                                                       PlaySoundEx( whichsound, samp[whichsound], NULL, true);
-                                                                       OPENAL_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[whichsound], 512);
-                                                                       OPENAL_SetPaused(channels[whichsound], false);
+                                                                       emit_sound_at(whichsound, coords);
                                                                }
                                                        }
 
@@ -2022,18 +1833,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);
-                                                                                                       OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                                                       OPENAL_SetVolume(channels[knifedrawsound], 128);
-                                                                                                       OPENAL_SetPaused(channels[knifedrawsound], false);
+                                                                                                       emit_sound_at(knifedrawsound, coords, 128.);
                                                                                                }
 
                                                                                                weaponactive=0;
@@ -2059,14 +1859,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){
@@ -2076,17 +1868,11 @@ void    Person::DoAnimations(){
                                                                                                        }
                                                                                                        if(!fleshstuck){
                                                                                                                if(weapons.type[i]!=staff){
-                                                                                                                       PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true);
-                                                                                                                       OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                                                                       OPENAL_SetVolume(channels[knifedrawsound], 128);
-                                                                                                                       OPENAL_SetPaused(channels[knifedrawsound], false);
+                                                                                                                       emit_sound_at(knifedrawsound, coords, 128.);
                                                                                                                }
                                                                                                        }
                                                                                                        if(fleshstuck){
-                                                                                                               PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, true);
-                                                                                                               OPENAL_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
-                                                                                                               OPENAL_SetVolume(channels[fleshstabremovesound], 128);
-                                                                                                               OPENAL_SetPaused(channels[fleshstabremovesound], false);
+                                                                                                               emit_sound_at(fleshstabremovesound, coords, 128.);
                                                                                                        }
                                                                                                        weaponactive=0;
                                                                                                        if(weapons.owner[i]!=-1){
@@ -2154,34 +1940,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);
-                                                                       OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[knifesheathesound], 128);
-                                                                       OPENAL_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);
-                                                                       OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[knifedrawsound], 128);
-                                                                       OPENAL_SetPaused(channels[knifedrawsound], false);
+                                                                       emit_sound_at(knifedrawsound, coords, 128.);
                                                                }
                                                        }
 
@@ -2206,19 +1968,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);
-                                                                       OPENAL_3D_SetAttributes(channels[jumpsound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[jumpsound], 128);
-                                                                       OPENAL_SetPaused(channels[jumpsound], false);
+                                                                       emit_sound_at(jumpsound, coords);
                                                                }
 
                                                                float closestdist;
@@ -2254,19 +2004,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[jumpsound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[jumpsound], 128);
-                                                                                       OPENAL_SetPaused(channels[jumpsound], false);
+                                                                                       emit_sound_at(jumpsound, coords, 128.);
                                                                                }
                                                                        }
                                                        }
@@ -2286,25 +2024,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[heavyimpactsound], 128);
-                                                                                       OPENAL_SetPaused(channels[heavyimpactsound], false);
+                                                                                       emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                                }
                                                                                if(creature==wolftype){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
-                                                                                       OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                                       OPENAL_SetPaused(channels[clawslicesound], false);
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2/victim->armorhead,175);
                                                                                }
@@ -2322,9 +2046,7 @@ void      Person::DoAnimations(){
                                                                                victim->Puff(head);
                                                                                victim->DoDamage(damagemult*100/victim->protectionhead);
 
-                                                                               if(id==0){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               SolidHitBonus(id);
                                                                        }
                                                                }
 
@@ -2336,23 +2058,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);
-                                                                               OPENAL_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[whooshhitsound], 512);
-                                                                               OPENAL_SetPaused(channels[whooshhitsound], false);
+                                                                               emit_sound_at(whooshhitsound, victim->coords);
                                                                                if(creature==wolftype){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
-                                                                                       OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                                       OPENAL_SetPaused(channels[clawslicesound], false);
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2,175);
                                                                                }
@@ -2380,25 +2088,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[heavyimpactsound], 160);
-                                                                                       OPENAL_SetPaused(channels[heavyimpactsound], false);
+                                                                                       emit_sound_at(heavyimpactsound, victim->coords, 160.);
                                                                                }
                                                                                if(creature==wolftype){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
-                                                                                       OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                                       OPENAL_SetPaused(channels[clawslicesound], false);
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2/victim->armorhead,175);
                                                                                }
@@ -2416,16 +2110,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);
                                                                        }
                                                                }
 
@@ -2435,25 +2123,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[heavyimpactsound], 160);
-                                                                                       OPENAL_SetPaused(channels[heavyimpactsound], false);
+                                                                                       emit_sound_at(heavyimpactsound, victim->coords, 160.);
                                                                                }
                                                                                if(creature==wolftype){
-                                                                                       PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
-                                                                                       OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                                       OPENAL_SetPaused(channels[clawslicesound], false);
+                                                                                       emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                        victim->spurt=1;
                                                                                        victim->DoBloodBig(2/victim->armorhead,175);
                                                                                }
@@ -2471,16 +2145,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);
                                                                        }
                                                                }
 
@@ -2492,18 +2160,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);
-                                                                               OPENAL_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[whooshhitsound], 512);
-                                                                               OPENAL_SetPaused(channels[whooshhitsound], false);
+                                                                               emit_sound_at(whooshhitsound, victim->coords);
                                                                                victim->RagDoll(0);
                                                                                XYZ relative;
                                                                                relative=victim->coords-coords;
@@ -2523,23 +2180,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);
-                                                                               OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[landsound2], 128);
-                                                                               OPENAL_SetPaused(channels[landsound2], false);
-                                                                               */
-                                                                               PlaySoundEx( movewhooshsound, samp[movewhooshsound], NULL, true);
-                                                                               OPENAL_3D_SetAttributes(channels[movewhooshsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[movewhooshsound], 128);
-                                                                               OPENAL_SetPaused(channels[movewhooshsound], false);
+                                                                               emit_sound_at(whooshhitsound, victim->coords, 128.);
 
                                                                                victim->skeleton.longdead=0;
                                                                                victim->skeleton.free=1;
@@ -2572,19 +2213,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[heavyimpactsound], 128);
-                                                                                       OPENAL_SetPaused(channels[heavyimpactsound], false);
+                                                                                       emit_sound_at(heavyimpactsound, coords, 128.);
                                                                                }
                                                                                XYZ relative;
                                                                                relative=victim->coords-coords;
@@ -2607,19 +2237,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[thudsound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[thudsound], 400);
-                                                                                       OPENAL_SetPaused(channels[thudsound], false);
+                                                                                       emit_sound_at(thudsound, coords);
                                                                                }
 
                                                                                victim->skeleton.longdead=0;
@@ -2640,9 +2259,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);
@@ -2655,26 +2273,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);
-                                                                               OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[knifesheathesound], 128);
-                                                                               OPENAL_SetPaused(channels[knifesheathesound], false);
+                                                                               emit_sound_at(knifesheathesound, coords, 128.);
                                                                        }
 
                                                                        if(victim&&hasvictim){
@@ -2720,11 +2326,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;
 
@@ -2737,10 +2340,7 @@ void     Person::DoAnimations(){
                                                                                                        victim->skeleton.joints[i].locked=0;
                                                                                                        //victim->skeleton.joints[i].velocity=0;
                                                                                                }
-                                                                                               PlaySoundEx( fleshstabsound, samp[fleshstabsound], NULL, true);
-                                                                                               OPENAL_3D_SetAttributes(channels[fleshstabsound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[fleshstabsound], 128);
-                                                                                               OPENAL_SetPaused(channels[fleshstabsound], false);
+                                                                                               emit_sound_at(fleshstabsound, coords, 128);
 
                                                                                        }
                                                                                        if(whichtri!=-1||weapons.bloody[weaponids[weaponactive]]){
@@ -2749,40 +2349,21 @@ void    Person::DoAnimations(){
                                                                                        }
                                                                                        if(whichtri==-1){
                                                                                                hasvictim=0;
-                                                                                               PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, true);
-                                                                                               OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[knifesheathesound], 128);
-                                                                                               OPENAL_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);
-                                                                               OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[knifedrawsound], 128);
-                                                                               OPENAL_SetPaused(channels[knifedrawsound], false);
+                                                                               emit_sound_at(knifedrawsound, coords, 128);
                                                                        }
 
                                                                        if(victim&&hasvictim){
                                                                                XYZ footvel,footpoint;
 
-                                                                               PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, true);
-                                                                               OPENAL_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[fleshstabremovesound], 128);
-                                                                               OPENAL_SetPaused(channels[fleshstabremovesound], false);
+                                                                               emit_sound_at(fleshstabremovesound, coords, 128.);
 
                                                                                footvel=0;
                                                                                footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
@@ -2876,33 +2457,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);
-                                                                                               OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[heavyimpactsound], 128);
-                                                                                               OPENAL_SetPaused(channels[heavyimpactsound], false);
-                                                                                       }
-                                                                               }
-                                                                               else {
-                                                                                       if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( landsound2, samp[landsound2], NULL, true);
-                                                                                               OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[landsound2], 256);
-                                                                                               OPENAL_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;
@@ -2923,9 +2481,7 @@ void      Person::DoAnimations(){
                                                                                victim->Puff(abdomen);
                                                                                victim->DoDamage(damagemult*60/victim->protectionhigh);
 
-                                                                               if(id==0){
-                                                                                       SolidHitBonus();
-                                                                               }
+                                                                               SolidHitBonus(id);
                                                                        }
                                                                }
 
@@ -2934,37 +2490,19 @@ 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);
-                                                                                               OPENAL_3D_SetAttributes(channels[thudsound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[thudsound], 512);
-                                                                                               OPENAL_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);
-                                                                                               OPENAL_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[whooshhitsound], 512);
-                                                                                               OPENAL_SetPaused(channels[whooshhitsound], false);
+                                                                                               emit_sound_at(whooshhitsound, victim->coords);
                                                                                        }
                                                                                }
                                                                                else {
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
-                                                                                               OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[heavyimpactsound], 256);
-                                                                                               OPENAL_SetPaused(channels[heavyimpactsound], false);
+                                                                                               emit_sound_at(heavyimpactsound, victim->coords);
                                                                                        }
                                                                                }
 
@@ -2990,28 +2528,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);
-                                                                               OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[landsound2], 256);
-                                                                               OPENAL_SetPaused(channels[landsound2], false);
+                                                                               emit_sound_at(landsound2, victim->coords);
 
                                                                                Puff(righthand);
                                                                        }
@@ -3020,30 +2544,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);
-                                                                                               OPENAL_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[swordstaffsound], 512);
-                                                                                               OPENAL_SetPaused(channels[swordstaffsound], false);
+                                                                                               emit_sound_at(swordstaffsound, victim->coords);
                                                                                        }
                                                                                        else{
-                                                                                               PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
-                                                                                               OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[metalhitsound], 512);
-                                                                                               OPENAL_SetPaused(channels[metalhitsound], false);
+                                                                                               emit_sound_at(metalhitsound, victim->coords);
                                                                                        }
                                                                                }
 
@@ -3080,28 +2590,11 @@ void    Person::DoAnimations(){
                                                                        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);
-                                                                                               OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[knifeslicesound], 512);
-                                                                                               OPENAL_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)){
@@ -3145,40 +2638,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;
-                                                                                       }
+                                                                                       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);
-                                                                                               OPENAL_3D_SetAttributes(channels[swordslicesound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[swordslicesound], 512);
-                                                                                               OPENAL_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;
@@ -3208,31 +2682,15 @@ void    Person::DoAnimations(){
                                                                                        }
                                                                                }
                                                                                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);
-                                                                                                       OPENAL_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
-                                                                                                       OPENAL_SetVolume(channels[swordstaffsound], 512);
-                                                                                                       OPENAL_SetPaused(channels[swordstaffsound], false);
+                                                                                                       emit_sound_at(swordstaffsound, victim->coords);
                                                                                                }
                                                                                                else{
-                                                                                                       PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
-                                                                                                       OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
-                                                                                                       OPENAL_SetVolume(channels[metalhitsound], 512);
-                                                                                                       OPENAL_SetPaused(channels[metalhitsound], false);
+                                                                                                       emit_sound_at(metalhitsound, victim->coords);
                                                                                                }
                                                                                        }
 
@@ -3282,18 +2740,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[staffheadsound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[staffheadsound], 256);
-                                                                                       OPENAL_SetPaused(channels[staffheadsound], false);
+                                                                                       emit_sound_at(staffheadsound, victim->coords);
                                                                                }
                                                                                victim->RagDoll(0);
                                                                                XYZ relative;
@@ -3313,11 +2760,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);
                                                                                }
                                                                        }
                                                                }
@@ -3331,18 +2774,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[staffheadsound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[staffheadsound], 256);
-                                                                                       OPENAL_SetPaused(channels[staffheadsound], false);
+                                                                                       emit_sound_at(staffheadsound, victim->coords);
                                                                                }
                                                                                victim->RagDoll(0);
                                                                                XYZ relative;
@@ -3359,11 +2791,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);
                                                                                }
                                                                        }
                                                                }
@@ -3377,18 +2805,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[staffbodysound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[staffbodysound], 256);
-                                                                                       OPENAL_SetPaused(channels[staffbodysound], false);
+                                                                                       emit_sound_at(staffbodysound, victim->coords);
                                                                                }
                                                                                victim->skeleton.longdead=0;
                                                                                victim->skeleton.free=1;
@@ -3427,11 +2844,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);
                                                                                }
                                                                                }
                                                                        }
@@ -3441,22 +2854,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){
@@ -3469,19 +2872,13 @@ void    Person::DoAnimations(){
                                                                                        }
                                                                                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
-                                                                                               OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[heavyimpactsound], 128);
-                                                                                               OPENAL_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);
-                                                                                               OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                                               OPENAL_SetPaused(channels[clawslicesound], false);
+                                                                                               emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                                victim->spurt=1;
                                                                                                victim->DoBloodBig(2/victim->armorhead,175);
                                                                                        }
@@ -3497,18 +2894,12 @@ void    Person::DoAnimations(){
                                                                                        victim->targetrotation=targetrotation+180;
                                                                                        victim->target=0;
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( landsound2, samp[landsound2], NULL, true);
-                                                                                               OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[landsound2], 128);
-                                                                                               OPENAL_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);
-                                                                                               OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                                               OPENAL_SetPaused(channels[clawslicesound], false);
+                                                                                               emit_sound_at(clawslicesound, victim->coords, 128.);
                                                                                                victim->spurt=1;
                                                                                                victim->DoBloodBig(2/victim->armorhigh,170);
                                                                                        }
@@ -3521,19 +2912,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[landsound2], 128);
-                                                                                       OPENAL_SetPaused(channels[landsound2], false);
+                                                                                       emit_sound_at(landsound2, victim->coords, 128.);
                                                                                }
                                                                                XYZ relative;
                                                                                relative=victim->coords-coords;
@@ -3572,18 +2952,13 @@ void    Person::DoAnimations(){
                                                                                        victim->targetrotation=targetrotation+180;
                                                                                        victim->target=0;
                                                                                        if(tutoriallevel!=1){
-                                                                                               PlaySoundEx( landsound2, samp[landsound2], NULL, true);
-                                                                                               OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
-                                                                                               OPENAL_SetVolume(channels[landsound2], 128);
-                                                                                               OPENAL_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);
 
                                                                        }
                                                                }
@@ -3596,25 +2971,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);
-                                                                               OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[heavyimpactsound], 128);
-                                                                               OPENAL_SetPaused(channels[heavyimpactsound], false);
+                                                                               emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                        }
                                                                        if(creature==wolftype){
-                                                                               PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
-                                                                               OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                               OPENAL_SetPaused(channels[clawslicesound], false);
+                                                                               emit_sound_at(clawslicesound, victim->coords, 128);
                                                                                victim->spurt=1;
                                                                                victim->DoBloodBig(2/victim->armorhigh,170);
                                                                        }
@@ -3632,11 +2993,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){
@@ -3666,18 +3023,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);
-                                                                       OPENAL_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[whooshhitsound], 128);
-                                                                       OPENAL_SetPaused(channels[whooshhitsound], false);
+                                                                       emit_sound_at(whooshhitsound, victim->coords, 128.);
                                                                        victim->RagDoll(0);
                                                                        XYZ relative;
                                                                        relative=victim->coords-oldcoords;
@@ -3700,33 +3046,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);
-                                                                               OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[heavyimpactsound], 128);
-                                                                               OPENAL_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;
@@ -3766,39 +3093,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[knifeslicesound], 512);
-                                                                                       OPENAL_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);
-                                                                                       OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                                       OPENAL_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);
                                                                                }
@@ -3828,30 +3137,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);
-                                                                       OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[knifeslicesound], 512);
-                                                                       OPENAL_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){
@@ -3861,19 +3147,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);
-                                                                               OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[heavyimpactsound], 128);
-                                                                               OPENAL_SetPaused(channels[heavyimpactsound], false);
+                                                                               emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                        }
                                                                        victim->RagDoll(0);
                                                                        XYZ relative;
@@ -3889,11 +3164,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){
@@ -3916,38 +3187,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[knifeslicesound], 512);
-                                                                                       OPENAL_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);
-                                                                                       OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                                       OPENAL_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){
@@ -3973,20 +3226,10 @@ void    Person::DoAnimations(){
                                                                                        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;
-                                                                                       }
+                                                                                       award_bonus(id, Stabbonus);
                                                                                        XYZ footvel,footpoint;
                                                                                        footvel=0;
                                                                                        footpoint=weapons.tippoint[weaponids[0]];
@@ -4000,18 +3243,7 @@ void     Person::DoAnimations(){
                                                                                }
                                                                                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);
-                                                                               OPENAL_3D_SetAttributes(channels[fleshstabsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[fleshstabsound], 512);
-                                                                               OPENAL_SetPaused(channels[fleshstabsound], false);
+                                                                               emit_sound_at(fleshstabsound, victim->coords);
                                                                                if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
                                                                                weapons.blooddrip[weaponids[weaponactive]]+=5;
                                                                        }
@@ -4030,18 +3262,7 @@ 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);
-                                                                               OPENAL_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[fleshstabremovesound], 512);
-                                                                               OPENAL_SetPaused(channels[fleshstabremovesound], false);
+                                                                               emit_sound_at(fleshstabremovesound, victim->coords);
                                                                                if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
                                                                                weapons.blooddrip[weaponids[weaponactive]]+=5;
 
@@ -4059,11 +3280,7 @@ void     Person::DoAnimations(){
 
                                                                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;
 
@@ -4080,18 +3297,7 @@ void     Person::DoAnimations(){
                                                                                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);
-                                                                               OPENAL_3D_SetAttributes(channels[fleshstabsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[fleshstabsound], 512);
-                                                                               OPENAL_SetPaused(channels[fleshstabsound], false);
+                                                                               emit_sound_at(fleshstabsound, victim->coords);
                                                                                if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
                                                                                weapons.blooddrip[weaponids[weaponactive]]+=5;
                                                                        }
@@ -4104,18 +3310,7 @@ 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);
-                                                                               OPENAL_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[fleshstabremovesound], 512);
-                                                                               OPENAL_SetPaused(channels[fleshstabremovesound], false);
+                                                                               emit_sound_at(fleshstabremovesound, victim->coords);
                                                                                if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
                                                                                weapons.blooddrip[weaponids[weaponactive]]+=5;
 
@@ -4138,20 +3333,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);
-                                                                                       OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[heavyimpactsound], 128);
-                                                                                       OPENAL_SetPaused(channels[heavyimpactsound], false);
+                                                                                       emit_sound_at(heavyimpactsound, victim->coords, 128.);
                                                                                }
                                                                        }
                                                                        bool doslice;
@@ -4161,28 +3345,18 @@ void    Person::DoAnimations(){
                                                                        if(doslice){
                                                                                if(weaponactive!=-1){
                                                                                        victim->DoBloodBig(2/victim->armorhead,225);
-                                                                                       PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, true);
-                                                                                       OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[knifeslicesound], 512);
-                                                                                       OPENAL_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);
-                                                                                       OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
-                                                                                       OPENAL_SetVolume(channels[clawslicesound], 128);
-                                                                                       OPENAL_SetPaused(channels[clawslicesound], false);
+                                                                                       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);
 
@@ -4222,11 +3396,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);
                                                                        }
                                                        }
 
@@ -4242,19 +3412,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);
-                                                                       OPENAL_3D_SetAttributes(channels[movewhooshsound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[movewhooshsound], 128);
-                                                                       OPENAL_SetPaused(channels[movewhooshsound], false);
+                                                                       emit_sound_at(movewhooshsound, coords, 128.);
                                                                }
                                                                if(currentanimation==staggerbackhighanim){
                                                                        targetanimation=getIdle();
@@ -4294,34 +3452,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);
-                                                                               OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[knifesheathesound], 128);
-                                                                               OPENAL_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);
-                                                                               OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
-                                                                               OPENAL_SetVolume(channels[knifedrawsound], 128);
-                                                                               OPENAL_SetPaused(channels[knifedrawsound], false);
+                                                                               emit_sound_at(knifedrawsound, coords, 128.);
                                                                        }
                                                                }
                                                                if(currentanimation==rollanim){
@@ -4541,18 +3675,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);
-                                                                       OPENAL_3D_SetAttributes(channels[landsound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[landsound], 128);
-                                                                       OPENAL_SetPaused(channels[landsound], false);
+                                                                       emit_sound_at(landsound, coords, 128);
 
                                                                        if(currentanimation==upunchreversedanim||currentanimation==swordslashreversedanim){
                                                                                targetanimation=rollanim;
@@ -4612,7 +3735,7 @@ void      Person::DoAnimations(){
                                                                                //DoDamage(100);
                                                                                RagDoll(0);
                                                                                skeleton.spinny=0;
-                                                                               if(id!=0)SolidHitBonus();
+                                                                               SolidHitBonus(!id); // FIXME: tricky id
                                                                        }
                                                                        if(feint){
                                                                                escapednum++;
@@ -4635,7 +3758,7 @@ void      Person::DoAnimations(){
                                                                                //DoDamage(100);
                                                                                RagDoll(0);
                                                                                skeleton.spinny=0;
-                                                                               if(id!=0)SolidHitBonus();
+                                                                               SolidHitBonus(!id); // FIXME: tricky id
                                                                        }
                                                                        if(feint){
                                                                                escapednum++;
@@ -4784,14 +3907,12 @@ 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();
@@ -4995,9 +4116,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){
@@ -5372,9 +4491,7 @@ void      Person::DoStuff(){
                unconscioustime=0;
 
                if(creature==wolftype){
-                       bonus=Wolfbonus;
-                       bonustime=0;
-                       bonusvalue=300;
+                 award_bonus(0, Wolfbonus);
                }
 
                RagDoll(0);
@@ -5462,16 +4579,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++;
                }
@@ -5480,18 +4592,7 @@ 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);
-               OPENAL_3D_SetAttributes(channels[breaksound], gLoc, vel);
-               OPENAL_SetVolume(channels[breaksound], 512);
-               OPENAL_SetPaused(channels[breaksound], false);
+               emit_sound_at(breaksound, coords);
                /*if(id==0||findDistancefast(&coords,&viewer)<50){
                slomo=1;
                slomodelay=.2;
@@ -5521,11 +4622,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;
@@ -5649,12 +4747,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;
@@ -5797,18 +4891,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);
-                               OPENAL_3D_SetAttributes(channels[movewhooshsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[movewhooshsound], 128);
-                               OPENAL_SetPaused(channels[movewhooshsound], false);
+                               emit_sound_at(movewhooshsound, coords, 128.);
 
                                currentanimation=targetanimation;
                                currentframe=targetframe-1;
@@ -5837,18 +4920,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);
-                                                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                                                               OPENAL_SetVolume(channels[firestartsound], 256);
-                                                               OPENAL_SetPaused(channels[firestartsound], false);
+                                                               emit_sound_at(firestartsound, objects.position[i]);
                                                        }
                                                        objects.onfire[i]=1;
                                                }
@@ -5862,18 +4934,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);
-                                                                       OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[firestartsound], 256);
-                                                                       OPENAL_SetPaused(channels[firestartsound], false);
+                                                                       emit_sound_at(firestartsound, objects.position[i]);
                                                                }
                                                                objects.onfire[i]=1;
                                                        }
@@ -5887,18 +4948,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);
-                                                               OPENAL_3D_SetAttributes(channels[bushrustle], gLoc, vel);
-                                                               OPENAL_SetVolume(channels[bushrustle], 40*findLength(&velocity));
-                                                               OPENAL_SetPaused(channels[bushrustle], false);
+                                                               emit_sound_at(bushrustle, coords, 40*findLength(&velocity));
 
                                                                if(id==0){
                                                                        envsound[numenvsounds]=coords;
@@ -5958,18 +5008,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);
-                                                                       OPENAL_3D_SetAttributes(channels[bushrustle], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[bushrustle], 40*findLength(&velocity));
-                                                                       OPENAL_SetPaused(channels[bushrustle], false);
+                                                                       emit_sound_at(bushrustle, coords, 40*findLength(&velocity));
 
                                                                        if(id==0){
                                                                                envsound[numenvsounds]=coords;
@@ -6027,14 +5066,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){
@@ -6049,10 +5080,7 @@ void     Person::DoStuff(){
                                        speechdelay=.3;
 
                                        if(whichsound!=-1){
-                                               PlaySoundEx( whichsound, samp[whichsound], NULL, true);
-                                               OPENAL_3D_SetAttributes(channels[whichsound], gLoc, vel);
-                                               OPENAL_SetVolume(channels[whichsound], 512);
-                                               OPENAL_SetPaused(channels[whichsound], false);
+                                               emit_sound_at(whichsound, coords);
                                        }
                                }
 
@@ -6086,7 +5114,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;
@@ -6098,7 +5125,6 @@ void      Person::DoStuff(){
                                                lefthandmorphend=0;
                                                targetlefthandmorphness=1;
                                        }
-                                       //s}
 
                                        if(headmorphend!=3&&headmorphend!=5&&headmorphstart!=3&&headmorphstart!=5&&headmorphend!=0&&headmorphness==targetheadmorphness){
                                                headmorphness=0;
@@ -6465,18 +5491,7 @@ void     Person::DoStuff(){
                                                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);
-                                                       OPENAL_3D_SetAttributes(channels[landsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[landsound], 128);
-                                                       OPENAL_SetPaused(channels[landsound], false);
+                                                       emit_sound_at(landsound, coords, 128.);
 
                                                        if(id==0){
                                                                envsound[numenvsounds]=coords;
@@ -6532,25 +5547,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);
-                                                       OPENAL_3D_SetAttributes(channels[skidsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[skidsound], 128*velspeed/10);
-                                                       OPENAL_SetPaused(channels[skidsound], false);
+                                                       emit_sound_at(skidsound, coords, 128*velspeed/10);
                                                }
                                                else {
-                                                       PlaySoundEx( snowskidsound, samp[snowskidsound], NULL, true);
-                                                       OPENAL_3D_SetAttributes(channels[snowskidsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[snowskidsound], 128*velspeed/10);
-                                                       OPENAL_SetPaused(channels[snowskidsound], false);
+                                                       emit_sound_at(snowskidsound, coords, 128*velspeed/10);
                                                }
                                        }
 
@@ -6888,24 +5889,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)
@@ -6930,7 +5925,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();
@@ -7343,8 +6337,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){
-                                       //}
                                }
                        }
                }
@@ -7419,18 +6411,7 @@ int Person::SphereCheck(XYZ *p1,float radius, XYZ *p, XYZ *move, float *rotate,
                                                                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);
-                                                                       OPENAL_3D_SetAttributes(channels[landsound], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[landsound], 128);
-                                                                       OPENAL_SetPaused(channels[landsound], false);
+                                                                       emit_sound_at(landsound, coords, 128.);
 
                                                                        if(id==0){
                                                                                envsound[numenvsounds]=coords;