Compare commits

...

5 Commits

Author SHA1 Message Date
Wuzzy 767eb58b95 Version 3.3.0 2022-08-03 09:43:34 +02:00
Wuzzy 3bcaab4da2 Update mod names in README 2022-08-02 15:54:48 +02:00
Wuzzy 27edb029ca Fix spawning of infinite rocks 2022-08-02 15:51:27 +02:00
Wuzzy cb1cee225c Rename mod: mpd → tutorial_music 2022-08-02 15:36:13 +02:00
Wuzzy 288ec1a5da Rename mod: supplemental → tutorial_supplemental 2022-08-02 15:28:27 +02:00
42 changed files with 158 additions and 130 deletions

View File

@ -2,7 +2,7 @@
Created by Wuzzy
Version: 3.2.0
Version: 3.3.0
Playable in Minetest 5.5.0 or later.
Learn how to use and play Minetest in a nice and cozy castle. Here you learn most of the basics of Minetest and how to play.
@ -61,7 +61,7 @@ There's also a secret prize, can you win it?
## Legalities
This tutorial is free software. You can legally study, copy, share, transform, remix, distribute this to your liking, under certain conditions.
The mods “`tutorial`” and “supplemental” as well the tutorial world are original work by Wuzzy and fall under the MIT License.
The mods “`tutorial`” and “`tutorial_supplemental`” as well the tutorial world are original work by Wuzzy and fall under the MIT License.
The mod “`tutorial_mapgen`” (Tutorial World generator) is also original work by Wuzzy, same license, but it contains contributions.
Contributions:
@ -71,15 +71,15 @@ Contributions:
Other mods are creation by other people, but heavily modified to fit the Tutorial's needs.
The mods “`default`” and “`creative`” falls under the GNU LGPLv2.1 for the code and the CC BY-SA 3.0 for artwork.
The mod “`darkage`” falls under the MIT License.
The mod “`mpd`” falls under the MIT License for the code and the CC BY 3.0 for the music.
The mod “`castle`” falls under the MIT License (the author allowed me an exception).
The mod “`arrow_signs`” falls under the CC BY-SA 3.0.
The mod “`areas`” falls under the GNU LGPLv2.1 (or later).
The mod “`cottages`” falls under the GNU GPLv2 (the author allowed me an exception).
The mods “`tutorial_default`” and “`tutorial_creative`” falls under the GNU LGPLv2.1 for the code and the CC BY-SA 3.0 for artwork.
The mod “`tutorial_darkage`” falls under the MIT License.
The mod “`tutorial_music`” falls under the MIT License for the code and the CC BY 3.0 for the music.
The mod “`tutorial_castle`” falls under the MIT License (the author allowed me an exception).
The mod “`tutorial_arrow_signs`” falls under the CC BY-SA 3.0.
The mod “`tutorial_areas`” falls under the GNU LGPLv2.1 (or later).
The mod “`tutorial_cottages`” falls under the GNU GPLv2 (the author allowed me an exception).
The mod “`show_wielded_item`” is licensed under the GNU LGPLv2 or later.
The mod “`supplemental`” falls under the MIT License, with one exception:
The mod “`tutorial_supplemental`” falls under the MIT License, with one exception:
The texture `supplemental_loudspeaker.png` falls under the CC BY-SA 3.0 (from the developers of the Mesecons mod).
Everything else falls under the MIT License.

View File

@ -1 +0,0 @@
name = mpd

View File

@ -1,3 +0,0 @@
name = supplemental
depends = tutorial_default, mpd
optional_depends = intllib

View File

