music.lua 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. defense.music = {}
  2. local music = defense.music
  3. music.loop_length = 6.0 - 0.1
  4. -- State tracking stuff
  5. local current_level = 0
  6. local current_music = nil
  7. local last_intensity = 0
  8. local last_update_time = 0
  9. local function update()
  10. local time = os.time()
  11. if current_level > 0 then
  12. if time < last_update_time + music.loop_length then
  13. return
  14. end
  15. end
  16. last_update_time = time
  17. local intensity = defense.director.intensity
  18. if not defense:is_dark() then
  19. intensity = intensity * 0.1
  20. end
  21. last_intensity = intensity
  22. intensity = intensity + math.max(0, intensity - last_intensity) * 3
  23. local il = {0.05, 0.35, 0.6, 0.8}
  24. local last_level = current_level
  25. if intensity <= il[1] then
  26. if current_level > 0 then
  27. current_level = current_level - 1
  28. end
  29. elseif intensity > il[1] and intensity <= il[2] then
  30. if current_level > 1 then
  31. current_level = current_level - 1
  32. elseif current_level < 1 then
  33. current_level = current_level + 1
  34. end
  35. elseif intensity > il[2] and intensity <= il[3] then
  36. if current_level > 2 then
  37. current_level = current_level - 1
  38. elseif current_level < 2 then
  39. current_level = current_level + 1
  40. end
  41. elseif intensity > il[3] and intensity <= il[4] then
  42. if current_level > 3 then
  43. current_level = current_level - 1
  44. elseif current_level < 3 then
  45. current_level = current_level + 1
  46. end
  47. elseif intensity > il[4] then
  48. if current_level < 4 then
  49. current_level = current_level + 1
  50. end
  51. end
  52. if last_level ~= current_level then
  53. if defense.debug then
  54. minetest.chat_send_all("Level: " .. current_level)
  55. end
  56. if current_music then
  57. minetest.sound_stop(current_music)
  58. end
  59. if current_level > 0 then
  60. current_music = minetest.sound_play("defense_music_level" .. current_level, {
  61. pos = nil,
  62. gain = 0.2 + current_level * 0.15,
  63. loop = true,
  64. })
  65. end
  66. if last_level > 0 then
  67. minetest.sound_play("defense_music_transit", {
  68. gain = 0.2 + last_level * 0.1
  69. })
  70. end
  71. end
  72. end
  73. minetest.register_globalstep(function(dtime)
  74. update()
  75. end)