From 3661cb61e37ee6b7a8818f7a28e9102fb0674e54 Mon Sep 17 00:00:00 2001
From: rubenwardy <rubenwardy@gmail.com>
Date: Mon, 11 Jul 2016 17:55:17 +0100
Subject: [PATCH] Move nyancats into a separate mod

Nyancats are independent in the default mod. Nothing else uses them or
their code. Separating it into a separate mod makes it easier for
subgames to remove them. It also makes it easier for a mod to depend
on nyancats, as lots of subgames don't have them.

Default/mapgen.lua: Register biomes, ores and decorations in
singlenode mapgen. These were never disabled anyway because
singlenode was removed from the world creation menu.
---
 game_api.txt                                  |  12 +++
 mods/default/README.txt                       |   4 -
 mods/default/aliases.lua                      |   3 -
 mods/default/crafting.lua                     |  13 ---
 mods/default/mapgen.lua                       |  63 +------------
 mods/default/nodes.lua                        |  25 ------
 mods/nyancat/README.txt                       |  29 ++++++
 mods/nyancat/depends.txt                      |   1 +
 mods/nyancat/init.lua                         |  84 ++++++++++++++++++
 .../textures/default_nc_back.png              | Bin
 .../textures/default_nc_front.png             | Bin
 .../textures/default_nc_rb.png                | Bin
 .../textures/default_nc_side.png              | Bin
 13 files changed, 129 insertions(+), 105 deletions(-)
 create mode 100644 mods/nyancat/README.txt
 create mode 100644 mods/nyancat/depends.txt
 create mode 100644 mods/nyancat/init.lua
 rename mods/{default => nyancat}/textures/default_nc_back.png (100%)
 rename mods/{default => nyancat}/textures/default_nc_front.png (100%)
 rename mods/{default => nyancat}/textures/default_nc_rb.png (100%)
 rename mods/{default => nyancat}/textures/default_nc_side.png (100%)

diff --git a/game_api.txt b/game_api.txt
index e04a33b4..581d76cc 100644
--- a/game_api.txt
+++ b/game_api.txt
@@ -250,6 +250,18 @@ Give Initial Stuff API
 ^ str is a comma separated list of initial stuff
 ^ Adds items to the list of items to be given
 
+Nyancat API
+-----------
+
+`nyancat.place(pos, facedir, length)`
+
+^ Place a cat at `pos` facing `facedir` with tail length `length`
+  Only accepts facedir 0-3, if facedir > 3 then it will be interpreted as facedir = 0
+
+`nyancat.generate(minp, maxp, seed)`
+
+^ Called by `minetest.register_on_generated`. To disable nyancat generation,
+  you can redefine nyancat.generate() to be an empty function
 
 TNT API
 ----------
diff --git a/mods/default/README.txt b/mods/default/README.txt
index 41dd1eb0..85c5a4ef 100644
--- a/mods/default/README.txt
+++ b/mods/default/README.txt
@@ -51,10 +51,6 @@ RealBadAngel's animated water (WTFPL):
   default_water_flowing_animated.png
 
 VanessaE (WTFPL):
-  default_nc_back.png
-  default_nc_front.png
-  default_nc_rb.png
-  default_nc_side.png
   default_desert_sand.png
   default_desert_stone.png
   default_sand.png
diff --git a/mods/default/aliases.lua b/mods/default/aliases.lua
index 63fe59b2..1259ac0e 100644
--- a/mods/default/aliases.lua
+++ b/mods/default/aliases.lua
@@ -39,8 +39,6 @@ minetest.register_alias("locked_chest", "default:chest_locked")
 minetest.register_alias("cobble", "default:cobble")
 minetest.register_alias("mossycobble", "default:mossycobble")
 minetest.register_alias("steelblock", "default:steelblock")
-minetest.register_alias("nyancat", "default:nyancat")
-minetest.register_alias("nyancat_rainbow", "default:nyancat_rainbow")
 minetest.register_alias("sapling", "default:sapling")
 minetest.register_alias("apple", "default:apple")
 
@@ -77,4 +75,3 @@ minetest.register_alias("default:pinewood", "default:pine_wood")
 
 minetest.register_alias("default:ladder", "default:ladder_wood")
 minetest.register_alias("default:sign_wall", "default:sign_wall_wood")
-
diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua
index 3bfce07c..1151f47b 100644
--- a/mods/default/crafting.lua
+++ b/mods/default/crafting.lua
@@ -888,18 +888,6 @@ minetest.register_craft({
 	burntime = 30,
 })
 
