//【確率】ゲージ上昇UP(boost_1)   ：パーセンテージなので少数値
//【確率】ゲージ上昇UP(boost_2)   ：パーセンテージなので少数値
// 確率を指定します。(kakuritu)   ：設定したい確率を整数で入力
//最小ExTapボーナス(min_extap)    ：そのままの数字が最小追加ボーナスになります
//最大ExTapボーナス(max_extap)    ：そのままの数字が最大追加ボーナスになります
//作:yoshilove(@yoshi_yottu)

[EntryPoint]
class Boost : Ability {
  double ratio_1, ratio_2;
  int r, r_ex, probability, min_ex, max_ex;
  int siBoost;
  Random ran;
  SkillIndicators@ skill;

  void Initialize(dictionary@ params, SkillIndicators@ ski) {
    params.get("boost_1", ratio_1);
    params.get("boost_2", ratio_2);
    params.get("kakuritu", probability);
    params.get("min_extap", min_ex);
    params.get("max_extap", max_ex);
    @skill = ski;
    siBoost = skill.AddIndicator("boost.png");
  }
  
  void OnStart(Result@ result) {

  }
  
  void OnFinish(Result@ result) {
    
  }
  
  void OnJusticeCritical(Result@ result, NoteType type) {
    skill.TriggerIndicator(siBoost);
    r = ran.NextInt(100);

    if (r < probability) {
    result.BoostGaugeJusticeCritical(ratio_1);
    }
    else {
    result.BoostGaugeJusticeCritical(ratio_2);
    }

    Execute(result, type);
  }
  
  void OnJustice(Result@ result, NoteType type) {
    skill.TriggerIndicator(siBoost);
    r = ran.NextInt(100);

    if (r < probability) {
    result.BoostGaugeJustice(ratio_1);
    }
    else {
    result.BoostGaugeJustice(ratio_2);
    }

    Execute(result, type);
  }
  
  void OnAttack(Result@ result, NoteType type) {
    skill.TriggerIndicator(siBoost);
    r = ran.NextInt(100);

    if (r < probability) {
    result.BoostGaugeAttack(ratio_1);
    }
    else {
    result.BoostGaugeAttack(ratio_2);
    }

    Execute(result, type);
  }
  
  void OnMiss(Result@ result, NoteType type) {
  }

  void Execute(Result@ result, NoteType type) {

    r_ex = ran.NextInt(max_ex - min_ex + 1) + min_ex;

    switch (type) {
      case NoteType::ExTap:
        result.BoostGaugeByValue(r_ex);
        break;
      default:
        break;
    }
  }
}