I don't understand why it works fine until it gets to level 3.
So do I 

 . From the code you posted here I understand only one thing - your code isn't looking good 

 .
Use inheritance in decorate. Your axes have same properties and states, exept Fire states. So something like this
Code: Select all
ACTOR handaxe0 : Weapon 
{
   
   Weapon.AmmoUse 0 
   weapon.kickback 130  
   Weapon.SelectionOrder 1000
   +noalert 
   DamageType Axe
   
   States
   {
   Ready:
      MYAX A 1 A_WeaponReady
      Loop
   Deselect: 
          NULL A 0 acs_executealways(440, 0, 1) 
      MYAX A 1 A_Lower
      goto deselect +1
   Select: 
      NULL A 0 acs_executealways(440, 0, 2)
      MYAX A 1 A_Raise
      goto select +1
   Fire:
      MYAX B 5
      MYAX C 5 
      MYAX D 1 A_PlayWeaponSound("axswing")  //axswing
      MYAX D 1 A_CustomPunch(2, 0, 0, "MyAxePuff", 75)  //MyAxePuff sickfogpuff
      MYAX D 3 
      MYAX E 6
      MYAX A 1 A_ReFire
      MYAX A 4
      Goto Ready
   }
}
ACTOR handaxe1 : handaxe0
{
   States
   {
   Fire:
      MYAX B 5
      MYAX C 4 
      MYAX D 1 A_PlayWeaponSound("axswing")  //axswing
      MYAX D 1 A_CustomPunch(2, 0, 0, "MyAxePuff", 75)  //MyAxePuff sickfogpuff
      MYAX D 1 
      MYAX E 6
      MYAX A 1 A_ReFire
      MYAX A 4
      Goto Ready
   }
}
looks better 
 
 
Also, why are you using 1 and 2 as give and take for script 440? You can use true/false where 0 - false, and non-zero - true.
Code: Select all
//0 - take, 1 - give
script 440 (int give)
{
   print(d: give);
   if(give)
      TakeActorInventory(255, "haveaxe", 1);
   else
      GiveActorInventory(255, "haveaxe", 1);
}
About subj - what you posted here isn't enough (well, for me 

 ). Can't you post the wad here?