2022-05-15 13:10:51 -07:00
local storage = quikbild.storage
2021-01-28 15:12:36 -08:00
local clearinv = function ( p_name )
local player = minetest.get_player_by_name ( p_name )
local inv = player : get_inventory ( )
for idx , itemname in pairs ( quikbild.items ) do
local stack = ItemStack ( itemname )
local taken = inv : remove_item ( " main " , stack )
end
end
arena_lib.on_load ( " quikbild " , function ( arena )
2021-02-16 14:43:47 -08:00
arena_lib.HUD_send_msg_all ( " title " , arena , ' QuikBild v ' .. quikbild.version , 3 , nil , 0xFF0000 )
2021-02-16 14:32:57 -08:00
2022-05-15 13:10:51 -07:00
local poss = { }
local ser_poss = storage : get_string ( " pos_ " .. arena.name )
if ser_poss then
poss = minetest.deserialize ( ser_poss )
if poss == nil then poss = { } end
2021-02-16 14:32:57 -08:00
end
2022-05-15 13:10:51 -07:00
for _ , pos in ipairs ( poss ) do
minetest.set_node ( pos , { name = " quikbild:climb " } )
end
storage : set_string ( " pos_ " .. arena.name , minetest.serialize ( { } ) )
2021-01-28 15:12:36 -08:00
end )
2021-02-16 14:52:43 -08:00
2021-01-28 15:12:36 -08:00
arena_lib.on_time_tick ( ' quikbild ' , function ( arena )
if arena.state == ' choose_artist ' then
--choose the artist
local artist_canidates = { }
for pl_name , stats in pairs ( arena.players ) do
if stats.has_built == false then
table.insert ( artist_canidates , pl_name )
end
end
if # artist_canidates == 0 then --we have reached game's end
arena.state = ' game_over '
local winning_score = 0
local winners = { }
for pl_name , stats in pairs ( arena.players ) do
if stats.score == winning_score then
table.insert ( winners , pl_name )
elseif stats.score > winning_score then
winning_score = stats.score
winners = { pl_name }
end
end
-- for pl_name,stats in pairs(arena.players) do
-- local edit = true
-- if not winner_table[1] then
-- winner_table = {{pl_name,stats.score}}
-- edit = false
-- end
-- if edit then
-- local current_winner_stats = winner_table[1]
-- minetest.chat_send_all('current_winner_stats:'..dump(current_winner_stats))
-- local current_winner_score = current_winner_stats[2]
-- if stats.score == current_winner_score then
-- table.insert(winner_table,{pl_name,stats.score})
-- elseif stats.score > current_winner_score then
-- winner_table = {{pl_name,stats.score}}
-- end
-- end
-- end
-- local first_winner = winner_table[1]
if winning_score == 0 then --if no one got any points, then eliminate everyone
arena_lib.HUD_send_msg_all ( " broadcast " , arena , ' No one got any points :( Try again! ' , 3 , ' sumo_lose ' , 0xFF0000 )
minetest.after ( 4 , function ( arena )
arena_lib.force_arena_ending ( ' quikbild ' , arena , ' Game ' )
end , arena )
else
local winner_string = ' '
local pts = 0
for _ , pl_name in pairs ( winners ) do
winner_string = winner_string .. pl_name .. " , "
end
arena_lib.HUD_send_msg_all ( " broadcast " , arena , winner_string .. ' won with ' .. winning_score .. ' pts! ' , 3 , ' sumo_win ' , 0x0000AA )
2022-05-15 13:10:51 -07:00
-- minetest.log(dump(winners))
2021-01-28 15:12:36 -08:00
minetest.after ( 4 , function ( arena ) --cant use arena_lib.load celebration rn, doesnt recognize more than 1 winner
arena_lib.force_arena_ending ( ' quikbild ' , arena , ' Game ' )
end , arena )
end
return
end
--game ist over, so we choose the artist
local rand_art_idx = math.random ( 1 , # artist_canidates )
arena.artist = artist_canidates [ rand_art_idx ]
arena.players [ arena.artist ] . has_built = true --indicate that they were the artist
arena.state = ' build_think ' --change the arena state so we dont run this code again
--send info messages
arena_lib.HUD_send_msg ( " broadcast " , arena.artist , ' You are the Artist. Build the word you see ' , 4 , nil , 0xFF0000 )
for pl_name , stats in pairs ( arena.players ) do
if pl_name ~= arena.artist then
arena_lib.HUD_send_msg ( " broadcast " , pl_name , arena.artist .. ' is the artist. ' , 2 , nil , 0xFF0000 )
minetest.after ( 2 , function ( arena , pl_name )
arena_lib.HUD_send_msg ( " hotbar " , pl_name , ' Guess what they are building. Type it in chat (lowercase only) ' , 2 , nil , 0xFF0000 )
end , arena , pl_name )
end
end
--choose the word
arena.word = arena.word_list [ math.random ( 1 , # arena.word_list ) ]
--clear the building area
2022-05-15 13:10:51 -07:00
-- local pos1 = arena.build_area_pos_1
-- local pos2 = arena.build_area_pos_2
-- local x1 = pos1.x
-- local x2 = pos2.x
-- local y1 = pos1.y
-- local y2 = pos2.y
-- local z1 = pos1.z
-- local z2 = pos2.z
-- if x1 > x2 then
-- local temp = x2
-- x2 = x1
-- x1 = temp
-- end
-- if y1 > y2 then
-- local temp = y2
-- y2 = y1
-- y1 = temp
-- end
-- if z1 > z2 then
-- local temp = z2
-- z2 = z1
-- z1 = temp
-- end
-- for x = x1,x2 do
-- for y = y1,y2 do
-- for z = z1,z2 do
-- local nodename = minetest.get_node({x=x,y=y,z=z}).name
-- if string.find(nodename,'quikbild') then
2021-01-28 15:12:36 -08:00
2022-05-15 13:10:51 -07:00
-- minetest.set_node({x=x,y=y,z=z}, {name="quikbild:climb"})
-- end
2021-01-28 15:12:36 -08:00
2022-05-15 13:10:51 -07:00
-- end
-- end
-- end
local poss = { }
local ser_poss = storage : get_string ( " pos_ " .. arena.name )
if ser_poss then
poss = minetest.deserialize ( ser_poss )
if poss == nil then poss = { } end
2021-01-28 15:12:36 -08:00
end
2022-05-15 13:10:51 -07:00
for _ , pos in ipairs ( poss ) do
minetest.set_node ( pos , { name = " quikbild:climb " } )
end
storage : set_string ( " pos_ " .. arena.name , minetest.serialize ( { } ) )
2021-01-28 15:12:36 -08:00
----minetest.chat_send_all('cleared!')
-- teleport the artist in to the building area.
local artist_pl = minetest.get_player_by_name ( arena.artist )
artist_pl : move_to ( arena.artist_spawn_pos )
end
if arena.state == ' build_think ' then
arena.state_time = arena.state_time + 1 --increase the timer counter
if arena.state_time == 4 then
--send the word to the artist
arena_lib.HUD_send_msg ( " title " , arena.artist , arena.word , 4 , nil , 0xFF0000 )
arena_lib.HUD_send_msg_all ( " broadcast " , arena , ' Round begins in 5 ' , 1 , nil , 0xFF0000 )
end
if arena.state_time == 5 then
arena_lib.HUD_send_msg_all ( " broadcast " , arena , ' Round begins in 4 ' , 1 , nil , 0xFF0000 )
end
if arena.state_time == 6 then
arena_lib.HUD_send_msg_all ( " broadcast " , arena , ' Round begins in 3 ' , 1 , nil , 0xFF0000 )
end
if arena.state_time == 7 then
arena_lib.HUD_send_msg_all ( " broadcast " , arena , ' Round begins in 2 ' , 1 , nil , 0xFF0000 )
end
if arena.state_time == 8 then
arena_lib.HUD_send_msg_all ( " broadcast " , arena , ' Round begins in 1 ' , 1 , nil , 0xFF0000 )
end
if arena.state_time == 9 then
--give the artist his tools, send start to everyone, change state
for pl_name , stats in pairs ( arena.players ) do
if pl_name == arena.artist then
local player = minetest.get_player_by_name ( pl_name )
for idx , itemname in pairs ( quikbild.items ) do
local item = ItemStack ( itemname )
player : get_inventory ( ) : set_stack ( " main " , idx , item )
end
arena_lib.HUD_send_msg ( " title " , pl_name , ' BUILD! ' , 1 , nil , 0x00FF00 )
arena_lib.HUD_send_msg ( " title " , pl_name , ' BUILD! ' , 1 , nil , 0x00FF00 )
else
arena_lib.HUD_send_msg ( " title " , pl_name , ' BEGIN GUESSSING! ' , 1 , nil , 0x00FF00 )
end
arena.state = ' build '
arena.state_time = 0
end
end
end
if arena.state == ' build ' then
if not arena.stall then
local time_left = arena.build_time - arena.state_time
local art_is_in_game = false
for pl_name , stats in pairs ( arena.players ) do
if pl_name == arena.artist then
art_is_in_game = true
end
end
if not ( art_is_in_game ) then --if arena.artist is no longer in the game, then send message to players, and change game state to choose artist, and return
arena_lib.HUD_send_msg_all ( " Title " , arena , " Oops! Looks like the artist left the game. " .. arena.word , 3 , ' sumo_elim ' , 0xFFFFFF )
arena.stall = true --stop gameplay for 3 sec
minetest.after ( 3 , function ( arena )
if arena.in_game then
arena.stall = false
arena.state = ' choose_artist '
arena.state_time = 0
for pl_name , stats in pairs ( arena.players ) do
local pos = arena_lib.get_random_spawner ( arena )
local pl_obj = minetest.get_player_by_name ( pl_name )
pl_obj : move_to ( pos )
clearinv ( pl_name )
end
end
end , arena )
return
end
if time_left == 0 then
--change game state
2021-02-16 15:21:25 -08:00
arena_lib.HUD_send_msg_all ( " title " , arena , " TIME's UP! The word was: " .. arena.word , 3 , ' sumo_lose ' , 0xFFFFFF )
2021-01-28 15:12:36 -08:00
arena.stall = true --stop gameplay for 3 sec
minetest.after ( 3 , function ( arena )
if arena.in_game then
arena.stall = false
arena.state = ' choose_artist '
arena.state_time = 0
for pl_name , stats in pairs ( arena.players ) do
local pos = arena_lib.get_random_spawner ( arena )
local pl_obj = minetest.get_player_by_name ( pl_name )
pl_obj : move_to ( pos )
clearinv ( pl_name )
end
end
end , arena )
return
end
for pl_name , stats in pairs ( arena.players ) do
if pl_name == arena.artist then
arena_lib.HUD_send_msg ( " hotbar " , pl_name , " WORD: " .. arena.word .. " TIME: " .. time_left , 1 , nil , 0xFFFFFF )
else
arena_lib.HUD_send_msg ( " hotbar " , pl_name , " TIME LEFT IN ROUND: " .. time_left , 1 , nil , 0xFFFFFF )
end
end
arena.state_time = arena.state_time + 1
end
end
end )
table.insert ( minetest.registered_on_chat_messages , 1 , function ( p_name , message ) --thanks rubenwardy, for giving this code snippet that works around Arena_libs's chat prevention!
if message : sub ( 1 , 1 ) == " / " then
return false
end
----minetest.chat_send_all('line 275')
if arena_lib.is_player_in_arena ( p_name , ' quikbild ' ) then
----minetest.chat_send_all('line 276')
local arena = arena_lib.get_arena_by_player ( p_name )
if not ( arena.in_queue ) and not ( arena.in_celebration ) and not ( arena.in_loading ) then
----minetest.chat_send_all('line 279')
if arena.state == ' build ' then
----minetest.chat_send_all('line 283')
if p_name == arena.artist then
return true -- prevent cheating!
else
----minetest.chat_send_all('line 285')
if string.find ( message , arena.word ) then -- if the word was said...
----minetest.chat_send_all('line 288')
for pl_name , stats in pairs ( arena.players ) do
if pl_name == p_name then
local list = { ' Correct! ' , ' You got it! ' , ' Way to go! ' , ' Outstanding! ' , ' Yay! ' }
local msg = list [ math.random ( 1 , 5 ) ] .. ' +1 pt '
arena_lib.HUD_send_msg ( " title " , pl_name , msg , 3 , ' sumo_win ' , 0x00FF00 )
arena.players [ p_name ] . score = arena.players [ p_name ] . score + 1
elseif pl_name == arena.artist then
local msg = ' Yay! ' .. p_name .. ' guessed your word. +1 pt '
arena_lib.HUD_send_msg ( " title " , pl_name , msg , 3 , ' sumo_win ' , 0x00FF00 )
arena.players [ pl_name ] . score = arena.players [ pl_name ] . score + 1
else
local msg = p_name .. ' guessed the word. Round over! '
arena_lib.HUD_send_msg ( " title " , pl_name , msg , 3 , ' sumo_elim ' , 0x00FF00 )
end
end
arena.stall = true --stop gameplay for 3 sec
minetest.after ( 3 , function ( arena )
if arena.in_game then
arena.stall = false
arena.state = ' choose_artist '
arena.state_time = 0
for pl_name , stats in pairs ( arena.players ) do
local pos = arena_lib.get_random_spawner ( arena )
local pl_obj = minetest.get_player_by_name ( pl_name )
pl_obj : move_to ( pos )
clearinv ( pl_name )
end
end
end , arena )
end
end
end
end
end
end )
2021-02-16 14:51:59 -08:00
-- arena_lib.on_celebration('quikbild', function(arena, winner_name)
-- minetest.after(3,function(arena)
-- arena_lib.HUD_hide('all', arena)
-- end,arena)
2021-01-28 15:12:36 -08:00
2021-02-16 14:51:59 -08:00
-- end)
2021-01-28 15:12:36 -08:00
2021-02-16 14:42:01 -08:00
-- arena_lib.on_quit('quikbild', function(arena, p_name, is_forced)
-- local player =
-- arena_lib.HUD_hide('all', p_name)
-- end)
2021-01-28 15:12:36 -08:00
2021-02-16 15:21:25 -08:00
2021-01-28 15:12:36 -08:00
minetest.register_on_joinplayer ( function ( player )
local name = player : get_player_name ( )
clearinv ( name )
end )