slot.c 5.9 KB

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