-minetest.register_craft({
-	type = "fuel",
-	recipe = "default:nyancat",
-	burntime = 1,
-})
-
-minetest.register_craft({
-	type = "fuel",
-	recipe = "default:nyancat_rainbow",
-	burntime = 1,
-})
-
 minetest.register_craft({
 	type = "fuel",
 	recipe = "group:sapling",
@@ -935,4 +923,3 @@ minetest.register_craft({
 	recipe = "default:dry_grass_1",
 	burntime = 2,
 })
-
diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua
index 7d0b0fd4..52aa294c 100644
--- a/mods/default/mapgen.lua
+++ b/mods/default/mapgen.lua
@@ -49,7 +49,7 @@ function default.register_ores()
 	-- Clay
 	-- This first to avoid clay in sand blobs
 
-	minetest.register_ore({ 
+	minetest.register_ore({
 		ore_type        = "blob",
 		ore             = "default:clay",
 		wherein         = {"default:sand"},
@@ -70,7 +70,7 @@ function default.register_ores()
 
 	-- Sand
 
-	minetest.register_ore({ 
+	minetest.register_ore({
 		ore_type        = "blob",
 		ore             = "default:sand",
 		wherein         = {"default:stone", "default:sandstone",
@@ -1464,73 +1464,16 @@ function default.register_decorations()
 end
 
 
---
--- Generate nyan cats
---
-
--- All mapgens except singlenode
-
-function default.make_nyancat(pos, facedir, length)
-	local tailvec = {x = 0, y = 0, z = 0}
-	if facedir == 0 then
-		tailvec.z = 1
-	elseif facedir == 1 then
-		tailvec.x = 1
-	elseif facedir == 2 then
-		tailvec.z = -1
-	elseif facedir == 3 then
-		tailvec.x = -1
-	else
-		facedir = 0
-		tailvec.z = 1
-	end
-	local p = {x = pos.x, y = pos.y, z = pos.z}
-	minetest.set_node(p, {name = "default:nyancat", param2 = facedir})
-	for i = 1, length do
-		p.x = p.x + tailvec.x
-		p.z = p.z + tailvec.z
-		minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir})
-	end
-end
-
-function default.generate_nyancats(minp, maxp, seed)
-	local height_min = -31000
-	local height_max = -32
-	if maxp.y < height_min or minp.y > height_max then
-		return
-	end
-	local y_min = math.max(minp.y, height_min)
-	local y_max = math.min(maxp.y, height_max)
-	local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
-	local pr = PseudoRandom(seed + 9324342)
-	local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
-	for i = 1, max_num_nyancats do
-		if pr:next(0, 1000) == 0 then
-			local x0 = pr:next(minp.x, maxp.x)
-			local y0 = pr:next(minp.y, maxp.y)
-			local z0 = pr:next(minp.z, maxp.z)
-			local p0 = {x = x0, y = y0, z = z0}
-			default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15))
-		end
-	end
-end
-
-
 --
 -- Detect mapgen to select functions
 --
 
--- Mods using singlenode mapgen can call these functions to enable
--- the use of minetest.generate_ores or minetest.generate_decorations
-
 local mg_name = minetest.get_mapgen_setting("mg_name")
 if mg_name == "v6" then
 	default.register_ores()
 	default.register_mgv6_decorations()
-	minetest.register_on_generated(default.generate_nyancats)
-elseif mg_name ~= "singlenode" then
+else
 	default.register_biomes()
 	default.register_ores()
 	default.register_decorations()
-	minetest.register_on_generated(default.generate_nyancats)
 end
diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua
index 86d5565c..31e063d4 100644
--- a/mods/default/nodes.lua
+++ b/mods/default/nodes.lua
@@ -178,8 +178,6 @@ Misc
 ----
 
 default:cloud
-default:nyancat
-default:nyancat_rainbow
 
 --]]
 
@@ -1902,26 +1900,3 @@ minetest.register_node("default:cloud", {
 	sounds = default.node_sound_defaults(),
 	groups = {not_in_creative_inventory = 1},
 })
-
-minetest.register_node("default:nyancat", {
-	description = "Nyan Cat",
-	tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
-		"default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
-	paramtype2 = "facedir",
-	groups = {cracky = 2},
-	is_ground_content = false,
-	legacy_facedir_simple = true,
-	sounds = default.node_sound_defaults(),
-})
-
-minetest.register_node("default:nyancat_rainbow", {
-	description = "Nyan Cat Rainbow",
-	tiles = {
-		"default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90",
-		"default_nc_rb.png", "default_nc_rb.png"
-	},
-	paramtype2 = "facedir",
-	groups = {cracky = 2},
-	is_ground_content = false,
-	sounds = default.node_sound_defaults(),
-})
diff --git a/mods/nyancat/README.txt b/mods/nyancat/README.txt
new file mode 100644
index 00000000..95850c92
--- /dev/null
+++ b/mods/nyancat/README.txt
@@ -0,0 +1,29 @@
+Minetest Game mod: nyancat
+==========================
+
+License of source code:
+-----------------------
+Copyright (C) 2011-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+http://www.gnu.org/licenses/lgpl-2.1.html
+
+License of media (textures and sounds)
+--------------------------------------
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+http://creativecommons.org/licenses/by-sa/3.0/
+
+Authors of media files
+-----------------------
+Everything not listed in here:
+Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+VanessaE (WTFPL):
+  default_nc_back.png
+  default_nc_front.png
+  default_nc_rb.png
+  default_nc_side.png
diff --git a/mods/nyancat/depends.txt b/mods/nyancat/depends.txt
new file mode 100644
index 00000000..4ad96d51
--- /dev/null
+++ b/mods/nyancat/depends.txt
@@ -0,0 +1 @@
+default
diff --git a/mods/nyancat/init.lua b/mods/nyancat/init.lua
new file mode 100644
index 00000000..6c1d9036
--- /dev/null
+++ b/mods/nyancat/init.lua
@@ -0,0 +1,84 @@
+minetest.register_node("nyancat:nyancat", {
+	description = "Nyan Cat",
+	tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
+		"default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
+	paramtype2 = "facedir",
+	groups = {cracky = 2},
+	is_ground_content = false,
+	legacy_facedir_simple = true,
+	sounds = default.node_sound_defaults(),
+})
+
+minetest.register_node("nyancat:nyancat_rainbow", {
+	description = "Nyan Cat Rainbow",
+	tiles = {
+		"default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90",
+		"default_nc_rb.png", "default_nc_rb.png"
+	},
+	paramtype2 = "facedir",
+	groups = {cracky = 2},
+	is_ground_content = false,
+	sounds = default.node_sound_defaults(),
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "nyancat:nyancat",
+	burntime = 1,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "nyancat:nyancat_rainbow",
+	burntime = 1,
+})
+
+nyancat = {}
+
+function nyancat.place(pos, facedir, length)
+	if facedir > 3 then
+		facedir = 0
+	end
+	local tailvec = minetest.facedir_to_dir(facedir)
+	local p = {x = pos.x, y = pos.y, z = pos.z}
+	minetest.set_node(p, {name = "nyancat:nyancat", param2 = facedir})
+	for i = 1, length do
+		p.x = p.x + tailvec.x
+		p.z = p.z + tailvec.z
+		minetest.set_node(p, {name = "nyancat:nyancat_rainbow", param2 = facedir})
+	end
+end
+
+function nyancat.generate(minp, maxp, seed)
+	local height_min = -31000
+	local height_max = -32
+	if maxp.y < height_min or minp.y > height_max then
+		return
+	end
+	local y_min = math.max(minp.y, height_min)
+	local y_max = math.min(maxp.y, height_max)
+	local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
+	local pr = PseudoRandom(seed + 9324342)
+	local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
+	for i = 1, max_num_nyancats do
+		if pr:next(0, 1000) == 0 then
+			local x0 = pr:next(minp.x, maxp.x)
+			local y0 = pr:next(minp.y, maxp.y)
+			local z0 = pr:next(minp.z, maxp.z)
+			local p0 = {x = x0, y = y0, z = z0}
+			nyancat.place(p0, pr:next(0, 3), pr:next(3, 15))
+		end
+	end
+end
+
+minetest.register_on_generated(function(minp, maxp, seed)
+	nyancat.generate(minp, maxp, seed)
+end)
+
+-- Legacy
+minetest.register_alias("default:nyancat", "nyancat:nyancat")
+minetest.register_alias("default:nyancat_rainbow", "nyancat:nyancat_rainbow")
+minetest.register_alias("nyancat", "nyancat:nyancat")
+minetest.register_alias("nyancat_rainbow", "nyancat:nyancat_rainbow")
+default.make_nyancat = nyancat.place
+default.generate_nyancats = nyancat.generate
diff --git a/mods/default/textures/default_nc_back.png b/mods/nyancat/textures/default_nc_back.png
similarity index 100%
rename from mods/default/textures/default_nc_back.png
rename to mods/nyancat/textures/default_nc_back.png
diff --git a/mods/default/textures/default_nc_front.png b/mods/nyancat/textures/default_nc_front.png
similarity index 100%
rename from mods/default/textures/default_nc_front.png
rename to mods/nyancat/textures/default_nc_front.png
diff --git a/mods/default/textures/default_nc_rb.png b/mods/nyancat/textures/default_nc_rb.png
similarity index 100%
rename from mods/default/textures/default_nc_rb.png
rename to mods/nyancat/textures/default_nc_rb.png
diff --git a/mods/default/textures/default_nc_side.png b/mods/nyancat/textures/default_nc_side.png
similarity index 100%
rename from mods/default/textures/default_nc_side.png
rename to mods/nyancat/textures/default_nc_side.png