1
1
package org .bk .ass .sim ;
2
2
3
- import org .bk .ass .collection .UnorderedCollection ;
4
-
3
+ import java .util .Collection ;
5
4
import java .util .SplittableRandom ;
6
5
7
6
import static java .lang .Math .*;
@@ -45,99 +44,6 @@ public static int distanceSquared(Agent a, Agent b) {
45
44
return (a .x - b .x ) * (a .x - b .x ) + (a .y - b .y ) * (a .y - b .y );
46
45
}
47
46
48
- /** Deal splash damage to enemies and allies */
49
- public static void dealRadialSplashDamage (
50
- Weapon weapon ,
51
- Agent mainTarget ,
52
- UnorderedCollection <Agent > allies ,
53
- UnorderedCollection <Agent > enemies ) {
54
- for (int i = allies .size () - 1 ; i >= 0 ; i --) {
55
- Agent ally = allies .get (i );
56
- applySplashDamage (weapon , mainTarget , ally );
57
- }
58
- for (int i = enemies .size () - 1 ; i >= 0 ; i --) {
59
- Agent enemy = enemies .get (i );
60
- applySplashDamage (weapon , mainTarget , enemy );
61
- }
62
- }
63
-
64
- private static void applySplashDamage (Weapon weapon , Agent mainTarget , Agent splashTarget ) {
65
- if (splashTarget == mainTarget || splashTarget .isFlyer != mainTarget .isFlyer ) {
66
- return ;
67
- }
68
-
69
- int distanceSquared = distanceSquared (splashTarget , mainTarget );
70
- if (distanceSquared <= weapon .innerSplashRadiusSquared ) {
71
- applyDamage (splashTarget , weapon .damageType , weapon .damageShifted , weapon .hits );
72
- } else if (!splashTarget .burrowed ) {
73
- if (distanceSquared <= weapon .medianSplashRadiusSquared ) {
74
- applyDamage (splashTarget , weapon .damageType , weapon .damageShifted / 2 , weapon .hits );
75
- } else if (distanceSquared <= weapon .outerSplashRadiusSquared ) {
76
- applyDamage (splashTarget , weapon .damageType , weapon .damageShifted / 4 , weapon .hits );
77
- }
78
- }
79
- }
80
-
81
- /** Deal splash damage to enemies only */
82
- public static void dealRadialSplashDamage (
83
- Weapon weapon , Agent mainTarget , UnorderedCollection <Agent > enemies ) {
84
- for (int i = enemies .size () - 1 ; i >= 0 ; i --) {
85
- Agent enemy = enemies .get (i );
86
- applySplashDamage (weapon , mainTarget , enemy );
87
- }
88
- }
89
-
90
- public static void dealLineSplashDamage (
91
- Agent source , Weapon weapon , Agent mainTarget , UnorderedCollection <Agent > enemies ) {
92
- int dx = mainTarget .x - source .x ;
93
- int dy = mainTarget .y - source .y ;
94
- // Same spot, chose "random" direction
95
- if (dx == 0 && dy == 0 ) {
96
- dx = 1 ;
97
- }
98
- int dxDistSq = dx * dx + dy * dy ;
99
- int rangeWithSplashSquared =
100
- weapon .maxRangeSquared
101
- + 2 * weapon .maxRange * weapon .innerSplashRadius
102
- + weapon .innerSplashRadiusSquared ;
103
- for (int i = enemies .size () - 1 ; i >= 0 ; i --) {
104
- Agent enemy = enemies .get (i );
105
- if (enemy == mainTarget || enemy .isFlyer != mainTarget .isFlyer ) {
106
- continue ;
107
- }
108
- int enemyDistSq = distanceSquared (enemy , source );
109
- if (enemyDistSq <= rangeWithSplashSquared ) {
110
- int dot = (enemy .x - source .x ) * dx + (enemy .y - source .y ) * dy ;
111
- if (dot >= 0 ) {
112
- int projdx = source .x + dot * dx / dxDistSq - enemy .x ;
113
- int projdy = source .y + dot * dy / dxDistSq - enemy .y ;
114
- int projDistSq = projdx * projdx + projdy * projdy ;
115
- if (projDistSq <= weapon .innerSplashRadiusSquared ) {
116
- applyDamage (enemy , weapon .damageType , weapon .damageShifted , weapon .hits );
117
- }
118
- }
119
- }
120
- }
121
- }
122
-
123
- public static void dealBounceDamage (
124
- Weapon weapon , Agent lastTarget , UnorderedCollection <Agent > enemies ) {
125
- int remainingBounces = 2 ;
126
- int damage = weapon .damageShifted / 3 ;
127
- for (int i = enemies .size () - 1 ; i >= 0 && remainingBounces > 0 ; i --) {
128
- Agent enemy = enemies .get (i );
129
- if (enemy != lastTarget
130
- && enemy .healthShifted > 0
131
- && abs (enemy .x - lastTarget .x ) <= 96
132
- && abs (enemy .y - lastTarget .y ) <= 96 ) {
133
- lastTarget = enemy ;
134
- applyDamage (enemy , weapon .damageType , damage , weapon .hits );
135
- damage /= 3 ;
136
- remainingBounces --;
137
- }
138
- }
139
- }
140
-
141
47
public static void dealDamage (Agent agent , Weapon wpn , Agent target ) {
142
48
int remainingDamage = wpn .damageShifted ;
143
49
@@ -156,7 +62,7 @@ public static void dealDamage(Agent agent, Weapon wpn, Agent target) {
156
62
applyDamage (target , wpn .damageType , remainingDamage , wpn .hits );
157
63
}
158
64
159
- private static void applyDamage (Agent target , DamageType damageType , int damage , int hits ) {
65
+ public static void applyDamage (Agent target , DamageType damageType , int damage , int hits ) {
160
66
int shields = min (target .maxShieldsShifted , target .shieldsShifted ) - damage + target .shieldUpgrades ;
161
67
if (shields > 0 ) {
162
68
target .shieldsShifted = shields ;
@@ -194,27 +100,18 @@ public static int reduceDamageByTargetSizeAndDamageType(
194
100
return damageShifted ;
195
101
}
196
102
197
- public static void attack (Agent agent , Weapon selectedWeapon , Agent selectedEnemy , UnorderedCollection <Agent > allies , UnorderedCollection <Agent > enemies ) {
198
- dealDamage (agent , selectedWeapon , selectedEnemy );
199
- switch (selectedWeapon .splashType ) {
200
- case BOUNCE :
201
- dealBounceDamage (selectedWeapon , selectedEnemy , enemies );
202
- break ;
203
- case RADIAL_SPLASH :
204
- dealRadialSplashDamage (selectedWeapon , selectedEnemy , allies , enemies );
205
- break ;
206
- case RADIAL_ENEMY_SPLASH :
207
- dealRadialSplashDamage (selectedWeapon , selectedEnemy , enemies );
208
- break ;
209
- case LINE_SPLASH :
210
- dealLineSplashDamage (agent , selectedWeapon , selectedEnemy , enemies );
211
- break ;
212
- default :
213
- // No splash
214
- }
215
- agent .cooldown = agent .maxCooldown ;
216
- if (agent .remainingStimFrames > 0 ) {
217
- agent .cooldown /= 2 ;
103
+ /**
104
+ * Sets random positions for the given agents within the given rectangle.
105
+ * The positions are <em>stable</em>: Calling this with the same arguments twice will not change any position
106
+ * on the second invocation. More precisely, any {@link Agent} with position i in the collection will always
107
+ * get the same position. Be sure to use different rectangles for different {@link Agent} collections, to
108
+ * prevent them from getting assigned the same positions.
109
+ */
110
+ public static void randomizePositions (Collection <Agent > agents , int ax , int ay , int bx , int by ) {
111
+ SplittableRandom posRnd = new SplittableRandom (1337L );
112
+ for (Agent agent : agents ) {
113
+ agent .x = posRnd .nextInt (ax , bx - ax + 1 );
114
+ agent .y = posRnd .nextInt (ay , by - ay + 1 );
218
115
}
219
116
}
220
117
}
0 commit comments