diff --git a/.gitattributes b/.gitattributes index 6c6c6d9d..c3282e92 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ .* export-ignore builder export-ignore +private export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3ab26661 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.dia.autosave diff --git a/builder/mods_src/libs/whynot_awards/init.lua b/builder/mods_src/libs/whynot_awards/init.lua new file mode 100644 index 00000000..ec1f622d --- /dev/null +++ b/builder/mods_src/libs/whynot_awards/init.lua @@ -0,0 +1,54 @@ +-- Set builtin awards to hidden +-- 4 awards are registered with minetest.after() so these cannot be hidden + +awards.registered_awards = {} + + +awards.register_award("whynot_spawnpoint", { + title = "Find your new home", + description = "Your home is the place with your bed. If you sleep once in bed, you always respawn at this position in case of death", + icon = "beds_bed.png", +-- prices = { }, -- Price is a new home ;-) +-- on_unlock = function(name, def) end + +}) + +local orig_beds_on_rightclick = beds.on_rightclick +function beds.on_rightclick(pos, player) + orig_beds_on_rightclick(pos, player) + local player_name = player:get_player_name() + if beds.player[player_name] then + awards.unlock(player_name, "whynot_spawnpoint") + end +end + + +awards.register_award("whynot_welcome", { + title = "Welcome to the WhyNot? game", + icon = "beds_bed.png", + description = "You are embarking on a Minetest journey. Whether it's for the thrill of survival, the satisfaction of exploration, or the arts of crafting and creative designs, we hope you will find it enjoyable.", + trigger = { + type = "join", + target = 2, + }, +}) + +awards.register_award("whynot_tree",{ + title = "Lumberjack", + description = "Chop some wood, karate-style", + trigger = { + type = "dig", + node = "group:tree", + target = 2, + }, +}) + +awards.register_award("whynot_planks",{ + title = "Woody", + description = "Chop some wood, karate-style", + trigger = { + type = "craft", + item = "group:plank", + target = 2, + }, +}) \ No newline at end of file diff --git a/builder/mods_src/libs/whynot_awards/mod.conf b/builder/mods_src/libs/whynot_awards/mod.conf new file mode 100644 index 00000000..0443f5be --- /dev/null +++ b/builder/mods_src/libs/whynot_awards/mod.conf @@ -0,0 +1,2 @@ +name = whynot_awards +depends = awards, beds, mtg_plus diff --git a/mods/libs/whynot_awards/custom_triggers.lua b/mods/libs/whynot_awards/custom_triggers.lua new file mode 100644 index 00000000..5d58734a --- /dev/null +++ b/mods/libs/whynot_awards/custom_triggers.lua @@ -0,0 +1,300 @@ +-- Check if a player object is valid for awards. +local function player_ok(player) + return minetest.is_player(player) and minetest.player_exists(player:get_player_name()) +end + +-- Don't actually use translator here. We define empty S() to fool the update_translations script +-- into extracting those strings for the templates. Actual translation is done in api_triggers.lua. +local S = function (str) + return str +end + + +minetest.register_on_joinplayer(function(player, _) + if (player_ok(player)) then + local awards_data = awards.player(player:get_player_name()) + if (awards_data) then + awards_data["max"] = awards_data["max"] or {} + awards_data["max"]["depth"] = awards_data["max"]["depth"] or 0 + awards_data["max"]["altitude"] = awards_data["max"]["altitude"] or 0 + awards_data["max"]["distance"] = awards_data["max"]["distance"] or 0 + + awards_data["prev_eatwildfood_eat"] = awards_data["prev_eatwildfood_eat"] or {} + awards_data["prev_gatherfruitvegetable_collect"] = awards_data["prev_gatherfruitvegetable_collect"] or {} + awards_data["prev_plant_crops_place"] = awards_data["prev_plant_crops_place"] or {} + awards_data["prev_gatherwildseeds_collect"] = awards_data["prev_gatherwildseeds_collect"] or {} + end + end +end) + + +local function check_action_with_item_in_collection(trigger_name, award_action, itemname, collection, player) + if (not (player_ok(player) and collection[itemname])) then + return + end + + local awards_data = awards.player(player:get_player_name()) + if (awards_data) then + itemname = minetest.registered_aliases[itemname] or itemname + + -- Uncomment to debug with qa_block + Whynot_awards.playerawardsdata = awards_data + + local prev_action = "prev_"..trigger_name.."_"..award_action + local award_action_counts = awards_data[award_action] + local prev_action_counts = awards_data[prev_action] + + local items_collected = award_action_counts[itemname] + if (prev_action_counts[itemname] ~= items_collected and (items_collected <= 1 or prev_action_counts[itemname] == nil)) then + awards["notify_"..trigger_name](player) + prev_action_counts[itemname] = items_collected + end + end +end + + +local function check_action_with_collection(trigger_name, award_action, collection, player) + if (not player_ok(player)) then + return + end + + local awards_data = awards.player(player:get_player_name()) + if (awards_data) then + -- Uncomment to debug with qa_block + Whynot_awards.playerawardsdata = awards_data + + local prev_action = "prev_"..trigger_name.."_"..award_action + local award_action_counts = awards_data[award_action] + local prev_action_counts = awards_data[prev_action] + + local notify_award_trigger = awards["notify_"..trigger_name] + + for _, itemname in pairs(collection) do + local items_collected = award_action_counts[itemname] + if (prev_action_counts[itemname] ~= items_collected and (items_collected <= 1 or prev_action_counts[itemname] == nil)) then + notify_award_trigger(player) + prev_action_counts[itemname] = items_collected + end + end + end +end + + +------------------------------------ +awards.register_trigger("collect", { + type = "counted_key", + progress = S("@1/@2 collected"), + auto_description = { S("Collect: @2"), S("Collect: @1×@2") }, + auto_description_total = { S("Collect @1 items."), S("Collect @1 items.") }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.item] or def.trigger.item + end, + key_is_item = true, +}) + +local base_minetest_handle_node_drops = minetest.handle_node_drops +function minetest.handle_node_drops(pos, drops, digger) + if (not player_ok(digger)) then + return + end + + -- Uncomment to debug with qa_block + local awards_data = awards.player(digger:get_player_name()) + Whynot_awards.playerawardsdata = awards_data + + for _, itemstr in ipairs(drops) do + local itemstack = ItemStack(itemstr) + if (not itemstack:is_empty()) then + awards.notify_collect(digger, itemstack:get_name(), itemstack:get_count()) + end + end + + return base_minetest_handle_node_drops(pos, drops, digger) +end + + +---------------------------------------- +awards.register_trigger("eatwildfood", { + type = "counted", + progress = S("@1/@2 eaten"), + auto_description = { S("Eat @2 wild food"), S("Eat @1×@2 different wild foods") }, +}) + +local foodstuff_to_gather = {} +foodstuff_to_gather["default:apple"] = 1 +foodstuff_to_gather["flowers:mushroom_brown"] = 1 +foodstuff_to_gather["default:blueberries"] = 1 +minetest.register_on_item_eat(function(_, _, itemstack, player, _) + check_action_with_item_in_collection("eatwildfood", "eat", itemstack:get_name(), foodstuff_to_gather, player) +end) + + +-------------------------------- +awards.register_trigger("max", { + type = "counted_key", + progress = S("@1/@2 reached"), + auto_description = { S("Reach @2"), S("Reach @1 @2") }, + get_key = function (self, def) + return def.trigger.max_param + end, +}) + +local player_index = 1 +local subbanding = 5 +local function check_positions() + local connected_players = minetest.get_connected_players() + if player_index > #connected_players then + player_index = 1 + end + + local end_index = math.min(player_index + subbanding, #connected_players) + for i = player_index, end_index do + local player = connected_players[i] + if (player_ok(player)) then + local awards_data = awards.player(player:get_player_name()) + if (awards_data) then + local position = player:get_pos() + local py = position.y + local max_data = awards_data["max"] + + local depth_delta = math.floor(math.min(py + max_data["depth"], 0)) + if (depth_delta < 0) then + awards.notify_max(player, "depth", math.abs(depth_delta)) + end + + local altitude_delta = math.floor(math.max(py - max_data["altitude"], 0)) + if (altitude_delta > 0) then + awards.notify_max(player, "altitude", altitude_delta) + end + + local px = position.x + local pz = position.z + local distance = math.floor(math.sqrt(px * px + pz * pz)) + local distance_delta = math.max(distance - max_data["distance"], 0) + if (distance_delta > 0) then + awards.notify_max(player, "distance", distance_delta) + end + end + end + end + + player_index = player_index + player_index - end_index + minetest.after(1, check_positions) +end +check_positions() + + +if (minetest.get_modpath("farming") and minetest.global_exists("farming") and farming.mod == "redo") then + + ------------------------------------------- + awards.register_trigger("gatherwildseeds",{ + type = "counted", + progress = S("@1/@2 grains found"), + auto_description = { S("Find @2 wild seed"), S("Find @1×@2 different wild seeds") }, + }) + + local grains_to_gather = {"farming:seed_wheat", "farming:seed_oat", "farming:seed_barley", "farming:seed_rye", "farming:seed_cotton", "farming:rice", "farming:seed_hemp"} + local function check_wildseeds(grassname) + local grassitem = minetest.registered_nodes[grassname] + if (grassitem) then + local old_after_dig_node = grassitem.after_dig_node + minetest.override_item(grassname, { + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if (old_after_dig_node) then + old_after_dig_node(pos, oldnode, oldmetadata, digger) + end + check_action_with_collection("gatherwildseeds", "collect", grains_to_gather, digger) + end + }) + end + end + + -- Grass drops overrides from farming/grass.lua + for i = 4, 5 do + check_wildseeds("default:grass_" .. i) + + if minetest.registered_nodes["default:dry_grass_1"] then + check_wildseeds("default:dry_grass_" .. i) + end + end + + check_wildseeds("default:junglegrass") + + ------------------------------------------------ + awards.register_trigger("gatherfruitvegetable",{ + type = "counted", + progress = S("@1/@2 fruits and vegetables found"), + auto_description = { S("Find @2 fruit or vegetable"), S("Find @1×@2 different fruits and vegetables") }, + }) + + local function check_fruits_and_vegetables(cropname, index) + local fullcropname = cropname .. "_" .. index + local node = minetest.registered_nodes[fullcropname] + if (node) then + local old_after_dig_node = node.after_dig_node + minetest.override_item(fullcropname, { + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if (old_after_dig_node) then + old_after_dig_node(pos, oldnode, oldmetadata, digger) + end + check_action_with_item_in_collection("gatherfruitvegetable", "collect", cropname, farming.registered_plants, digger) + end + }) + end + end + + -- This doesn't work for all plants. Some, like beans, don't use the usual crop/seed naming conventions + for _, plantdef in pairs(farming.registered_plants) do + for i = 1, plantdef.steps do + check_fruits_and_vegetables(plantdef.crop, i) + end + end + + + ------------------------------------- + awards.register_trigger("plow_soil",{ + type = "counted", + progress = S("@1/@2 plowed squares of soil"), + auto_description = { S("Plow @2 square of soil"), S("Plow @1×@2 squares of soil") }, + }) + + for name, itemdef in pairs(minetest.registered_tools) do + if (string.find(name, "farming:hoe")) then + local base_on_use = itemdef.on_use + minetest.override_item(name, { + on_use = function(itemstack, user, pointed_thing) + awards.notify_plow_soil(user) + return base_on_use(itemstack, user, pointed_thing) + end + }) + end + end + + + --------------------------------------- + awards.register_trigger("plant_crops",{ + type = "counted", + progress = S("@1/@2 different crop types planted"), + auto_description = { S("Planted @2 crop"), S("Planted @1×@2 different types of crops") }, + }) + + local registered_seeds = {} + for _, plantdef in pairs(farming.registered_plants) do + local seed_name = plantdef.seed + local reg_item = minetest.registered_items[seed_name] + if (reg_item) then + registered_seeds[seed_name] = 1 + local base_on_place = reg_item.on_place + minetest.override_item(seed_name, { + on_place = function(itemstack, placer, pointed_thing) + base_on_place(itemstack, placer, pointed_thing) + awards.notify_place(placer, itemstack:get_name()) + check_action_with_item_in_collection("plant_crops", "place", itemstack:get_name(), registered_seeds, placer) + end + }) + end + end + + +end -- if farming + diff --git a/mods/libs/whynot_awards/init.lua b/mods/libs/whynot_awards/init.lua new file mode 100644 index 00000000..f41f9e75 --- /dev/null +++ b/mods/libs/whynot_awards/init.lua @@ -0,0 +1,449 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local awards_modpath = minetest.get_modpath(minetest.get_current_modname()) + +Whynot_awards = { + get_translator = S, + modpath = awards_modpath, +} + +dofile(awards_modpath.."/custom_triggers.lua") + + +-- Set builtin awards to hidden +for name, award in pairs(awards.registered_awards) do + award.secret = true +end + +-- 4 awards are registered with minetest.after(0) so hide them later +minetest.after(2, function() + if (awards.registered_awards["awards_builder1"]) then + awards.registered_awards["awards_builder1"].secret = true + awards.registered_awards["awards_builder2"].secret = true + awards.registered_awards["awards_builder3"].secret = true + awards.registered_awards["awards_builder4"].secret = true + end +end) + + +local function escape_argument(texture_modifier) + return texture_modifier:gsub(".", {["\\"] = "\\\\", ["^"] = "\\^", [":"] = "\\:"}) +end + +local function awards_combine_with_frame(...) + local args={...} + local composition = "([combine:88x88:0,0=whynot_awards_frame.png" + if #args == 1 then + return composition..":3,3="..escape_argument(args[1].."^[resize:82x82")..")" + else + for i=1, #args do + composition = composition..":"..escape_argument(args[i]) + end + return composition..")" + end +end + + + +awards.register_award("whynot_welcome", { + title = S("Welcome to the WhyNot? game"), + description = S("You are embarking on a Minetest journey. Whether it's for the thrill of survival, the satisfaction of exploration, or the arts of crafting and creative designs, we hope you will find it enjoyable.\n\nMake sure to check your recipe book, awards or the help button in your inventory for more information and guidance."), + --icon = "", + requires = {}, + trigger = { + type = "join", + target = 1, + }, +}) + + +awards.register_award("whynot_gatherfood",{ + title = S("Gather and eat wild foodstuff"), + description = S("You need to eat to survive. The easiest food to find are wild mushrooms, blueberries and apples. Find and eat one of each to help secure your survival."), + icon = awards_combine_with_frame("3,3=default_apple.png^[resize:32x32", "54,0=flowers_mushroom_brown.png^[resize:32x32", "30,50=default_blueberries.png^[resize:32x32"), + requires = {}, + trigger = { + type = "eatwildfood", + target = 3, + }, +}) + + +awards.register_award("whynot_gatherwildseeds",{ + title = S("Gather wild seeds"), + description = S("Harvesting various types of grass can sometimes give you seeds. These seeds can the be planted and farmed for food and materials."), + icon = awards_combine_with_frame("38,5=farming_wheat_seed.png", "38,32=farming_rice.png", "38,68=farming_barley_seed.png", + "16,18=farming_rye_seed.png", "16,50=farming_cotton_seed.png", + "58,18=farming_hemp_seed.png", "58,50=farming_oat_seed.png"), + requires = {}, + trigger = { + type = "gatherwildseeds", + target = 3, + }, +}) + + +awards.register_award("whynot_gatherfruitvegetable",{ + title = S("Gather wild fruits and vegetables"), + description = S("More common in temperate regions, but also found in various climates, wild fruits and vegetables can be harvested. Use them for food, or re-plant them as crops for agriculture."), + icon = awards_combine_with_frame("farming_carrot.png"), + requires = {}, + trigger = { + type = "gatherfruitvegetable", + target = 3, + }, +}) + + +awards.register_award("whynot_tree",{ + title = S("Cut a tree"), + description = S("Cut down a tree, karate-style."), + icon = awards_combine_with_frame(minetest.inventorycube("default_tree_top.png", "default_tree.png", "default_tree.png")), + requires = {}, + trigger = { + type = "dig", + node = "group:tree", + target = 1, + }, +}) + + +awards.register_award("whynot_planks",{ + title = S("Craft planks"), + description = S("Chop some wood to make planks."), + icon = awards_combine_with_frame(minetest.inventorycube("default_wood.png")), + requires = {"whynot_tree"}, + trigger = { + type = "craft", + item = "group:wood", + target = 1, + }, +}) + + +awards.register_award("whynot_simple_boat",{ + title = S("Craft a raft"), + description = S("A simple boat will let you travel on water faster than walking on ground."), + icon = awards_combine_with_frame("boats_inventory.png"), + requires = {"whynot_planks"}, + trigger = { + type = "craft", + item = "boats:boat", + target = 1, + }, +}) + + +awards.register_award("whynot_chest",{ + title = S("Craft a chest"), + description = S("Chests are the most basic form of storage. They are very useful to gather more items than can fit in your character's inventory."), + icon = awards_combine_with_frame(minetest.inventorycube("default_chest_top.png", "default_chest_front.png", "default_chest_side.png")), + requires = {"whynot_planks"}, + trigger = { + type = "craft", + item = "default:chest", + target = 1, + }, +}) + + +awards.register_award("whynot_sticks",{ + title = S("Craft sticks"), + description = S("Split planks to make sticks."), + icon = awards_combine_with_frame("default_stick.png"), + requires = {"whynot_planks"}, + trigger = { + type = "craft", + item = "group:stick", + target = 1, + }, +}) + + +awards.register_award("whynot_tools",{ + title = S("Craft wood tools"), + description = S("The first tools you can craft are made of wood. They are not very strong or durable, but will enable you to start mining rock and minerals to move up to better ones."), + icon = awards_combine_with_frame("default_tool_woodpick.png"), + requires = {"whynot_sticks"}, + trigger = { + type = "craft", + item = "default:pick_wood", + target = 1, + }, +}) + + +awards.register_award("whynot_plow_soil",{ + title = S("Plow soil"), + description = S("To grow your own food, you must first plow soil. Make sure to be close to water so that the crops can grow."), + icon = awards_combine_with_frame("farming_tool_stonehoe.png"), + requires = {"whynot_tools", "whynot_gatherfruitvegetable"}, + trigger = { + type = "plow_soil", + target = 1, + }, +}) + + +awards.register_award("whynot_plant_crops",{ + title = S("Plant crops"), + description = S("After your garden is prepared and plowed, it is time to plant. Find different crops and seeds and plant them in your garden to become self sufficient."), + icon = awards_combine_with_frame("farming_tool_stonehoe.png"), + requires = {"whynot_plow_soil"}, + trigger = { + type = "plant_crops", + target = 3, + }, +}) + + +awards.register_award("whynot_bones",{ + title = S("Grave digger"), + description = S("Dig dirt to find bones."), + icon = awards_combine_with_frame("bonemeal_bone.png"), + trigger = { + type = "collect", + item = "bonemeal:bone", + target = 1, + }, +}) + + +awards.register_award("whynot_cotton", { + title = S("Collect cotton"), + description = S("Wild cotton can be found the savanna. Alternatively you can plant, grow and harvest seeds found in the jungle."), + icon = awards_combine_with_frame("farming_cotton.png"), + trigger = { + type = "collect", + item = "farming:cotton", + target = 1 + } +}) + + +awards.register_award("whynot_wool", { + title = S("Craft wool"), + description = S("Wool is a very useful material for crafting garments, beds, and many other items."), + icon = awards_combine_with_frame(minetest.inventorycube("wool_white.png")), + requires = {"whynot_cotton"}, + trigger = { + type = "craft", + item = "group:wool", + target = 1 + } +}) + + +awards.register_award("whynot_backpack", { + title = S("Craft a backpack"), + description = S("Backpacks are very useful to help carry more stuff than the basic inventory lets you. It allows you keep mining longer and carry extra tools and food everywhere you go. Use dyed wools to create different coloured ones."), + icon = awards_combine_with_frame(minetest.inventorycube("wool_white.png", "wool_white.png^backpacks_backpack_front.png", "wool_white.png")), + requires = {"whynot_wool"}, + trigger = { + type = "craft", + item = "group:backpack", + target = 1 + } +}) + + +awards.register_award("whynot_spawnpoint", { + title = S("Find your new home"), + description = S("Your home is the place with your bed. If you sleep once in bed, you always respawn at this position in case of death."), + icon = awards_combine_with_frame("beds_bed.png"), + requires = {"whynot_planks", "whynot_wool"}, +-- prices = { }, -- Price is a new home ;-) +-- on_unlock = function(name, def) end +}) + +if minetest.get_modpath("beds") and minetest.global_exists("beds") then + local orig_beds_on_rightclick = beds.on_rightclick + function beds.on_rightclick(pos, player) + orig_beds_on_rightclick(pos, player) + local player_name = player:get_player_name() + if beds.player[player_name] then + awards.unlock(player_name, "whynot_spawnpoint") + end + end +end + + +awards.register_award("whynot_stone",{ + title = S("Mine stone"), + description = S("Using a wood pick axe, start digging through stone. The cobblestone obtained from digging stone can then be used to craft sturdier tools."), + icon = awards_combine_with_frame(minetest.inventorycube("default_cobble.png")), + requires = {"whynot_tools"}, + trigger = { + type = "dig", + node = "group:stone", + target = 1, + }, +}) + + +awards.register_award("whynot_coal",{ + title = S("Mine coal"), + description = S("Coal is a common mineral found underground. Among other things, it can be used to craft torches for lighting your way, or as combustible in furnaces."), + icon = awards_combine_with_frame(minetest.inventorycube("default_stone.png^default_mineral_coal.png")), + requires = {"whynot_tools"}, + trigger = { + type = "dig", + node = "default:stone_with_coal", + target = 1, + }, +}) + + +awards.register_award("whynot_campfire", { + title = S("Craft a campfire"), + description = S("If night falls and you have not found coal, build a campfire to make some light."), + icon = awards_combine_with_frame("3,3=fire_basic_flame.png^[resize:82x82", "3,66=default_gravel.png^[resize:82x82"), + requires = {"whynot_stone"}, + trigger = { + type = "craft", + item = "campfire:campfire", + target = 1 + } +}) + + +awards.register_award("whynot_furnace", { + title = S("Craft a furnace"), + description = S("Furnaces are central to advancing in this game. Use them to smelt ores, cook food, or both!"), + icon = awards_combine_with_frame(minetest.inventorycube("default_furnace_top.png", "default_furnace_front.png","default_furnace_side.png")), + requires = {"whynot_stone"}, + trigger = { + type = "craft", + item = "default:furnace", + target = 1 + } +}) + + +awards.register_award("whynot_max_depth", { + title = S("Dig deeper"), + description = S("Keep digging until you reach these depths."), + icon = awards_combine_with_frame("3,3=whynot_awards_arrow.png^[resize:82x82^[transformR270", "25,25=default_tool_diamondpick.png^[resize:36x36"), + requires = {"whynot_stone"}, + trigger = { + type = "max", + max_param = "depth", + target = 2000, + }, +}) + + +awards.register_award("whynot_max_altitude", { + title = S("Fly higher"), + description = S("Fly higher and soar to new heights"), + icon = awards_combine_with_frame("3,3=whynot_awards_arrow.png^[resize:82x82^[transformR90", "25,25=supercub.png^[resize:36x36"), + requires = {}, + trigger = { + type = "max", + max_param = "altitude", + target = 2000, + }, +}) + + +awards.register_award("whynot_max_distance", { + title = S("Travel further"), + description = S("Sail the high seas and and explore lands far far away."), + icon = awards_combine_with_frame("3,3=whynot_awards_arrow.png^[resize:82x82", "22,22=boats_inventory.png^[resize:40x40"), + requires = {"whynot_simple_boat"}, + trigger = { + type = "max", + max_param = "distance", + target = 2000, + }, +}) + + +awards.register_award("whynot_chocolate", { + title = S("Craft chocolate"), + description = S("Make some delicious chocolate. It can be eaten or incorporated in various recipes to make succulent treats. You can even build an edible armour from it!"), + icon = awards_combine_with_frame("farming_chocolate_dark.png"), + requires = {"whynot_furnace"}, + trigger = { + type = "craft", + item = "farming:chocolate_dark", + target = 1 + } +}) + + +awards.register_award("whynot_well", { + title = S("Craft a well"), + description = S("Wells are not just pretty! They are very useful as an infinite source of water."), + icon = awards_combine_with_frame("homedecor_well_inv.png"), + requires = {"whynot_stone"}, + trigger = { + type = "craft", + item = "homedecor:well", + target = 1 + } +}) + + +awards.register_award("whynot_mine_tin", { + title = S("Mine tin"), + description = S("Tin is one of the first metal you'll encounter when digging down. Smelt it in a furnace to form ingots. Then combine it with copper to make bronze."), + icon = awards_combine_with_frame(minetest.inventorycube("default_stone.png^default_mineral_tin.png")), + requires = {"whynot_stone"}, + trigger = { + type = "dig", + item = "default:stone_with_tin", + target = 1 + } +}) + + +awards.register_award("whynot_mine_copper", { + title = S("Mine copper"), + description = S("Copper is one of the first metal you'll encounter when digging down. Smelt it in a furnace to form ingots. Then combine it with tin to make bronze."), + icon = awards_combine_with_frame(minetest.inventorycube("default_stone.png^default_mineral_copper.png")), + requires = {"whynot_stone"}, + trigger = { + type = "dig", + item = "default:stone_with_copper", + target = 1 + } +}) + + +awards.register_award("whynot_bronze", { + title = S("Craft bronze"), + description = S("Bronze is the first versatile metal you'll be able to use to craft better tools, armor and other items."), + icon = awards_combine_with_frame("default_bronze_ingot.png"), + requires = {"whynot_mine_copper", "whynot_mine_tin", "whynot_furnace"}, + trigger = { + type = "craft", + item = "default:bronze_ingot", + target = 1 + } +}) + + +awards.register_award("whynot_steel", { + title = S("Craft steel"), + description = S("Steel is stronger than bronze. Use it to upgrade your tools and armor."), + icon = awards_combine_with_frame("default_steel_ingot.png"), + requires = {"whynot_furnace"}, + trigger = { + type = "craft", + item = "default:steel_ingot", + target = 1 + } +}) + + +awards.register_award("whynot_supercub", { + title = S("Craft an airplane"), + description = S("Why not have airplanes? Build a Supercub and travel at high speeds and soar to new heights!"), + icon = awards_combine_with_frame("supercub.png"), + requires = {"whynot_bronze", "whynot_steel", "awards_diamond_ore"}, + trigger = { + type = "craft", + item = "supercub:supercub", + target = 1 + } +}) \ No newline at end of file diff --git a/mods/libs/whynot_awards/locale/template.txt b/mods/libs/whynot_awards/locale/template.txt new file mode 100644 index 00000000..cc8e6f14 --- /dev/null +++ b/mods/libs/whynot_awards/locale/template.txt @@ -0,0 +1,85 @@ +# textdomain: whynot_awards +@1/@2 collected= +Collect: @2= +Collect: @1×@2= +Collect @1 items.= +@1/@2 eaten= +Eat @2 wild food= +Eat @1×@2 different wild foods= +@1/@2 reached= +Reach @2= +Reach @1 @2= +@1/@2 grains found= +Find @2 wild seed= +Find @1×@2 different wild seeds= +@1/@2 fruits and vegetables found= +Find @2 fruit or vegetable= +Find @1×@2 different fruits and vegetables= +@1/@2 plowed squares of soil= +Plow @2 square of soil= +Plow @1×@2 squares of soil= +@1/@2 different crop types planted= +Planted @2 crop= +Planted @1×@2 different types of crops= +Welcome to the WhyNot? game= +You are embarking on a Minetest journey. Whether it's for the thrill of survival, the satisfaction of exploration, or the arts of crafting and creative designs, we hope you will find it enjoyable.@n@nMake sure to check your recipe book, awards or the help button in your inventory for more information and guidance.= +Gather and eat wild foodstuff= +You need to eat to survive. The easiest food to find are wild mushrooms, blueberries and apples. Find and eat one of each to help secure your survival.= +Gather wild seeds= +Harvesting various types of grass can sometimes give you seeds. These seeds can the be planted and farmed for food and materials.= +Gather wild fruits and vegetables= +More common in temperate regions, but also found in various climates, wild fruits and vegetables can be harvested. Use them for food, or re-plant them as crops for agriculture.= +Cut a tree= +Cut down a tree, karate-style.= +Craft planks= +Chop some wood to make planks.= +Craft a raft= +A simple boat will let you travel on water faster than walking on ground.= +Craft a chest= +Chests are the most basic form of storage. They are very useful to gather more items than can fit in your character's inventory.= +Craft sticks= +Split planks to make sticks.= +Craft wood tools= +The first tools you can craft are made of wood. They are not very strong or durable, but will enable you to start mining rock and minerals to move up to better ones.= +Plow soil= +To grow your own food, you must first plow soil. Make sure to be close to water so that the crops can grow.= +Plant crops= +After your garden is prepared and plowed, it is time to plant. Find different crops and seeds and plant them in your garden to become self sufficient.= +Grave digger= +Dig dirt to find bones.= +Collect cotton= +Wild cotton can be found the savanna. Alternatively you can plant, grow and harvest seeds found in the jungle.= +Craft wool= +Wool is a very useful material for crafting garments, beds, and many other items.= +Craft a backpack= +Backpacks are very useful to help carry more stuff than the basic inventory lets you. It allows you keep mining longer and carry extra tools and food everywhere you go. Use dyed wools to create different coloured ones.= +Find your new home= +Your home is the place with your bed. If you sleep once in bed, you always respawn at this position in case of death.= +Mine stone= +Using a wood pick axe, start digging through stone. The cobblestone obtained from digging stone can then be used to craft sturdier tools.= +Mine coal= +Coal is a common mineral found underground. Among other things, it can be used to craft torches for lighting your way, or as combustible in furnaces.= +Craft a campfire= +If night falls and you have not found coal, build a campfire to make some light.= +Craft a furnace= +Furnaces are central to advancing in this game. Use them to smelt ores, cook food, or both!= +Dig deeper= +Keep digging until you reach these depths.= +Fly higher= +Fly higher and soar to new heights= +Travel further= +Sail the high seas and and explore lands far far away.= +Craft chocolate= +Make some delicious chocolate. It can be eaten or incorporated in various recipes to make succulent treats. You can even build an edible armour from it!= +Craft a well= +Wells are not just pretty! They are very useful as an infinite source of water.= +Mine tin= +Tin is one of the first metal you'll encounter when digging down. Smelt it in a furnace to form ingots. Then combine it with copper to make bronze.= +Mine copper= +Copper is one of the first metal you'll encounter when digging down. Smelt it in a furnace to form ingots. Then combine it with tin to make bronze.= +Craft bronze= +Bronze is the first versatile metal you'll be able to use to craft better tools, armor and other items.= +Craft steel= +Steel is stronger than bronze. Use it to upgrade your tools and armor.= +Craft an airplane= +Why not have airplanes? Build a Supercub and travel at high speeds and soar to new heights!= diff --git a/mods/libs/whynot_awards/locale/whynot_awards.fr.tr b/mods/libs/whynot_awards/locale/whynot_awards.fr.tr new file mode 100644 index 00000000..56671a6d --- /dev/null +++ b/mods/libs/whynot_awards/locale/whynot_awards.fr.tr @@ -0,0 +1,85 @@ +# textdomain: whynot_awards +@1/@2 collected=@1/@2 collectés +Collect: @2=Collecte: @2 +Collect: @1×@2=Collecter : @1×@2 +Collect @1 items.=Recueillir @1 articles. +@1/@2 eaten=@1/@2 mangé(s) +Eat @2 wild food=Manger @2 aliments sauvages +Eat @1×@2 different wild foods=Manger @1×@2 différents aliments sauvages +@1/@2 reached=@1/@2 atteint +Reach @2=Atteindre @2 +Reach @1 @2=Atteindre @1 @2 +@1/@2 grains found=@1/@2 grains trouvés +Find @2 wild seed=Trouver @2 graines sauvages +Find @1×@2 different wild seeds=Trouver @1×@2 différentes graines sauvages +@1/@2 fruits and vegetables found=@1/@2 fruits et légumes trouvés +Find @2 fruit or vegetable=Trouver @2 fruits ou légumes +Find @1×@2 different fruits and vegetables=Trouver @1×@2 différents fruits et légumes +@1/@2 plowed squares of soil=@1/@2 carrés labourés de sol +Plow @2 square of soil=Laboure @2 carré de sol +Plow @1×@2 squares of soil=Laboure @1×@2 carrés de sol +@1/@2 different crop types planted=@1/@2 différents types de cultures plantées +Planted @2 crop=Planté @2 culture +Planted @1×@2 different types of crops=Planté @1×@2 différents types de cultures +Welcome to the WhyNot? game=Bienvenue au jeu WhyNot? +You are embarking on a Minetest journey. Whether it's for the thrill of survival, the satisfaction of exploration, or the arts of crafting and creative designs, we hope you will find it enjoyable.@n@nMake sure to check your recipe book, awards or the help button in your inventory for more information and guidance.=Vous partez à l'aventure dans Minetest. Que ce soit pour le plaisir de la survie, la satisfaction de l'exploration ou les arts de l'artisanat et des designs créatifs, nous espérons que vous le trouverez agréable. @n@nAssurez-vous de vérifier votre carnet de recettes, les trophés ou le bouton d'aide dans votre sac pour plus d'informations et de conseils. +Gather and eat wild foodstuff=Rassembler et manger des aliments sauvages +You need to eat to survive. The easiest food to find are wild mushrooms, blueberries and apples. Find and eat one of each to help secure your survival.=Tu dois manger pour survivre. La nourriture la plus facile à trouver sont les champignons sauvages, les bleuets et les pommes. Trouvez et mangez un de chacun pour assurer votre survie. +Gather wild seeds=Recueillir des graines sauvages +Harvesting various types of grass can sometimes give you seeds. These seeds can the be planted and farmed for food and materials.=Récolter divers types d'herbe peut parfois vous donner des graines. Ces graines peuvent être plantées et cultivées pour des aliments ou des matériaux. +Gather wild fruits and vegetables=Recueillir des fruits et légumes sauvages +More common in temperate regions, but also found in various climates, wild fruits and vegetables can be harvested. Use them for food, or re-plant them as crops for agriculture.=Plus commun dans les régions tempérées, mais aussi dans divers climats, les fruits et légumes sauvages peuvent être récoltés. Utilisez-les pour la nourriture, ou replantez-les pour faire de l'agriculture. +Cut a tree=Couper un arbre +Cut down a tree, karate-style.=Coupez un arbre, style karaté. +Craft planks=Fabriquer des planches de bois +Chop some wood to make planks.=Coupez du bois pour faire des planches. +Craft a raft=Fabriquer un radeau +A simple boat will let you travel on water faster than walking on ground.=Un radeau vous permettra de voyager sur l'eau plus rapidement que de marcher. +Craft a chest=Fabriquer un coffre +Chests are the most basic form of storage. They are very useful to gather more items than can fit in your character's inventory.=Les coffres sont la forme la plus fondamentale de stockage. Ils sont très utiles pour rassembler plus d'éléments que peut intégrer dans le sac de votre personnage. +Craft sticks=Fabriquer des bâtons +Split planks to make sticks.=Séparez les planches pour faire des bâtons. +Craft wood tools=Fabriquer des outils de bois +The first tools you can craft are made of wood. They are not very strong or durable, but will enable you to start mining rock and minerals to move up to better ones.=Les premiers outils que vous pouvez fabriquer sont en bois. Ils ne sont pas très forts ni durables, mais vous permettront de creuser la roche et les minéraux pour passer à de meilleurs outils. +Plow soil=Labourer le sol +To grow your own food, you must first plow soil. Make sure to be close to water so that the crops can grow.=Pour cultiver votre propre nourriture, vous devez d'abord labourer le sol. Assurez-vous d'être proche de l'eau pour que les cultures puissent croître. +Plant crops=Cultiver +After your garden is prepared and plowed, it is time to plant. Find different crops and seeds and plant them in your garden to become self sufficient.=Après que votre jardin soit préparé et labouré, il est temps de planter. Trouvez différentes cultures et graines et les planter dans votre jardin pour devenir autonome. +Grave digger=Fossoyeur +Dig dirt to find bones.=Creuse la terre pour trouver des os. +Collect cotton=Recueillir du coton +Wild cotton can be found the savanna. Alternatively you can plant, grow and harvest seeds found in the jungle.=Le coton sauvage se trouve dans la savane. Vous pouvez également planter, cultiver et récolter des graines dans la jungle. +Craft wool=Fabriquer de la laine +Wool is a very useful material for crafting garments, beds, and many other items.=La laine est un matériau très utile pour l'artisanat des vêtements, des lits et beaucoup d'autres articles. +Craft a backpack=Fabriquer un sac à dos +Backpacks are very useful to help carry more stuff than the basic inventory lets you. It allows you keep mining longer and carry extra tools and food everywhere you go. Use dyed wools to create different coloured ones.=Les sacs à dos sont très utiles pour transporter plus de choses que le sac principal de base vous permet. Il vous permettra de continuer à creuser plus longtemps et de porter des outils et des aliments supplémentaires partout où vous allez. Utilisez de la laine teintée pour créer des sacs de couleurs différentes. +Find your new home=Trouvez votre nouvelle maison +Your home is the place with your bed. If you sleep once in bed, you always respawn at this position in case of death.=Votre maison est l'endroit avec votre lit. Si vous dormez une fois dans un lit, vous vous retrouvez toujours dans cet endroit en cas de décès. +Mine stone=Creuser de la roche +Using a wood pick axe, start digging through stone. The cobblestone obtained from digging stone can then be used to craft sturdier tools.=En utilisant une pioche de bois, commencez à creuser la pierre. Le pavé obtenu de la pierre creusé peut ensuite être utilisé pour fabriquer des outils plus robustes. +Mine coal=Miner du charbon +Coal is a common mineral found underground. Among other things, it can be used to craft torches for lighting your way, or as combustible in furnaces.=Le charbon est un minerais commun trouvé sous terre. Entre autres, il peut être utilisé pour fabriquer des torches pour éclairer votre chemin, ou comme combustible dans les fours. +Craft a campfire=Faire un feu de camp +If night falls and you have not found coal, build a campfire to make some light.=Si la nuit tombe et que vous n'avez pas trouvé de charbon, construisez un feu de camp pour faire de la lumière. +Craft a furnace=Construire un fourneau +Furnaces are central to advancing in this game. Use them to smelt ores, cook food, or both!=Les fourneaux sont primordial pour avancer dans ce jeu. Utilisez-les pour faire fondre les minerais, cuisiner ou les deux! +Dig deeper=Creuser plus creux +Keep digging until you reach these depths.=Continuez à creuser jusqu'à atteindre ces profondeurs. +Fly higher=Voler plus haut +Fly higher and soar to new heights=Volez plus haut et atteignez de nouvelles hauteurs +Travel further=Voyager plus loin +Sail the high seas and and explore lands far far away.=Naviguez la mer et explorez les terres lointaines. +Craft chocolate=Fabriquer du chocolat +Make some delicious chocolate. It can be eaten or incorporated in various recipes to make succulent treats. You can even build an edible armour from it!=Faites du délicieux chocolat. Il peut être consommé ou incorporé dans diverses recettes pour faire des friandises succulentes. Vous pouvez même en construire une armure comestible ! +Craft a well=Fabriquer un puit +Wells are not just pretty! They are very useful as an infinite source of water.=Les puits ne sont pas juste jolies ! Ils sont très utiles comme une source d'eau infinie. +Mine tin=Miner de l'étain +Tin is one of the first metal you'll encounter when digging down. Smelt it in a furnace to form ingots. Then combine it with copper to make bronze.=L'étain est l'un des premiers métaux que vous rencontrerez quand vous creuserez. Faites-le fondre dans une fournaise pour en faire des lingots. Puis combinez-le avec du cuivre pour faire du bronze. +Mine copper=Miner du cuivre +Copper is one of the first metal you'll encounter when digging down. Smelt it in a furnace to form ingots. Then combine it with tin to make bronze.=Le cuivre est l'un des premiers métaux que vous rencontrerez quand vous creuserez. Faites-le fondre dans une fournaise pour faire des lingots. Puis combinez-le avec l'étain pour faire du bronze. +Craft bronze=Fabriquer du bronze +Bronze is the first versatile metal you'll be able to use to craft better tools, armor and other items.=Le bronze est le premier métal polyvalent que vous pourrez utiliser pour fabriquer de meilleurs outils, armure et autres articles. +Craft steel=Frabriquer de l'acier +Steel is stronger than bronze. Use it to upgrade your tools and armor.=L'acier est plus fort que le bronze. Utilisez-le pour mettre à niveau vos outils et votre armure. +Craft an airplane=Fabriquer un avion +Why not have airplanes? Build a Supercub and travel at high speeds and soar to new heights!=Pourquoi pas des avions ? Construisez un Supercub pour voyagez à haute vitesse et atteindre de nouvelles hauteurs! diff --git a/mods/libs/whynot_awards/mod.conf b/mods/libs/whynot_awards/mod.conf new file mode 100644 index 00000000..cdbd88c9 --- /dev/null +++ b/mods/libs/whynot_awards/mod.conf @@ -0,0 +1,3 @@ +name = whynot_awards +depends = awards +optional_depends = default, beds, farming, bonemeal, backpacks, campfire, homedecor, supercub, mtg_plus \ No newline at end of file diff --git a/mods/libs/whynot_awards/textures/whynot_awards_arrow.png b/mods/libs/whynot_awards/textures/whynot_awards_arrow.png new file mode 100644 index 00000000..d4c31c18 Binary files /dev/null and b/mods/libs/whynot_awards/textures/whynot_awards_arrow.png differ diff --git a/mods/libs/whynot_awards/textures/whynot_awards_frame.png b/mods/libs/whynot_awards/textures/whynot_awards_frame.png new file mode 100644 index 00000000..e486871c Binary files /dev/null and b/mods/libs/whynot_awards/textures/whynot_awards_frame.png differ diff --git a/mods/player/awards/src/gui.lua b/mods/player/awards/src/gui.lua index 16bfd61e..15b49293 100644 --- a/mods/player/awards/src/gui.lua +++ b/mods/player/awards/src/gui.lua @@ -45,7 +45,7 @@ function awards.get_formspec(name, to, sid) ";]" if sdef and sdef.icon then - formspec = formspec .. "image[0.45,0;3.5,3.5;" .. sdef.icon .. "]" -- adjusted values from 0.6,0;3,3 + formspec = formspec .. "image[0.45,0;3.5,3.5;" .. minetest.formspec_escape(sdef.icon) .. "]" -- adjusted values from 0.6,0;3,3 end if sitem.progress then diff --git a/private/awards_graph.dia b/private/awards_graph.dia new file mode 100644 index 00000000..fc41347c --- /dev/null +++ b/private/awards_graph.dia @@ -0,0 +1,2480 @@ + + + + + + + + + + + + + #A4# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Cut a tree# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Gather cotton (savanah, +rainforest/jungle, hemp)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Gather food +(fruits or vegetables)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Make planks# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Make sticks# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Sleep in bed# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Till ground# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Plant grains, fruits +and vegetables# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Gather grains +(grass=barley,wheat,oats)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Make wood tools# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Mine stone# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Mine coal# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Make torch# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #First harvest# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Make furnace# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Build boat# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Build chest# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Smelt bronze# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Mine tin# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Mine copper# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Smelt iron# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Mine diamond# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Craft wool# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Craft backpack# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Reach 2000 depth# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Reach floating islands +(2000 altitude)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Leave the nest +(2000 from spawn)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Build supercub plane# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Make chocolate# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Build a campfire# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Build a well# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/private/awards_graph.pdf b/private/awards_graph.pdf new file mode 100644 index 00000000..8d74a1af Binary files /dev/null and b/private/awards_graph.pdf differ