summaryrefslogtreecommitdiffstats
path: root/src/graphics/common/pyro.h
blob: 704febffbe4761c3d9ca93bc9443321b053c7623 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// * This file is part of the COLOBOT source code
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
// *
// * This program is free software: you can redistribute it and/or modify
// * it under the terms of the GNU General Public License as published by
// * the Free Software Foundation, either version 3 of the License, or
// * (at your option) any later version.
// *
// * This program is distributed in the hope that it will be useful,
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// * GNU General Public License for more details.
// *
// * You should have received a copy of the GNU General Public License
// * along with this program. If not, see  http://www.gnu.org/licenses/.

// pyro.h

#pragma once

#include "graphics/common/engine.h"
#include "object/object.h"
#include "common/misc.h"


class CInstanceManager;
class CObject;
class CDisplayText;
class CRobotMain;
class CSound;


namespace Gfx {

class CEngine;
class CTerrain;
class CCamera;
class CParticle;
class CLight;


enum PyroType
{
	PT_NULL		= 0,
	PT_FRAGT	= 1,		// fragmentation of technical object
	PT_FRAGO	= 2,		// fragmentation of organic object
	PT_FRAGW	= 4,		// fragmentation of object under water
	PT_EXPLOT	= 5,		// explosion of technical object
	PT_EXPLOO	= 6,		// explosion of organic object
	PT_EXPLOW	= 8,		// explosion of object under water
	PT_SHOTT	= 9,		// hit technical object
	PT_SHOTH	= 10,		// hit human
	PT_SHOTM	= 11,		// hit queen
	PT_SHOTW	= 12,		// hit under water
	PT_EGG		= 13,		// break the egg
	PT_BURNT	= 14,		// burning of technical object
	PT_BURNO	= 15,		// burning of organic object
	PT_SPIDER	= 16,		// spider explosion
	PT_FALL		= 17,		// cargo falling
	PT_WPCHECK	= 18,		// indicator reaches
	PT_FLCREATE	= 19,		// flag create
	PT_FLDELETE	= 20,		// flag destroy
	PT_RESET	= 21,		// reset position of the object
	PT_WIN		= 22,		// fireworks
	PT_LOST		= 23,		// black smoke
	PT_DEADG	= 24,		// shooting death
	PT_DEADW	= 25,		// drowning death
	PT_FINDING	= 26,		// object discovered
};


struct PyroBurnPart
{
	int				part;
	Math::Vector	initialPos;
	Math::Vector	finalPos;
	Math::Vector	initialAngle;
	Math::Vector	finalAngle;
};

struct PyroLightOper
{
	float			progress;
	float			intensity;
	Gfx::Color		color;
};



class CPyro {
public:
	CPyro(CInstanceManager* iMan);
	~CPyro();

	void		DeleteObject(bool bAll=FALSE);
	bool		Create(PyroType type, CObject* pObj, float force=1.0f);
	bool		EventProcess(const Event &event);
	Error		IsEnded();
	void		CutObjectLink(CObject* pObj);

protected:
	void		DisplayError(PyroType type, CObject* pObj);
	bool		CreateLight(Math::Vector pos, float height);
	void		DeleteObject(bool bPrimary, bool bSecondary);

	void		CreateTriangle(CObject* pObj, ObjectType oType, int part);

	void		ExploStart();
	void		ExploTerminate();

	void		BurnStart();
	void		BurnAddPart(int part, Math::Vector pos, Math::Vector angle);
	void		BurnProgress();
	bool		BurnIsKeepPart(int part);
	void		BurnTerminate();

	void		FallStart();
	CObject*	FallSearchBeeExplo();
	void		FallProgress(float rTime);
	Error		FallIsEnded();

	void		LightOperFlush();
	void		LightOperAdd(float progress, float intensity, float r, float g, float b);
	void		LightOperFrame(float rTime);

protected:
	CInstanceManager* m_iMan;
	CEngine*		m_engine;
	CTerrain*		m_terrain;
	CCamera*		m_camera;
	CParticle*		m_particule;
	CLight*		m_light;
	CObject*		m_object;
	CDisplayText*	m_displayText;
	CRobotMain*		m_main;
	CSound*			m_sound;

	Math::Vector		m_pos;			// center of the effect
	Math::Vector		m_posPower;		// center of the battery
	bool			m_bPower;		// battery exists?
	PyroType		m_type;
	float			m_force;
	float			m_size;
	float			m_progress;
	float			m_speed;
	float			m_time;
	float			m_lastParticule;
	float			m_lastParticuleSmoke;
	int				m_soundChannel;

	int				m_lightRank;
	int				m_lightOperTotal;
	PyroLightOper	m_lightOper[10];
	float			m_lightHeight;

	ObjectType		m_burnType;
	int				m_burnPartTotal;
	PyroBurnPart	m_burnPart[10];
	int				m_burnKeepPart[10];
	float			m_burnFall;

	float			m_fallFloor;
	float			m_fallSpeed;
	float			m_fallBulletTime;
	bool			m_bFallEnding;

	int				m_crashSphereUsed;	// number of spheres used
	Math::Vector		m_crashSpherePos[50];
	float			m_crashSphereRadius[50];
};

}; // namespace Gfx