@ -1181,9 +1181,13 @@ minetest.register_node("tutorial:itemspawner", {
local offset = minetest.string_to_pos(meta:get_string("offset"))
local itemstring = meta:get_string("itemstring")
local alias = minetest.registered_aliases[itemstring]
local test_item = ItemStack(itemstring)
local test_itemname = test_item:get_name()
local alias = minetest.registered_aliases[test_itemname]
local itemname
if alias then
itemstring = alias
test_item:set_name(alias)
itemstring = test_item:to_string()
end
local x, y, z = offset.x, offset.y, offset.z
local spawnpos = {x=pos.x+x, y=pos.y+y, z=pos.z+z}
@ -1191,7 +1195,9 @@ minetest.register_node("tutorial:itemspawner", {
for o=1, #objs do
local ent = objs[o]:get_luaentity()
if ent then
if ent.name == "__builtin:item" and ent.itemstring == itemstring then
local ent_itemstack = ItemStack(ent.itemstring)
local itemstack = ItemStack(itemstring)
if ent.name == "__builtin:item" and ent_itemstack:get_name() == itemstack:get_name() then
-- Remove node when item was spawned successfully.
-- So it doesn't get in the way.
minetest.remove_node(pos)

View File

@ -28,7 +28,7 @@ function default.get_hotbar_bg(x,y)
end
local music = ""
if minetest.get_modpath("mpd") then
if minetest.get_modpath("tutorial_music") then
music = "button[-0.1,0.7;3,1;togglemusic;"..minetest.formspec_escape(S("Toggle music")).."]"
end

View File

@ -1,2 +1,2 @@
name = tutorial_default
optional_depends = intllib
optional_depends = intllib, tutorial_music

View File

@ -1,46 +1,46 @@
mpd={}
tutorial_music={}
--config
mpd.pause_between_songs=7
tutorial_music.pause_between_songs=7
--end config
mpd.modpath=minetest.get_modpath("mpd")
if not mpd.modpath then
error("mpd mod folder has to be named 'mpd'!")
tutorial_music.modpath=minetest.get_modpath("tutorial_music")
if not tutorial_music.modpath then
error("mod folder has to be named 'tutorial_music'!")
end
--{name, length, gain~1}
mpd.songs = {}
local sfile, sfileerr=io.open(mpd.modpath.."/songs.txt")
tutorial_music.songs = {}
local sfile, sfileerr=io.open(tutorial_music.modpath.."/songs.txt")
if not sfile then error("Error opening songs.txt: "..sfileerr) end
for line in sfile:lines() do
if line~="" and line[1]~="#" then
local name, timeMinsStr, timeSecsStr, gainStr = string.match(line, "^(%S+)%s+(%d+):([%d%.]+)%s+([%d%.]+)$")
local timeMins, timeSecs, gain = tonumber(timeMinsStr), tonumber(timeSecsStr), tonumber(gainStr)
if name and timeMins and timeSecs and gain then
mpd.songs[#mpd.songs+1]={name=name, length=timeMins*60+timeSecs, lengthhr=timeMinsStr..":"..timeSecsStr, gain=gain}
tutorial_music.songs[#tutorial_music.songs+1]={name=name, length=timeMins*60+timeSecs, lengthhr=timeMinsStr..":"..timeSecsStr, gain=gain}
else
minetest.log("warning", "[mpd] Misformatted song entry in songs.txt: "..line)
minetest.log("warning", "[tutorial_music] Misformatted song entry in songs.txt: "..line)
end
end
end
sfile:close()
if #mpd.songs==0 then
print("[mpd]no songs registered, not doing anything")
if #tutorial_music.songs==0 then
minetest.log("error", "[tutorial_music] no songs registered, not doing anything")
return
end
mpd.storage = minetest.get_mod_storage()
tutorial_music.storage = minetest.get_mod_storage()
mpd.handles={}
tutorial_music.handles={}
mpd.playing=false
mpd.id_playing=nil
mpd.song_time_left=nil
mpd.time_next=10 --sekunden
mpd.id_last_played=nil
tutorial_music.playing=false
tutorial_music.id_playing=nil
tutorial_music.song_time_left=nil
tutorial_music.time_next=10 --sekunden
tutorial_music.id_last_played=nil
minetest.register_on_joinplayer(function(player)
local meta = player:get_meta()
@ -52,131 +52,131 @@ minetest.register_on_joinplayer(function(player)
play = false
end
if play then
mpd.next_song()
tutorial_music.next_song()
else
mpd.stop_song()
tutorial_music.stop_song()
end
end)
minetest.register_globalstep(function(dtime)
if mpd.playing then
if mpd.song_time_left<=0 then
mpd.stop_song()
mpd.time_next=mpd.pause_between_songs
if tutorial_music.playing then
if tutorial_music.song_time_left<=0 then
tutorial_music.stop_song()
tutorial_music.time_next=tutorial_music.pause_between_songs
else
mpd.song_time_left=mpd.song_time_left-dtime
tutorial_music.song_time_left=tutorial_music.song_time_left-dtime
end
elseif mpd.time_next then
if mpd.time_next<=0 then
mpd.next_song()
elseif tutorial_music.time_next then
if tutorial_music.time_next<=0 then
tutorial_music.next_song()
else
mpd.time_next=mpd.time_next-dtime
tutorial_music.time_next=tutorial_music.time_next-dtime
end
end
end)
mpd.play_song=function(id)
if mpd.playing then
mpd.stop_song()
tutorial_music.play_song=function(id)
if tutorial_music.playing then
tutorial_music.stop_song()
end
local song=mpd.songs[id]
local song=tutorial_music.songs[id]
if not song then return end
for _,player in ipairs(minetest.get_connected_players()) do
local pname=player:get_player_name()
local pvolume=tonumber(mpd.storage:get_string("vol_"..pname))
local pvolume=tonumber(tutorial_music.storage:get_string("vol_"..pname))
if not pvolume then pvolume=1 end
if pvolume>0 then
local handle = minetest.sound_play(song.name, {to_player=pname, gain=song.gain*pvolume})
if handle then
mpd.handles[pname]=handle
tutorial_music.handles[pname]=handle
end
end
end
mpd.playing=id
tutorial_music.playing=id
--adding 2 seconds as security
mpd.song_time_left = song.length + 2
tutorial_music.song_time_left = song.length + 2
end
mpd.stop_song=function()
for pname, handle in pairs(mpd.handles) do
tutorial_music.stop_song=function()
for pname, handle in pairs(tutorial_music.handles) do
minetest.sound_stop(handle)
end
mpd.id_last_played=mpd.playing
mpd.playing=nil
mpd.handles={}
mpd.time_next=nil
tutorial_music.id_last_played=tutorial_music.playing
tutorial_music.playing=nil
tutorial_music.handles={}
tutorial_music.time_next=nil
end
mpd.next_song=function()
tutorial_music.next_song=function()
local next
repeat
next=math.random(1,#mpd.songs)
until #mpd.songs==1 or next~=mpd.id_last_played
mpd.play_song(next)
next=math.random(1,#tutorial_music.songs)
until #tutorial_music.songs==1 or next~=tutorial_music.id_last_played
tutorial_music.play_song(next)
end
mpd.song_human_readable=function(id)
local song=mpd.songs[id]
tutorial_music.song_human_readable=function(id)
local song=tutorial_music.songs[id]
return id..": "..song.name.." ["..song.lengthhr.."]"
end
minetest.register_privilege("mpd", "may control the music player daemon (mpd) mod")
minetest.register_privilege("mpd", "May control the music")
minetest.register_chatcommand("mpd_stop", {
minetest.register_chatcommand("music_stop", {
params = "",
description = "Stop the song currently playing",
privs = {mpd=true},
func = function(name, param)
local player = minetest.get_player_by_name(name)
player:get_meta():set_string("play_music", "0")
mpd.stop_song()
tutorial_music.stop_song()
end,
})
minetest.register_chatcommand("mpd_list", {
minetest.register_chatcommand("music_list", {
params = "",
description = "List all available songs and their IDs",
privs = {mpd=true},
func = function(name, param)
for k,v in ipairs(mpd.songs) do
minetest.chat_send_player(name, mpd.song_human_readable(k))
for k,v in ipairs(tutorial_music.songs) do
minetest.chat_send_player(name, tutorial_music.song_human_readable(k))
end
end,
})
minetest.register_chatcommand("mpd_play", {
minetest.register_chatcommand("music_play", {
params = "<id>",
description = "Play the songs with the given ID (see ids with /mpd_list)",
description = "Play the songs with the given ID (see IDs with /music_list)",
privs = {mpd=true},
func = function(name, param)
id=tonumber(param)
if id and id>0 and id<=#mpd.songs then
if id and id>0 and id<=#tutorial_music.songs then
local player = minetest.get_player_by_name(name)
player:get_meta():set_string("play_music", "1")
mpd.play_song(id)
return true,"Playing: "..mpd.song_human_readable(id)
tutorial_music.play_song(id)
return true,"Playing: "..tutorial_music.song_human_readable(id)
end
return false, "Invalid song ID!"
end,
})
minetest.register_chatcommand("mpd_what", {
minetest.register_chatcommand("music_what", {
params = "",
description = "Display the currently played song.",
privs = {mpd=true},
func = function(name, param)
if not mpd.playing then return true,"Nothing playing, "..math.floor(mpd.time_next or 0).." sec. left until next song." end
return true,"Playing: "..mpd.song_human_readable(mpd.playing).."\nTime Left: "..math.floor(mpd.song_time_left or 0).." sec."
if not tutorial_music.playing then return true,"Nothing playing, "..math.floor(tutorial_music.time_next or 0).." sec. left until next song." end
return true,"Playing: "..tutorial_music.song_human_readable(tutorial_music.playing).."\nTime left: "..math.floor(tutorial_music.song_time_left or 0).." sec."
end,
})
minetest.register_chatcommand("mpd_next", {
minetest.register_chatcommand("music_next", {
params = "[seconds]",
description = "Start the next song, either immediately (no parameters) or after n seconds.",
privs = {mpd=true},
func = function(name, param)
local player = minetest.get_player_by_name(name)
player:get_meta():set_string("play_music", "1")
mpd.stop_song()
tutorial_music.stop_song()
if param and tonumber(param) then
mpd.time_next=tonumber(param)
tutorial_music.time_next=tonumber(param)
return true,"Next song in "..param.." seconds!"
else
mpd.next_song()
tutorial_music.next_song()
return true,"Next song started!"
end
end,
@ -187,13 +187,13 @@ minetest.register_chatcommand("mvolume", {
privs = {},
func = function(pname, param)
if not param or param=="" then
local pvolume=tonumber(mpd.storage:get_string("vol_"..pname))
local pvolume=tonumber(tutorial_music.storage:get_string("vol_"..pname))
if not pvolume then pvolume=1 end
if pvolume>0 then
return true, "Your music volume is set to "..pvolume.."."
else
if mpd.handles[pname] then
minetest.sound_stop(mpd.handles[pname])
if tutorial_music.handles[pname] then
minetest.sound_stop(tutorial_music.handles[pname])
end
return true, "Background music is disabled for you. Use '/mvolume 1' to enable it again."
end
@ -204,12 +204,12 @@ minetest.register_chatcommand("mvolume", {
end
pvolume = math.min(pvolume, 1)
pvolume = math.max(pvolume, 0)
mpd.storage:set_string("vol_"..pname, pvolume)
tutorial_music.storage:set_string("vol_"..pname, pvolume)
if pvolume>0 then
return true, "Music volume set to "..pvolume..". Change will take effect when the next song starts."
else
if mpd.handles[pname] then
minetest.sound_stop(mpd.handles[pname])
if tutorial_music.handles[pname] then
minetest.sound_stop(tutorial_music.handles[pname])
end
return true, "Disabled background music for you. Use /mvol to enable it again."
end
@ -218,11 +218,11 @@ minetest.register_chatcommand("mvolume", {
minetest.register_on_player_receive_fields(function(player, formname, fields)
if(fields.togglemusic) then
if mpd.playing then
mpd.stop_song()
if tutorial_music.playing then
tutorial_music.stop_song()
player:get_meta():set_string("play_music", "0")
else
mpd.next_song()
tutorial_music.next_song()
player:get_meta():set_string("play_music", "1")
end
end

View File

@ -0,0 +1 @@
name = tutorial_music

View File

@ -1,7 +1,9 @@
### mpd Mod for Minetest
(c) 2017 orwell96
Slightly modified for the Tutorial.
### Tutorial music mod
Based on the MPD mod ((c) 2017 orwell96)
Modified for the Tutorial.
This mod is licensed under the MIT License.

View File

@ -6,7 +6,7 @@ else
S = function ( s ) return s end
end
minetest.register_node("supplemental:sticky", {
minetest.register_node("tutorial_supplemental:sticky", {
description = S("sticky stone brick"),
tiles = {"default_stone_brick.png^supplemental_splat.png",
"default_stone_brick.png", "default_stone_brick.png", "default_stone_brick.png",
@ -15,7 +15,7 @@ minetest.register_node("supplemental:sticky", {
sounds = default.node_sound_stone_defaults()
})
minetest.register_node("supplemental:bouncy", {
minetest.register_node("tutorial_supplemental:bouncy", {
description = S("bouncy block"),
tiles = {"supplemental_bouncy.png"},
groups = {creative_breakable=1, bouncy=70, fall_damage_add_percent=-100},
@ -24,22 +24,22 @@ minetest.register_node("supplemental:bouncy", {
minetest.register_node("supplemental:conglomerate", {
minetest.register_node("tutorial_supplemental:conglomerate", {
description = S("conglomerate"),
tiles = {"supplemental_conglomerate.png" },
groups = {cracky=3},
drop = { items = {
{ items={"supplemental:rock"} },
{ items={"supplemental:rock"}, rarity = 5 },
{ items={"supplemental:rock"}, rarity = 5 },
{ items={"supplemental:rock"}, rarity = 5 },
{ items={"supplemental:rock"}, rarity = 5 },
{ items={"tutorial_supplemental:rock"} },
{ items={"tutorial_supplemental:rock"}, rarity = 5 },
{ items={"tutorial_supplemental:rock"}, rarity = 5 },
{ items={"tutorial_supplemental:rock"}, rarity = 5 },
{ items={"tutorial_supplemental:rock"}, rarity = 5 },
}
},
sounds = default.node_sound_stone_defaults()
})
minetest.register_node("supplemental:frame",{
minetest.register_node("tutorial_supplemental:frame",{
description = S("picture frame"),
drawtype = "signlike",
selection_box = { type = "wallmounted" },
@ -55,7 +55,7 @@ minetest.register_node("supplemental:frame",{
sounds = default.node_sound_defaults(),
})
minetest.register_node("supplemental:spikes", {
minetest.register_node("tutorial_supplemental:spikes", {
description = S("short spikes"),
tiles = {"supplemental_spikes_small.png"},
inventory_image = "supplemental_spikes_small.png",
@ -76,7 +76,7 @@ minetest.register_node("supplemental:spikes", {
}
})
minetest.register_node("supplemental:spikes_large", {
minetest.register_node("tutorial_supplemental:spikes_large", {
description = S("long spikes"),
tiles = {"supplemental_spikes_large.png"},
inventory_image = "supplemental_spikes_large.png",
@ -96,18 +96,18 @@ local set_loudspeaker_infotext = function(pos)
meta:set_string("infotext", S("loudspeaker (rightclick to toggle music)"))
end
minetest.register_node("supplemental:loudspeaker", {
minetest.register_node("tutorial_supplemental:loudspeaker", {
description = S("loudspeaker"),
tiles = {"supplemental_loudspeaker.png"},
groups = { creative_breakable = 1 },
sounds = default.node_sound_wood_defaults(),
on_construct = set_loudspeaker_infotext,
on_rightclick = function(pos, node, clicker)
if mpd.playing then
mpd.stop_song()
if tutorial_music.playing then
tutorial_music.stop_song()
clicker:get_meta():set_string("play_music", "0")
else
mpd.next_song()
tutorial_music.next_song()
clicker:get_meta():set_string("play_music", "1")
end
end,
@ -115,50 +115,50 @@ minetest.register_node("supplemental:loudspeaker", {
})
minetest.register_abm({
nodenames = { "supplemental:loudspeaker" },
nodenames = { "tutorial_supplemental:loudspeaker" },
interval = 5,
chance = 1,
action = set_loudspeaker_infotext,
})
minetest.register_craftitem("supplemental:rock", {
minetest.register_craftitem("tutorial_supplemental:rock", {
description = S("piece of rock"),
inventory_image = "supplemental_rock.png",
})
minetest.register_craftitem("supplemental:wheat", {
minetest.register_craftitem("tutorial_supplemental:wheat", {
description = S("wheat"),
inventory_image = "supplemental_wheat.png",
})
minetest.register_craftitem("supplemental:flour", {
minetest.register_craftitem("tutorial_supplemental:flour", {
description = S("flour"),
inventory_image = "supplemental_flour.png",
})
-- Crafting example #2
minetest.register_craft({
type = "shapeless",
output = "supplemental:flour",
recipe = {"supplemental:wheat", "supplemental:wheat", "supplemental:wheat", "supplemental:wheat"}
output = "tutorial_supplemental:flour",
recipe = {"tutorial_supplemental:wheat", "tutorial_supplemental:wheat", "tutorial_supplemental:wheat", "tutorial_supplemental:wheat"}
})
-- Items for crafting examples #1, #4 and #5
minetest.register_craftitem("supplemental:paper_white", {
minetest.register_craftitem("tutorial_supplemental:paper_white", {
description = S("white sheet of paper"),
inventory_image = "default_paper.png",
groups = { paper = 1 },
})
minetest.register_craftitem("supplemental:paper_orange", {
minetest.register_craftitem("tutorial_supplemental:paper_orange", {
description = S("orange sheet of paper"),
inventory_image = "supplemental_paper_orange.png",
groups = { paper = 1 },
})
minetest.register_craftitem("supplemental:paper_purple", {
minetest.register_craftitem("tutorial_supplemental:paper_purple", {
description = S("purple sheet of paper"),
inventory_image = "supplemental_paper_purple.png",
groups = { paper = 1 },
})
minetest.register_craftitem("supplemental:paper_green", {
minetest.register_craftitem("tutorial_supplemental:paper_green", {
description = S("green sheet of paper"),
inventory_image = "supplemental_paper_green.png",
groups = { paper = 1 },
@ -176,7 +176,7 @@ minetest.register_craft({
-- 8 viscosity example liquids
for v=0,7 do
minetest.register_node("supplemental:liquid"..v, {
minetest.register_node("tutorial_supplemental:liquid"..v, {
description = string.format(S("flowing test liquid %i"), v),
inventory_image = minetest.inventorycube("supplemental_testliquid"..v..".png"),
drawtype = "flowingliquid",
@ -202,14 +202,14 @@ for v=0,7 do
drop = "",
drowning = 1,
liquidtype = "flowing",
liquid_alternative_flowing = "supplemental:liquid"..v,
liquid_alternative_source = "supplemental:liquidsource"..v,
liquid_alternative_flowing = "tutorial_supplemental:liquid"..v,
liquid_alternative_source = "tutorial_supplemental:liquidsource"..v,
liquid_viscosity = v,
groups = {not_in_creative_inventory = 1},
sounds = default.node_sound_water_defaults(),
})
minetest.register_node("supplemental:liquidsource"..v, {
minetest.register_node("tutorial_supplemental:liquidsource"..v, {
description = string.format(S("test liquid source %i"), v),
inventory_image = minetest.inventorycube("supplemental_testliquid"..v..".png"),
drawtype = "liquid",
@ -229,10 +229,30 @@ for v=0,7 do
drop = "",
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "supplemental:liquid"..v,
liquid_alternative_source = "supplemental:liquidsource"..v,
liquid_alternative_flowing = "tutorial_supplemental:liquid"..v,
liquid_alternative_source = "tutorial_supplemental:liquidsource"..v,
liquid_viscosity = v,
groups = {},
sounds = default.node_sound_water_defaults(),
})
minetest.register_alias("supplemental:liquid"..v, "tutorial_supplemental:liquid"..v)
minetest.register_alias("supplemental:liquidsource"..v, "tutorial_supplemental:liquidsource"..v)
end
minetest.register_alias("supplemental:sticky", "tutorial_supplemental:sticky")
minetest.register_alias("supplemental:bouncy", "tutorial_supplemental:bouncy")
minetest.register_alias("supplemental:conglomerate", "tutorial_supplemental:conglomerate")
minetest.register_alias("supplemental:frame", "tutorial_supplemental:frame")
minetest.register_alias("supplemental:spikes", "tutorial_supplemental:spikes")
minetest.register_alias("supplemental:spikes_large", "tutorial_supplemental:spikes_large")
minetest.register_alias("supplemental:loudspeaker", "tutorial_supplemental:loudspeaker")
minetest.register_alias("supplemental:rock", "tutorial_supplemental:rock")
minetest.register_alias("supplemental:wheat", "tutorial_supplemental:wheat")
minetest.register_alias("supplemental:flour", "tutorial_supplemental:flour")
minetest.register_alias("supplemental:paper_white", "tutorial_supplemental:paper_white")
minetest.register_alias("supplemental:paper_orange", "tutorial_supplemental:paper_orange")
minetest.register_alias("supplemental:paper_purple", "tutorial_supplemental:paper_purple")
minetest.register_alias("supplemental:paper_green", "tutorial_supplemental:paper_green")
minetest.register_alias("supplemental:book", "tutorial_supplemental:book")

View File

@ -0,0 +1,3 @@
name = tutorial_supplemental
depends = tutorial_default, tutorial_music
optional_depends = intllib

View File

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 341 B

View File

Before

Width:  |  Height:  |  Size: 621 B

After

Width:  |  Height:  |  Size: 621 B

View File

Before

Width:  |  Height:  |  Size: 335 B

After

Width:  |  Height:  |  Size: 335 B

View File

Before

Width:  |  Height:  |  Size: 227 B

After

Width:  |  Height:  |  Size: 227 B

View File

Before

Width:  |  Height:  |  Size: 814 B

After

Width:  |  Height:  |  Size: 814 B

View File

Before

Width:  |  Height:  |  Size: 391 B

After

Width:  |  Height:  |  Size: 391 B

View File

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

View File

Before

Width:  |  Height:  |  Size: 375 B

After

Width:  |  Height:  |  Size: 375 B

View File

Before

Width:  |  Height:  |  Size: 387 B

After

Width:  |  Height:  |  Size: 387 B

View File

Before

Width:  |  Height:  |  Size: 376 B

After

Width:  |  Height:  |  Size: 376 B

View File

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 220 B

View File

Before

Width:  |  Height:  |  Size: 842 B

After

Width:  |  Height:  |  Size: 842 B

View File

Before

Width:  |  Height:  |  Size: 690 B

After

Width:  |  Height:  |  Size: 690 B

View File

Before

Width:  |  Height:  |  Size: 706 B

After

Width:  |  Height:  |  Size: 706 B

View File

Before

Width:  |  Height:  |  Size: 710 B

After

Width:  |  Height:  |  Size: 710 B

View File

Before

Width:  |  Height:  |  Size: 484 B

After

Width:  |  Height:  |  Size: 484 B

View File

Before

Width:  |  Height:  |  Size: 552 B

After

Width:  |  Height:  |  Size: 552 B

View File

Before

Width:  |  Height:  |  Size: 511 B

After

Width:  |  Height:  |  Size: 511 B

View File

Before

Width:  |  Height:  |  Size: 448 B

After

Width:  |  Height:  |  Size: 448 B

View File

Before

Width:  |  Height:  |  Size: 492 B

After

Width:  |  Height:  |  Size: 492 B

View File

Before

Width:  |  Height:  |  Size: 547 B

After

Width:  |  Height:  |  Size: 547 B