@@ -287,7 +287,7 @@ void Ty::Draw(void) {
287287 mFsm .Draw (this );
288288}
289289
290- void Ty::StartDeath (HurtType, bool ) {
290+ void Ty::StartDeath (HurtType hurtType , bool r5 ) {
291291 gb.unk7AC = true ;
292292 particleManager->StopExclamation (true );
293293
@@ -300,8 +300,61 @@ void Ty::StartDeath(HurtType, bool) {
300300 }
301301}
302302
303- void Ty::Hurt (HurtType, DDADamageCause, bool , Vector* , float ) {
303+ void VibrateJoystick ( float , float , float , char , float );
304304
305+ void Ty::Hurt (HurtType hurtType, DDADamageCause damageCause, bool , Vector* pVec, float f1) {
306+ static int flinch = 0 ;
307+
308+ if (gb.disableTriggers || gb.infinitePie ) {
309+ return ;
310+ }
311+
312+ if (invicibilityFrames > 0 || mFsm .GetStateEx () == TY_AS_28 || mFsm .GetStateEx () == TY_AS_29) {
313+ return ;
314+ }
315+
316+ EnableHead (TY_HEAD_0);
317+
318+ if (hurtType == HURT_TYPE_1 || hurtType == HURT_TYPE_5) {
319+ VibrateJoystick (0 .5f , 1 .0f , (f1 / 45 .0f ) + 0 .2f , 0 , 4 .0f );
320+ }
321+
322+ dda.StoreDamageInfo (damageCause);
323+
324+ if (ty.mMediumMachine .GetUnk0 () == TY_MEDIUM_3 && mFsm .GetStateEx () != TY_AS_25) {
325+ for (int i = 0 ; i < 31 ; i++) {
326+
327+ }
328+
329+ SoundBank_Play (0x9 , NULL , ID_NONE);
330+ }
331+
332+ if (tyHealth.Hurt (hurtType)) {
333+ switch (hurtType) {
334+ case HURT_TYPE_0:
335+ case HURT_TYPE_3:
336+ case HURT_TYPE_6:
337+ flinch = (flinch + 1 ) % 3 ;
338+ if (unk4EC.Condition ()) {
339+ unk4EC.SetAnim (NULL );
340+ }
341+ break ;
342+ case HURT_TYPE_2:
343+ SetKnockBackFromPos (&pos, f1, KB_TYPE_2);
344+ break ;
345+ case HURT_TYPE_1:
346+ case HURT_TYPE_4:
347+ SetKnockBackFromPos (pVec, f1, KB_TYPE_0);
348+ break ;
349+ case HURT_TYPE_5:
350+ SetKnockBackFromDir (pVec, f1, KB_TYPE_0);
351+ break ;
352+ }
353+
354+ invicibilityFrames = 240 ; // 240 frames
355+ } else {
356+ StartDeath (hurtType, false );
357+ }
305358}
306359
307360// void Ty::SetToIdle(bool, TyMedium) {
@@ -328,9 +381,13 @@ void AutoTargetStruct::Reset(void) {
328381
329382}
330383
384+ void Ty::ResetDrownTimer (void ) {
385+ unk828 = gb.logicGameCount + (int )((gDisplay .fps * 180 .0f ) / tyHealth.GetHealthFieldUnk4 ());
386+ }
387+
331388void Ty::WaterMediumInit (void ) {
332389 BoomerangManagerAnims swimAnims = {
333- true ,
390+ false ,
334391 unk6C8,
335392 {unk6C8, unk6DC},
336393 {unk6D4, unk6E8}
@@ -351,6 +408,8 @@ void Ty::WaterMediumDeinit(void) {
351408
352409}
353410
411+ void Hud_ShowHealthMeter (bool );
412+
354413void Ty::UnderWaterMediumInit (void ) {
355414 BoomerangManagerAnims underWaterAnims = {
356415 true ,
@@ -363,13 +422,22 @@ void Ty::UnderWaterMediumInit(void) {
363422
364423 tyHealth.SetType (HEALTH_TYPE_1);
365424
425+ SoundBank_PlayExclusiveAmbientSound (false );
426+
427+ Hud_ShowHealthMeter (true );
428+
429+ ResetDrownTimer ();
430+
366431 if (pBunyip) {
367432 pBunyip->SetState (BUNYIP_DISAPPEAR);
368433 }
369434}
370435
371436void Ty::UnderWaterMediumUpdate (void ) {
372-
437+ if (gb.logicGameCount >= unk828) {
438+ ty.Hurt (HURT_TYPE_6, DDA_DAMAGE_3, false , NULL , 15 .0f );
439+ ResetDrownTimer ();
440+ }
373441}
374442
375443void Ty::UnderWaterMediumDeinit (void ) {
0 commit comments