1. package tangedyn;
  2.  
  3. import ec.util.MersenneTwisterFast;
  4.  
  5. public class VengeanceSim {
  6.     boolean DEBUG = false;
  7.    
  8.     public void run(double pAvoid, double bossInterval, int samples) {
  9.         MersenneTwisterFast mRandom = new MersenneTwisterFast();
  10.         int mSamples = 0;
  11.         double mTotalVengeance = 0.0;
  12.         double mVengeance = 1.0;
  13.         double mTotalVengeanceSq = 0.0;
  14.         boolean wasAttacked = false;
  15.         boolean wasHit = false;
  16.        
  17.         double nextAttack = 0.0;
  18.         double nextVengeanceCheck = 0.05;
  19.        
  20.         while (mSamples < samples) {
  21.             if (nextAttack < nextVengeanceCheck) {
  22.                 wasAttacked = true;
  23.                 if (!mRandom.nextBoolean(pAvoid)) wasHit = true;
  24.                 if (DEBUG) System.out.println(nextAttack + " Attack " + (wasHit ? "HIT" : "MISS"));
  25.                 nextAttack += bossInterval;
  26.             }
  27.             else {
  28.                 if (!wasAttacked) mVengeance = Math.max(0.0, mVengeance - .1);
  29.                 else if (wasHit) mVengeance = 1.0;
  30.                 else mVengeance *= .95;
  31.                 if (DEBUG) System.out.println(nextVengeanceCheck + " Vengeance = " + mVengeance);
  32.                 nextVengeanceCheck += 2.0;
  33.                 mTotalVengeance += mVengeance;
  34.                 mTotalVengeanceSq += mVengeance * mVengeance;
  35.                 mSamples ++;
  36.                 wasHit = wasAttacked = false;
  37.             }
  38.         }
  39.        
  40.         double vengeanceMean = mTotalVengeance / mSamples;
  41.         double stddev = Math.sqrt(mTotalVengeanceSq / mSamples - (vengeanceMean * vengeanceMean));
  42.        
  43.         System.out.println("average vengeance = " + vengeanceMean + " +/- " + stddev);
  44.     }
  45.    
  46.    
  47.     public static void main(String args[]) {
  48.         VengeanceSim sim = new VengeanceSim();
  49.         sim.run(0.44465738881804, 5, 1000000);
  50.     }
  51. }