erm.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. DATA = DATA or {}
  2. local DATA = DATA
  3. local GAME = GAME
  4. local TurnStarted = require("events.TurnStarted")
  5. DATA.ERM = DATA.ERM or {}
  6. local ERM_D = DATA.ERM
  7. ERM_D.F = ERM_D.F or {}
  8. ERM_D.MDATA = ERM_D.MDATA or {}
  9. ERM_D.Q = ERM_D.Q or {}
  10. ERM_D.v = ERM_D.v or {}
  11. ERM_D.z = ERM_D.z or {}
  12. local INT_MT =
  13. {
  14. __index = function(t, key)
  15. return rawget(t, key) or 0
  16. end
  17. }
  18. local STR_MT =
  19. {
  20. __index = function(t, key)
  21. return rawget(t, key) or ""
  22. end
  23. }
  24. setmetatable(DATA.ERM.Q, INT_MT)
  25. setmetatable(DATA.ERM.v, INT_MT)
  26. setmetatable(DATA.ERM.z, STR_MT)
  27. local ERM =
  28. {
  29. w = {},
  30. M = {},
  31. subs = {}
  32. }
  33. local ERM_MT =
  34. {
  35. __index = DATA.ERM
  36. }
  37. setmetatable(ERM, ERM_MT)
  38. local MACROS_MT =
  39. {
  40. __index = function(M, key)
  41. address = rawget(ERM.MDATA, key)
  42. assert(address, "Macro "..key.." is not defined")
  43. return ERM[address.name][address.index]
  44. end,
  45. __newindex = function(M, key, value)
  46. address = rawget(ERM.MDATA, key)
  47. assert(address, "Macro "..key.." is not defined")
  48. ERM[address.name][address.index] = value
  49. end
  50. }
  51. setmetatable(ERM.M, MACROS_MT)
  52. function ERM:addMacro(name, varName, varIndex)
  53. assert(varName == "v" or varName == "z", "Macro for "..varName.. "[...] is not allowed")
  54. rawset(self.MDATA, name, {name = varName, index = varIndex})
  55. end
  56. function ERM:getZVar(p1)
  57. if type(p1) == "number" then
  58. return self.z[tostring(p1)]
  59. else
  60. return p1
  61. end
  62. end
  63. local HERO_VAR_MT =
  64. {
  65. __index = function(t, key)
  66. ERM_D.WDATA = ERM_D.WDATA or {}
  67. local wKey = ERM_D.wKey
  68. if not wKey then
  69. error("Hero variable set is not selected")
  70. end
  71. ERM_D.WDATA[wKey] = ERM_D.WDATA[wKey] or {}
  72. return ERM_D.WDATA[wKey][key] or 0
  73. end,
  74. __newindex = function(t, key, value)
  75. ERM_D.WDATA = ERM_D.WDATA or {}
  76. local wKey = ERM_D.wKey
  77. if not wKey then
  78. error("Hero variable set is not selected")
  79. end
  80. ERM_D.WDATA[wKey] = ERM_D.WDATA[wKey] or {}
  81. ERM_D.WDATA[wKey][key] = value
  82. end
  83. }
  84. setmetatable(ERM.w, HERO_VAR_MT)
  85. local function dailyUpdate(event)
  86. ERM.Q.c = GAME:getDate(0)
  87. end
  88. table.insert(ERM.subs, TurnStarted.subscribeAfter(EVENT_BUS, dailyUpdate))
  89. local Receivers = {}
  90. local function createReceiverLoader(name)
  91. local loader = function(...)
  92. Receivers[name] = Receivers[name] or require("core:erm."..name)
  93. return Receivers[name]:new(ERM, ...)
  94. end
  95. return loader
  96. end
  97. --[[
  98. AR
  99. BA
  100. BF
  101. BG
  102. BH
  103. CA
  104. CD
  105. CE
  106. CM
  107. DL
  108. CO
  109. EA
  110. EX
  111. GE
  112. HL
  113. HO
  114. HT
  115. LE
  116. MO
  117. MR
  118. MW
  119. OB
  120. PM
  121. PO
  122. QW
  123. SS
  124. TL
  125. TR
  126. ]]
  127. local supportedReceivers = {"BM", "BU", "DO", "FU", "HE", "IF", "DO", "MA", "MF", "OW", "TM", "UN", "VR"}
  128. for _, v in pairs(supportedReceivers) do ERM[v] = createReceiverLoader(v) end
  129. local Triggers = {}
  130. local function createTriggerLoader(name)
  131. local loader = function(id_list, id_key)
  132. local t = Triggers[id_key]
  133. if not t then
  134. local p = require("core:erm."..name.."_T")
  135. t = p:new{ERM=ERM, id=id_list}
  136. Triggers[id_key] = t
  137. end
  138. return t
  139. end
  140. return loader
  141. end
  142. --[[
  143. !?AE
  144. !?BA
  145. !?BF
  146. !?BG
  147. !?BR
  148. !?CM client only?
  149. !?CO
  150. !?DL client only?
  151. !?GE
  152. !?HE
  153. !?HL
  154. !?HM
  155. !?LE (!$LE)
  156. !?MG
  157. !?MM client only?
  158. !?MR
  159. !?MW
  160. !?OB (!$OB)
  161. !?SN client only?
  162. !?SN (ERA)
  163. !?TH client only?
  164. !?TL client only? depends on time limit feature
  165. ]]
  166. local supportedTriggers = {"PI", "FU", "GM", "MF", "OB", "TM"}
  167. local TriggerLoaders = {}
  168. for _, v in pairs(supportedTriggers) do TriggerLoaders[v] = createTriggerLoader(v) end
  169. local function makeIdKey(name, id_list)
  170. if id_list == nil then
  171. id_list = {}
  172. elseif type(id_list) ~= "table" then
  173. id_list = {id_list}
  174. end
  175. return name .. table.concat(id_list, "|")
  176. end
  177. function ERM:addTrigger(t)
  178. local name = t.name
  179. local fn = t.fn
  180. local id_list = t.id or {}
  181. local id_key = makeIdKey(name, id_list)
  182. local trigger = TriggerLoaders[name](id_list, id_key)
  183. trigger:addHandler(fn)
  184. end
  185. function ERM:callFunction(id, x)
  186. local id_key = makeIdKey("FU", id)
  187. local t = Triggers[id_key]
  188. if t then
  189. t:call({}, x)
  190. end
  191. end
  192. function ERM:callInstructions(cb)
  193. if not DATA.ERM.instructionsCalled then
  194. cb()
  195. local id_key = makeIdKey("PI")
  196. local pi = Triggers[id_key]
  197. if pi then
  198. pi:call()
  199. end
  200. DATA.ERM.instructionsCalled = true
  201. end
  202. end
  203. return ERM