| 12571 | } |
| 12572 | |
| 12573 | void cFodder::Sprite_Handle_MissileHoming(sSprite* pSprite) { |
| 12574 | int16 Data0, Data4, Data8, DataC; |
| 12575 | sSprite* Data34 = 0; |
| 12576 | |
| 12577 | if (pSprite->field_38) |
| 12578 | goto MissileExplode; |
| 12579 | |
| 12580 | dword_3B24B = -1; |
| 12581 | Sprite_Create_FireTrail(pSprite); |
| 12582 | |
| 12583 | pSprite->field_8 = 0xA3; |
| 12584 | Data34 = pSprite->field_1A_sprite; |
| 12585 | |
| 12586 | if (!Data34 || Data34->field_0 == -32768) { |
| 12587 | pSprite->field_36 += 2; |
| 12588 | pSprite->field_20 -= 2; |
| 12589 | if (pSprite->field_20 >= 0) { |
| 12590 | Sprite_Movement_Calculate(pSprite); |
| 12591 | return; |
| 12592 | } |
| 12593 | |
| 12594 | pSprite->field_20 = 0; |
| 12595 | goto MissileExplode; |
| 12596 | } |
| 12597 | |
| 12598 | Data0 = Data34->field_0 + 8; |
| 12599 | Data4 = Data34->field_4 + 8; |
| 12600 | Data8 = pSprite->field_0; |
| 12601 | DataC = pSprite->field_4; |
| 12602 | Map_Get_Distance_BetweenPoints_Within_Window(Data0, Data4, Data8, DataC); |
| 12603 | |
| 12604 | Data4 = pSprite->field_36 >> 4; |
| 12605 | Data4 += 1; |
| 12606 | |
| 12607 | if (Data0 <= Data4) |
| 12608 | goto MissileExplode; |
| 12609 | |
| 12610 | if (Data34->field_20 <= 0x10) { |
| 12611 | |
| 12612 | // Distance to target > 0x30? |
| 12613 | if (Data0 > 0x30) { |
| 12614 | Data0 = pSprite->field_0; |
| 12615 | Data4 = pSprite->field_4; |
| 12616 | Data8 = Data34->field_0; |
| 12617 | DataC = Data34->field_4; |
| 12618 | Data8 += 8; |
| 12619 | DataC += 8; |
| 12620 | |
| 12621 | if (!Map_PathCheck_CalculateTo(Data0, Data4, Data8, DataC)) { |
| 12622 | if (pSprite->field_20 > 8) |
| 12623 | pSprite->field_1E_Big -= 0x12000; |
| 12624 | } |
| 12625 | else { |
| 12626 | |
| 12627 | if (pSprite->field_20 < 0x18) |
| 12628 | pSprite->field_1E_Big += 0x28000; |
| 12629 | } |
| 12630 |
nothing calls this directly
no outgoing calls
no test coverage detected