ALMaSS Partridge ODdox  1.1
The partridge model description following ODdox protocol
Partridge_Communication.cpp
Go to the documentation of this file.
1 /*
2 *******************************************************************************************************
3 Copyright (c) 2011, Christopher John Topping, University of Aarhus
4 All rights reserved.
5 
6 Redistribution and use in source and binary forms, with or without modification, are permitted provided
7 that the following conditions are met:
8 
9 Redistributions of source code must retain the above copyright notice, this list of conditions and the
10 following disclaimer.
11 Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
12 the following disclaimer in the documentation and/or other materials provided with the distribution.
13 
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
15 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
17 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
18 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
19 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22 ********************************************************************************************************
23 */
37 //---------------------------------------------------------------------------
38 
39 // Includes from ALMaSS
40 
41 using namespace std;
42 
43 #include <cmath>
44 #include <stdio.h>
45 #include <vector>
46 #include <iostream>
47 #include <fstream>
48 
49 // Includes from ALMaSS
50 #include "../Landscape/ls.h"
51 #include "../BatchALMaSS/PopulationManager.h"
52 #include "../Partridge/Partridge_All.h"
53 #include "../Partridge/Partridge_Population_Manager.h"
54 #include "../Partridge/Partridge_Covey.h"
55 #include "../Partridge/Partridge_Communication.h"
56 
57 //---------------------------------------------------------------------------
58 
59 //
60 // Partridge_Communication.cpp
61 //
62 
67  pc_data->m_clutch=NULL;
68  pc_data->m_chick=NULL;
69  pc_data->m_chick2=NULL;
70  pc_data->m_male=NULL;
71  pc_data->m_female=NULL;
72  pc_data->m_covey=NULL;
73  pc_data->m_HaveTerritory=false;
74  pc_data->m_boolean=false;
75  pc_data->m_int=0;
76  pc_data->m_float=0;
77 }
78 //------------------------------------------------------------------------------
87  switch (pc) {
88  case pcomm_KillChick:
89  #ifdef __PAR_PCDEBUG
90  if (pc_data->m_chick->GetObjectType() != pob_Chick) {
91  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_KillChick" );
92  exit(101);
93  }
94  #endif
95  pc_data->m_chick->OnYouAreDead(); // No data to pass
96  break;
97  case pcomm_Mating:
98  #ifdef __PAR_PCDEBUG
99  if (pc_data->m_female->GetMate() != NULL) {
100  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_Mating" );
101  exit(102);
102  }
103  #endif
104  pc_data->m_female->OnMating(pc_data);
105  break;
106  case pcomm_MatingM:
107  #ifdef __PAR_PCDEBUG
108  if (pc_data->m_male->GetMate() != NULL) {
109  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_MatingM" );
110  exit(102);
111  }
112  #endif
113  pc_data->m_male->OnMating(pc_data->m_female);
114  break;
115  case pcomm_MaleDying:
116  #ifdef __PAR_PCDEBUG
117  if (pc_data->m_female->GetMate() != pc_data->m_male) {
118  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_MaleDying" );
119  exit(103);
120  }
121  #endif
122  pc_data->m_female->OnMateDying(pc_data);
123  break;
124  case pcomm_EggsHatch:
125  #ifdef __PAR_PCDEBUG
126  if (pc_data->m_female->GetClutch() != pc_data->m_clutch) {
127  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_EggsHatch1" );
128  exit(104);
129  }
130  if ( pc_data->m_male ) if (pc_data->m_male->GetMate() != pc_data->m_female) {
131  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_EggsHatch2" );
132  exit (113);
133  }
134  if ((pc_data->m_female->GetMate() == NULL)&& ( pc_data->m_male != NULL)) {
135  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_EggsHatch3" );
136  exit (113);
137  }
138  #endif
139  // It is possible that there is no male if he was killed under incubation
140  if ( pc_data->m_male ) pc_data->m_male->OnLookAfterKids( );
141  pc_data->m_female->OnEggsHatch();
142  break;
143  case pcomm_SetClutch:
144  #ifdef __PAR_PCDEBUG
145  if (pc_data->m_female->WhatState() != pars_FMakingNest) {
146  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_SetClutch" );
147  exit(111);
148  }
149  #endif
150  pc_data->m_female->OnSetMyClutch(pc_data);
151  break;
152  case pcomm_WaitForMale:
153  #ifdef __PAR_PCDEBUG
154  if (pc_data->m_female->GetMate() != NULL) {
155  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_WaitForMale" );
156  exit(106);
157  }
158  #endif
159  pc_data->m_female->OnWaitForMale();
160  break;
161  case pcomm_ClutchDead:
162  #ifdef __PAR_PCDEBUG
163  if (pc_data->m_female->GetClutch() != pc_data->m_clutch) {
164  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_ClutchDead" );
165  exit(107);
166  }
167  #endif
168  pc_data->m_female->OnClutchDeath();
169  break;
170  case pcomm_AllInfertile:
171  #ifdef __PAR_PCDEBUG
172  if (pc_data->m_female->GetClutch() != pc_data->m_clutch) {
173  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_ClutchDead" );
174  exit(107);
175  }
176  #endif
177  pc_data->m_female->OnClutchDeath();
178  break;
179  case pcomm_ClutchMown:
180  #ifdef __PAR_PCDEBUG
181  if (pc_data->m_female->GetClutch() != pc_data->m_clutch) {
182  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_ClutchMown" );
183  exit(107);
184  }
185  #endif
186  pc_data->m_female->OnClutchMown();
187  break;
188  case pcomm_MumDeadC:
189  // Possible to get here and have an old mate but no mate
190  if (pc_data->m_female->GetOldMate() != NULL) {
191  #ifdef __PAR_PCDEBUG
192  if (pc_data->m_female != pc_data->m_female->GetOldMate()->GetOldMate()) {
193  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_MumDeadC3 - old mate mismatch" );
194  exit(117);
195  }
196  #endif
197  pc_data->m_female->GetOldMate()->RemoveOldMate(false);
198  }
199  // Possible that this is called with no male
200  if (pc_data->m_male != NULL) {
201  #ifdef __PAR_PCDEBUG
202  if (pc_data->m_female->GetMate() != pc_data->m_male) {
203  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_MumDeadC1" );
204  exit(108);
205  }
206  #endif
207  pc_data->m_male->OnMateDying();
208  }
209  // Quite possible this is called with no clutch
210  if (pc_data->m_clutch != NULL) {
211  #ifdef __PAR_PCDEBUG
212  if ((pc_data->m_female->WhatState() != pars_FIncubating) && (pc_data->m_female->WhatState() != pars_FLaying)) {
213  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_MumDeadC2" );
214  exit(112);
215  }
216  #endif
217  pc_data->m_clutch->OnMumDead();
218  }
219  break;
221  #ifdef __PAR_PCDEBUG
222  if (pc_data->m_female->GetMate() != pc_data->m_male) {
223  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_FemaleGivingUp" );
224  exit(109);
225  }
226  #endif
227  pc_data->m_male->OnFemaleGivingUp();
228  break;
229  case pcomm_ClutchEaten:
230  #ifdef __PAR_PCDEBUG
231  if (pc_data->m_female->GetClutch() == NULL) {
232  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_ClutchEaten" );
233  exit(110);
234  }
235  #endif
236  pc_data->m_clutch->OnEaten();
237  break;
238  case pcomm_AllChicksDead:
239  #ifdef __PAR_PCDEBUG
240  if (pc_data->m_female) if (pc_data->m_female->GetMate() != pc_data->m_male) {
241  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_AllChicksDead" );
242  exit(111);
243  }
244  #endif
245  // All chicks are dead so tell the sad news to the parents, if they live
246  if (pc_data->m_male) pc_data->m_male->OnChicksDead();
247  if (pc_data->m_female) {
248  pc_data->m_female->OnChicksDead();
249  }
250  break;
251  case pcomm_ChicksMature:
252  #ifdef __PAR_PCDEBUG
253  if (pc_data->m_female) if (pc_data->m_female->GetMate() != pc_data->m_male) {
254  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_ChickMature" );
255  exit(114);
256  }
257  #endif
258  // All chicks are dead so tell the sad news to the parents, if they live
259  if (pc_data->m_male) pc_data->m_male->OnChicksMatured();
260  if (pc_data->m_female) pc_data->m_female->OnChicksMatured();
261  break;
263  #ifdef __PAR_PCDEBUG
264  if (pc_data->m_female->GetMate() != pc_data->m_male) {
265  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_StoppingBreeding" );
266  exit(115);
267  }
268  #endif
269  pc_data->m_male->OnStoppingBreeding();
270  break;
271  case pcomm_MovingHome:
272  #ifdef __PAR_PCDEBUG
273  if (pc_data->m_female->GetMate() != pc_data->m_male) {
274  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "pcomm_MovingHome" );
275  exit(116);
276  }
277  #endif
278  pc_data->m_male->OnMovingHome();
279  break;
280  default:
281  g_msg->Warn( WARN_BUG, "Partridge_Communication::PassMessage():", "No matching message" );
282  exit(199);
283  }
284  #ifdef __PARPCDEBUG
285  ClearData(pc_data);
286  #endif
287  return true;
288 }
289 //------------------------------------------------------------------------------
pcomm_MumDeadC
Definition: Partridge_Communication.h:66
Partridge_Clutch::OnEaten
void OnEaten()
Message handler.
Definition: Partridge_All.cpp:645
Partridge_Communication::PassMessage
bool PassMessage(PartridgeCommunicationData *pc_data, TypeOfPartridge_Communication pc)
Pass a message.
Definition: Partridge_Communication.cpp:86
Partridge_Chick::OnYouAreDead
void OnYouAreDead()
Message handler.
Definition: Partridge_All.cpp:1016
Partridge_Female::OnMating
void OnMating(PartridgeCommunicationData *pc_datae)
Message handler.
Definition: Partridge_All.cpp:2031
pcomm_KillChick
Definition: Partridge_Communication.h:54
pcomm_ClutchEaten
Definition: Partridge_Communication.h:68
Partridge_Male::OnMateDying
void OnMateDying()
Message handler.
Definition: Partridge_All.cpp:2761
pcomm_MovingHome
Definition: Partridge_Communication.h:70
pcomm_ClutchMown
Definition: Partridge_Communication.h:65
PartridgeCommunicationData::m_boolean
bool m_boolean
Definition: Partridge_Communication.h:87
Partridge_Female::GetClutch
Partridge_Clutch * GetClutch(void)
Supply clutch pointer.
Definition: Partridge_All.h:867
Partridge_Male::RemoveOldMate
void RemoveOldMate(bool a_knockon)
Forget any old mate.
Definition: Partridge_All.cpp:2661
pcomm_ChicksMature
Definition: Partridge_Communication.h:56
WARN_BUG
Definition: maperrormsg.h:34
Partridge_Female::OnChicksMatured
void OnChicksMatured()
Message handler.
Definition: Partridge_All.cpp:2107
Partridge_Male::GetMate
Partridge_Female * GetMate(void)
Are we paired?
Definition: Partridge_All.h:719
Partridge_Female::OnClutchMown
void OnClutchMown()
Message handler.
Definition: Partridge_All.cpp:2069
Partridge_Female::GetMate
Partridge_Male * GetMate(void)
Supply mate pointer.
Definition: Partridge_All.h:872
pcomm_Mating
Definition: Partridge_Communication.h:57
PartridgeCommunicationData::m_male
Partridge_Male * m_male
Definition: Partridge_Communication.h:83
g_msg
class MapErrorMsg * g_msg
Definition: maperrormsg.cpp:41
Partridge_Communication::ClearData
void ClearData(PartridgeCommunicationData *pc_data)
Void data.
Definition: Partridge_Communication.cpp:66
Partridge_Clutch::OnMumDead
void OnMumDead()
Message handler.
Definition: Partridge_All.cpp:617
pcomm_StoppingBreeding
Definition: Partridge_Communication.h:69
PartridgeCommunicationData::m_chick2
Partridge_Chick2 * m_chick2
Definition: Partridge_Communication.h:82
pars_FIncubating
Definition: Partridge_All.h:283
PartridgeCommunicationData::m_female
Partridge_Female * m_female
Definition: Partridge_Communication.h:84
pcomm_FemaleGivingUp
Definition: Partridge_Communication.h:67
Partridge_Male::GetOldMate
Partridge_Female * GetOldMate(void)
Supply old mate pointer.
Definition: Partridge_All.h:757
Partridge_Female::OnEggsHatch
void OnEggsHatch()
Message handler.
Definition: Partridge_All.cpp:2096
Partridge_Female::GetOldMate
Partridge_Male * GetOldMate(void)
Supply old mate pointer.
Definition: Partridge_All.h:893
PartridgeCommunicationData::m_float
double m_float
Definition: Partridge_Communication.h:89
Partridge_Female::OnClutchDeath
void OnClutchDeath()
Message handler.
Definition: Partridge_All.cpp:2056
PartridgeCommunicationData::m_covey
Partridge_Covey * m_covey
Definition: Partridge_Communication.h:85
pcomm_SetClutch
Definition: Partridge_Communication.h:62
Partridge_Male::OnStoppingBreeding
void OnStoppingBreeding()
Message handler.
Definition: Partridge_All.cpp:2709
pcomm_WaitForMale
Definition: Partridge_Communication.h:64
pcomm_EggsHatch
Definition: Partridge_Communication.h:61
Partridge_Female::OnWaitForMale
void OnWaitForMale()
Message handler.
Definition: Partridge_All.cpp:2015
pcomm_MaleDying
Definition: Partridge_Communication.h:55
MapErrorMsg::Warn
void Warn(MapErrorState a_level, std::string a_msg1, std::string a_msg2)
Definition: maperrormsg.cpp:59
pcomm_AllChicksDead
Definition: Partridge_Communication.h:63
Partridge_Female::OnMateDying
void OnMateDying(PartridgeCommunicationData *pc_data)
Message handler.
Definition: Partridge_All.cpp:2129
Partridge_Male::OnMating
void OnMating(Partridge_Female *a_mate)
Message handler.
Definition: Partridge_All.cpp:2738
Partridge_Female::OnSetMyClutch
void OnSetMyClutch(PartridgeCommunicationData *pc_data)
Message handler.
Definition: Partridge_All.cpp:2086
pars_FLaying
Definition: Partridge_All.h:282
pcomm_MatingM
Definition: Partridge_Communication.h:58
Partridge_Male::OnLookAfterKids
void OnLookAfterKids(void)
Message handler.
Definition: Partridge_All.cpp:2675
Partridge_Base::GetObjectType
Partridge_Object GetObjectType()
Supply object type.
Definition: Partridge_All.h:432
PartridgeCommunicationData::m_int
int m_int
Definition: Partridge_Communication.h:88
PartridgeCommunicationData
Data structure of a message.
Definition: Partridge_Communication.h:78
TypeOfPartridge_Communication
TypeOfPartridge_Communication
Possible messages to pass.
Definition: Partridge_Communication.h:53
Partridge_Male::OnFemaleGivingUp
void OnFemaleGivingUp()
Message handler.
Definition: Partridge_All.cpp:2783
PartridgeCommunicationData::m_clutch
Partridge_Clutch * m_clutch
Definition: Partridge_Communication.h:80
pcomm_AllInfertile
Definition: Partridge_Communication.h:60
PartridgeCommunicationData::m_chick
Partridge_Chick * m_chick
Definition: Partridge_Communication.h:81
Partridge_Female::OnChicksDead
void OnChicksDead()
Message handler.
Definition: Partridge_All.cpp:2118
Partridge_Male::OnMovingHome
void OnMovingHome()
Message handler.
Definition: Partridge_All.cpp:2729
pob_Chick
Definition: Partridge_All.h:297
Partridge_Male::OnChicksDead
void OnChicksDead()
Message handler.
Definition: Partridge_All.cpp:2689
pcomm_ClutchDead
Definition: Partridge_Communication.h:59
pars_FMakingNest
Definition: Partridge_All.h:282
Partridge_Male::OnChicksMatured
void OnChicksMatured()
Message handler.
Definition: Partridge_All.cpp:2699
TAnimal::WhatState
virtual int WhatState()
Definition: populationmanager.h:263
PartridgeCommunicationData::m_HaveTerritory
bool m_HaveTerritory
Definition: Partridge_Communication.h:86