@@ -282,5 +282,72 @@ public void Thorns()
282282 Assert . True ( challengerTick . Character . HP > enemyTick . Character . HP ) ;
283283 Assert . True ( enemyTick . SkillInfos . First ( ) . Effect > challengerTick . SkillInfos . First ( ) . Effect ) ;
284284 }
285+
286+ [ Fact ]
287+ public void Bleed ( )
288+ {
289+ var random = new TestRandom ( ) ;
290+ var avatarState1 = _avatarState1 ;
291+ var avatarState2 = _avatarState2 ;
292+
293+ var arenaAvatarState1 = new ArenaAvatarState ( avatarState1 ) ;
294+ var arenaAvatarState2 = new ArenaAvatarState ( avatarState2 ) ;
295+
296+ var characterRow = _tableSheets . CharacterSheet [ GameConfig . DefaultAvatarCharacterId ] ;
297+ var stats = characterRow . ToStats ( avatarState1 . level ) ;
298+ var totalAtk = 141138 ;
299+ var baseAtk = stats . ATK ;
300+ var runeOptionSheet = _tableSheets . RuneOptionSheet ;
301+ var runeRow = runeOptionSheet [ 10003 ] ;
302+ var rune = new RuneState ( 10003 ) ;
303+ while ( rune . Level < 89 )
304+ {
305+ rune . LevelUp ( ) ;
306+ }
307+
308+ var optionInfo = runeRow . LevelOptionMap [ 89 ] ;
309+ var statModifiers = new List < StatModifier > ( ) ;
310+ statModifiers . AddRange (
311+ optionInfo . Stats . Select ( x =>
312+ new StatModifier (
313+ x . stat . StatType ,
314+ x . operationType ,
315+ x . stat . TotalValueAsLong ) ) ) ;
316+ foreach ( var modifier in statModifiers )
317+ {
318+ if ( modifier . StatType == StatType . ATK )
319+ {
320+ baseAtk += modifier . Value ;
321+ }
322+ }
323+
324+ // Add collection modifier without level stats, rune stats
325+ var collectionModifier = new StatModifier ( StatType . ATK , StatModifier . OperationType . Add , totalAtk - baseAtk ) ;
326+ var modifiers = new List < StatModifier >
327+ {
328+ collectionModifier ,
329+ new ( StatType . HP , StatModifier . OperationType . Add , totalAtk * 10 ) ,
330+ } ;
331+
332+ var simulator = new ArenaSimulator ( random ) ;
333+ var myDigest = new ArenaPlayerDigest ( avatarState1 , arenaAvatarState1 ) ;
334+ myDigest . Runes . Add ( rune ) ;
335+ var enemyDigest = new ArenaPlayerDigest ( avatarState2 , arenaAvatarState2 ) ;
336+ enemyDigest . Runes . Add ( rune ) ;
337+ var arenaSheets = _tableSheets . GetArenaSimulatorSheets ( ) ;
338+ var log = simulator . Simulate ( myDigest , enemyDigest , arenaSheets , modifiers , modifiers , true ) ;
339+ var spawns = log . Events . OfType < ArenaSpawnCharacter > ( ) . ToList ( ) ;
340+ Assert . All ( spawns , spawn => Assert . Equal ( totalAtk , spawn . Character . ATK ) ) ;
341+ var ticks = log . Events
342+ . OfType < ArenaTickDamage > ( )
343+ . ToList ( ) ;
344+ var challengerTick = ticks . First ( r => ! r . Character . IsEnemy ) ;
345+ var enemyTick = ticks . First ( r => r . Character . IsEnemy ) ;
346+ var challengerInfo = challengerTick . SkillInfos . First ( ) ;
347+ var enemyInfo = enemyTick . SkillInfos . First ( ) ;
348+ var dmg = ( int ) decimal . Round ( totalAtk * optionInfo . SkillValue ) ;
349+ Assert . Equal ( dmg , challengerInfo . Effect ) ;
350+ Assert . Equal ( dmg , enemyInfo . Effect ) ;
351+ }
285352 }
286353}
0 commit comments