1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#include "damageind.h"
4
5#include <base/color.h>
6
7#include <engine/demo.h>
8#include <engine/graphics.h>
9
10#include <generated/client_data.h>
11#include <generated/protocol.h>
12
13#include <game/client/gameclient.h>
14
15CDamageInd::CDamageInd()
16{
17 m_NumItems = 0;
18}
19
20void CDamageInd::Create(vec2 Pos, vec2 Dir, float Alpha)
21{
22 if(m_NumItems >= MAX_ITEMS)
23 return;
24
25 CItem *pItem = &m_aItems[m_NumItems];
26 pItem->m_Pos = Pos;
27 pItem->m_Dir = -Dir;
28 pItem->m_RemainingLife = 0.75f;
29 pItem->m_StartAngle = -random_angle();
30 pItem->m_Color = ColorRGBA(1.0f, 1.0f, 1.0f, Alpha);
31 ++m_NumItems;
32}
33
34void CDamageInd::OnRender()
35{
36 if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK)
37 return;
38
39 static float s_LastLocalTime = LocalTime();
40 const float LifeAdjustment = (LocalTime() - s_LastLocalTime) * GameClient()->GetAnimationPlaybackSpeed();
41 s_LastLocalTime = LocalTime();
42
43 Graphics()->TextureSet(Texture: GameClient()->m_GameSkin.m_aSpriteStars[0]);
44 for(int i = 0; i < m_NumItems;)
45 {
46 m_aItems[i].m_RemainingLife -= LifeAdjustment;
47 if(m_aItems[i].m_RemainingLife < 0.0f)
48 {
49 --m_NumItems;
50 m_aItems[i] = m_aItems[m_NumItems];
51 }
52 else
53 {
54 vec2 Pos = mix(a: m_aItems[i].m_Pos + m_aItems[i].m_Dir * 75.0f, b: m_aItems[i].m_Pos, amount: std::clamp(val: (m_aItems[i].m_RemainingLife - 0.60f) / 0.15f, lo: 0.0f, hi: 1.0f));
55 const float LifeAlpha = m_aItems[i].m_RemainingLife / 0.1f;
56 Graphics()->SetColor(m_aItems[i].m_Color.WithMultipliedAlpha(alpha: LifeAlpha));
57 Graphics()->QuadsSetRotation(Angle: m_aItems[i].m_StartAngle + m_aItems[i].m_RemainingLife * 2.0f);
58 Graphics()->RenderQuadContainerAsSprite(ContainerIndex: m_DmgIndQuadContainerIndex, QuadOffset: 0, X: Pos.x, Y: Pos.y);
59 i++;
60 }
61 }
62
63 Graphics()->QuadsSetRotation(Angle: 0);
64 Graphics()->SetColor(r: 1.f, g: 1.f, b: 1.f, a: 1.f);
65}
66
67void CDamageInd::OnInit()
68{
69 Graphics()->QuadsSetRotation(Angle: 0);
70 Graphics()->SetColor(r: 1.f, g: 1.f, b: 1.f, a: 1.f);
71
72 m_DmgIndQuadContainerIndex = Graphics()->CreateQuadContainer(AutomaticUpload: false);
73 float ScaleX, ScaleY;
74 Graphics()->GetSpriteScale(Id: SPRITE_STAR1, ScaleX, ScaleY);
75 Graphics()->QuadsSetSubset(TopLeftU: 0, TopLeftV: 0, BottomRightU: 1, BottomRightV: 1);
76 Graphics()->QuadContainerAddSprite(QuadContainerIndex: m_DmgIndQuadContainerIndex, Width: 48.f * ScaleX, Height: 48.f * ScaleY);
77 Graphics()->QuadContainerUpload(ContainerIndex: m_DmgIndQuadContainerIndex);
78}
79
80void CDamageInd::OnReset()
81{
82 m_NumItems = 0;
83}
84