13
13
#include "constants/battle_anim.h"
14
14
#include "constants/rgb.h"
15
15
16
+ enum {
17
+ HAILSTRUCTTYPE_NEGATIVE_POS_MOD = 0 ,
18
+ HAILSTRUCTTYPE_POSITIVE_POS_MOD = 1 ,
19
+ HAILSTRUCTTYPE_FIXED_POSITION = 2 ,
20
+ };
16
21
struct HailStruct {
17
22
s32 x :10 ;
18
23
s32 y :10 ;
19
24
s32 bPosition :8 ;
20
- s32 unk3 :4 ;
25
+ s32 type :4 ;
21
26
};
22
27
23
28
static void AnimUnusedIceCrystalThrow (struct Sprite * );
@@ -371,16 +376,16 @@ const struct SpriteTemplate gPoisonGasCloudSpriteTemplate =
371
376
372
377
static const struct HailStruct sHailCoordData [] =
373
378
{
374
- {.x = 100 , .y = 120 , .bPosition = B_POSITION_PLAYER_LEFT , .unk3 = 2 },
375
- {.x = 85 , .y = 120 , .bPosition = B_POSITION_PLAYER_LEFT , .unk3 = 0 },
376
- {.x = 242 , .y = 120 , .bPosition = B_POSITION_OPPONENT_LEFT , .unk3 = 1 },
377
- {.x = 66 , .y = 120 , .bPosition = B_POSITION_PLAYER_RIGHT , .unk3 = 1 },
378
- {.x = 182 , .y = 120 , .bPosition = B_POSITION_OPPONENT_RIGHT , .unk3 = 0 },
379
- {.x = 60 , .y = 120 , .bPosition = B_POSITION_PLAYER_LEFT , .unk3 = 2 },
380
- {.x = 214 , .y = 120 , .bPosition = B_POSITION_OPPONENT_LEFT , .unk3 = 0 },
381
- {.x = 113 , .y = 120 , .bPosition = B_POSITION_PLAYER_LEFT , .unk3 = 1 },
382
- {.x = 210 , .y = 120 , .bPosition = B_POSITION_OPPONENT_RIGHT , .unk3 = 1 },
383
- {.x = 38 , .y = 120 , .bPosition = B_POSITION_PLAYER_RIGHT , .unk3 = 0 },
379
+ {.x = 100 , .y = 120 , .bPosition = B_POSITION_PLAYER_LEFT , .type = HAILSTRUCTTYPE_FIXED_POSITION },
380
+ {.x = 85 , .y = 120 , .bPosition = B_POSITION_PLAYER_LEFT , .type = HAILSTRUCTTYPE_NEGATIVE_POS_MOD },
381
+ {.x = 242 , .y = 120 , .bPosition = B_POSITION_OPPONENT_LEFT , .type = HAILSTRUCTTYPE_POSITIVE_POS_MOD },
382
+ {.x = 66 , .y = 120 , .bPosition = B_POSITION_PLAYER_RIGHT , .type = HAILSTRUCTTYPE_POSITIVE_POS_MOD },
383
+ {.x = 182 , .y = 120 , .bPosition = B_POSITION_OPPONENT_RIGHT , .type = HAILSTRUCTTYPE_NEGATIVE_POS_MOD },
384
+ {.x = 60 , .y = 120 , .bPosition = B_POSITION_PLAYER_LEFT , .type = HAILSTRUCTTYPE_FIXED_POSITION },
385
+ {.x = 214 , .y = 120 , .bPosition = B_POSITION_OPPONENT_LEFT , .type = HAILSTRUCTTYPE_NEGATIVE_POS_MOD },
386
+ {.x = 113 , .y = 120 , .bPosition = B_POSITION_PLAYER_LEFT , .type = HAILSTRUCTTYPE_POSITIVE_POS_MOD },
387
+ {.x = 210 , .y = 120 , .bPosition = B_POSITION_OPPONENT_RIGHT , .type = HAILSTRUCTTYPE_POSITIVE_POS_MOD },
388
+ {.x = 38 , .y = 120 , .bPosition = B_POSITION_PLAYER_RIGHT , .type = HAILSTRUCTTYPE_NEGATIVE_POS_MOD },
384
389
};
385
390
386
391
static const union AffineAnimCmd sAffineAnim_HailParticle_0 [] =
@@ -1332,6 +1337,13 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
1332
1337
}
1333
1338
}
1334
1339
1340
+ #define tState data[0]
1341
+ #define tSpriteCount data[1]
1342
+ #define tHailAffineAnimNum data[2]
1343
+ #define tHailStructId data[3]
1344
+ #define tInitialDelayTimer data[4]
1345
+ #define tHailSpawnTimer data[5]
1346
+
1335
1347
void AnimTask_Hail (u8 taskId )
1336
1348
{
1337
1349
struct Task * task = & gTasks [taskId ];
@@ -1342,71 +1354,86 @@ void AnimTask_Hail(u8 taskId)
1342
1354
static void AnimTask_Hail2 (u8 taskId )
1343
1355
{
1344
1356
struct Task * task = & gTasks [taskId ];
1345
- switch (task -> data [ 0 ] )
1357
+ switch (task -> tState )
1346
1358
{
1347
1359
case 0 :
1348
- if (++ task -> data [ 4 ] > 2 )
1360
+ if (++ task -> tInitialDelayTimer > 2 )
1349
1361
{
1350
- task -> data [ 4 ] = 0 ;
1351
- task -> data [ 5 ] = 0 ;
1352
- task -> data [ 2 ] = 0 ;
1353
- task -> data [ 0 ] ++ ;
1362
+ task -> tInitialDelayTimer = 0 ;
1363
+ task -> tHailSpawnTimer = 0 ;
1364
+ task -> tHailAffineAnimNum = 0 ;
1365
+ task -> tState ++ ;
1354
1366
}
1355
1367
break ;
1356
1368
case 1 :
1357
- if (task -> data [ 5 ] == 0 )
1369
+ if (task -> tHailSpawnTimer == 0 )
1358
1370
{
1359
- if (GenerateHailParticle (task -> data [ 3 ] , task -> data [ 2 ] , taskId , 1 ))
1360
- task -> data [ 1 ] ++ ;
1371
+ if (GenerateHailParticle (task -> tHailStructId , task -> tHailAffineAnimNum , taskId , 1 ))
1372
+ task -> tSpriteCount ++ ;
1361
1373
1362
- if (++ task -> data [ 2 ] == 3 )
1374
+ if (++ task -> tHailAffineAnimNum == ( int ) ARRAY_COUNT ( sAffineAnims_HailParticle ) )
1363
1375
{
1364
- if (++ task -> data [ 3 ] == 10 )
1365
- task -> data [ 0 ] ++ ;
1376
+ if (++ task -> tHailStructId == ( int ) ARRAY_COUNT ( sHailCoordData ) )
1377
+ task -> tState ++ ;
1366
1378
else
1367
- task -> data [ 0 ] -- ;
1379
+ task -> tState -- ;
1368
1380
}
1369
1381
else
1370
1382
{
1371
- task -> data [ 5 ] = 1 ;
1383
+ task -> tHailSpawnTimer = 1 ;
1372
1384
}
1373
1385
1374
1386
}
1375
1387
else
1376
1388
{
1377
- task -> data [ 5 ] -- ;
1389
+ task -> tHailSpawnTimer -- ;
1378
1390
}
1379
1391
break ;
1380
1392
case 2 :
1381
- if (task -> data [ 1 ] == 0 )
1393
+ if (task -> tSpriteCount == 0 )
1382
1394
DestroyAnimVisualTask (taskId );
1383
1395
break ;
1384
1396
}
1385
1397
}
1386
1398
1399
+ #undef tState
1400
+ #undef tSpriteCount
1401
+ #undef tHailAffineAnimNum
1402
+ #undef tHailStructId
1403
+ #undef tInitialDelayTimer
1404
+ #undef tHailSpawnTimer
1405
+
1406
+ // Hail falling particle sprite vars
1407
+ #define sSpawnImpactEffect data[0]
1408
+ #define sTargetX data[3]
1409
+ #define sTargetY data[4]
1410
+ #define sAffineAnimNum data[5]
1411
+ #define sOwnerTaskId data[6]
1412
+ #define sOwnerTaskSpriteCountField data[7]
1413
+
1387
1414
static bool8 GenerateHailParticle (u8 hailStructId , u8 affineAnimNum , u8 taskId , u8 c )
1388
1415
{
1389
1416
u8 id ;
1390
1417
s16 battlerX , battlerY ;
1391
1418
s16 spriteX ;
1392
- bool8 possibleBool = FALSE;
1393
- s8 unk = sHailCoordData [hailStructId ].unk3 ;
1419
+ bool8 shouldSpawnImpactEffect = FALSE;
1420
+ s8 type = sHailCoordData [hailStructId ].type ;
1394
1421
1395
- if (unk != 2 )
1422
+ if (type != HAILSTRUCTTYPE_FIXED_POSITION )
1396
1423
{
1397
1424
id = GetBattlerAtPosition (sHailCoordData [hailStructId ].bPosition );
1398
1425
if (IsBattlerSpriteVisible (id ))
1399
1426
{
1400
- possibleBool = TRUE;
1427
+ shouldSpawnImpactEffect = TRUE;
1401
1428
battlerX = GetBattlerSpriteCoord (id , BATTLER_COORD_X_2 );
1402
1429
battlerY = GetBattlerSpriteCoord (id , BATTLER_COORD_Y_PIC_OFFSET );
1403
- switch (unk )
1430
+ switch (type )
1404
1431
{
1405
- case 0 :
1432
+ case HAILSTRUCTTYPE_NEGATIVE_POS_MOD :
1406
1433
battlerX -= GetBattlerSpriteCoordAttr (id , BATTLER_COORD_ATTR_WIDTH ) / 6 ;
1407
1434
battlerY -= GetBattlerSpriteCoordAttr (id , BATTLER_COORD_ATTR_HEIGHT ) / 6 ;
1408
1435
break ;
1409
- case 1 :
1436
+ case HAILSTRUCTTYPE_POSITIVE_POS_MOD :
1410
1437
battlerX += GetBattlerSpriteCoordAttr (id , BATTLER_COORD_ATTR_WIDTH ) / 6 ;
1411
1438
battlerY += GetBattlerSpriteCoordAttr (id , BATTLER_COORD_ATTR_HEIGHT ) / 6 ;
1412
1439
break ;
@@ -1432,12 +1459,12 @@ static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId,
1432
1459
else
1433
1460
{
1434
1461
StartSpriteAffineAnim (& gSprites [id ], affineAnimNum );
1435
- gSprites [id ].data [ 0 ] = possibleBool ;
1436
- gSprites [id ].data [ 3 ] = battlerX ;
1437
- gSprites [id ].data [ 4 ] = battlerY ;
1438
- gSprites [id ].data [ 5 ] = affineAnimNum ;
1439
- gSprites [id ].data [ 6 ] = taskId ;
1440
- gSprites [id ].data [ 7 ] = c ;
1462
+ gSprites [id ].sSpawnImpactEffect = shouldSpawnImpactEffect ;
1463
+ gSprites [id ].sTargetX = battlerX ;
1464
+ gSprites [id ].sTargetY = battlerY ;
1465
+ gSprites [id ].sAffineAnimNum = affineAnimNum ;
1466
+ gSprites [id ].sOwnerTaskId = taskId ;
1467
+ gSprites [id ].sOwnerTaskSpriteCountField = c ;
1441
1468
return TRUE;
1442
1469
}
1443
1470
}
@@ -1449,43 +1476,58 @@ static void AnimHailBegin(struct Sprite *sprite)
1449
1476
sprite -> x += 4 ;
1450
1477
sprite -> y += 8 ;
1451
1478
1452
- if (sprite -> x < sprite -> data [ 3 ] && sprite -> y < sprite -> data [ 4 ] )
1479
+ if (sprite -> x < sprite -> sTargetX && sprite -> y < sprite -> sTargetY )
1453
1480
return ;
1454
1481
1455
- if (sprite -> data [ 0 ] == 1 && sprite -> data [ 5 ] == 0 )
1482
+ if (sprite -> sSpawnImpactEffect == 1 && sprite -> sAffineAnimNum == 0 )
1456
1483
{
1457
1484
spriteId = CreateSprite (& gIceCrystalHitLargeSpriteTemplate ,
1458
- sprite -> data [ 3 ] , sprite -> data [ 4 ] , sprite -> subpriority );
1485
+ sprite -> sTargetX , sprite -> sTargetY , sprite -> subpriority );
1459
1486
1460
1487
sprite -> data [0 ] = spriteId ;
1461
1488
if (spriteId != MAX_SPRITES )
1462
1489
{
1490
+ // The sprite template we're using is shared amongst a few other
1491
+ // places, which make the sprite flicker. That's not what we want
1492
+ // here, though. Override the callback.
1463
1493
gSprites [sprite -> data [0 ]].callback = AnimHailContinue ;
1464
- gSprites [sprite -> data [0 ]].data [ 6 ] = sprite -> data [ 6 ] ;
1465
- gSprites [sprite -> data [0 ]].data [ 7 ] = sprite -> data [ 7 ] ;
1494
+ gSprites [sprite -> data [0 ]].sOwnerTaskId = sprite -> sOwnerTaskId ;
1495
+ gSprites [sprite -> data [0 ]].sOwnerTaskSpriteCountField = sprite -> sOwnerTaskSpriteCountField ;
1466
1496
}
1467
1497
1468
1498
FreeOamMatrix (sprite -> oam .matrixNum );
1469
1499
DestroySprite (sprite );
1470
1500
}
1471
1501
else
1472
1502
{
1473
- gTasks [sprite -> data [ 6 ]] .data [sprite -> data [ 7 ] ]-- ;
1503
+ gTasks [sprite -> sOwnerTaskId ] .data [sprite -> sOwnerTaskSpriteCountField ]-- ;
1474
1504
FreeOamMatrix (sprite -> oam .matrixNum );
1475
1505
DestroySprite (sprite );
1476
1506
}
1477
1507
}
1478
1508
1509
+ #undef sSpawnImpactEffect
1510
+ #undef sTargetX
1511
+ #undef sTargetY
1512
+ #undef sAffineAnimNum
1513
+
1514
+ // Hail impact VFX sprite vars
1515
+ #define sTimer data[0]
1516
+
1479
1517
static void AnimHailContinue (struct Sprite * sprite )
1480
1518
{
1481
- if (++ sprite -> data [ 0 ] == 20 )
1519
+ if (++ sprite -> sTimer == 20 )
1482
1520
{
1483
- gTasks [sprite -> data [ 6 ]] .data [sprite -> data [ 7 ] ]-- ;
1521
+ gTasks [sprite -> sOwnerTaskId ] .data [sprite -> sOwnerTaskSpriteCountField ]-- ;
1484
1522
FreeOamMatrix (sprite -> oam .matrixNum );
1485
1523
DestroySprite (sprite );
1486
1524
}
1487
1525
}
1488
1526
1527
+ #undef sTimer
1528
+ #undef sOwnerTaskId
1529
+ #undef sOwnerTaskSpriteCountField
1530
+
1489
1531
// Initializes the animation for Ice Ball.
1490
1532
// arg 0: initial x pixel offset
1491
1533
// arg 1: initial y pixel offset
0 commit comments