1 /*
2  * This file is part of the Colobot: Gold Edition source code
3  * Copyright (C) 2001-2020, Daniel Roux, EPSITEC SA & TerranovaTeam
4  * http://epsitec.ch; http://colobot.info; http://github.com/colobot
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see http://gnu.org/licenses
18  */
19 
20 #pragma once
21 
22 
23 #include "object/task/task.h"
24 
25 #include "math/vector.h"
26 
27 #include "object/object_type.h"
28 
29 
30 class CObject;
31 
32 const float BUILDMARGIN = 16.0f;
33 const int TBMAXLIGHT    = 4;
34 
35 
36 enum TaskBuildPhase
37 {
38     TBP_STOP    = 0,    // cancels task
39     TBP_TURN    = 1,    // turns
40     TBP_MOVE    = 2,    // forward/backward
41     TBP_TAKE    = 3,    // takes gun
42     TBP_PREP    = 4,    // prepares
43     TBP_BUILD   = 5,    // builds
44     TBP_TERM    = 6,    // ends
45     TBP_RECEDE  = 7,    // back terminal
46 };
47 
48 
49 
50 class CTaskBuild : public CForegroundTask
51 {
52 public:
53     CTaskBuild(COldObject* object);
54     ~CTaskBuild();
55 
56     bool        EventProcess(const Event &event) override;
57 
58     Error       Start(ObjectType type);
59     Error       IsEnded() override;
60     bool        Abort() override;
61 
62 protected:
63     Error       FlatFloor();
64     void        CreateBuilding(Math::Vector pos, float angle, bool trainer);
65     void        CreateLight();
66     void        BlackLight();
67     CObject*    SearchMetalObject(float &angle, float dMin, float dMax, float aLimit, Error &err);
68     void        DeleteMark(Math::Vector pos, float radius);
69 
70 protected:
71     ObjectType      m_type = OBJECT_NULL;                  // type of construction
72     CObject*        m_metal = nullptr;                 // transforms metal object
73     CObject*        m_power = nullptr;                 // the vehicle battery
74     CObject*        m_building = nullptr;              // building built
75     TaskBuildPhase  m_phase = TBP_STOP;                 // phase of the operation
76     bool            m_bError = false;                // true -> operation impossible
77     bool            m_bBuild = false;                // true -> building built
78     bool            m_bBlack = false;                // true -> lights black -> white
79     float           m_time = 0.0f;                  // absolute time
80     float           m_lastParticle = 0.0f;          // time of generation last particle
81     float           m_progress = 0.0f;              // progression (0..1)
82     float           m_speed = 0.0f;                 // speed of progression
83     float           m_angleY = 0.0f;                // rotation angle of the vehicle
84     float           m_angleZ = 0.0f;                // angle of rotation of the gun
85     Math::Vector    m_buildingPos;           // initial position of the building
86     float           m_buildingHeight = 0.0f;        // height of the building
87     int             m_lightRank[TBMAXLIGHT] = {}; // lights for the effects
88     int             m_soundChannel = 0;
89 };
90