83 lines
3.0 KiB
Lua
83 lines
3.0 KiB
Lua
for i = 1,8 do
|
|
minetest.register_craftitem('tasks:card_'..i, {
|
|
description = 'Playing Card',
|
|
inventory_image = 'tasks_playing_card.png',
|
|
stack_max = 1,
|
|
groups = {not_in_creative_inventory=1}
|
|
})
|
|
end
|
|
|
|
local function match_formspec(pname, tries, card1, card2)
|
|
local val1 = string.sub(card1, -1)
|
|
local val2 = string.sub(card2, -1)
|
|
local formspec =
|
|
'size[8,6]'..
|
|
'textarea[4.5,.25;3,1;;;Pick two matching cards.\n('..tries..' tries remaining.)]'..
|
|
'label[4.75,3;'..val1..']'..
|
|
'label[5.75,3;'..val2..']'..
|
|
'list[detached:match_card_grid_'..pname..';cards;0,0;4,4;]'..
|
|
'list[detached:match_card_slot_'..pname..';slots;4.5,2;2,1;]'
|
|
return formspec
|
|
end
|
|
|
|
local deck = {'tasks:card_1', 'tasks:card_2', 'tasks:card_3', 'tasks:card_4', 'tasks:card_5', 'tasks:card_6', 'tasks:card_7', 'tasks:card_8',
|
|
'tasks:card_1', 'tasks:card_2', 'tasks:card_3', 'tasks:card_4', 'tasks:card_5', 'tasks:card_6', 'tasks:card_7', 'tasks:card_8'}
|
|
|
|
local function shuffle_deck(table)
|
|
for i = #table, 2 , -1 do
|
|
local j = math.random(i)
|
|
table[i], table[j] = table[j], table[i]
|
|
end
|
|
return table
|
|
end
|
|
|
|
local function new_game(pos, player)
|
|
local player_attributes = player:get_meta()
|
|
local luck = player_attributes:get_int('luck')
|
|
local tries = (luck) + 6
|
|
local pname = player:get_player_name()
|
|
local meta = minetest.get_meta(pos)
|
|
local xp = meta:get_int('xp')
|
|
local grid_inv = minetest.create_detached_inventory('match_card_grid_'..pname, {})
|
|
grid_inv:set_size('cards', 16)
|
|
grid_inv:set_list('cards', shuffle_deck(deck))
|
|
local slot_inv = minetest.create_detached_inventory('match_card_slot_'..pname, {
|
|
on_put = function(inv, listname, index, stack, player)
|
|
tries = tries - 1
|
|
if tries == 0 then
|
|
new_game(pos, player)
|
|
else
|
|
local inv = minetest.get_inventory({type = 'detached', name = 'match_card_slot_'..pname})
|
|
local slot1 = inv:get_stack('slots', 1)
|
|
local slot2 = inv:get_stack('slots', 2)
|
|
local card1 = slot1:get_name()
|
|
local card2 = slot2:get_name()
|
|
minetest.show_formspec(pname, 'tasks:card_matching', match_formspec(pname, tries, card1, card2))
|
|
if card1 == card2 then
|
|
minetest.chat_send_player(pname, 'Nice work')
|
|
tasks.only_add_xp(xp, pname)
|
|
new_game(pos, player)
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
slot_inv:set_size('slots', 2)
|
|
minetest.show_formspec(pname, 'tasks:card_matching', match_formspec(pname, tries, '?', '?'))
|
|
end
|
|
|
|
minetest.register_node('tasks:match', {
|
|
description = 'Matching Game',
|
|
drawtype = 'mesh',
|
|
mesh = 'tasks_card_table.obj',
|
|
tiles = {'tasks_card_table.png'},
|
|
paramtype2 = 'facedir',
|
|
groups = {breakable=1, tasks=1},
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string('infotext', 'Matching')
|
|
end,
|
|
on_rightclick = function(pos, node, clicker)
|
|
new_game(pos, clicker)
|
|
end
|
|
})
|