slot.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. enum eFertlityState
  2. {
  3. NONE = 0,
  4. FERTILIZED = 1
  5. //This will be used to set bit values (DO NOT ADD MORE VALUES)
  6. }
  7. enum eWateredState
  8. {
  9. DRY = 0,
  10. WET = 1
  11. //Used to improve readability of watered state changes
  12. }
  13. class Slot
  14. {
  15. static const int STATE_DIGGED = 1;
  16. static const int STATE_PLANTED = 2;
  17. private int m_WaterQuantity;
  18. static private int m_WaterNeeded = 190; // How much water is needed to water a plant from a bottle. Value is in mililitres
  19. static private int m_WaterMax = 200;
  20. float m_Fertility;
  21. float m_FertilizerUsage;
  22. float m_FertilizerQuantity;
  23. int m_slotIndex;
  24. int m_slotId;
  25. string m_FertilizerType;
  26. int m_FertilityState = eFertlityState.NONE;
  27. int m_WateredState = eWateredState.DRY;
  28. string m_DiggedSlotComponent; // example: "Component02" for the 1st slot in GardenBase
  29. string m_PlantType;
  30. private ItemBase m_Seed;
  31. private GardenBase m_Garden;
  32. float m_HarvestingEfficiency;
  33. int m_State;
  34. private PlantBase m_Plant;
  35. void Slot( float base_fertility )
  36. {
  37. m_Seed = NULL;
  38. m_Plant = NULL;
  39. m_WaterQuantity = 0.0;
  40. Init( base_fertility );
  41. }
  42. void ~Slot()
  43. {
  44. if (m_Plant && GetGame()) // GetGame() returns NULL when the game is being quit!
  45. {
  46. GetGame().ObjectDelete( GetPlant() );
  47. }
  48. }
  49. int GetSlotIndex()
  50. {
  51. return m_slotIndex;
  52. }
  53. void SetSlotIndex(int index)
  54. {
  55. m_slotIndex = index;
  56. }
  57. int GetSlotId()
  58. {
  59. return m_slotId;
  60. }
  61. void SetSlotId(int id)
  62. {
  63. m_slotId = id;
  64. }
  65. void SetGarden(GardenBase garden)
  66. {
  67. m_Garden = garden;
  68. }
  69. GardenBase GetGarden()
  70. {
  71. return m_Garden;
  72. }
  73. void SetSeed(ItemBase seed)
  74. {
  75. m_Seed = seed;
  76. }
  77. PlantBase GetPlant()
  78. {
  79. return m_Plant;
  80. }
  81. void SetPlant(PlantBase plant)
  82. {
  83. m_Plant = plant;
  84. if (plant)
  85. {
  86. plant.SetSlot(this);
  87. }
  88. }
  89. //Used to force water level an go around sync issues
  90. void SetWater( int val )
  91. {
  92. val = Math.Clamp( val, 0, m_WaterMax );
  93. m_WaterQuantity = val;
  94. }
  95. ItemBase GetSeed()
  96. {
  97. return m_Seed;
  98. }
  99. bool HasSeed()
  100. {
  101. if (m_Seed)
  102. return true;
  103. return false;
  104. }
  105. void GiveWater( float consumed_quantity )
  106. {
  107. bool needed_water = NeedsWater();
  108. m_WaterQuantity += consumed_quantity;
  109. if (m_WaterQuantity >= GetWaterMax())
  110. m_WaterQuantity = GetWaterMax();
  111. if (m_WaterQuantity < 0)
  112. m_WaterQuantity = 0;
  113. if (!g_Game.IsServer())
  114. return;
  115. if (!GetPlant() && GetSeed() && !NeedsWater()) // if there is no seed then do not create plant. Plant will be created when the seed is inserted into watered slot.
  116. GetGarden().CreatePlant(this);
  117. if ( needed_water != NeedsWater() )
  118. {
  119. SetWateredState( eWateredState.WET );
  120. if ( m_Garden.GetSlotWateredState() != m_Garden.GetMaxWaterStateVal() )
  121. m_Garden.SlotWaterStateUpdate( this );
  122. }
  123. }
  124. bool NeedsWater()
  125. {
  126. if ( m_WaterQuantity < GetWaterUsage() )
  127. {
  128. return true;
  129. }
  130. else
  131. {
  132. return false;
  133. }
  134. }
  135. bool CanBeWatered()
  136. {
  137. if ( m_WaterQuantity < GetWaterMax() )
  138. {
  139. return true;
  140. }
  141. else
  142. {
  143. return false;
  144. }
  145. }
  146. float GetWater()
  147. {
  148. return m_WaterQuantity;
  149. }
  150. float GetFertility()
  151. {
  152. return m_Fertility;
  153. }
  154. float GetFertilityMax()
  155. {
  156. return m_FertilizerUsage;
  157. }
  158. void SetFertility(float fertility)
  159. {
  160. m_Fertility = fertility;
  161. }
  162. float GetFertilizerQuantity()
  163. {
  164. return m_FertilizerQuantity;
  165. }
  166. float GetFertilizerQuantityMax()
  167. {
  168. return m_FertilizerUsage;
  169. }
  170. void SetFertilizerQuantity(float fertility)
  171. {
  172. m_FertilizerQuantity = fertility;
  173. }
  174. string GetFertilityType()
  175. {
  176. return m_FertilizerType;
  177. }
  178. void SetFertilityType(string type)
  179. {
  180. m_FertilizerType = type;
  181. }
  182. int GetFertilityState()
  183. {
  184. return m_FertilityState;
  185. }
  186. void SetFertilityState( int newState )
  187. {
  188. m_FertilityState = newState;
  189. }
  190. int GetWateredState()
  191. {
  192. return m_WateredState;
  193. }
  194. void SetWateredState( int newState )
  195. {
  196. m_WateredState = newState;
  197. if ( m_WateredState == eWateredState.WET )
  198. SetWater( GetWaterMax() );
  199. }
  200. float GetWaterUsage()
  201. {
  202. return m_WaterNeeded;
  203. }
  204. float GetWaterMax()
  205. {
  206. return m_WaterMax;
  207. }
  208. int GetState()
  209. {
  210. return m_State;
  211. }
  212. void SetState(int new_state)
  213. {
  214. m_State = new_state;
  215. }
  216. bool IsDigged()
  217. {
  218. if (m_State == STATE_DIGGED)
  219. {
  220. return true;
  221. }
  222. return false;
  223. }
  224. bool IsPlanted()
  225. {
  226. if (m_State == STATE_PLANTED)
  227. {
  228. return true;
  229. }
  230. return false;
  231. }
  232. void Init( float base_fertility )
  233. {
  234. m_Fertility = base_fertility;
  235. m_FertilizerUsage = 200;
  236. m_FertilizerQuantity = 0.0;
  237. m_FertilizerType = "";
  238. m_FertilityState = eFertlityState.NONE;
  239. m_WaterQuantity = 0;
  240. m_WateredState = eWateredState.DRY;
  241. m_HarvestingEfficiency = 1.0;
  242. //m_DiggedSlotComponent = "";
  243. m_State = STATE_DIGGED;
  244. m_Plant = NULL;
  245. }
  246. void SetSlotComponent(string component)
  247. {
  248. m_DiggedSlotComponent = component;
  249. }
  250. string GetSlotComponent()
  251. {
  252. return m_DiggedSlotComponent;
  253. }
  254. bool OnStoreLoadCustom( ParamsReadContext ctx, int version )
  255. {
  256. if ( version < 102 )
  257. {
  258. ctx.Read( m_Fertility );
  259. ctx.Read( m_FertilizerUsage );
  260. ctx.Read( m_FertilizerQuantity );
  261. if ( !ctx.Read( m_FertilizerType ) )
  262. m_FertilizerType = "";
  263. ctx.Read( m_HarvestingEfficiency );
  264. ctx.Read( m_State );
  265. }
  266. if ( version >= 102 )
  267. {
  268. ctx.Read( m_Fertility );
  269. ctx.Read( m_FertilizerUsage );
  270. ctx.Read( m_FertilizerQuantity );
  271. ctx.Read( m_HarvestingEfficiency );
  272. ctx.Read( m_State );
  273. if ( !ctx.Read( m_FertilizerType ) )
  274. {
  275. m_FertilizerType = "";
  276. }
  277. }
  278. return true;
  279. }
  280. void OnStoreSaveCustom( ParamsWriteContext ctx )
  281. {
  282. ctx.Write( m_Fertility );
  283. ctx.Write( m_FertilizerUsage );
  284. ctx.Write( m_FertilizerQuantity );
  285. ctx.Write( m_HarvestingEfficiency );
  286. ctx.Write( m_State );
  287. ctx.Write( m_FertilizerType );
  288. }
  289. }