]> git.lizzy.rs Git - elidragon.git/blob - quests.lua
Merge branch 'master' of https://github.com/EliasFleckenstein03/elidragon
[elidragon.git] / quests.lua
1 elidragon.quests = {}
2
3 elidragon.quests.list = {
4         dig_dirt = {
5                 job = "Dig Dirt",
6                 desc = "dig 10 x default:dirt or default:dirt_with_grass",
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 = "dig 5 x default:wood",
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 = "place default:lava_source using a 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 = "craft default:pick_wood",
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 = "dig 10 x default:stone",
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         craft_stone_pick = {
51                 job = "Craft a Stone Pickaxe",
52                 desc = "craft default:pick_stone",
53                 count = 1,
54                 parents = {"dig_cobble"},
55                 action = "craft",
56                 items = {"default:pick_stone"},
57                 reward = "default:iron_lump",
58         },
59         craft_stone_axe = {
60                 job = "Craft a Stone Axe",
61                 desc = "craft default:axe_stone",
62                 count = 1,
63                 parents = {"craft_stone_pick"},
64                 action = "craft",
65                 items = {"default:axe_stone"},
66                 reward = "default:iron_lump",
67         },
68         craft_stone_shovel = {
69                 job = "Craft a Stone Shovel",
70                 desc = "craft default:shovel_stone",
71                 count = 1,
72                 parents = {"dig_cobble"},
73                 action = "craft",
74                 items = {"default:shovel_stone"},
75                 reward = "default:iron_lump",
76         },
77         craft_stone_sword = {
78                 job = "Craft a stone sword",
79                 desc = "craft default:sword_stone",
80                 count = 1,
81                 parents = {"craft_stone_shovel", "craft_stone_axe"},
82                 action = "craft",
83                 items = {"default:sword_stone"},
84                 reward = "default:iron_lump",
85                 goal = "Full Toolset",
86         },
87         craft_iron_pickaxe = {
88                 job = "Make an Iron Pick",
89                 desc = "craft default:pick_steel",
90                 count = 1,
91                 parents = {"craft_stone_pick", "craft_furnace"},
92                 action = "craft",
93                 items = {"default:pick_steel"},
94                 reward = "default:dirt 25",
95         },
96         craft_dirt = {
97                 job = "Craft some dirt!",
98                 desc = "craft 99 x default:dirt",
99                 count = 99,
100                 parents = {"craft_stone_sword"},
101                 action = "craft",
102                 items = {"default:dirt"},
103                 reward = "protector:protect 5",
104         },
105         craft_furnace = {
106                 job = "Make a furnace",
107                 desc = "craft default:furnace",
108                 count = 1,
109                 parents = {"dig_cobble"},
110                 action = "craft",
111                 items = {"default:furnace"},
112                 reward = "default:coal_lump 5",
113         },
114 }
115
116 elidragon.savedata.quests = elidragon.savedata.quests or {}
117
118 elidragon.quests.active = {}
119
120 -- functions
121
122 function elidragon.quests.complete(name, queststr)
123         local questname = string.gsub(queststr, "elidragon:", "")
124         local questdef = elidragon.quests.list[questname]
125         local player = minetest.get_player_by_name(name)
126         if not player then return end
127         elidragon.savedata.quests[name][questname] = true
128         if questdef.goal then
129                 minetest.chat_send_all(minetest.colorize("#84FFE3", name .. " has reached the goal ") .. minetest.colorize("#CF24FF", questdef.goal))
130                 minetest.sound_play("elidragon_reach_goal")
131         else
132                 minetest.sound_play("elidragon_finish_quest", {to_player = name})
133         end
134         player:get_inventory():add_item("main", ItemStack(questdef.reward))
135         elidragon.quests.update(name)
136 end
137
138 function elidragon.quests.update(name)
139         local completed_quests = elidragon.savedata.quests[name]
140         local active_quests = elidragon.quests.active[name]
141         local unlock_delay = 2
142         for questname, questdef in pairs(elidragon.quests.list) do
143                 if not completed_quests[questname] and not active_quests[questname] then
144                         local unlock = true
145                         for _, parent in pairs(questdef.parents) do
146                                 if not completed_quests[parent] then
147                                         unlock = false
148                                         break
149                                 end
150                         end
151                         if unlock then
152                                 active_quests[questname] = true
153                                 minetest.after(unlock_delay, function()
154                                         quests.start_quest(name, "elidragon:" .. questname)
155                                         minetest.sound_play("elidragon_new_quest", {to_player = name})
156                                 end)
157                                 unlock_delay = unlock_delay + 0.5
158                         end
159                 end
160         end
161 end
162
163 function elidragon.quests.event(name, action, itemstack)
164         if not minetest.get_player_by_name(name) then return end
165         local item_name = itemstack:get_name()
166         local item_count = itemstack:get_count()
167         for questname, questdef in pairs(elidragon.quests.list) do
168                 if questdef.action == action then
169                         for _, item in pairs(questdef.items) do
170                                 if item == item_name then
171                                         quests.update_quest(name, "elidragon:" .. questname, item_count)
172                                 end
173                                 break
174                         end
175                 end
176         end
177 end
178
179 -- register quests
180
181 for questname, questdef in pairs(elidragon.quests.list) do
182         quests.register_quest("elidragon:" .. questname, {
183                 title = questdef.job,
184                 description = questdef.desc,
185                 max = questdef.count,
186                 autoaccept = true,
187                 callback = elidragon.quests.complete
188         })
189 end
190
191 -- startup
192
193 minetest.register_on_joinplayer(function(player)
194         local name = player:get_player_name()
195         elidragon.savedata.quests[name] = elidragon.savedata.quests[name] or {}
196         elidragon.quests.active[name] = {}
197         elidragon.quests.update(name)
198         quests.show_hud(name, true)
199 end)
200
201 -- callbacks
202
203 minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
204         if not player then return end
205         elidragon.quests.event(player:get_player_name(), "craft", itemstack)
206 end)
207
208 minetest.register_on_dignode(function(pos, oldnode, player)
209         if not player then return end
210         elidragon.quests.event(player:get_player_name(), "dig", ItemStack(oldnode.name))
211 end)
212
213 minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack, pointed_thing)
214         if not player then return end
215         elidragon.quests.event(player:get_player_name(), "place", ItemStack(newnode.name))
216 end)
217
218 minetest.after(0, function()
219         for _, liquid in pairs(bucket.liquids) do
220                 local bucket_item = minetest.registered_items[liquid.itemname]
221                 local old_on_place = bucket_item.on_place
222                 minetest.override_item(liquid.itemname, {
223                         on_place = function(itemstack, user, pointed_thing)
224                                 local result = old_on_place(itemstack, user, pointed_thing)
225                                 if result and ItemStack(result) and ItemStack(result):get_name() == "bucket:bucket_empty" then
226                                         elidragon.quests.event(user:get_player_name(), "place_liquid", ItemStack(liquid.source))
227                                 end
228                                 return result
229                         end
230                 })
231         end
232 end)