slot.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  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. enum eGardenSlotState
  14. {
  15. STATE_DIGGED = 1,
  16. STATE_PLANTED = 2
  17. //Used to set bit values depending on seed plant state
  18. }
  19. class Slot
  20. {
  21. static const int FERTILIZER_USAGE = 200;
  22. private int m_WaterQuantity;
  23. static private int m_WaterNeeded = 190; // How much water is needed to water a plant from a bottle. Value is in mililitres
  24. static private int m_WaterMax = 200;
  25. float m_Fertility;
  26. float m_FertilizerUsage;
  27. float m_FertilizerQuantity;
  28. float m_FertilizerQuantityMax; // how much of a fertilizer can the slot contain
  29. int m_slotIndex;
  30. int m_slotId;
  31. string m_FertilizerType = "";
  32. int m_FertilityState = eFertlityState.NONE;
  33. int m_WateredState = eWateredState.DRY;
  34. string m_DiggedSlotComponent; // example: "Component02" for the 1st slot in GardenBase
  35. string m_PlantType;
  36. private ItemBase m_Seed;
  37. private GardenBase m_Garden;
  38. float m_HarvestingEfficiency;
  39. int m_State;
  40. private PlantBase m_Plant;
  41. void Slot( float base_fertility )
  42. {
  43. m_Seed = NULL;
  44. m_Plant = NULL;
  45. Init( base_fertility );
  46. }
  47. void ~Slot()
  48. {
  49. if (m_Plant && GetGame()) // GetGame() returns NULL when the game is being quit!
  50. {
  51. GetGame().ObjectDelete( GetPlant() );
  52. }
  53. }
  54. int GetSlotIndex()
  55. {
  56. return m_slotIndex;
  57. }
  58. void SetSlotIndex(int index)
  59. {
  60. m_slotIndex = index;
  61. }
  62. int GetSlotId()
  63. {
  64. return m_slotId;
  65. }
  66. void SetSlotId(int id)
  67. {
  68. m_slotId = id;
  69. }
  70. void SetGarden(GardenBase garden)
  71. {
  72. m_Garden = garden;
  73. }
  74. GardenBase GetGarden()
  75. {
  76. return m_Garden;
  77. }
  78. void SetSeed(ItemBase seed)
  79. {
  80. m_Seed = seed;
  81. }
  82. PlantBase GetPlant()
  83. {
  84. return m_Plant;
  85. }
  86. void SetPlant(PlantBase plant)
  87. {
  88. m_Plant = plant;
  89. if (plant)
  90. {
  91. plant.SetSlot(this);
  92. plant.SetGarden(m_Garden);
  93. }
  94. }
  95. //Used to force water level an go around sync issues
  96. void SetWater( int val )
  97. {
  98. val = Math.Clamp( val, 0, m_WaterMax );
  99. m_WaterQuantity = val;
  100. }
  101. ItemBase GetSeed()
  102. {
  103. return m_Seed;
  104. }
  105. bool HasSeed()
  106. {
  107. if (m_Seed)
  108. return true;
  109. return false;
  110. }
  111. void GiveWater( float consumed_quantity )
  112. {
  113. m_WaterQuantity = Math.Clamp(m_WaterQuantity + consumed_quantity, 0.0, GetWaterMax());
  114. m_Garden.SetWaterQuantity(GetSlotIndex(), m_WaterQuantity);
  115. bool needsWater = NeedsWater();
  116. if (m_WateredState == eWateredState.DRY && !needsWater)
  117. {
  118. SetWateredState(eWateredState.WET);
  119. m_Garden.SlotWaterStateUpdate(this);
  120. }
  121. //! This is here in case we want to support dry out the slot in the future
  122. else if (m_WateredState == eWateredState.WET && needsWater)
  123. {
  124. SetWateredState(eWateredState.DRY);
  125. m_Garden.SlotWaterStateUpdate(this);
  126. }
  127. if (!g_Game.IsServer())
  128. return;
  129. 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.
  130. GetGarden().CreatePlant(this);
  131. }
  132. bool NeedsWater()
  133. {
  134. if ( m_WaterQuantity < GetWaterUsage() )
  135. {
  136. return true;
  137. }
  138. else
  139. {
  140. return false;
  141. }
  142. }
  143. bool CanBeWatered()
  144. {
  145. if ( m_WaterQuantity < GetWaterMax() )
  146. {
  147. return true;
  148. }
  149. else
  150. {
  151. return false;
  152. }
  153. }
  154. float GetWater()
  155. {
  156. return m_WaterQuantity;
  157. }
  158. float GetFertility()
  159. {
  160. return m_Fertility;
  161. }
  162. float GetFertilityMax()
  163. {
  164. return m_FertilizerUsage;
  165. }
  166. void SetFertility(float fertility)
  167. {
  168. m_Fertility = fertility;
  169. }
  170. float GetFertilizerQuantity()
  171. {
  172. return m_FertilizerQuantity;
  173. }
  174. void SetFertilizerQuantity(float fertility)
  175. {
  176. m_FertilizerQuantity = fertility;
  177. m_Garden.SetFertilizerQuantity(GetSlotIndex(), Math.Ceil(m_FertilizerQuantity));
  178. if (m_FertilizerQuantityMax != 0 && m_FertilizerQuantity >= m_FertilizerQuantityMax)
  179. {
  180. SetFertilityState(eFertlityState.FERTILIZED);
  181. m_Garden.SlotFertilityStateUpdate(this);
  182. }
  183. }
  184. float GetFertilizerQuantityMax()
  185. {
  186. return m_FertilizerQuantityMax;
  187. }
  188. void SetFertilizerQuantityMax(float quantMax)
  189. {
  190. m_FertilizerQuantityMax = quantMax;
  191. }
  192. string GetFertilityType()
  193. {
  194. return m_FertilizerType;
  195. }
  196. void SetFertilityType(string type)
  197. {
  198. m_FertilizerType = type;
  199. }
  200. int GetFertilityState()
  201. {
  202. return m_FertilityState;
  203. }
  204. void SetFertilityState(int newState)
  205. {
  206. if (m_FertilityState == newState)
  207. return;
  208. m_FertilityState = newState;
  209. m_Garden.SlotFertilityStateUpdate(this);
  210. }
  211. int GetWateredState()
  212. {
  213. return m_WateredState;
  214. }
  215. void SetWateredState(int newState)
  216. {
  217. if (m_WateredState == newState)
  218. return;
  219. m_WateredState = newState;
  220. if (m_WateredState == eWateredState.WET)
  221. {
  222. SetWater(GetWaterMax());
  223. }
  224. else if (m_WateredState == eWateredState.DRY)
  225. {
  226. SetWater(0);
  227. }
  228. m_Garden.SlotWaterStateUpdate(this);
  229. }
  230. float GetWaterUsage()
  231. {
  232. return m_WaterNeeded;
  233. }
  234. float GetWaterMax()
  235. {
  236. return m_WaterMax;
  237. }
  238. int GetState()
  239. {
  240. return m_State;
  241. }
  242. void SetState(int new_state)
  243. {
  244. m_State = new_state;
  245. m_Garden.SetSlotState(GetSlotIndex(), new_state);
  246. }
  247. bool IsDigged()
  248. {
  249. if (m_State == eGardenSlotState.STATE_DIGGED)
  250. {
  251. return true;
  252. }
  253. return false;
  254. }
  255. bool IsPlanted()
  256. {
  257. if (m_State == eGardenSlotState.STATE_PLANTED)
  258. {
  259. return true;
  260. }
  261. return false;
  262. }
  263. void Init( float base_fertility )
  264. {
  265. m_Fertility = base_fertility;
  266. m_FertilizerUsage = FERTILIZER_USAGE;
  267. m_FertilizerQuantity = 0.0;
  268. m_FertilizerType = "";
  269. m_FertilityState = eFertlityState.NONE;
  270. m_WateredState = eWateredState.DRY;
  271. m_WaterQuantity = 0.0;
  272. m_HarvestingEfficiency = 1.0;
  273. m_State = eGardenSlotState.STATE_DIGGED;
  274. m_Plant = NULL;
  275. }
  276. void SetSlotComponent(string component)
  277. {
  278. m_DiggedSlotComponent = component;
  279. }
  280. string GetSlotComponent()
  281. {
  282. return m_DiggedSlotComponent;
  283. }
  284. bool OnStoreLoadCustom( ParamsReadContext ctx, int version )
  285. {
  286. if ( version < 102 )
  287. {
  288. ctx.Read( m_Fertility );
  289. ctx.Read( m_FertilizerUsage );
  290. ctx.Read( m_FertilizerQuantity );
  291. if ( !ctx.Read( m_FertilizerType ) )
  292. m_FertilizerType = "";
  293. ctx.Read( m_HarvestingEfficiency );
  294. ctx.Read( m_State );
  295. }
  296. if ( version >= 102 )
  297. {
  298. if(!ctx.Read( m_Fertility ))
  299. return false;
  300. if(!ctx.Read( m_FertilizerUsage ))
  301. return false;
  302. if(!ctx.Read( m_FertilizerQuantity ))
  303. return false;
  304. if(!ctx.Read( m_HarvestingEfficiency ))
  305. return false;
  306. if(!ctx.Read( m_State ))
  307. return false;
  308. if (!ctx.Read( m_FertilizerType ))
  309. {
  310. m_FertilizerType = "";
  311. }
  312. }
  313. if (version >= 142)
  314. {
  315. int wateredState;
  316. if(!ctx.Read( wateredState ))
  317. {
  318. return false;
  319. }
  320. else
  321. {
  322. SetWateredState(wateredState);
  323. }
  324. }
  325. return true;
  326. }
  327. void OnStoreSaveCustom( ParamsWriteContext ctx )
  328. {
  329. ctx.Write( m_Fertility );
  330. ctx.Write( m_FertilizerUsage );
  331. ctx.Write( m_FertilizerQuantity );
  332. ctx.Write( m_HarvestingEfficiency );
  333. ctx.Write( m_State );
  334. ctx.Write( m_FertilizerType );
  335. ctx.Write( m_WateredState );
  336. }
  337. }