LY.inc 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /**********************************************************************************************************************************
  2. * *
  3. * )( Unsigned Long 61 Bit [Long Yoyo] )( *
  4. * *
  5. * Copyright © 2017 Abyss Morgan. All rights reserved. *
  6. * *
  7. * Download: https://github.com/AbyssMorgan/SA-MP/tree/master/include/SAM *
  8. * Publication: http://forum.sa-mp.com/showthread.php?t=598933 *
  9. * Website: http://8.ct8.pl *
  10. * *
  11. * Plugins: None *
  12. * Modules: None *
  13. * *
  14. * File Version: 1.6.1 *
  15. * SA:MP Version: 0.3.7 *
  16. * *
  17. * Pawn Unsigned Long for 32 Bit language (precision 61-bit) *
  18. * Available limit: *
  19. * 0 - 2 147 483 647 000 000 000 *
  20. * 0 - 2 000 000 000 000 000 000 *
  21. * *
  22. * Functions: *
  23. * bool:IsValueContainLY(prefix,suffix,value); *
  24. * GetLYString(prefix,suffix,string[],maxdest = sizeof(string)); *
  25. * LYStringToLY(&prefix,&suffix,string[]); //Reverse to GetLYString *
  26. * UpdateLY(&prefix,&suffix,value,limitprefix = DEFAULT_MAX_LY_PREFIX); *
  27. * AddSeparatorLY(string[],separator[]); *
  28. * DeleteSeparatorLY(string[],separator[]); *
  29. * CalculatePercentLY(&prefix,&suffix,Float:percent = 0.0,increase = true,limitprefix = DEFAULT_MAX_LY_PREFIX); *
  30. * GetPercentLY(prefix,suffix,&o_prefix,&o_suffix,Float:percent = 0.0,limitprefix = DEFAULT_MAX_LY_PREFIX); *
  31. * *
  32. * Operators: *
  33. * bool:IsLYEqual(prefix,suffix,from_prefix,from_suffix); *
  34. * bool:IsLYSmallerThan(prefix,suffix,from_prefix,from_suffix); *
  35. * bool:IsLYSmallerThanOrEqual(prefix,suffix,from_prefix,from_suffix); *
  36. * bool:IsLYBiggerThan(prefix,suffix,from_prefix,from_suffix); *
  37. * bool:IsLYBiggerThanOrEqual(prefix,suffix,from_prefix,from_suffix); *
  38. * *
  39. **********************************************************************************************************************************/
  40. /*
  41. //Check Version LY.inc
  42. #if !defined _Long_Yoyo
  43. #error [ADM] You need LY.inc v1.6.1
  44. #elseif !defined Long_Yoyo_Version
  45. #error [ADM] Update you LY.inc to v1.6.1
  46. #elseif (Long_Yoyo_Version < 10601)
  47. #error [ADM] Update you LY.inc to v1.6.1
  48. #endif
  49. */
  50. #if defined _Long_Yoyo
  51. #endinput
  52. #endif
  53. #define _Long_Yoyo
  54. #define Long_Yoyo_Version (10601) //a.b.c 10000*a+100*b+c
  55. #define LY_STRING_LEN (20)
  56. #define SEP_LY_STRING_LEN (LY_STRING_LEN+10)
  57. #define MAX_LY_STRING (LY_STRING_LEN)
  58. #define MAX_SEP_LY_STRING (SEP_LY_STRING_LEN)
  59. #define MAX_LY_PREFIX (2147483647)
  60. #define DEFAULT_MAX_LY_PREFIX (2000000000)
  61. stock bool:IsValueContainLY(prefix,suffix,value){
  62. if((prefix == 0) && (suffix == 0)) return false;
  63. if((suffix < value) && (prefix == 0)) return false;
  64. return true;
  65. }
  66. stock GetLYString(prefix,suffix,string[],maxdest = sizeof(string)){
  67. if(prefix == 0){
  68. format(string,maxdest,"%d",suffix);
  69. } else {
  70. format(string,maxdest,"%d%09d",prefix,suffix);
  71. }
  72. }
  73. //Pawn Unsigned Long for 32 Bit language (precision 61-bit)
  74. stock UpdateLY(&prefix,&suffix,value,limitprefix = DEFAULT_MAX_LY_PREFIX){
  75. if(value == 0) return 1; //skip
  76. new tmp = value;
  77. if((tmp > 0) && (prefix >= limitprefix) && (suffix >= 0)){
  78. prefix = limitprefix;
  79. suffix = 0;
  80. } else if((tmp > 0) && (prefix >= limitprefix-1) && (suffix >= 999999999)){
  81. prefix = limitprefix;
  82. suffix = 0;
  83. } else if((tmp > 0) && (prefix >= limitprefix) && (suffix >= 999999999)){
  84. prefix = limitprefix;
  85. suffix = 0;
  86. } else {
  87. if(value >= 0){
  88. while(tmp >= 1000000000){
  89. tmp -= 1000000000;
  90. prefix += 1;
  91. }
  92. suffix += tmp;
  93. while(suffix > 999999999){
  94. suffix -= 1000000000;
  95. prefix += 1;
  96. }
  97. } else if(value < 0){
  98. while(tmp <= -1000000000){
  99. prefix -= 1;
  100. tmp += 1000000000;
  101. }
  102. suffix += (tmp);
  103. while(suffix < 0){
  104. suffix += 1000000000;
  105. prefix -= 1;
  106. }
  107. if(prefix < 0){
  108. prefix = 0;
  109. suffix = 0;
  110. }
  111. }
  112. }
  113. if((prefix >= limitprefix) && (suffix >= 0)){
  114. prefix = limitprefix;
  115. suffix = 0;
  116. }
  117. return 1;
  118. }
  119. stock AddSeparatorLY(string[],separator[]){
  120. new tStr[MAX_SEP_LY_STRING];
  121. format(tStr,sizeof(tStr),"%s",string);
  122. if(strlen(tStr) < 4) return tStr;
  123. new iPos = strlen(tStr), iCount = 1;
  124. while(iPos > 0){
  125. if(iCount == 4){
  126. iCount = 0;
  127. strins(tStr,separator[0],iPos,1);
  128. iPos++;
  129. }
  130. iCount++;
  131. iPos--;
  132. }
  133. return tStr;
  134. }
  135. stock DeleteSeparatorLY(string[],separator[]){
  136. new tStr[MAX_LY_STRING], idx = 0;
  137. for(new i = 0, j = strlen(string); i < j ; i++){
  138. if(string[i] != separator[0]){
  139. tStr[idx] = string[i];
  140. idx++;
  141. }
  142. }
  143. return tStr;
  144. }
  145. stock CalculatePercentLY(&prefix,&suffix,Float:percent = 0.0,bool:increase = true,limitprefix = DEFAULT_MAX_LY_PREFIX){
  146. new Float:lycut = (prefix*(percent/100.0)),
  147. modify_p = floatround(lycut),
  148. modify_s = floatround((lycut-modify_p)*100000) * 10000;
  149. if(increase){
  150. prefix += modify_p;
  151. UpdateLY(prefix,suffix,modify_s,limitprefix);
  152. modify_s = floatround(suffix*(percent/100.0));
  153. UpdateLY(prefix,suffix,modify_s,limitprefix);
  154. } else {
  155. prefix -= modify_p;
  156. UpdateLY(prefix,suffix,-modify_s,limitprefix);
  157. modify_s = floatround(suffix*(percent/100.0));
  158. UpdateLY(prefix,suffix,-modify_s,limitprefix);
  159. }
  160. }
  161. stock GetPercentLY(prefix,suffix,&o_prefix,&o_suffix,Float:percent = 0.0,limitprefix = DEFAULT_MAX_LY_PREFIX){
  162. o_suffix = 0, o_prefix = 0;
  163. new Float:lycut = (prefix*(percent/100.0)),
  164. modify_p = floatround(lycut),
  165. modify_s = floatround((lycut-modify_p)*100000) * 10000;
  166. o_prefix += modify_p;
  167. UpdateLY(o_prefix,o_suffix,modify_s,limitprefix);
  168. modify_s = floatround(suffix*(percent/100.0));
  169. UpdateLY(o_prefix,o_suffix,modify_s,limitprefix);
  170. }
  171. //Operator a == b
  172. stock bool:IsLYEqual(prefix,suffix,from_prefix,from_suffix){
  173. if(prefix == from_prefix && suffix == from_suffix) return true;
  174. return false;
  175. }
  176. //Operator a < b
  177. stock bool:IsLYSmallerThan(prefix,suffix,from_prefix,from_suffix){
  178. if(prefix < from_prefix) return true;
  179. if(prefix == from_prefix && suffix < from_suffix) return true;
  180. return false;
  181. }
  182. //Operator a <= b
  183. stock bool:IsLYSmallerThanOrEqual(prefix,suffix,from_prefix,from_suffix){
  184. if(prefix <= from_prefix) return true;
  185. if(prefix == from_prefix && suffix <= from_suffix) return true;
  186. return false;
  187. }
  188. //Operator a > b
  189. stock bool:IsLYBiggerThan(prefix,suffix,from_prefix,from_suffix){
  190. if(prefix > from_prefix) return true;
  191. if(prefix == from_prefix && suffix > from_suffix) return true;
  192. return false;
  193. }
  194. //Operator a >= b
  195. stock bool:IsLYBiggerThanOrEqual(prefix,suffix,from_prefix,from_suffix){
  196. if(prefix >= from_prefix) return true;
  197. if(prefix == from_prefix && suffix >= from_suffix) return true;
  198. return false;
  199. }
  200. //Reverse to GetLYString
  201. stock LYStringToLY(&prefix,&suffix,string[]){
  202. new len = strlen(string);
  203. prefix = 0, suffix = 0;
  204. for(new i = strlen(string)-1; i >= 0; i--){
  205. if(len-i <= 9){
  206. suffix += (string[i]-48)*floatround(floatpower(10,len-i-1));
  207. } else {
  208. prefix += (string[i]-48)*floatround(floatpower(10,len-i-10));
  209. }
  210. }
  211. }
  212. //EOF