]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Person.cpp
A lot of clean up in MenuDraw.
[lugaru.git] / Source / Person.cpp
index 3640a0b224d54a146a39d0e7f87b1bbd7bb809b0..122800b519a37d459278e090a18f7da52cd47cde 100644 (file)
@@ -28,7 +28,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "Game.h"
 
 extern float multiplier;
-extern int channels[100];
 extern Terrain terrain;
 extern float gravity;
 extern int environment;
@@ -49,7 +48,6 @@ extern bool osx;
 extern bool autoslomo;
 extern float camerashake;
 extern float woozy;
-extern float terraindetail;
 extern float viewdistance;
 extern float blackout;
 extern int difficulty;
@@ -85,6 +83,8 @@ extern int indialogue;
 
 extern bool gamestarted;
 
+Person player[maxplayers];
+
 void Person::CheckKick()
 {
   if (!(hasvictim
@@ -123,7 +123,8 @@ void Person::CheckKick()
       velocity=facing*-10;
       velocity.y=5;
       skeleton.free=0;
-      if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
+      if(id==0)
+       resume_stream(whooshsound);
 
       award_bonus(id, cannon);
     }
@@ -176,10 +177,14 @@ int Person::getIdle(){
                        if(creature==wolftype)return wolfidle;
                }
                if(aitype==playercontrolled&&stunned<=0&&weaponactive!=-1){
-                       if(weapons.type[weaponids[weaponactive]]==knife)return knifefightidleanim;
-                       if(weapons.type[weaponids[weaponactive]]==sword&&victim->weaponactive!=-1)return swordfightidlebothanim;
-                       if(weapons.type[weaponids[weaponactive]]==sword)return swordfightidleanim;
-                       if(weapons.type[weaponids[weaponactive]]==staff)return swordfightidleanim;
+                       if(weapons[weaponids[weaponactive]].getType()==knife)
+                               return knifefightidleanim;
+                       if(weapons[weaponids[weaponactive]].getType()==sword&&victim->weaponactive!=-1)
+                               return swordfightidlebothanim;
+                       if(weapons[weaponids[weaponactive]].getType()==sword)
+                               return swordfightidleanim;
+                       if(weapons[weaponids[weaponactive]].getType()==staff)
+                               return swordfightidleanim;
                }
                if(aitype!=playercontrolled&&stunned<=0&&creature!=wolftype&&!pause)return fightsidestep;
        }
@@ -291,7 +296,6 @@ void Person::DoBlood(float howmuch,int which){
                        bleeding=howmuch+(float)abs(Random()%100)/200-.25;
                        bleedxint=0;
                        bleedyint=0;
-                       int texdetailint=realtexdetail;
                        if(creature==rabbittype)
                                while(bloodText[bleedxint*512*3+bleedyint*3+0]>which+4||bloodText[bleedxint*512*3+bleedyint*3+0]<which-4||bleedxint<10||bleedyint<10||bleedxint>500||bleedyint>500){
                                        bleedxint=abs(Random()%512);
@@ -396,9 +400,7 @@ void Person::DoBloodBig(float howmuch,int which){
                                offsetx=Random()%20;
                        }
                        if(which==220||which==215){
-                               //offsety=Random()%20;
                                offsetx=20;
-                               //offsetx=abs(Random()%80);
                        }
 
 
@@ -514,7 +516,7 @@ void Person::DoBloodBig(float howmuch,int which){
 }
 
 bool Person::DoBloodBigWhere(float howmuch,int which, XYZ where){
-       static int bleedxint,bleedyint,i,j;
+       static int i,j;
        static XYZ bloodvel;
        static XYZ startpoint,endpoint,colpoint,movepoint;
        static float rotationpoint;
@@ -733,322 +735,327 @@ bool Person::DoBloodBigWhere(float howmuch,int which, XYZ where){
 
 
 
-void Person::Reverse(){
-       if(victim->aitype==playercontrolled||hostiletime>1)
-               if(victim->targetanimation!=jumpupanim&&victim->targetanimation!=jumpdownanim&&((tutoriallevel!=1||cananger)&&hostile)){
-                       if(normaldotproduct(victim->facing,victim->coords-coords)>0&&!(victim->id==0&&difficulty<2)&&(creature!=wolftype||victim->creature==wolftype))return;
-                       if(victim->aitype!=playercontrolled&&staggerdelay>0)return;
-                       if(targetanimation==sweepanim){
-                               targetanimation=sweepreversedanim;
-                               currentanimation=sweepreversedanim;
-                               victim->currentanimation=sweepreversalanim;
-                               victim->targetanimation=sweepreversalanim;
-                       }
-                       if(targetanimation==spinkickanim){
-                               targetanimation=spinkickreversedanim;
-                               currentanimation=spinkickreversedanim;
-                               victim->currentanimation=spinkickreversalanim;
-                               victim->targetanimation=spinkickreversalanim;
-                       }
-                       if(targetanimation==upunchanim||targetanimation==rabbittacklinganim){
-                               if(targetanimation==rabbittacklinganim){
-                                       currentframe=6;
-                                       targetframe=7;
-                                       victim->currentframe=6;
-                                       victim->targetframe=7;
-                               }
-                               targetanimation=upunchreversedanim;
-                               currentanimation=upunchreversedanim;
-                               victim->currentanimation=upunchreversalanim;
-                               victim->targetanimation=upunchreversalanim;
-                       }
-                       if(targetanimation==staffhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
-                               if(victim->weaponactive!=-1){
-                                       victim->throwtogglekeydown=1;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
-                                       if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
-                                       weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[victim->num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-
-                                       victim->weaponactive=-1;
-                                       for(int j=0;j<numplayers;j++){
-                                               player[j].wentforweapon=0;
-                                }
-                               }
+void Person::Reverse()
+{
+  if (!((victim->aitype == playercontrolled
+        || hostiletime > 1
+        || staggerdelay <= 0)
+       && victim->targetanimation != jumpupanim
+       && victim->targetanimation != jumpdownanim
+       && (tutoriallevel != 1 || cananger)
+       && hostile))
+    return;
 
-                               targetanimation=staffhitreversedanim;
-                               currentanimation=staffhitreversedanim;
-                               victim->currentanimation=staffhitreversalanim;
-                               victim->targetanimation=staffhitreversalanim;
-                       }
-                       if(targetanimation==staffspinhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%2==0)){
-                               if(victim->weaponactive!=-1){
-                                       victim->throwtogglekeydown=1;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
-                                       if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
-                                       weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[victim->num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-
-                                       victim->weaponactive=-1;
-                                       for(int j=0;j<numplayers;j++){
-                                               player[j].wentforweapon=0;
-                                }
-                               }
-                               targetanimation=staffspinhitreversedanim;
-                               currentanimation=staffspinhitreversedanim;
-                               victim->currentanimation=staffspinhitreversalanim;
-                               victim->targetanimation=staffspinhitreversalanim;
-                       }
-                       if(targetanimation==swordslashanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
-                               if(victim->weaponactive!=-1){
-                                       victim->throwtogglekeydown=1;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
-                                       if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
-                                       weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[victim->num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-
-                                       victim->weaponactive=-1;
-                                       for(int j=0;j<numplayers;j++){
-                                               player[j].wentforweapon=0;
-                                }
-                               }
-                               targetanimation=swordslashreversedanim;
-                               currentanimation=swordslashreversedanim;
-                               victim->currentanimation=swordslashreversalanim;
-                               victim->targetanimation=swordslashreversalanim;
-                       }
-                       if(targetanimation==knifeslashstartanim&&findDistancefast(&victim->coords,&coords)<2&&(victim->id==0||Random()%4==0)){
-                               if(victim->weaponactive!=-1){
-                                       victim->throwtogglekeydown=1;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
-                                       if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
-                                       weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[victim->num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-
-                                       victim->weaponactive=-1;
-                                       for(int j=0;j<numplayers;j++){
-                                               player[j].wentforweapon=0;
-                                }
-                               }
-                               targetanimation=knifeslashreversedanim;
-                               currentanimation=knifeslashreversedanim;
-                               victim->currentanimation=knifeslashreversalanim;
-                               victim->targetanimation=knifeslashreversalanim;
-                       }
-                       if(targetanimation!=knifeslashstartanim&&targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim&&targetanimation!=winduppunchanim&&targetanimation!=wolfslapanim&&targetanimation!=swordslashanim&&targetanimation!=swordslashanim){
-                               victim->targettilt2=targettilt2;
-                               victim->currentframe=currentframe;
-                               victim->targetframe=targetframe;
-                               victim->target=target;
-                               victim->velocity=0;
-                               victim->oldcoords=victim->coords;
-                               victim->coords=coords;
-                               victim->targetrotation=targetrotation;
-                               victim->rotation=targetrotation;
-                               victim->victim=this;
-                       }
-                       if(targetanimation==winduppunchanim){
-                               targetanimation=winduppunchblockedanim;
-                               victim->targetanimation=blockhighleftanim;
-                               victim->targetframe=1;
-                               victim->target=.5;
-                               victim->victim=this;
-                               victim->targetrotation=targetrotation+180;
-                       }
-                       if(targetanimation==wolfslapanim){
-                               targetanimation=winduppunchblockedanim;
-                               victim->targetanimation=blockhighleftanim;
-                               victim->targetframe=1;
-                               victim->target=.5;
-                               victim->victim=this;
-                               victim->targetrotation=targetrotation+180;
-                       }
-                       if((targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim)&&victim->weaponactive!=-1){
-                               targetanimation=swordslashparriedanim;
-                               parriedrecently=.4;
-                               victim->parriedrecently=0;
-                               victim->targetanimation=swordslashparryanim;
-                               victim->targetframe=1;
-                               victim->target=.5;
-                               victim->victim=this;
-                               victim->targetrotation=targetrotation+180;
-
-                               if(abs(Random()%20)==0||weapons.type[victim->weaponids[victim->weaponactive]]==knife){
-                                       if(victim->weaponactive!=-1){
-                                               if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
-                                                       if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
-                                                       if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
-                                                       emit_sound_at(swordstaffsound, victim->coords);
-                                               }
-                                               else{
-                                                       emit_sound_at(metalhitsound, victim->coords);
-                                               }
-                                       }
-                                       XYZ aim;
-                                       victim->Puff(righthand);
-                                       victim->target=0;
-                                       victim->targetframe=0;
-                                       victim->targetanimation=staggerbackhighanim;
-                                       victim->targetrotation=targetrotation+180;
-                                       victim->target=0;
-                                       weapons.owner[victim->weaponids[0]]=-1;
-                                       aim=DoRotation(facing,0,90,0)*21;
-                                       aim.y+=7;
-                                       weapons.velocity[victim->weaponids[0]]=aim*-.2;
-                                       weapons.tipvelocity[victim->weaponids[0]]=aim;
-                                       weapons.missed[victim->weaponids[0]]=1;
-                                       weapons.hitsomething[victim->weaponids[0]]=0;
-                                       weapons.freetime[victim->weaponids[0]]=0;
-                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                       weapons.physics[victim->weaponids[0]]=1;
-                                       victim->num_weapons--;
-                                       if(victim->num_weapons){
-                                               victim->weaponids[0]=victim->weaponids[num_weapons];
-                                               if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
-                                }
-                                       victim->weaponactive=-1;
-                                       for(int i=0;i<numplayers;i++){
-                                               player[i].wentforweapon=0;
-                                }
+  if (normaldotproduct (victim->facing, victim->coords-coords) > 0
+      && (victim->id != 0 || difficulty >= 2)
+      && (creature != wolftype || victim->creature == wolftype))
+    return;
 
+  if(targetanimation==sweepanim){
+    targetanimation=sweepreversedanim;
+    currentanimation=sweepreversedanim;
+    victim->currentanimation=sweepreversalanim;
+    victim->targetanimation=sweepreversalanim;
+  }
+  if(targetanimation==spinkickanim){
+    targetanimation=spinkickreversedanim;
+    currentanimation=spinkickreversedanim;
+    victim->currentanimation=spinkickreversalanim;
+    victim->targetanimation=spinkickreversalanim;
+  }
+  if(targetanimation==upunchanim||targetanimation==rabbittacklinganim){
+    if(targetanimation==rabbittacklinganim){
+      currentframe=6;
+      targetframe=7;
+      victim->currentframe=6;
+      victim->targetframe=7;
+    }
+    targetanimation=upunchreversedanim;
+    currentanimation=upunchreversedanim;
+    victim->currentanimation=upunchreversalanim;
+    victim->targetanimation=upunchreversalanim;
+  }
+  if(targetanimation==staffhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
+    if(victim->weaponactive!=-1){
+      victim->throwtogglekeydown=1;
+      weapons[victim->weaponids[0]].owner=-1;
+      weapons[victim->weaponids[0]].velocity=victim->velocity*.2;
+      if(weapons[victim->weaponids[0]].velocity.x==0)weapons[victim->weaponids[0]].velocity.x=.1;
+      weapons[victim->weaponids[0]].tipvelocity=weapons[victim->weaponids[0]].velocity;
+      weapons[victim->weaponids[0]].missed=1;
+      weapons[victim->weaponids[0]].freetime=0;
+      weapons[victim->weaponids[0]].firstfree=1;
+      weapons[victim->weaponids[0]].physics=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[victim->num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
 
+      victim->weaponactive=-1;
+      for(int j=0;j<numplayers;j++){
+       player[j].wentforweapon=0;
+      }
+    }
 
+    targetanimation=staffhitreversedanim;
+    currentanimation=staffhitreversedanim;
+    victim->currentanimation=staffhitreversalanim;
+    victim->targetanimation=staffhitreversalanim;
+  }
+  if(targetanimation==staffspinhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%2==0)){
+    if(victim->weaponactive!=-1){
+      victim->throwtogglekeydown=1;
+      weapons[victim->weaponids[0]].owner=-1;
+      weapons[victim->weaponids[0]].velocity=victim->velocity*.2;
+      if(weapons[victim->weaponids[0]].velocity.x==0)weapons[victim->weaponids[0]].velocity.x=.1;
+      weapons[victim->weaponids[0]].tipvelocity=weapons[victim->weaponids[0]].velocity;
+      weapons[victim->weaponids[0]].missed=1;
+      weapons[victim->weaponids[0]].freetime=0;
+      weapons[victim->weaponids[0]].firstfree=1;
+      weapons[victim->weaponids[0]].physics=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[victim->num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
 
+      victim->weaponactive=-1;
+      for(int j=0;j<numplayers;j++){
+       player[j].wentforweapon=0;
+      }
+    }
+    targetanimation=staffspinhitreversedanim;
+    currentanimation=staffspinhitreversedanim;
+    victim->currentanimation=staffspinhitreversalanim;
+    victim->targetanimation=staffspinhitreversalanim;
+  }
+  if(targetanimation==swordslashanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
+    if(victim->weaponactive!=-1){
+      victim->throwtogglekeydown=1;
+      weapons[victim->weaponids[0]].owner=-1;
+      weapons[victim->weaponids[0]].velocity=victim->velocity*.2;
+      if(weapons[victim->weaponids[0]].velocity.x==0)weapons[victim->weaponids[0]].velocity.x=.1;
+      weapons[victim->weaponids[0]].tipvelocity=weapons[victim->weaponids[0]].velocity;
+      weapons[victim->weaponids[0]].missed=1;
+      weapons[victim->weaponids[0]].freetime=0;
+      weapons[victim->weaponids[0]].firstfree=1;
+      weapons[victim->weaponids[0]].physics=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[victim->num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
 
-                               }
+      victim->weaponactive=-1;
+      for(int j=0;j<numplayers;j++){
+       player[j].wentforweapon=0;
+      }
+    }
+    targetanimation=swordslashreversedanim;
+    currentanimation=swordslashreversedanim;
+    victim->currentanimation=swordslashreversalanim;
+    victim->targetanimation=swordslashreversalanim;
+  }
+  if(targetanimation==knifeslashstartanim&&findDistancefast(&victim->coords,&coords)<2&&(victim->id==0||Random()%4==0)){
+    if(victim->weaponactive!=-1){
+      victim->throwtogglekeydown=1;
+      weapons[victim->weaponids[0]].owner=-1;
+      weapons[victim->weaponids[0]].velocity=victim->velocity*.2;
+      if(weapons[victim->weaponids[0]].velocity.x==0)weapons[victim->weaponids[0]].velocity.x=.1;
+      weapons[victim->weaponids[0]].tipvelocity=weapons[victim->weaponids[0]].velocity;
+      weapons[victim->weaponids[0]].missed=1;
+      weapons[victim->weaponids[0]].freetime=0;
+      weapons[victim->weaponids[0]].firstfree=1;
+      weapons[victim->weaponids[0]].physics=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[victim->num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
 
-                               if(abs(Random()%20)==0){
-                                       if(weaponactive!=-1){
-                                               if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
-                                                       if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
-                                                       if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
+      victim->weaponactive=-1;
+      for(int j=0;j<numplayers;j++){
+       player[j].wentforweapon=0;
+      }
+    }
+    targetanimation=knifeslashreversedanim;
+    currentanimation=knifeslashreversedanim;
+    victim->currentanimation=knifeslashreversalanim;
+    victim->targetanimation=knifeslashreversalanim;
+  }
+  if(targetanimation!=knifeslashstartanim&&targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim&&targetanimation!=winduppunchanim&&targetanimation!=wolfslapanim&&targetanimation!=swordslashanim&&targetanimation!=swordslashanim){
+    victim->targettilt2=targettilt2;
+    victim->currentframe=currentframe;
+    victim->targetframe=targetframe;
+    victim->target=target;
+    victim->velocity=0;
+    victim->oldcoords=victim->coords;
+    victim->coords=coords;
+    victim->targetrotation=targetrotation;
+    victim->rotation=targetrotation;
+    victim->victim=this;
+  }
+  if(targetanimation==winduppunchanim){
+    targetanimation=winduppunchblockedanim;
+    victim->targetanimation=blockhighleftanim;
+    victim->targetframe=1;
+    victim->target=.5;
+    victim->victim=this;
+    victim->targetrotation=targetrotation+180;
+  }
+  if(targetanimation==wolfslapanim){
+    targetanimation=winduppunchblockedanim;
+    victim->targetanimation=blockhighleftanim;
+    victim->targetframe=1;
+    victim->target=.5;
+    victim->victim=this;
+    victim->targetrotation=targetrotation+180;
+  }
+  if((targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim)&&victim->weaponactive!=-1){
+    targetanimation=swordslashparriedanim;
+    parriedrecently=.4;
+    victim->parriedrecently=0;
+    victim->targetanimation=swordslashparryanim;
+    victim->targetframe=1;
+    victim->target=.5;
+    victim->victim=this;
+    victim->targetrotation=targetrotation+180;
+
+    if(abs(Random()%20)==0||weapons[victim->weaponids[victim->weaponactive]].getType()==knife){
+      if(victim->weaponactive!=-1){
+               if(weapons[victim->weaponids[0]].getType()==staff||weapons[weaponids[0]].getType()==staff) {
+                 if(weapons[victim->weaponids[0]].getType()==staff)
+                       weapons[victim->weaponids[0]].damage+=.2+float(abs(Random()%100)-50)/250;
+                 if(weapons[weaponids[0]].getType()==staff)
+                       weapons[weaponids[0]].damage+=.2+float(abs(Random()%100)-50)/250;
+                 emit_sound_at(swordstaffsound, victim->coords);
+               }
+               else{
+                 emit_sound_at(metalhitsound, victim->coords);
+               }
+      }
+      XYZ aim;
+      victim->Puff(righthand);
+      victim->target=0;
+      victim->targetframe=0;
+      victim->targetanimation=staggerbackhighanim;
+      victim->targetrotation=targetrotation+180;
+      victim->target=0;
+      weapons[victim->weaponids[0]].owner=-1;
+      aim=DoRotation(facing,0,90,0)*21;
+      aim.y+=7;
+      weapons[victim->weaponids[0]].velocity=aim*-.2;
+      weapons[victim->weaponids[0]].tipvelocity=aim;
+      weapons[victim->weaponids[0]].missed=1;
+      weapons[victim->weaponids[0]].hitsomething=0;
+      weapons[victim->weaponids[0]].freetime=0;
+      weapons[victim->weaponids[0]].firstfree=1;
+      weapons[victim->weaponids[0]].physics=1;
+      victim->num_weapons--;
+      if(victim->num_weapons){
+       victim->weaponids[0]=victim->weaponids[num_weapons];
+       if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
+      }
+      victim->weaponactive=-1;
+      for(int i=0;i<numplayers;i++){
+       player[i].wentforweapon=0;
+      }
+    }
 
-                                                       emit_sound_at(swordstaffsound, coords);
-                                               }
-                                               else{
-                                                       emit_sound_at(metalhitsound, coords);
-                                               }
-                                       }
+    if(abs(Random()%20)==0){
+      if(weaponactive!=-1){
+       if(weapons[victim->weaponids[0]].getType()==staff||weapons[weaponids[0]].getType()==staff){
+         if(weapons[victim->weaponids[0]].getType()==staff)weapons[victim->weaponids[0]].damage+=.2+float(abs(Random()%100)-50)/250;
+         if(weapons[weaponids[0]].getType()==staff)weapons[weaponids[0]].damage+=.2+float(abs(Random()%100)-50)/250;
 
-                                       XYZ aim;
-                                       Puff(righthand);
-                                       target=0;
-                                       targetframe=0;
-                                       targetanimation=staggerbackhighanim;
-                                       targetrotation=targetrotation+180;
-                                       target=0;
-                                       weapons.owner[weaponids[0]]=-1;
-                                       aim=DoRotation(facing,0,90,0)*21;
-                                       aim.y+=7;
-                                       weapons.velocity[weaponids[0]]=aim*-.2;
-                                       weapons.tipvelocity[weaponids[0]]=aim;
-                                       weapons.hitsomething[weaponids[0]]=0;
-                                       weapons.missed[weaponids[0]]=1;
-                                       weapons.freetime[weaponids[0]]=0;
-                                       weapons.firstfree[weaponids[0]]=1;
-                                       weapons.physics[weaponids[0]]=1;
-                                       num_weapons--;
-                                       if(num_weapons){
-                                               weaponids[0]=weaponids[num_weapons];
-                                               if(weaponstuck==num_weapons)weaponstuck=0;
-                                }
-                                       weaponactive=-1;
-                                       for(int i=0;i<numplayers;i++){
-                                               player[i].wentforweapon=0;
-                                }
+         emit_sound_at(swordstaffsound, coords);
+       }
+       else{
+         emit_sound_at(metalhitsound, coords);
+       }
+      }
 
+      XYZ aim;
+      Puff(righthand);
+      target=0;
+      targetframe=0;
+      targetanimation=staggerbackhighanim;
+      targetrotation=targetrotation+180;
+      target=0;
+      weapons[weaponids[0]].owner=-1;
+      aim=DoRotation(facing,0,90,0)*21;
+      aim.y+=7;
+      weapons[weaponids[0]].velocity=aim*-.2;
+      weapons[weaponids[0]].tipvelocity=aim;
+      weapons[weaponids[0]].hitsomething=0;
+      weapons[weaponids[0]].missed=1;
+      weapons[weaponids[0]].freetime=0;
+      weapons[weaponids[0]].firstfree=1;
+      weapons[weaponids[0]].physics=1;
+      num_weapons--;
+      if(num_weapons){
+       weaponids[0]=weaponids[num_weapons];
+       if(weaponstuck==num_weapons)weaponstuck=0;
+      }
+      weaponactive=-1;
+      for(int i=0;i<numplayers;i++){
+       player[i].wentforweapon=0;
+      }
 
-                               }
-                       }
-                       if(hasvictim)
-                               if(targetanimation==knifeslashstartanim||targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim){
-                                       if((targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim)||findDistancefast(&coords,&victim->coords)>.2){
-                                               //victim->targetanimation=sweepanim;
-                                               victim->targetanimation=dodgebackanim;
-                                               victim->targetframe=0;
-                                               victim->target=0;
-                                               //victim->velocity=0;
-
-                                               XYZ rotatetarget;
-                                               rotatetarget=coords-victim->coords;
-                                               Normalise(&rotatetarget);
-                                               victim->targetrotation=-asin(0-rotatetarget.x);
-                                               victim->targetrotation*=360/6.28;
-                                               if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
-
-                                               victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
-
-                                               victim->lastattack3=victim->lastattack2;
-                                               victim->lastattack2=victim->lastattack;
-                                               victim->lastattack=victim->targetanimation;
-                                       }
-                                       else
-                                       {
-                                               victim->targetanimation=sweepanim;
-                                               victim->targetframe=0;
-                                               victim->target=0;
-
-                                               XYZ rotatetarget;
-                                               rotatetarget=coords-victim->coords;
-                                               Normalise(&rotatetarget);
-                                               victim->targetrotation=-asin(0-rotatetarget.x);
-                                               victim->targetrotation*=360/6.28;
-                                               if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
-
-                                               victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
-
-                                               victim->lastattack3=victim->lastattack2;
-                                               victim->lastattack2=victim->lastattack;
-                                               victim->lastattack=victim->targetanimation;
-                                       }
-                               }
 
-                               velocity=0;
-                               victim->velocity=0;
+    }
+  }
+  if(hasvictim)
+    if(targetanimation==knifeslashstartanim||targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim){
+      if((targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim)||findDistancefast(&coords,&victim->coords)>.2){
+       victim->targetanimation=dodgebackanim;
+       victim->targetframe=0;
+       victim->target=0;
+
+       XYZ rotatetarget;
+       rotatetarget=coords-victim->coords;
+       Normalise(&rotatetarget);
+       victim->targetrotation=-asin(0-rotatetarget.x);
+       victim->targetrotation*=360/6.28;
+       if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
+
+       victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
+
+       victim->lastattack3=victim->lastattack2;
+       victim->lastattack2=victim->lastattack;
+       victim->lastattack=victim->targetanimation;
+      }
+      else
+       {
+         victim->targetanimation=sweepanim;
+         victim->targetframe=0;
+         victim->target=0;
+
+         XYZ rotatetarget;
+         rotatetarget=coords-victim->coords;
+         Normalise(&rotatetarget);
+         victim->targetrotation=-asin(0-rotatetarget.x);
+         victim->targetrotation*=360/6.28;
+         if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
+
+         victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
+
+         victim->lastattack3=victim->lastattack2;
+         victim->lastattack2=victim->lastattack;
+         victim->lastattack=victim->targetanimation;
+       }
+    }
 
-                               if(aitype!=playercontrolled)feint=0;
-                               if(aitype!=playercontrolled&&Random()%3==0&&escapednum<2&&difficulty==2)feint=1;
-                               if(aitype!=playercontrolled&&Random()%5==0&&escapednum<2&&difficulty==1)feint=1;
-                               if(aitype!=playercontrolled&&Random()%10==0&&escapednum<2&&difficulty==0)feint=1;
+  velocity=0;
+  victim->velocity=0;
 
-                               if(victim->id==0&&animation[victim->targetanimation].attack==reversal)numreversals++;
-               }
+  if(aitype!=playercontrolled)feint=0;
+  if(aitype!=playercontrolled&&Random()%3==0&&escapednum<2&&difficulty==2)feint=1;
+  if(aitype!=playercontrolled&&Random()%5==0&&escapednum<2&&difficulty==1)feint=1;
+  if(aitype!=playercontrolled&&Random()%10==0&&escapednum<2&&difficulty==0)feint=1;
+
+  if(victim->id==0&&animation[victim->targetanimation].attack==reversal)numreversals++;
 }
 
 void Person::DoDamage(float howmuch){
@@ -1319,8 +1326,8 @@ void Person::RagDoll(bool checkcollision){
                                skeleton.joints[j].position-=average;
                        }
 
-                       whichpatchx=coords.x/(terrain.size/subdivision*terrain.scale*terraindetail);
-                       whichpatchz=coords.z/(terrain.size/subdivision*terrain.scale*terraindetail);
+                       whichpatchx=coords.x/(terrain.size/subdivision*terrain.scale);
+                       whichpatchz=coords.z/(terrain.size/subdivision*terrain.scale);
                        if(terrain.patchobjectnum[whichpatchx][whichpatchz])
                                for(l=0;l<terrain.patchobjectnum[whichpatchx][whichpatchz];l++){
                                        i=terrain.patchobjects[whichpatchx][whichpatchz][l];
@@ -1344,15 +1351,15 @@ void Person::RagDoll(bool checkcollision){
 
                if(Random()%2==0){
                        if(weaponactive!=-1&&targetanimation!=rabbitkickanim&&num_weapons>0){
-                               weapons.owner[weaponids[0]]=-1;
-                               weapons.hitsomething[weaponids[0]]=0;
-                               weapons.velocity[weaponids[0]]=skeleton.joints[skeleton.jointlabels[righthand]].velocity*scale*-.3;
-                               weapons.velocity[weaponids[0]].x+=.01;
-                               weapons.tipvelocity[weaponids[0]]=skeleton.joints[skeleton.jointlabels[righthand]].velocity*scale;
-                               weapons.missed[weaponids[0]]=1;
-                               weapons.freetime[weaponids[0]]=0;
-                               weapons.firstfree[weaponids[0]]=1;
-                               weapons.physics[weaponids[0]]=1;
+                               weapons[weaponids[0]].owner=-1;
+                               weapons[weaponids[0]].hitsomething=0;
+                               weapons[weaponids[0]].velocity=skeleton.joints[skeleton.jointlabels[righthand]].velocity*scale*-.3;
+                               weapons[weaponids[0]].velocity.x+=.01;
+                               weapons[weaponids[0]].tipvelocity=skeleton.joints[skeleton.jointlabels[righthand]].velocity*scale;
+                               weapons[weaponids[0]].missed=1;
+                               weapons[weaponids[0]].freetime=0;
+                               weapons[weaponids[0]].firstfree=1;
+                               weapons[weaponids[0]].physics=1;
                                num_weapons--;
                                if(num_weapons){
                                        weaponids[0]=weaponids[num_weapons];
@@ -1498,7 +1505,7 @@ void      Person::DoAnimations(){
                        if(targetanimation==rollanim&&targetframe==3&&onfire){
                                onfire=0;
                                emit_sound_at(fireendsound, coords);
-                               OPENAL_SetPaused(channels[stream_firesound], true);
+                               pause_sound(stream_firesound);
                                deathbleeding=0;
                        }
 
@@ -1526,7 +1533,7 @@ void      Person::DoAnimations(){
                        }
 
                        if(!drawtogglekeydown&&drawkeydown&&(weaponactive==-1||num_weapons==1)&&(animation[targetanimation].label[targetframe]||(targetanimation!=currentanimation&&currentanimation==rollanim))&&num_weapons>0&&creature!=wolftype){
-                               if(weapons.type[weaponids[0]]==knife){
+                               if(weapons[weaponids[0]].getType()==knife){
                                        if(weaponactive==-1)weaponactive=0;
                                        else if(weaponactive==0)weaponactive=-1;
 
@@ -1640,16 +1647,16 @@ void    Person::DoAnimations(){
                                                        targetframe++;
 
                                                        if(targetanimation==removeknifeanim&&animation[targetanimation].label[currentframe]==5){
-                                                               for(i=0;i<weapons.numweapons;i++){
-                                                                       if(/*weapons.velocity[i].x==0&&weapons.velocity[i].y==0&&weapons.velocity[i].z==0&&*/weapons.owner[i]==-1)
-                                                                               if(findDistancefastflat(&coords,&weapons.position[i])<4&&weaponactive==-1){
-                                                                                       if(findDistancefast(&coords,&weapons.position[i])>=1){
-                                                                                               if(weapons.type[i]!=staff){
+                                                               for(i=0;i<weapons.size();i++){
+                                                                       if(weapons[i].owner==-1)
+                                                                               if(findDistancefastflat(&coords,&weapons[i].position)<4&&weaponactive==-1){
+                                                                                       if(findDistancefast(&coords,&weapons[i].position)>=1){
+                                                                                               if(weapons[i].getType()!=staff){
                                                                                                        emit_sound_at(knifedrawsound, coords, 128.);
                                                                                                }
 
                                                                                                weaponactive=0;
-                                                                                               weapons.owner[i]=id;
+                                                                                               weapons[i].owner=id;
                                                                                                if(num_weapons>0){
                                                                                                        weaponids[num_weapons]=weaponids[0];
                                                                                                }
@@ -1660,36 +1667,34 @@ void    Person::DoAnimations(){
                                                                }
                                                        }
 
-                                                       static bool willwork;
                                                        if(targetanimation==crouchremoveknifeanim&&animation[targetanimation].label[currentframe]==5){
-                                                               for(i=0;i<weapons.numweapons;i++){
-                                                                       bool willwork=1;
-                                                                       if(weapons.owner[i]!=-1)
-                                                                               if(player[weapons.owner[i]].weaponstuck!=-1)
-                                                                                       if(player[weapons.owner[i]].weaponids[player[weapons.owner[i]].weaponstuck]==i)
-                                                                                               if(player[weapons.owner[i]].num_weapons>1)willwork=0;
-                                                                       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){
-                                                                                               bool fleshstuck=0;
-                                                                                               if(weapons.owner[i]!=-1)
+                                                               for(i=0;i<weapons.size();i++){
+                                                                       bool willwork=true;
+                                                                       if(weapons[i].owner!=-1)
+                                                                               if(player[weapons[i].owner].weaponstuck!=-1)
+                                                                                       if(player[weapons[i].owner].weaponids[player[weapons[i].owner].weaponstuck]==i)
+                                                                                               if(player[weapons[i].owner].num_weapons>1)willwork=0;
+                                                                       if((weapons[i].owner==-1)||(hasvictim&&weapons[i].owner==victim->id&&victim->skeleton.free))
+                                                                               if(willwork&&findDistancefastflat(&coords,&weapons[i].position)<3&&weaponactive==-1){
+                                                                                       if(findDistancefast(&coords,&weapons[i].position)<1||hasvictim){
+                                                                                               bool fleshstuck=false;
+                                                                                               if(weapons[i].owner!=-1)
                                                                                                        if(victim->weaponstuck!=-1){
                                                                                                                if(victim->weaponids[victim->weaponstuck]==i){
-                                                                                                                       fleshstuck=1;
-                                                                                                               }
-                                                                                                       }
-                                                                                                       if(!fleshstuck){
-                                                                                                               if(weapons.type[i]!=staff){
-                                                                                                                       emit_sound_at(knifedrawsound, coords, 128.);
+                                                                                                                       fleshstuck=true;
                                                                                                                }
                                                                                                        }
                                                                                                        if(fleshstuck){
                                                                                                                emit_sound_at(fleshstabremovesound, coords, 128.);
+                                                                                                       } else {
+                                                                                                               if(weapons[i].getType()!=staff){
+                                                                                                                       emit_sound_at(knifedrawsound, coords, 128.);
+                                                                                                               }
                                                                                                        }
                                                                                                        weaponactive=0;
-                                                                                                       if(weapons.owner[i]!=-1){
+                                                                                                       if(weapons[i].owner!=-1){
 
-                                                                                                               victim=&player[weapons.owner[i]];
+                                                                                                               victim=&player[weapons[i].owner];
                                                                                                                if(victim->num_weapons==1)victim->num_weapons=0;
                                                                                                                else victim->num_weapons=1;
 
@@ -1709,12 +1714,12 @@ void    Person::DoAnimations(){
                                                                                                                Normalise(&relative);
                                                                                                                XYZ footvel,footpoint;
                                                                                                                footvel=0;
-                                                                                                               footpoint=weapons.position[i];
+                                                                                                               footpoint=weapons[i].position;
                                                                                                                if(victim->weaponstuck!=-1){
                                                                                                                        if(victim->weaponids[victim->weaponstuck]==i){
                                                                                                                                if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
-                                                                                                                               weapons.bloody[i]=2;
-                                                                                                                               weapons.blooddrip[i]=5;
+                                                                                                                               weapons[i].bloody=2;
+                                                                                                                               weapons[i].blooddrip=5;
                                                                                                                                victim->weaponstuck=-1;
                                                                                                                        }
                                                                                                                }
@@ -1729,7 +1734,7 @@ void      Person::DoAnimations(){
                                                                                                                victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity+=relative*6;
                                                                                                                victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity+=relative*6;
                                                                                                        }
-                                                                                                       weapons.owner[i]=id;
+                                                                                                       weapons[i].owner=id;
                                                                                                        if(num_weapons>0){
                                                                                                                weaponids[num_weapons]=weaponids[0];
                                                                                                        }
@@ -2091,7 +2096,7 @@ void      Person::DoAnimations(){
                                                                                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);
+                                                                               terrain.MakeDecal(blooddecalfast,(weapons[weaponids[weaponactive]].tippoint*.8+weapons[weaponids[weaponactive]].position*.2),.08,.6,Random()%360);
                                                                                emit_sound_at(knifesheathesound, coords, 128.);
                                                                        }
 
@@ -2101,8 +2106,8 @@ void      Person::DoAnimations(){
                                                                                        XYZ where,startpoint,endpoint,movepoint,colpoint;
                                                                                        float rotationpoint;
                                                                                        int whichtri;
-                                                                                       if(weapons.type[weaponids[weaponactive]]==knife){
-                                                                                               where=(weapons.tippoint[weaponids[weaponactive]]*.6+weapons.position[weaponids[weaponactive]]*.4);
+                                                                                       if(weapons[weaponids[weaponactive]].getType()==knife){
+                                                                                               where=(weapons[weaponids[weaponactive]].tippoint*.6+weapons[weaponids[weaponactive]].position*.4);
                                                                                                where-=victim->coords;
                                                                                                if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
                                                                                                //where=scale;
@@ -2111,22 +2116,22 @@ void    Person::DoAnimations(){
                                                                                                endpoint=where;
                                                                                                endpoint.y-=100;
                                                                                        }
-                                                                                       if(weapons.type[weaponids[weaponactive]]==sword){
-                                                                                               where=weapons.position[weaponids[weaponactive]];
+                                                                                       if(weapons[weaponids[weaponactive]].getType()==sword){
+                                                                                               where=weapons[weaponids[weaponactive]].position;
                                                                                                where-=victim->coords;
                                                                                                if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
                                                                                                startpoint=where;
-                                                                                               where=weapons.tippoint[weaponids[weaponactive]];
+                                                                                               where=weapons[weaponids[weaponactive]].tippoint;
                                                                                                where-=victim->coords;
                                                                                                if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
                                                                                                endpoint=where;
                                                                                        }
-                                                                                       if(weapons.type[weaponids[weaponactive]]==staff){
-                                                                                               where=weapons.position[weaponids[weaponactive]];
+                                                                                       if(weapons[weaponids[weaponactive]].getType()==staff){
+                                                                                               where=weapons[weaponids[weaponactive]].position;
                                                                                                where-=victim->coords;
                                                                                                if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
                                                                                                startpoint=where;
-                                                                                               where=weapons.tippoint[weaponids[weaponactive]];
+                                                                                               where=weapons[weaponids[weaponactive]].tippoint;
                                                                                                where-=victim->coords;
                                                                                                if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
                                                                                                endpoint=where;
@@ -2141,7 +2146,7 @@ void      Person::DoAnimations(){
                                                                                                        if (!victim->dead)
                                                                                                          award_bonus(id, FinishedBonus);
                                                                                                }
-                                                                                               if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
+                                                                                               if(bloodtoggle)weapons[weaponids[weaponactive]].bloody=2;
 
                                                                                                victim->skeleton.longdead=0;
                                                                                                victim->skeleton.free=1;
@@ -2155,9 +2160,9 @@ void      Person::DoAnimations(){
                                                                                                emit_sound_at(fleshstabsound, coords, 128);
 
                                                                                        }
-                                                                                       if(whichtri!=-1||weapons.bloody[weaponids[weaponactive]]){
-                                                                                               weapons.blooddrip[weaponids[weaponactive]]+=5;
-                                                                                               weapons.blooddripdelay[weaponids[weaponactive]]=0;
+                                                                                       if(whichtri!=-1||weapons[weaponids[weaponactive]].bloody){
+                                                                                               weapons[weaponids[weaponactive]].blooddrip+=5;
+                                                                                               weapons[weaponids[weaponactive]].blooddripdelay=0;
                                                                                        }
                                                                                        if(whichtri==-1){
                                                                                                hasvictim=0;
@@ -2178,18 +2183,18 @@ void    Person::DoAnimations(){
                                                                                emit_sound_at(fleshstabremovesound, coords, 128.);
 
                                                                                footvel=0;
-                                                                               footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
+                                                                               footpoint=(weapons[weaponids[weaponactive]].tippoint*.8+weapons[weaponids[weaponactive]].position*.2);
 
-                                                                               if(weapons.type[weaponids[weaponactive]]==sword){
+                                                                               if(weapons[weaponids[weaponactive]].getType()==sword){
                                                                                        XYZ where,startpoint,endpoint,movepoint;
                                                                                        float rotationpoint;
                                                                                        int whichtri;
 
-                                                                                       where=weapons.position[weaponids[weaponactive]];
+                                                                                       where=weapons[weaponids[weaponactive]].position;
                                                                                        where-=victim->coords;
                                                                                        if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
                                                                                        startpoint=where;
-                                                                                       where=weapons.tippoint[weaponids[weaponactive]];
+                                                                                       where=weapons[weaponids[weaponactive]].tippoint;
                                                                                        where-=victim->coords;
                                                                                        if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
                                                                                        endpoint=where;
@@ -2200,19 +2205,19 @@ void    Person::DoAnimations(){
                                                                                        footpoint+=victim->coords;
 
                                                                                        if(whichtri==-1){
-                                                                                               footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
+                                                                                               footpoint=(weapons[weaponids[weaponactive]].tippoint*.8+weapons[weaponids[weaponactive]].position*.2);
                                                                                        }
                                                                                }
-                                                                               if(weapons.type[weaponids[weaponactive]]==staff){
+                                                                               if(weapons[weaponids[weaponactive]].getType()==staff){
                                                                                        XYZ where,startpoint,endpoint,movepoint;
                                                                                        float rotationpoint;
                                                                                        int whichtri;
 
-                                                                                       where=weapons.position[weaponids[weaponactive]];
+                                                                                       where=weapons[weaponids[weaponactive]].position;
                                                                                        where-=victim->coords;
                                                                                        if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
                                                                                        startpoint=where;
-                                                                                       where=weapons.tippoint[weaponids[weaponactive]];
+                                                                                       where=weapons[weaponids[weaponactive]].tippoint;
                                                                                        where-=victim->coords;
                                                                                        if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
                                                                                        endpoint=where;
@@ -2223,7 +2228,7 @@ void      Person::DoAnimations(){
                                                                                        footpoint+=victim->coords;
 
                                                                                        if(whichtri==-1){
-                                                                                               footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
+                                                                                               footpoint=(weapons[weaponids[weaponactive]].tippoint*.8+weapons[weaponids[weaponactive]].position*.2);
                                                                                        }
                                                                                }
                                                                                hasvictim=victim->DoBloodBigWhere(2,220,footpoint);
@@ -2256,8 +2261,8 @@ void      Person::DoAnimations(){
                                                                                }
                                                                        }
                                                                        if(!hasvictim&&onterrain){
-                                                                               weapons.bloody[weaponids[weaponactive]]=0;
-                                                                               weapons.blooddrip[weaponids[weaponactive]]=0;
+                                                                               weapons[weaponids[weaponactive]].bloody=0;
+                                                                               weapons[weaponids[weaponactive]].blooddrip=0;
                                                                        }
                                                                }
 
@@ -2358,9 +2363,9 @@ void      Person::DoAnimations(){
                                                                                if(victim->id==0)camerashake+=.4;
 
                                                                                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;
+                                                                                       if(weapons[victim->weaponids[0]].getType()==staff||weapons[weaponids[0]].getType()==staff){
+                                                                                               if(weapons[victim->weaponids[0]].getType()==staff)weapons[victim->weaponids[0]].damage+=.2+float(abs(Random()%100)-50)/250;
+                                                                                               if(weapons[weaponids[0]].getType()==staff)weapons[weaponids[0]].damage+=.2+float(abs(Random()%100)-50)/250;
 
                                                                                                emit_sound_at(swordstaffsound, victim->coords);
                                                                                        }
@@ -2377,19 +2382,19 @@ void    Person::DoAnimations(){
                                                                        if(weaponactive!=-1){
                                                                                escapednum=0;
                                                                                XYZ aim;
-                                                                               weapons.owner[weaponids[0]]=-1;
+                                                                               weapons[weaponids[0]].owner=-1;
                                                                                aim=victim->coords+DoRotation(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position,0,victim->rotation,0)*victim->scale+victim->velocity*findDistance(&victim->coords,&coords)/50-(coords+DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position,0,rotation,0)*scale);
                                                                                Normalise(&aim);
                                                                                /*if(victim->targetanimation==jumpupanim||victim->targetanimation==jumpdownanim){
                                                                                aim=DoRotation(aim,(float)abs(Random()%15)-7,(float)abs(Random()%15)-7,0);
                                                                                }*/
-                                                                               weapons.velocity[weaponids[0]]=aim*50;
-                                                                               weapons.tipvelocity[weaponids[0]]=aim*50;
-                                                                               weapons.missed[weaponids[0]]=0;
-                                                                               weapons.hitsomething[weaponids[0]]=0;
-                                                                               weapons.freetime[weaponids[0]]=0;
-                                                                               weapons.firstfree[weaponids[0]]=1;
-                                                                               weapons.physics[weaponids[0]]=0;
+                                                                               weapons[weaponids[0]].velocity=aim*50;
+                                                                               weapons[weaponids[0]].tipvelocity=aim*50;
+                                                                               weapons[weaponids[0]].missed=0;
+                                                                               weapons[weaponids[0]].hitsomething=0;
+                                                                               weapons[weaponids[0]].freetime=0;
+                                                                               weapons[weaponids[0]].firstfree=1;
+                                                                               weapons[weaponids[0]].physics=0;
                                                                                num_weapons--;
                                                                                if(num_weapons){
                                                                                        weaponids[0]=weaponids[num_weapons];
@@ -2421,8 +2426,8 @@ void      Person::DoAnimations(){
                                                                                        victim->highreversaldelay=0;
                                                                                        if(aitype!=playercontrolled)weaponmissdelay=.6;
 
-                                                                                       if(tutoriallevel!=1)if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
-                                                                                       if(tutoriallevel!=1)weapons.blooddrip[weaponids[weaponactive]]+=3;
+                                                                                       if(tutoriallevel!=1)if(bloodtoggle&&!weapons[weaponids[weaponactive]].bloody)weapons[weaponids[weaponactive]].bloody=1;
+                                                                                       if(tutoriallevel!=1)weapons[weaponids[weaponactive]].blooddrip+=3;
 
                                                                                        XYZ footvel,footpoint;
                                                                                        footvel=0;
@@ -2467,8 +2472,8 @@ void      Person::DoAnimations(){
                                                                                        }
 
                                                                                        if(tutoriallevel!=1){
-                                                                                               if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
-                                                                                               weapons.blooddrip[weaponids[weaponactive]]+=3;
+                                                                                               if(bloodtoggle&&!weapons[weaponids[weaponactive]].bloody)weapons[weaponids[weaponactive]].bloody=1;
+                                                                                               weapons[weaponids[weaponactive]].blooddrip+=3;
 
                                                                                                float bloodlossamount;
                                                                                                bloodlossamount=200+abs((float)(Random()%40))-20;
@@ -2495,9 +2500,9 @@ void      Person::DoAnimations(){
                                                                                }
                                                                                else {
                                                                                        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;
+                                                                                               if(weapons[victim->weaponids[0]].getType()==staff||weapons[weaponids[0]].getType()==staff){
+                                                                                                       if(weapons[victim->weaponids[0]].getType()==staff)weapons[victim->weaponids[0]].damage+=.2+float(abs(Random()%100)-50)/250;
+                                                                                                       if(weapons[weaponids[0]].getType()==staff)weapons[weaponids[0]].damage+=.2+float(abs(Random()%100)-50)/250;
 
                                                                                                        emit_sound_at(swordstaffsound, victim->coords);
                                                                                                }
@@ -2514,16 +2519,16 @@ void    Person::DoAnimations(){
                                                                                        victim->targetanimation=staggerbackhighanim;
                                                                                        victim->targetrotation=targetrotation+180;
                                                                                        victim->target=0;
-                                                                                       weapons.owner[victim->weaponids[0]]=-1;
+                                                                                       weapons[victim->weaponids[0]].owner=-1;
                                                                                        aim=DoRotation(facing,0,90,0)*21;
                                                                                        aim.y+=7;
-                                                                                       weapons.velocity[victim->weaponids[0]]=aim*-.2;
-                                                                                       weapons.tipvelocity[victim->weaponids[0]]=aim;
-                                                                                       weapons.missed[victim->weaponids[0]]=1;
-                                                                                       weapons.hitsomething[weaponids[0]]=0;
-                                                                                       weapons.freetime[victim->weaponids[0]]=0;
-                                                                                       weapons.firstfree[victim->weaponids[0]]=1;
-                                                                                       weapons.physics[victim->weaponids[0]]=1;
+                                                                                       weapons[victim->weaponids[0]].velocity=aim*-.2;
+                                                                                       weapons[victim->weaponids[0]].tipvelocity=aim;
+                                                                                       weapons[victim->weaponids[0]].missed=1;
+                                                                                       weapons[weaponids[0]].hitsomething=0;
+                                                                                       weapons[victim->weaponids[0]].freetime=0;
+                                                                                       weapons[victim->weaponids[0]].firstfree=1;
+                                                                                       weapons[victim->weaponids[0]].physics=1;
                                                                                        victim->num_weapons--;
                                                                                        if(victim->num_weapons){
                                                                                                victim->weaponids[0]=victim->weaponids[num_weapons];
@@ -2541,7 +2546,7 @@ void      Person::DoAnimations(){
                                                                if(targetanimation==staffhitanim&&animation[targetanimation].label[currentframe]==5&&victim->targetanimation!=rollanim){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5&&victim->targetanimation!=dodgebackanim&&victim->targetanimation!=sweepanim){
                                                                                if(tutoriallevel!=1){
-                                                                                       weapons.damage[weaponids[0]]+=.4+float(abs(Random()%100)-50)/250;
+                                                                                       weapons[weaponids[0]].damage+=.4+float(abs(Random()%100)-50)/250;
                                                                                        escapednum=0;
                                                                                        if(id==0)camerashake+=.4;
                                                                                        if(Random()%2||creature==wolftype){
@@ -2575,7 +2580,7 @@ void      Person::DoAnimations(){
                                                                if(targetanimation==staffspinhitanim&&animation[targetanimation].label[currentframe]==5&&victim->targetanimation!=rollanim){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5&&victim->targetanimation!=dodgebackanim&&victim->targetanimation!=sweepanim){
                                                                                if(tutoriallevel!=1){
-                                                                                       weapons.damage[weaponids[0]]+=.6+float(abs(Random()%100)-50)/250;
+                                                                                       weapons[weaponids[0]].damage+=.6+float(abs(Random()%100)-50)/250;
                                                                                        escapednum=0;
                                                                                        if(id==0)camerashake+=.4;
                                                                                        if(Random()%2||creature==wolftype){
@@ -2607,7 +2612,7 @@ void      Person::DoAnimations(){
                                                                        if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5){
                                                                                escapednum=0;
                                                                                if(tutoriallevel!=1){
-                                                                                       if(!victim->dead)weapons.damage[weaponids[0]]+=.4+float(abs(Random()%100)-50)/500;
+                                                                                       if(!victim->dead)weapons[weaponids[0]].damage+=.4+float(abs(Random()%100)-50)/500;
                                                                                        if(id==0)camerashake+=.4;
                                                                                        if(Random()%2||creature==wolftype){
                                                                                                victim->spurt=1;
@@ -2805,8 +2810,8 @@ void      Person::DoAnimations(){
 
                                                                if((targetanimation==swordslashreversalanim||targetanimation==knifeslashreversalanim||targetanimation==staffhitreversalanim||targetanimation==staffspinhitreversalanim)&&animation[targetanimation].label[currentframe]==5){
                                                                        if(victim->weaponactive!=-1&&victim->num_weapons>0){
-                                                                               if(weapons.owner[victim->weaponids[victim->weaponactive]]==victim->id){
-                                                                                       weapons.owner[victim->weaponids[victim->weaponactive]]=id;
+                                                                               if(weapons[victim->weaponids[victim->weaponactive]].owner==victim->id){
+                                                                                       weapons[victim->weaponids[victim->weaponactive]].owner=id;
                                                                                        weaponactive=0;
                                                                                        if(num_weapons>0){
                                                                                                weaponids[num_weapons]=weaponids[victim->weaponactive];
@@ -2905,13 +2910,13 @@ void    Person::DoAnimations(){
                                                                        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(creature==rabbittype&&weaponactive!=-1)if(weapons[weaponids[0]].getType()==staff)doslice=0;
                                                                        if(doslice){
                                                                                if(weaponactive!=-1){
                                                                                        victim->DoBloodBig(2/victim->armorhigh,225);
                                                                                        emit_sound_at(knifeslicesound, victim->coords);
-                                                                                       if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
-                                                                                       weapons.blooddrip[weaponids[weaponactive]]+=3;
+                                                                                       if(bloodtoggle&&!weapons[weaponids[weaponactive]].bloody)weapons[weaponids[weaponactive]].bloody=1;
+                                                                                       weapons[weaponids[weaponactive]].blooddrip+=3;
                                                                                }
                                                                                if(weaponactive==-1&&creature==wolftype){;
                                                                                        emit_sound_at(clawslicesound, victim->coords, 128.);
@@ -2992,13 +2997,13 @@ void    Person::DoAnimations(){
                                                                        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(creature==rabbittype&&weaponactive!=-1)if(weapons[weaponids[0]].getType()==staff)doslice=0;
                                                                        if(doslice){
                                                                                if(weaponactive!=-1){
                                                                                        victim->DoBloodBig(200,225);
                                                                                        emit_sound_at(knifeslicesound, victim->coords);
-                                                                                       if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
-                                                                                       weapons.blooddrip[weaponids[weaponactive]]+=5;
+                                                                                       if(bloodtoggle)weapons[weaponids[weaponactive]].bloody=2;
+                                                                                       weapons[weaponids[weaponactive]].blooddrip+=5;
                                                                                }
 
                                                                                if(creature==wolftype&&weaponactive==-1){
@@ -3025,9 +3030,9 @@ void      Person::DoAnimations(){
                                                                                        */
                                                                                        XYZ footvel,footpoint;
                                                                                        footvel=0;
-                                                                                       footpoint=weapons.tippoint[weaponids[0]];
+                                                                                       footpoint=weapons[weaponids[0]].tippoint;
                                                                                        if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
-                                                                                       footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]]);
+                                                                                       footvel=(weapons[weaponids[0]].tippoint-weapons[weaponids[0]].position);
                                                                                        Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                        Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                        Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
@@ -3039,9 +3044,9 @@ void      Person::DoAnimations(){
                                                                                        award_bonus(id, Stabbonus);
                                                                                        XYZ footvel,footpoint;
                                                                                        footvel=0;
-                                                                                       footpoint=weapons.tippoint[weaponids[0]];
+                                                                                       footpoint=weapons[weaponids[0]].tippoint;
                                                                                        if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
-                                                                                       footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
+                                                                                       footvel=(weapons[weaponids[0]].tippoint-weapons[weaponids[0]].position)*-1;
                                                                                        Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                        Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                        Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .2, 1);
@@ -3051,8 +3056,8 @@ void      Person::DoAnimations(){
                                                                                victim->bloodloss+=10000;
                                                                                victim->velocity=0;
                                                                                emit_sound_at(fleshstabsound, victim->coords);
-                                                                               if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
-                                                                               weapons.blooddrip[weaponids[weaponactive]]+=5;
+                                                                               if(bloodtoggle)weapons[weaponids[weaponactive]].bloody=2;
+                                                                               weapons[weaponids[weaponactive]].blooddrip+=5;
                                                                        }
                                                                }
 
@@ -3070,14 +3075,14 @@ void    Person::DoAnimations(){
                                                                        }
                                                                        if(weaponactive!=-1&&animation[victim->targetanimation].attack!=reversal){
                                                                                emit_sound_at(fleshstabremovesound, victim->coords);
-                                                                               if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
-                                                                               weapons.blooddrip[weaponids[weaponactive]]+=5;
+                                                                               if(bloodtoggle)weapons[weaponids[weaponactive]].bloody=2;
+                                                                               weapons[weaponids[weaponactive]].blooddrip+=5;
 
                                                                                XYZ footvel,footpoint;
                                                                                footvel=0;
-                                                                               footpoint=weapons.tippoint[weaponids[0]];
+                                                                               footpoint=weapons[weaponids[0]].tippoint;
                                                                                if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
-                                                                               footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
+                                                                               footvel=(weapons[weaponids[0]].tippoint-weapons[weaponids[0]].position)*-1;
                                                                                Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
@@ -3093,9 +3098,9 @@ void      Person::DoAnimations(){
 
                                                                                XYZ footvel,footpoint;
                                                                                footvel=0;
-                                                                               footpoint=(weapons.tippoint[weaponids[0]]+weapons.position[weaponids[0]])/2;
+                                                                               footpoint=(weapons[weaponids[0]].tippoint+weapons[weaponids[0]].position)/2;
                                                                                if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
-                                                                               footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]]);
+                                                                               footvel=(weapons[weaponids[0]].tippoint-weapons[weaponids[0]].position);
                                                                                Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                Sprite::MakeSprite(bloodflamesprite, footpoint,DoRotation(footvel*5,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .3, 1);
@@ -3105,8 +3110,8 @@ void      Person::DoAnimations(){
                                                                                victim->bloodloss+=10000;
                                                                                victim->velocity=0;
                                                                                emit_sound_at(fleshstabsound, victim->coords);
-                                                                               if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
-                                                                               weapons.blooddrip[weaponids[weaponactive]]+=5;
+                                                                               if(bloodtoggle)weapons[weaponids[weaponactive]].bloody=2;
+                                                                               weapons[weaponids[weaponactive]].blooddrip+=5;
                                                                        }
                                                                }
 
@@ -3118,14 +3123,14 @@ void    Person::DoAnimations(){
                                                                        }
                                                                        if(weaponactive!=-1){
                                                                                emit_sound_at(fleshstabremovesound, victim->coords);
-                                                                               if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
-                                                                               weapons.blooddrip[weaponids[weaponactive]]+=5;
+                                                                               if(bloodtoggle)weapons[weaponids[weaponactive]].bloody=2;
+                                                                               weapons[weaponids[weaponactive]].blooddrip+=5;
 
                                                                                XYZ footvel,footpoint;
                                                                                footvel=0;
-                                                                               footpoint=weapons.tippoint[weaponids[0]];
+                                                                               footpoint=weapons[weaponids[0]].tippoint;
                                                                                if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
-                                                                               footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
+                                                                               footvel=(weapons[weaponids[0]].tippoint-weapons[weaponids[0]].position)*-1;
                                                                                Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
                                                                                Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
@@ -3148,13 +3153,13 @@ void    Person::DoAnimations(){
                                                                        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(creature==rabbittype&&weaponactive!=-1)if(weapons[weaponids[0]].getType()==staff)doslice=0;
                                                                        if(doslice){
                                                                                if(weaponactive!=-1){
                                                                                        victim->DoBloodBig(2/victim->armorhead,225);
                                                                                        emit_sound_at(knifeslicesound, victim->coords);
-                                                                                       if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
-                                                                                       weapons.blooddrip[weaponids[weaponactive]]+=3;
+                                                                                       if(bloodtoggle&&!weapons[weaponids[weaponactive]].bloody)weapons[weaponids[weaponactive]].bloody=1;
+                                                                                       weapons[weaponids[weaponactive]].blooddrip+=3;
                                                                                }
                                                                                if(weaponactive==-1&&creature==wolftype){
                                                                                        emit_sound_at(clawslicesound, victim->coords, 128.);
@@ -3337,7 +3342,8 @@ void      Person::DoAnimations(){
                                                                                targetframe=3;
                                                                                velocity=facing*-8;
                                                                                velocity.y=4;
-                                                                               if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
+                                                                               if(id==0)
+                                                                                 resume_stream(whooshsound);
                                                                        }
                                                                        if(targetanimation==walljumprightanim){
                                                                                targetanimation=rightflipanim;
@@ -3355,7 +3361,8 @@ void      Person::DoAnimations(){
                                                                                velocity=facing*8;
                                                                                velocity.y=4;
                                                                        }
-                                                                       if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
+                                                                       if(id==0)
+                                                                         resume_stream(whooshsound);
                                                                }
                                                                if(targetanimation==walljumpleftanim){
                                                                        if(attackkeydown){
@@ -3395,10 +3402,10 @@ void    Person::DoAnimations(){
                                                                                velocity=DoRotation(facing,0,-30,0)*-8;
                                                                                velocity.y=4;
                                                                        }
-                                                                       if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
+                                                                       if(id==0)
+                                                                         resume_stream(whooshsound);
                                                                }
                                                                if(targetanimation==sneakattackanim){
-                                                                       float ycoords=oldcoords.y;
                                                                        currentanimation=getCrouch();
                                                                        targetanimation=getCrouch();
                                                                        targetframe=1;
@@ -3415,7 +3422,6 @@ void      Person::DoAnimations(){
                                                                        lastfeint=0;
                                                                }
                                                                if(targetanimation==knifesneakattackanim||targetanimation==swordsneakattackanim){
-                                                                       float ycoords=oldcoords.y;
                                                                        targetanimation=getIdle();
                                                                        targetframe=0;
                                                                        if(onterrain)coords.y=terrain.getHeight(coords.x,coords.z);
@@ -3529,7 +3535,7 @@ void      Person::DoAnimations(){
                                                                        targetrotation=rotation;
                                                                        bool hasstaff;
                                                                        hasstaff=0;
-                                                                       if(num_weapons>0)if(weapons.type[0]==staff)hasstaff=1;
+                                                                       if(num_weapons>0)if(weapons[0].getType()==staff)hasstaff=1;
                                                                        if(!hasstaff)DoDamage(35);
                                                                        RagDoll(0);
                                                                        lastfeint=0;
@@ -3548,7 +3554,7 @@ void      Person::DoAnimations(){
                                                                                escapednum++;
                                                                                targetanimation=rollanim;
                                                                                coords+=facing;
-                                                                               if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
+                                                                               if(id==0)pause_sound(whooshsound);
                                                                        }
                                                                        lastfeint=0;
                                                                }
@@ -3571,7 +3577,7 @@ void      Person::DoAnimations(){
                                                                                escapednum++;
                                                                                targetanimation=rollanim;
                                                                                coords+=facing*2;
-                                                                               if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
+                                                                               if(id==0)pause_sound(whooshsound);
                                                                        }
                                                                        lastfeint=0;
                                                                }
@@ -3735,7 +3741,6 @@ void      Person::DoStuff(){
        static int howmany;
        static int bloodsize;
        static int startx,starty,endx,endy;
-       static int texdetailint;
        static GLubyte color;
        static XYZ bloodvel;
 
@@ -3792,7 +3797,7 @@ void      Person::DoStuff(){
                }
        }
        if(weaponactive==-1&&num_weapons>0){
-               if(weapons.type[weaponids[0]]==staff){
+               if(weapons[weaponids[0]].getType()==staff){
                        weaponactive=0;
                }
        }
@@ -3894,15 +3899,15 @@ void    Person::DoStuff(){
                if(deathbleeding<0)deathbleeding=0;
                if(bloodloss>damagetolerance&&animation[targetanimation].attack==neutral){
                        if(weaponactive!=-1){
-                               weapons.owner[weaponids[0]]=-1;
-                               weapons.velocity[weaponids[0]]=velocity*scale*-.3;
-                               weapons.velocity[weaponids[0]].x+=.01;
-                               weapons.tipvelocity[weaponids[0]]=velocity*scale;
-                               weapons.missed[weaponids[0]]=1;
-                               weapons.hitsomething[weaponids[0]]=0;
-                               weapons.freetime[weaponids[0]]=0;
-                               weapons.firstfree[weaponids[0]]=1;
-                               weapons.physics[weaponids[0]]=1;
+                               weapons[weaponids[0]].owner=-1;
+                               weapons[weaponids[0]].velocity=velocity*scale*-.3;
+                               weapons[weaponids[0]].velocity.x+=.01;
+                               weapons[weaponids[0]].tipvelocity=velocity*scale;
+                               weapons[weaponids[0]].missed=1;
+                               weapons[weaponids[0]].hitsomething=0;
+                               weapons[weaponids[0]].freetime=0;
+                               weapons[weaponids[0]].firstfree=1;
+                               weapons[weaponids[0]].physics=1;
                                num_weapons--;
                                if(num_weapons){
                                        weaponids[0]=weaponids[num_weapons];
@@ -3947,7 +3952,6 @@ void      Person::DoStuff(){
 
                startx=0;
                starty=0;
-               texdetailint=realtexdetail;
                startx=bleedy;//abs(Random()%(skeleton.skinsize-bloodsize-1));
                starty=bleedx;//abs(Random()%(skeleton.skinsize-bloodsize-1));
                endx=startx+bloodsize;
@@ -4304,15 +4308,15 @@ void    Person::DoStuff(){
                RagDoll(0);
 
                if(weaponactive!=-1){
-                       weapons.owner[weaponids[0]]=-1;
-                       weapons.velocity[weaponids[0]]=velocity*scale*-.3;
-                       weapons.velocity[weaponids[0]].x+=.01;
-                       weapons.tipvelocity[weaponids[0]]=velocity*scale;
-                       weapons.missed[weaponids[0]]=1;
-                       weapons.hitsomething[weaponids[0]]=0;
-                       weapons.freetime[weaponids[0]]=0;
-                       weapons.firstfree[weaponids[0]]=1;
-                       weapons.physics[weaponids[0]]=1;
+                       weapons[weaponids[0]].owner=-1;
+                       weapons[weaponids[0]].velocity=velocity*scale*-.3;
+                       weapons[weaponids[0]].velocity.x+=.01;
+                       weapons[weaponids[0]].tipvelocity=velocity*scale;
+                       weapons[weaponids[0]].missed=1;
+                       weapons[weaponids[0]].hitsomething=0;
+                       weapons[weaponids[0]].freetime=0;
+                       weapons[weaponids[0]].firstfree=1;
+                       weapons[weaponids[0]].physics=1;
                        num_weapons--;
                        if(num_weapons){
                                weaponids[0]=weaponids[num_weapons];
@@ -4363,15 +4367,15 @@ void    Person::DoStuff(){
                DoBlood(1,255);
 
                if(weaponactive!=-1){
-                       weapons.owner[weaponids[0]]=-1;
-                       weapons.velocity[weaponids[0]]=velocity*scale*-.3;
-                       weapons.velocity[weaponids[0]].x+=.01;
-                       weapons.tipvelocity[weaponids[0]]=velocity*scale;
-                       weapons.missed[weaponids[0]]=1;
-                       weapons.hitsomething[weaponids[0]]=0;
-                       weapons.freetime[weaponids[0]]=0;
-                       weapons.firstfree[weaponids[0]]=1;
-                       weapons.physics[weaponids[0]]=1;
+                       weapons[weaponids[0]].owner=-1;
+                       weapons[weaponids[0]].velocity=velocity*scale*-.3;
+                       weapons[weaponids[0]].velocity.x+=.01;
+                       weapons[weaponids[0]].tipvelocity=velocity*scale;
+                       weapons[weaponids[0]].missed=1;
+                       weapons[weaponids[0]].hitsomething=0;
+                       weapons[weaponids[0]].freetime=0;
+                       weapons[weaponids[0]].firstfree=1;
+                       weapons[weaponids[0]].physics=1;
                        num_weapons--;
                        if(num_weapons){
                                weaponids[0]=weaponids[num_weapons];
@@ -4400,14 +4404,10 @@ void    Person::DoStuff(){
                skeleton.free=1;
 
                emit_sound_at(breaksound, coords);
-               /*if(id==0||findDistancefast(&coords,&viewer)<50){
-               slomo=1;
-               slomodelay=.2;
-               }*/
        }
 
        if(skeleton.free==1){
-               if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
+               if(id==0)pause_sound(whooshsound);
 
                if(!dead){
                        //If knocked over, open hands and close mouth
@@ -4457,20 +4457,11 @@ void    Person::DoStuff(){
                        velocity=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(findLength(&average)<10&&dead&&skeleton.free){
                        skeleton.longdead+=(2000-findLength(&average))*multiplier+multiplier;
                        if(skeleton.longdead>2000){
                                if(skeleton.longdead>6000){
-                                       if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
+                                       if(id==0)pause_sound(whooshsound);
                                        skeleton.free=3;
                                        DrawSkeleton();
                                        skeleton.free=2;
@@ -4579,7 +4570,7 @@ void      Person::DoStuff(){
                if(findLength(&average)<10&&!dead&&skeleton.free){
                        skeleton.longdead+=(2000-findLength(&average))*multiplier+multiplier;
                        if(skeleton.longdead>(damage+500)*1.5){
-                               if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
+                               if(id==0)pause_sound(whooshsound);
                                skeleton.free=0;
                                velocity=0;
                                XYZ middle;
@@ -4605,21 +4596,7 @@ void     Person::DoStuff(){
                                if(terrainnormal.z<0)targetrotation=180-targetrotation;
                                rotation=targetrotation;
 
-                               /*if(onterrain){
-                               terrainnormal=terrain.getNormal(coords.x,coords.z);
                                targettilt2=asin(terrainnormal.y)*180/3.14*-1;
-                               }
-                               else*/
-
-                               /*XYZ otherterrainnormal;
-                               otherterrainnormal=terrain.getNormal(coords.x,coords.y);
-                               otherterrainnormal.y=fast_sqrt(otherterrainnormal.x*otherterrainnormal.x+otherterrainnormal.z*otherterrainnormal.z)*-1;
-                               if(abs(terrainnormal.y)<abs(otherterrainnormal.y))terrainnormal.y=fast_sqrt(otherterrainnormal.x*otherterrainnormal.x+otherterrainnormal.z*otherterrainnormal.z)*-1;
-                               targettilt2=asin(otherterrainnormal.y)*180/3.14;
-                               */
-
-                               targettilt2=asin(terrainnormal.y)*180/3.14*-1;
-
 
 
                                if(skeleton.forward.y<0){
@@ -4675,7 +4652,7 @@ void      Person::DoStuff(){
 
                bool hasstaff;
                hasstaff=0;
-               if(num_weapons>0)if(weapons.type[0]==staff)hasstaff=1;
+               if(num_weapons>0)if(weapons[0].getType()==staff)hasstaff=1;
                if(!skeleton.freefall&&freefall&&((jumpkeydown&&jumpkeydowntime<.2)||(hasstaff&&rabbitkickragdoll))&&!dead){
                        if(velocity.y>-30){
                                XYZ tempvelocity;
@@ -4715,9 +4692,6 @@ void      Person::DoStuff(){
                }
                if(skeleton.freefall==0)freefall=0;
 
-               if(!isnormal(velocity.x)&&velocity.x){
-                       int xy=1;
-               }
        }
 
        if(aitype!=passivetype||skeleton.free==1)
@@ -5002,13 +4976,7 @@ void     Person::DoStuff(){
                                                targetheadmorphness=1;
                                        }
                                }
-                               /*
-                               if(speechdelay>.25){
-                               if(headmorphend!=2)headmorphness=0;
-                               headmorphend=2;
-                               targetheadmorphness=1;
-                               }
-                               */
+                               
                                bool behind;
                                behind=0;
                                if(hasvictim){
@@ -5027,11 +4995,11 @@ void    Person::DoStuff(){
                                        }
 
                                        if(weaponactive!=-1){
-                                               if(weapons.type[weaponids[weaponactive]]!=staff){
+                                               if(weapons[weaponids[weaponactive]].getType()!=staff){
                                                        righthandmorphstart=1;
                                                        righthandmorphend=1;
                                                }
-                                               if(weapons.type[weaponids[weaponactive]]==staff){
+                                               if(weapons[weaponids[weaponactive]].getType()==staff){
                                                        righthandmorphstart=2;
                                                        righthandmorphend=2;
                                                }
@@ -5291,7 +5259,7 @@ void      Person::DoStuff(){
                                                onterrain=1;
 
                                                if(id==0){
-                                                       OPENAL_SetPaused(channels[whooshsound], true);
+                                                       pause_sound(whooshsound);
                                                        OPENAL_SetVolume(channels[whooshsound], 0);
                                                }
 
@@ -5446,7 +5414,7 @@ int Person::DrawSkeleton(){
                static float M[16];
                static int i,j,k;
                static int weaponattachmuscle;
-               static int weaponrotatemuscle,weaponrotatemuscle2;
+               static int weaponrotatemuscle;
                static XYZ weaponpoint;
                static int start,endthing;
                if((dead!=2||skeleton.free!=2)&&updatedelay<=0){
@@ -5647,35 +5615,11 @@ int Person::DrawSkeleton(){
 
                                                skeleton.muscles[i].lastrotate3=skeleton.muscles[i].rotate3;
                                                glRotatef(-skeleton.muscles[i].lastrotate3,0,1,0);
-                                               /*
-                                               if(!isnormal(proportionbody.x)||!isnormal(proportionbody.y)||!isnormal(proportionbody.z)){
-                                               proportionbody=1;
-                                               proportionweird=1;
-                                               }
-                                               if(!isnormal(proportionarms.x)||!isnormal(proportionarms.y)||!isnormal(proportionarms.z)){
-                                               proportionarms=1;
-                                               proportionweird=1;
-                                               }
-                                               if(!isnormal(proportionhead.x)||!isnormal(proportionhead.y)||!isnormal(proportionhead.z)){
-                                               proportionhead=1;
-                                               proportionweird=1;
-                                               }
-                                               if(!isnormal(proportionlegs.x)||!isnormal(proportionlegs.y)||!isnormal(proportionlegs.z)){
-                                               proportionlegs=1;
-                                               proportionweird=1;
-                                               }*/
 
                                                if(playerdetail||skeleton.free==3)
                                                {
                                                        for(j=0;j<skeleton.muscles[i].numvertices;j++)
                                                        {
-                                                               /*if(!isnormal(skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x))vertexweird[0]=1;
-                                                               if(!isnormal(skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y))vertexweird[1]=1;
-                                                               if(!isnormal(skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z))vertexweird[2]=1;
-                                                               if(!isnormal(skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x))vertexweird[3]=1;
-                                                               if(!isnormal(skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y))vertexweird[4]=1;
-                                                               if(!isnormal(skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z))vertexweird[5]=1;
-                                                               if(skeleton.muscles[i].vertices[j]<skeleton.model[start].vertexNum&&skeleton.muscles[i].vertices[j]>=0){*/
                                                                glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
                                                                glPushMatrix();
                                                                        if(skeleton.muscles[i].parent1->label==abdomen||skeleton.muscles[i].parent2->label==abdomen)
@@ -5936,7 +5880,7 @@ int Person::DrawSkeleton(){
                        for(k=0;k<num_weapons;k++){
                                i=weaponids[k];
                                if(weaponactive==k){
-                                       if(weapons.type[i]!=staff){
+                                       if(weapons[i].getType()!=staff){
                                                for(j=0;j<skeleton.num_muscles;j++){
                                                        if((skeleton.muscles[j].parent1->label==righthand||skeleton.muscles[j].parent2->label==righthand)&&skeleton.muscles[j].numvertices>0){
                                                                weaponattachmuscle=j;
@@ -5950,7 +5894,7 @@ int Person::DrawSkeleton(){
                                                weaponpoint=(skeleton.muscles[weaponattachmuscle].parent1->position+skeleton.muscles[weaponattachmuscle].parent2->position)/2;
                                                if(creature==wolftype)weaponpoint=(skeleton.joints[skeleton.jointlabels[rightwrist]].position*.7+skeleton.joints[skeleton.jointlabels[righthand]].position*.3);
                                        }
-                                       if(weapons.type[i]==staff){
+                                       if(weapons[i].getType()==staff){
                                                for(j=0;j<skeleton.num_muscles;j++){
                                                        if((skeleton.muscles[j].parent1->label==righthand||skeleton.muscles[j].parent2->label==righthand)&&skeleton.muscles[j].numvertices>0){
                                                                weaponattachmuscle=j;
@@ -5970,19 +5914,12 @@ int Person::DrawSkeleton(){
                                                CrossProduct(&vec1,&vec2,&tempnormthing);
                                                Normalise(&tempnormthing);
                                                if(targetanimation!=staffhitanim&&currentanimation!=staffhitanim&&targetanimation!=staffgroundsmashanim&&currentanimation!=staffgroundsmashanim&&targetanimation!=staffspinhitanim&&currentanimation!=staffspinhitanim)weaponpoint+=tempnormthing*.1-skeleton.specialforward[1]*.3+(skeleton.joints[skeleton.jointlabels[rightwrist]].position-skeleton.joints[skeleton.jointlabels[rightelbow]].position);
-                                               /*if(targetanimation==staffhitanim||currentanimation==staffhitanim){
-                                               XYZ weaptargnorm;
-                                               weaptargnorm=DoRotation(weapons.tippoint[i]-weapons.position[i],0,-rotation,0);
-                                               //weaptargnorm=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
-                                               Normalise(&weaptargnorm);
-                                               weaponpoint-=weaptargnorm*2;
-                                               }*/
                                        }
                                }
                                if(weaponactive!=k&&weaponstuck!=k){
-                                       if(weapons.type[i]==knife)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[righthip]].position-skeleton.joints[skeleton.jointlabels[lefthip]].position)*.1+(skeleton.joints[skeleton.jointlabels[rightshoulder]].position-skeleton.joints[skeleton.jointlabels[leftshoulder]].position)*.35;
-                                       if(weapons.type[i]==sword)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[lefthip]].position-skeleton.joints[skeleton.jointlabels[righthip]].position)*.09+(skeleton.joints[skeleton.jointlabels[leftshoulder]].position-skeleton.joints[skeleton.jointlabels[rightshoulder]].position)*.33;
-                                       if(weapons.type[i]==staff)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[lefthip]].position-skeleton.joints[skeleton.jointlabels[righthip]].position)*.09+(skeleton.joints[skeleton.jointlabels[leftshoulder]].position-skeleton.joints[skeleton.jointlabels[rightshoulder]].position)*.33;
+                                       if(weapons[i].getType()==knife)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[righthip]].position-skeleton.joints[skeleton.jointlabels[lefthip]].position)*.1+(skeleton.joints[skeleton.jointlabels[rightshoulder]].position-skeleton.joints[skeleton.jointlabels[leftshoulder]].position)*.35;
+                                       if(weapons[i].getType()==sword)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[lefthip]].position-skeleton.joints[skeleton.jointlabels[righthip]].position)*.09+(skeleton.joints[skeleton.jointlabels[leftshoulder]].position-skeleton.joints[skeleton.jointlabels[rightshoulder]].position)*.33;
+                                       if(weapons[i].getType()==staff)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[lefthip]].position-skeleton.joints[skeleton.jointlabels[righthip]].position)*.09+(skeleton.joints[skeleton.jointlabels[leftshoulder]].position-skeleton.joints[skeleton.jointlabels[rightshoulder]].position)*.33;
                                        for(j=0;j<skeleton.num_muscles;j++){
                                                if((skeleton.muscles[j].parent1->label==abdomen||skeleton.muscles[j].parent2->label==abdomen)&&(skeleton.muscles[j].parent1->label==neck||skeleton.muscles[j].parent2->label==neck)&&skeleton.muscles[j].numvertices>0){
                                                        weaponrotatemuscle=j;
@@ -5998,30 +5935,29 @@ int Person::DrawSkeleton(){
                                                }
                                        }
                                }
-                               if(!skeleton.free){
-                                       weapons.position[i]=DoRotation(DoRotation(DoRotation(weaponpoint,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords+currentoffset*(1-target)*scale+targetoffset*target*scale;
-                                       weapons.bigrotation[i]=rotation;
-                                       weapons.bigtilt[i]=tilt;
-                                       weapons.bigtilt2[i]=tilt2;
-                               }
                                if(skeleton.free){
-                                       weapons.position[i]=weaponpoint*scale+coords;
-                                       weapons.bigrotation[i]=0;
-                                       weapons.bigtilt[i]=0;
-                                       weapons.bigtilt2[i]=0;
+                                       weapons[i].position=weaponpoint*scale+coords;
+                                       weapons[i].bigrotation=0;
+                                       weapons[i].bigtilt=0;
+                                       weapons[i].bigtilt2=0;
+                               } else {
+                                       weapons[i].position=DoRotation(DoRotation(DoRotation(weaponpoint,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords+currentoffset*(1-target)*scale+targetoffset*target*scale;
+                                       weapons[i].bigrotation=rotation;
+                                       weapons[i].bigtilt=tilt;
+                                       weapons[i].bigtilt2=tilt2;
                                }
-                               weapons.rotation1[i]=skeleton.muscles[weaponrotatemuscle].lastrotate1;
-                               weapons.rotation2[i]=skeleton.muscles[weaponrotatemuscle].lastrotate2;
-                               weapons.rotation3[i]=skeleton.muscles[weaponrotatemuscle].lastrotate3;
+                               weapons[i].rotation1=skeleton.muscles[weaponrotatemuscle].lastrotate1;
+                               weapons[i].rotation2=skeleton.muscles[weaponrotatemuscle].lastrotate2;
+                               weapons[i].rotation3=skeleton.muscles[weaponrotatemuscle].lastrotate3;
                                if(weaponactive==k){
-                                       if(weapons.type[i]==knife){
-                                               weapons.smallrotation[i]=180;
-                                               weapons.smallrotation2[i]=0;
+                                       if(weapons[i].getType()==knife){
+                                               weapons[i].smallrotation=180;
+                                               weapons[i].smallrotation2=0;
                                                if(isCrouch()||wasCrouch()){
-                                                       weapons.smallrotation2[i]=20;
+                                                       weapons[i].smallrotation2=20;
                                                }
                                                if(targetanimation==hurtidleanim){
-                                                       weapons.smallrotation2[i]=50;
+                                                       weapons[i].smallrotation2=50;
                                                }
                                                if((currentanimation==crouchstabanim&&targetanimation==crouchstabanim)||(currentanimation==backhandspringanim&&targetanimation==backhandspringanim)){
                                                        XYZ temppoint1,temppoint2,tempforward;
@@ -6030,16 +5966,16 @@ int Person::DrawSkeleton(){
                                                        temppoint1=skeleton.joints[skeleton.jointlabels[righthand]].position;
                                                        temppoint2=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
                                                        distance=findDistance(&temppoint1,&temppoint2);
-                                                       weapons.rotation2[i]=asin((temppoint1.y-temppoint2.y)/distance);
-                                                       weapons.rotation2[i]*=360/6.28;
+                                                       weapons[i].rotation2=asin((temppoint1.y-temppoint2.y)/distance);
+                                                       weapons[i].rotation2*=360/6.28;
                                                        temppoint1.y=0;
                                                        temppoint2.y=0;
-                                                       weapons.rotation1[i]=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
-                                                       weapons.rotation1[i]*=360/6.28;
-                                                       weapons.rotation3[i]=0;
-                                                       weapons.smallrotation[i]=-90;
-                                                       weapons.smallrotation2[i]=0;
-                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
+                                                       weapons[i].rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
+                                                       weapons[i].rotation1*=360/6.28;
+                                                       weapons[i].rotation3=0;
+                                                       weapons[i].smallrotation=-90;
+                                                       weapons[i].smallrotation2=0;
+                                                       if(temppoint1.x>temppoint2.x)weapons[i].rotation1=360-weapons[i].rotation1;
                                                }
                                                if((currentanimation==knifeslashreversalanim&&targetanimation==knifeslashreversalanim)||(currentanimation==knifeslashreversedanim&&targetanimation==knifeslashreversedanim)){
                                                        XYZ temppoint1,temppoint2,tempforward;
@@ -6048,41 +5984,41 @@ int Person::DrawSkeleton(){
                                                        temppoint1=skeleton.joints[skeleton.jointlabels[righthand]].position;
                                                        temppoint2=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
                                                        distance=findDistance(&temppoint1,&temppoint2);
-                                                       weapons.rotation2[i]=asin((temppoint1.y-temppoint2.y)/distance);
-                                                       weapons.rotation2[i]*=360/6.28;
+                                                       weapons[i].rotation2=asin((temppoint1.y-temppoint2.y)/distance);
+                                                       weapons[i].rotation2*=360/6.28;
                                                        temppoint1.y=0;
                                                        temppoint2.y=0;
-                                                       weapons.rotation1[i]=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
-                                                       weapons.rotation1[i]*=360/6.28;
-                                                       weapons.rotation3[i]=0;
-                                                       weapons.smallrotation[i]=90;
-                                                       weapons.smallrotation2[i]=0;
-                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
+                                                       weapons[i].rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
+                                                       weapons[i].rotation1*=360/6.28;
+                                                       weapons[i].rotation3=0;
+                                                       weapons[i].smallrotation=90;
+                                                       weapons[i].smallrotation2=0;
+                                                       if(temppoint1.x>temppoint2.x)weapons[i].rotation1=360-weapons[i].rotation1;
                                                }
                                                if(targetanimation==knifethrowanim){
-                                                       weapons.smallrotation[i]=90;
-                                                       //weapons.smallrotation2[i]=-90;
-                                                       weapons.smallrotation2[i]=0;
-                                                       weapons.rotation1[i]=0;
-                                                       weapons.rotation2[i]=0;
-                                                       weapons.rotation3[i]=0;
+                                                       weapons[i].smallrotation=90;
+                                                       //weapons[i].smallrotation2=-90;
+                                                       weapons[i].smallrotation2=0;
+                                                       weapons[i].rotation1=0;
+                                                       weapons[i].rotation2=0;
+                                                       weapons[i].rotation3=0;
                                                }
                                                if(targetanimation==knifesneakattackanim&&targetframe<5){
-                                                       weapons.smallrotation[i]=-90;
-                                                       weapons.rotation1[i]=0;
-                                                       weapons.rotation2[i]=0;
-                                                       weapons.rotation3[i]=0;
+                                                       weapons[i].smallrotation=-90;
+                                                       weapons[i].rotation1=0;
+                                                       weapons[i].rotation2=0;
+                                                       weapons[i].rotation3=0;
                                                }
                                        }
-                                       if(weapons.type[i]==sword){
-                                               weapons.smallrotation[i]=0;
-                                               weapons.smallrotation2[i]=0;
+                                       if(weapons[i].getType()==sword){
+                                               weapons[i].smallrotation=0;
+                                               weapons[i].smallrotation2=0;
                                                if(targetanimation==knifethrowanim){
-                                                       weapons.smallrotation[i]=-90;
-                                                       weapons.smallrotation2[i]=0;
-                                                       weapons.rotation1[i]=0;
-                                                       weapons.rotation2[i]=0;
-                                                       weapons.rotation3[i]=0;
+                                                       weapons[i].smallrotation=-90;
+                                                       weapons[i].smallrotation2=0;
+                                                       weapons[i].rotation1=0;
+                                                       weapons[i].rotation2=0;
+                                                       weapons[i].rotation3=0;
                                                }
                                                if((targetanimation==swordgroundstabanim&&currentanimation==swordgroundstabanim)||(targetanimation==swordsneakattackanim&&currentanimation==swordsneakattackanim)||(targetanimation==swordslashparryanim&&currentanimation==swordslashparryanim)||(targetanimation==swordslashparriedanim&&currentanimation==swordslashparriedanim)||(targetanimation==swordslashreversalanim&&currentanimation==swordslashreversalanim)||(targetanimation==swordslashreversedanim&&currentanimation==swordslashreversedanim)||(targetanimation==knifeslashreversalanim&&currentanimation==knifeslashreversalanim)||(targetanimation==knifeslashreversedanim&&currentanimation==knifeslashreversedanim)||(targetanimation==swordslashanim&&currentanimation==swordslashanim)||(targetanimation==drawleftanim&&currentanimation==drawleftanim)||(currentanimation==backhandspringanim&&targetanimation==backhandspringanim)){
                                                        XYZ temppoint1,temppoint2,tempforward;
@@ -6091,21 +6027,21 @@ int Person::DrawSkeleton(){
                                                        temppoint1=animation[currentanimation].position[skeleton.jointlabels[righthand]][currentframe]*(1-target)+animation[targetanimation].position[skeleton.jointlabels[righthand]][targetframe]*(target); //skeleton.joints[skeleton.jointlabels[righthand]].position;
                                                        temppoint2=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
                                                        distance=findDistance(&temppoint1,&temppoint2);
-                                                       weapons.rotation2[i]=asin((temppoint1.y-temppoint2.y)/distance);
-                                                       weapons.rotation2[i]*=360/6.28;
+                                                       weapons[i].rotation2=asin((temppoint1.y-temppoint2.y)/distance);
+                                                       weapons[i].rotation2*=360/6.28;
                                                        temppoint1.y=0;
                                                        temppoint2.y=0;
-                                                       weapons.rotation1[i]=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
-                                                       weapons.rotation1[i]*=360/6.28;
-                                                       weapons.rotation3[i]=0;
-                                                       weapons.smallrotation[i]=90;
-                                                       weapons.smallrotation2[i]=0;
-                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
+                                                       weapons[i].rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
+                                                       weapons[i].rotation1*=360/6.28;
+                                                       weapons[i].rotation3=0;
+                                                       weapons[i].smallrotation=90;
+                                                       weapons[i].smallrotation2=0;
+                                                       if(temppoint1.x>temppoint2.x)weapons[i].rotation1=360-weapons[i].rotation1;
                                                }
                                        }
-                                       if(weapons.type[i]==staff){
-                                               weapons.smallrotation[i]=100;
-                                               weapons.smallrotation2[i]=0;
+                                       if(weapons[i].getType()==staff){
+                                               weapons[i].smallrotation=100;
+                                               weapons[i].smallrotation2=0;
                                                if((targetanimation==staffhitanim&&currentanimation==staffhitanim)||(targetanimation==staffhitreversedanim&&currentanimation==staffhitreversedanim)||(targetanimation==staffspinhitreversedanim&&currentanimation==staffspinhitreversedanim)||(targetanimation==staffgroundsmashanim&&currentanimation==staffgroundsmashanim)||(targetanimation==staffspinhitanim&&currentanimation==staffspinhitanim)){
                                                        XYZ temppoint1,temppoint2,tempforward;
                                                        float distance;
@@ -6113,37 +6049,39 @@ int Person::DrawSkeleton(){
                                                        temppoint1=animation[currentanimation].position[skeleton.jointlabels[righthand]][currentframe]*(1-target)+animation[targetanimation].position[skeleton.jointlabels[righthand]][targetframe]*(target); //skeleton.joints[skeleton.jointlabels[righthand]].position;
                                                        temppoint2=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
                                                        distance=findDistance(&temppoint1,&temppoint2);
-                                                       weapons.rotation2[i]=asin((temppoint1.y-temppoint2.y)/distance);
-                                                       weapons.rotation2[i]*=360/6.28;
+                                                       weapons[i].rotation2=asin((temppoint1.y-temppoint2.y)/distance);
+                                                       weapons[i].rotation2*=360/6.28;
                                                        temppoint1.y=0;
                                                        temppoint2.y=0;
-                                                       weapons.rotation1[i]=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
-                                                       weapons.rotation1[i]*=360/6.28;
-                                                       weapons.rotation3[i]=0;
-                                                       weapons.smallrotation[i]=90;
-                                                       weapons.smallrotation2[i]=0;
-                                                       if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
+                                                       weapons[i].rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
+                                                       weapons[i].rotation1*=360/6.28;
+                                                       weapons[i].rotation3=0;
+                                                       weapons[i].smallrotation=90;
+                                                       weapons[i].smallrotation2=0;
+                                                       if(temppoint1.x>temppoint2.x)weapons[i].rotation1=360-weapons[i].rotation1;
                                                }
                                        }
                                }
                                if(weaponactive!=k&&weaponstuck!=k){
-                                       if(weapons.type[i]==knife){
-                                               weapons.smallrotation[i]=-70;
-                                               weapons.smallrotation2[i]=10;
+                                       if(weapons[i].getType()==knife){
+                                               weapons[i].smallrotation=-70;
+                                               weapons[i].smallrotation2=10;
                                        }
-                                       if(weapons.type[i]==sword){
-                                               weapons.smallrotation[i]=-100;
-                                               weapons.smallrotation2[i]=-8;
+                                       if(weapons[i].getType()==sword){
+                                               weapons[i].smallrotation=-100;
+                                               weapons[i].smallrotation2=-8;
                                        }
-                                       if(weapons.type[i]==staff){
-                                               weapons.smallrotation[i]=-100;
-                                               weapons.smallrotation2[i]=-8;
+                                       if(weapons[i].getType()==staff){
+                                               weapons[i].smallrotation=-100;
+                                               weapons[i].smallrotation2=-8;
                                        }
                                }
                                if(weaponstuck==k){
-                                       if(weaponstuckwhere==0)weapons.smallrotation[i]=180;
-                                       else weapons.smallrotation[i]=0;
-                                       weapons.smallrotation2[i]=10;
+                                       if(weaponstuckwhere==0)
+                                               weapons[i].smallrotation=180;
+                                       else
+                                               weapons[i].smallrotation=0;
+                                       weapons[i].smallrotation2=10;
                                }
                        }
                }
@@ -6211,7 +6149,7 @@ int Person::SphereCheck(XYZ *p1,float radius, XYZ *p, XYZ *move, float *rotate,
                                                                onterrain=1;
 
                                                                if(id==0){
-                                                                       OPENAL_SetPaused(channels[whooshsound], true);
+                                                                       pause_sound(whooshsound);
                                                                        OPENAL_SetVolume(channels[whooshsound], 0);
                                                                }