]> git.lizzy.rs Git - elidragon.git/blob - quests.lua
test
[elidragon.git] / quests.lua
1 elidragon.quests = {}
2
3 elidragon.quests.list = {
4         dig_dirt = {
5                 job = "Dig Dirt",
6                 desc = "You need ressources to build a stone generator!",
7                 count = 10,
8                 parents = {},
9                 action = "dig",
10                 items = {"default:dirt", "default:dirt_with_grass"},
11                 reward = "default:dirt 20",
12         },
13         get_wood = {
14                 job = "Get Wood",
15                 desc = "Wood is one of your basic resources",
16                 count = 5,
17                 parents = {},
18                 action = "dig",
19                 items = {"default:tree"},
20                 reward = "default:apple 15",
21         },
22         build_stonegen = {
23                 job = "Build a stone generator",
24                 desc = "Using lavacooling mechanisms to get access to cobblestone and ores! Be careful, you have only one lava bucket.",
25                 count = 1,
26                 parents = {"dig_dirt"},
27                 action = "place_liquid",
28                 items = {"default:lava_source"},
29                 reward = "flowers:waterlily 3",
30         },
31         craft_wood_pickaxe = {
32                 job = "Craft a wooden pickaxe",
33                 desc = "You need a pickaxe to get Cobblestone.",
34                 count = 1,
35                 parents = {"get_wood"},
36                 action = "craft",
37                 items = {"default:pick_wood"},
38                 reward = "default:sand 5",
39         },
40         dig_cobble = {
41                 job = "Dig Stone",
42                 desc = "Let's get some cobble!",
43                 count = 10,
44                 parents = {"craft_wood_pickaxe", "build_stonegen"},
45                 action = "dig",
46                 items = {"default:stone"},
47                 reward = "default:chest_locked",
48                 goal = "Stone Age",
49         }
50 }
51
52 elidragon.savedata.quests = elidragon.savedata.quests or {}
53
54 elidragon.quests.active = {}
55
56 -- functions
57
58 function elidragon.quests.complete(name, queststr)
59         local questname = string.gsub(queststr, "elidragon:", "")
60         local questdef = elidragon.quests.list[questname]
61         local player = minetest.get_player_by_name(name)
62         if not player then return end
63         elidragon.savedata.quests[name][questname] = true
64         if questdef.goal then
65                 minetest.chat_send_all(minetest.colorize("#84FFE3", name .. " has reached the goal ") .. minetest.colorize("#CF24FF", questdef.goal))
66                 minetest.sound_play("elidragon_reach_goal")
67         else
68                 minetest.sound_play("elidragon_finish_quest", {to_player = name})
69         end
70         player:get_inventory():add_item("main", ItemStack(questdef.reward))
71         elidragon.quests.update(name)
72 end
73
74 function elidragon.quests.update(name)
75         local completed_quests = elidragon.savedata.quests[name]
76         local active_quests = elidragon.quests.active[name]
77         local unlock_delay = 2
78         for questname, questdef in pairs(elidragon.quests.list) do
79                 if not completed_quests[questname] and not active_quests[questname] then
80                         local unlock = true
81                         for _, parent in pairs(questdef.parents) do
82                                 if not completed_quests[parent] then
83                                         unlock = false
84                                         break
85                                 end
86                         end
87                         if unlock then
88                                 active_quests[questname] = true
89                                 minetest.after(unlock_delay, function()
90                                         quests.start_quest(name, "elidragon:" .. questname)
91                                         minetest.sound_play("elidragon_new_quest", {to_player = name})
92                                 end)
93                                 unlock_delay = unlock_delay + 0.5
94                         end
95                 end
96         end
97 end
98
99 function elidragon.quests.event(name, action, itemstack)
100         if not minetest.get_player_by_name(name) then return end
101         local item_name = itemstack:get_name()
102         local item_count = itemstack:get_count()
103         for questname, questdef in pairs(elidragon.quests.list) do
104                 if questdef.action == action then
105                         for _, item in pairs(questdef.items) do
106                                 if item == item_name then
107                                         quests.update_quest(name, "elidragon:" .. questname, item_count)
108                                 end
109                                 break
110                         end
111                 end
112         end
113 end
114
115 -- register quests
116
117 for questname, questdef in pairs(elidragon.quests.list) do
118         quests.register_quest("elidragon:" .. questname, {
119                 title = questdef.job,
120                 description = questdef.desc,
121                 max = questdef.count,
122                 autoaccept = true,
123                 callback = elidragon.quests.complete
124         })
125 end
126
127 -- startup
128
129 minetest.register_on_joinplayer(function(player)
130         local name = player:get_player_name()
131         elidragon.savedata.quests[name] = elidragon.savedata.quests[name] or {}
132         elidragon.quests.active[name] = {}
133         elidragon.quests.update(name)
134 end)
135
136 -- callbacks
137
138 minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
139         elidragon.quests.event(player:get_player_name(), "craft", itemstack)
140 end)
141
142 minetest.register_on_dignode(function(pos, oldnode, player)
143         elidragon.quests.event(player:get_player_name(), "dig", ItemStack(oldnode.name))
144 end)
145
146 minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack, pointed_thing)
147         elidragon.quests.event(player:get_player_name(), "place", ItemStack(newnode.name))
148 end)
149
150 minetest.after(0, function()
151         for _, liquid in pairs(bucket.liquids) do
152                 local bucket_item = minetest.registered_items[liquid.itemname]
153                 local old_on_place = bucket_item.on_place
154                 minetest.override_item(liquid.itemname, {
155                         on_place = function(itemstack, user, pointed_thing)
156                                 local result = old_on_place(itemstack, user, pointed_thing)
157                                 if result and ItemStack(result) and ItemStack(result):get_name() == "bucket:bucket_empty" then
158                                         elidragon.quests.event(user:get_player_name(), "place_liquid", ItemStack(liquid.source))
159                                 end
160                                 return result
161                         end
162                 })
163         end
164 end)