Advertisement
tangedyn

Savage Defense Simulator

Mar 9th, 2011
391
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 5.24 KB | None | 0 0
  1. package tangedyn;
  2.  
  3. import java.util.TreeSet;
  4.  
  5. import ec.util.MersenneTwisterFast;
  6.  
  7. public class SavageDefenseSim {
  8.     private static final double pYellowCrit = .29628;
  9.     private static final double pWhiteCrit = .38896;
  10.     private static final double pAvoid = .38016 + .05;
  11.     private static final double hastePercent = .02194;
  12.  
  13.     private static final double yellowInterval = 1.5;
  14.     private static final double maulInterval = 3.0;
  15.     private static final double whiteInterval = 2.5 / (1 + hastePercent) / 1.1;
  16.     private static final double bossInterval = 2.4;
  17.  
  18.     private static final int bossDamage = 34585;
  19.     private static final int vengeanceCap = 12930;
  20.     private static final int attackPower = 16772;
  21.    
  22.     private static final double pSavageDefense = 0.50;
  23.     private static final double mastery = 18.877;
  24.  
  25.     private static final int SAMPLES = 10000000;
  26.    
  27.     private abstract class Event implements Comparable<Event> {
  28.         double mNext = 0;
  29.         double mInterval = 0;
  30.        
  31.         Event(double interval) {
  32.             mInterval = interval;
  33.             mNext = mInterval / 2;
  34.         }
  35.        
  36.         abstract void onEvent();
  37.        
  38.         @Override
  39.         public int compareTo(Event ev) {
  40.             if (mNext == ev.mNext) return hashCode() - ev.hashCode();
  41.             else return mNext < ev.mNext ? -1 : 1;
  42.         }
  43.     }
  44.  
  45.     MersenneTwisterFast mRandom = new MersenneTwisterFast();
  46.     int mSamples = 0;
  47.     int mSdUpSamples = 0;
  48.     boolean mSdUp = false;
  49.  
  50.     double mTotalVengeance = 0.0;
  51.     int mTotalTime = -100;
  52.     double mVengeance = 0.0;
  53.     double mTotalVengeanceSq = 0.0;
  54.     double mDamageTaken = 0.0;
  55.     int mTimeAtCap = 0;
  56.     int mTimeAtZero = 0;
  57.     double mShieldSize = 0;
  58.     double mMaxVengeanceStack = 0;
  59.     double mLowestVengeance = vengeanceCap;
  60.     boolean mWasAttacked = false;
  61.    
  62.     boolean DEBUG = false;
  63.    
  64.     public void sd() {
  65.         mSdUp = true;
  66.         mShieldSize = (attackPower + mVengeance * 1.1 * 1.25) * 0.35 * (1 + mastery * 0.04);
  67.     }
  68.    
  69.     public void run() {
  70.         Event vengeanceCheck = new Event(2.0) {
  71.             @Override
  72.             void onEvent() {
  73. //              if (mDamageTaken > 0.0) {
  74.                 if (mWasAttacked) {
  75.                     mVengeance = 0.95 * mVengeance + mDamageTaken * 0.05;
  76.                     if (mVengeance >= vengeanceCap) {
  77.                         mVengeance = vengeanceCap;
  78.                         mTimeAtCap ++;
  79.                     }
  80.                     if (mVengeance > mMaxVengeanceStack) mMaxVengeanceStack = mVengeance;
  81.                     mDamageTaken = 0.0;
  82.                 }
  83.                 else {
  84.                     if (mVengeance > mMaxVengeanceStack / 10) {
  85.                         mVengeance = mVengeance - mMaxVengeanceStack / 10;
  86.                     }
  87.                     else {
  88.                         mVengeance = mMaxVengeanceStack = 0;
  89.                         mTimeAtZero ++;
  90.                     }
  91.                 }
  92.                 mTotalTime ++;
  93.                 if (mTotalTime == 0) mTotalVengeance = mTimeAtCap = mTimeAtZero = 0;
  94.                 if (mTotalTime > 0 && mVengeance < mLowestVengeance) mLowestVengeance = mVengeance;
  95.                 mTotalVengeance += mVengeance;
  96.                 mTotalVengeanceSq += mVengeance * mVengeance;
  97.                 mWasAttacked = false;
  98.                 if (DEBUG) System.out.println(mNext + " Vengeance at: " + mVengeance);
  99.             }
  100.         };
  101.        
  102.         Event yellowEvent = new Event(yellowInterval) {
  103.             @Override
  104.             void onEvent() {
  105.                 if (mRandom.nextBoolean(pYellowCrit) && mRandom.nextBoolean(pSavageDefense)) mSdUp = true;
  106.             }
  107.         };
  108.  
  109.         Event maulEvent = new Event(maulInterval) {
  110.             @Override
  111.             void onEvent() {
  112.                 if (mRandom.nextBoolean(pYellowCrit) && mRandom.nextBoolean(pSavageDefense)) mSdUp = true;
  113.             }
  114.         };
  115.        
  116.         Event whiteEvent = new Event(whiteInterval) {
  117.             @Override
  118.             void onEvent() {
  119.                 if (mRandom.nextBoolean(pWhiteCrit) && mRandom.nextBoolean(pSavageDefense)) mSdUp = true;
  120.             }
  121.         };
  122.        
  123.         Event bossEvent = new Event(bossInterval) {
  124.             @Override
  125.             void onEvent() {
  126.                 if (mRandom.nextBoolean(1.0 - pAvoid)) {
  127.                     if (mSdUp) {
  128.                         mSdUpSamples++;
  129.                         double damage = bossDamage - mShieldSize;
  130.                         if (damage > 0) mDamageTaken += damage;
  131.                         if (DEBUG) System.out.println(mNext + "Absorbed!");
  132.                     } else {
  133.                         mDamageTaken += bossDamage;
  134.                         if (DEBUG) System.out.println(mNext + "Ouch!");
  135.                     }
  136.                     mSdUp = false;
  137.                     mSamples++;
  138.                 }
  139.                 else if (DEBUG) System.out.println(mNext + " Avoided!");
  140.                 mWasAttacked = true;
  141.             }
  142.         };
  143.        
  144.         TreeSet<Event> events = new TreeSet<Event>();
  145.         events.add(vengeanceCheck);
  146.         events.add(yellowEvent);
  147.         events.add(whiteEvent);
  148.         events.add(maulEvent);
  149.         events.add(bossEvent);
  150.        
  151.         while (mSamples < SAMPLES) {
  152.             Event ev = events.pollFirst();
  153.             ev.onEvent();
  154.             ev.mNext += ev.mInterval;
  155. //          System.out.println(ev.mNext + " " + mSdUp + " " + mSdUpSamples + "/" + mSamples);
  156.             events.add(ev);
  157.         }
  158.        
  159.         double vengeanceMean = mTotalVengeance / mTotalTime;
  160.         double stddev = Math.sqrt(mTotalVengeanceSq / mTotalTime - (vengeanceMean * vengeanceMean));
  161.        
  162.         System.out.println("p(SD up) = " + (double)mSdUpSamples / mSamples);
  163.         System.out.println("vengeance cap = " + vengeanceCap);
  164.         System.out.println("average vengeance = " + vengeanceMean + "  (" + (double)vengeanceMean / vengeanceCap + ")");
  165.         System.out.println("stddev = " + stddev + "  (" + (double)stddev / vengeanceCap + ")");
  166.         System.out.println("lowest vengeance = " + (double)mLowestVengeance / vengeanceCap);
  167.         System.out.println("p(max vengeance) = " + (double)mTimeAtCap / mTotalTime);
  168.         System.out.println("p(0 vengeance) = " + (double)mTimeAtZero / mTotalTime);
  169.     }
  170.    
  171.    
  172.     public static void main(String args[]) {
  173.         new SavageDefenseSim().run();
  174.     }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement