AudioProxy.lua 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. local DebugProxy = requireProxy("DebugProxy")
  2. local AudioProxy = class("AudioProxy", DebugProxy)
  3. AudioProxy.NAME = global.ProxyTable.Audio
  4. local MMO = global.MMO
  5. local bBand = bit.band
  6. local AudioKeys = {
  7. s_walk_ground_l = 1,
  8. s_walk_ground_r = 2,
  9. s_run_ground_l = 3,
  10. s_run_ground_r = 4,
  11. s_walk_stone_l = 5,
  12. s_walk_stone_r = 6,
  13. s_run_stone_l = 7,
  14. s_run_stone_r = 8,
  15. s_walk_lawn_l = 9,
  16. s_walk_lawn_r = 10,
  17. s_run_lawn_l = 11,
  18. s_run_lawn_r = 12,
  19. s_walk_rough_l = 13,
  20. s_walk_rough_r = 14,
  21. s_run_rough_l = 15,
  22. s_run_rough_r = 16,
  23. s_walk_wood_l = 17,
  24. s_walk_wood_r = 18,
  25. s_run_wood_l = 19,
  26. s_run_wood_r = 20,
  27. s_walk_cave_l = 21,
  28. s_walk_cave_r = 22,
  29. s_run_cave_l = 23,
  30. s_run_cave_r = 24,
  31. s_walk_room_l = 25,
  32. s_walk_room_r = 26,
  33. s_run_room_l = 27,
  34. s_run_room_r = 28,
  35. s_walk_water_l = 29,
  36. s_walk_water_r = 30,
  37. s_run_water_l = 31,
  38. s_run_water_r = 32,
  39. s_hit_short = 50,
  40. s_hit_wooden = 51,
  41. s_hit_sword = 52,
  42. s_hit_do = 53,
  43. s_hit_axe = 54,
  44. s_hit_club = 55,
  45. s_hit_long = 56,
  46. s_hit_fist = 57,
  47. s_struck_short = 60,
  48. s_struck_wooden = 61,
  49. s_struck_sword = 62,
  50. s_struck_do = 63,
  51. s_struck_axe = 64,
  52. s_struck_club = 65,
  53. s_struck_body_sword = 70,
  54. s_struck_body_axe = 71,
  55. s_struck_body_longstick = 72,
  56. s_struck_body_fist = 73,
  57. s_struck_armor_sword = 80,
  58. s_struck_armor_axe = 81,
  59. s_struck_armor_longstick = 82,
  60. s_struck_armor_fist = 83,
  61. s_strike_stone = 91,
  62. s_drop_stonepiece = 92,
  63. s_rock_door_open = 100,
  64. s_intro_theme = 102,
  65. s_meltstone = 101,
  66. s_main_theme = 102,
  67. s_norm_button_click = 103,
  68. s_rock_button_click = 104,
  69. s_glass_button_click = 105,
  70. s_money = 106,
  71. s_eat_drug = 107,
  72. s_click_drug = 108,
  73. s_spacemove_out = 109,
  74. s_spacemove_in = 110,
  75. s_click_weapon = 111,
  76. s_click_armor = 112,
  77. s_click_ring = 113,
  78. s_click_armring = 114,
  79. s_click_necklace = 115,
  80. s_click_helmet = 116,
  81. s_click_grobes = 117,
  82. s_itmclick = 118,
  83. s_rush_l = 134,
  84. s_rush_r = 135,
  85. s_firehit_ready = 136,
  86. s_man_struck = 138,
  87. s_wom_struck = 139,
  88. s_man_die = 144,
  89. s_wom_die = 145,
  90. s_upgrade = 146,
  91. s_open_box = 147,
  92. s_flash_box = 148,
  93. s_hero_active = 50016,
  94. s_hero_unactive = 50017,
  95. s_ride_walk = 50131,
  96. s_ride_run = 50132,
  97. }
  98. local WeaponKeys = {
  99. [1] = AudioKeys.s_hit_wooden,
  100. [2] = AudioKeys.s_hit_sword,
  101. [3] = AudioKeys.s_hit_axe,
  102. [4] = AudioKeys.s_hit_do,
  103. [5] = AudioKeys.s_hit_sword,
  104. [6] = AudioKeys.s_hit_short,
  105. [7] = AudioKeys.s_hit_axe,
  106. [8] = AudioKeys.s_hit_long,
  107. [9] = AudioKeys.s_hit_sword,
  108. [10] = AudioKeys.s_hit_do,
  109. [11] = AudioKeys.s_hit_axe,
  110. [12] = AudioKeys.s_hit_long,
  111. [13] = AudioKeys.s_hit_sword,
  112. [14] = AudioKeys.s_hit_sword,
  113. [15] = AudioKeys.s_hit_do,
  114. [16] = AudioKeys.s_hit_do,
  115. [17] = AudioKeys.s_hit_do,
  116. [18] = AudioKeys.s_hit_long,
  117. [20] = AudioKeys.s_hit_short,
  118. [21] = AudioKeys.s_hit_long,
  119. [22] = AudioKeys.s_hit_sword,
  120. [23] = AudioKeys.s_hit_do,
  121. [24] = AudioKeys.s_hit_club,
  122. [-1] = AudioKeys.s_hit_fist
  123. }
  124. -- 0非人类玩家; 1人类玩家Shape==3; 2人类玩家除1外其他
  125. local StuckKeys = {
  126. [0] = {
  127. [1] = AudioKeys.s_struck_body_sword,
  128. [2] = AudioKeys.s_struck_body_sword,
  129. [3] = AudioKeys.s_struck_body_axe,
  130. [4] = AudioKeys.s_struck_body_sword,
  131. [5] = AudioKeys.s_struck_body_sword,
  132. [6] = AudioKeys.s_struck_body_sword,
  133. [8] = AudioKeys.s_struck_body_longstick,
  134. [9] = AudioKeys.s_struck_body_sword,
  135. [10] = AudioKeys.s_struck_body_sword,
  136. [11] = AudioKeys.s_struck_body_axe,
  137. [12] = AudioKeys.s_struck_body_longstick,
  138. [13] = AudioKeys.s_struck_body_sword,
  139. [14] = AudioKeys.s_struck_body_sword,
  140. [15] = AudioKeys.s_struck_body_sword,
  141. [16] = AudioKeys.s_struck_body_sword,
  142. [17] = AudioKeys.s_struck_body_sword,
  143. [18] = AudioKeys.s_struck_body_longstick,
  144. [-1] = AudioKeys.s_struck_body_fist
  145. },
  146. [1] = {
  147. [1] = AudioKeys.s_struck_armor_sword,
  148. [2] = AudioKeys.s_struck_armor_sword,
  149. [3] = AudioKeys.s_struck_armor_axe,
  150. [4] = AudioKeys.s_struck_armor_sword,
  151. [5] = AudioKeys.s_struck_armor_sword,
  152. [6] = AudioKeys.s_struck_armor_sword,
  153. [8] = AudioKeys.s_struck_armor_longstick,
  154. [9] = AudioKeys.s_struck_armor_sword,
  155. [10] = AudioKeys.s_struck_armor_sword,
  156. [11] = AudioKeys.s_struck_armor_axe,
  157. [12] = AudioKeys.s_struck_armor_longstick,
  158. [13] = AudioKeys.s_struck_armor_sword,
  159. [14] = AudioKeys.s_struck_armor_sword,
  160. [15] = AudioKeys.s_struck_armor_sword,
  161. [16] = AudioKeys.s_struck_armor_sword,
  162. [17] = AudioKeys.s_struck_armor_sword,
  163. [18] = AudioKeys.s_struck_armor_longstick,
  164. [-1] = AudioKeys.s_struck_armor_fist
  165. },
  166. [2] = {
  167. [1] = AudioKeys.s_struck_body_sword,
  168. [2] = AudioKeys.s_struck_body_sword,
  169. [3] = AudioKeys.s_struck_body_axe,
  170. [4] = AudioKeys.s_struck_body_sword,
  171. [5] = AudioKeys.s_struck_body_sword,
  172. [6] = AudioKeys.s_struck_body_sword,
  173. [8] = AudioKeys.s_struck_body_longstick,
  174. [9] = AudioKeys.s_struck_body_sword,
  175. [10] = AudioKeys.s_struck_body_sword,
  176. [11] = AudioKeys.s_struck_body_axe,
  177. [12] = AudioKeys.s_struck_body_longstick,
  178. [13] = AudioKeys.s_struck_body_sword,
  179. [14] = AudioKeys.s_struck_body_sword,
  180. [15] = AudioKeys.s_struck_body_sword,
  181. [16] = AudioKeys.s_struck_body_sword,
  182. [17] = AudioKeys.s_struck_body_sword,
  183. [18] = AudioKeys.s_struck_body_longstick,
  184. [-1] = AudioKeys.s_struck_body_fist
  185. },
  186. [-1] = AudioKeys.s_struck_body_longstick
  187. }
  188. local findhand = function (name)
  189. return string.find(name, "手镯") or string.find(name, "手套")
  190. end
  191. local ClickItemKeys = {
  192. [0] = AudioKeys.s_click_drug,
  193. [5] = AudioKeys.s_click_weapon,
  194. [6] = AudioKeys.s_click_weapon,
  195. [10] = AudioKeys.s_click_armor,
  196. [11] = AudioKeys.s_click_armor,
  197. [15] = AudioKeys.s_click_helmet,
  198. [19] = AudioKeys.s_click_necklace,
  199. [20] = AudioKeys.s_click_necklace,
  200. [21] = AudioKeys.s_click_necklace,
  201. [22] = AudioKeys.s_click_ring,
  202. [23] = AudioKeys.s_click_ring,
  203. [31] = AudioKeys.s_click_drug,
  204. [24] = function (name) return findhand(name) and AudioKeys.s_click_grobes or AudioKeys.s_click_armring end,
  205. [26] = function (name) return findhand(name) and AudioKeys.s_click_grobes or AudioKeys.s_click_armring end,
  206. [-1] = AudioKeys.s_itmclick
  207. }
  208. local MoveKeys = {
  209. [1] = {
  210. --
  211. {min = 1385, max = 1385, key = AudioKeys.s_walk_wood_l},
  212. {min = 1386, max = 1386, key = AudioKeys.s_walk_wood_l},
  213. {min = 1391, max = 1391, key = AudioKeys.s_walk_wood_l},
  214. {min = 1392, max = 1392, key = AudioKeys.s_walk_wood_l},
  215. --
  216. {min = 1375, max = 1799, func = function (x) return math.round((x - 1375) / 25) % 2 == 0 and AudioKeys.s_walk_cave_l end},
  217. --
  218. {min = 825, max = 1349, func = function (x) return math.round((x - 825) / 25) % 2 == 0 and AudioKeys.s_walk_stone_l end},
  219. -- 草地上行走
  220. {min = 330, max = 349, key = AudioKeys.s_walk_lawn_l},
  221. {min = 450, max = 454, key = AudioKeys.s_walk_lawn_l},
  222. {min = 550, max = 554, key = AudioKeys.s_walk_lawn_l},
  223. {min = 750, max = 754, key = AudioKeys.s_walk_lawn_l},
  224. {min = 950, max = 954, key = AudioKeys.s_walk_lawn_l},
  225. {min = 1250, max = 1254, key = AudioKeys.s_walk_lawn_l},
  226. {min = 1400, max = 1424, key = AudioKeys.s_walk_lawn_l},
  227. {min = 1455, max = 1474, key = AudioKeys.s_walk_lawn_l},
  228. {min = 1500, max = 1524, key = AudioKeys.s_walk_lawn_l},
  229. {min = 1550, max = 1574, key = AudioKeys.s_walk_lawn_l},
  230. -- 粗糙的地面
  231. {min = 250, max = 254, key = AudioKeys.s_walk_rough_l},
  232. {min = 1005, max = 1009, key = AudioKeys.s_walk_rough_l},
  233. {min = 1050, max = 1054, key = AudioKeys.s_walk_rough_l},
  234. {min = 1060, max = 1064, key = AudioKeys.s_walk_rough_l},
  235. {min = 1450, max = 1454, key = AudioKeys.s_walk_rough_l},
  236. {min = 1650, max = 1654, key = AudioKeys.s_walk_rough_l},
  237. -- 石头地面上行走
  238. {min = 605, max = 609, key = AudioKeys.s_walk_stone_l},
  239. {min = 650, max = 654, key = AudioKeys.s_walk_stone_l},
  240. {min = 660, max = 664, key = AudioKeys.s_walk_stone_l},
  241. {min = 2000, max = 2049, key = AudioKeys.s_walk_stone_l},
  242. {min = 3025, max = 3049, key = AudioKeys.s_walk_stone_l},
  243. {min = 2400, max = 2424, key = AudioKeys.s_walk_stone_l},
  244. {min = 4625, max = 4649, key = AudioKeys.s_walk_stone_l},
  245. {min = 4675, max = 4678, key = AudioKeys.s_walk_stone_l},
  246. -- 洞穴里行走
  247. {min = 1825, max = 1924, key = AudioKeys.s_walk_cave_l},
  248. {min = 2150, max = 2174, key = AudioKeys.s_walk_cave_l},
  249. {min = 3075, max = 3099, key = AudioKeys.s_walk_cave_l},
  250. {min = 3325, max = 3349, key = AudioKeys.s_walk_cave_l},
  251. {min = 3375, max = 3399, key = AudioKeys.s_walk_cave_l},
  252. -- 木头地面行走
  253. {min = 3230, max = 3230, key = AudioKeys.s_walk_wood_l},
  254. {min = 3231, max = 3231, key = AudioKeys.s_walk_wood_l},
  255. {min = 3246, max = 3246, key = AudioKeys.s_walk_wood_l},
  256. {min = 3277, max = 3277, key = AudioKeys.s_walk_wood_l},
  257. -- 带傈
  258. {min = 3780, max = 3799, key = AudioKeys.s_walk_wood_l},
  259. {min = 3825, max = 4434, func = function (x) return (x - 3825) % 25 == 0 and AudioKeys.s_walk_wood_l or AudioKeys.s_walk_ground_l end},
  260. -- 房间里
  261. {min = 2075, max = 2099, key = AudioKeys.s_walk_room_l},
  262. {min = 2125, max = 2149, key = AudioKeys.s_walk_room_l},
  263. -- 水中
  264. {min = 1800, max = 1824, key = AudioKeys.s_walk_water_l}
  265. },
  266. [2] = {
  267. {min = 0, max = 115, key = AudioKeys.s_walk_ground_l},
  268. {min = 120, max = 124, key = AudioKeys.s_walk_lawn_l}
  269. },
  270. [3] = {
  271. {min = 221, max = 289, key = AudioKeys.s_walk_stone_l},
  272. {min = 583, max = 658, key = AudioKeys.s_walk_stone_l},
  273. {min = 1183, max = 1206, key = AudioKeys.s_walk_stone_l},
  274. {min = 7163, max = 7295, key = AudioKeys.s_walk_stone_l},
  275. {min = 7404, max = 7414, key = AudioKeys.s_walk_stone_l},
  276. {min = 3125, max = 3267, key = AudioKeys.s_walk_wood_l},
  277. {min = 3757, max = 3948, key = AudioKeys.s_walk_wood_l},
  278. {min = 6030, max = 6999, key = AudioKeys.s_walk_wood_l},
  279. {min = 3316, max = 3589, key = AudioKeys.s_walk_room_l}
  280. }
  281. }
  282. function AudioProxy:ctor()
  283. AudioProxy.super.ctor(self)
  284. self._config = {}
  285. self:Init()
  286. end
  287. function AudioProxy:onRegister()
  288. AudioProxy.super.onRegister(self)
  289. end
  290. function AudioProxy:LoadConfig()
  291. self._config = requireGameConfig("cfg_sound")
  292. for k, v in pairs(self._config) do
  293. if v.file then
  294. v.file = string.gsub(tostring(v.file), "\\", "/")
  295. v.file = string.gsub(tostring(v.file), " ", "")
  296. end
  297. end
  298. end
  299. function AudioProxy:GetConfig(id)
  300. return self._config[id]
  301. end
  302. function AudioProxy:Init()
  303. self._AudioTypeFunc = {
  304. [MMO.SND_TYPE_SKILL_START] = function (type, index, sex) return self:getSkillSoundId(type, index, sex) end,
  305. [MMO.SND_TYPE_SKILL_FIRE] = function (type, index, sex) return self:getSkillSoundId(type, index, sex) end,
  306. [MMO.SND_TYPE_SKILL_EXPLOSION] = function (type, index, sex) return self:getSkillSoundId(type, index, sex) end,
  307. [MMO.SND_TYPE_SKILL_ATTACK] = function () return self:getSkillAttack() end,
  308. [MMO.SND_TYPE_STUCK_WEAPON] = function (type, index, sex) return self:getWeaponSound(index) end,
  309. [MMO.SND_TYPE_STUCK] = function (type, index, sex, param) return self:getStuckSoundId(index, param) end,
  310. [MMO.SND_TYPE_SCREAM] = function (type, index, sex, param) return self:getStuckScreamSoundId(param) end,
  311. [MMO.SND_TYPE_PLAYER_DIE] = function (type, index, sex) return self:getPlayerDieSoundId(index) end,
  312. [MMO.SND_TYPE_CLICK_ITEM] = function (type, index, sex, param) return self:getClickItemSoundId(param) end,
  313. [MMO.SND_TYPE_USE_ITEM] = function (type, index, sex, param) return self:getUseItemSoundId(param) end,
  314. [MMO.SND_TYPE_ACT_MOVE] = function (type, index, sex, param, isRide) return self:getMoveSoundId(index, isRide) end,
  315. [MMO.SND_TYPE_MON_BORN] = function (type, index, sex) return self:getMonBornSoundId(index) end,
  316. [MMO.SND_TYPE_MON_MOVE] = function (type, index, sex) return self:getMonMoveSoundId(index) end,
  317. [MMO.SND_TYPE_MON_DIE] = function (type, index, sex) return self:getMonDieSoundId(index) end,
  318. [MMO.SND_TYPE_MON_ATTACK] = function (type, index, sex) return self:getMonAttackSoundId(index) end,
  319. [MMO.SND_TYPE_SSR_UI] = function (type, index, sex) return index end,
  320. [MMO.SND_TYPE_MONEY] = function () return AudioKeys.s_money end,
  321. [MMO.SND_TYPE_LOGIN_DOOR] = function () return AudioKeys.s_rock_door_open end,
  322. [MMO.SND_TYPE_LOGIN_SELECTONE] = function () return AudioKeys.s_meltstone end,
  323. [MMO.SND_TYPE_FLY_OUT] = function () return AudioKeys.s_spacemove_out end,
  324. [MMO.SND_TYPE_FLY_IN] = function () return AudioKeys.s_spacemove_in end,
  325. [MMO.SND_TYPE_UPGRADE] = function () return AudioKeys.s_upgrade end,
  326. [MMO.SND_TYPE_MINING] = function () return AudioKeys.s_strike_stone end,
  327. [MMO.SND_TYPE_MINING_DROP] = function () return AudioKeys.s_drop_stonepiece end,
  328. [MMO.SND_TYPE_LAYER_CLICK] = function () return AudioKeys.s_glass_button_click end,
  329. [MMO.SND_TYPE_LAYER_CLOSE] = function () return AudioKeys.s_norm_button_click end,
  330. [MMO.SND_TYPE_BTN_CLICK] = function () return AudioKeys.s_norm_button_click end,
  331. [MMO.SND_TYPE_FLY_IN_HERO] = function () return AudioKeys.s_hero_active end,
  332. [MMO.SND_TYPE_FLY_OUT_HERO] = function () return AudioKeys.s_hero_unactive end,
  333. [MMO.SND_TYPE_UPGRADE] = function () return AudioKeys.s_upgrade end,
  334. [MMO.SND_TYPE_OPEN_BOX] = function () return AudioKeys.s_open_box end,
  335. [MMO.SND_TYPE_FLASH_BOX] = function () return AudioKeys.s_flash_box end,
  336. -- BGM
  337. [MMO.SND_TYPE_BGM_LOGIN] = function () return "mp3/Log-in-long2.mp3" end,
  338. [MMO.SND_TYPE_BGM_DIE] = function () return "mp3/Game-over2.mp3" end,
  339. [MMO.SND_TYPE_BGM_SELECT] = function () return "mp3/sellect-loop2.mp3" end,
  340. [MMO.SND_TYPE_BGM_MAP] = function () return self:getMapBGM() end,
  341. }
  342. end
  343. function AudioProxy:getAudioId(data)
  344. local type = data and data.type
  345. if not type then
  346. return nil
  347. end
  348. local func = self._AudioTypeFunc[type]
  349. if not func then
  350. return nil
  351. end
  352. local p1, p2, p3, p4 = func(type, data.index, data.sex, data.param, data.isRide)
  353. return p1, p2, p3, p4
  354. end
  355. function AudioProxy:getBGMPath(data)
  356. local type = data and data.type
  357. if not type then
  358. return nil
  359. end
  360. local func = self._AudioTypeFunc[type]
  361. return func and func(type, data.index, data.sex, data.param) or nil
  362. end
  363. -- 获取地图背景音乐
  364. function AudioProxy:getMapBGM()
  365. local MapProxy = global.Facade:retrieveProxy(global.ProxyTable.Map)
  366. local mapBGMID = MapProxy:GetMapBGM() or 0
  367. if mapBGMID < 1 then
  368. return nil
  369. end
  370. local audio = self:GetConfig(mapBGMID)
  371. return audio and audio.file
  372. end
  373. -- 技能
  374. function AudioProxy:getSkillSoundId(type, skillID, sex)
  375. if not skillID then
  376. return nil
  377. end
  378. sex = sex or MMO.ACTOR_PLAYER_SEX_M
  379. local sexd = sex * 3
  380. local audioId = 10000 + skillID * 10 + sexd + type - 1
  381. if not self:GetConfig(audioId) then
  382. sexd = 0
  383. return 10000 + skillID * 10 + sexd + type - 1
  384. end
  385. return audioId
  386. end
  387. function AudioProxy:getSkillAttack()
  388. local mainPlayer = global.gamePlayerController:GetMainPlayer()
  389. if not mainPlayer then
  390. return nil
  391. end
  392. return self:getWeaponSound(mainPlayer:GetWeaponID())
  393. end
  394. -- 普攻(第二帧时播放)
  395. function AudioProxy:getWeaponSound(weaponID)
  396. if not weaponID then
  397. return nil
  398. end
  399. return WeaponKeys[weaponID] or WeaponKeys[-1], 0.085
  400. end
  401. -- 受击装备的声音
  402. function AudioProxy:getStuckSoundId(attackweapon, actorID)
  403. if not actorID then
  404. return nil
  405. end
  406. local gameActor = global.actorManager:GetActor(actorID)
  407. if not gameActor or not gameActor:IsPlayer() then
  408. return StuckKeys[0][attackweapon] or StuckKeys[0][-1]
  409. end
  410. local EquipProxy = global.Facade:retrieveProxy(global.ProxyTable.Equip)
  411. local equipTypeConfig = EquipProxy:GetEquipTypeConfig()
  412. local equip = EquipProxy:GetEquipDataByPos(equipTypeConfig.Equip_Type_Dress)
  413. if equip and equip.Shape == 3 then
  414. return StuckKeys[1][attackweapon] or StuckKeys[1][-1]
  415. else
  416. return StuckKeys[2][attackweapon] or StuckKeys[2][-1]
  417. end
  418. end
  419. -- 受击
  420. function AudioProxy:getStuckScreamSoundId(actorID)
  421. if not actorID then return
  422. nil
  423. end
  424. local gameActor = global.actorManager:GetActor(actorID)
  425. if not gameActor or not gameActor:IsPlayer() then
  426. return nil
  427. end
  428. return gameActor:GetSexID() == 0 and AudioKeys.s_man_struck or AudioKeys.s_wom_struck
  429. end
  430. -- 死亡
  431. function AudioProxy:getPlayerDieSoundId(sex)
  432. if not sex then
  433. return nil
  434. end
  435. return sex == 0 and AudioKeys.s_man_die or AudioKeys.s_wom_die
  436. end
  437. function AudioProxy:getClickItemSoundId(std)
  438. local stdMode = std and std.StdMode
  439. if not stdMode then
  440. return nil
  441. end
  442. local value = ClickItemKeys[stdMode] or ClickItemKeys[-1]
  443. if type(value) == "function" then
  444. return value(std.Name)
  445. end
  446. return value
  447. end
  448. function AudioProxy:getUseItemSoundId(std)
  449. local stdMode = std and std.StdMode
  450. if not stdMode then
  451. return nil
  452. end
  453. return stdMode == 0 and AudioKeys.s_click_drug or nil
  454. end
  455. -- 移动
  456. function AudioProxy:getMoveSoundId(action, isRide)
  457. local mainPlayer = global.gamePlayerController:GetMainPlayer()
  458. if not mainPlayer then
  459. return nil
  460. end
  461. local mapData = global.sceneManager:GetMapData2DPtr()
  462. if not mapData then
  463. return nil
  464. end
  465. -- 基本动作
  466. local tileInfo = mapData:GetTileInfo(mainPlayer:GetMapX(), mainPlayer:GetMapY())
  467. if not tileInfo then
  468. return nil
  469. end
  470. -- 检查地图属性
  471. local bidx = bBand(tileInfo.BkImg, 0x7FFF)
  472. bidx = tileInfo.Area * 10000 + bidx - 1
  473. local m_nFootStepSound = self:IsInRang(bidx, MoveKeys[1], AudioKeys.s_walk_ground_l)
  474. bidx = bBand(tileInfo.MidImg, 0x7FFF)
  475. bidx = bidx - 1
  476. m_nFootStepSound = self:IsInRang(bidx, MoveKeys[2], m_nFootStepSound)
  477. bidx = bBand(tileInfo.FrImg, 0x7FFF)
  478. bidx = bidx - 1
  479. m_nFootStepSound = self:IsInRang(bidx, MoveKeys[3], m_nFootStepSound)
  480. if not m_nFootStepSound then
  481. return nil
  482. end
  483. local nextFootStepSound = m_nFootStepSound + 1
  484. if action == global.MMO.ACTION_RUN then
  485. m_nFootStepSound = m_nFootStepSound + 2
  486. nextFootStepSound = m_nFootStepSound + 1
  487. elseif action == global.MMO.ACTION_RIDE_RUN then
  488. m_nFootStepSound = AudioKeys.s_ride_run
  489. nextFootStepSound = nil
  490. elseif action == global.MMO.ACTION_WALK and isRide then
  491. m_nFootStepSound = AudioKeys.s_ride_walk
  492. nextFootStepSound = nil
  493. end
  494. local frameNum = 0.085
  495. local delayTime = frameNum
  496. local delayTime2 = frameNum * 4
  497. return m_nFootStepSound, delayTime, nextFootStepSound, delayTime2
  498. end
  499. function AudioProxy:getMonBornSoundId(clothID)
  500. if not clothID then
  501. return nil
  502. end
  503. return clothID * 10 + 200
  504. end
  505. function AudioProxy:getMonMoveSoundId(clothID)
  506. if not clothID then
  507. return nil
  508. end
  509. if Random(1, 8) ~= 1 then
  510. return nil
  511. end
  512. return clothID * 10 + 201
  513. end
  514. function AudioProxy:getMonDieSoundId(clothID)
  515. if not clothID then
  516. return nil
  517. end
  518. if clothID ~= 80 then
  519. return nil
  520. end
  521. return clothID * 10 + 206, 0.085
  522. end
  523. function AudioProxy:getMonAttackSoundId(clothID)
  524. if not clothID then
  525. return nil
  526. end
  527. return clothID * 10 + 202, 0.085 * 2
  528. end
  529. function AudioProxy:IsInRang(num, tabs, defValue)
  530. local n = #tabs
  531. for i = 1, n do
  532. local d = tabs[i]
  533. if num >= d.min and num <= d.max then
  534. if d.key then
  535. return d.key
  536. end
  537. local value = d.func and d.func(num)
  538. if value then
  539. return value
  540. end
  541. end
  542. end
  543. return defValue
  544. end
  545. function AudioProxy:getMusicVolume()
  546. return 0.8
  547. end
  548. function AudioProxy:getEffectVolume()
  549. return 1.0
  550. end
  551. return AudioProxy