hedgewars/uVisualGearsHandlers.pas
changeset 10193 d7cd5b43588f
parent 10124 aabd1b75d5a3
child 10251 a3b42e81803c
equal deleted inserted replaced
10192:bb1310c4bd79 10193:d7cd5b43588f
    28 {$INCLUDE "options.inc"}
    28 {$INCLUDE "options.inc"}
    29 
    29 
    30 unit uVisualGearsHandlers;
    30 unit uVisualGearsHandlers;
    31 
    31 
    32 interface
    32 interface
    33 uses uTypes;
    33 uses uTypes, uGears;
    34 
    34 
    35 var doStepVGHandlers: array[TVisualGearType] of TVGearStepProcedure;
    35 var doStepVGHandlers: array[TVisualGearType] of TVGearStepProcedure;
    36 
    36 
    37 procedure doStepFlake(Gear: PVisualGear; Steps: Longword);
    37 procedure doStepFlake(Gear: PVisualGear; Steps: Longword);
    38 procedure doStepBeeTrace(Gear: PVisualGear; Steps: Longword);
    38 procedure doStepBeeTrace(Gear: PVisualGear; Steps: Longword);
   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;