speedo.tin 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. ///=== {
  8. ///// speedo(测速仪)模块为各种数据提供测速支持。
  9. /////
  10. ///// 在游戏中,我们常常需要记录和测算数据的变化率或者一段时间的平均值。
  11. ///// 本模块可以用来实现这个目的。短的比如气血、精神、内力的变化率,长的比如
  12. ///// 经验值、潜能、金钱收益等,都可以用它来测算。
  13. // };
  14. #var lib_speedo[META] {
  15. {NAME} {测速仪}
  16. {DESC} {为各种数据提供测速支持,气血/精神/经验值/存款都可以}
  17. {AUTHOR} {担子炮}
  18. };
  19. #func {lib_speedo.Init} {
  20. #var gSpeedo {};
  21. #return {true};
  22. };
  23. ///=== {
  24. // ## speedo.Set <数据名> <数据值> <单调性> <保活时间>
  25. // 往测速仪中灌注一个数据(覆盖模式)。
  26. // 单调性决定了数据的变化方向发生翻转时,是累积还是重置之前的统计信息。
  27. // 如果设置为真,则会重置,否则会累积。比如说一个数据一会儿变大一会儿变小,
  28. // 在累积模式下,可能一段时间之后,统计出来的结果会是平均变化率很小接近于无。
  29. // 而重置模式下,永远都可以给出最近一段时间单调变化的变化率。
  30. // 保活时间参数用来排除停滞变化的时间不予统计。如果最近连续两次更新时间间隔
  31. // 超过保活时间,则超出部分将会被扣除不参与计算。
  32. // };
  33. #alias {speedo.Set} {
  34. #local key {%1};
  35. #local value {@defaultNum{%2;0}};
  36. #local monotone {@default{%3;false}};
  37. #local keepalive {@defaultNum{%4;60}};
  38. #if { @isEmpty{$key} } {
  39. #return;
  40. };
  41. #format {now} {%T};
  42. #if { "$gSpeedo[$key]" == "" } {
  43. #var {gSpeedo[$key][base]} {$value};
  44. #var {gSpeedo[$key][baseTime]} {$now};
  45. #var {gSpeedo[$key][deduction]} {0};
  46. #var {gSpeedo[$key][paused]} {false};
  47. };
  48. #nop 只允许单调递增或者单调递减;
  49. #if { "$monotone" == "true" } {
  50. #if { ( $value > $gSpeedo[$key][value] && $gSpeedo[$key][value] < $gSpeedo[$key][base] )
  51. || ( $value < $gSpeedo[$key][value] && $gSpeedo[$key][value] > $gSpeedo[$key][base] ) } {
  52. #var {gSpeedo[$key][base]} {$gSpeedo[$key][value]};
  53. #var {gSpeedo[$key][baseTime]} {$gSpeedo[$key][update]};
  54. #var {gSpeedo[$key][deduction]} {0};
  55. };
  56. };
  57. #local interval {0};
  58. #math interval {$now - $gSpeedo[$key][update]};
  59. #nop Set 会导致继续统计,但之前暂停时经过的时间将被扣除;
  60. #nop 超过 keepalive 的间隔也会被扣除;
  61. #if { "$gSpeedo[$key][paused]" == "true" || $interval > $keepalive } {
  62. #var {gSpeedo[$key][paused]} {false};
  63. #math {gSpeedo[$key][deduction]} {$gSpeedo[$key][deduction] + $interval - $keepalive};
  64. };
  65. #var {gSpeedo[$key][value]} {$value};
  66. #var {gSpeedo[$key][update]} {$now};
  67. };
  68. ///=== {
  69. // ## speedo.Add <数据名> <数据值> <单调性> <保活时间>
  70. // 类似于 speedo.Set,但数据值会累加而不是覆盖。其余相同。
  71. // };
  72. #alias {speedo.Add} {
  73. #local key {%1};
  74. #local value {@defaultNum{%2;0}};
  75. #local monotone {@default{%3;false}};
  76. #local keepalive {@defaultNum{%4;60}};
  77. #if { @isEmpty{$key} } {
  78. xtt.Usage speedo.Add;
  79. #return;
  80. };
  81. #math value {$value + @speedo.Get{{$key}}};
  82. speedo.Set {$key} {$value} {$monotone} {$keepalive};
  83. };
  84. ///=== {
  85. // #@ speedo.Get <数据名>
  86. // 获取测速仪中储存的数据值。如果该数据之前尚未被存储过,则返回 0。
  87. // };
  88. #func {speedo.Get} {
  89. #local key {%1};
  90. #if { @isEmpty{$key} } {
  91. #return {0};
  92. };
  93. #if { "$gSpeedo[$key]" == "" } {
  94. #return {0};
  95. };
  96. #return {$gSpeedo[$key][value]};
  97. };
  98. ///=== {
  99. // #@ speedo.GetUpdateTime <数据名>
  100. // 获得该数据最近一次更新的时间。
  101. // };
  102. #func {speedo.GetUpdateTime} {
  103. #local key {%1};
  104. #return {$gSpeedo[$key][update]};
  105. };
  106. ///=== {
  107. // #@ speedo.GetSpeed <数据名> [<间隔时间>]
  108. // 获得该数据最近一段时间的变化率。如果省略间隔时间则给出每秒变化值。
  109. // };
  110. #func {speedo.GetSpeed} {
  111. #local key {%1};
  112. #local interval {%2};
  113. #local speedInfo {@speedo.GetSpeedInfo{{$key};{$interval}}};
  114. #if { "$speedInfo" == "" } {
  115. #return {0};
  116. };
  117. #return {$speedInfo[speed]};
  118. };
  119. ///=== {
  120. // #@ speedo.GetSpeedInfo <数据名> [<间隔时间>]
  121. // 获得该数据最近一段时间的变化率和相关信息。如果省略间隔时间则给出每秒变化值。
  122. // };
  123. #func {speedo.GetSpeedInfo} {
  124. #local key {%1};
  125. #local interval {@defaultNum{%2;1}};
  126. #if { @isEmpty{$key} } {
  127. #return {};
  128. };
  129. #local data {$gSpeedo[$key]};
  130. #if { "$data" == "" } {
  131. #return {};
  132. };
  133. #local delta {0};
  134. #math delta {$data[value] - $data[base]};
  135. #local speed {0};
  136. #math speed {
  137. ( $delta * $interval )
  138. / ( $data[update] - $data[baseTime] - $data[deduction] )
  139. };
  140. #return {
  141. {begin} {$data[baseTime]}
  142. {end} {$data[update]}
  143. {delta} {$delta}
  144. {speed} {$speed}
  145. {deduction} {$data[deduction]}
  146. };
  147. };
  148. ///=== {
  149. // ## speedo.Pause <数据名>
  150. // 暂停计数。暂停之后,直到下次继续,这段期间会在计算中扣除,以获得更精确的
  151. // 统计数据。
  152. // };
  153. #alias {speedo.Pause} {
  154. #local key {%1};
  155. #var {gSpeedo[$key][paused]} {true};
  156. };
  157. ///=== {
  158. // ## speedo.Resume <数据名>
  159. // 继续计数。参见 speedo.Pause
  160. // };
  161. #alias {speedo.Resume} {
  162. #local key {%1};
  163. #if { "$gSpeedo[$key][paused]" == "true" } {
  164. #var {gSpeedo[$key][paused]} {false};
  165. #math {gSpeedo[$key][deduction]} {$gSpeedo[$key][deduction] + $now - $gSpeedo[$key][update]};
  166. #format {now} {%T};
  167. #var {gSpeedo[$key][update]} {$now};
  168. };
  169. };
  170. ///=== {
  171. // ## speedo.Reset <数据名>
  172. // 复位计数器。
  173. // };
  174. #alias {speedo.Reset} {
  175. #local key {%1};
  176. #if { "$gSpeedo[$key]" == "" } {
  177. #return;
  178. };
  179. #format {now} {%T};
  180. #var {gSpeedo[$key][base]} {0};
  181. #var {gSpeedo[$key][baseTime]} {$now};
  182. #var {gSpeedo[$key][deduction]} {0};
  183. #var {gSpeedo[$key][paused]} {false};
  184. #var {gSpeedo[$key][value]} {0};
  185. #var {gSpeedo[$key][update]} {$now};
  186. };
  187. ///=== {
  188. // ## speedo.List <间隔时间> <过滤条件>
  189. // 列出测速仪中符合条件的数据。如果省略过滤条件(支持正则表达式),则列出所
  190. // 有的数据。
  191. // 间隔时间用来指定统计区间,默认给出 1 秒的统计值。
  192. // };
  193. #alias {speedo.List} {
  194. #local interval {@defaultNum{%1;1}};
  195. #local pattern {@default{%2;{%*}}};
  196. #echo {<128> %-14s %+10s %+10s %+14s %-20s %-20s %+10s} {统计对象} {统计结果} {平均值} {测算周期(秒)} {样本开始时间} {样本截止时间} {发呆时间};
  197. #draw Yellow scroll line 1 1 1 110;
  198. #local key {};
  199. #foreach {*gSpeedo[]} {key} {
  200. #if { "$key" != "$pattern" } {
  201. #continue;
  202. };
  203. #local speedInfo {@speedo.GetSpeedInfo{{$key};{$interval}}};
  204. #echo {<168> %-14s %+10s %+10s %+14s %t %t %+10s}
  205. {$key} {$speedInfo[delta]} {$speedInfo[speed]} {$interval}
  206. {{%Y-%m-%d %H:%M:%S}{$speedInfo[begin]}}
  207. {{%Y-%m-%d %H:%M:%S}{$speedInfo[end]}}
  208. {$speedInfo[deduction]};
  209. };
  210. };