30 private Function<Integer, Integer> attackModifier = Function.identity();
31 private Function<Integer, Integer> magicModifier = Function.identity();
32 private Function<Integer, Integer> rangedModifier = Function.identity();
33 private Function<Integer, Integer> aggressiveModifier = Function.identity();
34 private Function<Integer, Integer> defensiveModifier = Function.identity();
36 private Function<Integer, Integer> maxHitModifier = Function.identity();
37 private Function<Integer, Integer> damageModifier = Function.identity();
41 protected final Modifier attackPercent(
double percentage) {
42 attackModifier = link(attackModifier, percentage(percentage));
46 protected final Modifier ranged(
double percentage) {
47 rangedModifier = link(rangedModifier, percentage(percentage));
51 protected final Modifier magic(
double percentage) {
52 magicModifier = link(magicModifier, percentage(percentage));
56 protected final Modifier aggressive(
double percentage) {
57 aggressiveModifier = link(aggressiveModifier, percentage(percentage));
61 protected final Modifier defensive(
double percentage) {
62 defensiveModifier = link(defensiveModifier, percentage(percentage));
66 protected final Modifier maxHit(
double percentage) {
67 maxHitModifier = link(maxHitModifier, percentage(percentage));
73 protected final Modifier attack(
int level) {
74 attackModifier = link(attackModifier, addition(level));
78 protected final Modifier ranged(
int level) {
79 rangedModifier = rangedModifier.andThen(addition(level));
83 protected final Modifier magic(
int level) {
84 magicModifier = magicModifier.andThen(addition(level));
88 protected final Modifier aggressive(
int level) {
89 aggressiveModifier = aggressiveModifier.andThen(addition(level));
93 protected final Modifier defensive(
int level) {
94 defensiveModifier = defensiveModifier.andThen(addition(level));
98 protected final Modifier maxHit(
int level) {
99 maxHitModifier = maxHitModifier.andThen(addition(level));
107 modifier.attackModifier = first.attackModifier.andThen(second.attackModifier);
108 modifier.magicModifier = first.magicModifier.andThen(second.magicModifier);
109 modifier.rangedModifier = first.rangedModifier.andThen(second.rangedModifier);
110 modifier.aggressiveModifier = first.aggressiveModifier.andThen(second.aggressiveModifier);
111 modifier.defensiveModifier = first.defensiveModifier.andThen(second.defensiveModifier);
112 modifier.maxHitModifier = first.maxHitModifier.andThen(second.maxHitModifier);
113 modifier.damageModifier = first.damageModifier.andThen(second.damageModifier);
117 public int modifyAttack(
int level) {
118 return attackModifier.apply(level);
121 public int modifyRanged(
int level) {
122 return rangedModifier.apply(level);
125 public int modifyMagic(
int level) {
126 return magicModifier.apply(level);
129 public int modifyAggressive(
int level) {
130 return aggressiveModifier.apply(level);
133 public int modifyDefensive(
int level) {
134 return defensiveModifier.apply(level);
137 public int modifyMaxHit(
int max) {
138 return maxHitModifier.apply(max);
141 public int modifyDamage(
int damage) {
142 return damageModifier.apply(damage);
145 private static Function<Integer, Integer> link(Function<Integer, Integer> modifier, Function<Integer, Integer> next) {
146 return modifier.andThen(next);
149 private static Function<Integer, Integer> addition(
int amount) {
150 return modifier -> modifier + amount;
153 private static Function<Integer, Integer> percentage(
double percent) {
154 return modifier -> (int) (modifier * (1 + percent));
157 private static Modifier attack(
double percent) {
158 return new Modifier() {{ attackPercent(percent); }};
161 public static void main(String[] args) {
165 Modifier chain = link(godsword, agsMaxHit);
166 Modifier linked = link(attack(0.25), attack(0.10));
170 total = link(chain, linked).modifyAttack(10000) / 10000.0;
171 System.out.println(total);
173 total = link(chain, linked).modifyAttack(10000) / 10000.0;
174 System.out.println(total);