BGE: bookmark option on controller to make them run before all other controllers.
[blender.git] / source / gameengine / GameLogic / SCA_IActuator.cpp
1 /**
2  * $Id$
3  * ***** BEGIN GPL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include "SCA_IActuator.h"
30
31 #ifdef HAVE_CONFIG_H
32 #include <config.h>
33 #endif
34
35 using namespace std;
36
37 SCA_IActuator::SCA_IActuator(SCA_IObject* gameobj,
38                                                          PyTypeObject* T) :
39         SCA_ILogicBrick(gameobj,T),
40         m_links(0),
41         m_posevent(false),
42         m_negevent(false)
43 {
44         // nothing to do
45 }
46
47 bool SCA_IActuator::Update(double curtime, bool frame)
48 {
49         if (frame)
50                 return Update();
51         
52         return true;
53 }
54
55 bool SCA_IActuator::Update()
56 {
57         assert(false && "Actuators should override an Update method.");
58         return false;
59 }
60
61 void SCA_IActuator::Activate(SG_DList& head)
62 {
63         if (QEmpty())
64         {
65                 InsertActiveQList(m_gameobj->m_activeActuators);
66                 head.AddBack(&m_gameobj->m_activeActuators);
67         }
68 }
69
70 void SCA_IActuator::Deactivate()
71 {
72         if (QDelink())
73         {
74                 // the actuator was in the active list
75                 if (m_gameobj->m_activeActuators.QEmpty())
76                         // the owner object has no more active actuators, remove it from the global list
77                         m_gameobj->m_activeActuators.Delink();
78         }
79 }
80
81
82 void SCA_IActuator::ProcessReplica()
83 {
84         SCA_ILogicBrick::ProcessReplica();
85         RemoveAllEvents();
86         m_linkedcontrollers.clear();
87 }
88
89
90
91 SCA_IActuator::~SCA_IActuator()
92 {
93         RemoveAllEvents();
94 }
95
96 void SCA_IActuator::DecLink()
97 {
98         m_links--;
99         if (m_links < 0) 
100         {
101                 printf("Warning: actuator %s has negative m_links: %d\n", m_name.Ptr(), m_links);
102                 m_links = 0;
103         }
104 }
105
106 void SCA_IActuator::LinkToController(SCA_IController* controller)
107 {
108         m_linkedcontrollers.push_back(controller);
109 }
110
111 void SCA_IActuator::UnlinkController(SCA_IController* controller)
112 {
113         std::vector<class SCA_IController*>::iterator contit;
114         for (contit = m_linkedcontrollers.begin();!(contit==m_linkedcontrollers.end());++contit)
115         {
116                 if ((*contit) == controller)
117                 {
118                         *contit = m_linkedcontrollers.back();
119                         m_linkedcontrollers.pop_back();
120                         return;
121                 }
122         }
123         printf("Missing link from actuator %s:%s to controller %s:%s\n", 
124                 m_gameobj->GetName().ReadPtr(), GetName().ReadPtr(), 
125                 controller->GetParent()->GetName().ReadPtr(), controller->GetName().ReadPtr());
126 }
127
128 void SCA_IActuator::UnlinkAllControllers()
129 {
130         std::vector<class SCA_IController*>::iterator contit;
131         for (contit = m_linkedcontrollers.begin();!(contit==m_linkedcontrollers.end());++contit)
132         {
133                 (*contit)->UnlinkActuator(this);
134         }
135         m_linkedcontrollers.clear();
136 }
137