585 //doStepTeamHealthSorterWork(Gear, Steps) |
585 //doStepTeamHealthSorterWork(Gear, Steps) |
586 end; |
586 end; |
587 |
587 |
588 //////////////////////////////////////////////////////////////////////////////// |
588 //////////////////////////////////////////////////////////////////////////////// |
589 procedure doStepSpeechBubbleWork(Gear: PVisualGear; Steps: Longword); |
589 procedure doStepSpeechBubbleWork(Gear: PVisualGear; Steps: Longword); |
|
590 var realgear: PGear; |
590 begin |
591 begin |
591 if Gear^.Timer > Steps then dec(Gear^.Timer, Steps) else Gear^.Timer:= 0; |
592 if Gear^.Timer > Steps then dec(Gear^.Timer, Steps) else Gear^.Timer:= 0; |
592 |
593 realgear:= nil; |
593 if (Gear^.Hedgehog^.Gear <> nil) then |
594 if Gear^.Frame <> 0 then // use a non-hedgehog gear - a lua trick that hopefully won't be overused |
|
595 begin |
|
596 realgear:= GearByUID(Gear^.Frame); |
|
597 if realgear <> nil then |
|
598 begin |
|
599 Gear^.X:= hwFloat2Float(realgear^.X) + (Gear^.Tex^.w div 2 - Gear^.Tag); |
|
600 Gear^.Y:= hwFloat2Float(realgear^.Y) - (realgear^.Radius + Gear^.Tex^.h); |
|
601 end |
|
602 end |
|
603 else if Gear^.Hedgehog^.Gear <> nil then |
594 begin |
604 begin |
595 Gear^.X:= hwFloat2Float(Gear^.Hedgehog^.Gear^.X) + (Gear^.Tex^.w div 2 - Gear^.Tag); |
605 Gear^.X:= hwFloat2Float(Gear^.Hedgehog^.Gear^.X) + (Gear^.Tex^.w div 2 - Gear^.Tag); |
596 Gear^.Y:= hwFloat2Float(Gear^.Hedgehog^.Gear^.Y) - (16 + Gear^.Tex^.h); |
606 Gear^.Y:= hwFloat2Float(Gear^.Hedgehog^.Gear^.Y) - (cHHRadius + Gear^.Tex^.h); |
597 end; |
607 end; |
598 |
608 |
599 if Gear^.Timer = 0 then |
609 if (Gear^.Timer = 0) or ((realgear = nil) and (Gear^.Frame <> 0)) then |
600 begin |
610 begin |
601 if Gear^.Hedgehog^.SpeechGear = Gear then |
611 if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.SpeechGear = Gear) then |
602 Gear^.Hedgehog^.SpeechGear:= nil; |
612 Gear^.Hedgehog^.SpeechGear:= nil; |
603 DeleteVisualGear(Gear) |
613 DeleteVisualGear(Gear) |
604 end; |
614 end; |
605 end; |
615 end; |
606 |
616 |
607 procedure doStepSpeechBubble(Gear: PVisualGear; Steps: Longword); |
617 procedure doStepSpeechBubble(Gear: PVisualGear; Steps: Longword); |
|
618 var realgear: PGear; |
608 begin |
619 begin |
609 |
620 |
610 {$IFNDEF PAS2C} |
621 {$IFNDEF PAS2C} |
611 Steps:= Steps; // avoid compiler hint |
622 Steps:= Steps; // avoid compiler hint |
612 {$ENDIF} |
623 {$ENDIF} |
613 |
624 if Gear^.Frame <> 0 then |
614 with Gear^.Hedgehog^ do |
625 realgear:= GearByUID(Gear^.FrameTicks) |
615 if SpeechGear <> nil then |
626 else |
616 SpeechGear^.Timer:= 0; |
627 begin |
617 |
628 with Gear^.Hedgehog^ do |
618 Gear^.Hedgehog^.SpeechGear:= Gear; |
629 if SpeechGear <> nil then |
|
630 SpeechGear^.Timer:= 0; |
|
631 realgear:= Gear^.Hedgehog^.Gear; |
|
632 Gear^.Hedgehog^.SpeechGear:= Gear; |
|
633 end; |
|
634 |
|
635 if realgear <> nil then |
|
636 case Gear^.FrameTicks of |
|
637 1: Gear^.Tag:= SpritesData[sprSpeechTail].Width-37+realgear^.Radius; |
|
638 2: Gear^.Tag:= SpritesData[sprThoughtTail].Width-29+realgear^.Radius; |
|
639 3: Gear^.Tag:= SpritesData[sprShoutTail].Width-19+realgear^.Radius; |
|
640 end; |
619 |
641 |
620 Gear^.Timer:= max(LongInt(Length(Gear^.Text)) * 150, 3000); |
642 Gear^.Timer:= max(LongInt(Length(Gear^.Text)) * 150, 3000); |
621 |
|
622 Gear^.Tex:= RenderSpeechBubbleTex(ansistring(Gear^.Text), Gear^.FrameTicks, fnt16); |
643 Gear^.Tex:= RenderSpeechBubbleTex(ansistring(Gear^.Text), Gear^.FrameTicks, fnt16); |
623 |
|
624 // FrameTicks cannot hold negative values |
|
625 case Gear^.FrameTicks of |
|
626 1: Gear^.Tag:= SpritesData[sprSpeechTail].Width-28; |
|
627 2: Gear^.Tag:= SpritesData[sprThoughtTail].Width-20; |
|
628 3: Gear^.Tag:= SpritesData[sprShoutTail].Width-10; |
|
629 end; |
|
630 |
644 |
631 Gear^.doStep:= @doStepSpeechBubbleWork; |
645 Gear^.doStep:= @doStepSpeechBubbleWork; |
632 |
646 |
633 Gear^.Y:= Gear^.Y - Gear^.Tex^.h |
647 Gear^.Y:= Gear^.Y - Gear^.Tex^.h |
634 end; |
648 end; |