Polymorph spell added!

master
francisco athens 2020-07-31 15:21:04 -07:00
parent 8e3032f29a
commit 0d8dd4ac0f
11 changed files with 351 additions and 21 deletions

View File

@ -3,14 +3,18 @@
Witches is copyright 2020 Francisco Athens, Ramona Athens, Damon Athens and Simone Athens
The MIT License (MIT)
* code :https://gitlab.com/freelikegnu/witches
* forum discussion: https://forum.minetest.net/viewtopic.php?f=9&t=25084&p=377605#p377605
* code/issue tracking :https://gitlab.com/freelikegnu/witches
* forum discussion: https://forum.minetest.net/viewtopic.php?t=25084
* ContentDB: https://content.minetest.net/packages/FreeLikeGNU/witches/
Witches inhabit the land! They are currently in development but, can already:
* Spawn near wood above ground.
* Witches have magic! They will defend themselves and each other!
* Witches have magic! They will defend themselves and each other against aggressive players and mobs!
* If you are repeatedly helpful to a witch...
* Witch cottages adapted from Sokomine's basic_houses:
(https://github.com/Sokomine/basic_houses) mod under under MIT license
with permission from author.
@ -30,7 +34,7 @@ Witches inhabit the land! They are currently in development but, can already:
* Basic interactivity:
will follow player for holding certain items.
one of those items they will request with randomly chosen text, if player right clicks
if player is holding that requested item and right click witch player will receive a reward
if player is holding that requested item and right click witch player will receive a reward!
the reward is a personalized tool with increased stats!
## Required Mods:
@ -39,9 +43,13 @@ Witches inhabit the land! They are currently in development but, can already:
* Mobs Redo git repository: https://notabug.org/TenPlus1/mobs_redo
## Optional Mods:
For Witches Cottages: Sokomine's handle_schematics mod (GPLv3)
* For Witches Cottages: Sokomine's handle_schematics mod (GPLv3)
* git repository: https://github.com/Sokomine/handle_schematics
* Any mobs from any mobs mod attacking Witches may be turned into a sheep!
* Fireflies (Minetest Game) for certain effects and rewards
## Licenses of Source Media Files:
* witches_witch.b3d and witch.blend
* copyright 2020 Francisco Athens, Ramona Athens, Damon Athens and Simone Athens
@ -52,11 +60,18 @@ Witches inhabit the land! They are currently in development but, can already:
* by MirceaKitsune (WTFPL)
* https://github.com/minetest/minetest_game/blob/master/mods/default/README.txt#L71
* witches_*.png files and witches_*.xcf files
* witches_*.png files and witches_*.xcf files:
* copyright 2020 Francisco Athens, Ramona Athens, Damon Athens and Simone Athens
Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
* http://creativecommons.org/licenses/by-sa/3.0/
* sheep.blend, sheep.xcf witches_sheep.b3d, witches_sheep.png witches_sheep_wool.png:
* copyright 2020 Francisco Athens
Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
* http://creativecommons.org/licenses/by-sa/3.0/
* sheep.lua code adapted from mobs_animals by TenPlus1 and authors credited in sheep.lua
* Witch houses code adapted from Sokomine's basic_houses
(https://github.com/Sokomine/basic_houses) mod under MIT license
with permission from author.
@ -64,4 +79,6 @@ Witches inhabit the land! They are currently in development but, can already:
Thanks to TenPlus1 for keeping the Mobs_Redo going!
Thanks to rubenwardy for awesome help and the Minetest ContentDB
Thanks to everyone in the Minetest forums and IRC for just being great!
Thanks to ctate for naming the witches first spell "Yeet"!
GET MINETEST: https://www.minetest.net/

9
changelog Normal file
View File

@ -0,0 +1,9 @@
2020/07/31: Witches can turn aggressive mobs into sheep!
2020/07/28: Witches will teleport you away from themselves if you are aggressive!
2020/07/26: Witch cottage placement refactor and settings menu options!
2020/07/25: Witch cottages refinements (thanks Solomine!)
2020/07/20: Witches have homes (modified procedural Basic_Houses script by Sokomine)! (If Sokomine's handle_schematics mod is also active) L-System trees are added near witch cottages too!!
video: https://youtu.be/qDS3fT-ROR0
2020/07/19: Hairstyles are now randomly chosen, animated hat test.
Update 2020/07/17: More Quest UI work (reward items try to fit into player inv or drop) and some variations in quest text and hats.
video: https://youtu.be/Lor06w5IMIQ

View File

@ -1,3 +1,5 @@
default
mobs
handle_schematics?
fireflies?
mobs_monster?

View File

@ -5,7 +5,7 @@
local path = minetest.get_modpath("witches")
witches = {}
witches.version = "20200728"
witches.version = "20200731"
print("this is Witches "..witches.version)
-- Strips any kind of escape codes (translation, colors) from a string
@ -57,10 +57,11 @@ else
end
dofile(path .. "/utilities.lua")
dofile(path .. "/magic.lua")
dofile(path .. "/ui.lua")
dofile(path .. "/items.lua")
dofile(path .. "/nodes.lua")
dofile(path .. "/sheep.lua")
dofile(path .. "/magic.lua")
if not handle_schematics then
print("optional handle_schematics not found!\n Witch cottages not available!")
@ -259,11 +260,22 @@ local witch_template = { --your average witch,
local ent = objs[n]:get_luaentity()
if objs[n] == self.attack then
if self.attack:is_player() then
-- witches.magic.banish_underground(self,objs[n],10)
witches.magic.teleport(self,objs[n],math.random(3,8),math.random(2,4))
else
witches.magic.teleport(self,objs[n],math.random(3,8),math.random(2,4))
if math.random() < 0.3 then
witches.magic.teleport(self,objs[n],math.random(3,5),math.random(2,4))
witches.magic.polymorph(self,objs[n])
else
witches.magic.teleport(self,objs[n],math.random(3,8),math.random(2,4))
end
-- witches.magic.teleport(self,objs[n],math.random(3,8),math.random(2,4))
end
end
end

View File

@ -1,4 +1,5 @@
witches.magic = {}
local wsc = witches.sheep_colors
local magic_texture = "bubble.png"
local magic_animation = nil
@ -17,19 +18,19 @@ else
magic_animation = nil
end
local function pos_to_vol(pos,vol)
local function pos_to_vol(pos,vol)
local pv1 = {}
local pv2 = {}
pv1 = vector.subtract(pos,vector.divide(vol,2))
pv2 = vector.add(pv1,vol)
pv2 = vector.add(pv1,vol)
local rvol = {pv1,pv2}
return rvol
end
end
function witches.magic.effect_area01(pos1,pos2,density)
density = density or 100
minetest.add_particlespawner({
minetest.add_particlespawner({
amount=density,
time=.1,
minpos= pos1,
@ -58,8 +59,8 @@ function witches.magic.effect_line01(pos1,pos2,density)
local vd = math.floor(vector.distance(pos1, pos2))
local v_pos1 = pos1
local v_pos2 = pos1
for i=1,vd do
for i=1,vd do
v_pos2 = vector.add(v_pos1,dv)
minetest.add_particlespawner({
@ -86,6 +87,7 @@ function witches.magic.effect_line01(pos1,pos2,density)
end
function witches.magic.teleport(self,target,strength,height)
local description = "Yeet!" --thanks to ctate for naming this so accurately!
local caster_pos = self.object:get_pos()
local target_pos = {}
strength = strength or 8
@ -93,18 +95,18 @@ function witches.magic.teleport(self,target,strength,height)
if target then
if target:is_player() then
target_pos = target:get_pos()
elseif target:get_luaentity() then
--same for now...
target_pos = target:get_pos()
else
return
return
end
--witches.stop_and_face(self,target_pos)
local new_target_pos = vector.add(target_pos, vector.multiply(vector.direction(caster_pos, target_pos),strength))
local new_target_pos = vector.add(target_pos, vector.multiply(vector.direction(caster_pos, target_pos),strength))
new_target_pos.y = target_pos.y + height
--print(minetest.pos_to_string(target_pos))
@ -114,8 +116,8 @@ function witches.magic.teleport(self,target,strength,height)
target:set_pos(new_target_pos)
witches.magic.effect_line01(caster_pos,new_target_pos,50)
local vol = pos_to_vol(caster_pos,{x=2,y=2,z=2})
local vol = pos_to_vol(caster_pos,{x=2,y=2,z=2})
--print(minetest.pos_to_string(caster_pos))
--print(minetest.pos_to_string(vol[1]))
--print(minetest.pos_to_string(vol[2]))
@ -126,3 +128,35 @@ function witches.magic.teleport(self,target,strength,height)
end
end
function witches.magic.polymorph(self, target, mob, duration)
duration = duration or 0
local colors = {}
for _, col in ipairs(wsc) do
table.insert(colors,col[1])
end
local r_sheep = "witches:sheep_"..colors[math.random(#colors)]
mob = mob or r_sheep
local caster_pos = self.object:get_pos()
local ent = target:get_luaentity()
local ent_pos = ent.object:get_pos()
--local ent_props = ent.object:get_properties()
--local ent_name = ent.name
--print(dump(ent_props))
witches.magic.effect_line01(caster_pos,ent_pos,50)
ent.object:remove()
local vol_ent = pos_to_vol(ent_pos,{x=2,y=2,z=2})
--print(minetest.pos_to_string(caster_pos))
--print(minetest.pos_to_string(vol[1]))
--print(minetest.pos_to_string(vol[2]))
witches.magic.effect_area01(vol_ent[1],vol_ent[2],200)
local new_obj = minetest.add_entity(ent_pos, mob)
--local new_ent = new_obj:get_luaentity()
--new_ent.old_mob_name = ent.name
end

BIN
models/sheep.blend Normal file

Binary file not shown.

BIN
models/witches_sheep.b3d Normal file

Binary file not shown.

256
sheep.lua Normal file
View File

@ -0,0 +1,256 @@
--Code based on mobs_animal "sheep"
--Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 The MIT License (MIT)
local variance = witches.variance
local S = mobs.intllib
witches.sheep_colors = {
{"black", S("Black"), "#000000b0"},
{"blue", S("Blue"), "#015dbb70"},
{"brown", S("Brown"), "#663300a0"},
{"cyan", S("Cyan"), "#01ffd870"},
{"dark_green", S("Dark Green"), "#005b0770"},
{"dark_grey", S("Dark Grey"), "#303030b0"},
{"green", S("Green"), "#61ff0170"},
{"grey", S("Grey"), "#5b5b5bb0"},
{"magenta", S("Magenta"), "#ff05bb70"},
{"orange", S("Orange"), "#ff840170"},
{"pink", S("Pink"), "#ff65b570"},
{"red", S("Red"), "#ff0000a0"},
{"violet", S("Violet"), "#2000c970"},
{"white", S("White"), "#abababc0"},
{"yellow", S("Yellow"), "#e3ff0070"},
}
local all_colours = witches.sheep_colors
-- Sheep model and textures by FreeLikeGNU 2020 CC-BY-SA-3.0
for _, col in ipairs(all_colours) do
mobs:register_mob("witches:sheep_"..col[1], {
stay_near = {"farming:straw", 10},
stepheight = 0.6,
type = "animal",
passive = true,
hp_min = 8,
hp_max = 10,
armor = 200,
collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5},
visual = "mesh",
mesh = "witches_sheep.b3d",
textures = {
{"witches_sheep.png^(witches_sheep_wool.png^[colorize:" .. col[3]..")"},
},
--gotten_texture = {"mobs_sheep_shaved.png"},
--gotten_mesh = "mobs_sheep_shaved.b3d",
makes_footstep_sound = true,
sounds = {
random = "mobs_sheep",
},
walk_velocity = 1,
run_velocity = 2,
runaway = true,
jump = true,
jump_height = 6,
pushable = true,
drops = {
{name = "mobs:mutton_raw", chance = 1, min = 1, max = 2},
{name = "wool:"..col[1], chance = 1, min = 1, max = 1},
},
water_damage = 0,
lava_damage = 5,
light_damage = 0,
animation = {
speed_normal = 40,
speed_run = 80,
stand_start = 1,
stand_end = 60,
walk_start = 70,
walk_end = 90,
},
follow = {"farming:wheat", "default:grass_1"},
view_range = 8,
replace_rate = 10,
replace_what = {
{"group:grass", "air", -1},
{"default:dirt_with_grass", "default:dirt", -2}
},
fear_height = 3,
on_spawn = function(self)
if not self.size then
local overall = variance(100,200)
self.size = {x = overall*variance(90,110), y = overall*variance(90,110), z = overall*variance(90,110)}
end
local self_properties = self.object:get_properties()
self_properties.visual_size = self.size
self.object:set_properties(self_properties)
end,
on_replace = function(self, pos, oldnode, newnode)
self.food = (self.food or 0) + 1
-- if sheep replaces 8x grass then it regrows wool
if self.food >= 8 then
self.food = 0
self.gotten = false
self.object:set_properties({
textures = {"witches_sheep.png^(witches_sheep_wool.png^[colorize:" .. col[3]..")"},
mesh = "mobs_sheep.b3d",
})
end
end,
on_rightclick = function(self, clicker)
--are we feeding?
if mobs:feed_tame(self, clicker, 8, true, true) then
--if fed 7x grass or wheat then sheep regrows wool
if self.food and self.food > 6 then
self.gotten = false
self.object:set_properties({
textures = {"witches_sheep.png^(witches_sheep_wool.png^[colorize:" .. col[3]..")"},
mesh = "mobs_sheep.b3d",
})
end
return
end
local item = clicker:get_wielded_item()
local itemname = item:get_name()
local name = clicker:get_player_name()
--are we giving a haircut>
if itemname == "mobs:shears" then
if self.gotten ~= false
or self.child ~= false
or name ~= self.owner
or not minetest.get_modpath("wool") then
return
end
self.gotten = true -- shaved
local obj = minetest.add_item(
self.object:get_pos(),
ItemStack( "wool:" .. col[1] .. " " .. math.random(1, 3) )
)
if obj then
obj:setvelocity({
x = math.random(-1, 1),
y = 5,
z = math.random(-1, 1)
})
end
item:add_wear(650) -- 100 uses
clicker:set_wielded_item(item)
self.object:set_properties({
textures = {"witches_sheep.png"}, --should be shaved
mesh = "witches_sheep.b3d",
})
return
end
--are we coloring?
if itemname:find("dye:") then
if self.gotten == false
and self.child == false
and self.tamed == true
and name == self.owner then
local colr = string.split(itemname, ":")[2]
for _,c in pairs(all_colours) do
if c[1] == colr then
local pos = self.object:get_pos()
self.object:remove()
local mob = minetest.add_entity(pos, "witches:sheep_" .. colr)
local ent = mob:get_luaentity()
ent.owner = name
ent.tamed = true
-- take item
if not mobs.is_creative(clicker:get_player_name()) then
item:take_item()
clicker:set_wielded_item(item)
end
break
end
end
end
return
end
-- protect mod with mobs:protector item
if mobs:protect(self, clicker) then return end
--are we capturing?
if mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) then return end
end
})
mobs:register_egg("witches:sheep_"..col[1], S("@1 Sheep", col[2]), "wool_"..col[1]..".png")
end
mobs:spawn({
name = "witches:sheep_white",
nodes = {"default:dirt_with_grass", "ethereal:green_dirt"},
neighbors = {"group:grass"},
min_light = 14,
interval = 60,
chance = 8000, -- 15000
min_height = 0,
max_height = 200,
day_toggle = true,
})
--mobs:alias_mob("witches:sheep", "mobs_animal:sheep_white") -- compatibility
-- raw mutton
minetest.register_craftitem(":mobs:mutton_raw", {
description = S("Raw Mutton"),
inventory_image = "mobs_mutton_raw.png",
on_use = minetest.item_eat(2),
groups = {food_meat_raw = 1, food_mutton_raw = 1, flammable = 2},
})
-- cooked mutton
minetest.register_craftitem(":mobs:mutton_cooked", {
description = S("Cooked Mutton"),
inventory_image = "mobs_mutton_cooked.png",
on_use = minetest.item_eat(6),
groups = {food_meat = 1, food_mutton = 1, flammable = 2},
})
minetest.register_craft({
type = "cooking",
output = "mobs:mutton_cooked",
recipe = "mobs:mutton_raw",
cooktime = 5,
})

BIN
textures/sheep.xcf Normal file

Binary file not shown.

BIN
textures/witches_sheep.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB