game.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. local intramod = the_end_game_master.intramod
  2. local S = minetest.get_translator("the_end_game_master")
  3. local storage = intramod.storage
  4. local start_time = os.clock() - storage:get_float("start_time")
  5. function the_end_game_master.get_running_time()
  6. if not the_end_game_master.get_stage() == "game"
  7. then
  8. return 0
  9. else
  10. return os.clock() - start_time
  11. end
  12. end
  13. local function clear_hud(player)
  14. local name = player:get_player_name()
  15. local hud = intramod.huds[name]
  16. if not hud
  17. then
  18. return
  19. end
  20. for i, h in ipairs(hud)
  21. do
  22. player:hud_remove(h)
  23. end
  24. intramod.huds[name] = nil
  25. end
  26. local function show_the_end_logo_on_screen(player)
  27. local h = player:hud_add(
  28. {
  29. hud_elem_type = "image",
  30. position = {x = 0.5, y = 0.5},
  31. scale = {x = -90, y = -35},
  32. name = "game_started_logo",
  33. text = "the_end_game_master_header.png",
  34. })
  35. local name = player:get_player_name()
  36. local hud = intramod.huds[name]
  37. if not hud
  38. then
  39. hud = {}
  40. intramod.huds[name] = hud
  41. end
  42. table.insert(hud, h)
  43. minetest.after(3, function()
  44. if player
  45. then
  46. clear_hud(player)
  47. end
  48. end)
  49. end
  50. local function remove_pregame_hud(player)
  51. local hud_flags = player:hud_set_flags(
  52. {
  53. hotbar = true,
  54. healthbar = true,
  55. crosshair = true,
  56. wielditem = true,
  57. breathbar = true,
  58. })
  59. clear_hud(player)
  60. end
  61. local function restore_inv_list_sizes(player)
  62. local inv = player:get_inventory()
  63. inv:set_size("main", 4*8)
  64. inv:set_list("hand", {ItemStack("wieldhand")})
  65. end
  66. local function reenable_sfinv(player)
  67. minetest.close_formspec(player:get_player_name(), "")
  68. sfinv.set_player_inventory_formspec(player)
  69. end
  70. local function set_game_physics(player)
  71. player:set_physics_override(
  72. {
  73. speed = 1,
  74. jump = 1,
  75. gravity = 1,
  76. sneak = true,
  77. })
  78. end
  79. local function set_player_to_game(player)
  80. remove_pregame_hud(player)
  81. restore_inv_list_sizes(player)
  82. reenable_sfinv(player)
  83. set_game_physics(player)
  84. the_end_game_master.stop_pregame_music(player)
  85. end
  86. local function on_done_loading_map(success)
  87. if success
  88. then
  89. in_game_guide.set_root_page_back_button_name(nil)
  90. the_end_game_master.clear_mobs()
  91. the_end_game_master.set_stage("game")
  92. start_time = os.clock()
  93. minetest.set_timeofday(0.25) --6am
  94. mob_spawning_director.reset()
  95. mob_spawning_director.enable()
  96. sfinv.enabled = true
  97. local players = minetest.get_connected_players()
  98. for _, p in ipairs(players)
  99. do
  100. set_player_to_game(p)
  101. show_the_end_logo_on_screen(p)
  102. minetest.sound_play("mood_music_transit")
  103. give_initial_stuff.give(p)
  104. movable_spawnpoint.spawn_player(p)
  105. end
  106. else
  107. error("Failed loading one of the map's schematics")
  108. end
  109. end
  110. local function load_random_map()
  111. local mapnames = {}
  112. for name, map in pairs(map_master.registered_maps)
  113. do
  114. table.insert(mapnames, name)
  115. end
  116. assert(#mapnames > 0, "Error starting game: There are no registered maps")
  117. map_master.load_map(mapnames[math.random(#mapnames)], on_done_loading_map)
  118. end
  119. function the_end_game_master.start_game()
  120. the_end_game_master.set_stage("loading")
  121. load_random_map()
  122. end
  123. minetest.register_on_joinplayer(function(player)
  124. if the_end_game_master.get_stage() == "game"
  125. then
  126. set_player_to_game(player)
  127. end
  128. end)