Merge branch '1.20.1' into 1.20.2

# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BodyPartGear.java
#	src/main/java/com/minelittlepony/unicopia/client/minelittlepony/Main.java
#	src/main/java/com/minelittlepony/unicopia/compat/emi/Main.java
#	src/main/java/com/minelittlepony/unicopia/item/URecipes.java
#	src/main/java/com/minelittlepony/unicopia/server/world/UnicopiaWorldProperties.java
This commit is contained in:
Sollace 2024-02-08 20:16:46 +00:00
commit 5cc612ca3a
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
219 changed files with 7092 additions and 811 deletions

View file

@ -13,9 +13,9 @@
- 魔法 - 魔法
独角兽需要魔法宝石来施法,没有魔法的普通宝石可以从挖矿活动中取得。一开始,您需要用一颗宝石和一本书合成魔法书,魔法书将助力您解析各物品中含有的要素并辅助您用这些要素开发各类魔配方,同样可以用于修饰已有配方。 独角兽需要魔法晶石来施法,没有魔法的普通晶石可以从挖矿活动中取得。一开始,您需要用一颗晶石和一本书合成魔法书,魔法书将助力您解析各物品中含有的要素并辅助您用这些要素开发各类魔配方,同样可以用于修饰已有配方。
当您做出了所需的魔法石后,您可以拿着它右键以将其中的魔法导入到主槽位或是副槽位(按下潜行键)中 ,这些魔咒将可以以您的主技能形式激活。您也可以直接拿着魔法宝石释放其中的魔力。 当您做出了所需的魔法石后,您可以拿着它右键以将其中的魔法导入到主槽位或是副槽位(按下潜行键)中 ,这些魔法将可以以您的主技能形式激活。您也可以直接拿着魔法晶石释放其中的魔力。
- 瞬移 - 瞬移
@ -84,7 +84,7 @@
(夜骐会在阴暗的地方重生) (夜骐会在阴暗的地方重生)
- 倒挂于天花板 - 倒
想开挂吗?夜骐是可以 _字面意义上_ 开挂的!大哥都喜欢这么玩。 想开挂吗?夜骐是可以 _字面意义上_ 开挂的!大哥都喜欢这么玩。

View file

@ -16,9 +16,9 @@
独角兽,天马,陆马,甚至幻形灵都有其独特的能力 独角兽,天马,陆马,甚至幻形灵都有其独特的能力
- *成为独角兽,* 学习使用魔法!制成您的第一本魔法书并开展实验。既可研究不同魔的配方与功效,亦可潜心研究历史传说,揭开这奇幻世界过往的面纱! - *成为独角兽,* 学习使用魔法!制成您的第一本魔法书并开展实验。既可研究不同魔的配方与功效,亦可潜心研究历史传说,揭开这奇幻世界过往的面纱!
除了施放保护自己的防护罩,用魔法镭射焚烧敌人的魔外,独角兽还可利用瞬移法术免去翻山越岭的苦恼,直接传送到难以到达的地方。 除了施放保护自己的防护罩,用魔法镭射焚烧敌人的魔外,独角兽还可利用瞬移法术免去翻山越岭的苦恼,直接传送到难以到达的地方。
- *成为天马,*统治天空!除了能飞以外,天马还可以制造彩虹音爆、用罐子收容坏天气,相比于其他种族可触距离更远,跑得更快。 - *成为天马,*统治天空!除了能飞以外,天马还可以制造彩虹音爆、用罐子收容坏天气,相比于其他种族可触距离更远,跑得更快。

BIN
assets/zap_planks.xcf Normal file

Binary file not shown.

View file

@ -32,7 +32,11 @@ public interface Owned<E extends Entity> {
Optional<UUID> getMasterId(); Optional<UUID> getMasterId();
default boolean isOwnerOrFriend(Entity target) { default boolean isOwnerOrFriend(Entity target) {
return FriendshipBraceletItem.isComrade(this, target) || isOwnerOrVehicle(target); return isFriend(target) || isOwnerOrVehicle(target);
}
default boolean isFriend(Entity target) {
return FriendshipBraceletItem.isComrade(this, target);
} }
default boolean isOwnerOrVehicle(@Nullable Entity target) { default boolean isOwnerOrVehicle(@Nullable Entity target) {

View file

@ -51,7 +51,7 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
/** /**
* The spell being cast * The spell being cast
*/ */
private Spell spell; private final SpellReference<Spell> spell = new SpellReference<>();
public float pitch; public float pitch;
public float yaw; public float yaw;
@ -70,7 +70,7 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
} }
public PlaceableSpell setSpell(Spell spell) { public PlaceableSpell setSpell(Spell spell) {
this.spell = spell; this.spell.set(spell);
return this; return this;
} }
@ -103,7 +103,7 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
@Override @Override
public Collection<Spell> getDelegates() { public Collection<Spell> getDelegates() {
return List.of(spell); return List.of(spell.get());
} }
@Override @Override
@ -160,10 +160,10 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
private void spawnPlacedEntity(Caster<?> source) { private void spawnPlacedEntity(Caster<?> source) {
CastSpellEntity entity = UEntities.CAST_SPELL.create(source.asWorld()); CastSpellEntity entity = UEntities.CAST_SPELL.create(source.asWorld());
Vec3d pos = getPosition().orElse(position.orElse(source.getOriginVector())); Vec3d pos = getPosition().orElse(position.orElse(source.asEntity().getPos()));
entity.updatePositionAndAngles(pos.x, pos.y, pos.z, source.asEntity().getYaw(), source.asEntity().getPitch()); entity.updatePositionAndAngles(pos.x, pos.y, pos.z, source.asEntity().getYaw(), source.asEntity().getPitch());
PlaceableSpell copy = spell.toPlaceable(); PlaceableSpell copy = spell.get().toPlaceable();
if (spell instanceof PlacementDelegate delegate) { if (spell.get() instanceof PlacementDelegate delegate) {
delegate.onPlaced(source, copy, entity); delegate.onPlaced(source, copy, entity);
} }
entity.getSpellSlot().put(copy); entity.getSpellSlot().put(copy);
@ -272,13 +272,12 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
@Override @Override
protected void loadDelegates(NbtCompound compound) { protected void loadDelegates(NbtCompound compound) {
spell = Spell.SERIALIZER.read(compound.getCompound("spell")); spell.fromNBT(compound.getCompound("spell"));
} }
@Override @Override
protected void saveDelegates(NbtCompound compound) { protected void saveDelegates(NbtCompound compound) {
compound.put("spell", Spell.SERIALIZER.write(spell)); compound.put("spell", spell.toNBT());
} }
@Override @Override

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia.ability.magic.spell; package com.minelittlepony.unicopia.ability.magic.spell;
import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.spell.effect.*; import com.minelittlepony.unicopia.ability.magic.spell.effect.*;
import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation;
@ -13,11 +14,11 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageTypes; import net.minecraft.entity.damage.DamageTypes;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.particle.ParticleTypes; import net.minecraft.particle.ParticleTypes;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.BlockView; import net.minecraft.world.BlockView;
import net.minecraft.world.World.ExplosionSourceType; import net.minecraft.world.World.ExplosionSourceType;
import net.minecraft.world.event.GameEvent;
import net.minecraft.world.explosion.Explosion; import net.minecraft.world.explosion.Explosion;
import net.minecraft.world.explosion.ExplosionBehavior; import net.minecraft.world.explosion.ExplosionBehavior;
@ -50,7 +51,7 @@ public class RageAbilitySpell extends AbstractSpell {
if (source.asEntity().isInsideWaterOrBubbleColumn() || source.asEntity().isFrozen() || ticksToExtenguish > 0) { if (source.asEntity().isInsideWaterOrBubbleColumn() || source.asEntity().isFrozen() || ticksToExtenguish > 0) {
ticksExtenguishing++; ticksExtenguishing++;
source.playSound(SoundEvents.ENTITY_GENERIC_EXTINGUISH_FIRE, 1); source.playSound(USounds.Vanilla.ENTITY_GENERIC_EXTINGUISH_FIRE, 1);
source.spawnParticles(ParticleTypes.CLOUD, 12); source.spawnParticles(ParticleTypes.CLOUD, 12);
setDirty(); setDirty();
} else { } else {
@ -69,7 +70,7 @@ public class RageAbilitySpell extends AbstractSpell {
if (!source.isClient()) { if (!source.isClient()) {
if (age == 0) { if (age == 0) {
source.asWorld().createExplosion(source.asEntity(), source.damageOf(DamageTypes.FIREBALL), new ExplosionBehavior(){ source.asWorld().createExplosion(source.asEntity(), source.asWorld().getDamageSources().create(DamageTypes.FIREBALL, source.asEntity()), new ExplosionBehavior(){
@Override @Override
public boolean canDestroyBlock(Explosion explosion, BlockView world, BlockPos pos, BlockState state, float power) { public boolean canDestroyBlock(Explosion explosion, BlockView world, BlockPos pos, BlockState state, float power) {
return false; return false;
@ -79,7 +80,8 @@ public class RageAbilitySpell extends AbstractSpell {
if (source instanceof Pony pony) { if (source instanceof Pony pony) {
pony.setAnimation(Animation.ARMS_UP, Recipient.ANYONE, 12); pony.setAnimation(Animation.ARMS_UP, Recipient.ANYONE, 12);
} }
source.playSound(SoundEvents.ENTITY_POLAR_BEAR_WARNING, 2F, 0.1F); source.playSound(USounds.ENTITY_PLAYER_KIRIN_RAGE, 2F, 0.1F);
source.asEntity().emitGameEvent(GameEvent.EXPLODE);
} }
if (source.asEntity().isOnGround() && source.asWorld().isAir(pos) && age % 10 == 0) { if (source.asEntity().isOnGround() && source.asWorld().isAir(pos) && age % 10 == 0) {
@ -118,7 +120,7 @@ public class RageAbilitySpell extends AbstractSpell {
} }
if (source.asWorld().hasRain(pos.up()) && source.asWorld().random.nextInt(15) == 0) { if (source.asWorld().hasRain(pos.up()) && source.asWorld().random.nextInt(15) == 0) {
source.playSound(SoundEvents.ENTITY_GENERIC_EXTINGUISH_FIRE, 0.3F); source.playSound(USounds.Vanilla.ENTITY_GENERIC_EXTINGUISH_FIRE, 0.3F);
source.spawnParticles(ParticleTypes.CLOUD, 3); source.spawnParticles(ParticleTypes.CLOUD, 3);
} }

View file

@ -15,6 +15,7 @@ import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
import com.minelittlepony.unicopia.util.NbtSerialisable; import com.minelittlepony.unicopia.util.NbtSerialisable;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.util.Util;
/** /**
* Interface for a magic spells * Interface for a magic spells
@ -81,6 +82,7 @@ public interface Spell extends NbtSerialisable, Affine {
* Gets the default form of this spell used to apply to a caster. * Gets the default form of this spell used to apply to a caster.
* @param caster The caster currently fueling this spell * @param caster The caster currently fueling this spell
*/ */
@Nullable
default Spell prepareForCast(Caster<?> caster, CastingMethod method) { default Spell prepareForCast(Caster<?> caster, CastingMethod method) {
return this; return this;
} }
@ -128,10 +130,11 @@ public interface Spell extends NbtSerialisable, Affine {
} }
@Nullable @Nullable
static Spell readNbt(@Nullable NbtCompound compound) { static <T extends Spell> T readNbt(@Nullable NbtCompound compound) {
try { try {
if (compound != null && compound.contains("effect_id")) { if (compound != null && compound.contains("effect_id")) {
Spell effect = SpellType.getKey(compound).withTraits().create(); @SuppressWarnings("unchecked")
T effect = (T)SpellType.getKey(compound).withTraits().create();
if (effect != null) { if (effect != null) {
effect.fromNBT(compound); effect.fromNBT(compound);
@ -146,6 +149,10 @@ public interface Spell extends NbtSerialisable, Affine {
return null; return null;
} }
static UUID getUuid(@Nullable NbtCompound compound) {
return compound == null || !compound.containsUuid("uuid") ? Util.NIL_UUID : compound.getUuid("uuid");
}
static NbtCompound writeNbt(Spell effect) { static NbtCompound writeNbt(Spell effect) {
NbtCompound compound = effect.toNBT(); NbtCompound compound = effect.toNBT();
effect.getType().toNbt(compound); effect.getType().toNbt(compound);

View file

@ -0,0 +1,65 @@
package com.minelittlepony.unicopia.ability.magic.spell;
import java.util.Objects;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.util.NbtSerialisable;
import net.minecraft.nbt.NbtCompound;
public final class SpellReference<T extends Spell> implements NbtSerialisable {
@Nullable
private transient T spell;
private int nbtHash;
@Nullable
public T get() {
return spell == null || spell.isDead() ? null : spell;
}
public void set(T spell) {
set(spell, null);
}
public boolean hasDirtySpell() {
return spell != null && spell.isDirty();
}
public boolean set(T spell, @Nullable Caster<?> owner) {
spell = spell == null || spell.isDead() ? null : spell;
if (spell == this.spell) {
return false;
}
T oldValue = this.spell;
this.spell = spell;
nbtHash = 0;
if (owner != null && oldValue != null && (spell == null || !oldValue.getUuid().equals(spell.getUuid()))) {
oldValue.destroy(owner);
}
return true;
}
@Override
public void toNBT(NbtCompound compound) {
if (spell != null && !spell.isDead()) {
spell.toNBT(compound);
spell.getType().toNbt(compound);
}
}
@Override
public void fromNBT(NbtCompound compound) {
final int hash = compound.hashCode();
if (nbtHash == hash) {
return;
}
nbtHash = hash;
if (spell == null || !Objects.equals(Spell.getUuid(compound), spell.getUuid())) {
spell = Spell.readNbt(compound);
} else {
spell.fromNBT(compound);
}
}
}

View file

@ -17,20 +17,20 @@ import net.minecraft.world.World;
public final class ThrowableSpell extends AbstractDelegatingSpell { public final class ThrowableSpell extends AbstractDelegatingSpell {
private Spell spell; private final SpellReference<Spell> spell = new SpellReference<>();
public ThrowableSpell(CustomisedSpellType<?> type) { public ThrowableSpell(CustomisedSpellType<?> type) {
super(type); super(type);
} }
public ThrowableSpell setSpell(Spell spell) { public ThrowableSpell setSpell(Spell spell) {
this.spell = spell; this.spell.set(spell);
return this; return this;
} }
@Override @Override
public Collection<Spell> getDelegates() { public Collection<Spell> getDelegates() {
return List.of(spell); return List.of(spell.get());
} }
@Override @Override
@ -59,31 +59,36 @@ public final class ThrowableSpell extends AbstractDelegatingSpell {
caster.playSound(USounds.SPELL_CAST_SHOOT, 0.7F, 0.4F / (world.random.nextFloat() * 0.4F + 0.8F)); caster.playSound(USounds.SPELL_CAST_SHOOT, 0.7F, 0.4F / (world.random.nextFloat() * 0.4F + 0.8F));
if (!caster.isClient()) { if (caster.isClient()) {
MagicProjectileEntity projectile = UEntities.MAGIC_BEAM.create(world); return Optional.empty();
projectile.setPosition(entity.getX(), entity.getEyeY() - 0.1F, entity.getZ());
projectile.setOwner(entity);
projectile.setItem(UItems.GEMSTONE.getDefaultStack(spell.getType()));
spell.prepareForCast(caster, CastingMethod.STORED).apply(projectile);
projectile.setVelocity(entity, entity.getPitch(), entity.getYaw(), 0, 1.5F, divergance);
projectile.setNoGravity(true);
configureProjectile(projectile, caster);
world.spawnEntity(projectile);
return Optional.of(projectile);
} }
return Optional.empty(); Spell s = spell.get().prepareForCast(caster, CastingMethod.STORED);
if (s == null) {
return Optional.empty();
}
MagicProjectileEntity projectile = UEntities.MAGIC_BEAM.create(world);
projectile.setPosition(entity.getX(), entity.getEyeY() - 0.1F, entity.getZ());
projectile.setOwner(entity);
projectile.setItem(UItems.GEMSTONE.getDefaultStack(spell.get().getType()));
s.apply(projectile);
projectile.setVelocity(entity, entity.getPitch(), entity.getYaw(), 0, 1.5F, divergance);
projectile.setNoGravity(true);
configureProjectile(projectile, caster);
world.spawnEntity(projectile);
return Optional.of(projectile);
} }
@Override @Override
protected void loadDelegates(NbtCompound compound) { protected void loadDelegates(NbtCompound compound) {
spell = Spell.SERIALIZER.read(compound.getCompound("spell")); spell.fromNBT(compound.getCompound("spell"));
} }
@Override @Override
protected void saveDelegates(NbtCompound compound) { protected void saveDelegates(NbtCompound compound) {
compound.put("spell", Spell.SERIALIZER.write(spell)); compound.put("spell", spell.toNBT());
} }
@Override @Override

View file

@ -115,7 +115,7 @@ public abstract class AbstractSpell implements Spell {
@Override @Override
public void fromNBT(NbtCompound compound) { public void fromNBT(NbtCompound compound) {
dirty = false; dirty = false;
if (compound.contains("uuid")) { if (compound.containsUuid("uuid")) {
uuid = compound.getUuid("uuid"); uuid = compound.getUuid("uuid");
} }
dying = compound.getBoolean("dying"); dying = compound.getBoolean("dying");

View file

@ -1,11 +1,15 @@
package com.minelittlepony.unicopia.ability.magic.spell.effect; package com.minelittlepony.unicopia.ability.magic.spell.effect;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
import net.minecraft.block.Block;
import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
@ -17,7 +21,16 @@ public interface AttractionUtils {
} }
static double getMass(Entity entity) { static double getMass(Entity entity) {
return entity.getWidth() * entity.getHeight(); double baseMass = entity.getWidth() * entity.getHeight();
if (entity instanceof ItemEntity item) {
baseMass *= item.getStack().getCount();
@Nullable
Block block = Block.getBlockFromItem(item.getStack().getItem());
if (block != null) {
baseMass *= MathHelper.clamp(1 + block.getHardness(), 1, 5);
}
}
return baseMass;
} }
/** /**

View file

@ -39,8 +39,11 @@ public record CustomisedSpellType<T extends Spell> (
} }
T spell = create(); T spell = create();
if (spell != null && spell.prepareForCast(caster, method).apply(caster)) { if (spell != null) {
return spell; Spell s = spell.prepareForCast(caster, method);
if (s != null && s.apply(caster)) {
return spell;
}
} }
return null; return null;

View file

@ -46,12 +46,11 @@ public class DarkVortexSpell extends AttractiveSpell implements ProjectileDelega
.with(Trait.DARKNESS, 100) .with(Trait.DARKNESS, 100)
.build(); .build();
private static final Vec3d SPHERE_OFFSET = new Vec3d(0, 2, 0);
private float accumulatedMass = 0; private float accumulatedMass = 0;
protected DarkVortexSpell(CustomisedSpellType<?> type) { protected DarkVortexSpell(CustomisedSpellType<?> type) {
super(type); super(type);
targetSelecter.setTargetowner(true).setTargetAllies(true);
} }
@Override @Override
@ -87,7 +86,8 @@ public class DarkVortexSpell extends AttractiveSpell implements ProjectileDelega
ParticleUtils.spawnParticle(source.asWorld(), LightningBoltParticleEffect.DEFAULT, getOrigin(source), Vec3d.ZERO); ParticleUtils.spawnParticle(source.asWorld(), LightningBoltParticleEffect.DEFAULT, getOrigin(source), Vec3d.ZERO);
} }
return super.tick(source, situation); super.tick(source, situation);
return true;
} }
@Override @Override
@ -134,7 +134,7 @@ public class DarkVortexSpell extends AttractiveSpell implements ProjectileDelega
@Override @Override
protected Vec3d getOrigin(Caster<?> source) { protected Vec3d getOrigin(Caster<?> source) {
return source.getOriginVector().add(SPHERE_OFFSET); return source.getOriginVector().add(0, getEventHorizonRadius() / 2D, 0);
} }
@Override @Override
@ -182,7 +182,7 @@ public class DarkVortexSpell extends AttractiveSpell implements ProjectileDelega
} }
private double getMass() { private double getMass() {
return Math.min(15, 0.1F + accumulatedMass / 10F); return 0.1F + accumulatedMass / 10F;
} }
@Override @Override

View file

@ -3,6 +3,8 @@ package com.minelittlepony.unicopia.ability.magic.spell.effect;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod; import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod;
@ -13,6 +15,8 @@ import com.minelittlepony.unicopia.entity.EntityReference;
import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.behaviour.EntitySwap; import com.minelittlepony.unicopia.entity.behaviour.EntitySwap;
import com.minelittlepony.unicopia.entity.behaviour.Inventory; import com.minelittlepony.unicopia.entity.behaviour.Inventory;
import com.minelittlepony.unicopia.item.AlicornAmuletItem;
import com.minelittlepony.unicopia.item.UItems;
import com.minelittlepony.unicopia.projectile.MagicProjectileEntity; import com.minelittlepony.unicopia.projectile.MagicProjectileEntity;
import com.minelittlepony.unicopia.projectile.ProjectileDelegate; import com.minelittlepony.unicopia.projectile.ProjectileDelegate;
@ -38,8 +42,12 @@ public class MindSwapSpell extends MimicSpell implements ProjectileDelegate.Enti
super(type); super(type);
} }
@Nullable
@Override @Override
public Spell prepareForCast(Caster<?> caster, CastingMethod method) { public Spell prepareForCast(Caster<?> caster, CastingMethod method) {
if (caster.asEntity() instanceof LivingEntity living && isValidTarget(living)) {
return null;
}
return method == CastingMethod.STAFF ? toThrowable() : this; return method == CastingMethod.STAFF ? toThrowable() : this;
} }
@ -50,21 +58,28 @@ public class MindSwapSpell extends MimicSpell implements ProjectileDelegate.Enti
counterpart.ifPresent(caster.asWorld(), e -> { counterpart.ifPresent(caster.asWorld(), e -> {
initialized = false; initialized = false;
LivingEntity master = caster.getMaster(); LivingEntity master = caster.getMaster();
Caster<?> other = Caster.of(e).get(); Caster<?> other = Caster.of(e).get();
other.getSpellSlot().removeIf(SpellType.MIMIC, true); other.getSpellSlot().removeIf(SpellType.MIMIC, true);
caster.getSpellSlot().removeIf(getType(), true); caster.getSpellSlot().removeIf(getType(), true);
if (master instanceof ServerPlayerEntity sMaster && e instanceof ServerPlayerEntity sE) { if (!isValidTarget(master) || !isValidTarget(e)) {
swapPlayerData(sMaster, sE); master.damage(caster.asWorld().getDamageSources().magic(), Float.MAX_VALUE);
master.setHealth(0);
e.damage(caster.asWorld().getDamageSources().magic(), Float.MAX_VALUE);
e.setHealth(0);
} else { } else {
EntitySwap.ALL.accept(e, master); if (master instanceof ServerPlayerEntity sMaster && e instanceof ServerPlayerEntity sE) {
Inventory.swapInventories( swapPlayerData(sMaster, sE);
e, myStoredInventory.or(() -> Inventory.of(e)), } else {
master, theirStoredInventory.or(() -> Inventory.of(master)), EntitySwap.ALL.accept(e, master);
a -> {}, Inventory.swapInventories(
a -> {} e, myStoredInventory.or(() -> Inventory.of(e)),
); master, theirStoredInventory.or(() -> Inventory.of(master)),
a -> {},
a -> {}
);
}
} }
other.playSound(USounds.SPELL_MINDSWAP_UNSWAP, 0.2F); other.playSound(USounds.SPELL_MINDSWAP_UNSWAP, 0.2F);
@ -84,8 +99,20 @@ public class MindSwapSpell extends MimicSpell implements ProjectileDelegate.Enti
if (!caster.isClient()) { if (!caster.isClient()) {
if (!initialized) { if (!initialized) {
counterpart.ifPresent(caster.asWorld(), e -> { counterpart.ifPresent(caster.asWorld(), e -> {
if (!isValidTarget(e)) {
counterpart.set(null);
setDead();
return;
}
LivingEntity master = caster.getMaster(); LivingEntity master = caster.getMaster();
if (!isValidTarget(master)) {
counterpart.set(null);
setDead();
return;
}
setDisguise(e); setDisguise(e);
Caster<?> other = Caster.of(e).get(); Caster<?> other = Caster.of(e).get();
MimicSpell mimic = SpellType.MIMIC.withTraits().apply(other, CastingMethod.INDIRECT); MimicSpell mimic = SpellType.MIMIC.withTraits().apply(other, CastingMethod.INDIRECT);
@ -144,7 +171,9 @@ public class MindSwapSpell extends MimicSpell implements ProjectileDelegate.Enti
@Override @Override
public void onImpact(MagicProjectileEntity projectile, EntityHitResult hit) { public void onImpact(MagicProjectileEntity projectile, EntityHitResult hit) {
Caster.of(projectile.getMaster()).ifPresent(master -> { Caster.of(projectile.getMaster()).ifPresent(master -> {
if (getTypeAndTraits().apply(master, CastingMethod.DIRECT) instanceof HomingSpell homing) { if (hit.getEntity() instanceof LivingEntity living
&& isValidTarget(living)
&& getTypeAndTraits().apply(master, CastingMethod.DIRECT) instanceof HomingSpell homing) {
homing.setTarget(hit.getEntity()); homing.setTarget(hit.getEntity());
} }
}); });
@ -152,13 +181,19 @@ public class MindSwapSpell extends MimicSpell implements ProjectileDelegate.Enti
@Override @Override
public boolean setTarget(Entity target) { public boolean setTarget(Entity target) {
if (target instanceof LivingEntity living && Caster.of(target).isPresent()) { if (target instanceof LivingEntity living) {
counterpart.set(living); counterpart.set(living);
} }
return false; return false;
} }
protected boolean isValidTarget(LivingEntity entity) {
return Caster.of(entity).isPresent()
//&& !UItems.ALICORN_AMULET.isApplicable(entity)
&& !UItems.PEARL_NECKLACE.isApplicable(entity);
}
@Override @Override
public void toNBT(NbtCompound compound) { public void toNBT(NbtCompound compound) {
super.toNBT(compound); super.toNBT(compound);
@ -178,6 +213,8 @@ public class MindSwapSpell extends MimicSpell implements ProjectileDelegate.Enti
} }
private static void swapPlayerData(ServerPlayerEntity a, ServerPlayerEntity b) { private static void swapPlayerData(ServerPlayerEntity a, ServerPlayerEntity b) {
AlicornAmuletItem.updateAttributes(Living.living(a), 0);
AlicornAmuletItem.updateAttributes(Living.living(b), 0);
final GameMode aMode = a.interactionManager.getGameMode(); final GameMode aMode = a.interactionManager.getGameMode();
final GameMode bMode = b.interactionManager.getGameMode(); final GameMode bMode = b.interactionManager.getGameMode();

View file

@ -11,11 +11,14 @@ import com.minelittlepony.unicopia.ability.magic.spell.Situation;
import com.minelittlepony.unicopia.ability.magic.spell.Spell; import com.minelittlepony.unicopia.ability.magic.spell.Spell;
import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait;
import com.minelittlepony.unicopia.client.minelittlepony.MineLPDelegate;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.LightningBoltParticleEffect; import com.minelittlepony.unicopia.particle.LightningBoltParticleEffect;
import com.minelittlepony.unicopia.particle.MagicParticleEffect; import com.minelittlepony.unicopia.particle.MagicParticleEffect;
import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.projectile.ProjectileUtil; import com.minelittlepony.unicopia.projectile.ProjectileUtil;
import com.minelittlepony.unicopia.util.ColorHelper;
import com.minelittlepony.unicopia.util.Lerp;
import com.minelittlepony.unicopia.util.shape.Sphere; import com.minelittlepony.unicopia.util.shape.Sphere;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@ -41,13 +44,10 @@ public class ShieldSpell extends AbstractSpell {
.with(Trait.AIR, 9) .with(Trait.AIR, 9)
.build(); .build();
private final TargetSelecter targetSelecter = new TargetSelecter(this).setFilter(this::isValidTarget); protected final TargetSelecter targetSelecter = new TargetSelecter(this).setFilter(this::isValidTarget);
private float prevRadius; private final Lerp radius = new Lerp(0);
private float radius; private final Lerp rangeMultiplier = new Lerp(1);
private float rangeMultiplier;
private float targetRangeMultiplier;
private int prevTicksDying; private int prevTicksDying;
private int ticksDying; private int ticksDying;
@ -69,19 +69,24 @@ public class ShieldSpell extends AbstractSpell {
protected void generateParticles(Caster<?> source) { protected void generateParticles(Caster<?> source) {
Vec3d origin = getOrigin(source); Vec3d origin = getOrigin(source);
source.spawnParticles(origin, new Sphere(true, radius), (int)(radius * 6), pos -> { source.spawnParticles(origin, new Sphere(true, radius.getValue()), (int)(radius.getValue() * 2), pos -> {
source.addParticle(new MagicParticleEffect(getType().getColor()), pos, Vec3d.ZERO); int hornColor = MineLPDelegate.getInstance().getMagicColor(source.getOriginatingCaster().asEntity());
source.addParticle(new MagicParticleEffect(ColorHelper.lerp(0.6F, getType().getColor(), hornColor)), pos, Vec3d.ZERO);
if (source.asWorld().random.nextInt(10) == 0 && source.asWorld().random.nextFloat() < source.getCorruption().getScaled(1)) { if (source.asWorld().random.nextInt(10) == 0 && source.asWorld().random.nextFloat() < source.getCorruption().getScaled(1)) {
ParticleUtils.spawnParticle(source.asWorld(), new LightningBoltParticleEffect(true, 3, 2, 0.1F, Optional.empty()), pos, Vec3d.ZERO); ParticleUtils.spawnParticle(source.asWorld(), new LightningBoltParticleEffect(true, 3, 2, 0.1F, Optional.empty()), pos, Vec3d.ZERO);
} }
}); });
if (source.asWorld().random.nextInt(20) == 0 || !rangeMultiplier.isFinished() || !radius.isFinished()) {
source.asEntity().playSound(USounds.SPELL_CAST_SUCCESS, 0.05F, 1.5F);
}
} }
@Override @Override
public boolean tick(Caster<?> source, Situation situation) { public boolean tick(Caster<?> source, Situation situation) {
prevRadius = radius; rangeMultiplier.update(source instanceof Pony pony && pony.asEntity().isSneaking() ? 1 : 2, 500L);
radius = (float)getDrawDropOffRange(source); radius.update((float)getDrawDropOffRange(source), 200L);
if (source.isClient()) { if (source.isClient()) {
generateParticles(source); generateParticles(source);
@ -107,6 +112,8 @@ public class ShieldSpell extends AbstractSpell {
@Override @Override
public void tickDying(Caster<?> caster) { public void tickDying(Caster<?> caster) {
rangeMultiplier.update(caster instanceof Pony pony && pony.asEntity().isSneaking() ? 1 : 2, 10L);
radius.update((float)getDrawDropOffRange(caster), 10L);
prevTicksDying = ticksDying; prevTicksDying = ticksDying;
if (ticksDying++ > 25) { if (ticksDying++ > 25) {
super.tickDying(caster); super.tickDying(caster);
@ -118,7 +125,7 @@ public class ShieldSpell extends AbstractSpell {
cost *= costMultiplier / ((1 + source.getLevel().get()) * 3F); cost *= costMultiplier / ((1 + source.getLevel().get()) * 3F);
cost /= knowledge; cost /= knowledge;
cost += radius / 10F; cost += radius.getValue() / 10F;
if (!source.subtractEnergyCost(cost)) { if (!source.subtractEnergyCost(cost)) {
setDead(); setDead();
@ -126,8 +133,8 @@ public class ShieldSpell extends AbstractSpell {
} }
public float getRadius(float tickDelta) { public float getRadius(float tickDelta) {
float base = MathHelper.lerp(tickDelta, prevRadius, radius); float base = radius.getValue();
float scale = MathHelper.clamp(MathHelper.lerp(tickDelta, prevTicksDying, ticksDying), 0, 1); float scale = 1 - MathHelper.clamp(MathHelper.lerp(tickDelta, (float)prevTicksDying, ticksDying) / 25F, 0, 1);
return base * scale; return base * scale;
} }
@ -135,17 +142,8 @@ public class ShieldSpell extends AbstractSpell {
* Calculates the maximum radius of the shield. aka The area of effect. * Calculates the maximum radius of the shield. aka The area of effect.
*/ */
public double getDrawDropOffRange(Caster<?> source) { public double getDrawDropOffRange(Caster<?> source) {
targetRangeMultiplier = source instanceof Pony pony && pony.asEntity().isSneaking() ? 1 : 2;
if (rangeMultiplier < targetRangeMultiplier - 0.1F) {
rangeMultiplier += 0.1F;
} else if (rangeMultiplier > targetRangeMultiplier + 0.1) {
rangeMultiplier -= 0.1F;
} else {
rangeMultiplier = targetRangeMultiplier;
}
float min = (source instanceof Pony ? 4 : 6) + getTraits().get(Trait.POWER); float min = (source instanceof Pony ? 4 : 6) + getTraits().get(Trait.POWER);
double range = (min + (source.getLevel().getScaled(source instanceof Pony ? 4 : 40) * (source instanceof Pony ? 2 : 10))) / rangeMultiplier; double range = (min + (source.getLevel().getScaled(source instanceof Pony ? 4 : 40) * (source instanceof Pony ? 2 : 10))) / rangeMultiplier.getValue();
return range; return range;
} }
@ -175,9 +173,9 @@ public class ShieldSpell extends AbstractSpell {
protected long applyEntities(Caster<?> source) { protected long applyEntities(Caster<?> source) {
Vec3d origin = getOrigin(source); Vec3d origin = getOrigin(source);
targetSelecter.getEntities(source, radius).forEach(i -> { targetSelecter.getEntities(source, radius.getValue()).forEach(i -> {
try { try {
applyRadialEffect(source, i, i.getPos().distanceTo(origin), radius); applyRadialEffect(source, i, i.getPos().distanceTo(origin), radius.getValue());
} catch (Throwable e) { } catch (Throwable e) {
Unicopia.LOGGER.error("Error updating radial effect", e); Unicopia.LOGGER.error("Error updating radial effect", e);
} }

View file

@ -21,6 +21,9 @@ public class TargetSelecter {
private BiPredicate<Caster<?>, Entity> filter = (a, b) -> true; private BiPredicate<Caster<?>, Entity> filter = (a, b) -> true;
private boolean targetOwner;
private boolean targetAllies;
public TargetSelecter(Spell spell) { public TargetSelecter(Spell spell) {
this.spell = spell; this.spell = spell;
} }
@ -30,18 +33,34 @@ public class TargetSelecter {
return this; return this;
} }
public TargetSelecter setTargetowner(boolean targetOwner) {
this.targetOwner = targetOwner;
return this;
}
public TargetSelecter setTargetAllies(boolean targetAllies) {
this.targetAllies = targetAllies;
return this;
}
public Stream<Entity> getEntities(Caster<?> source, double radius) { public Stream<Entity> getEntities(Caster<?> source, double radius) {
targets.values().removeIf(Target::tick); targets.values().removeIf(Target::tick);
return source.findAllEntitiesInRange(radius) return source.findAllEntitiesInRange(radius)
.filter(EntityPredicates.VALID_ENTITY) .filter(EntityPredicates.VALID_ENTITY)
.filter(EquinePredicates.EXCEPT_MAGIC_IMMUNE) .filter(EquinePredicates.EXCEPT_MAGIC_IMMUNE)
.filter(entity -> entity != source.asEntity() && validTarget(spell, source, entity) && filter.test(source, entity)) .filter(entity -> entity != source.asEntity() && checkAlliegance(spell, source, entity) && filter.test(source, entity))
.map(i -> { .map(i -> {
targets.computeIfAbsent(i.getUuid(), Target::new); targets.computeIfAbsent(i.getUuid(), Target::new);
return i; return i;
}); });
} }
private boolean checkAlliegance(Affine affine, Caster<?> source, Entity target) {
boolean isOwner = !targetOwner && source.isOwnerOrVehicle(target);
boolean isFriend = !targetAllies && affine.applyInversion(source, source.isFriend(target));
return !(isOwner || isFriend);
}
public long getTotalDamaged() { public long getTotalDamaged() {
return targets.values().stream().filter(Target::canHurt).count(); return targets.values().stream().filter(Target::canHurt).count();
} }

View file

@ -15,7 +15,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockView; import net.minecraft.world.BlockView;
interface BlockConstructionUtils { public interface BlockConstructionUtils {
static ButtonBlock woodenButton() { static ButtonBlock woodenButton() {
return woodenButton(BlockSoundGroup.WOOD, BlockSetType.OAK); return woodenButton(BlockSoundGroup.WOOD, BlockSetType.OAK);
} }

View file

@ -0,0 +1,22 @@
package com.minelittlepony.unicopia.block;
import net.minecraft.block.BlockState;
import net.minecraft.block.SoulFireBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class SpectralFireBlock extends SoulFireBlock {
public SpectralFireBlock(Settings settings) {
super(settings);
}
@Override
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
if (!(entity instanceof ItemEntity)) {
super.onEntityCollision(state, world, pos, entity);
}
}
}

View file

@ -2,6 +2,8 @@ package com.minelittlepony.unicopia.block;
import org.joml.Vector3f; import org.joml.Vector3f;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.SideShapeType; import net.minecraft.block.SideShapeType;
@ -37,7 +39,7 @@ public class SpikesBlock extends OrientedBlock {
if ((normVel.x + normVel.y + normVel.z) < -0.08F) { if ((normVel.x + normVel.y + normVel.z) < -0.08F) {
float damage = (float)vel.lengthSquared() * 26; float damage = (float)vel.lengthSquared() * 26;
entity.damage(world.getDamageSources().cactus(), damage); entity.damage(world.getDamageSources().create(UDamageTypes.SPIKES), damage);
} }
} }
} }
@ -50,7 +52,7 @@ public class SpikesBlock extends OrientedBlock {
if (!(e instanceof LivingEntity) || e.getType() == EntityType.FOX || e.getType() == EntityType.BEE) { if (!(e instanceof LivingEntity) || e.getType() == EntityType.FOX || e.getType() == EntityType.BEE) {
continue; continue;
} }
e.damage(world.getDamageSources().cactus(), 6); e.damage(world.getDamageSources().create(UDamageTypes.SPIKES), 6);
} }
} }
} }

View file

@ -21,6 +21,15 @@ import com.minelittlepony.unicopia.block.cloud.SoggyCloudBlock;
import com.minelittlepony.unicopia.block.cloud.SoggyCloudSlabBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudSlabBlock;
import com.minelittlepony.unicopia.block.cloud.SoggyCloudStairsBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudStairsBlock;
import com.minelittlepony.unicopia.block.cloud.UnstableCloudBlock; import com.minelittlepony.unicopia.block.cloud.UnstableCloudBlock;
import com.minelittlepony.unicopia.block.zap.BaseZapAppleLeavesBlock;
import com.minelittlepony.unicopia.block.zap.ElectrifiedFenceBlock;
import com.minelittlepony.unicopia.block.zap.ElectrifiedFenceGateBlock;
import com.minelittlepony.unicopia.block.zap.ZapAppleLeavesBlock;
import com.minelittlepony.unicopia.block.zap.ZapAppleLeavesPlaceholderBlock;
import com.minelittlepony.unicopia.block.zap.ZapAppleLogBlock;
import com.minelittlepony.unicopia.block.zap.ZapBlock;
import com.minelittlepony.unicopia.block.zap.ZapSlabBlock;
import com.minelittlepony.unicopia.block.zap.ZapStairsBlock;
import com.minelittlepony.unicopia.entity.effect.UEffects; import com.minelittlepony.unicopia.entity.effect.UEffects;
import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.UItems;
import com.minelittlepony.unicopia.item.cloud.CloudBlockItem; import com.minelittlepony.unicopia.item.cloud.CloudBlockItem;
@ -28,6 +37,7 @@ import com.minelittlepony.unicopia.item.group.ItemGroupRegistry;
import com.minelittlepony.unicopia.server.world.UTreeGen; import com.minelittlepony.unicopia.server.world.UTreeGen;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; import net.fabricmc.fabric.api.registry.FlammableBlockRegistry;
import net.fabricmc.fabric.api.registry.OxidizableBlocksRegistry;
import net.fabricmc.fabric.api.registry.StrippableBlockRegistry; import net.fabricmc.fabric.api.registry.StrippableBlockRegistry;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.*; import net.minecraft.block.*;
@ -59,31 +69,47 @@ public interface UBlocks {
Block FROSTED_OBSIDIAN = register("frosted_obsidian", new FrostedObsidianBlock(FabricBlockSettings.copy(Blocks.OBSIDIAN).ticksRandomly())); Block FROSTED_OBSIDIAN = register("frosted_obsidian", new FrostedObsidianBlock(FabricBlockSettings.copy(Blocks.OBSIDIAN).ticksRandomly()));
Block ZAP_LOG = register("zap_log", new ZapAppleLogBlock(Blocks.OAK_LOG, MapColor.GRAY, MapColor.DEEPSLATE_GRAY), ItemGroups.BUILDING_BLOCKS); Block ZAP_LOG = register("zap_log", new ZapAppleLogBlock(Blocks.OAK_LOG.getDefaultState(), UMapColors.ZAP_LOG_END, UMapColors.ZAP_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block ZAP_WOOD = register("zap_wood", new ZapAppleLogBlock(Blocks.OAK_WOOD, MapColor.DEEPSLATE_GRAY, MapColor.DEEPSLATE_GRAY), ItemGroups.BUILDING_BLOCKS); Block ZAP_WOOD = register("zap_wood", new ZapAppleLogBlock(Blocks.OAK_WOOD.getDefaultState(), UMapColors.ZAP_LOG_SIDE, UMapColors.ZAP_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block STRIPPED_ZAP_LOG = register("stripped_zap_log", new ZapAppleLogBlock(Blocks.STRIPPED_OAK_LOG.getDefaultState(), UMapColors.ZAP_LOG_END, UMapColors.STRIPPED_ZAP_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block STRIPPED_ZAP_WOOD = register("stripped_zap_wood", new ZapAppleLogBlock(Blocks.STRIPPED_OAK_WOOD.getDefaultState(), UMapColors.STRIPPED_ZAP_LOG_SIDE, UMapColors.STRIPPED_ZAP_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block STRIPPED_ZAP_LOG = register("stripped_zap_log", new ZapAppleLogBlock(Blocks.STRIPPED_OAK_LOG, MapColor.LIGHT_GRAY, MapColor.GRAY), ItemGroups.BUILDING_BLOCKS); Block WAXED_ZAP_LOG = register("waxed_zap_log", BlockConstructionUtils.createLogBlock(UMapColors.ZAP_LOG_END, UMapColors.ZAP_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block STRIPPED_ZAP_WOOD = register("stripped_zap_wood", new ZapAppleLogBlock(Blocks.STRIPPED_OAK_WOOD, MapColor.GRAY, MapColor.GRAY), ItemGroups.BUILDING_BLOCKS); Block WAXED_ZAP_WOOD = register("waxed_zap_wood", BlockConstructionUtils.createLogBlock(UMapColors.ZAP_LOG_SIDE, UMapColors.ZAP_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block WAXED_STRIPPED_ZAP_LOG = register("waxed_stripped_zap_log", BlockConstructionUtils.createLogBlock(UMapColors.ZAP_LOG_END, UMapColors.STRIPPED_ZAP_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block WAXED_STRIPPED_ZAP_WOOD = register("waxed_stripped_zap_wood", BlockConstructionUtils.createLogBlock(UMapColors.STRIPPED_ZAP_LOG_SIDE, UMapColors.STRIPPED_ZAP_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block ZAP_PLANKS = register("zap_planks", new ZapBlock(Settings.create().mapColor(UMapColors.ZAP_PLANKS).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block ZAP_STAIRS = register("zap_stairs", new ZapStairsBlock(ZAP_PLANKS.getDefaultState(), Settings.copy(ZAP_PLANKS).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block ZAP_SLAB = register("zap_slab", new ZapSlabBlock(Settings.create().mapColor(ZAP_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block ZAP_FENCE = register("zap_fence", new ElectrifiedFenceBlock(Settings.create().mapColor(ZAP_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block ZAP_FENCE_GATE = register("zap_fence_gate", new ElectrifiedFenceGateBlock(Settings.create().mapColor(ZAP_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL), UWoodTypes.ZAP), ItemGroups.BUILDING_BLOCKS);
Block WAXED_ZAP_PLANKS = register("waxed_zap_planks", new Block(Settings.create().mapColor(UMapColors.ZAP_PLANKS).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block WAXED_ZAP_STAIRS = register("waxed_zap_stairs", new StairsBlock(WAXED_ZAP_PLANKS.getDefaultState(), Settings.copy(WAXED_ZAP_PLANKS).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block WAXED_ZAP_SLAB = register("waxed_zap_slab", new SlabBlock(Settings.create().mapColor(WAXED_ZAP_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block WAXED_ZAP_FENCE = register("waxed_zap_fence", new FenceBlock(Settings.create().mapColor(WAXED_ZAP_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block WAXED_ZAP_FENCE_GATE = register("waxed_zap_fence_gate", new FenceGateBlock(Settings.create().mapColor(WAXED_ZAP_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL), UWoodTypes.ZAP), ItemGroups.BUILDING_BLOCKS);
Block ZAP_LEAVES = register("zap_leaves", new ZapAppleLeavesBlock(), ItemGroups.NATURAL); Block ZAP_LEAVES = register("zap_leaves", new ZapAppleLeavesBlock(), ItemGroups.NATURAL);
Block FLOWERING_ZAP_LEAVES = register("flowering_zap_leaves", new BaseZapAppleLeavesBlock(), ItemGroups.NATURAL); Block FLOWERING_ZAP_LEAVES = register("flowering_zap_leaves", new BaseZapAppleLeavesBlock(), ItemGroups.NATURAL);
Block ZAP_LEAVES_PLACEHOLDER = register("zap_leaves_placeholder", new ZapAppleLeavesPlaceholderBlock()); Block ZAP_LEAVES_PLACEHOLDER = register("zap_leaves_placeholder", new ZapAppleLeavesPlaceholderBlock());
Block ZAP_BULB = register("zap_bulb", new FruitBlock(Settings.create().mapColor(MapColor.GRAY).strength(500, 1200).sounds(BlockSoundGroup.AZALEA_LEAVES), Direction.DOWN, ZAP_LEAVES, FruitBlock.DEFAULT_SHAPE, false)); Block ZAP_BULB = register("zap_bulb", new FruitBlock(Settings.create().mapColor(MapColor.GRAY).strength(500, 1200).sounds(BlockSoundGroup.AZALEA_LEAVES), Direction.DOWN, ZAP_LEAVES, FruitBlock.DEFAULT_SHAPE, false));
Block ZAP_APPLE = register("zap_apple", new FruitBlock(Settings.create().mapColor(MapColor.GRAY).sounds(BlockSoundGroup.AZALEA_LEAVES), Direction.DOWN, ZAP_LEAVES, FruitBlock.DEFAULT_SHAPE, false)); Block ZAP_APPLE = register("zap_apple", new FruitBlock(Settings.create().mapColor(MapColor.YELLOW).sounds(BlockSoundGroup.AZALEA_LEAVES), Direction.DOWN, ZAP_LEAVES, FruitBlock.DEFAULT_SHAPE, false));
Block PALM_LOG = register("palm_log", BlockConstructionUtils.createLogBlock(MapColor.OFF_WHITE, MapColor.SPRUCE_BROWN), ItemGroups.BUILDING_BLOCKS); Block PALM_LOG = register("palm_log", BlockConstructionUtils.createLogBlock(UMapColors.PALM_LOG_END, UMapColors.PALM_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block PALM_WOOD = register("palm_wood", BlockConstructionUtils.createWoodBlock(MapColor.OFF_WHITE), ItemGroups.BUILDING_BLOCKS); Block PALM_WOOD = register("palm_wood", BlockConstructionUtils.createWoodBlock(UMapColors.PALM_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block STRIPPED_PALM_LOG = register("stripped_palm_log", BlockConstructionUtils.createLogBlock(MapColor.OFF_WHITE, MapColor.OFF_WHITE), ItemGroups.BUILDING_BLOCKS); Block STRIPPED_PALM_LOG = register("stripped_palm_log", BlockConstructionUtils.createLogBlock(UMapColors.PALM_LOG_END, UMapColors.STRIPPED_PALM_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block STRIPPED_PALM_WOOD = register("stripped_palm_wood", BlockConstructionUtils.createWoodBlock(MapColor.OFF_WHITE), ItemGroups.BUILDING_BLOCKS); Block STRIPPED_PALM_WOOD = register("stripped_palm_wood", BlockConstructionUtils.createWoodBlock(UMapColors.STRIPPED_PALM_LOG_SIDE), ItemGroups.BUILDING_BLOCKS);
Block PALM_PLANKS = register("palm_planks", new Block(Settings.create().mapColor(MapColor.OFF_WHITE).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS); Block PALM_PLANKS = register("palm_planks", new Block(Settings.create().mapColor(UMapColors.PALM_PLANKS).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block PALM_STAIRS = register("palm_stairs", new StairsBlock(PALM_PLANKS.getDefaultState(), Settings.copy(PALM_PLANKS).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS); Block PALM_STAIRS = register("palm_stairs", new StairsBlock(PALM_PLANKS.getDefaultState(), Settings.copy(PALM_PLANKS).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block PALM_SLAB = register("palm_slab", new SlabBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS); Block PALM_SLAB = register("palm_slab", new SlabBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block PALM_FENCE = register("palm_fence", new FenceBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS); Block PALM_FENCE = register("palm_fence", new FenceBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS);
Block PALM_FENCE_GATE = register("palm_fence_gate", new FenceGateBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL), UWoodTypes.PALM), ItemGroups.BUILDING_BLOCKS); Block PALM_FENCE_GATE = register("palm_fence_gate", new FenceGateBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL), UWoodTypes.PALM), ItemGroups.BUILDING_BLOCKS);
Block PALM_DOOR = register("palm_door", new DoorBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).instrument(Instrument.BASS).strength(3.0f).nonOpaque().burnable().pistonBehavior(PistonBehavior.DESTROY), UWoodTypes.PALM.setType()), ItemGroups.FUNCTIONAL); Block PALM_DOOR = register("palm_door", new DoorBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).instrument(Instrument.BASS).strength(3.0f).nonOpaque().burnable().pistonBehavior(PistonBehavior.DESTROY), UWoodTypes.PALM.setType()), ItemGroups.FUNCTIONAL);
Block PALM_TRAPDOOR = register("palm_trapdoor", new TrapdoorBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).instrument(Instrument.BASS).strength(3).nonOpaque().allowsSpawning(BlockConstructionUtils::never).burnable(), UWoodTypes.PALM.setType()), ItemGroups.FUNCTIONAL); Block PALM_TRAPDOOR = register("palm_trapdoor", new TrapdoorBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).instrument(Instrument.BASS).strength(3).nonOpaque().allowsSpawning(BlockConstructionUtils::never).burnable(), UWoodTypes.PALM.setType()), ItemGroups.FUNCTIONAL);
Block PALM_PRESSURE_PLATE = register("palm_pressure_plate", new PressurePlateBlock(PressurePlateBlock.ActivationRule.EVERYTHING, Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).noCollision().strength(0.5f).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.DESTROY), BlockSetType.OAK), ItemGroups.BUILDING_BLOCKS); Block PALM_PRESSURE_PLATE = register("palm_pressure_plate", new PressurePlateBlock(PressurePlateBlock.ActivationRule.EVERYTHING, Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).noCollision().strength(0.5f).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.DESTROY), UWoodTypes.PALM.setType()), ItemGroups.BUILDING_BLOCKS);
Block PALM_BUTTON = register("palm_button", BlockConstructionUtils.woodenButton(), ItemGroups.BUILDING_BLOCKS); Block PALM_BUTTON = register("palm_button", BlockConstructionUtils.woodenButton(), ItemGroups.BUILDING_BLOCKS);
Block PALM_SIGN = register("palm_sign", new SignBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).solid().instrument(Instrument.BASS).noCollision().strength(1).burnable().sounds(BlockSoundGroup.WOOD), UWoodTypes.PALM), ItemGroups.FUNCTIONAL); Block PALM_SIGN = register("palm_sign", new SignBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).solid().instrument(Instrument.BASS).noCollision().strength(1).burnable().sounds(BlockSoundGroup.WOOD), UWoodTypes.PALM), ItemGroups.FUNCTIONAL);
Block PALM_WALL_SIGN = register("palm_wall_sign", new WallSignBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).solid().instrument(Instrument.BASS).noCollision().strength(1).dropsLike(PALM_SIGN).burnable(), UWoodTypes.PALM)); Block PALM_WALL_SIGN = register("palm_wall_sign", new WallSignBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).solid().instrument(Instrument.BASS).noCollision().strength(1).dropsLike(PALM_SIGN).burnable(), UWoodTypes.PALM));
@ -225,6 +251,8 @@ public interface UBlocks {
Block CRYSTAL_DOOR = register("crystal_door", new CrystalDoorBlock(Settings.copy(Blocks.IRON_DOOR), UWoodTypes.CRYSTAL), ItemGroups.FUNCTIONAL); Block CRYSTAL_DOOR = register("crystal_door", new CrystalDoorBlock(Settings.copy(Blocks.IRON_DOOR), UWoodTypes.CRYSTAL), ItemGroups.FUNCTIONAL);
Block CLOUD_DOOR = register("cloud_door", new CloudDoorBlock(Settings.copy(CLOUD), CLOUD.getDefaultState(), UWoodTypes.CLOUD), ItemGroups.FUNCTIONAL); Block CLOUD_DOOR = register("cloud_door", new CloudDoorBlock(Settings.copy(CLOUD), CLOUD.getDefaultState(), UWoodTypes.CLOUD), ItemGroups.FUNCTIONAL);
Block SPECTRAL_FIRE = register("spectral_fire", new SpectralFireBlock(Settings.copy(Blocks.SOUL_FIRE)));
EdibleBlock HAY_BLOCK = register("hay_block", new EdibleBlock(new Identifier("hay_block"), new Identifier("wheat"), true)); EdibleBlock HAY_BLOCK = register("hay_block", new EdibleBlock(new Identifier("hay_block"), new Identifier("wheat"), true));
private static <T extends Block> T register(String name, T item) { private static <T extends Block> T register(String name, T item) {
@ -266,7 +294,16 @@ public interface UBlocks {
StrippableBlockRegistry.register(PALM_LOG, STRIPPED_PALM_LOG); StrippableBlockRegistry.register(PALM_LOG, STRIPPED_PALM_LOG);
StrippableBlockRegistry.register(ZAP_WOOD, STRIPPED_ZAP_WOOD); StrippableBlockRegistry.register(ZAP_WOOD, STRIPPED_ZAP_WOOD);
StrippableBlockRegistry.register(PALM_WOOD, STRIPPED_PALM_WOOD); StrippableBlockRegistry.register(PALM_WOOD, STRIPPED_PALM_WOOD);
Collections.addAll(TRANSLUCENT_BLOCKS, WEATHER_VANE, CHITIN_SPIKES, PLUNDER_VINE, PLUNDER_VINE_BUD, CLAM_SHELL, SCALLOP_SHELL, TURRET_SHELL, CURING_JOKE); OxidizableBlocksRegistry.registerWaxableBlockPair(ZAP_LOG, WAXED_ZAP_LOG);
OxidizableBlocksRegistry.registerWaxableBlockPair(ZAP_WOOD, WAXED_ZAP_WOOD);
OxidizableBlocksRegistry.registerWaxableBlockPair(STRIPPED_ZAP_LOG, WAXED_STRIPPED_ZAP_LOG);
OxidizableBlocksRegistry.registerWaxableBlockPair(STRIPPED_ZAP_WOOD, WAXED_STRIPPED_ZAP_WOOD);
OxidizableBlocksRegistry.registerWaxableBlockPair(ZAP_PLANKS, WAXED_ZAP_PLANKS);
OxidizableBlocksRegistry.registerWaxableBlockPair(ZAP_STAIRS, WAXED_ZAP_STAIRS);
OxidizableBlocksRegistry.registerWaxableBlockPair(ZAP_SLAB, WAXED_ZAP_SLAB);
OxidizableBlocksRegistry.registerWaxableBlockPair(ZAP_FENCE, WAXED_ZAP_FENCE);
OxidizableBlocksRegistry.registerWaxableBlockPair(ZAP_FENCE_GATE, WAXED_ZAP_FENCE_GATE);
Collections.addAll(TRANSLUCENT_BLOCKS, WEATHER_VANE, CHITIN_SPIKES, PLUNDER_VINE, PLUNDER_VINE_BUD, CLAM_SHELL, SCALLOP_SHELL, TURRET_SHELL, CURING_JOKE, SPECTRAL_FIRE);
TintedBlock.REGISTRY.add(PALM_LEAVES); TintedBlock.REGISTRY.add(PALM_LEAVES);
FlammableBlockRegistry.getDefaultInstance().add(GREEN_APPLE_LEAVES, 30, 60); FlammableBlockRegistry.getDefaultInstance().add(GREEN_APPLE_LEAVES, 30, 60);
@ -274,14 +311,22 @@ public interface UBlocks {
FlammableBlockRegistry.getDefaultInstance().add(SOUR_APPLE_LEAVES, 30, 60); FlammableBlockRegistry.getDefaultInstance().add(SOUR_APPLE_LEAVES, 30, 60);
FlammableBlockRegistry.getDefaultInstance().add(GOLDEN_OAK_LEAVES, 60, 120); FlammableBlockRegistry.getDefaultInstance().add(GOLDEN_OAK_LEAVES, 60, 120);
FlammableBlockRegistry.getDefaultInstance().add(MANGO_LEAVES, 30, 60); FlammableBlockRegistry.getDefaultInstance().add(MANGO_LEAVES, 30, 60);
FlammableBlockRegistry.getDefaultInstance().add(PALM_LEAVES, 30, 60);
FlammableBlockRegistry.getDefaultInstance().add(PALM_LOG, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(PALM_WOOD, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(GOLDEN_OAK_LOG, 15, 15); FlammableBlockRegistry.getDefaultInstance().add(GOLDEN_OAK_LOG, 15, 15);
FlammableBlockRegistry.getDefaultInstance().add(PALM_PLANKS, 5, 20);
FlammableBlockRegistry.getDefaultInstance().add(PALM_SLAB, 5, 20);
FlammableBlockRegistry.getDefaultInstance().add(PALM_FENCE_GATE, 5, 20);
FlammableBlockRegistry.getDefaultInstance().add(PALM_FENCE, 5, 20);
FlammableBlockRegistry.getDefaultInstance().add(PALM_STAIRS, 5, 20);
FlammableBlockRegistry.getDefaultInstance().add(PALM_LOG, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(STRIPPED_PALM_LOG, 5, 5); FlammableBlockRegistry.getDefaultInstance().add(STRIPPED_PALM_LOG, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(STRIPPED_PALM_WOOD, 5, 5); FlammableBlockRegistry.getDefaultInstance().add(STRIPPED_PALM_WOOD, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(PALM_PLANKS, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(PALM_WOOD, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(PALM_LEAVES, 30, 60);
FlammableBlockRegistry.getDefaultInstance().add(BANANAS, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(BANANAS, 5, 20);
FlammableBlockRegistry.getDefaultInstance().add(CURING_JOKE, 60, 100);
UBlockEntities.bootstrap(); UBlockEntities.bootstrap();
EdibleBlock.bootstrap(); EdibleBlock.bootstrap();

View file

@ -0,0 +1,15 @@
package com.minelittlepony.unicopia.block;
import net.minecraft.block.MapColor;
public interface UMapColors {
MapColor ZAP_LEAVES = MapColor.MAGENTA;
MapColor ZAP_PLANKS = MapColor.MAGENTA;
MapColor ZAP_LOG_SIDE = MapColor.PURPLE;
MapColor ZAP_LOG_END = MapColor.MAGENTA;
MapColor STRIPPED_ZAP_LOG_SIDE = MapColor.PURPLE;
MapColor PALM_PLANKS = MapColor.OFF_WHITE;
MapColor PALM_LOG_END = MapColor.OFF_WHITE;
MapColor PALM_LOG_SIDE = MapColor.SPRUCE_BROWN;
MapColor STRIPPED_PALM_LOG_SIDE = MapColor.OFF_WHITE;
}

View file

@ -15,6 +15,7 @@ import net.minecraft.util.Identifier;
public interface UWoodTypes { public interface UWoodTypes {
WoodType PALM = register("palm"); WoodType PALM = register("palm");
WoodType ZAP = register("zap");
WoodType GOLDEN_OAK = register("golden_oak"); WoodType GOLDEN_OAK = register("golden_oak");
RegistryKey<TerraformBoatType> PALM_BOAT_TYPE = TerraformBoatTypeRegistry.createKey(Unicopia.id("palm")); RegistryKey<TerraformBoatType> PALM_BOAT_TYPE = TerraformBoatTypeRegistry.createKey(Unicopia.id("palm"));

View file

@ -1,83 +0,0 @@
package com.minelittlepony.unicopia.block;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.LightningBoltParticleEffect;
import com.minelittlepony.unicopia.particle.ParticleUtils;
import net.minecraft.block.*;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.BooleanProperty;
import net.minecraft.util.math.*;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
import net.minecraft.world.event.GameEvent;
public class ZapBlock extends Block {
public static final BooleanProperty NATURAL = BooleanProperty.of("natural");
private final Block artificialModelBlock;
ZapBlock(Settings settings, Block artificialModelBlock) {
super(settings.strength(500, 1200));
setDefaultState(getDefaultState().with(NATURAL, true));
this.artificialModelBlock = artificialModelBlock;
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
super.appendProperties(builder);
builder.add(NATURAL);
}
@Override
public BlockState getPlacementState(ItemPlacementContext ctx) {
return getDefaultState().with(NATURAL, false);
}
@Deprecated
@Override
public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) {
triggerLightning(state, world, pos, player);
}
@Deprecated
@Override
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
if (!state.get(NATURAL)) {
return artificialModelBlock.calcBlockBreakingDelta(artificialModelBlock.getDefaultState(), player, world, pos);
}
float delta = super.calcBlockBreakingDelta(state, player, world, pos);
if (Pony.of(player).getCompositeRace().canUseEarth()) {
delta *= 50;
}
return MathHelper.clamp(delta, 0, 0.9F);
}
public static void triggerLightning(BlockState state, World world, BlockPos pos, PlayerEntity player) {
if (world instanceof ServerWorld serverWorld) {
Vec3d center = Vec3d.ofCenter(pos);
LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(world);
world.getOtherEntities(null, Box.from(center).expand(7)).forEach(other -> {
float dist = (float)other.getPos().distanceTo(center);
if (dist < 4) {
other.onStruckByLightning(serverWorld, lightning);
} else {
float damage = 3 / dist;
if (damage > 1) {
other.damage(world.getDamageSources().lightningBolt(), damage);
}
}
});
}
world.emitGameEvent(GameEvent.LIGHTNING_STRIKE, pos, GameEvent.Emitter.of(state));
ParticleUtils.spawnParticle(world, LightningBoltParticleEffect.DEFAULT, Vec3d.ofCenter(pos), Vec3d.ZERO);
}
}

View file

@ -0,0 +1,45 @@
package com.minelittlepony.unicopia.block.state;
import java.util.Arrays;
import java.util.function.Supplier;
class ExpandableList<T> {
private final Supplier<T> defaultValue;
private Object[] values;
private int size;
public ExpandableList(int initialCapacity, Supplier<T> defaultValue) {
this.defaultValue = defaultValue;
values = new Object[Math.max(0, initialCapacity)];
}
public int size() {
return size;
}
@SuppressWarnings("unchecked")
public T get(int index) {
T t = (T)values[index];
if (t == null) {
values[index] = t = defaultValue.get();
}
return t;
}
public T getOrExpand(int index) {
resize(index);
return get(index);
}
public void set(int index, T value) {
resize(index);
values[index] = value;
}
private void resize(int index) {
if (index >= values.length) {
values = Arrays.copyOf(values, Math.max(index + 1, (values.length + 1) * 2));
}
size = Math.max(index + 1, size);
}
}

View file

@ -0,0 +1,85 @@
package com.minelittlepony.unicopia.block.state;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.network.PacketByteBuf;
public record Schematic(int dx, int dy, int dz, Entry[] states) {
public static final Schematic ALTAR = new Schematic.Builder()
.fill(0, 0, 0, 8, 0, 8, Blocks.SOUL_SAND.getDefaultState())
.fill(3, 1, 3, 5, 1, 5, Blocks.OBSIDIAN.getDefaultState())
.set(4, 1, 4, Blocks.SOUL_SAND.getDefaultState())
.set(4, 2, 4, Blocks.SOUL_FIRE.getDefaultState())
.set(4, 1, 6, Blocks.LODESTONE.getDefaultState())
.fill(0, 1, 2, 0, 4, 2, Blocks.OBSIDIAN.getDefaultState()).fill(0, 1, 6, 0, 4, 6, Blocks.OBSIDIAN.getDefaultState())
.fill(2, 1, 0, 2, 4, 0, Blocks.OBSIDIAN.getDefaultState()).fill(6, 1, 0, 6, 4, 0, Blocks.OBSIDIAN.getDefaultState())
.fill(8, 1, 2, 8, 4, 2, Blocks.OBSIDIAN.getDefaultState()).fill(8, 1, 6, 8, 4, 6, Blocks.OBSIDIAN.getDefaultState())
.fill(2, 1, 8, 2, 4, 8, Blocks.OBSIDIAN.getDefaultState()).fill(6, 1, 8, 6, 4, 8, Blocks.OBSIDIAN.getDefaultState())
.build();
public static Schematic fromPacket(PacketByteBuf buffer) {
Builder builder = new Builder();
buffer.readCollection(ArrayList::new, buf -> {
byte op = buf.readByte();
return switch (op) {
case 1 -> builder.set(buf.readInt(), buf.readInt(), buf.readInt(), Block.getStateFromRawId(buf.readInt()));
case 2 -> builder.fill(buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), Block.getStateFromRawId(buf.readInt()));
default -> builder;
};
});
return builder.build();
}
public int volume() {
return states.length;
}
public static final class Builder {
private static final BlockState AIR = Blocks.AIR.getDefaultState();
private int dx = -1;
private int dy = -1;
private int dz = -1;
private final ExpandableList<ExpandableList<ExpandableList<BlockState>>> layers = new ExpandableList<>(0, () -> new ExpandableList<>(dz, () -> new ExpandableList<>(dx, () -> AIR)));
public Builder set(int x, int y, int z, BlockState state) {
dx = Math.max(dx, x);
dy = Math.max(dy, y);
dz = Math.max(dz, z);
layers.getOrExpand(y).getOrExpand(z).set(x, state);
return this;
}
public Builder fill(int minX, int minY, int minZ, int maxX, int maxY, int maxZ, BlockState state) {
dx = Math.max(dx, maxX);
dy = Math.max(dy, maxY);
dz = Math.max(dz, maxZ);
for (int x = minX; x <= maxX; x++)
for (int y = minY; y <= maxY; y++)
for (int z = minZ; z <= maxZ; z++)
set(x, y, z, state);
return this;
}
public Schematic build() {
List<Entry> states = new LinkedList<>();
for (int y = 0; y <= dy && y < layers.size(); y++)
for (int z = 0; z <= dz && z < layers.get(y).size(); z++)
for (int x = 0; x <= dx && x < layers.get(y).get(z).size(); x++) {
BlockState state = layers.get(y).get(z).get(x);
if (!state.isAir()) {
states.add(new Entry(x, y, z, state));
}
}
return new Schematic(dx, dy, dz, states.toArray(Entry[]::new));
}
}
public record Entry(int x, int y, int z, BlockState state) {}
}

View file

@ -1,7 +1,10 @@
package com.minelittlepony.unicopia.block; package com.minelittlepony.unicopia.block.zap;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.block.BlockConstructionUtils;
import com.minelittlepony.unicopia.block.TintedBlock;
import com.minelittlepony.unicopia.block.UMapColors;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.server.world.ZapAppleStageStore; import com.minelittlepony.unicopia.server.world.ZapAppleStageStore;
@ -13,11 +16,11 @@ import net.minecraft.util.math.*;
import net.minecraft.util.math.random.Random; import net.minecraft.util.math.random.Random;
import net.minecraft.world.*; import net.minecraft.world.*;
public class BaseZapAppleLeavesBlock extends LeavesBlock implements TintedBlock, ZapStagedBlock { public class BaseZapAppleLeavesBlock extends LeavesBlock implements TintedBlock, ZapStagedBlock, ElectrifiedBlock {
BaseZapAppleLeavesBlock() { public BaseZapAppleLeavesBlock() {
super(Settings.create() super(Settings.create()
.mapColor(MapColor.PURPLE) .mapColor(UMapColors.ZAP_LEAVES)
.strength(500, 1200) .strength(500, 1200)
.ticksRandomly() .ticksRandomly()
.sounds(BlockSoundGroup.AZALEA_LEAVES) .sounds(BlockSoundGroup.AZALEA_LEAVES)
@ -77,7 +80,7 @@ public class BaseZapAppleLeavesBlock extends LeavesBlock implements TintedBlock,
@Override @Override
public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) { public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) {
ZapBlock.triggerLightning(state, world, pos, player); triggerLightning(state, world, pos);
} }
@Override @Override

View file

@ -0,0 +1,83 @@
package com.minelittlepony.unicopia.block.zap;
import java.util.Optional;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.LightningBoltParticleEffect;
import com.minelittlepony.unicopia.particle.ParticleUtils;
import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.World;
import net.minecraft.world.event.GameEvent;
public interface ElectrifiedBlock {
default void spawnElectricalParticles(World world, BlockPos pos, Random random) {
world.addParticle(new LightningBoltParticleEffect(true, 10, 1, 0.6F, Optional.empty()),
pos.getX() + 0.5,
pos.getY() + 0.5,
pos.getZ() + 0.5,
0, 0, 0
);
}
default float getBlockBreakingDelta(float delta, PlayerEntity player) {
if (Pony.of(player).getCompositeRace().canUseEarth()) {
delta *= 50;
}
return MathHelper.clamp(delta, 0, 0.9F);
}
default void triggerLightning(BlockState state, World world, BlockPos pos) {
Vec3d center = pos.toCenterPos();
if (world instanceof ServerWorld serverWorld) {
LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(world);
world.getOtherEntities(null, Box.from(center).expand(7)).forEach(entity -> {
shockEntity(serverWorld, center, lightning, entity);
});
}
world.emitGameEvent(GameEvent.LIGHTNING_STRIKE, pos, GameEvent.Emitter.of(state));
ParticleUtils.spawnParticle(world, LightningBoltParticleEffect.DEFAULT, center, Vec3d.ZERO);
}
default void triggerLightning(BlockState state, World world, BlockPos pos, LivingEntity entity, boolean knockBack) {
Vec3d center = pos.toCenterPos();
if (world instanceof ServerWorld serverWorld) {
shockEntity(serverWorld, center, EntityType.LIGHTNING_BOLT.create(world), entity);
}
if (knockBack) {
Vec3d offset = center.subtract(entity.getPos());
entity.takeKnockback(0.8, offset.x, offset.z);
}
world.emitGameEvent(GameEvent.LIGHTNING_STRIKE, pos, GameEvent.Emitter.of(state));
ParticleUtils.spawnParticle(world, LightningBoltParticleEffect.DEFAULT, center, Vec3d.ZERO);
}
private static void shockEntity(ServerWorld serverWorld, Vec3d center, LightningEntity lightning, Entity entity) {
if (entity instanceof ItemEntity) {
return;
}
float dist = (float)entity.getPos().distanceTo(center);
if (dist < 4) {
entity.onStruckByLightning(serverWorld, EntityType.LIGHTNING_BOLT.create(serverWorld));
} else {
float damage = 3 / dist;
if (damage > 1) {
entity.damage(entity.getDamageSources().lightningBolt(), damage);
}
}
}
}

View file

@ -0,0 +1,43 @@
package com.minelittlepony.unicopia.block.zap;
import net.minecraft.block.BlockState;
import net.minecraft.block.FenceBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
public class ElectrifiedFenceBlock extends FenceBlock implements ElectrifiedBlock {
public ElectrifiedFenceBlock(Settings settings) {
super(settings);
}
@Override
public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) {
super.randomDisplayTick(state, world, pos, random);
spawnElectricalParticles(world, pos, random);
}
@Deprecated
@Override
public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) {
triggerLightning(state, world, pos);
}
@Deprecated
@Override
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
return getBlockBreakingDelta(super.calcBlockBreakingDelta(state, player, world, pos), player);
}
@Override
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
if (entity instanceof LivingEntity l && l.hurtTime == 0 && l.canTakeDamage()) {
triggerLightning(state, world, pos, l, true);
}
}
}

View file

@ -0,0 +1,45 @@
package com.minelittlepony.unicopia.block.zap;
import net.minecraft.block.BlockState;
import net.minecraft.block.FenceGateBlock;
import net.minecraft.block.WoodType;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
public class ElectrifiedFenceGateBlock extends FenceGateBlock implements ElectrifiedBlock {
public ElectrifiedFenceGateBlock(Settings settings, WoodType type) {
super(settings, type);
}
@Override
public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) {
super.randomDisplayTick(state, world, pos, random);
if (!state.get(OPEN)) {
spawnElectricalParticles(world, pos, random);
}
}
@Deprecated
@Override
public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) {
triggerLightning(state, world, pos);
}
@Deprecated
@Override
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
return getBlockBreakingDelta(super.calcBlockBreakingDelta(state, player, world, pos), player);
}
@Override
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
if (!state.get(OPEN) && entity instanceof LivingEntity l && l.hurtTime == 0 && l.canTakeDamage()) {
triggerLightning(state, world, pos, l, true);
}
}
}

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.block; package com.minelittlepony.unicopia.block.zap;
import com.minelittlepony.unicopia.server.world.ZapAppleStageStore; import com.minelittlepony.unicopia.server.world.ZapAppleStageStore;
@ -10,7 +10,7 @@ import net.minecraft.state.property.*;
public class ZapAppleLeavesBlock extends BaseZapAppleLeavesBlock { public class ZapAppleLeavesBlock extends BaseZapAppleLeavesBlock {
public static final EnumProperty<ZapAppleStageStore.Stage> STAGE = EnumProperty.of("stage", ZapAppleStageStore.Stage.class); public static final EnumProperty<ZapAppleStageStore.Stage> STAGE = EnumProperty.of("stage", ZapAppleStageStore.Stage.class);
ZapAppleLeavesBlock() { public ZapAppleLeavesBlock() {
setDefaultState(getDefaultState().with(STAGE, ZapAppleStageStore.Stage.GREENING)); setDefaultState(getDefaultState().with(STAGE, ZapAppleStageStore.Stage.GREENING));
} }

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.block; package com.minelittlepony.unicopia.block.zap;
import com.minelittlepony.unicopia.server.world.ZapAppleStageStore; import com.minelittlepony.unicopia.server.world.ZapAppleStageStore;
import com.minelittlepony.unicopia.server.world.ZapAppleStageStore.Stage; import com.minelittlepony.unicopia.server.world.ZapAppleStageStore.Stage;
@ -11,7 +11,7 @@ import net.minecraft.world.World;
public class ZapAppleLeavesPlaceholderBlock extends AirBlock implements ZapStagedBlock { public class ZapAppleLeavesPlaceholderBlock extends AirBlock implements ZapStagedBlock {
ZapAppleLeavesPlaceholderBlock() { public ZapAppleLeavesPlaceholderBlock() {
super(Settings.create().replaceable().noCollision().dropsNothing().air()); super(Settings.create().replaceable().noCollision().dropsNothing().air());
} }

View file

@ -1,6 +1,4 @@
package com.minelittlepony.unicopia.block; package com.minelittlepony.unicopia.block.zap;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.block.*; import net.minecraft.block.*;
import net.minecraft.block.enums.Instrument; import net.minecraft.block.enums.Instrument;
@ -13,12 +11,12 @@ import net.minecraft.util.math.*;
import net.minecraft.world.BlockView; import net.minecraft.world.BlockView;
import net.minecraft.world.World; import net.minecraft.world.World;
public class ZapAppleLogBlock extends PillarBlock { public class ZapAppleLogBlock extends PillarBlock implements ElectrifiedBlock {
public static final BooleanProperty NATURAL = ZapBlock.NATURAL; public static final BooleanProperty NATURAL = BooleanProperty.of("natural");
private final Block artifialModelBlock; private final BlockState artifialModelBlock;
ZapAppleLogBlock(Block artifialModelBlock, MapColor topMapColor, MapColor sideMapColor) { public ZapAppleLogBlock(BlockState artifialModelBlock, MapColor topMapColor, MapColor sideMapColor) {
super(AbstractBlock.Settings.create().mapColor( super(AbstractBlock.Settings.create().mapColor(
state -> state.get(PillarBlock.AXIS) == Direction.Axis.Y ? topMapColor : sideMapColor state -> state.get(PillarBlock.AXIS) == Direction.Axis.Y ? topMapColor : sideMapColor
) )
@ -38,28 +36,22 @@ public class ZapAppleLogBlock extends PillarBlock {
@Override @Override
public BlockState getPlacementState(ItemPlacementContext ctx) { public BlockState getPlacementState(ItemPlacementContext ctx) {
return getDefaultState().with(NATURAL, false); return super.getPlacementState(ctx).with(NATURAL, false);
} }
@Deprecated @Deprecated
@Override @Override
public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) { public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) {
ZapBlock.triggerLightning(state, world, pos, player); triggerLightning(state, world, pos);
} }
@Deprecated @Deprecated
@Override @Override
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) { public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
if (!state.get(NATURAL)) { if (!state.get(NATURAL)) {
return artifialModelBlock.calcBlockBreakingDelta(artifialModelBlock.getDefaultState(), player, world, pos); return artifialModelBlock.calcBlockBreakingDelta(player, world, pos);
} }
float delta = super.calcBlockBreakingDelta(state, player, world, pos); return getBlockBreakingDelta(super.calcBlockBreakingDelta(state, player, world, pos), player);
if (Pony.of(player).getCompositeRace().canUseEarth()) {
delta *= 50;
}
return MathHelper.clamp(delta, 0, 0.9F);
} }
} }

View file

@ -0,0 +1,25 @@
package com.minelittlepony.unicopia.block.zap;
import net.minecraft.block.*;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.*;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
public class ZapBlock extends Block implements ElectrifiedBlock {
public ZapBlock(Settings settings) {
super(settings);
}
@Deprecated
@Override
public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) {
triggerLightning(state, world, pos);
}
@Deprecated
@Override
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
return getBlockBreakingDelta(super.calcBlockBreakingDelta(state, player, world, pos), player);
}
}

View file

@ -0,0 +1,26 @@
package com.minelittlepony.unicopia.block.zap;
import net.minecraft.block.BlockState;
import net.minecraft.block.SlabBlock;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
public class ZapSlabBlock extends SlabBlock implements ElectrifiedBlock {
public ZapSlabBlock(Settings settings) {
super(settings);
}
@Deprecated
@Override
public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) {
triggerLightning(state, world, pos);
}
@Deprecated
@Override
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
return getBlockBreakingDelta(super.calcBlockBreakingDelta(state, player, world, pos), player);
}
}

View file

@ -1,5 +1,6 @@
package com.minelittlepony.unicopia.block; package com.minelittlepony.unicopia.block.zap;
import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.server.world.ZapAppleStageStore; import com.minelittlepony.unicopia.server.world.ZapAppleStageStore;
import net.minecraft.block.Block; import net.minecraft.block.Block;

View file

@ -0,0 +1,22 @@
package com.minelittlepony.unicopia.block.zap;
import net.minecraft.block.BlockState;
import net.minecraft.block.StairsBlock;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;
public class ZapStairsBlock extends StairsBlock {
private final BlockState baseBlock;
public ZapStairsBlock(BlockState baseBlockState, Settings settings) {
super(baseBlockState, settings);
this.baseBlock = baseBlockState;
}
@Deprecated
@Override
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
return baseBlock.calcBlockBreakingDelta(player, world, pos);
}
}

View file

@ -19,6 +19,7 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
public class SpellbookProfilePageContent implements SpellbookChapterList.Content { public class SpellbookProfilePageContent implements SpellbookChapterList.Content {
private static final Text MANA_LABEL = Text.translatable("gui.unicopia.spellbook.page.mana");
private final MinecraftClient client = MinecraftClient.getInstance(); private final MinecraftClient client = MinecraftClient.getInstance();
private final Pony pony = Pony.of(client.player); private final Pony pony = Pony.of(client.player);
private final TextRenderer font = client.textRenderer; private final TextRenderer font = client.textRenderer;
@ -140,8 +141,8 @@ public class SpellbookProfilePageContent implements SpellbookChapterList.Content
String manaString = (int)reserves.getMana().get() + "/" + (int)reserves.getMana().getMax(); String manaString = (int)reserves.getMana().get() + "/" + (int)reserves.getMana().getMax();
y = 15; y = 15;
Text manaLabel = Text.translatable("gui.unicopia.spellbook.page.mana");
context.drawText(font, manaLabel, -font.getWidth(manaLabel) / 2, y, SpellbookScreen.TITLE_COLOR, false); context.drawText(font, MANA_LABEL, -font.getWidth(MANA_LABEL) / 2, y, SpellbookScreen.TITLE_COLOR, false);
context.drawText(font, manaString, -font.getWidth(manaString) / 2, y += font.fontHeight, SpellbookScreen.TITLE_COLOR, false); context.drawText(font, manaString, -font.getWidth(manaString) / 2, y += font.fontHeight, SpellbookScreen.TITLE_COLOR, false);
Text levelString = Text.literal(Romanizer.romanize(currentLevel + 1)); Text levelString = Text.literal(Romanizer.romanize(currentLevel + 1));

View file

@ -10,6 +10,7 @@ import com.minelittlepony.common.client.gui.dimension.Bounds;
import com.minelittlepony.unicopia.ability.magic.spell.crafting.IngredientWithSpell; import com.minelittlepony.unicopia.ability.magic.spell.crafting.IngredientWithSpell;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait;
import com.minelittlepony.unicopia.block.state.Schematic;
import com.minelittlepony.unicopia.client.gui.spellbook.SpellbookChapterList.Drawable; import com.minelittlepony.unicopia.client.gui.spellbook.SpellbookChapterList.Drawable;
import com.minelittlepony.unicopia.container.SpellbookChapterLoader.Flow; import com.minelittlepony.unicopia.container.SpellbookChapterLoader.Flow;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
@ -59,7 +60,7 @@ public interface PageElement extends Drawable {
default -> throw new IllegalArgumentException("Unexpected value: " + t); default -> throw new IllegalArgumentException("Unexpected value: " + t);
}; };
})); }));
case 5 -> new Structure.Builder().fromBuffer(buffer).build(); case 5 -> new Structure(Bounds.empty(), Schematic.fromPacket(buffer));
default -> throw new IllegalArgumentException("Unexpected value: " + type); default -> throw new IllegalArgumentException("Unexpected value: " + type);
}; };
} }

View file

@ -1,15 +1,8 @@
package com.minelittlepony.unicopia.client.gui.spellbook.element; package com.minelittlepony.unicopia.client.gui.spellbook.element;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import com.minelittlepony.common.client.gui.IViewRoot; import com.minelittlepony.common.client.gui.IViewRoot;
import com.minelittlepony.common.client.gui.dimension.Bounds; import com.minelittlepony.common.client.gui.dimension.Bounds;
import com.minelittlepony.unicopia.block.state.Schematic;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.DiffuseLighting; import net.minecraft.client.render.DiffuseLighting;
@ -17,48 +10,13 @@ import net.minecraft.client.render.LightmapTextureManager;
import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.VertexConsumerProvider.Immediate; import net.minecraft.client.render.VertexConsumerProvider.Immediate;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.state.property.Properties;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RotationAxis; import net.minecraft.util.math.RotationAxis;
public record Structure(Bounds bounds, List<List<List<BlockState>>> states) implements PageElement { public record Structure(Bounds bounds, Schematic schematic) implements PageElement {
static final BlockState DIAMOND = Blocks.DIAMOND_BLOCK.getDefaultState();
static final BlockState AIR = Blocks.AIR.getDefaultState();
static final BlockState OBS = Blocks.OBSIDIAN.getDefaultState();
static final BlockState SOU = Blocks.SOUL_SAND.getDefaultState();
public static final Structure CRYSTAL_HEART_ALTAR = new Structure.Builder()
.fill(0, 0, 0, 2, 0, 2, DIAMOND)
.set(1, 1, 1, DIAMOND)
.set(1, 2, 1, Blocks.END_ROD.getDefaultState().with(Properties.FACING, Direction.UP))
.set(1, 4, 1, Blocks.END_ROD.getDefaultState().with(Properties.FACING, Direction.DOWN))
.set(1, 5, 1, DIAMOND)
.fill(0, 6, 0, 2, 6, 2, DIAMOND)
.build();
public static final Structure ALTAR_STRUCTURE = new Structure.Builder()
.fill(0, 0, 0, 8, 0, 8, SOU)
.fill(3, 1, 3, 5, 1, 5, OBS)
.set(4, 1, 4, SOU)
.set(4, 1, 6, Blocks.LODESTONE.getDefaultState())
.fill(0, 1, 2, 0, 4, 2, OBS).fill(0, 1, 6, 0, 4, 6, OBS)
.fill(2, 1, 0, 2, 4, 0, OBS).fill(6, 1, 0, 6, 4, 0, OBS)
.fill(8, 1, 2, 8, 4, 2, OBS).fill(8, 1, 6, 8, 4, 6, OBS)
.fill(2, 1, 8, 2, 4, 8, OBS).fill(6, 1, 8, 6, 4, 8, OBS)
.build();
@Override @Override
public void draw(DrawContext context, int mouseX, int mouseY, IViewRoot container) { public void draw(DrawContext context, int mouseX, int mouseY, IViewRoot container) {
int height = states.size(); if (schematic.volume() == 0) {
if (height == 0) {
return;
}
int depth = states.get(0).size();
if (depth == 0) {
return;
}
int width = states.get(0).get(0).size();
if (width == 0) {
return; return;
} }
MatrixStack matrices = context.getMatrices(); MatrixStack matrices = context.getMatrices();
@ -72,110 +30,24 @@ public record Structure(Bounds bounds, List<List<List<BlockState>>> states) impl
if (container != null) { if (container != null) {
matrices.translate(container.getBounds().width / 2, container.getBounds().height / 2, 100); matrices.translate(container.getBounds().width / 2, container.getBounds().height / 2, 100);
float minDimensions = Math.min(container.getBounds().width, container.getBounds().height) - 30; float minDimensions = Math.min(container.getBounds().width, container.getBounds().height) - 30;
int minSize = Math.max(height, Math.max(width, depth)) * 16; int minSize = (Math.max(schematic.dx(), Math.max(schematic.dy(), schematic.dz())) + 1) * 16;
float scale = minDimensions / minSize; float scale = minDimensions / minSize;
matrices.scale(scale, scale, 1); matrices.scale(scale, scale, 1);
} }
matrices.scale(-16, -16, -16); matrices.scale(16, -16, 16);
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(-20 + MathHelper.sin(tickDelta / 10F) * 2)); matrices.peek().getNormalMatrix().scale(1, -1, 1);
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(20 + MathHelper.sin(tickDelta / 10F) * 2));
matrices.peek().getPositionMatrix().rotate(RotationAxis.POSITIVE_Y.rotationDegrees(age)); matrices.peek().getPositionMatrix().rotate(RotationAxis.POSITIVE_Y.rotationDegrees(age));
DiffuseLighting.enableForLevel(matrices.peek().getPositionMatrix()); matrices.translate((-schematic.dx() - 1) / 2F, (-schematic.dy() - 1) / 2F, (-schematic.dz() - 1) / 2F);
DiffuseLighting.disableGuiDepthLighting();
matrices.translate(-width / 2F, -height / 2F, -depth / 2F); for (var entry : schematic.states()) {
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
for (int z = 0; z < depth; z++) {
BlockState state = states.get(y).get(z).get(x);
matrices.push(); matrices.push();
matrices.translate(x, y, z); matrices.translate(entry.x(), entry.y(), entry.z());
client.getBlockRenderManager().renderBlockAsEntity(state, matrices, immediate, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV); client.getBlockRenderManager().renderBlockAsEntity(entry.state(), matrices, immediate, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV);
matrices.pop(); matrices.pop();
} }
matrices.pop(); matrices.pop();
} }
public static class Builder {
private int dx = -1;
private int dy = -1;
private int dz = -1;
private final List<List<List<BlockState>>> layers = new ArrayList<>();
private void resize(int x, int y, int z) {
int ddx = Math.max(dx, x);
int ddy = Math.max(dy, y);
int ddz = Math.max(dz, z);
if (ddx <= dx && ddy <= dy && ddz <= dz) {
return;
}
if (ddy > dy) {
dy = ddy;
while (layers.size() <= ddy) {
layers.add(createFilledList(ddz, () -> createFilledList(ddx, () -> AIR)));
}
}
if (ddz > dz || ddx > dx) {
layers.forEach(layer -> {
if (ddz > dz) {
while (layer.size() <= ddz) {
layer.add(createFilledList(ddx, () -> AIR));
}
}
if (ddx > dx) {
layer.forEach(row -> {
while (row.size() <= ddx) {
row.add(AIR);
}
});
}
});
dz = ddz;
dx = ddx;
}
}
private <T> List<T> createFilledList(int length, Supplier<T> contentSupplier) {
List<T> list = new ArrayList<>();
while (list.size() <= length) {
list.add(contentSupplier.get());
}
return list;
}
public Builder set(int x, int y, int z, BlockState state) {
resize(x, y, z);
layers.get(y).get(z).set(x, state);
return this;
}
public Builder fill(int minX, int minY, int minZ, int maxX, int maxY, int maxZ, BlockState state) {
resize(maxX, maxY, maxZ);
for (int x = minX; x <= maxX; x++)
for (int y = minY; y <= maxY; y++)
for (int z = minZ; z <= maxZ; z++)
layers.get(y).get(z).set(x, state);
return this;
}
public Builder fromBuffer(PacketByteBuf buffer) {
buffer.readCollection(ArrayList::new, buf -> {
byte op = buf.readByte();
return switch (op) {
case 1 -> set(buf.readInt(), buf.readInt(), buf.readInt(), Block.getStateFromRawId(buf.readInt()));
case 2 -> fill(buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), Block.getStateFromRawId(buf.readInt()));
default -> this;
};
});
return this;
}
public Structure build() {
return new Structure(Bounds.empty(), layers);
}
}
} }

View file

@ -1,11 +1,16 @@
package com.minelittlepony.unicopia.client.minelittlepony; package com.minelittlepony.unicopia.client.minelittlepony;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.minelittlepony.api.model.*; import com.minelittlepony.api.model.*;
import com.minelittlepony.api.model.gear.Gear; import com.minelittlepony.api.model.gear.Gear;
import com.minelittlepony.api.pony.PonyData;
import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.model.ClientPonyModel;
import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.ModelType;
import com.minelittlepony.client.model.PlayerModelKey; import com.minelittlepony.client.model.PlayerModelKey;
@ -16,7 +21,7 @@ import com.minelittlepony.client.model.part.UnicornHorn;
import com.minelittlepony.mson.api.MsonModel; import com.minelittlepony.mson.api.MsonModel;
import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.EquinePredicates;
import com.minelittlepony.unicopia.FlightType; import com.minelittlepony.unicopia.FlightType;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.entity.AmuletSelectors; import com.minelittlepony.unicopia.entity.AmuletSelectors;
@ -27,8 +32,9 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
class BodyPartGear<M extends ClientPonyModel<LivingEntity>> implements Gear { import com.minelittlepony.api.pony.meta.Race;
class BodyPartGear<M extends ClientPonyModel<LivingEntity>> implements Gear {
private static final Predicate<LivingEntity> MINE_LP_HAS_NO_WINGS = e -> !MineLPDelegate.getInstance().getRace(e).canFly(); private static final Predicate<LivingEntity> MINE_LP_HAS_NO_WINGS = e -> !MineLPDelegate.getInstance().getRace(e).canFly();
private static final Predicate<LivingEntity> MINE_LP_HAS_NO_HORN = e -> !MineLPDelegate.getInstance().getRace(e).canCast(); private static final Predicate<LivingEntity> MINE_LP_HAS_NO_HORN = e -> !MineLPDelegate.getInstance().getRace(e).canCast();
@ -41,14 +47,14 @@ class BodyPartGear<M extends ClientPonyModel<LivingEntity>> implements Gear {
public static final Predicate<LivingEntity> BAT_WINGS_PREDICATE = MINE_LP_HAS_NO_WINGS.and(AmuletSelectors.PEGASUS_AMULET.negate()).and(EquinePredicates.PLAYER_BAT); public static final Predicate<LivingEntity> BAT_WINGS_PREDICATE = MINE_LP_HAS_NO_WINGS.and(AmuletSelectors.PEGASUS_AMULET.negate()).and(EquinePredicates.PLAYER_BAT);
public static final Identifier BAT_WINGS = Unicopia.id("textures/models/wings/bat_pony.png"); public static final Identifier BAT_WINGS = Unicopia.id("textures/models/wings/bat_pony.png");
public static final Predicate<LivingEntity> UNICORN_HORN_PREDICATE = MINE_LP_HAS_NO_HORN.and(AmuletSelectors.ALICORN_AMULET.or(EquinePredicates.raceMatches(Race::canCast))); public static final Predicate<LivingEntity> UNICORN_HORN_PREDICATE = MINE_LP_HAS_NO_HORN.and(AmuletSelectors.ALICORN_AMULET.or(EquinePredicates.raceMatches(com.minelittlepony.unicopia.Race::canCast)));
public static final Identifier UNICORN_HORN = Unicopia.id("textures/models/horn/unicorn.png"); public static final Identifier UNICORN_HORN = Unicopia.id("textures/models/horn/unicorn.png");
public static final Predicate<LivingEntity> PEGA_WINGS_PREDICATE = MINE_LP_HAS_NO_WINGS.and(AmuletSelectors.PEGASUS_AMULET.or(EquinePredicates.raceMatches(race -> race.flightType() == FlightType.AVIAN))); public static final Predicate<LivingEntity> PEGA_WINGS_PREDICATE = MINE_LP_HAS_NO_WINGS.and(AmuletSelectors.PEGASUS_AMULET.or(EquinePredicates.raceMatches(race -> race.flightType() == FlightType.AVIAN)));
public static final Identifier PEGASUS_WINGS = Unicopia.id("textures/models/wings/pegasus_pony.png"); public static final Identifier PEGASUS_WINGS = Unicopia.id("textures/models/wings/pegasus_pony.png");
public static BodyPartGear<WingsGearModel> pegasusWings() { public static BodyPartGear<WingsGearModel> pegasusWings() {
return new BodyPartGear<>(BodyPart.BODY, ModelType.PEGASUS, PEGA_WINGS_PREDICATE, WingsGearModel::new, WingsGearModel::getWings, e -> { return new BodyPartGear<>(Race.PEGASUS, BodyPart.BODY, ModelType.PEGASUS, PEGA_WINGS_PREDICATE, WingsGearModel::new, WingsGearModel::getWings, e -> {
if (AmuletSelectors.PEGASUS_AMULET.test((LivingEntity)e)) { if (AmuletSelectors.PEGASUS_AMULET.test((LivingEntity)e)) {
return e.getWorld().getDimension().ultrawarm() ? ICARUS_WINGS_CORRUPTED : ICARUS_WINGS; return e.getWorld().getDimension().ultrawarm() ? ICARUS_WINGS_CORRUPTED : ICARUS_WINGS;
} }
@ -57,15 +63,15 @@ class BodyPartGear<M extends ClientPonyModel<LivingEntity>> implements Gear {
} }
public static BodyPartGear<WingsGearModel> batWings() { public static BodyPartGear<WingsGearModel> batWings() {
return new BodyPartGear<>(BodyPart.BODY, ModelType.BAT_PONY, BAT_WINGS_PREDICATE, WingsGearModel::new, WingedPonyModel::getWings, e -> BAT_WINGS); return new BodyPartGear<>(Race.BATPONY, BodyPart.BODY, ModelType.BAT_PONY, BAT_WINGS_PREDICATE, WingsGearModel::new, WingedPonyModel::getWings, e -> BAT_WINGS);
} }
public static BodyPartGear<BugWingsGearModel> bugWings() { public static BodyPartGear<BugWingsGearModel> bugWings() {
return new BodyPartGear<>(BodyPart.BODY, ModelType.CHANGELING, BUG_WINGS_PREDICATE, BugWingsGearModel::new, WingedPonyModel::getWings, e -> BUG_WINGS); return new BodyPartGear<>(Race.CHANGELING, BodyPart.BODY, ModelType.CHANGELING, BUG_WINGS_PREDICATE, BugWingsGearModel::new, WingedPonyModel::getWings, e -> BUG_WINGS);
} }
public static BodyPartGear<HornGearModel> unicornHorn() { public static BodyPartGear<HornGearModel> unicornHorn() {
return new BodyPartGear<>(BodyPart.HEAD, ModelType.UNICORN, UNICORN_HORN_PREDICATE, HornGearModel::new, HornGearModel::getHorn, e -> UNICORN_HORN); return new BodyPartGear<>(Race.UNICORN, BodyPart.HEAD, ModelType.UNICORN, UNICORN_HORN_PREDICATE, HornGearModel::new, HornGearModel::getHorn, e -> UNICORN_HORN);
} }
private final M model; private final M model;
@ -73,14 +79,20 @@ class BodyPartGear<M extends ClientPonyModel<LivingEntity>> implements Gear {
private final SubModel part; private final SubModel part;
private final Function<Entity, Identifier> textureSupplier; private final Function<Entity, Identifier> textureSupplier;
private final BodyPart gearLocation; private final BodyPart gearLocation;
private final LoadingCache<PonyData, PonyData> dataCache;
public BodyPartGear( public BodyPartGear(
Race race,
BodyPart gearLocation, BodyPart gearLocation,
PlayerModelKey<LivingEntity, ? super M> modelKey, PlayerModelKey<LivingEntity, ? super M> modelKey,
Predicate<LivingEntity> renderTargetPredicate, Predicate<LivingEntity> renderTargetPredicate,
MsonModel.Factory<M> modelFactory, MsonModel.Factory<M> modelFactory,
Function<? super M, SubModel> partExtractor, Function<? super M, SubModel> partExtractor,
Function<Entity, Identifier> textureSupplier) { Function<Entity, Identifier> textureSupplier) {
dataCache = CacheBuilder.newBuilder().expireAfterAccess(3, TimeUnit.SECONDS).build(CacheLoader.<PonyData, PonyData>from(metadata -> {
return new PonyData(race, metadata.tailLength(), metadata.tailShape(), metadata.gender(),
metadata.size(), metadata.glowColor(), metadata.noSkin(), metadata.priority(), metadata.gear());
}));
this.gearLocation = gearLocation; this.gearLocation = gearLocation;
this.model = modelKey.steveKey().createModel(modelFactory); this.model = modelKey.steveKey().createModel(modelFactory);
this.part = partExtractor.apply(this.model); this.part = partExtractor.apply(this.model);
@ -107,9 +119,21 @@ class BodyPartGear<M extends ClientPonyModel<LivingEntity>> implements Gear {
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({ "unchecked", "rawtypes" })
@Override @Override
public void pose(PonyModel<?> model, Entity entity, boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) { public void pose(PonyModel<?> model, Entity entity, boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float tickDelta) {
((ClientPonyModel)model).copyAttributes(this.model); final PonyData data = this.model.getAttributes().metadata;
part.setPartAngles(this.model.getAttributes(), move, swing, bodySwing, ticks); try {
((ClientPonyModel)model).copyAttributes(this.model);
this.model.getAttributes().metadata = dataCache.getUnchecked(data);
this.model.animateModel((LivingEntity)entity, move, swing, tickDelta);
this.model.setAngles((LivingEntity)entity, move, swing, entity.age + tickDelta, 0, 0);
} finally {
this.model.getAttributes().metadata = data;
}
}
public static PonyData copyOf(PonyData metadata, Race newRace) {
return new PonyData(newRace, metadata.tailLength(), metadata.tailShape(), metadata.gender(),
metadata.size(), metadata.glowColor(), metadata.noSkin(), metadata.priority(), metadata.gear());
} }
@Override @Override

View file

@ -9,6 +9,7 @@ import java.util.function.Function;
import com.minelittlepony.api.events.PonyModelPrepareCallback; import com.minelittlepony.api.events.PonyModelPrepareCallback;
import com.minelittlepony.api.model.*; import com.minelittlepony.api.model.*;
import com.minelittlepony.api.model.gear.Gear; import com.minelittlepony.api.model.gear.Gear;
import com.minelittlepony.api.pony.PonyData;
import com.minelittlepony.unicopia.*; import com.minelittlepony.unicopia.*;
import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation;
import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate;
@ -92,6 +93,11 @@ public class Main extends MineLPDelegate implements ClientModInitializer {
} }
@Override
public int getMagicColor(Entity entity) {
return com.minelittlepony.api.pony.Pony.getManager().getPony(entity).map(com.minelittlepony.api.pony.Pony::metadata).map(PonyData::glowColor).orElse(0);
}
@Override @Override
public Race getPlayerPonyRace(PlayerEntity player) { public Race getPlayerPonyRace(PlayerEntity player) {
return toUnicopiaRace(com.minelittlepony.api.pony.Pony.getManager().getPony(player).race()); return toUnicopiaRace(com.minelittlepony.api.pony.Pony.getManager().getPony(player).race());

View file

@ -31,4 +31,8 @@ public class MineLPDelegate {
public Race getRace(Entity entity) { public Race getRace(Entity entity) {
return Race.HUMAN; return Race.HUMAN;
} }
public int getMagicColor(Entity entity) {
return 0;
}
} }

View file

@ -81,7 +81,7 @@ public class SpellbookEntityRenderer extends LivingEntityRenderer<SpellbookEntit
Altar altar = entity.getAltar().get(); Altar altar = entity.getAltar().get();
Vec3d center = altar.origin().toCenterPos(); Vec3d center = altar.origin().toCenterPos().add(0, -1, 0);
float x = (float)MathHelper.lerp(tickDelta, entity.prevX, entity.getX()); float x = (float)MathHelper.lerp(tickDelta, entity.prevX, entity.getX());
float y = (float)MathHelper.lerp(tickDelta, entity.prevY, entity.getY()); float y = (float)MathHelper.lerp(tickDelta, entity.prevY, entity.getY());

View file

@ -77,7 +77,7 @@ public class DarkVortexSpellRenderer extends SpellRenderer<DarkVortexSpell> {
SphereModel.DISK.render(matrices, vertices.getBuffer(RenderLayers.getEndPortal()), light, 1, radius * 0.5F, 1, 0.5F, 0, 1); SphereModel.DISK.render(matrices, vertices.getBuffer(RenderLayers.getEndPortal()), light, 1, radius * 0.5F, 1, 0.5F, 0, 1);
if (radius > 0.3F && absDistance > radius) { if (radius > 0.3F && absDistance > radius) {
radius *= 3 + radius; radius *= Math.min(2, 3 + radius);
matrices.scale(radius, radius, radius); matrices.scale(radius, radius, radius);
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90)); matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90));

View file

@ -4,6 +4,7 @@ import com.minelittlepony.common.util.Color;
import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.spell.effect.ShieldSpell; import com.minelittlepony.unicopia.ability.magic.spell.effect.ShieldSpell;
import com.minelittlepony.unicopia.client.gui.DrawableUtil; import com.minelittlepony.unicopia.client.gui.DrawableUtil;
import com.minelittlepony.unicopia.client.minelittlepony.MineLPDelegate;
import com.minelittlepony.unicopia.client.render.RenderLayers; import com.minelittlepony.unicopia.client.render.RenderLayers;
import com.minelittlepony.unicopia.client.render.model.SphereModel; import com.minelittlepony.unicopia.client.render.model.SphereModel;
import com.minelittlepony.unicopia.util.ColorHelper; import com.minelittlepony.unicopia.util.ColorHelper;
@ -26,8 +27,14 @@ public class ShieldSpellRenderer extends SpellRenderer<ShieldSpell> {
double height = caster.asEntity().getEyeY() - caster.getOriginVector().y; double height = caster.asEntity().getEyeY() - caster.getOriginVector().y;
matrices.translate(0, height, 0); matrices.translate(0, height, 0);
int color = ColorHelper.lerp(caster.getCorruption().getScaled(1) * (tickDelta / (1 + caster.asWorld().random.nextFloat())), spell.getType().getColor(), 0xFF000); int typeColor = spell.getType().getColor();
float[] colors = ColorHelper.changeSaturation(Color.r(color), Color.g(color), Color.b(color), 4); int ponyColor = MineLPDelegate.getInstance().getMagicColor(caster.getOriginatingCaster().asEntity());
int color = ColorHelper.lerp(caster.getCorruption().getScaled(1) * (tickDelta / (1 + caster.asWorld().random.nextFloat())),
ponyColor == 0 ? typeColor : ColorHelper.lerp(0.6F, ponyColor, typeColor),
0xFF000
);
float[] colors = ColorHelper.changeSaturation(Color.r(color), Color.g(color), Color.b(color), 2);
float radius = 0.35F + spell.getRadius(tickDelta) + MathHelper.sin(animationProgress / 30F) * 0.01F; float radius = 0.35F + spell.getRadius(tickDelta) + MathHelper.sin(animationProgress / 30F) * 0.01F;
VertexConsumer buffer = vertices.getBuffer(RenderLayers.getMagicShield()); VertexConsumer buffer = vertices.getBuffer(RenderLayers.getMagicShield());
@ -35,7 +42,8 @@ public class ShieldSpellRenderer extends SpellRenderer<ShieldSpell> {
boolean firstPerson = caster.asEntity() == client.player && client.options.getPerspective() == Perspective.FIRST_PERSON; boolean firstPerson = caster.asEntity() == client.player && client.options.getPerspective() == Perspective.FIRST_PERSON;
float thickness = 0.02F * MathHelper.sin(animationProgress / 30F); float thickness = 0.02F * MathHelper.sin(animationProgress / 30F);
float alpha = 1 - Math.abs(MathHelper.sin(animationProgress / 20F)) * 0.2F; float alpha = 1 - Math.abs(MathHelper.sin(animationProgress / 20F)) * 0.1F;
alpha *= MathHelper.clamp(radius - 1, 0, 1);
if (firstPerson) { if (firstPerson) {
matrices.translate(0, -1.75F, 0); matrices.translate(0, -1.75F, 0);
@ -43,9 +51,10 @@ public class ShieldSpellRenderer extends SpellRenderer<ShieldSpell> {
model.render(matrices, buffer, light, 1, radius, colors[0], colors[1], colors[2], alpha * 0.2F); model.render(matrices, buffer, light, 1, radius, colors[0], colors[1], colors[2], alpha * 0.2F);
} else { } else {
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(180)); matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(180));
model.render(matrices, buffer, light, 1, radius + thickness, colors[0], colors[1], colors[2], alpha * 0.08F); matrices.scale(1, radius == 0 ? 1 : 2.6F / radius, 1);
model.render(matrices, buffer, light, 1, radius - thickness, colors[0], colors[1], colors[2], alpha * 0.05F); SphereModel.SPHERE.render(matrices, buffer, light, 1, radius + thickness, colors[0], colors[1], colors[2], alpha * 0.08F);
model.render(matrices, buffer, light, 1, radius + thickness * 2, colors[0], colors[1], colors[2], alpha * 0.05F); SphereModel.SPHERE.render(matrices, buffer, light, 1, radius - thickness, colors[0], colors[1], colors[2], alpha * 0.05F);
SphereModel.SPHERE.render(matrices, buffer, light, 1, radius + thickness * 2, colors[0], colors[1], colors[2], alpha * 0.05F);
} }
matrices.pop(); matrices.pop();

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia.compat.emi; package com.minelittlepony.unicopia.compat.emi;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -12,6 +13,7 @@ import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellShapedCraft
import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait;
import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.block.state.Schematic;
import com.minelittlepony.unicopia.item.EnchantableItem; import com.minelittlepony.unicopia.item.EnchantableItem;
import com.minelittlepony.unicopia.item.TransformCropsRecipe; import com.minelittlepony.unicopia.item.TransformCropsRecipe;
import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.UItems;
@ -21,12 +23,13 @@ import com.minelittlepony.unicopia.item.group.MultiItem;
import dev.emi.emi.api.EmiPlugin; import dev.emi.emi.api.EmiPlugin;
import dev.emi.emi.api.EmiRegistry; import dev.emi.emi.api.EmiRegistry;
import dev.emi.emi.api.recipe.EmiRecipeCategory; import dev.emi.emi.api.recipe.EmiRecipeCategory;
import dev.emi.emi.api.recipe.EmiWorldInteractionRecipe;
import dev.emi.emi.api.render.EmiTexture; import dev.emi.emi.api.render.EmiTexture;
import dev.emi.emi.api.stack.Comparison; import dev.emi.emi.api.stack.Comparison;
import dev.emi.emi.api.stack.EmiStack; import dev.emi.emi.api.stack.EmiStack;
import dev.emi.emi.recipe.EmiStonecuttingRecipe; import dev.emi.emi.recipe.EmiStonecuttingRecipe;
import net.minecraft.block.Blocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.RecipeType;
import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.DynamicRegistryManager;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
@ -35,10 +38,12 @@ import net.minecraft.util.Identifier;
public class Main implements EmiPlugin { public class Main implements EmiPlugin {
static final EmiStack SPELL_BOOK_STATION = EmiStack.of(UItems.SPELLBOOK); static final EmiStack SPELL_BOOK_STATION = EmiStack.of(UItems.SPELLBOOK);
static final EmiStack CLOUD_SHAPING_STATION = EmiStack.of(UBlocks.SHAPING_BENCH); static final EmiStack CLOUD_SHAPING_STATION = EmiStack.of(UBlocks.SHAPING_BENCH);
static final EmiStack GROWING_STATION = EmiStack.of(UItems.EARTH_BADGE); static final EmiStack GROWING_STATION = EmiStack.of(Blocks.FARMLAND);
static final EmiStack ALTAR_STATION = EmiStack.of(Blocks.CRYING_OBSIDIAN);
static final EmiRecipeCategory SPELL_BOOK_CATEGORY = new EmiRecipeCategory(Unicopia.id("spellbook"), SPELL_BOOK_STATION, SPELL_BOOK_STATION); static final EmiRecipeCategory SPELL_BOOK_CATEGORY = new EmiRecipeCategory(Unicopia.id("spellbook"), SPELL_BOOK_STATION, SPELL_BOOK_STATION);
static final EmiRecipeCategory CLOUD_SHAPING_CATEGORY = new EmiRecipeCategory(Unicopia.id("cloud_shaping"), CLOUD_SHAPING_STATION, CLOUD_SHAPING_STATION); static final EmiRecipeCategory CLOUD_SHAPING_CATEGORY = new EmiRecipeCategory(Unicopia.id("cloud_shaping"), CLOUD_SHAPING_STATION, CLOUD_SHAPING_STATION);
static final EmiRecipeCategory GROWING_CATEGORY = new EmiRecipeCategory(Unicopia.id("growing"), GROWING_STATION, GROWING_STATION); static final EmiRecipeCategory GROWING_CATEGORY = new EmiRecipeCategory(Unicopia.id("growing"), GROWING_STATION, GROWING_STATION);
static final EmiRecipeCategory ALTAR_CATEGORY = new EmiRecipeCategory(Unicopia.id("altar"), ALTAR_STATION, ALTAR_STATION);
static final Identifier WIDGETS = Unicopia.id("textures/gui/widgets.png"); static final Identifier WIDGETS = Unicopia.id("textures/gui/widgets.png");
static final EmiTexture EMPTY_ARROW = new EmiTexture(WIDGETS, 44, 0, 24, 17); static final EmiTexture EMPTY_ARROW = new EmiTexture(WIDGETS, 44, 0, 24, 17);
@ -111,16 +116,35 @@ public class Main implements EmiPlugin {
registry.addCategory(GROWING_CATEGORY); registry.addCategory(GROWING_CATEGORY);
registry.addWorkstation(GROWING_CATEGORY, GROWING_STATION); registry.addWorkstation(GROWING_CATEGORY, GROWING_STATION);
registry.getRecipeManager().listAllOfType(URecipes.GROWING).forEach(recipe -> { registry.getRecipeManager().listAllOfType(URecipes.GROWING).forEach(recipe -> {
registry.addRecipe(new EmiWorldInteractionRecipe(EmiWorldInteractionRecipe.builder() registry.addRecipe(new StructureInteractionEmiRecipe(
.id(recipe.id()) GROWING_CATEGORY,
.leftInput(EmiStack.of(recipe.value().getTargetAsItem())) recipe.id(),
.rightInput(EmiStack.of(recipe.value().getCatalyst(), TransformCropsRecipe.MINIMUM_INPUT), true) new Schematic.Builder()
.output(EmiStack.of(recipe.value().getOutput()))) { .fill(0, 0, 0, 6, 0, 6, recipe.value().getCatalystState())
@Override .set(3, 0, 3, Blocks.FARMLAND.getDefaultState())
public EmiRecipeCategory getCategory() { .set(3, 1, 3, recipe.value().getTargetState())
return GROWING_CATEGORY; .build(),
} List.of(EmiStack.of(recipe.value().getTarget()), EmiStack.of(recipe.value().getCatalyst(), TransformCropsRecipe.AREA)),
}); EmiStack.of(recipe.value().getOutput()),
Unicopia.id("textures/gui/ability/grow.png")
));
}); });
registry.addCategory(ALTAR_CATEGORY);
registry.addWorkstation(ALTAR_CATEGORY, ALTAR_STATION);
registry.addRecipe(new StructureInteractionEmiRecipe(
ALTAR_CATEGORY,
Unicopia.id("altar/spectral_clock"),
Schematic.ALTAR,
List.of(
EmiStack.of(Items.CLOCK),
EmiStack.of(UItems.SPELLBOOK),
EmiStack.of(Blocks.SOUL_SAND),
EmiStack.of(Blocks.LODESTONE),
EmiStack.of(Blocks.OBSIDIAN, 8 * 4 + 8)
),
EmiStack.of(UItems.SPECTRAL_CLOCK),
Unicopia.id("textures/gui/race/alicorn.png")
));
} }
} }

View file

@ -58,36 +58,38 @@ class SpellbookEmiRecipe implements EmiRecipe, SpellbookRecipe.CraftingTreeBuild
@Override @Override
public int getDisplayWidth() { public int getDisplayWidth() {
return 220; return 150;
} }
@Override @Override
public int getDisplayHeight() { public int getDisplayHeight() {
return 145; return 75;
} }
@Override @Override
public void addWidgets(WidgetHolder widgets) { public void addWidgets(WidgetHolder widgets) {
widgets.addTexture(SpellbookScreen.TEXTURE, 0, 0, getDisplayWidth(), getDisplayHeight(), 50, 50, 128, 128, 512, 256); widgets.addTexture(SpellbookScreen.TEXTURE, 0, 0, getDisplayWidth(), getDisplayHeight(), 50, 50, 128, 128, 512, 256);
widgets.addTexture(Main.EMPTY_ARROW, 160, 65); widgets.addTexture(Main.EMPTY_ARROW, 85, 30);
List<HexagonalCraftingGrid.Slot> grid = new ArrayList<>(); List<HexagonalCraftingGrid.Slot> grid = new ArrayList<>();
List<HexagonalCraftingGrid.Slot> gem = new ArrayList<>(); List<HexagonalCraftingGrid.Slot> gem = new ArrayList<>();
HexagonalCraftingGrid.create(4, 35, 3, grid, gem); HexagonalCraftingGrid.create(-34, -5, 3, grid, gem);
int currentInput = 1; int currentInput = 1;
for (int i = 0; i < grid.size(); i++) { for (int i = 0; i < grid.size(); i++) {
widgets.add(new SlotTexture(grid.get(i))); var slot = grid.get(i);
if (currentInput < inputs.size() && grid.get(i).weight() == 1) { if (currentInput < inputs.size() && slot.weight() == 1) {
widgets.addSlot(inputs.get(currentInput++), grid.get(i).left(), grid.get(i).top()).drawBack(false); widgets.add(new SlotTexture(slot));
} else { widgets.addSlot(inputs.get(currentInput++), slot.left(), slot.top()).drawBack(false);
widgets.addSlot(grid.get(i).left(), grid.get(i).top()).drawBack(false); } else if (slot.weight() == 1) {
widgets.add(new SlotTexture(slot));
widgets.addSlot(slot.left(), slot.top()).drawBack(false);
} }
} }
widgets.addSlot(inputs.get(0), gem.get(0).left(), gem.get(0).top()).drawBack(false); widgets.addSlot(inputs.get(0), gem.get(0).left(), gem.get(0).top()).drawBack(false);
widgets.addSlot(getOutput(), 190, 60).large(true).recipeContext(this); widgets.addSlot(getOutput(), 120, 25).large(true).recipeContext(this);
} }
protected EmiIngredient getOutput() { protected EmiIngredient getOutput() {

View file

@ -0,0 +1,144 @@
package com.minelittlepony.unicopia.compat.emi;
import java.util.List;
import com.minelittlepony.unicopia.block.state.Schematic;
import dev.emi.emi.api.recipe.EmiRecipe;
import dev.emi.emi.api.recipe.EmiRecipeCategory;
import dev.emi.emi.api.render.EmiTexture;
import dev.emi.emi.api.stack.EmiIngredient;
import dev.emi.emi.api.stack.EmiStack;
import dev.emi.emi.api.widget.WidgetHolder;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.DiffuseLighting;
import net.minecraft.client.render.LightmapTextureManager;
import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.VertexConsumerProvider.Immediate;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
import net.minecraft.util.math.RotationAxis;
public class StructureInteractionEmiRecipe implements EmiRecipe {
private final EmiRecipeCategory category;
private final Identifier id;
private final Schematic schematic;
private final List<EmiIngredient> inputs;
private final List<EmiStack> output;
private final Identifier processIcon;
private int age;
public StructureInteractionEmiRecipe(EmiRecipeCategory category, Identifier id, Schematic schematic, List<EmiIngredient> inputs, EmiStack output, Identifier processIcon) {
this.category = category;
this.id = id;
this.schematic = schematic;
this.inputs = inputs;
this.output = List.of(output);
this.processIcon = processIcon;
}
@Override
public EmiRecipeCategory getCategory() {
return category;
}
@Override
public Identifier getId() {
return id;
}
@Override
public List<EmiIngredient> getInputs() {
return inputs;
}
@Override
public List<EmiStack> getOutputs() {
return output;
}
@Override
public int getDisplayWidth() {
return 130;
}
@Override
public int getDisplayHeight() {
return schematic.dy() * 8 + 80 + 20 * (inputs.size() - 2);
}
@Override
public void addWidgets(WidgetHolder widgets) {
int y = schematic.dy() * 8;
int row = 0;
age = 0;
widgets.addDrawable(10, y / 2, 100, 100, this::renderSchematic);
int x = 10;
for (int i = 0; i < inputs.size(); i++) {
if (i > 1) {
x -= 40;
row += 20;
}
if (i > 0) {
widgets.addTexture(EmiTexture.PLUS, x + 3, y + 53 + row);
x += 20;
}
widgets.addSlot(inputs.get(i), x, y + 50 + row).catalyst(i > 0);
x += 20;
}
widgets.addTexture(EmiTexture.EMPTY_ARROW, 73, y + 52);
widgets.addSlot(output.get(0), 100, y + 47).large(true).recipeContext(this);
widgets.addTexture(processIcon, 73, y + 45, 13, 13, 0, 0, 16, 16, 16, 16).tooltipText(List.of(Text.translatable(
Util.createTranslationKey("recipe", category.getId()) + "." + "instruction"
)));
}
private void renderSchematic(DrawContext context, int mouseX, int mouseY, float delta) {
if (schematic.volume() == 0) {
return;
}
MatrixStack matrices = context.getMatrices();
Immediate immediate = context.getVertexConsumers();
MinecraftClient client = MinecraftClient.getInstance();
matrices.push();
float minSize = (Math.max(schematic.dz(), Math.max(schematic.dx(), schematic.dy())) + 1) * 16;
float scale = 60 / minSize;
matrices.scale(scale, scale, 1);
matrices.translate(95, 40, 100);
matrices.scale(16, -16, 16);
matrices.peek().getNormalMatrix().scale(1, -1, 1);
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(20));
matrices.peek().getPositionMatrix().rotate(RotationAxis.POSITIVE_Y.rotationDegrees(40));
matrices.translate(
(-schematic.dx() - 1) / 2F,
(-schematic.dy() - 1) / 2F,
(-schematic.dz() - 1) / 2F
);
DiffuseLighting.disableGuiDepthLighting();
age++;
for (var entry : schematic.states()) {
int x = entry.x() - schematic.dx() / 2;
int z = entry.z() - schematic.dz() / 2;
int distance = x * x + z * z;
if (age >= distance * 2) {
matrices.push();
matrices.translate(entry.x(), entry.y(), entry.z());
client.getBlockRenderManager().renderBlockAsEntity(entry.state(), matrices, immediate, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV);
matrices.pop();
}
}
matrices.pop();
}
}

View file

@ -19,6 +19,7 @@ import com.minelittlepony.unicopia.advancement.UCriteria;
import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate;
import com.minelittlepony.unicopia.entity.behaviour.EntityAppearance; import com.minelittlepony.unicopia.entity.behaviour.EntityAppearance;
import com.minelittlepony.unicopia.entity.collision.MultiBoundingBoxEntity; import com.minelittlepony.unicopia.entity.collision.MultiBoundingBoxEntity;
import com.minelittlepony.unicopia.entity.damage.MagicalDamageSource;
import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck; import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck;
import com.minelittlepony.unicopia.entity.effect.EffectUtils; import com.minelittlepony.unicopia.entity.effect.EffectUtils;
import com.minelittlepony.unicopia.entity.effect.UEffects; import com.minelittlepony.unicopia.entity.effect.UEffects;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.util; package com.minelittlepony.unicopia.entity.damage;
import java.util.*; import java.util.*;

View file

@ -5,7 +5,6 @@ import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.WorldConvertable; import com.minelittlepony.unicopia.WorldConvertable;
import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.util.MagicalDamageSource;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageType; import net.minecraft.entity.damage.DamageType;

View file

@ -31,6 +31,7 @@ public interface UDamageTypes {
RegistryKey<DamageType> PETRIFIED = register("petrified"); RegistryKey<DamageType> PETRIFIED = register("petrified");
RegistryKey<DamageType> ROCK = register("rock"); RegistryKey<DamageType> ROCK = register("rock");
RegistryKey<DamageType> HORSESHOE = register("horseshoe"); RegistryKey<DamageType> HORSESHOE = register("horseshoe");
RegistryKey<DamageType> SPIKES = register("spikes");
private static RegistryKey<DamageType> register(String name) { private static RegistryKey<DamageType> register(String name) {
var key = RegistryKey.of(RegistryKeys.DAMAGE_TYPE, Unicopia.id(name)); var key = RegistryKey.of(RegistryKeys.DAMAGE_TYPE, Unicopia.id(name));

View file

@ -181,6 +181,10 @@ public class IgnominiousBulbEntity extends MobEntity {
} }
} }
LivingEntity target = getAttacker(); LivingEntity target = getAttacker();
if (!canTarget(target)) {
target = null;
setAttacker(null);
}
if (angryTicks > 0) { if (angryTicks > 0) {
angryTicks--; angryTicks--;
@ -194,13 +198,14 @@ public class IgnominiousBulbEntity extends MobEntity {
Pony.of(player).getMagicalReserves().getEnergy().add(6); Pony.of(player).getMagicalReserves().getEnergy().add(6);
} }
final LivingEntity t = target;
tentacles.values() tentacles.values()
.stream() .stream()
.flatMap(tentacle -> tentacle.getOrEmpty(getWorld()).stream()) .flatMap(tentacle -> tentacle.getOrEmpty(getWorld()).stream())
.sorted(Comparator.comparing(a -> a.distanceTo(target))) .sorted(Comparator.comparing(a -> a.distanceTo(t)))
.limit(2) .limit(2)
.forEach(tentacle -> { .forEach(tentacle -> {
tentacle.setTarget(target); tentacle.setTarget(t);
}); });
} }

View file

@ -262,7 +262,7 @@ public class SpellbookEntity extends MobEntity implements MagicImmune {
return; return;
} }
//setBeamTicks(0); setBeamTicks(0);
if (activeRecipe == null) { if (activeRecipe == null) {
return; return;

View file

@ -35,6 +35,7 @@ import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.RaycastContext; import net.minecraft.world.RaycastContext;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.event.GameEvent;
public class TentacleEntity extends AbstractDecorationEntity { public class TentacleEntity extends AbstractDecorationEntity {
static final byte ATTACK_STATUS = 54; static final byte ATTACK_STATUS = 54;
@ -152,6 +153,7 @@ public class TentacleEntity extends AbstractDecorationEntity {
} }
addActiveTicks(20 + getWorld().random.nextInt(30)); addActiveTicks(20 + getWorld().random.nextInt(30));
playSound(USounds.ENTITY_TENTACLE_ROAR, 5, 1); playSound(USounds.ENTITY_TENTACLE_ROAR, 5, 1);
emitGameEvent(GameEvent.RESONATE_15);
return true; return true;
} }
@ -169,17 +171,21 @@ public class TentacleEntity extends AbstractDecorationEntity {
if (isAttacking()) { if (isAttacking()) {
if (--attackingTicks == 12) { if (--attackingTicks == 12) {
if (target != null) { if (target != null) {
target.damage(getDamageSources().create(DamageTypes.MOB_ATTACK, this), 15); if (!canTarget(target)) {
Vec3d diff = target.getPos().subtract(getPos()); target = null;
target.takeKnockback(1, diff.x, diff.z); } else {
target.damage(getDamageSources().create(DamageTypes.MOB_ATTACK, this), 15);
Vec3d diff = target.getPos().subtract(getPos());
target.takeKnockback(1, diff.x, diff.z);
ParticleUtils.spawnParticles(ParticleTypes.CLOUD, target, 10); ParticleUtils.spawnParticles(ParticleTypes.CLOUD, target, 10);
for (Entity bystander : getWorld().getOtherEntities(target, target.getBoundingBox().expand(3))) { for (Entity bystander : getWorld().getOtherEntities(target, target.getBoundingBox().expand(3))) {
if (bystander instanceof LivingEntity l) { if (bystander instanceof LivingEntity l) {
diff = l.getPos().subtract(getPos()); diff = l.getPos().subtract(getPos());
l.takeKnockback(1, diff.x, diff.z); l.takeKnockback(1, diff.x, diff.z);
ParticleUtils.spawnParticles(ParticleTypes.CLOUD, target, 10); ParticleUtils.spawnParticles(ParticleTypes.CLOUD, target, 10);
}
} }
} }
@ -208,6 +214,7 @@ public class TentacleEntity extends AbstractDecorationEntity {
if (growth == 0) { if (growth == 0) {
playSound(USounds.ENTITY_TENTACLE_DIG, 1, 1); playSound(USounds.ENTITY_TENTACLE_DIG, 1, 1);
emitGameEvent(GameEvent.RESONATE_1);
} }
} }
@ -255,9 +262,9 @@ public class TentacleEntity extends AbstractDecorationEntity {
protected boolean canTarget(LivingEntity target) { protected boolean canTarget(LivingEntity target) {
return target != null return target != null
&& !target.isRemoved() && target.isPartOfGame()
&& target.canTakeDamage()
&& !target.isSneaky() && !target.isSneaky()
&& !(target instanceof PlayerEntity player && (player.isCreative() || player.isSpectator()))
&& canSee(target); && canSee(target);
} }

View file

@ -12,12 +12,14 @@ import com.minelittlepony.unicopia.util.NbtSerialisable;
import com.minelittlepony.unicopia.util.Tickable; import com.minelittlepony.unicopia.util.Tickable;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.SideShapeType; import net.minecraft.block.SideShapeType;
import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedData;
import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.data.TrackedDataHandlerRegistry;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.registry.tag.BlockTags;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -62,7 +64,8 @@ public class Acrobatics implements Tickable, NbtSerialisable {
if (!pony.getPhysics().isFlying() && !entity.getAbilities().flying if (!pony.getPhysics().isFlying() && !entity.getAbilities().flying
&& climbingPos != null && climbingPos != null
&& pony.getObservedSpecies() == Race.CHANGELING) { && pony.getObservedSpecies() == Race.CHANGELING
&& !entity.getBlockStateAtPos().isIn(BlockTags.CLIMBABLE)) {
Vec3d vel = entity.getVelocity(); Vec3d vel = entity.getVelocity();
if (entity.isSneaking()) { if (entity.isSneaking()) {
entity.setVelocity(vel.x, 0, vel.z); entity.setVelocity(vel.x, 0, vel.z);
@ -138,7 +141,8 @@ public class Acrobatics implements Tickable, NbtSerialisable {
boolean isFaceClimbable(World world, BlockPos pos, Direction direction) { boolean isFaceClimbable(World world, BlockPos pos, Direction direction) {
pos = pos.offset(direction); pos = pos.offset(direction);
return world.getBlockState(pos).isSideSolid(world, pos, direction, SideShapeType.CENTER); BlockState state = world.getBlockState(pos);
return !state.isOf(Blocks.SCAFFOLDING) && state.isSideSolid(world, pos, direction, SideShapeType.CENTER);
} }
public Optional<BlockPos> getHangingPosition() { public Optional<BlockPos> getHangingPosition() {

View file

@ -8,6 +8,7 @@ import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableMultimap;
import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate;
import com.minelittlepony.unicopia.entity.*; import com.minelittlepony.unicopia.entity.*;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
@ -25,7 +26,6 @@ import it.unimi.dsi.fastutil.floats.Float2ObjectFunction;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.item.TooltipContext; import net.minecraft.client.item.TooltipContext;
import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.EnchantmentHelper;
@ -169,8 +169,12 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab
wearer.updateVelocity(); wearer.updateVelocity();
} }
EFFECT_SCALES.keySet().forEach(attribute -> { updateAttributes(wearer, 0);
wearer.updateAttributeModifier(EFFECT_UUID, attribute, 0F, EFFECT_FACTORY, false); }
public static void updateAttributes(Living<?> wearer, float effectScale) {
EFFECT_SCALES.entrySet().forEach(attribute -> {
wearer.updateAttributeModifier(EFFECT_UUID, attribute.getKey(), attribute.getValue() * effectScale, EFFECT_FACTORY, false);
}); });
} }
@ -194,9 +198,8 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab
} }
if (entity instanceof PlayerEntity) { if (entity instanceof PlayerEntity) {
if (entity.isOnFire() && world.getBlockState(entity.getBlockPos().up()).isOf(Blocks.SOUL_FIRE)) { if (entity.isOnFire() && world.getBlockState(entity.getBlockPos().up()).isOf(UBlocks.SPECTRAL_FIRE)) {
if (UnicopiaWorldProperties.forWorld((ServerWorld)world).isActiveAltar(entity.getBlockPos()) if (UnicopiaWorldProperties.forWorld((ServerWorld)world).isActiveAltar(entity)) {
|| UnicopiaWorldProperties.forWorld((ServerWorld)world).isActiveAltar(entity.getBlockPos().up())) {
if (living.asEntity().getHealth() < 2) { if (living.asEntity().getHealth() < 2) {
entity.setFireTicks(0); entity.setFireTicks(0);
world.removeBlock(entity.getBlockPos().up(), false); world.removeBlock(entity.getBlockPos().up(), false);
@ -291,10 +294,7 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab
// every 1 second, update modifiers // every 1 second, update modifiers
if (fullSecond) { if (fullSecond) {
EFFECT_SCALES.entrySet().forEach(attribute -> { updateAttributes(living, (float)attachedTicks / ItemTracker.SECONDS);
float seconds = (float)attachedTicks / ItemTracker.SECONDS;
living.updateAttributeModifier(EFFECT_UUID, attribute.getKey(), attribute.getValue() * seconds, EFFECT_FACTORY, false);
});
} }
} }

View file

@ -41,7 +41,15 @@ public class TransformCropsRecipe implements Recipe<TransformCropsRecipe.Placeme
this.catalyst = catalyst; this.catalyst = catalyst;
} }
public ItemStack getTargetAsItem() { public BlockState getCatalystState() {
return catalyst;
}
public BlockState getTargetState() {
return target.getDefaultState();
}
public ItemStack getTarget() {
return target.asItem().getDefaultStack(); return target.asItem().getDefaultStack();
} }

View file

@ -6,9 +6,7 @@ import com.mojang.serialization.DataResult;
import com.minelittlepony.unicopia.item.cloud.CloudShapingRecipe; import com.minelittlepony.unicopia.item.cloud.CloudShapingRecipe;
import net.fabricmc.fabric.api.loot.v2.LootTableEvents; import net.fabricmc.fabric.api.loot.v2.LootTableEvents;
import net.minecraft.loot.LootPool;
import net.minecraft.loot.LootTable; import net.minecraft.loot.LootTable;
import net.minecraft.loot.context.LootContextTypes;
import net.minecraft.recipe.CuttingRecipe; import net.minecraft.recipe.CuttingRecipe;
import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.Ingredient;
import net.minecraft.recipe.RecipeSerializer; import net.minecraft.recipe.RecipeSerializer;
@ -56,15 +54,11 @@ public interface URecipes {
LootTable table = manager.getLootTable(modId); LootTable table = manager.getLootTable(modId);
if (table != LootTable.EMPTY) { if (table != LootTable.EMPTY) {
if (table.getType() == LootContextTypes.ARCHAEOLOGY) { supplier.modifyPools(poolBuilder -> {
supplier.modifyPools(poolBuilder -> { for (var pool : table.pools) {
for (LootPool pool : table.pools) { poolBuilder.with(pool.entries);
poolBuilder.with(pool.entries); }
} });
});
} else {
supplier.pools(table.pools);
}
} }
}); });
} }

View file

@ -105,11 +105,15 @@ public class EffectSync implements SpellContainer, NbtSerialisable {
@Override @Override
public boolean removeWhere(Predicate<Spell> test, boolean update) { public boolean removeWhere(Predicate<Spell> test, boolean update) {
return reduce(update, (initial, effect) -> { return reduce(update, (initial, spell) -> {
if (!test.test(effect)) { if (!test.test(spell)) {
return initial; return initial;
} }
spells.removeReference(effect); spell.setDead();
spell.tickDying(owner);
if (spell.isDead()) {
spells.removeReference(spell);
}
return true; return true;
}); });
} }

View file

@ -1,23 +1,17 @@
package com.minelittlepony.unicopia.network.datasync; package com.minelittlepony.unicopia.network.datasync;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.spell.Spell; import com.minelittlepony.unicopia.ability.magic.spell.Spell;
import com.minelittlepony.unicopia.ability.magic.spell.SpellReference;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
public class SpellNetworkedReference<T extends Spell> implements NetworkedReference<T> { public class SpellNetworkedReference<T extends Spell> implements NetworkedReference<T> {
private Optional<T> currentValue = Optional.empty(); private final SpellReference<T> currentValue = new SpellReference<>();
@Nullable
private NbtCompound lastValue;
private final Caster<?> owner; private final Caster<?> owner;
private boolean dirty; private boolean dirty;
public SpellNetworkedReference(Caster<?> owner) { public SpellNetworkedReference(Caster<?> owner) {
@ -26,81 +20,29 @@ public class SpellNetworkedReference<T extends Spell> implements NetworkedRefere
@Override @Override
public Optional<T> getReference() { public Optional<T> getReference() {
return currentValue.filter(s -> !s.isDead()); return Optional.ofNullable(currentValue.get());
}
private boolean mustDelete(@Nullable NbtCompound comp) {
return comp == null || !comp.contains("effect_id") || !comp.contains("uuid");
}
private boolean mustReplace(NbtCompound comp) {
return currentValue.isEmpty() || !currentValue.get().getUuid().equals(comp.getUuid("uuid"));
}
private boolean mustUpdate(NbtCompound comp) {
if (owner.isClient() && !Objects.equals(lastValue, comp)) {
lastValue = comp;
return true;
}
return false;
}
private boolean mustSend() {
return currentValue.filter(Spell::isDirty).isPresent();
} }
@Override @Override
public void updateReference(@Nullable T newValue) { public void updateReference(@Nullable T newValue) {
newValue = newValue == null || newValue.isDead() ? null : newValue; dirty |= currentValue.set(newValue, owner);
@Nullable
T oldValue = currentValue.orElse(null);
if (oldValue != newValue) {
dirty = true;
currentValue = Optional.ofNullable(newValue);
if (oldValue != null && (newValue == null || !oldValue.getUuid().equals(newValue.getUuid()))) {
oldValue.destroy(owner);
}
}
} }
@Override @Override
@SuppressWarnings("unchecked")
public boolean fromNbt(NbtCompound comp) { public boolean fromNbt(NbtCompound comp) {
dirty = false; dirty = false;
currentValue.fromNBT(comp);
if (mustDelete(comp)) { return isDirty();
updateReference(null);
return false;
}
if (mustReplace(comp)) {
updateReference((T)Spell.readNbt(comp));
return false;
}
if (mustUpdate(comp)) {
currentValue.ifPresent(s -> s.fromNBT(comp));
return false;
}
if (mustSend()) {
updateReference(getReference().orElse(null));
return true;
}
return false;
} }
@Override @Override
public NbtCompound toNbt() { public NbtCompound toNbt() {
dirty = false; dirty = false;
return getReference().map(Spell::writeNbt).orElseGet(NbtCompound::new); return currentValue.toNBT();
} }
@Override @Override
public boolean isDirty() { public boolean isDirty() {
return dirty || mustSend(); return !owner.isClient() && (dirty || currentValue.hasDirtySpell());
} }
} }

View file

@ -7,6 +7,7 @@ import java.util.function.Consumer;
import java.util.function.Predicate; import java.util.function.Predicate;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.entity.mob.FloatingArtefactEntity; import com.minelittlepony.unicopia.entity.mob.FloatingArtefactEntity;
import com.minelittlepony.unicopia.entity.mob.SpellbookEntity; import com.minelittlepony.unicopia.entity.mob.SpellbookEntity;
import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.entity.mob.UEntities;
@ -30,7 +31,16 @@ import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3i; import net.minecraft.util.math.Vec3i;
import net.minecraft.world.World; import net.minecraft.world.World;
public record Altar(BlockPos origin, Set<BlockPos> pillars) { public record Altar(
/**
* The position of the central spectral fire of this altar
*/
BlockPos origin,
/**
* Pillar top positions
*/
Set<BlockPos> pillars
) {
private static final Direction[] HORIZONTALS = { Direction.SOUTH, Direction.WEST, Direction.NORTH, Direction.EAST }; private static final Direction[] HORIZONTALS = { Direction.SOUTH, Direction.WEST, Direction.NORTH, Direction.EAST };
private static final Predicate<Entity> IS_PARTICIPANT = EntityPredicates.VALID_ENTITY.and(e -> e instanceof FloatingArtefactEntity || e instanceof SpellbookEntity); private static final Predicate<Entity> IS_PARTICIPANT = EntityPredicates.VALID_ENTITY.and(e -> e instanceof FloatingArtefactEntity || e instanceof SpellbookEntity);
public static final NbtSerialisable.Serializer<Altar> SERIALIZER = NbtSerialisable.Serializer.of(nbt -> { public static final NbtSerialisable.Serializer<Altar> SERIALIZER = NbtSerialisable.Serializer.of(nbt -> {
@ -133,7 +143,7 @@ public record Altar(BlockPos origin, Set<BlockPos> pillars) {
} }
public void generateDecorations(World world) { public void generateDecorations(World world) {
world.setBlockState(origin, Blocks.SOUL_FIRE.getDefaultState(), Block.FORCE_STATE | Block.NOTIFY_ALL); world.setBlockState(origin, UBlocks.SPECTRAL_FIRE.getDefaultState(), Block.FORCE_STATE | Block.NOTIFY_ALL);
pillars.forEach(pillar -> { pillars.forEach(pillar -> {
FloatingArtefactEntity artefact = UEntities.FLOATING_ARTEFACT.create(world); FloatingArtefactEntity artefact = UEntities.FLOATING_ARTEFACT.create(world);
artefact.setStack(UItems.ALICORN_BADGE.getDefaultStack()); artefact.setStack(UItems.ALICORN_BADGE.getDefaultStack());
@ -160,7 +170,7 @@ public record Altar(BlockPos origin, Set<BlockPos> pillars) {
} }
public boolean isValid(World world) { public boolean isValid(World world) {
return checkState(world, origin, Blocks.SOUL_FIRE) return checkState(world, origin, UBlocks.SPECTRAL_FIRE)
&& checkState(world, origin.down(), Blocks.SOUL_SAND) && checkState(world, origin.down(), Blocks.SOUL_SAND)
&& checkSlab(world, origin.down()) && checkSlab(world, origin.down())
&& pillars.stream().allMatch(pillar -> && pillars.stream().allMatch(pillar ->

View file

@ -9,6 +9,7 @@ import com.minelittlepony.unicopia.network.MsgSkyAngle;
import com.minelittlepony.unicopia.util.NbtSerialisable; import com.minelittlepony.unicopia.util.NbtSerialisable;
import net.minecraft.datafixer.DataFixTypes; import net.minecraft.datafixer.DataFixTypes;
import net.minecraft.entity.Entity;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtElement;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
@ -70,6 +71,15 @@ public class UnicopiaWorldProperties extends PersistentState {
return activeAltarPositions.contains(center); return activeAltarPositions.contains(center);
} }
public boolean isActiveAltar(Entity entity) {
for (int i = 0; i < entity.getHeight(); i++) {
if (isActiveAltar(entity.getBlockPos().up(i))) {
return true;
}
}
return false;
}
@Override @Override
public NbtCompound writeNbt(NbtCompound tag) { public NbtCompound writeNbt(NbtCompound tag) {
tag.putString("defaultRace", Race.REGISTRY.getId(defaultRace).toString()); tag.putString("defaultRace", Race.REGISTRY.getId(defaultRace).toString());

View file

@ -0,0 +1,90 @@
{
"multipart": [
{
"apply": [
{
"model": "minecraft:block/soul_fire_floor0"
},
{
"model": "minecraft:block/soul_fire_floor1"
}
]
},
{
"apply": [
{
"model": "minecraft:block/soul_fire_side0"
},
{
"model": "minecraft:block/soul_fire_side1"
},
{
"model": "minecraft:block/soul_fire_side_alt0"
},
{
"model": "minecraft:block/soul_fire_side_alt1"
}
]
},
{
"apply": [
{
"model": "minecraft:block/soul_fire_side0",
"y": 90
},
{
"model": "minecraft:block/soul_fire_side1",
"y": 90
},
{
"model": "minecraft:block/soul_fire_side_alt0",
"y": 90
},
{
"model": "minecraft:block/soul_fire_side_alt1",
"y": 90
}
]
},
{
"apply": [
{
"model": "minecraft:block/soul_fire_side0",
"y": 180
},
{
"model": "minecraft:block/soul_fire_side1",
"y": 180
},
{
"model": "minecraft:block/soul_fire_side_alt0",
"y": 180
},
{
"model": "minecraft:block/soul_fire_side_alt1",
"y": 180
}
]
},
{
"apply": [
{
"model": "minecraft:block/soul_fire_side0",
"y": 270
},
{
"model": "minecraft:block/soul_fire_side1",
"y": 270
},
{
"model": "minecraft:block/soul_fire_side_alt0",
"y": 270
},
{
"model": "minecraft:block/soul_fire_side_alt1",
"y": 270
}
]
}
]
}

View file

@ -0,0 +1,16 @@
{
"variants": {
"axis=x": {
"model": "unicopia:block/stripped_zap_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "unicopia:block/stripped_zap_log"
},
"axis=z": {
"model": "unicopia:block/stripped_zap_log_horizontal",
"x": 90
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/stripped_zap_wood"
}
}
}

View file

@ -0,0 +1,48 @@
{
"multipart": [
{
"apply": {
"model": "unicopia:block/zap_fence_post"
}
},
{
"apply": {
"model": "unicopia:block/zap_fence_side",
"uvlock": true
},
"when": {
"north": "true"
}
},
{
"apply": {
"model": "unicopia:block/zap_fence_side",
"uvlock": true,
"y": 90
},
"when": {
"east": "true"
}
},
{
"apply": {
"model": "unicopia:block/zap_fence_side",
"uvlock": true,
"y": 180
},
"when": {
"south": "true"
}
},
{
"apply": {
"model": "unicopia:block/zap_fence_side",
"uvlock": true,
"y": 270
},
"when": {
"west": "true"
}
}
]
}

View file

@ -0,0 +1,80 @@
{
"variants": {
"facing=east,in_wall=false,open=false": {
"model": "unicopia:block/zap_fence_gate",
"uvlock": true,
"y": 270
},
"facing=east,in_wall=false,open=true": {
"model": "unicopia:block/zap_fence_gate_open",
"uvlock": true,
"y": 270
},
"facing=east,in_wall=true,open=false": {
"model": "unicopia:block/zap_fence_gate_wall",
"uvlock": true,
"y": 270
},
"facing=east,in_wall=true,open=true": {
"model": "unicopia:block/zap_fence_gate_wall_open",
"uvlock": true,
"y": 270
},
"facing=north,in_wall=false,open=false": {
"model": "unicopia:block/zap_fence_gate",
"uvlock": true,
"y": 180
},
"facing=north,in_wall=false,open=true": {
"model": "unicopia:block/zap_fence_gate_open",
"uvlock": true,
"y": 180
},
"facing=north,in_wall=true,open=false": {
"model": "unicopia:block/zap_fence_gate_wall",
"uvlock": true,
"y": 180
},
"facing=north,in_wall=true,open=true": {
"model": "unicopia:block/zap_fence_gate_wall_open",
"uvlock": true,
"y": 180
},
"facing=south,in_wall=false,open=false": {
"model": "unicopia:block/zap_fence_gate",
"uvlock": true
},
"facing=south,in_wall=false,open=true": {
"model": "unicopia:block/zap_fence_gate_open",
"uvlock": true
},
"facing=south,in_wall=true,open=false": {
"model": "unicopia:block/zap_fence_gate_wall",
"uvlock": true
},
"facing=south,in_wall=true,open=true": {
"model": "unicopia:block/zap_fence_gate_wall_open",
"uvlock": true
},
"facing=west,in_wall=false,open=false": {
"model": "unicopia:block/zap_fence_gate",
"uvlock": true,
"y": 90
},
"facing=west,in_wall=false,open=true": {
"model": "unicopia:block/zap_fence_gate_open",
"uvlock": true,
"y": 90
},
"facing=west,in_wall=true,open=false": {
"model": "unicopia:block/zap_fence_gate_wall",
"uvlock": true,
"y": 90
},
"facing=west,in_wall=true,open=true": {
"model": "unicopia:block/zap_fence_gate_wall_open",
"uvlock": true,
"y": 90
}
}
}

View file

@ -0,0 +1,16 @@
{
"variants": {
"axis=x": {
"model": "unicopia:block/zap_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "unicopia:block/zap_log"
},
"axis=z": {
"model": "unicopia:block/zap_log_horizontal",
"x": 90
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/zap_planks"
}
}
}

View file

@ -0,0 +1,13 @@
{
"variants": {
"type=bottom": {
"model": "unicopia:block/zap_slab"
},
"type=double": {
"model": "unicopia:block/zap_planks"
},
"type=top": {
"model": "unicopia:block/zap_slab_top"
}
}
}

View file

@ -0,0 +1,209 @@
{
"variants": {
"facing=east,half=bottom,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner"
},
"facing=east,half=bottom,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer"
},
"facing=east,half=bottom,shape=straight": {
"model": "unicopia:block/zap_stairs"
},
"facing=east,half=top,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"x": 180
},
"facing=north,half=bottom,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"y": 270
},
"facing=north,half=top,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=south,half=bottom,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner"
},
"facing=south,half=bottom,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer"
},
"facing=south,half=bottom,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"y": 90
},
"facing=south,half=top,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=west,half=bottom,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"y": 180
},
"facing=west,half=top,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"x": 180,
"y": 180
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/zap_wood"
}
}
}

View file

@ -0,0 +1,48 @@
{
"multipart": [
{
"apply": {
"model": "unicopia:block/zap_fence_post"
}
},
{
"apply": {
"model": "unicopia:block/zap_fence_side",
"uvlock": true
},
"when": {
"north": "true"
}
},
{
"apply": {
"model": "unicopia:block/zap_fence_side",
"uvlock": true,
"y": 90
},
"when": {
"east": "true"
}
},
{
"apply": {
"model": "unicopia:block/zap_fence_side",
"uvlock": true,
"y": 180
},
"when": {
"south": "true"
}
},
{
"apply": {
"model": "unicopia:block/zap_fence_side",
"uvlock": true,
"y": 270
},
"when": {
"west": "true"
}
}
]
}

View file

@ -0,0 +1,80 @@
{
"variants": {
"facing=east,in_wall=false,open=false": {
"model": "unicopia:block/zap_fence_gate",
"uvlock": true,
"y": 270
},
"facing=east,in_wall=false,open=true": {
"model": "unicopia:block/zap_fence_gate_open",
"uvlock": true,
"y": 270
},
"facing=east,in_wall=true,open=false": {
"model": "unicopia:block/zap_fence_gate_wall",
"uvlock": true,
"y": 270
},
"facing=east,in_wall=true,open=true": {
"model": "unicopia:block/zap_fence_gate_wall_open",
"uvlock": true,
"y": 270
},
"facing=north,in_wall=false,open=false": {
"model": "unicopia:block/zap_fence_gate",
"uvlock": true,
"y": 180
},
"facing=north,in_wall=false,open=true": {
"model": "unicopia:block/zap_fence_gate_open",
"uvlock": true,
"y": 180
},
"facing=north,in_wall=true,open=false": {
"model": "unicopia:block/zap_fence_gate_wall",
"uvlock": true,
"y": 180
},
"facing=north,in_wall=true,open=true": {
"model": "unicopia:block/zap_fence_gate_wall_open",
"uvlock": true,
"y": 180
},
"facing=south,in_wall=false,open=false": {
"model": "unicopia:block/zap_fence_gate",
"uvlock": true
},
"facing=south,in_wall=false,open=true": {
"model": "unicopia:block/zap_fence_gate_open",
"uvlock": true
},
"facing=south,in_wall=true,open=false": {
"model": "unicopia:block/zap_fence_gate_wall",
"uvlock": true
},
"facing=south,in_wall=true,open=true": {
"model": "unicopia:block/zap_fence_gate_wall_open",
"uvlock": true
},
"facing=west,in_wall=false,open=false": {
"model": "unicopia:block/zap_fence_gate",
"uvlock": true,
"y": 90
},
"facing=west,in_wall=false,open=true": {
"model": "unicopia:block/zap_fence_gate_open",
"uvlock": true,
"y": 90
},
"facing=west,in_wall=true,open=false": {
"model": "unicopia:block/zap_fence_gate_wall",
"uvlock": true,
"y": 90
},
"facing=west,in_wall=true,open=true": {
"model": "unicopia:block/zap_fence_gate_wall_open",
"uvlock": true,
"y": 90
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/zap_planks"
}
}
}

View file

@ -0,0 +1,13 @@
{
"variants": {
"type=bottom": {
"model": "unicopia:block/zap_slab"
},
"type=double": {
"model": "unicopia:block/zap_planks"
},
"type=top": {
"model": "unicopia:block/zap_slab_top"
}
}
}

View file

@ -0,0 +1,209 @@
{
"variants": {
"facing=east,half=bottom,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner"
},
"facing=east,half=bottom,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer"
},
"facing=east,half=bottom,shape=straight": {
"model": "unicopia:block/zap_stairs"
},
"facing=east,half=top,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"x": 180
},
"facing=north,half=bottom,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"y": 270
},
"facing=north,half=top,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=south,half=bottom,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner"
},
"facing=south,half=bottom,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer"
},
"facing=south,half=bottom,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"y": 90
},
"facing=south,half=top,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=west,half=bottom,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"y": 180
},
"facing=west,half=top,shape=inner_left": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=inner_right": {
"model": "unicopia:block/zap_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=outer_left": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=outer_right": {
"model": "unicopia:block/zap_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=straight": {
"model": "unicopia:block/zap_stairs",
"uvlock": true,
"x": 180,
"y": 180
}
}
}

View file

@ -49,6 +49,9 @@
"emi.category.unicopia.spellbook": "Spellbook", "emi.category.unicopia.spellbook": "Spellbook",
"emi.category.unicopia.cloud_shaping": "Shaping", "emi.category.unicopia.cloud_shaping": "Shaping",
"emi.category.unicopia.growing": "Growing", "emi.category.unicopia.growing": "Growing",
"emi.category.unicopia.altar": "Dark Ritual",
"recipe.unicopia.altar.instruction": "Cast item into flames",
"recipe.unicopia.growing.instruction": "Focus Earth Pony Magic",
"item.unicopia.alicorn_badge": "Alicorn Emblem", "item.unicopia.alicorn_badge": "Alicorn Emblem",
"item.unicopia.unicorn_badge": "Unicorn Emblem", "item.unicopia.unicorn_badge": "Unicorn Emblem",
@ -222,12 +225,27 @@
"block.unicopia.rocks": "Rocks", "block.unicopia.rocks": "Rocks",
"block.unicopia.plunder_vine": "Plunder Vine", "block.unicopia.plunder_vine": "Plunder Vine",
"block.unicopia.plunder_vine_bud": "Plunder Vine Bud", "block.unicopia.plunder_vine_bud": "Plunder Vine Bud",
"block.unicopia.spectral_fire": "Spectral Fire",
"block.unicopia.bananas": "Bananas", "block.unicopia.bananas": "Bananas",
"block.unicopia.zapling": "Zapling", "block.unicopia.zapling": "Zapling",
"block.unicopia.zap_log": "Zap Apple Log", "block.unicopia.zap_log": "Zap Apple Log",
"block.unicopia.zap_wood": "Zap Apple Wood", "block.unicopia.zap_wood": "Zap Apple Wood",
"block.unicopia.stripped_zap_log": "Stripped Zap Apple Log", "block.unicopia.stripped_zap_log": "Stripped Zap Apple Log",
"block.unicopia.stripped_zap_wood": "Stripped Zap Apple Wood", "block.unicopia.stripped_zap_wood": "Stripped Zap Apple Wood",
"block.unicopia.zap_planks": "Zap Apple Planks",
"block.unicopia.zap_stairs": "Zap Apple Stairs",
"block.unicopia.zap_slab": "Zap Apple Slab",
"block.unicopia.zap_fence": "Zap Apple Fence",
"block.unicopia.zap_fence_gate": "Zap Apple Fence Gate",
"block.unicopia.waxed_zap_log": "Waxed Zap Apple Log",
"block.unicopia.waxed_zap_wood": "Waxed Zap Apple Wood",
"block.unicopia.waxed_stripped_zap_log": "Waxed Stripped Zap Apple Log",
"block.unicopia.waxed_stripped_zap_wood": "Waxed Stripped Zap Apple Wood",
"block.unicopia.waxed_zap_planks": "Waxed Zap Apple Planks",
"block.unicopia.waxed_zap_stairs": "Waxed Zap Apple Stairs",
"block.unicopia.waxed_zap_slab": "Waxed Zap Apple Slab",
"block.unicopia.waxed_zap_fence": "Waxed Zap Apple Fence",
"block.unicopia.waxed_zap_fence_gate": "Waxed Zap Apple Fence Gate",
"block.unicopia.zap_leaves": "Zap Apple Leaves", "block.unicopia.zap_leaves": "Zap Apple Leaves",
"block.unicopia.flowering_zap_leaves": "Flowering Zap Apple Leaves", "block.unicopia.flowering_zap_leaves": "Flowering Zap Apple Leaves",
"block.unicopia.zap_apple": "Zap Apple", "block.unicopia.zap_apple": "Zap Apple",
@ -828,27 +846,27 @@
"gui.unicopia.spellbook.chapter.introduction.p6.2.body": "Put a raw gem-it mustn't have any spells already-in the middle and place materials around it in the slots I marked.", "gui.unicopia.spellbook.chapter.introduction.p6.2.body": "Put a raw gem-it mustn't have any spells already-in the middle and place materials around it in the slots I marked.",
"gui.unicopia.spellbook.chapter.introduction.p6.3.body": "Each material gives different effects and putting them closer enhances their influence on the gem.", "gui.unicopia.spellbook.chapter.introduction.p6.3.body": "Each material gives different effects and putting them closer enhances their influence on the gem.",
"gui.unicopia.spellbook.chapter.introduction.p7.title": "3rd Mare '12", "gui.unicopia.spellbook.chapter.introduction.p7.title": "3rd Mare '12",
"gui.unicopia.spellbook.chapter.introduction.p7.1.body": "I'm going to start documenting spell combinations as I find them. Some of them are pretty obvious, like gem + fire = fire gem", "gui.unicopia.spellbook.chapter.introduction.p7.1.body": "I'm going to start documenting spell combinations as I find them. Some of them are pretty obvious, like gem + fire = fire gem.",
"gui.unicopia.spellbook.chapter.introduction.p7.2.body": "But some are less clear. For instance, what traits would an egg add? Much experimenting is needed. Oh, I'm giddy with excitement!", "gui.unicopia.spellbook.chapter.introduction.p7.2.body": "But some are less clear. For instance, what traits would an egg add? Much experimenting is needed. Oh, I'm giddy with excitement!",
"gui.unicopia.spellbook.chapter.introduction.p8.title": "Botched Gems", "gui.unicopia.spellbook.chapter.introduction.p8.title": "Botched Gems",
"gui.unicopia.spellbook.chapter.introduction.p8.1.body": "Not every combination works. What's dissapointing is now I have all these useless stones piling up in my chambers.", "gui.unicopia.spellbook.chapter.introduction.p8.1.body": "Not every combination works. What's disappointing is now I have all these useless stones piling up in my chambers.",
"gui.unicopia.spellbook.chapter.introduction.p8.2.body": "I don't know what to do with them. They're not edible. At least the locals don't think so.", "gui.unicopia.spellbook.chapter.introduction.p8.2.body": "I don't know what to do with them. They're not edible. At least the locals don't think so.",
"gui.unicopia.spellbook.chapter.introduction.p8.3.body": "They do still have the traits I gave them, so maybe I can find a use other than building a rock-fort with little Luna...", "gui.unicopia.spellbook.chapter.introduction.p8.3.body": "They do still have the traits I gave them, so maybe I can find a use other than building a rock-fort with little Luna...",
"gui.unicopia.spellbook.chapter.introduction.p9.title": "13th Mare '12", "gui.unicopia.spellbook.chapter.introduction.p9.title": "13th Mare '12",
"gui.unicopia.spellbook.chapter.introduction.p9.1.body": "Sorry for the long delay in updates. I've been hard at work researching different spells and desciding my approach.", "gui.unicopia.spellbook.chapter.introduction.p9.1.body": "Sorry for the long delay in updates. I've been hard at work researching different spells and deciding my approach.",
"gui.unicopia.spellbook.chapter.introduction.p9.2.body": "Fire is becomg a very interesting aspect, what with traits for it being readily available.", "gui.unicopia.spellbook.chapter.introduction.p9.2.body": "Fire is becoming a very interesting aspect, what with traits for it being readily available.",
"gui.unicopia.spellbook.chapter.fire.p1.title": "Ch.2 Fire Magic", "gui.unicopia.spellbook.chapter.fire.p1.title": "Ch.2 Fire Magic",
"gui.unicopia.spellbook.chapter.fire.p2.title": "9th Jum '12", "gui.unicopia.spellbook.chapter.fire.p2.title": "9th Jum '12",
"gui.unicopia.spellbook.chapter.fire.p2.1.body": "It took me longer than I anticipated, nearly a month! Hah! But I present to you, dear reader, my findings for the first elementary form of magic: FIRE.", "gui.unicopia.spellbook.chapter.fire.p2.1.body": "It took me longer than I anticipated, nearly a month! Hah! But I present to you, dear reader, my findings for the first elementary form of magic: FIRE.",
"gui.unicopia.spellbook.chapter.fire.p2.2.body": "It's a working title, okay?", "gui.unicopia.spellbook.chapter.fire.p2.2.body": "It's a working title, okay?",
"gui.unicopia.spellbook.chapter.fire.scorch.1.body": "Simple and to the point, Scorch does exactly what you'd think. By embuing a gem with the fire trait, one can indute it to glow and become hot to the touch.", "gui.unicopia.spellbook.chapter.fire.scorch.1.body": "Simple and to the point, Scorch does exactly what you'd think. By imbuing a gem with the fire trait, one can induce it to glow and become hot to the touch.",
"gui.unicopia.spellbook.chapter.fire.scorch.2.body": "The effect becomes stronger the more fire you load it with, but take care not to overload it, as it may become volatile.", "gui.unicopia.spellbook.chapter.fire.scorch.2.body": "The effect becomes stronger the more fire you load it with, but take care not to overload it, as it may become volatile.",
"gui.unicopia.spellbook.chapter.fire.flame.1.body": "Creates a heating affect up to a radius of 3 hooves from any surfaces it touches.", "gui.unicopia.spellbook.chapter.fire.flame.1.body": "Creates a heating affect up to a radius of 3 hooves from any surfaces it touches.",
"gui.unicopia.spellbook.chapter.fire.flame.2.body": "Useful when one needs a flame in a hurry or to fend off a wild wendigo.", "gui.unicopia.spellbook.chapter.fire.flame.2.body": "Useful when one needs a flame in a hurry or to fend off a wild wendigo.",
"gui.unicopia.spellbook.chapter.fire.p5.title": "10th Jum '12", "gui.unicopia.spellbook.chapter.fire.p5.title": "10th Jum '12",
"gui.unicopia.spellbook.chapter.fire.p5.1.body": "Progress?", "gui.unicopia.spellbook.chapter.fire.p5.1.body": "Progress?",
"gui.unicopia.spellbook.chapter.fire.p5.2.body": "I've managed to improve the previous spell somewhat, but there is still something lacking. It's all very orderly. Predicatable.", "gui.unicopia.spellbook.chapter.fire.p5.2.body": "I've managed to improve the previous spell somewhat, but there is still something lacking. It's all very orderly. Predictable.",
"gui.unicopia.spellbook.chapter.fire.p5.3.body": "Luna has suggested adding more fire, but I'm weary to create more scorch marks on the tower. Faust save me if anypony were to find out what I've been doing...", "gui.unicopia.spellbook.chapter.fire.p5.3.body": "Luna has suggested adding more fire, but I'm weary to create more scorch marks on the tower. Faust save me if anypony were to find out what I've been doing...",
"gui.unicopia.spellbook.chapter.fire.p6.title": "Fire Magic III", "gui.unicopia.spellbook.chapter.fire.p6.title": "Fire Magic III",
"gui.unicopia.spellbook.chapter.fire.p6.1.body": "Focusing Magic", "gui.unicopia.spellbook.chapter.fire.p6.1.body": "Focusing Magic",
@ -887,7 +905,7 @@
"gui.unicopia.spellbook.chapter.fire.p16.1.body": "By adding extra traits, I was able to slightly modify the shield to allow or deny certain parties into the effect range.", "gui.unicopia.spellbook.chapter.fire.p16.1.body": "By adding extra traits, I was able to slightly modify the shield to allow or deny certain parties into the effect range.",
"gui.unicopia.spellbook.chapter.fire.p16.2.body": "+ add life trait --> all animals may enter\n+ add blood trait --> all monsters may enter\n+ add ice trait --> all ponies may enter", "gui.unicopia.spellbook.chapter.fire.p16.2.body": "+ add life trait --> all animals may enter\n+ add blood trait --> all monsters may enter\n+ add ice trait --> all ponies may enter",
"gui.unicopia.spellbook.chapter.fire.p17.title": "Protection III", "gui.unicopia.spellbook.chapter.fire.p17.title": "Protection III",
"gui.unicopia.spellbook.chapter.fire.p17.1.body": "+ add genorosity trait to attach the spell to a location rather than yourself", "gui.unicopia.spellbook.chapter.fire.p17.1.body": "+ add generosity trait to attach the spell to a location rather than yourself",
"gui.unicopia.spellbook.chapter.fire.p18.title": "Scrap: 9th Jum '12", "gui.unicopia.spellbook.chapter.fire.p18.title": "Scrap: 9th Jum '12",
"gui.unicopia.spellbook.chapter.fire.p18.1.body": "Fire magic has proven to a be a little more... unpredictable than anticipated. Every time I feel like I'm making progress it finds a way to set me back.", "gui.unicopia.spellbook.chapter.fire.p18.1.body": "Fire magic has proven to a be a little more... unpredictable than anticipated. Every time I feel like I'm making progress it finds a way to set me back.",
"gui.unicopia.spellbook.chapter.fire.p18.2.body": "I can't stop now, though...I'm told the situation in the west is growing dire. They have asked me to pick up the pace and produce something we can use to get the upper hoof against the §kChangeling Storm§r.", "gui.unicopia.spellbook.chapter.fire.p18.2.body": "I can't stop now, though...I'm told the situation in the west is growing dire. They have asked me to pick up the pace and produce something we can use to get the upper hoof against the §kChangeling Storm§r.",
@ -899,15 +917,15 @@
"gui.unicopia.spellbook.chapter.ice.frost.1.body": "Creates a chilling affect up to a radius of 3 hooves from any surfaces it touches.", "gui.unicopia.spellbook.chapter.ice.frost.1.body": "Creates a chilling affect up to a radius of 3 hooves from any surfaces it touches.",
"gui.unicopia.spellbook.chapter.ice.frost.2.body": "Will sap energy out of the immediate environment causing a phase change.", "gui.unicopia.spellbook.chapter.ice.frost.2.body": "Will sap energy out of the immediate environment causing a phase change.",
"gui.unicopia.spellbook.chapter.ice.p4.title": "Chilling Breath", "gui.unicopia.spellbook.chapter.ice.p4.title": "Chilling Breath",
"gui.unicopia.spellbook.chapter.ice.p4.1.body": "Alters the ability of certain objects to distenguish between hot and cold.", "gui.unicopia.spellbook.chapter.ice.p4.1.body": "Alters the ability of certain objects to distinguish between hot and cold.",
"gui.unicopia.spellbook.chapter.ice.p4.2.body": "This is a very weak spell, but when used with a boat can be exceedingly useful to get out of a sticky stituation.", "gui.unicopia.spellbook.chapter.ice.p4.2.body": "This is a very weak spell, but when used with a boat can be exceedingly useful to get out of a sticky situation.",
"gui.unicopia.spellbook.chapter.ice.p5.title": "5th Trot '12", "gui.unicopia.spellbook.chapter.ice.p5.title": "5th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p5.1.body": "The village-ponies had a bonfire last night. I could tell by the strong smell of burning wood and the sound of music.", "gui.unicopia.spellbook.chapter.ice.p5.1.body": "The village-ponies had a bonfire last night. I could tell by the strong smell of burning wood and the sound of music.",
"gui.unicopia.spellbook.chapter.ice.p5.2.body": "Luna, bless her heart, insisted that we take a break to join them. She had to practically drag me away from my desk to do it.", "gui.unicopia.spellbook.chapter.ice.p5.2.body": "Luna, bless her heart, insisted that we take a break to join them. She had to practically drag me away from my desk to do it.",
"gui.unicopia.spellbook.chapter.ice.p5.3.body": "What can I say? She's a light in my heart.", "gui.unicopia.spellbook.chapter.ice.p5.3.body": "What can I say? She's a light in my heart.",
"gui.unicopia.spellbook.chapter.ice.p6.title": "Bonfire", "gui.unicopia.spellbook.chapter.ice.p6.title": "Bonfire",
"gui.unicopia.spellbook.chapter.ice.p6.1.body": "We arrived at the bonfire, and of course the first thing they had was a mug of ale in my hoof. I didn't drink it, of course-alcohol is a poison to me. I'd be sick as a mule.", "gui.unicopia.spellbook.chapter.ice.p6.1.body": "We arrived at the bonfire, and of course the first thing they had was a mug of ale in my hoof. I didn't drink it, of course-alcohol is a poison to me. I'd be sick as a mule.",
"gui.unicopia.spellbook.chapter.ice.p6.2.body": "Luna enjoyed it-the bonfire, not the ale!-though. She made immediate friends with one of the town's fillies, Celly or something. They played the whole night.", "gui.unicopia.spellbook.chapter.ice.p6.2.body": "Luna enjoyed it - the bonfire, not the ale! - though. She made immediate friends with one of the town's fillies, Celly or something. They played the whole night.",
"gui.unicopia.spellbook.chapter.ice.p7.title": "Bonfire II", "gui.unicopia.spellbook.chapter.ice.p7.title": "Bonfire II",
"gui.unicopia.spellbook.chapter.ice.p7.1.body": "On the way back Luna was telling me of the stories her friend told her. The town has a lot of legends, as to be expected.", "gui.unicopia.spellbook.chapter.ice.p7.1.body": "On the way back Luna was telling me of the stories her friend told her. The town has a lot of legends, as to be expected.",
"gui.unicopia.spellbook.chapter.ice.p7.2.body": "One of them was about a scary old warlock who lived in a haunted tower at the edge of town. There's no mystery who that was about.", "gui.unicopia.spellbook.chapter.ice.p7.2.body": "One of them was about a scary old warlock who lived in a haunted tower at the edge of town. There's no mystery who that was about.",
@ -918,11 +936,11 @@
"gui.unicopia.spellbook.chapter.ice.light.2.body": "Dancing Lights will summon a cluster of glowing orbs to illuminate your path.", "gui.unicopia.spellbook.chapter.ice.light.2.body": "Dancing Lights will summon a cluster of glowing orbs to illuminate your path.",
"gui.unicopia.spellbook.chapter.ice.light.modifier.1": "* By adding more focus you can extend the duration of the spell", "gui.unicopia.spellbook.chapter.ice.light.modifier.1": "* By adding more focus you can extend the duration of the spell",
"gui.unicopia.spellbook.chapter.ice.p10.title": "12th Trot '12", "gui.unicopia.spellbook.chapter.ice.p10.title": "12th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p10.1.body": "There were more noises last night, this time a lot closer. The town's dimeaner has also changed. A lot of the ponies I see that are normally very cheerful have become sullen.", "gui.unicopia.spellbook.chapter.ice.p10.1.body": "There were more noises last night, this time a lot closer. The town's demeanor has also changed. A lot of the ponies I see that are normally very cheerful have become sullen.",
"gui.unicopia.spellbook.chapter.ice.p10.2.body": "Something has happened, that much is obvious, though few will tell me what.", "gui.unicopia.spellbook.chapter.ice.p10.2.body": "Something has happened, that much is obvious, though few will tell me what.",
"gui.unicopia.spellbook.chapter.ice.p11.title": "15th Trot '12", "gui.unicopia.spellbook.chapter.ice.p11.title": "15th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p11.1.body": "Winter is nearly upon us now. I just saw the earliest flakes of snow outside this window as I write.", "gui.unicopia.spellbook.chapter.ice.p11.1.body": "Winter is nearly upon us now. I just saw the earliest flakes of snow outside this window as I write.",
"gui.unicopia.spellbook.chapter.ice.p11.2.body": "The locals have begun their winter unwrapping and though the usual grumblings about frozen fields abound, I can tell there is still §ka sense of uneasyness§r.", "gui.unicopia.spellbook.chapter.ice.p11.2.body": "The locals have begun their winter unwrapping and though the usual grumblings about frozen fields abound, I can tell there is still §ka sense of uneasiness§r.",
"gui.unicopia.spellbook.chapter.ice.p12.title": "17th Trot '12", "gui.unicopia.spellbook.chapter.ice.p12.title": "17th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p12.1.body": "It's rather surprising how quickly the weather starts to change around here. Everything in Catermoore is so very well controlled, with the spells we use to manage temperature and the pegasi assisting with the weather, we sometimes forget what wild seasons can be like.", "gui.unicopia.spellbook.chapter.ice.p12.1.body": "It's rather surprising how quickly the weather starts to change around here. Everything in Catermoore is so very well controlled, with the spells we use to manage temperature and the pegasi assisting with the weather, we sometimes forget what wild seasons can be like.",
"gui.unicopia.spellbook.chapter.ice.p12.2.body": "But these Earth Ponies don't ave any of those luxuries. They have to deal with the weather as it comes.", "gui.unicopia.spellbook.chapter.ice.p12.2.body": "But these Earth Ponies don't ave any of those luxuries. They have to deal with the weather as it comes.",
@ -942,17 +960,17 @@
"gui.unicopia.spellbook.chapter.ice.p16.4.body": "I tell you what, I wish that were the case. What I actually found was much, much, worse, and even thinking of it makes my blood run cold anew.", "gui.unicopia.spellbook.chapter.ice.p16.4.body": "I tell you what, I wish that were the case. What I actually found was much, much, worse, and even thinking of it makes my blood run cold anew.",
"gui.unicopia.spellbook.chapter.ice.p17.title": "Frozen Lake IV", "gui.unicopia.spellbook.chapter.ice.p17.title": "Frozen Lake IV",
"gui.unicopia.spellbook.chapter.ice.p17.1.body": "When we were getting near the lake from earlier, I saw a large crowd growing along its banks. Ladders and emergency equipment were out and scattered on the shoreline and a loud uproar had erupted about what to do.", "gui.unicopia.spellbook.chapter.ice.p17.1.body": "When we were getting near the lake from earlier, I saw a large crowd growing along its banks. Ladders and emergency equipment were out and scattered on the shoreline and a loud uproar had erupted about what to do.",
"gui.unicopia.spellbook.chapter.ice.p17.2.body": "Getting closer, though, I realised what had happened soon enough--and I made a beeline for for the water-- The ice was broken and the lake was freezing cold.", "gui.unicopia.spellbook.chapter.ice.p17.2.body": "Getting closer, though, I realised what had happened soon enough--and I made a beeline for the water-- The ice was broken and the lake was freezing cold.",
"gui.unicopia.spellbook.chapter.ice.p17.3.body": "I jumped in anyway, pulling my saddlebags open with my magic, and grabbed the last of the gems i had with my and cast the unfinished spell it had inside.", "gui.unicopia.spellbook.chapter.ice.p17.3.body": "I jumped in anyway, pulling my saddlebags open with my magic, and grabbed the last of the gems i had with my and cast the unfinished spell it had inside.",
"gui.unicopia.spellbook.chapter.ice.p17.4.body": "The waters receded away from me as I galloped down the slop and across the drying lake bed and dove to catch the colts that had fallen in.", "gui.unicopia.spellbook.chapter.ice.p17.4.body": "The waters receded away from me as I galloped down the slop and across the drying lake bed and dove to catch the colts that had fallen in.",
"gui.unicopia.spellbook.chapter.ice.p18.title": "Frozen Lake V", "gui.unicopia.spellbook.chapter.ice.p18.title": "Frozen Lake V",
"gui.unicopia.spellbook.chapter.ice.p18.1.body": "They were freezing and wet, even as the spell's effects worked to pull the water away from their coats, we carred them up to the shore and got them covered in blankets with hot drinks in their hooves.", "gui.unicopia.spellbook.chapter.ice.p18.1.body": "They were freezing and wet, even as the spell's effects worked to pull the water away from their coats, we carried them up to the shore and got them covered in blankets with hot drinks in their hooves.",
"gui.unicopia.spellbook.chapter.ice.p18.2.body": "The townponies insisted on giving me a blanket of my own, even though I hadn't - couldn't have- gotten wet.", "gui.unicopia.spellbook.chapter.ice.p18.2.body": "The townponies insisted on giving me a blanket of my own, even though I hadn't - couldn't have- gotten wet.",
"gui.unicopia.spellbook.chapter.ice.p18.3.body": "It was only much later, when the shock began to wear of and I was feeling my head start to pound that I remembered to cancel the spell.", "gui.unicopia.spellbook.chapter.ice.p18.3.body": "It was only much later, when the shock began to wear of and I was feeling my head start to pound that I remembered to cancel the spell.",
"gui.unicopia.spellbook.chapter.ice.p18.4.body": "Thank the princesses we got there in time.", "gui.unicopia.spellbook.chapter.ice.p18.4.body": "Thank the princesses we got there in time.",
"gui.unicopia.spellbook.chapter.ice.p19.title": "18th Trot '12", "gui.unicopia.spellbook.chapter.ice.p19.title": "18th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p19.1.body": "No sign of the colts this morning, I assume they won't be coming near this lake for a long while. The water had frozen again in the night and looked peaceful.", "gui.unicopia.spellbook.chapter.ice.p19.1.body": "No sign of the colts this morning, I assume they won't be coming near this lake for a long while. The water had frozen again in the night and looked peaceful.",
"gui.unicopia.spellbook.chapter.ice.p19.2.body": "The unseasy feeling I had yesterday was gone today so I was able to relax on its banks with Luna. She didn't want to swim in this lake any more, and I don't blame her. I wouldn't either.", "gui.unicopia.spellbook.chapter.ice.p19.2.body": "The uneasy feeling I had yesterday was gone today so I was able to relax on its banks with Luna. She didn't want to swim in this lake any more, and I don't blame her. I wouldn't either.",
"gui.unicopia.spellbook.chapter.ice.p20.title": "Sandcastle", "gui.unicopia.spellbook.chapter.ice.p20.title": "Sandcastle",
"gui.unicopia.spellbook.chapter.ice.p20.1.body": "Luna started a sand castle, and whilst she was busy with that I decided to sketch out the details of my new spell.", "gui.unicopia.spellbook.chapter.ice.p20.1.body": "Luna started a sand castle, and whilst she was busy with that I decided to sketch out the details of my new spell.",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.1.body": "By combining the abilities of a shield spell with that of the frost gem, the results are... Admittedly strange.", "gui.unicopia.spellbook.chapter.ice.hydrophobic.1.body": "By combining the abilities of a shield spell with that of the frost gem, the results are... Admittedly strange.",
@ -966,17 +984,17 @@
"gui.unicopia.spellbook.chapter.air.p1.2.body": "So as a little treat, we've decided to go on a little trip to the Grand Marepid Falls to visit my friend, Commander Hurricane.", "gui.unicopia.spellbook.chapter.air.p1.2.body": "So as a little treat, we've decided to go on a little trip to the Grand Marepid Falls to visit my friend, Commander Hurricane.",
"gui.unicopia.spellbook.chapter.air.p1.3.body": "The Commander has also very graciously allowed me access to her library to continue my studies. I'm excited to see what combining unicorn and pegasus magics might bring.", "gui.unicopia.spellbook.chapter.air.p1.3.body": "The Commander has also very graciously allowed me access to her library to continue my studies. I'm excited to see what combining unicorn and pegasus magics might bring.",
"gui.unicopia.spellbook.chapter.air.p3.title": "2nd Hoof '12", "gui.unicopia.spellbook.chapter.air.p3.title": "2nd Hoof '12",
"gui.unicopia.spellbook.chapter.air.p3.1.body": "Apologies for the, um, unusual entry in the appendices for today. It appears some little gremlin managed to obscond with my journal.", "gui.unicopia.spellbook.chapter.air.p3.1.body": "Apologies for the, um, unusual entry in the appendices for today. It appears some little gremlin managed to abscond with my journal.",
"gui.unicopia.spellbook.chapter.air.p4.title": "Air Magic I", "gui.unicopia.spellbook.chapter.air.p4.title": "Air Magic I",
"gui.unicopia.spellbook.chapter.air.p4.1.body": "Pegasus Magic", "gui.unicopia.spellbook.chapter.air.p4.1.body": "Pegasus Magic",
"gui.unicopia.spellbook.chapter.air.p4.2.body": "Air magic is to pegasi like fire is to unicorns. They're both equally hard to control but where fire is primarily focused around force, destruction, or protection, air is all about flexibility and free motion.", "gui.unicopia.spellbook.chapter.air.p4.2.body": "Air magic is to pegasi like fire is to unicorns. They're both equally hard to control but where fire is primarily focused around force, destruction, or protection, air is all about flexibility and free motion.",
"gui.unicopia.spellbook.chapter.air.p4.3.body": "Command Hurricane has very kindly given me some tips on how to identify this trait in everyday objects.", "gui.unicopia.spellbook.chapter.air.p4.3.body": "Command Hurricane has very kindly given me some tips on how to identify this trait in everyday objects.",
"gui.unicopia.spellbook.chapter.air.p4.4.body": "Anything relating to flight, or that originated from creatures that fly, or that comes from up above can be considered a source of the air trait.", "gui.unicopia.spellbook.chapter.air.p4.4.body": "Anything relating to flight, or that originated from creatures that fly, or that comes from up above can be considered a source of the air trait.",
"gui.unicopia.spellbook.chapter.air.p4.5.body": "Eg. Feathers.", "gui.unicopia.spellbook.chapter.air.p4.5.body": "Eg. Feathers.",
"gui.unicopia.spellbook.chapter.air.catapult.1.body": "This is a straightforward application of a unicorn's telekineses. The catapult gem allows a caster to grab any block or creature and fling them into the air.", "gui.unicopia.spellbook.chapter.air.catapult.1.body": "This is a straightforward application of a unicorn's telekinesis. The catapult gem allows a caster to grab any block or creature and fling them into the air.",
"gui.unicopia.spellbook.chapter.air.catapult.2.body": "Use it again on something already thrown to push it away from you.", "gui.unicopia.spellbook.chapter.air.catapult.2.body": "Use it again on something already thrown to push it away from you.",
"gui.unicopia.spellbook.chapter.air.catapult.modifier.1": "* One can add apply more force by adding the strength trait", "gui.unicopia.spellbook.chapter.air.catapult.modifier.1": "* One can add apply more force by adding the strength trait",
"gui.unicopia.spellbook.chapter.air.bubble.1.body": "A defensive and utility spell. Bubble will trap the target in a giant soap bubble, rendering them defensless.", "gui.unicopia.spellbook.chapter.air.bubble.1.body": "A defensive and utility spell. Bubble will trap the target in a giant soap bubble, rendering them defenseless.",
"gui.unicopia.spellbook.chapter.air.bubble.2.body": "Use it again will pop the bubble.", "gui.unicopia.spellbook.chapter.air.bubble.2.body": "Use it again will pop the bubble.",
"gui.unicopia.spellbook.chapter.air.p7.title": "8th Hoof '12", "gui.unicopia.spellbook.chapter.air.p7.title": "8th Hoof '12",
"gui.unicopia.spellbook.chapter.air.p7.1.body": "I thought I would take a short moment to write down an entry to record my findings whilst Luna and The Commander are out.", "gui.unicopia.spellbook.chapter.air.p7.1.body": "I thought I would take a short moment to write down an entry to record my findings whilst Luna and The Commander are out.",
@ -992,13 +1010,13 @@
"gui.unicopia.spellbook.chapter.air.feather_fall.1.body": "Expanding on the defensive capabilities of the protection gem, I've attempted to extend its advantages to party members.", "gui.unicopia.spellbook.chapter.air.feather_fall.1.body": "Expanding on the defensive capabilities of the protection gem, I've attempted to extend its advantages to party members.",
"gui.unicopia.spellbook.chapter.air.feather_fall.2.body": "This one is unusual because of its complexity, but in theory it should allow one to slow their own and friends' descent.", "gui.unicopia.spellbook.chapter.air.feather_fall.2.body": "This one is unusual because of its complexity, but in theory it should allow one to slow their own and friends' descent.",
"gui.unicopia.spellbook.chapter.air.p12.title": "10th Hoof '12", "gui.unicopia.spellbook.chapter.air.p12.title": "10th Hoof '12",
"gui.unicopia.spellbook.chapter.air.p12.1.body": "Went to dinner with Commander Huricane and Luna. We got to talking about architecture and Hurricane mentioned the Taz Marehall.", "gui.unicopia.spellbook.chapter.air.p12.1.body": "Went to dinner with Commander Hurricane and Luna. We got to talking about architecture and Hurricane mentioned the Taz Marehall.",
"gui.unicopia.spellbook.chapter.air.p12.2.body": "Luna thought it was a rather funny name of a castle. I had to remind her that not all cultures are the same.", "gui.unicopia.spellbook.chapter.air.p12.2.body": "Luna thought it was a rather funny name of a castle. I had to remind her that not all cultures are the same.",
"gui.unicopia.spellbook.chapter.air.p13.title": "21st Hoof '12", "gui.unicopia.spellbook.chapter.air.p13.title": "21st Hoof '12",
"gui.unicopia.spellbook.chapter.air.p13.1.body": "I'm writing this on the eve of my return to §kTrotholm§r. Though my time in Cloudopolis has been elightening, I look forward to a return to the familiar surroundings and a proper rest in my own solid bed.", "gui.unicopia.spellbook.chapter.air.p13.1.body": "I'm writing this on the eve of my return to §kTrotholm§r. Though my time in Cloudopolis has been enlightening, I look forward to a return to the familiar surroundings and a proper rest in my own solid bed.",
"gui.unicopia.spellbook.chapter.air.p13.2.body": "I cannot say the same for Luna, though. She is currently sitting on my bed beside me pouting over every little thing she sees me put into my saddlebag.", "gui.unicopia.spellbook.chapter.air.p13.2.body": "I cannot say the same for Luna, though. She is currently sitting on my bed beside me pouting over every little thing she sees me put into my saddlebag.",
"gui.unicopia.spellbook.chapter.air.p14.title": "Returning Home", "gui.unicopia.spellbook.chapter.air.p14.title": "Returning Home",
"gui.unicopia.spellbook.chapter.air.p14.1.body": "She keeps insisting that we stay a little longer §mto hang out with that pegasus colt I saw her with the other day, no doubt", "gui.unicopia.spellbook.chapter.air.p14.1.body": "She keeps insisting that we stay a little longer §mto hang out with that pegasus colt I saw her with the other day, no doubt.",
"gui.unicopia.spellbook.chapter.air.p15.title": "22nd Hoof '12", "gui.unicopia.spellbook.chapter.air.p15.title": "22nd Hoof '12",
"gui.unicopia.spellbook.chapter.air.p15.1.body": "As we're flying above the mountain tops, I can't help but feel in awe the beauty that §kMother Faust§r has given us.", "gui.unicopia.spellbook.chapter.air.p15.1.body": "As we're flying above the mountain tops, I can't help but feel in awe the beauty that §kMother Faust§r has given us.",
"gui.unicopia.spellbook.chapter.air.p15.2.body": "I had to spend the whole time keeping Luna from falling out, and of course answering questions about all the different kinds of clouds. Thankfully, the balloon operator was there to help with the subtleties.", "gui.unicopia.spellbook.chapter.air.p15.2.body": "I had to spend the whole time keeping Luna from falling out, and of course answering questions about all the different kinds of clouds. Thankfully, the balloon operator was there to help with the subtleties.",
@ -1024,14 +1042,14 @@
"gui.unicopia.spellbook.chapter.dark_magic.p6.3.body": "Apparently it was over some dispute with Celly, I don't really remember, but it culminated in Luna sneaking into the study whilst I was out to get some bread.", "gui.unicopia.spellbook.chapter.dark_magic.p6.3.body": "Apparently it was over some dispute with Celly, I don't really remember, but it culminated in Luna sneaking into the study whilst I was out to get some bread.",
"gui.unicopia.spellbook.chapter.dark_magic.p7.title": "Arcane Attraction II", "gui.unicopia.spellbook.chapter.dark_magic.p7.title": "Arcane Attraction II",
"gui.unicopia.spellbook.chapter.dark_magic.p7.1.body": "This isn't really about that, though. She's been scolded and sent back to her room, however as I was cleaning up the mess she'd made I noticed something in the piles of gems.", "gui.unicopia.spellbook.chapter.dark_magic.p7.1.body": "This isn't really about that, though. She's been scolded and sent back to her room, however as I was cleaning up the mess she'd made I noticed something in the piles of gems.",
"gui.unicopia.spellbook.chapter.dark_magic.p7.2.body": "It's hard to describe, really. This is still distincly an attraction gem, but it's different.", "gui.unicopia.spellbook.chapter.dark_magic.p7.2.body": "It's hard to describe, really. This is still distinctly an attraction gem, but it's different.",
"gui.unicopia.spellbook.chapter.dark_magic.p7.3.body": "It has traits I hadn't considered before, and the way it behaves... ", "gui.unicopia.spellbook.chapter.dark_magic.p7.3.body": "It has traits I hadn't considered before, and the way it behaves...",
"gui.unicopia.spellbook.chapter.dark_magic.p8.title": "Arcane Attraction II Cont.", "gui.unicopia.spellbook.chapter.dark_magic.p8.title": "Arcane Attraction II Cont.",
"gui.unicopia.spellbook.chapter.dark_magic.p8.1.body": "Well I'll leave that up to tomorrow. I'm still tired from everything that's happened this week.", "gui.unicopia.spellbook.chapter.dark_magic.p8.1.body": "Well I'll leave that up to tomorrow. I'm still tired from everything that's happened this week.",
"gui.unicopia.spellbook.chapter.dark_magic.p8.2.body": ">0 generosity --> ??", "gui.unicopia.spellbook.chapter.dark_magic.p8.2.body": ">0 generosity --> ???",
"gui.unicopia.spellbook.chapter.dark_magic.p8.3.body": ">20 order trait --> ???", "gui.unicopia.spellbook.chapter.dark_magic.p8.3.body": ">20 order trait --> ???",
"gui.unicopia.spellbook.chapter.dark_magic.p9.title": "20th Slep '12", "gui.unicopia.spellbook.chapter.dark_magic.p9.title": "20th Slep '12",
"gui.unicopia.spellbook.chapter.dark_magic.p9.1.body": "As per their agreement, the council have sent certain...supplimental materials to aid in the new direction my research is taking. I was a little shocked at first.", "gui.unicopia.spellbook.chapter.dark_magic.p9.1.body": "As per their agreement, the council have sent certain... supplemental materials to aid in the new direction my research is taking. I was a little shocked at first.",
"gui.unicopia.spellbook.chapter.dark_magic.p9.2.body": "This... thing... Whatever it is. Was, rather.", "gui.unicopia.spellbook.chapter.dark_magic.p9.2.body": "This... thing... Whatever it is. Was, rather.",
"gui.unicopia.spellbook.chapter.dark_magic.p9.3.body": "Is this really what we're fighting in the west?", "gui.unicopia.spellbook.chapter.dark_magic.p9.3.body": "Is this really what we're fighting in the west?",
"gui.unicopia.spellbook.chapter.dark_magic.p10.title": "21st Slep '12", "gui.unicopia.spellbook.chapter.dark_magic.p10.title": "21st Slep '12",
@ -1045,7 +1063,7 @@
"gui.unicopia.spellbook.chapter.dark_magic.p11.4.body": "The magic they use is unusual. Not unusual, like what I've been studying. It's unnatural. Wild.", "gui.unicopia.spellbook.chapter.dark_magic.p11.4.body": "The magic they use is unusual. Not unusual, like what I've been studying. It's unnatural. Wild.",
"gui.unicopia.spellbook.chapter.dark_magic.p11.5.body": "There is definitely something I might be able to harness here, but I shudder... Should I?", "gui.unicopia.spellbook.chapter.dark_magic.p11.5.body": "There is definitely something I might be able to harness here, but I shudder... Should I?",
"gui.unicopia.spellbook.chapter.dark_magic.p11.6.body": "I fear that this may be a line that shouldn't be crossed.", "gui.unicopia.spellbook.chapter.dark_magic.p11.6.body": "I fear that this may be a line that shouldn't be crossed.",
"gui.unicopia.spellbook.chapter.dark_magic.transformation.1.body": "I've begun by simply harnessing their ability. It's unfocused and hard to control. I can rarely predict what is going to happen, but this gem has very clear transmodrification properties.", "gui.unicopia.spellbook.chapter.dark_magic.transformation.1.body": "I've begun by simply harnessing their ability. It's unfocused and hard to control. I can rarely predict what is going to happen, but this gem has very clear transmogrification properties.",
"gui.unicopia.spellbook.chapter.dark_magic.transformation.2.body": "Throwing this at any creature has the chance to transform it into any other creature.", "gui.unicopia.spellbook.chapter.dark_magic.transformation.2.body": "Throwing this at any creature has the chance to transform it into any other creature.",
"gui.unicopia.spellbook.chapter.dark_magic.reveal.1.body": "Dispell Illusion is the first line of defense against transformation/illusion spells.", "gui.unicopia.spellbook.chapter.dark_magic.reveal.1.body": "Dispell Illusion is the first line of defense against transformation/illusion spells.",
"gui.unicopia.spellbook.chapter.dark_magic.reveal.2.body": "When cast it will force any nearby disguised changelings in its range to reveal their true form.", "gui.unicopia.spellbook.chapter.dark_magic.reveal.2.body": "When cast it will force any nearby disguised changelings in its range to reveal their true form.",
@ -1074,7 +1092,7 @@
"gui.unicopia.spellbook.chapter.dark_magic.p21.1.body": "The locks have been installed, and with the addition of some extra wardings, I'm feeling a little more at ease.", "gui.unicopia.spellbook.chapter.dark_magic.p21.1.body": "The locks have been installed, and with the addition of some extra wardings, I'm feeling a little more at ease.",
"gui.unicopia.spellbook.chapter.dark_magic.p21.2.body": "The motions at night have all but stopped, though I feel like I can almost hear it at times...", "gui.unicopia.spellbook.chapter.dark_magic.p21.2.body": "The motions at night have all but stopped, though I feel like I can almost hear it at times...",
"gui.unicopia.spellbook.chapter.dark_magic.p22.title": "4th Cropt-", "gui.unicopia.spellbook.chapter.dark_magic.p22.title": "4th Cropt-",
"gui.unicopia.spellbook.chapter.dark_magic.mimic.1.body": "I've been able to tap into some of this strange creature's abilities. There's still a lot to figure out here, but for now I've merely distilled its essense into a gem.", "gui.unicopia.spellbook.chapter.dark_magic.mimic.1.body": "I've been able to tap into some of this strange creature's abilities. There's still a lot to figure out here, but for now I've merely distilled its essence into a gem.",
"gui.unicopia.spellbook.chapter.dark_magic.mimic.modifier.1": "* Add the focus trait to increase the effect's duration", "gui.unicopia.spellbook.chapter.dark_magic.mimic.modifier.1": "* Add the focus trait to increase the effect's duration",
"gui.unicopia.spellbook.chapter.dark_magic.p24.1.body": "There's been a wave of darkness that has come over the town. Nothing's been the same since that gods-forsaken creature arrived.", "gui.unicopia.spellbook.chapter.dark_magic.p24.1.body": "There's been a wave of darkness that has come over the town. Nothing's been the same since that gods-forsaken creature arrived.",
"gui.unicopia.spellbook.chapter.dark_magic.p24.2.body": "Ponies in town have begun remarking on lack of sleep, and it's showing. Just today I saw a poor stallion walking around in a daze. Bags under his eyes, barely any colour in his cheeks.", "gui.unicopia.spellbook.chapter.dark_magic.p24.2.body": "Ponies in town have begun remarking on lack of sleep, and it's showing. Just today I saw a poor stallion walking around in a daze. Bags under his eyes, barely any colour in his cheeks.",
@ -1135,11 +1153,11 @@
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.2.body": "The Pegasus Amulet is claimed to grant the wearer temporary flight, like a pegasus.", "gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.2.body": "The Pegasus Amulet is claimed to grant the wearer temporary flight, like a pegasus.",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.title": "21st Trot '12", "gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.title": "21st Trot '12",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.3.body": "It was intended as an aide for early unicorn ambassadors to Cloud Heights, but was lost after negotiations broke down.", "gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.3.body": "It was intended as an aide for early unicorn ambassadors to Cloud Heights, but was lost after negotiations broke down.",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.1.body": "A precursor to magic staffs, the meadwobrook's staff is an upright support structure commonly used by warlocks during long incantation sessions.", "gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.1.body": "A precursor to magic staffs, the meadowbrook's staff is an upright support structure commonly used by warlocks during long incantation sessions.",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.2.body": "It features a twisting and mottled shape with a dense and sturdy core capable of supporting the weight of an average-sized, adult male.", "gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.2.body": "It features a twisting and mottled shape with a dense and sturdy core capable of supporting the weight of an average-sized, adult male.",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.title": "22nd Trot '12", "gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.title": "22nd Trot '12",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.3.body": "Due to its dense structure and flamability, this object also serves a secondary purpose as an offensive weapon and fuel source should the situation demand.", "gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.3.body": "Due to its dense structure and flammability, this object also serves a secondary purpose as an offensive weapon and fuel source should the situation demand.",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.4.body": "To use correctly in combat, one must begin by gripping the staff by the narrow end in both hands, followed by a swift swing from above one's head whilst yelling 'Fus Roh DAH!'", "gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.4.body": "To use correctly in combat, one must begin by gripping the staff by the narrow end in both hooves, followed by a swift swing from above one's head whilst yelling 'Fus Roh DAH!'",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.1.body": "Magical aides for non-magical users. Magic staffs work in a similar way to a unicorns horn in that they can be used to channel and harness the innate magic stored within gems.", "gui.unicopia.spellbook.chapter.artefacts.magic_staff.1.body": "Magical aides for non-magical users. Magic staffs work in a similar way to a unicorns horn in that they can be used to channel and harness the innate magic stored within gems.",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.title": "22nd Trot '12", "gui.unicopia.spellbook.chapter.artefacts.magic_staff.title": "22nd Trot '12",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.2.body": "Not all spells work in the same way, but for those that do, a good staff is an essential tool for any beginner magi.", "gui.unicopia.spellbook.chapter.artefacts.magic_staff.2.body": "Not all spells work in the same way, but for those that do, a good staff is an essential tool for any beginner magi.",
@ -1152,7 +1170,7 @@
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.2.title": "Grogar's Bell II", "gui.unicopia.spellbook.chapter.artefacts.grogars_bell.2.title": "Grogar's Bell II",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.5.body": "Legend says that after its first bearer, King Grogar, was driven to madness, the bell was stowed far away.", "gui.unicopia.spellbook.chapter.artefacts.grogars_bell.5.body": "Legend says that after its first bearer, King Grogar, was driven to madness, the bell was stowed far away.",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.6.body": "beyond most ponies' grasp, guarded inside an ancient city by an unbeatable beast.", "gui.unicopia.spellbook.chapter.artefacts.grogars_bell.6.body": "beyond most ponies' grasp, guarded inside an ancient city by an unbeatable beast.",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.1.body": "Like the crystal heart, little is known of this artefact and thus nothing, not even its existance can be confirmed.", "gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.1.body": "Like the crystal heart, little is known of this artefact and thus nothing, not even its existence can be confirmed.",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.title": "23nd Trot '12", "gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.title": "23nd Trot '12",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.2.body": "The alicorn amulet is a powerful force of dark magic created created by an unknown mage as their attempt to create the perfect being.", "gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.2.body": "The alicorn amulet is a powerful force of dark magic created created by an unknown mage as their attempt to create the perfect being.",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.3.body": "It combines the traits of all races into one powerful form, but it hard to control and addictive in nature. Anyone who uses it quickly becomes reliant on it and few attempt to remove it survive the ordeal.", "gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.3.body": "It combines the traits of all races into one powerful form, but it hard to control and addictive in nature. Anyone who uses it quickly becomes reliant on it and few attempt to remove it survive the ordeal.",
@ -1443,6 +1461,8 @@
"death.attack.unicopia.horseshoe.self": "%1$s dinged himself", "death.attack.unicopia.horseshoe.self": "%1$s dinged himself",
"death.attack.unicopia.horseshoe.item": "%1$s was dinged by %2$s using %3$s", "death.attack.unicopia.horseshoe.item": "%1$s was dinged by %2$s using %3$s",
"death.attack.unicopia.horseshoe.player": "%1$s was dinged by %2$s", "death.attack.unicopia.horseshoe.player": "%1$s was dinged by %2$s",
"death.attack.unicopia.spikes": "%1$s was pricked to death",
"death.attack.unicopia.spikes.player": "%1$s fell into some spikes whilst trying to escape %2$s",
"death.fell.accident.ladder.pegasus": "%1$s forgot they could fly and fell off a ladder", "death.fell.accident.ladder.pegasus": "%1$s forgot they could fly and fell off a ladder",
"death.fell.accident.vines.pegasus": "%1$s forgot they could fly and fell off some vines", "death.fell.accident.vines.pegasus": "%1$s forgot they could fly and fell off some vines",

File diff suppressed because it is too large Load diff

View file

@ -44,8 +44,14 @@
"item.unicopia.palm_chest_boat": "Пальмовая лодка с сундуком", "item.unicopia.palm_chest_boat": "Пальмовая лодка с сундуком",
"item.unicopia.spellbook": "Книга заклинаний", "item.unicopia.spellbook": "Книга заклинаний",
"item.unicopia.spectral_clock": "Спектральные часы",
"emi.category.unicopia.spellbook": "Книга заклинаний", "emi.category.unicopia.spellbook": "Книга заклинаний",
"emi.category.unicopia.cloud_shaping": "Формоизменение", "emi.category.unicopia.cloud_shaping": "Формоизменение",
"emi.category.unicopia.growing": "Выращивание",
"emi.category.unicopia.altar": "Тёмный ритуал",
"recipe.unicopia.altar.instruction": "Бросить предмет в огонь",
"recipe.unicopia.growing.instruction": "Сфокусировать магию земного пони",
"item.unicopia.alicorn_badge": "Эмблема аликорна", "item.unicopia.alicorn_badge": "Эмблема аликорна",
"item.unicopia.unicorn_badge": "Эмблема единорога", "item.unicopia.unicorn_badge": "Эмблема единорога",
@ -73,6 +79,7 @@
"item.unicopia.love_bucket": "Ведро любви", "item.unicopia.love_bucket": "Ведро любви",
"item.unicopia.love_mug": "Кружка любви", "item.unicopia.love_mug": "Кружка любви",
"item.unicopia.plunder_vine": "Чёрная лоза",
"item.unicopia.empty_jar": "Стеклянная банка", "item.unicopia.empty_jar": "Стеклянная банка",
"item.unicopia.filled_jar": "%s в банке", "item.unicopia.filled_jar": "%s в банке",
"item.unicopia.rain_cloud_jar": "Дождь в банке", "item.unicopia.rain_cloud_jar": "Дождь в банке",
@ -87,10 +94,10 @@
"item.unicopia.crystal_heart": "Кристальное сердце", "item.unicopia.crystal_heart": "Кристальное сердце",
"item.unicopia.crystal_shard": "Осколок кристалла", "item.unicopia.crystal_shard": "Осколок кристалла",
"item.unicopia.dragon_breath_scroll": "Свиток дыхания дракона", "item.unicopia.dragon_breath_scroll": "Свиток дыхания дракона",
"item.unicopia.gemstone": "Драгоценный камень", "item.unicopia.gemstone": "Самоцвет",
"item.unicopia.gemstone.enchanted": "Драгоценный камень \"%s\"", "item.unicopia.gemstone.enchanted": "Самоцвет \"%s\"",
"item.unicopia.gemstone.obfuscated": "Загадочный драгоценный камень", "item.unicopia.gemstone.obfuscated": "Загадочный самоцвет",
"item.unicopia.botched_gem": "Неудачный драгоценный камень", "item.unicopia.botched_gem": "Неудачный самоцвет",
"item.unicopia.pegasus_feather": "Перо пегаса", "item.unicopia.pegasus_feather": "Перо пегаса",
"item.unicopia.gryphon_feather": "Перо грифона", "item.unicopia.gryphon_feather": "Перо грифона",
@ -218,6 +225,7 @@
"block.unicopia.rocks": "Камни", "block.unicopia.rocks": "Камни",
"block.unicopia.plunder_vine": "Чёрная лоза", "block.unicopia.plunder_vine": "Чёрная лоза",
"block.unicopia.plunder_vine_bud": "Бутон чёрной лозы", "block.unicopia.plunder_vine_bud": "Бутон чёрной лозы",
"block.unicopia.spectral_fire": "Спектральный огонь",
"block.unicopia.bananas": "Бананы", "block.unicopia.bananas": "Бананы",
"block.unicopia.zapling": "Саженец зап-яблони", "block.unicopia.zapling": "Саженец зап-яблони",
"block.unicopia.zap_log": "Бревно зап-яблони", "block.unicopia.zap_log": "Бревно зап-яблони",
@ -352,58 +360,137 @@
"effect.unicopia.butter_fingers": "Растяпа", "effect.unicopia.butter_fingers": "Растяпа",
"effect.unicopia.change_race_earth": "Метаморфозы земного пони", "effect.unicopia.change_race_earth": "Метаморфозы земного пони",
"effect.unicopia.change_race_unicorn": "Метаморфозы единорога",
"effect.unicopia.change_race_pegasus": "Метаморфозы пегаса",
"effect.unicopia.change_race_changeling": "Метаморфозы чейнджлинга",
"effect.unicopia.change_race_bat": "Метаморфозы бэтпони",
"effect.unicopia.change_race_kirin": "Метаморфозы кирина",
"effect.unicopia.change_race_hippogriff": "Метаморфозы гиппогрифа",
"effect.unicopia.morph_race_earth": "Превращение в земного пони",
"effect.unicopia.morph_race_unicorn": "Превращение в единорога",
"effect.unicopia.morph_race_pegasus": "Превращение в пегаса",
"effect.unicopia.morph_race_changeling": "Превращение в чейнджлинга",
"effect.unicopia.morph_race_bat": "Превращение в бэтпони",
"effect.unicopia.morph_race_kirin": "Превращение в кирина",
"effect.unicopia.morph_race_hippogriff": "Превращение в гиппогрифа",
"item.minecraft.potion.effect.unicopia.tribe_swap_earth": "Зелье метаморфоз земного пони", "item.minecraft.potion.effect.unicopia.tribe_swap_earth": "Зелье метаморфоз земного пони",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_earth": "Взрывное зелье метаморфоз земного пони", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_earth": "Взрывное зелье метаморфоз земного пони",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_earth": "Туманное зелье метаморфоз земного пони", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_earth": "Туманное зелье метаморфоз земного пони",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_earth": "Стрела метаморфоз земного пони", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_earth": "Стрела метаморфоз земного пони",
"effect.unicopia.change_race_unicorn": "Метаморфозы единорога",
"item.minecraft.potion.effect.unicopia.tribe_swap_unicorn": "Зелье метаморфоз единорога", "item.minecraft.potion.effect.unicopia.tribe_swap_unicorn": "Зелье метаморфоз единорога",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_unicorn": "Взрывное зелье метаморфоз единорога", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_unicorn": "Взрывное зелье метаморфоз единорога",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_unicorn": "Туманное зелье метаморфоз единорога", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_unicorn": "Туманное зелье метаморфоз единорога",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_unicorn": "Стрела метаморфоз единорога", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_unicorn": "Стрела метаморфоз единорога",
"effect.unicopia.change_race_pegasus": "Метаморфозы пегаса",
"item.minecraft.potion.effect.unicopia.tribe_swap_pegasus": "Зелье метаморфоз пегаса", "item.minecraft.potion.effect.unicopia.tribe_swap_pegasus": "Зелье метаморфоз пегаса",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_pegasus": "Взрывное зелье метаморфоз пегаса", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_pegasus": "Взрывное зелье метаморфоз пегаса",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_pegasus": "Туманное зелье метаморфоз пегаса", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_pegasus": "Туманное зелье метаморфоз пегаса",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_pegasus": "Стрела метаморфоз пегаса", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_pegasus": "Стрела метаморфоз пегаса",
"effect.unicopia.change_race_changeling": "Метаморфозы чейнджлинга",
"item.minecraft.potion.effect.unicopia.tribe_swap_changeling": "Зелье метаморфоз чейнджлинга", "item.minecraft.potion.effect.unicopia.tribe_swap_changeling": "Зелье метаморфоз чейнджлинга",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_changeling": "Взрывное зелье метаморфоз чейнджлинга", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_changeling": "Взрывное зелье метаморфоз чейнджлинга",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_changeling": "Туманное зелье метаморфоз чейнджлинга", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_changeling": "Туманное зелье метаморфоз чейнджлинга",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_changeling": "Стрела метаморфоз чейнджлинга", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_changeling": "Стрела метаморфоз чейнджлинга",
"effect.unicopia.change_race_bat": "Метаморфозы бэтпони",
"item.minecraft.potion.effect.unicopia.tribe_swap_bat": "Зелье метаморфоз бэтпони", "item.minecraft.potion.effect.unicopia.tribe_swap_bat": "Зелье метаморфоз бэтпони",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_bat": "Взрывное зелье метаморфоз бэтпони", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_bat": "Взрывное зелье метаморфоз бэтпони",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_bat": "Туманное зелье метаморфоз бэтпони", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_bat": "Туманное зелье метаморфоз бэтпони",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_bat": "Стрела метаморфоз бэтпони", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_bat": "Стрела метаморфоз бэтпони",
"effect.unicopia.change_race_kirin": "Метаморфозы кирина",
"item.minecraft.potion.effect.unicopia.tribe_swap_kirin": "Зелье метаморфоз кирина", "item.minecraft.potion.effect.unicopia.tribe_swap_kirin": "Зелье метаморфоз кирина",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_kirin": "Взрывное зелье метаморфоз кирина", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_kirin": "Взрывное зелье метаморфоз кирина",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_kirin": "Туманное зелье метаморфоз кирина", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_kirin": "Туманное зелье метаморфоз кирина",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_kirin": "Стрела метаморфоз кирина", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_kirin": "Стрела метаморфоз кирина",
"effect.unicopia.change_race_hippogriff": "Метаморфозы гиппогрифа",
"item.minecraft.potion.effect.unicopia.tribe_swap_hippogriff": "Зелье метаморфоз гиппогрифа", "item.minecraft.potion.effect.unicopia.tribe_swap_hippogriff": "Зелье метаморфоз гиппогрифа",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_hippogriff": "Взрывное зелье метаморфоз гиппогрифа", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_hippogriff": "Взрывное зелье метаморфоз гиппогрифа",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_hippogriff": "Туманное зелье метаморфоз гиппогрифа", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_hippogriff": "Туманное зелье метаморфоз гиппогрифа",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_hippogriff": "Стрела метаморфоз гиппогрифа", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_hippogriff": "Стрела метаморфоз гиппогрифа",
"item.minecraft.potion.effect.unicopia.short_morph_earth": "Зелье быстрого превращения в земного пони",
"item.minecraft.splash_potion.effect.unicopia.short_morph_earth": "Взрывное зелье быстрого превращения в земного пони",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_earth": "Туманное зелье быстрого превращения в земного пони",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_earth": "Стрела быстрого превращения в земного пони",
"item.minecraft.potion.effect.unicopia.short_morph_unicorn": "Зелье быстрого превращения в единорога",
"item.minecraft.splash_potion.effect.unicopia.short_morph_unicorn": "Взрывное зелье быстрого превращения в единорога",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_unicorn": "Туманное зелье быстрого превращения в единорога",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_unicorn": "Стрела быстрого превращения в единорога",
"item.minecraft.potion.effect.unicopia.short_morph_pegasus": "Зелье быстрого превращения в пегаса",
"item.minecraft.splash_potion.effect.unicopia.short_morph_pegasus": "Взрывное зелье быстрого превращения в пегаса",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_pegasus": "Туманное зелье быстрого превращения в пегаса",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_pegasus": "Стрела быстрого превращения в пегаса",
"item.minecraft.potion.effect.unicopia.short_morph_changeling": "Зелье быстрого превращения в чейнджлинга",
"item.minecraft.splash_potion.effect.unicopia.short_morph_changeling": "Взрывное зелье быстрого превращения в чейнджлинга",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_changeling": "Туманное зелье быстрого превращения в чейнджлинга",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_changeling": "Стрела быстрого превращения в чейнджлинга",
"item.minecraft.potion.effect.unicopia.short_morph_bat": "Зелье быстрого превращения в бэтпони",
"item.minecraft.splash_potion.effect.unicopia.short_morph_bat": "Взрывное зелье быстрого превращения в бэтпони",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_bat": "Туманное зелье быстрого превращения в бэтпони",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_bat": "Стрела быстрого превращения в бэтпони",
"item.minecraft.potion.effect.unicopia.short_morph_kirin": "Зелье быстрого превращения в кирина",
"item.minecraft.splash_potion.effect.unicopia.short_morph_kirin": "Взрывное зелье быстрого превращения в кирина",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_kirin": "Туманное зелье быстрого превращения в кирина",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_kirin": "Стрела быстрого превращения в кирина",
"item.minecraft.potion.effect.unicopia.short_morph_hippogriff": "Зелье быстрого превращения в гиппогрифа",
"item.minecraft.splash_potion.effect.unicopia.short_morph_hippogriff": "Взрывное зелье быстрого превращения в гиппогрифа",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_hippogriff": "Туманное зелье быстрого превращения в гиппогрифа",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_hippogriff": "Стрела быстрого превращения в гиппогрифа",
"item.minecraft.potion.effect.unicopia.long_morph_earth": "Зелье долгого превращения в земного пони",
"item.minecraft.splash_potion.effect.unicopia.long_morph_earth": "Взрывное зелье долгого превращения в земного пони",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_earth": "Туманное зелье долгого превращения в земного пони",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_earth": "Стрела долгого превращения в земного пони",
"item.minecraft.potion.effect.unicopia.long_morph_unicorn": "Зелье долгого превращения в единорога",
"item.minecraft.splash_potion.effect.unicopia.long_morph_unicorn": "Взрывное зелье долгого превращения в единорога",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_unicorn": "Туманное зелье долгого превращения в единорога",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_unicorn": "Стрела долгого превращения в единорога",
"item.minecraft.potion.effect.unicopia.long_morph_pegasus": "Зелье долгого превращения в пегаса",
"item.minecraft.splash_potion.effect.unicopia.long_morph_pegasus": "Взрывное зелье долгого превращения в пегаса",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_pegasus": "Туманное зелье долгого превращения в пегаса",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_pegasus": "Стрела долгого превращения в пегаса",
"item.minecraft.potion.effect.unicopia.long_morph_changeling": "Зелье долгого превращения в чейнджлинга",
"item.minecraft.splash_potion.effect.unicopia.long_morph_changeling": "Взрывное зелье долгого превращения в чейнджлинга",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_changeling": "Туманное зелье долгого превращения в чейнджлинга",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_changeling": "Стрела долгого превращения в чейнджлинга",
"item.minecraft.potion.effect.unicopia.long_morph_bat": "Зелье долгого превращения в бэтпони",
"item.minecraft.splash_potion.effect.unicopia.long_morph_bat": "Взрывное зелье долгого превращения в бэтпони",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_bat": "Туманное зелье долгого превращения в бэтпони",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_bat": "Стрела долгого превращения в бэтпони",
"item.minecraft.potion.effect.unicopia.long_morph_kirin": "Зелье долгого превращения в кирина",
"item.minecraft.splash_potion.effect.unicopia.long_morph_kirin": "Взрывное зелье долгого превращения в кирина",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_kirin": "Туманное зелье долгого превращения в кирина",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_kirin": "Стрела долгого превращения в кирина",
"item.minecraft.potion.effect.unicopia.long_morph_hippogriff": "Зелье долгого превращения в гиппогрифа",
"item.minecraft.splash_potion.effect.unicopia.long_morph_hippogriff": "Взрывное зелье долгого превращения в гиппогрифа",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_hippogriff": "Туманное зелье долгого превращения в гиппогрифа",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_hippogriff": "Стрела долгого превращения в гиппогрифа",
"potion.withChance": "Шанс 1 к %s получить %s", "potion.withChance": "Шанс 1 к %s получить %s",
"potion.potency.6": "VII", "potion.potency.6": "VII",
"spell.unicopia.frost": "Заморозка", "spell.unicopia.frost": "Заморозка",
"spell.unicopia.frost.lore": "Холодный на ощупь, этот драгоценный камень заморозит всё, на что он будет использован", "spell.unicopia.frost.lore": "Холодный на ощупь, этот самоцвет заморозит всё, на что он будет использован",
"spell.unicopia.hydrophobic": "Отталкивание воды", "spell.unicopia.hydrophobic": "Отталкивание воды",
"spell.unicopia.hydrophobic.lore": "Создает защитный пузырь вокруг пользователя, который препятствует проникновению воды", "spell.unicopia.hydrophobic.lore": "Создает защитный пузырь вокруг пользователя, который препятствует проникновению воды",
"spell.unicopia.chilling_breath": "Леденящее дыхания", "spell.unicopia.chilling_breath": "Леденящее дыхания",
"spell.unicopia.chilling_breath.lore": "Изменяет способность некоторых объектов различать горячее и холодное", "spell.unicopia.chilling_breath.lore": "Изменяет способность некоторых объектов различать горячее и холодное",
"spell.unicopia.scorch": "Ожог", "spell.unicopia.scorch": "Ожог",
"spell.unicopia.scorch.lore": "Теплый на ощупь, этот драгоценный камень сжигает органические вещества", "spell.unicopia.scorch.lore": "Теплый на ощупь, этот самоцвет сжигает органические вещества",
"spell.unicopia.flame": "Пламя", "spell.unicopia.flame": "Пламя",
"spell.unicopia.flame.lore": "Этот камень пылает магическим пламенем", "spell.unicopia.flame.lore": "Этот камень пылает магическим пламенем",
"spell.unicopia.infernal": "Инферно", "spell.unicopia.infernal": "Инферно",
@ -434,7 +521,7 @@
"spell.unicopia.siphoning.lore": "Направляет жизненную силу другого существа в заклинателя", "spell.unicopia.siphoning.lore": "Направляет жизненную силу другого существа в заклинателя",
"spell.unicopia.reveal": "Развенчание иллюзий", "spell.unicopia.reveal": "Развенчание иллюзий",
"spell.unicopia.reveal.lore": "Отклоняет магию чейнджлинга", "spell.unicopia.reveal.lore": "Отклоняет магию чейнджлинга",
"spell.unicopia.light": "Танцующий свет", "spell.unicopia.light": "Танцующие огни",
"spell.unicopia.light.lore": "Призывает множество маленьких огоньков, которые следуют за заклинателем", "spell.unicopia.light.lore": "Призывает множество маленьких огоньков, которые следуют за заклинателем",
"spell.unicopia.awkward": "Неудача", "spell.unicopia.awkward": "Неудача",
"spell.unicopia.awkward.lore": "Нестабильная магия", "spell.unicopia.awkward.lore": "Нестабильная магия",
@ -712,20 +799,378 @@
"gui.unicopia.spellbook.page.recipes": "Рецепты", "gui.unicopia.spellbook.page.recipes": "Рецепты",
"gui.unicopia.spellbook.page.recipes.empty": "0 рецептов разблокировано", "gui.unicopia.spellbook.page.recipes.empty": "0 рецептов разблокировано",
"gui.unicopia.spellbook.page.mana": "Мана", "gui.unicopia.spellbook.page.mana": "Мана",
"gui.unicopia.spellbook.page.level_requirement": "Уровень: %s",
"gui.unicopia.spellbook.page.requirements.entry.item": "- %1$sx %2$s", "gui.unicopia.spellbook.page.requirements.entry.item": "- %1$sx %2$s",
"gui.unicopia.spellbook.page.requirements.entry.trait": "- Не менее %1$sx черт %2$s", "gui.unicopia.spellbook.page.requirements.entry.trait": "- Не менее %1$sx черт %2$s",
"gui.unicopia.spellbook.page.requirements.entry.spell": "- %1$sx драгоценный камень \"%2$s\"", "gui.unicopia.spellbook.page.requirements.entry.spell": "- %1$sx самоцвет \"%2$s\"",
"gui.unicopia.spellbook.recipe.requires": "Требования:",
"gui.unicopia.spellbook.author1.sign_off": "По приказу принцессы",
"gui.unicopia.spellbook.author1.sign_off.b": "По приказу принцессы, так ужасно сожалея",
"gui.unicopia.spellbook.author1.name": "- Старсвирл Бородатый",
"gui.unicopia.spellbook.author2.name": "- Король Сомбра",
"gui.unicopia.spellbook.author3.name": "- Обнимаю и целую, Лулу",
"gui.unicopia.spellbook.chapter.artefacts.status.unconfirmed": "Статус: Не подтверждён",
"gui.unicopia.spellbook.chapter.artefacts.status.confirmed": "Статус: Подтверждён",
"gui.unicopia.spellbook.chapter.artefacts.status.lost": "Статус: Потерян",
"gui.unicopia.spellbook.chapter.introduction.p1.title": "Предисловие",
"gui.unicopia.spellbook.chapter.introduction.p1.body": "Тот, кто держит эту книгу, остерегайтесь того, что ищете, ибо найденное может вам не понравиться. §kHither yonder equs§r.",
"gui.unicopia.spellbook.chapter.introduction.p2.title": "Гл.1 - Магия в Эквестрии",
"gui.unicopia.spellbook.chapter.introduction.p2.body": "Эквестрия наполнена магией самых разных форм и видов. Однако после недавних событий стало очевидно, что мы не до конца понимаем всё, что связано с миром Эквестрии. Поэтому корона поручила мне исследовать магию во всех её проявлениях, чтобы мы могли использовать её и, я надеюсь, спастись от §kдискордного нападения§r.",
"gui.unicopia.spellbook.chapter.introduction.p3.title": "1-ое Мэйра 12-го",
"gui.unicopia.spellbook.chapter.introduction.p3.1.body": "Необычные камни",
"gui.unicopia.spellbook.chapter.introduction.p3.2.body": "Эти \"самоцветы\", как их называют местные жители, - обычный материал, встречающийся по всему миру. Фермерские пони постоянно откапывают их и считают местным деликатесом, но я считаю, что эти камни способны на гораздо большее, чем они сами о себе говорят.",
"gui.unicopia.spellbook.chapter.introduction.p4.title": "Самоцветы",
"gui.unicopia.spellbook.chapter.introduction.p4.1.body": "Мои исследования ещё не закончены, но, возможно, я на что-то наткнулся. Эти камни обладают высоким магическим потенциалом! Самым большим, чем я когда-либо видел!",
"gui.unicopia.spellbook.chapter.introduction.p4.2.body": "§mЛуна хочет-§r Я буду продолжать эксперименты. Скрестив копыта, я сообщу вам завтра, если что-нибудь найду.",
"gui.unicopia.spellbook.chapter.introduction.p5.title": "2-ое Мэйра 12-го",
"gui.unicopia.spellbook.chapter.introduction.p5.1.body": "Сработало! Святая §kзадница Селестии§r, это и вправду сработало!",
"gui.unicopia.spellbook.chapter.introduction.p5.2.body": "Потрясающе! Они способны на гораздо большее, чем я думал. Подумайте, какие достижения я мог бы принести в Эквестрию с ними. Освещение, отопление, охлаждение... мне больше не придется проводить лето, сидя на этом-",
"gui.unicopia.spellbook.chapter.introduction.p5.3.body": "Я забегаю вперёд. Позвольте мне объяснить...",
"gui.unicopia.spellbook.chapter.introduction.p6.title": "Создание заклинаний",
"gui.unicopia.spellbook.chapter.introduction.p6.1.body": "В начале этой книги я нарисовал гайд по размещению.",
"gui.unicopia.spellbook.chapter.introduction.p6.2.body": "Положите необработанный самоцвет в центр и поместите материалы вокруг него в отмеченные мною слоты.",
"gui.unicopia.spellbook.chapter.introduction.p6.3.body": "Каждый материал даёт разные эффекты, и их расположение рядом усиливает их влияние на самоцвет.",
"gui.unicopia.spellbook.chapter.introduction.p7.title": "3-е Мэйра 12-го",
"gui.unicopia.spellbook.chapter.introduction.p7.1.body": "Я собираюсь начать записывать комбинации заклинаний по мере их обнаружения. Некоторые из них довольно очевидны, например, самоцвет + огонь = самоцвет огня.",
"gui.unicopia.spellbook.chapter.introduction.p7.2.body": "Но некоторые из них менее очевидны. Например, какие черты добавит яйцо? Нужно много экспериментировать. О, я так взволнован!",
"gui.unicopia.spellbook.chapter.introduction.p8.title": "Неудачные самоцветы",
"gui.unicopia.spellbook.chapter.introduction.p8.1.body": "Не все комбинации работают. Огорчает ещё то, что теперь в моих покоях скапливаются все эти бесполезные камни.",
"gui.unicopia.spellbook.chapter.introduction.p8.2.body": "Я не знаю, что с ними делать. Они не съедобны (по словам местных).",
"gui.unicopia.spellbook.chapter.introduction.p8.3.body": "У них всё ещё есть черты, которыми я их наделил, так что, возможно, я смогу найти им другое применение, кроме строительства каменной крепости с Луной...",
"gui.unicopia.spellbook.chapter.introduction.p9.title": "13-ое Мэйра 12-го",
"gui.unicopia.spellbook.chapter.introduction.p9.1.body": "Извините за долгую задержку с обновлениями. Я много работал, изучая различные заклинания и определяя свой подход.",
"gui.unicopia.spellbook.chapter.introduction.p9.2.body": "Огонь становится очень интересным аспектом, учитывая, что черты для него легко доступны.",
"gui.unicopia.spellbook.chapter.fire.p1.title": "Гл.2 - Магия огня",
"gui.unicopia.spellbook.chapter.fire.p2.title": "9-ое Пониюня 12-го",
"gui.unicopia.spellbook.chapter.fire.p2.1.body": "Это заняло больше времени, чем я ожидал, - почти месяц! Ха! Но я представляю тебе, дорогой читатель, свои находки для первой элементарной формы магии: ОГОНЬ.",
"gui.unicopia.spellbook.chapter.fire.p2.2.body": "Это рабочее название, окей?",
"gui.unicopia.spellbook.chapter.fire.scorch.1.body": "Простой и понятный, Ожог делает именно то, о чём вы подумали. Наделив самоцвет чертой огня, можно заставить его светиться и становиться горячим на ощупь.",
"gui.unicopia.spellbook.chapter.fire.scorch.2.body": "Эффект становится тем сильнее, чем больше огня вы в него загружаете, но старайтесь не перегружать его, так как он может стать неустойчивым.",
"gui.unicopia.spellbook.chapter.fire.flame.1.body": "Создаёт эффект нагревания в радиусе 3 копыт от заклинателя/снаряда.",
"gui.unicopia.spellbook.chapter.fire.flame.2.body": "Пригодится, если нужно срочно разжечь пламя или отбиться от дикого вендиго.",
"gui.unicopia.spellbook.chapter.fire.p5.title": "10-ое Пониюня 12-го",
"gui.unicopia.spellbook.chapter.fire.p5.1.body": "Прогресс?",
"gui.unicopia.spellbook.chapter.fire.p5.2.body": "Мне удалось несколько улучшить предыдущее заклинание, но всё равно чего-то не хватает. Всё очень упорядочено. Предсказуемо.",
"gui.unicopia.spellbook.chapter.fire.p5.3.body": "Луна предложила добавить больше огня, но я не хочу создавать на башне новые следы от ожогов. Упаси меня Фауст, если кто-нибудь из пони узнает, чем я занимался...",
"gui.unicopia.spellbook.chapter.fire.p6.title": "Магия огня III",
"gui.unicopia.spellbook.chapter.fire.p6.1.body": "Фокусировка магии",
"gui.unicopia.spellbook.chapter.fire.p6.2.body": "Некоторые заклинания обычно требуют огромной концентрации, чтобы их наложить, и недюжинной смекалки, чтобы управлять ими. Однако я обнаружил, что предметы, наделённые чертой фокусировки, прекрасно работают в качестве замены, когда у заклинателя её не хватает.",
"gui.unicopia.spellbook.chapter.fire.p7.title": "Магия огня III-II",
"gui.unicopia.spellbook.chapter.fire.p7.1.body": "Любые стеклянные предметы, которые вы можете найти, глаза, бутылки, всё, что имеет линзы, может быть использовано для усиления фокусировки заклинания.",
"gui.unicopia.spellbook.chapter.fire.p8.title": "Черновик 2",
"gui.unicopia.spellbook.chapter.fire.p8.1.body": "Мы сегодня ходили на рынок. Нужно было выбраться из этой башни, чем-то заняться, где-то побыть. Луна предложила зайти посмотреть, что продают на ярмарке, и я решил ей потакать.",
"gui.unicopia.spellbook.chapter.fire.p8.2.body": "Горожане всё ещё относятся к нам скептически, хотя кто их в этом винит. По крайней мере, Луна хорошо ладила с другими жеребятами.",
"gui.unicopia.spellbook.chapter.fire.fire_bolt.1.body": "Создаёт серию раскаленных снарядов для метания в цель. При попадании цель будет подожжена.",
"gui.unicopia.spellbook.chapter.fire.fire_bolt.2.body": "- Увеличение фокусировки позволит более тонко контролировать траекторию полёта снаряда.",
"gui.unicopia.spellbook.chapter.fire.fire_bolt.3.body": "- С более чем 50 фокусировки они как будто знают, где находится цель (самонаведение?).",
"gui.unicopia.spellbook.chapter.fire.p10.title": "Магия огня IV",
"gui.unicopia.spellbook.chapter.fire.p10.1.body": "Мощная магия",
"gui.unicopia.spellbook.chapter.fire.p10.2.body": "Если одни заклинания требуют фокусировки, то другие - мощи. Либо для приложения силы, либо для генерирования энергии.",
"gui.unicopia.spellbook.chapter.fire.p10.3.body": "Немногие единороги обладают врождённой силой и мощью для создания подобных заклинаний, но, к счастью, такая черта не является дефицитом в нашем окружении.",
"gui.unicopia.spellbook.chapter.fire.p11.title": "Магия огня IV-II",
"gui.unicopia.spellbook.chapter.fire.p11.1.body": "Земные элементы, камень, многие металлы и минералы, которые прочны при сжатии, будут проявлять черту прочности.",
"gui.unicopia.spellbook.chapter.fire.p11.2.body": "Электрические/проводящие элементы, которые можно использовать для питания вещей или которые светятся, также могут быть использованы для получения черты мощи.",
"gui.unicopia.spellbook.chapter.fire.p12.title": "11-ое Пониюня 12-го",
"gui.unicopia.spellbook.chapter.fire.p12.1.body": "Сегодня в дверь постучали. Луна очень хотела ответить, но мне пришлось отослать её, так как это был гонец от короны.",
"gui.unicopia.spellbook.chapter.fire.p12.2.body": "Похоже, мои исследования приобрели определенную известность. Королевским особам не терпится узнать, что я придумал.",
"gui.unicopia.spellbook.chapter.fire.p12.3.body": "Они вбили себе в голову, что могут использовать это против Запада.",
"gui.unicopia.spellbook.chapter.fire.p12.4.body": "Не дай бог, чтобы им это удалось. Я с содроганием думаю о том, что может сделать Совет, если они приложат свои копыта к моей работе.",
"gui.unicopia.spellbook.chapter.fire.p12.5.body": "Приложение",
"gui.unicopia.spellbook.chapter.fire.p12.6.body": "§mМне сказали, что корона начала давать указания, как найти другое применение. Способы чтобы...",
"gui.unicopia.spellbook.chapter.fire.p13.title": "20-ое Пониюня 12-го",
"gui.unicopia.spellbook.chapter.fire.p13.1.body": "У меня есть новости от короны. Они, похоже, пока довольны и согласились, чтобы я продолжал свои исследования зимой.",
"gui.unicopia.spellbook.chapter.fire.p13.2.body": "Боюсь, я вынужден уничтожить несколько последних записей.",
"gui.unicopia.spellbook.chapter.fire.p14.title": "21-ое Пониюня 12-го",
"gui.unicopia.spellbook.chapter.fire.p14.1.body": "Завтра я навещу командира Харрикейн. Возможно, она прольёт свет на моё затруднительное положение.",
"gui.unicopia.spellbook.chapter.fire.shield.1.body": "Наложение щитов - одно из первых занятий единорога по самообороне. Это простое и лёгкое заклинание, и оно является отличным введением в искусство заклинаний.",
"gui.unicopia.spellbook.chapter.fire.shield.2.body": "Его недостатком являются энергетические и ментальные затраты, однако мы можем свести их на нет, прикрепив его к самоцвету, как показано дальше...",
"gui.unicopia.spellbook.chapter.fire.shield.modifier.1": "+ добавить черту мощи, чтобы увеличить радиус действия.",
"gui.unicopia.spellbook.chapter.fire.p16.title": "Защита II",
"gui.unicopia.spellbook.chapter.fire.p16.1.body": "Добавив дополнительные черты, я смог слегка модифицировать щит, чтобы разрешить или запретить определенным сторонам попадать в зону действия эффекта.",
"gui.unicopia.spellbook.chapter.fire.p16.2.body": "+ добавление черты жизни --> все животные могут войти.\n+ добавление черты крови --> все монстры могут войти.\n+ добавление черты льда --> все пони могут войти.",
"gui.unicopia.spellbook.chapter.fire.p17.title": "Защита III",
"gui.unicopia.spellbook.chapter.fire.p17.1.body": "+ добавить черту щедрости, чтобы привязать это заклинание к месту, а не к себе.",
"gui.unicopia.spellbook.chapter.fire.p18.title": "Черновик: 9-ое Пониюня 12-го",
"gui.unicopia.spellbook.chapter.fire.p18.1.body": "Магия огня оказалась немного более... непредсказуемой. Каждый раз, когда я делаю успехи, она находит способ отбросить меня назад.",
"gui.unicopia.spellbook.chapter.fire.p18.2.body": "Но я не могу остановиться... Мне сказали, что ситуация на западе становится всё более ужасной. Они попросили меня ускорить темп и создать что-то, что мы сможем использовать, чтобы одержать верх над §kШтормом Чейнджлингов§r.",
"gui.unicopia.spellbook.chapter.ice.p1.title": "Гл.1 - Магия льда",
"gui.unicopia.spellbook.chapter.ice.p2.title": "4-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.ice.p2.1.body": "А вот это интересная штучка. Довольно простая, признаюсь, но Луна настояла, чтобы я сделал что-нибудь холодное, чтобы помочь нам справиться с этой проклятой жарой.",
"gui.unicopia.spellbook.chapter.ice.p2.2.body": "Всё, что вам нужно, - это самоцвет и что-нибудь холодное. Снежок, например.",
"gui.unicopia.spellbook.chapter.ice.frost.1.body": "Создаёт леденящий эффект в радиусе 3 копыт от заклинателя/снаряда.",
"gui.unicopia.spellbook.chapter.ice.frost.2.body": "Поглощает энергию из окружающей среды, вызывая охлаждение.",
"gui.unicopia.spellbook.chapter.ice.p4.title": "Леденящее дыхание",
"gui.unicopia.spellbook.chapter.ice.p4.1.body": "Изменяет способность некоторых объектов различать горячее и холодное.",
"gui.unicopia.spellbook.chapter.ice.p4.2.body": "Это очень слабое заклинание, но при использовании с лодкой может оказаться очень полезным, чтобы выбраться из затруднительного положения.",
"gui.unicopia.spellbook.chapter.ice.p5.title": "5-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.ice.p5.1.body": "Прошлой ночью деревенские пони развели костёр. Я понял это по сильному запаху горящего дерева и звукам музыки.",
"gui.unicopia.spellbook.chapter.ice.p5.2.body": "Луна, благослови её сердце, настояла на том, чтобы мы сделали перерыв и присоединились к ним. Для этого ей пришлось практически оттащить меня от стола.",
"gui.unicopia.spellbook.chapter.ice.p5.3.body": "Что я могу сказать? Она - свет в моём сердце.",
"gui.unicopia.spellbook.chapter.ice.p6.title": "Костёр",
"gui.unicopia.spellbook.chapter.ice.p6.1.body": "Мы подошли к костру, и, конечно, первым делом мне в копыто сунули кружку эля. Я, конечно, не стал пить - алкоголь для меня яд. Меня бы тошнило, как мула.",
"gui.unicopia.spellbook.chapter.ice.p6.2.body": "Луне понравилось (костёр, а не эль!). Она сразу же подружилась с одной из городских кобылок, с Селли или как-то так. Они играли всю ночь.",
"gui.unicopia.spellbook.chapter.ice.p7.title": "Костёр II",
"gui.unicopia.spellbook.chapter.ice.p7.1.body": "На обратном пути Луна рассказывала мне истории, которые ей поведала подруга. В городе, как и следовало ожидать, много легенд.",
"gui.unicopia.spellbook.chapter.ice.p7.2.body": "Одна из них была о страшном старом колдуне, который жил в башне с привидениями на окраине города. Кто это был - не загадка.",
"gui.unicopia.spellbook.chapter.ice.p8.title": "6-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.ice.p8.1.body": "Прошлой ночью в деревне был странный шум. Очень странный. Я слышал крики многих пони, и, возможно, там был пожар.",
"gui.unicopia.spellbook.chapter.ice.p8.2.body": "Надеюсь, что всё в порядке.",
"gui.unicopia.spellbook.chapter.ice.light.1.body": "Соединив самоцвет огненного снаряда с объектами черт жизни и охлаждающим эффектом льда, я создал заклинание, помогающее видеть в ночи.",
"gui.unicopia.spellbook.chapter.ice.light.2.body": "Танцующие огни вызовут скопление светящихся шаров, чтобы осветить ваш путь.",
"gui.unicopia.spellbook.chapter.ice.light.modifier.1": "* Добавив больше фокусировки, вы можете увеличить продолжительность заклинания.",
"gui.unicopia.spellbook.chapter.ice.p10.title": "12-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.ice.p10.1.body": "Прошлой ночью было ещё больше звуков, на этот раз гораздо ближе. Поведение города тоже изменилось. Многие пони, которых я вижу, обычно очень веселые, стали угрюмыми.",
"gui.unicopia.spellbook.chapter.ice.p10.2.body": "Что-то произошло, это очевидно, хотя мало кто скажет мне, что именно.",
"gui.unicopia.spellbook.chapter.ice.p11.title": "15-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.ice.p11.1.body": "Зима уже почти наступила. Пока я пишу, за окном появляются первые хлопья снега.",
"gui.unicopia.spellbook.chapter.ice.p11.2.body": "Местные жители начали разворачивать свои зимние запасы, и хотя обычное ворчание по поводу замёрзших полей в изобилии, я могу сказать, что §kчувство тревоги§r всё ещё присутствует.",
"gui.unicopia.spellbook.chapter.ice.p12.title": "17-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.ice.p12.1.body": "Удивительно, как быстро здесь меняется погода. В Катермуре всё так хорошо контролируется: заклинания, с помощью которых мы управляем температурой, и пегасы, помогающие с погодой, что мы даже иногда забываем, какими дикими могут быть времена года.",
"gui.unicopia.spellbook.chapter.ice.p12.2.body": "Но у земных пони нет такой роскоши. Им приходится справляться с погодой, как она приходит.",
"gui.unicopia.spellbook.chapter.ice.p13.title": "Замёрзшее озеро",
"gui.unicopia.spellbook.chapter.ice.p13.1.body": "Сегодня утром я как раз направлялся в стойло, когда проходил мимо озера у подножия холма этой башни и увидел, что оно почти полностью замёрзло. Несколько жеребят катались на нём.",
"gui.unicopia.spellbook.chapter.ice.p13.2.body": "Луна спросила, можно ли ей присоединиться к ним, но я не разрешил. Тогда я не мог сказать почему, но у меня было плохое предчувствие, будто что-то должно было произойти...",
"gui.unicopia.spellbook.chapter.ice.p14.title": "17-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.ice.p14.1.body": "О боги принцесс. Я... я не знаю, как это описать. Мои копыта дрожат, я едва могу дышать. Мне холодно, и я не могу перестать думать о том, что произошло.",
"gui.unicopia.spellbook.chapter.ice.p14.2.body": "Я знал, что что-то не так. Я ду... знал это. Тогда я ещё не знал, что именно, но я очень рад, что не позволил Луне пойти на то озеро.",
"gui.unicopia.spellbook.chapter.ice.p15.title": "Замёрзшее озеро II",
"gui.unicopia.spellbook.chapter.ice.p15.1.body": "Дайте мне сделать небольшой шаг назад, чтобы описать, что произошло. Помните замёрзшее озеро и жеребят, которые катались по нему на коньках?",
"gui.unicopia.spellbook.chapter.ice.p15.2.body": "Ну, после этого я отправился на рынок и загляделся на клубнику в одном из ларьков - не купил ни одной, к сожалению, она была забыта в суматохе.",
"gui.unicopia.spellbook.chapter.ice.p16.title": "Замёрзшее озеро III",
"gui.unicopia.spellbook.chapter.ice.p16.1.body": "Пока я спорил с продавцом о цене, я почувствовал, что Луна дергает меня за тунику, и она спросила меня, что происходит. Я услышал галоп и увидел, что мимо нас бегут пони. Никто из них не остановился, чтобы объяснить, но я услышал несколько очень грубых слов на старопонском.",
"gui.unicopia.spellbook.chapter.ice.p16.2.body": "Они направлялись в сторону нашей башни, и я отправился за ними.",
"gui.unicopia.spellbook.chapter.ice.p16.3.body": "Я сразу же подумал: \"Пожар? Моя лаборатория в опасности?\"",
"gui.unicopia.spellbook.chapter.ice.p16.4.body": "Вот что я вам скажу: я бы хотел, чтобы это было так. То, что я обнаружил на самом деле, было намного, намного, намного хуже, и даже мысль об этом заставляет мою кровь холодеть заново.",
"gui.unicopia.spellbook.chapter.ice.p17.title": "Замёрзшее озеро IV",
"gui.unicopia.spellbook.chapter.ice.p17.1.body": "Когда мы уже подходили к озеру, я увидел, что на его берегу собралась большая толпа. На берегу были разбросаны лестницы и аварийное оборудование, и поднялся шум по поводу того, что делать.",
"gui.unicopia.spellbook.chapter.ice.p17.2.body": "Однако, подойдя ближе, я довольно быстро понял, что произошло. Лед был сломан, и озеро замерзало.",
"gui.unicopia.spellbook.chapter.ice.p17.3.body": "Я нырнул, расстегнул седельные сумки с помощью магии, достал последний из имевшихся у меня самоцветов и произнёс незаконченное заклинание, которое было в нём.",
"gui.unicopia.spellbook.chapter.ice.p17.4.body": "Воды отступили от меня, когда я галопом помчался вниз по склону, пересекая высохшее дно озера и углубляясь, чтобы поймать упавших жеребят.",
"gui.unicopia.spellbook.chapter.ice.p18.title": "Замёрзшее озеро V",
"gui.unicopia.spellbook.chapter.ice.p18.1.body": "Они замёрзли и промокли, хотя под действием заклинания вода уходила с их шерсти. Мы донесли их до берега и укрыли одеялами с горячим питьём в копытах.",
"gui.unicopia.spellbook.chapter.ice.p18.2.body": "Горожане настояли на том, чтобы мне тоже дали одеяло, хотя я не промок (и не мог).",
"gui.unicopia.spellbook.chapter.ice.p18.3.body": "Лишь много позже, когда шок начал проходить и голова начала раскалываться, я вспомнил, что нужно отменить заклинание.",
"gui.unicopia.spellbook.chapter.ice.p18.4.body": "Слава принцессам, что мы успели вовремя.",
"gui.unicopia.spellbook.chapter.ice.p19.title": "18-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.ice.p19.1.body": "Сегодня утром жеребят не было видно, и я полагаю, что они ещё долго не подойдут к этому озеру. Ночью вода снова замёрзла и выглядела спокойной.",
"gui.unicopia.spellbook.chapter.ice.p19.2.body": "Тревожное чувство, которое я испытывал вчера, сегодня прошло, и я смог отдохнуть на его берегу вместе с Луной. Она не захотела больше купаться в этом озере, и я её не виню. Я бы тоже не стал.",
"gui.unicopia.spellbook.chapter.ice.p20.title": "Песочный замок",
"gui.unicopia.spellbook.chapter.ice.p20.1.body": "Луна начала строить замок из песка, а пока она была занята этим, я решил набросать детали своего нового заклинания.",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.1.body": "Если объединить заклинание щита и самоцвет заморозки, то результат получится... довольно странным.",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.2.body": "Я называю это отталкиванием воды, потому что оно именно так и действует: Отталкивает воду от заклинателя.",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.modifier.1": "* Добавив больше фокусировки, вы можете увеличить продолжительность заклинания.",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.modifier.2": "* Добавьте черту щедрости, чтобы привязать это заклинание к месту, а не к себе.",
"gui.unicopia.spellbook.chapter.air.p1.title": "Гл.4 - Магия воздуха",
"gui.unicopia.spellbook.chapter.air.p2.title": "1-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.air.p1.1.body": "Новый месяц, новая глава. Малышке Луне надоело сидеть в башне целый день (да и кто её винит? Мы выполняем это задание уже больше двух месяцев.)",
"gui.unicopia.spellbook.chapter.air.p1.2.body": "Поэтому в качестве маленькой радости мы решили отправиться в небольшое путешествие к водопаду Гранд Мэйрпид, чтобы навестить моего друга, командира Харрикейн.",
"gui.unicopia.spellbook.chapter.air.p1.3.body": "Командир также очень любезно предоставила мне доступ в свою библиотеку, чтобы я мог продолжить обучение. Мне не терпится узнать, что даст объединение магии единорога и пегаса.",
"gui.unicopia.spellbook.chapter.air.p3.title": "2-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.air.p3.1.body": "Прошу прощения за необычную запись в приложениях за сегодня. Похоже, какой-то маленький гремлин умудрился сбежать с моим журналом.",
"gui.unicopia.spellbook.chapter.air.p4.title": "Магия воздуха I",
"gui.unicopia.spellbook.chapter.air.p4.1.body": "Магия пегасов",
"gui.unicopia.spellbook.chapter.air.p4.2.body": "Магия воздуха для пегасов - то же самое, что огонь для единорогов. Их одинаково трудно контролировать, но если огонь в первую очередь ориентирован на силу, разрушение или защиту, то воздух - на гибкость и свободу движений.",
"gui.unicopia.spellbook.chapter.air.p4.3.body": "Командир Харрикейн очень любезно дала мне несколько советов о том, как выявить эту черту в повседневных предметах.",
"gui.unicopia.spellbook.chapter.air.p4.4.body": "Всё, что связано с полётом, или произошло от существ, которые летают, или приходит сверху, может считаться источником черты воздуха.",
"gui.unicopia.spellbook.chapter.air.p4.5.body": "Например, перья.",
"gui.unicopia.spellbook.chapter.air.catapult.1.body": "Это прямое применение телекинеза единорога. Самоцвет катапульты позволяет заклинателю захватить любой блок или существо и подбросить их в воздух.",
"gui.unicopia.spellbook.chapter.air.catapult.2.body": "Используйте его ещё раз на уже брошенном предмете, чтобы оттолкнуть его.",
"gui.unicopia.spellbook.chapter.air.catapult.modifier.1": "* Можно добавить больше силы, добавив черту силы (удивительно, да?).",
"gui.unicopia.spellbook.chapter.air.bubble.1.body": "Защитное и полезное заклинание. Пузырь заключает цель в гигантский мыльный пузырь, делая её беззащитной.",
"gui.unicopia.spellbook.chapter.air.bubble.2.body": "Повторное использование лопает пузырь.",
"gui.unicopia.spellbook.chapter.air.p7.title": "8-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.air.p7.1.body": "Пока Луны и командира нет дома, я решил сделать небольшую запись, чтобы зафиксировать свои находки.",
"gui.unicopia.spellbook.chapter.air.p7.2.body": "Магия пегасов - это действительно удивительный зверь. Она не похожа на нашу магию, которая изучается с жёсткими правилами и практиками.",
"gui.unicopia.spellbook.chapter.air.p8.title": "Пегасы",
"gui.unicopia.spellbook.chapter.air.p8.1.body": "Магия пегасов - это скорее чувства. Это форма искусства. Они не думают о том, что хотят сделать, это просто происходит, но всё это происходит по одному и тому же принципу.",
"gui.unicopia.spellbook.chapter.air.p9.title": "Пегасы II",
"gui.unicopia.spellbook.chapter.air.p9.1.body": "Возьмем, к примеру, их облачные дома. Я не могу прочитать ни одного заклинания, которое позволило бы мне это сделать, но если вы почувствуете, не копытами или рогом, а как следует, умом, сердцем, то обнаружите, что повсюду гудит магия.",
"gui.unicopia.spellbook.chapter.air.p9.2.body": "Облака наполнены чертами воздуха и воды, а также другими, такими как мощь, сила, жизнь, земля. Всё это черты материала, которому подражают облака.",
"gui.unicopia.spellbook.chapter.air.p10.title": "Пегасы III",
"gui.unicopia.spellbook.chapter.air.p10.1.body": "Я бы хотел изучить больше, но боюсь вмешиваться в магию, которую ещё не до конца понимаю.",
"gui.unicopia.spellbook.chapter.air.p10.2.body": "Командир Харрикейн никогда не простит мне, если я разрушу её дом в первый же день как оказался здесь.",
"gui.unicopia.spellbook.chapter.air.feather_fall.1.body": "Развивая оборонительные возможности самоцвета защиты, я попытался распространить его преимущества на других.",
"gui.unicopia.spellbook.chapter.air.feather_fall.2.body": "Этот вариант необычен своей сложностью, но в теории он должен позволить замедлить спуск себя и своих друзей.",
"gui.unicopia.spellbook.chapter.air.p12.title": "10-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.air.p12.1.body": "Пошёл на ужин с командиром Харрикейн и Луной. Мы заговорили об архитектуре, и Харрикейн упомянул Таз Мэйрхолл.",
"gui.unicopia.spellbook.chapter.air.p12.2.body": "Луна подумала, что это довольно забавное название для замка. Мне пришлось напомнить ей, что не все культуры одинаковы.",
"gui.unicopia.spellbook.chapter.air.p13.title": "21-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.air.p13.1.body": "Я пишу это накануне своего возвращения в §kТротхольм§r. Хотя время, проведённое в Клаудополисе, было познавательным, я с нетерпением жду возвращения в привычную обстановку и полноценного отдыха в своей собственной твердой постели.",
"gui.unicopia.spellbook.chapter.air.p13.2.body": "Но не могу сказать того же о Луне. Сейчас она сидит на моей кровати рядом со мной и дуется из-за каждой мелочи, которую я кладу в седельную сумку.",
"gui.unicopia.spellbook.chapter.air.p14.title": "Возвращение домой",
"gui.unicopia.spellbook.chapter.air.p14.1.body": "Она настаивает, чтобы мы остались еще немного, чтобы пообщаться с пегасом, с которым я видел её на днях, без сомнения.",
"gui.unicopia.spellbook.chapter.air.p15.title": "22-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.air.p15.1.body": "Пока мы летим над вершинами гор, я не могу не испытывать благоговения перед красотой, которую подарила нам §kматушка Фауст§r.",
"gui.unicopia.spellbook.chapter.air.p15.2.body": "Мне пришлось всё время следить за тем, чтобы Луна не выпала, и, конечно, отвечать на вопросы о разных видах облаков. К счастью, оператор воздушного шара был рядом, чтобы помочь разобраться в тонкостях.",
"gui.unicopia.spellbook.chapter.air.p15.3.body": "Находясь здесь, над всеми нашими проблемами, я на мгновение забываю об остальном мире. Это возвращает меня в более простые времена, до...",
"gui.unicopia.spellbook.chapter.air.p15.4.body": "Конечно, вспышки взрывов на западе должны были всё испортить. Кажется, на горизонте надвигается буря. Я очень надеюсь, что это не будет плохим предзнаменованием...",
"gui.unicopia.spellbook.chapter.dark_magic.p1.title": "Гл.5 - Арканная магия",
"gui.unicopia.spellbook.chapter.dark_magic.p2.title": "30-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p2.1.body": "Сегодня пришло новое письмо от короны. Похоже, ситуация на западе ухудшается, и хотя до сих пор они были довольны моей работой, теперь они давят на меня, чтобы я создал что-то более разрушительное.",
"gui.unicopia.spellbook.chapter.dark_magic.p2.2.body": "Я пытался сказать посыльному, что не мо...",
"gui.unicopia.spellbook.chapter.dark_magic.p3.title": "3-е Сенобря 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p3.1.body": "Да будет вам известно, что в мои планы никогда не входило, чтобы кто-то из пони использовал мою работу в неблаговидных целях. Я прежде всего исследователь. Мои намерения чисты, и я хочу, чтобы в этом мире царил мир.",
"gui.unicopia.spellbook.chapter.dark_magic.p4.title": "4-ое Сенобря 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p4.1.body": "Ни один обзор магии не будет полным без взгляда на другую сторону.",
"gui.unicopia.spellbook.chapter.dark_magic.p4.2.body": "Тёмная магия, или, как я буду её называть, арканная, пролегает между обычной светлой магией, которую мы обычно знаем, и более мерзкой стороной реальности.",
"gui.unicopia.spellbook.chapter.dark_magic.vortex.1.body": "Если бы вас спросили, что является противоположностью отталкивающего заклинания, что бы вы ответили? Конечно же, заклинание притяжения!",
"gui.unicopia.spellbook.chapter.dark_magic.vortex.2.body": "Исказив цель заклинания защиты, я смог изменить его функцию и создать заклинание, которое притягивает объекты и сущности ближе к заклинателю.",
"gui.unicopia.spellbook.chapter.dark_magic.vortex.modifier.1": "+ 10x черт знаний, чтобы сузить область действия эффекта до предметов.",
"gui.unicopia.spellbook.chapter.dark_magic.vortex.modifier.2": "+ добавить фокусировки для увеличения продолжительности.\n+ добавить мощи для увеличения дальности.",
"gui.unicopia.spellbook.chapter.dark_magic.p6.title": "8-ое Сенобря 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p6.1.body": "Дополнительные примечания к заклинанию притяжения",
"gui.unicopia.spellbook.chapter.dark_magic.p6.2.body": "Сегодня я застал Луну за игрой с моей сеткой для колдовства, хотя я категорически запретил ей входить в мой кабинет, когда меня там нет.",
"gui.unicopia.spellbook.chapter.dark_magic.p6.3.body": "По-видимому, это произошло из-за какого-то спора с Селли, я точно не помню, но кульминацией стало то, что Луна пробралась в кабинет, пока я выходил за хлебом.",
"gui.unicopia.spellbook.chapter.dark_magic.p7.title": "Арканное притягивание II",
"gui.unicopia.spellbook.chapter.dark_magic.p7.1.body": "Но дело не совсем в этом. Ее отругали и отправили обратно в комнату, но, убирая беспорядок, который она устроила, я заметил кое-что в куче самоцветов.",
"gui.unicopia.spellbook.chapter.dark_magic.p7.2.body": "Это трудно описать. Это явно всё ещё самоцвет притяжения, но он другой.",
"gui.unicopia.spellbook.chapter.dark_magic.p7.3.body": "У него есть черты, о которых я раньше не задумывался, и то, как он себя ведёт...",
"gui.unicopia.spellbook.chapter.dark_magic.p8.title": "Арканное притягивание II Прод.",
"gui.unicopia.spellbook.chapter.dark_magic.p8.1.body": "Ну, это я оставлю на завтра. Я всё ещё устал от всего, что произошло на этой неделе.",
"gui.unicopia.spellbook.chapter.dark_magic.p8.2.body": ">0x щедрости --> ???",
"gui.unicopia.spellbook.chapter.dark_magic.p8.3.body": ">20x черт приказа --> ???",
"gui.unicopia.spellbook.chapter.dark_magic.p9.title": "20-ое Сенобря 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p9.1.body": "Согласно договоренности, Совет прислал некоторые... дополнительные материалы, чтобы помочь в новом направлении моих исследований. Поначалу я был немного шокирован.",
"gui.unicopia.spellbook.chapter.dark_magic.p9.2.body": "Эту... штуку... что бы это ни было. Оно, скорее, было.",
"gui.unicopia.spellbook.chapter.dark_magic.p9.3.body": "Действительно ли это то, с чем мы боремся на западе?",
"gui.unicopia.spellbook.chapter.dark_magic.p10.title": "21-ое Сенобря 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p10.1.body": "Я спрятал эту... штуку. В подвал. И запер на ключ.",
"gui.unicopia.spellbook.chapter.dark_magic.p10.2.body": "Я просто не мог больше смотреть на него. Оно имеет форму пони, но также...",
"gui.unicopia.spellbook.chapter.dark_magic.p10.3.body": "Я не мог допустить, чтобы Луна увидела это. Я отправил ее провести следующие несколько ночей с Селли, пока я решаю, что с этим делать.",
"gui.unicopia.spellbook.chapter.dark_magic.p11.title": "25-ое Сенобря 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p11.1.body": "Прошу прощения за долгую задержку. Я был немного... занят.",
"gui.unicopia.spellbook.chapter.dark_magic.p11.2.body": "Я многое узнал об этих существах. Прилагаю несколько иллюстраций, сделанных так, как я мог, чтобы не смотреть на них прямо.",
"gui.unicopia.spellbook.chapter.dark_magic.p11.3.body": "Его тело чёрное и §kнасекомоподобное§r с пропорциями пони. Шерсть отсутствует.",
"gui.unicopia.spellbook.chapter.dark_magic.p11.4.body": "Магия, которую они используют, необычна. Точнее, не необычная, а неестественная. Дикая.",
"gui.unicopia.spellbook.chapter.dark_magic.p11.5.body": "Здесь определенно есть что-то, что я мог бы использовать, но я неуверен... А стоит ли?",
"gui.unicopia.spellbook.chapter.dark_magic.p11.6.body": "Боюсь, что это та грань, которую не стоит переступать.",
"gui.unicopia.spellbook.chapter.dark_magic.transformation.1.body": "Я начал с того, что просто использовал их способности. Она не сфокусирована, и её трудно контролировать. Я редко могу предсказать, что произойдет, но этот самоцвет обладает очень четкими свойствами трансмогрификации.",
"gui.unicopia.spellbook.chapter.dark_magic.transformation.2.body": "Если бросить его в любое существо, есть шанс превратить его в любое другое существо.",
"gui.unicopia.spellbook.chapter.dark_magic.reveal.1.body": "Развеивание иллюзии - это первая линия защиты от заклинаний трансформации/иллюзии.",
"gui.unicopia.spellbook.chapter.dark_magic.reveal.2.body": "Когда заклинание будет применено, оно заставит всех маскирующихся чейнджлингов, находящихся поблизости, раскрыть свою истинную форму.",
"gui.unicopia.spellbook.chapter.dark_magic.reveal.modifier.1": "* Добавьте черту силы для увеличения дальности действия.",
"gui.unicopia.spellbook.chapter.dark_magic.p14.title": "27-ое Сенобря 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p14.1.body": "Последние несколько ночей сон был... трудным.",
"gui.unicopia.spellbook.chapter.dark_magic.p14.2.body": "Я не знаю, как это описать. Луна кажется незатронутой, но каждый вечер после захода солнца я обнаруживаю, что лежу ночью и не могу заснуть. Не помогает и то, что в деревне возобновились звуки.",
"gui.unicopia.spellbook.chapter.dark_magic.p15.title": "Потерянный сон",
"gui.unicopia.spellbook.chapter.dark_magic.p15.1.body": "Прошлой ночью я обнаружил, что нахожусь в обсерватории. Воздух стал прохладным, более чем обычно для этого времени года, и за пределами того, с чем мог бороться бушующий в углу комнаты огонь.",
"gui.unicopia.spellbook.chapter.dark_magic.p15.2.body": "Комната, где я держу... моего пациента, напротив стены за моей спиной.",
"gui.unicopia.spellbook.chapter.dark_magic.p16.title": "Потерянный сон Прод.",
"gui.unicopia.spellbook.chapter.dark_magic.p16.1.body": "Я уже давно держу эту дверь закрытой, потому что время от времени могу поклясться, что слышу, как там что-то шевелится...",
"gui.unicopia.spellbook.chapter.dark_magic.p16.2.body": "Боже, я схожу с ума?",
"gui.unicopia.spellbook.chapter.dark_magic.p17.title": "29-ое Сенобря 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p17.1.body": "Чёрт, вот опять!",
"gui.unicopia.spellbook.chapter.dark_magic.p17.2.body": "Я думал, что прошлая ночь была случайностью, но я только что услышал это снова - я дрожу. Мои копыта едва удерживают эту книгу, и я с трудом пишу эти слова.",
"gui.unicopia.spellbook.chapter.dark_magic.p17.3.body": "Там что-то... Я что-то слышал. Похожее на трещание...",
"gui.unicopia.spellbook.chapter.dark_magic.p18.title": "1-ое Круптября 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p18.1.body": "Я отправился в город. Один из местных кузнецов согласился установить новый замок, один из тех тяжелых, которые не могут сломать даже земные пони.",
"gui.unicopia.spellbook.chapter.dark_magic.p18.2.body": "Боюсь, этого может быть недостаточно, но, что бы это ни было, оно явно обладает магией. Возможно, мне придется искать магическое решение проблемы бессонницы.",
"gui.unicopia.spellbook.chapter.dark_magic.arcane_protection.1.body": "Это заклинание покрывает определённую область территории, которая защищает от других заклинателей.",
"gui.unicopia.spellbook.chapter.dark_magic.arcane_protection.2.body": "Никто другой не сможет использовать магию в области действия заклинания.",
"gui.unicopia.spellbook.chapter.dark_magic.arcane_protection.modifier.1": "* Добавьте черту силы для увеличения дальности действия.",
"gui.unicopia.spellbook.chapter.dark_magic.displacement.1.body": "Использовав это заклинание, единорог может поменять своё местоположение с любым другим существом.",
"gui.unicopia.spellbook.chapter.dark_magic.p21.title": "3-е Круптября 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p21.1.body": "Замки уже установлены, и с появлением дополнительных мер защиты я чувствую себя немного спокойнее.",
"gui.unicopia.spellbook.chapter.dark_magic.p21.2.body": "Движения по ночам практически прекратились, хотя иногда мне кажется, что я их всё ещё слышу...",
"gui.unicopia.spellbook.chapter.dark_magic.p22.title": "4-ое Круп-",
"gui.unicopia.spellbook.chapter.dark_magic.mimic.1.body": "Мне удалось воспользоваться некоторыми способностями этого странного существа. Мне еще многое предстоит выяснить, но пока что я просто добавил его эссенцию в самоцвет.",
"gui.unicopia.spellbook.chapter.dark_magic.mimic.modifier.1": "* Добавив больше фокусировки, вы можете увеличить продолжительность заклинания.",
"gui.unicopia.spellbook.chapter.dark_magic.p24.1.body": "На город нахлынула волна тьмы. Ничто не стало прежним с тех пор, как появилось это забытое богами существо.",
"gui.unicopia.spellbook.chapter.dark_magic.p24.2.body": "Пони в городе стали отмечать недостаток сна, и это заметно. Только сегодня я видел бедного жеребца, который ходил в оцепенении. Под глазами мешки, щёки почти бесцветны.",
"gui.unicopia.spellbook.chapter.dark_magic.p25.1.body": "Он выглядел почти как зомби, когда выполнял все действия, не обращая на меня никакого внимания даже после того, как чуть не столкнулся со мной.",
"gui.unicopia.spellbook.chapter.dark_magic.p26.title": "Черновик",
"gui.unicopia.spellbook.chapter.dark_magic.p26.1.body": "§kЭтого недостаточно. Никогда не будет достаточно. Ползание. Я чувствую ползание. О боги, ползание не прекращается.",
"gui.unicopia.spellbook.chapter.dark_magic.p27.1.body": "Бессонница. Я не могу это вынести. Каждую ночь я лежу в своей постели и жду, когда засну.",
"gui.unicopia.spellbook.chapter.dark_magic.p27.2.body": "Я думал, что смогу остановить его, держать на расстоянии, но я всё ещё слышу его. Это существо. Холодное, бесчувственное.",
"gui.unicopia.spellbook.chapter.dark_magic.p27.3.body": "Я чувствую, что истощаюсь, когда нахожусь рядом с ним. Оно... питается мной?",
"gui.unicopia.spellbook.chapter.dark_magic.p27.4.body": "Нет, не может быть.",
"gui.unicopia.spellbook.chapter.dark_magic.p28.1.body": "Я нашёл это заклинание под старыми записями во время уборки лаборатории. Оно... простое и сложное в обращении, но оно справляется со своей задачей.",
"gui.unicopia.spellbook.chapter.dark_magic.dispel_evil.modifier.1": "* Добавьте черту силы для увеличения дальности действия.",
"gui.unicopia.spellbook.chapter.otherworldly.p1.title": "Гл.6 - Потустороннее",
"gui.unicopia.spellbook.chapter.otherworldly.p2.title": "1-ое Круптября 12-го",
"gui.unicopia.spellbook.chapter.otherworldly.p2.1.body": "Эта глава служит исследованием миров за пределами нашего собственного и погружением в то, чего большинство единорогов обычно сторонятся.",
"gui.unicopia.spellbook.chapter.otherworldly.p2.2.body": "В этом разделе вы найдете самые мощные из мощных заклинаний, но и самые опасные. Читайте дальше на свой страх и риск, ибо это не для светлых умов.",
"gui.unicopia.spellbook.chapter.otherworldly.siphoning.1.body": "Простое заклинание, которое вытягивает жизненную силу из живого существа и использует её для оживления заклинателя.",
"gui.unicopia.spellbook.chapter.otherworldly.necromancy.1.body": "Это заклинание, воздействующее на область, обращается к потусторонним силам, чтобы призвать жизнь на службу своему хозяину.",
"gui.unicopia.spellbook.chapter.otherworldly.necromancy.2.body": "Само по себе это заклинание не слишком полезно, но в сочетании с другими способностями может стать мощным средством против §роев чейнджлингов§r.",
"gui.unicopia.spellbook.chapter.otherworldly.dark_vortex.1.body": "Погружаясь под ткань реальности, это заклинание использует глубинные арканные силы потустороннего мира, чтобы пробить брешь в реальности.",
"gui.unicopia.spellbook.chapter.otherworldly.dark_vortex.2.body": "Образовавшаяся дыра - это голодная масса, которая поглощает всех, кто к ней приближается. Она дарит огромную энергию, но питать её опасно.",
"gui.unicopia.spellbook.chapter.otherworldly.portal.1.body": "Сочетая эффекты заклинания перемещения, созданного моим предшественником, и самоцвет тёмного вихря, можно укротить его хаотичную природу.",
"gui.unicopia.spellbook.chapter.otherworldly.portal.2.body": "Заклинание арканного разлома позволяет мастеру связать два места и создать мост между ними. Всё, что попадает в один конец, появляется в другом, сохраняя свою скорость.",
"gui.unicopia.spellbook.chapter.otherworldly.mind_swap.1.body": "Продолжая исследования способностей чейнджлингов, я усовершенствовал его мимическое заклинание, добавив немного хаоса.",
"gui.unicopia.spellbook.chapter.otherworldly.mind_swap.2.body": "Обмен разумом распространяет действие мимики на двух личностей, фактически меняя их тела местами на ограниченное время.",
"gui.unicopia.spellbook.chapter.otherworldly.mind_swap.3.body": "* Добавив больше фокусировки, вы можете увеличить продолжительность заклинания.",
"gui.unicopia.spellbook.chapter.artefacts.p1.title": "Гл.7 - Артефакты",
"gui.unicopia.spellbook.chapter.artefacts.p2.title": "2-ое Мэйра 12-го",
"gui.unicopia.spellbook.chapter.artefacts.p2.1.body": "Далее следует сборник исследований некоторых объектов, представляющих интерес, выявленных в ходе моих исследований.",
"gui.unicopia.spellbook.chapter.artefacts.p2.2.body": "Не все из них дошли до конца, поскольку было доказано, что они либо чистая легенда, либо, возможно, мистификация, поэтому я не могу доверять их историям.",
"gui.unicopia.spellbook.chapter.artefacts.crystal_heart.1.body": "Созданный группой единорогов давным-давно, его происхождение и нынешнее местонахождение неизвестны.",
"gui.unicopia.spellbook.chapter.artefacts.crystal_heart.2.body": "В немногочисленных рассказах говорится, что это был мощный инструмент защиты и поддержки, поскольку он отводил жизненную силу от врагов в сторону заклинателя и его союзников.",
"gui.unicopia.spellbook.chapter.artefacts.crystal_heart.title": "5-ое Круптября 12-го",
"gui.unicopia.spellbook.chapter.artefacts.crystal_heart.3.body": "По другим сведениям, этот артефакт функционирует только тогда, когда установлен на специальном постаменте из алмазных блоков, как маяк.",
"gui.unicopia.spellbook.chapter.artefacts.torn_page.title": "Разорванная страница",
"gui.unicopia.spellbook.chapter.artefacts.torn_page.1.body": "§kПот§rенциальная в§kо§rз§kмож§rность для §kвыпендрёжа§r?",
"gui.unicopia.spellbook.chapter.artefacts.torn_page.2.body": "§kАвтор не придумал что тут написать, так что идите на§r",
"gui.unicopia.spellbook.chapter.artefacts.torn_page.3.body": "Требуемые материалы:",
"gui.unicopia.spellbook.chapter.artefacts.crystal_podium.title": "Кристальный подиум",
"gui.unicopia.spellbook.chapter.artefacts.altar.title": "Алтарь",
"gui.unicopia.spellbook.chapter.artefacts.altar.1.body": ре§kы§rний алтарь, соз§kда§rнный ранним п§kле§rменем §kединорог§rов. Считается, что они использовались для проведения р§kитуалов§r, выз§kываю§rщих ещё §kболее др§rевнюю маг§kию§r.",
"gui.unicopia.spellbook.chapter.artefacts.altar.2.body": "Не так много §kиз§rвестно об этих за§kг§rадочных сооружениях, и они хранят множество тайн даже по сей день.",
"gui.unicopia.spellbook.chapter.artefacts.altar.3.body": с§kполь§rзуй §kа§rлтарь",
"gui.unicopia.spellbook.chapter.artefacts.dragon_breath_scroll.2.body": "Это, эм, свиток который вы держите в одном копыте и что-то ещё в другом и, типо, происходит вуууш и предмет отправляется к пони.",
"gui.unicopia.spellbook.chapter.artefacts.dragon_breath_scroll.title": "2-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.artefacts.dragon_breath_scroll.3.body": "P.S. Дядюшка Старсвирли тупица.",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.1.body": "В прошлом этот браслет использовался заклинателями для связи на больших расстояниях, но уже давно утратил своё старое применение.",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.2.body": "Единороги могут подписать этот браслет и отдать другу чтобы поделиться определенными магическими эффектами с ним.",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.title": "13-ое Мэйра 12-го",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.3.body": "Тот, кто носит подписанный вами браслет, сможет воспользоваться положительными эффектами ваших заклинаний или пропустить через себя заклинания защиты и щита.",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.4.body": "Расходы маны также делятся поровну между всеми.",
"gui.unicopia.spellbook.chapter.artefacts.spectral_clock.title": "14-ое Мэйра 12-го",
"gui.unicopia.spellbook.chapter.artefacts.spectral_clock.1.body": "Не столько артефакт, сколько странная безделушка. На прошлой неделе Луна случайно принесла его домой с рынка, и хотя на первый взгляд это обычные сломанные часы, я обнаружил нечто гораздо более странное.",
"gui.unicopia.spellbook.chapter.artefacts.spectral_clock.2.body": "Эти часы не показывают время. Точнее, показывают, но не напрямую. Скорее, они следят за циклами некоторых растений в окружающем лесу.",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.1.body": "Командир Харрикейн сообщила мне об этом, хотя я не нашел ни одного текста, подтверждающего её утверждения.",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.2.body": "Утверждается, что амулет пегаса дарует владельцу временный полёт, как у пегаса.",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.title": "21-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.3.body": "Он предназначался в качестве помощника для первых послов единорогов в Облачные высоты, но был утерян после срыва переговоров.",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.1.body": "Предшественник магических посохов, посох Медоубрук - это вертикальная опорная конструкция, обычно используемая магами во время долгих заклинательных сессий.",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.2.body": "Он имеет извилистую форму с плотной и прочной сердцевиной, способной выдержать вес взрослого жеребца среднего роста.",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.title": "22-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.3.body": "Благодаря своей плотной структуре и горючести, этот предмет также может служить в качестве оружия и источника топлива, если того потребует ситуация.",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.4.body": "Чтобы правильно использовать посох в бою, нужно сначала взять его за узкий конец в оба копыта, а затем сделать стремительный взмах над головой с криком \"Фус Ро ДА!\".",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.1.body": "Являются магическими помощники для немагических пользователей. Магические посохи работают так же, как и рог единорога: с их помощью можно направлять и использовать магию, хранящуюся в самоцветах.",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.title": "22-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.2.body": "Не все заклинания действуют одинаково, но для которых действуют, хороший посох - незаменимый инструмент для любого начинающего мага.",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.3.body": "Самый простой способ создать их - надеть драгоценный камень на конец палки. Да, очень революционно, я знаю.",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.1.body": "Могущественный артефакт, который когда-то считался источником силы короля Грогара.",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.2.body": "В умелых копытах колокольчик может использоваться для передачи магической энергии от одного существа к другому.",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.title": "22-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.3.body": "Предполагается, что этот артефакт был выкован из когтей Большой Медведицы в эпоху правления Дискорда, возможно, в качестве оружия против тирана.",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.4.body": "По своей природе колокол обладает развращающим влиянием, которое разрушит разум любого, кто осмелится воспользоваться его силой.",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.2.title": "Колокольчик Грогара II",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.5.body": "Легенда гласит, что после того, как его первый носитель, король Грогар, был доведен до безумия, колокол упрятали далеко-далеко.",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.6.body": "Он находится за пределами досягаемости большинства пони, охраняемый в древнем городе непобедимым зверем.",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.1.body": "Как и о кристальном сердце, об этом артефакте мало что известно, поэтому ничего нельзя подтвердить, даже его существование.",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.title": "23-е Пониюля 12-го",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.2.body": "Амулет аликорна - это мощный источник тёмной магии, созданный неизвестным магом в попытке создать совершенное существо.",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.3.body": "Он сочетает в себе черты всех рас в одной мощной форме, но его трудно контролировать, и он вызывает привыкание. Любой, кто использует его, быстро становится зависимым от него, и лишь немногие, кто пытался избавиться от него, выдерживают это испытание.",
"gui.unicopia.action.spells_cleared": "Удалены все заклинания", "gui.unicopia.action.spells_cleared": "Удалены все заклинания",
"gui.unicopia.action.no_spells_cleared": "У вас нет активных заклинаний", "gui.unicopia.action.no_spells_cleared": "У вас нет активных заклинаний",
"chapter.unicopia.crafting": "Создание заклинаний", "chapter.unicopia.crafting": "Создание заклинаний",
"chapter.unicopia.profile": "Профиль", "chapter.unicopia.profile": "Профиль",
"chapter.unicopia.traits": "Исследование", "chapter.unicopia.traits": "Исследования",
"chapter.unicopia.introduction": "Введение", "chapter.unicopia.introduction": "Введение",
"chapter.unicopia.fire_magic": "Магия Огня", "chapter.unicopia.fire_magic": "Магия огня",
"chapter.unicopia.ice_magic": "Магия Льда", "chapter.unicopia.ice_magic": "Магия льда",
"chapter.unicopia.air_magic": "Магия Воздуха", "chapter.unicopia.air_magic": "Магия воздуха",
"chapter.unicopia.dark_magic": "Тёмная магия", "chapter.unicopia.dark_magic": "Тёмная магия",
"chapter.unicopia.the_otherworldly": "Запретная магия", "chapter.unicopia.the_otherworldly": "Запретная магия",
"chapter.unicopia.crystal_heart": "Артефакты", "chapter.unicopia.crystal_heart": "Артефакты",
@ -838,7 +1283,7 @@
"key.unicopia.hud_page_dn": "Предыдущая страница", "key.unicopia.hud_page_dn": "Предыдущая страница",
"key.unicopia.hud_page_up": "Следующая страница", "key.unicopia.hud_page_up": "Следующая страница",
"enchantment.unicopia.gem_finder": "Поиск драгоценных камней", "enchantment.unicopia.gem_finder": "Поиск самоцветов",
"enchantment.unicopia.padded": "Мягкость", "enchantment.unicopia.padded": "Мягкость",
"enchantment.unicopia.clingy": "Цепление", "enchantment.unicopia.clingy": "Цепление",
"enchantment.unicopia.repulsion": "Отталкивание", "enchantment.unicopia.repulsion": "Отталкивание",

View file

@ -8,21 +8,21 @@
"ability.unicopia.empty_hooves": "我需要一个罐子", "ability.unicopia.empty_hooves": "我需要一个罐子",
"ability.unicopia.indoors": "这里看不见天空", "ability.unicopia.indoors": "这里看不见天空",
"ability.unicopia.too_low": "我得再走高点", "ability.unicopia.too_low": "我得去更高一点的地方",
"ability.unicopia.clear_skies": "天空已经很干净了", "ability.unicopia.clear_skies": "天空已经很晴朗了",
"ability.unicopia.too_calm.1": "我得更生气一点……", "ability.unicopia.too_calm.1": "我得更生气一点……",
"ability.unicopia.too_calm.2": "我不觉得生气……", "ability.unicopia.too_calm.2": "我不觉得生气……",
"ability.unicopia.too_calm.3": "布鲁斯这样做的时候看起来挺轻松的……", "ability.unicopia.too_calm.3": "李小龙这样做的时候看起来挺简单的……",
"ability.unicopia.too_calm.4": "大公主予我力量……", "ability.unicopia.too_calm.4": "大公主予我力量……",
"itemGroup.unicopia.items": "奇幻小马国 - 综合", "itemGroup.unicopia.items": "奇幻小马国",
"itemGroup.unicopia.foraging": "奇幻小马国 - 觅食", "itemGroup.unicopia.foraging": "奇幻小马国 - 觅食",
"itemGroup.unicopia.earth_pony": "奇幻小马国 - 小马镇", "itemGroup.unicopia.earth_pony": "奇幻小马国 - 小马镇",
"itemGroup.unicopia.unicorn": "奇幻小马国 - 坎特洛特", "itemGroup.unicopia.unicorn": "奇幻小马国 - 坎特洛特",
"itemGroup.unicopia.pegasus": "奇幻小马国 - 云中城", "itemGroup.unicopia.pegasus": "奇幻小马国 - 云中城",
"itemGroup.unicopia.bat_pony": "奇幻小马国 - 林阴镇", "itemGroup.unicopia.bat_pony": "奇幻小马国 - 林阴镇",
"itemGroup.unicopia.sea_pony": "奇幻小马国 - 来自深海", "itemGroup.unicopia.sea_pony": "奇幻小马国 - 来自深海",
"itemGroup.unicopia.changeling": "奇幻小马国 - 幻形虫巢", "itemGroup.unicopia.changeling": "奇幻小马国 - 幻形灵王国",
"item.unicopia.friendship_bracelet": "联谊手环", "item.unicopia.friendship_bracelet": "联谊手环",
"item.unicopia.friendship_bracelet.issuer": "上面写着 %s 的名字", "item.unicopia.friendship_bracelet.issuer": "上面写着 %s 的名字",
@ -33,7 +33,7 @@
"item.unicopia.birch_basket": "白桦木篮", "item.unicopia.birch_basket": "白桦木篮",
"item.unicopia.jungle_basket": "丛林木篮", "item.unicopia.jungle_basket": "丛林木篮",
"item.unicopia.acacia_basket": "金合欢木篮", "item.unicopia.acacia_basket": "金合欢木篮",
"item.unicopia.cherry_basket": "樱木篮", "item.unicopia.cherry_basket": "樱木篮",
"item.unicopia.dark_oak_basket": "深色橡木篮", "item.unicopia.dark_oak_basket": "深色橡木篮",
"item.unicopia.mangrove_basket": "红木篮", "item.unicopia.mangrove_basket": "红木篮",
"item.unicopia.bamboo_basket": "竹篮", "item.unicopia.bamboo_basket": "竹篮",
@ -44,8 +44,11 @@
"item.unicopia.palm_chest_boat": "棕榈木运输船", "item.unicopia.palm_chest_boat": "棕榈木运输船",
"item.unicopia.spellbook": "魔法书", "item.unicopia.spellbook": "魔法书",
"item.unicopia.spectral_clock": "节律钟",
"emi.category.unicopia.spellbook": "魔法书", "emi.category.unicopia.spellbook": "魔法书",
"emi.category.unicopia.cloud_shaping": "塑形", "emi.category.unicopia.cloud_shaping": "塑形",
"emi.category.unicopia.growing": "生长",
"item.unicopia.alicorn_badge": "天角兽徽章", "item.unicopia.alicorn_badge": "天角兽徽章",
"item.unicopia.unicorn_badge": "独角兽徽章", "item.unicopia.unicorn_badge": "独角兽徽章",
@ -69,6 +72,7 @@
"item.unicopia.zap_apple": "魔虹苹果", "item.unicopia.zap_apple": "魔虹苹果",
"item.unicopia.zap_bulb": "没熟的魔虹苹果", "item.unicopia.zap_bulb": "没熟的魔虹苹果",
"item.unicopia.plunder_vine": "掠夺之藤",
"item.unicopia.love_bottle": "一瓶爱", "item.unicopia.love_bottle": "一瓶爱",
"item.unicopia.love_bucket": "爱桶", "item.unicopia.love_bucket": "爱桶",
"item.unicopia.love_mug": "一杯爱", "item.unicopia.love_mug": "一杯爱",
@ -87,20 +91,20 @@
"item.unicopia.crystal_heart": "水晶之心", "item.unicopia.crystal_heart": "水晶之心",
"item.unicopia.crystal_shard": "水晶碎片", "item.unicopia.crystal_shard": "水晶碎片",
"item.unicopia.dragon_breath_scroll": "龙息卷轴", "item.unicopia.dragon_breath_scroll": "龙息卷轴",
"item.unicopia.gemstone": "平凡的 石", "item.unicopia.gemstone": "平凡的 石",
"item.unicopia.gemstone.enchanted": "%s 石", "item.unicopia.gemstone.enchanted": "%s 石",
"item.unicopia.gemstone.obfuscated": "不凡的 石", "item.unicopia.gemstone.obfuscated": "不凡的 石",
"item.unicopia.botched_gem": "报废的 石", "item.unicopia.botched_gem": "报废的 石",
"item.unicopia.pegasus_feather": "天马的羽毛", "item.unicopia.pegasus_feather": "天马的羽毛",
"item.unicopia.gryphon_feather": "狮鹫的羽毛", "item.unicopia.gryphon_feather": "狮鹫的羽毛",
"item.unicopia.golden_feather": "金色羽毛", "item.unicopia.golden_feather": "金色羽毛",
"item.unicopia.golden_wing": "金色翅膀", "item.unicopia.golden_wing": "金色翅膀",
"item.unicopia.mug": "", "item.unicopia.mug": "马克杯",
"item.unicopia.cider": "苹果酒", "item.unicopia.cider": "苹果酒",
"item.unicopia.juice": "果汁", "item.unicopia.juice": "果汁",
"item.unicopia.burned_juice": "烧的果汁", "item.unicopia.burned_juice": "烧的果汁",
"item.unicopia.mango": "芒果", "item.unicopia.mango": "芒果",
"item.unicopia.banana": "香蕉", "item.unicopia.banana": "香蕉",
@ -148,7 +152,7 @@
"item.unicopia.alicorn_amulet.lore": "佩戴时长: %d", "item.unicopia.alicorn_amulet.lore": "佩戴时长: %d",
"item.unicopia.pearl_necklace": "珍珠项链", "item.unicopia.pearl_necklace": "珍珠项链",
"item.unicopia.pearl_necklace.lore": "予佩带者水下活动的能力", "item.unicopia.pearl_necklace.lore": "予佩带者水下活动的能力",
"item.unicopia.clam_shell": "蛤蜊壳", "item.unicopia.clam_shell": "蛤蜊壳",
"item.unicopia.scallop_shell": "扇贝壳", "item.unicopia.scallop_shell": "扇贝壳",
"item.unicopia.turret_shell": "锥螺壳", "item.unicopia.turret_shell": "锥螺壳",
@ -273,8 +277,8 @@
"block.unicopia.sour_apple_sprout": "酸苹果树嫩芽", "block.unicopia.sour_apple_sprout": "酸苹果树嫩芽",
"block.unicopia.surface_chitin": "几丁质表面", "block.unicopia.surface_chitin": "几丁质表面",
"block.unicopia.mysterious_egg": "奇怪的", "block.unicopia.mysterious_egg": "奇怪的",
"block.unicopia.hive": "巢", "block.unicopia.hive": "巢",
"block.unicopia.slime_pustule": "黏液泡", "block.unicopia.slime_pustule": "黏液泡",
"block.unicopia.chitin": "几丁质块", "block.unicopia.chitin": "几丁质块",
"block.unicopia.chitin_spikes": "几丁质尖刺", "block.unicopia.chitin_spikes": "几丁质尖刺",
@ -320,8 +324,8 @@
"block.unicopia.dark_oak_stable_door": "木马厩门", "block.unicopia.dark_oak_stable_door": "木马厩门",
"block.unicopia.oats": "燕麦", "block.unicopia.oats": "燕麦",
"block.unicopia.oats_stem": "燕麦", "block.unicopia.oats_stem": "燕麦",
"block.unicopia.oats_crown": "燕麦", "block.unicopia.oats_crown": "燕麦",
"entity.unicopia.butterfly": "蝴蝶", "entity.unicopia.butterfly": "蝴蝶",
"entity.unicopia.twittermite": "雷光虫", "entity.unicopia.twittermite": "雷光虫",
@ -348,7 +352,7 @@
"effect.unicopia.food_poisoning": "食物中毒", "effect.unicopia.food_poisoning": "食物中毒",
"effect.unicopia.sun_blindness": "日光袭眼", "effect.unicopia.sun_blindness": "日光袭眼",
"effect.unicopia.corrupt_influence": "堕落之力", "effect.unicopia.corrupt_influence": "堕落之力",
"effect.unicopia.paralysis": "腿", "effect.unicopia.paralysis": "腿乏",
"effect.unicopia.butter_fingers": "手滑", "effect.unicopia.butter_fingers": "手滑",
"effect.unicopia.change_race_earth": "转生陆马", "effect.unicopia.change_race_earth": "转生陆马",
@ -359,13 +363,13 @@
"effect.unicopia.change_race_kirin": "转生麒麟", "effect.unicopia.change_race_kirin": "转生麒麟",
"effect.unicopia.change_race_hippogriff": "转生骏鹰", "effect.unicopia.change_race_hippogriff": "转生骏鹰",
"effect.unicopia.morph_race_earth": "变陆马", "effect.unicopia.morph_race_earth": "变陆马",
"effect.unicopia.morph_race_unicopia": "变独角兽", "effect.unicopia.morph_race_unicopia": "变独角兽",
"effect.unicopia.morph_race_pegasus": "变天马", "effect.unicopia.morph_race_pegasus": "变天马",
"effect.unicopia.morph_race_changeling": "变幻形灵", "effect.unicopia.morph_race_changeling": "变幻形灵",
"effect.unicopia.morph_race_bat": "变夜骐", "effect.unicopia.morph_race_bat": "变夜骐",
"effect.unicopia.morph_race_kirin": "变麒麟", "effect.unicopia.morph_race_kirin": "变麒麟",
"effect.unicopia.morph_race_hippogriff": "变骏鹰", "effect.unicopia.morph_race_hippogriff": "变骏鹰",
"item.minecraft.potion.effect.unicopia.tribe_swap_earth": "转生陆马药水", "item.minecraft.potion.effect.unicopia.tribe_swap_earth": "转生陆马药水",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_earth": "喷溅型转生陆马药水", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_earth": "喷溅型转生陆马药水",
@ -402,81 +406,81 @@
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_hippogriff": "滞留型转生骏鹰药水", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_hippogriff": "滞留型转生骏鹰药水",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_hippogriff": "转生骏鹰之箭", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_hippogriff": "转生骏鹰之箭",
"item.minecraft.potion.effect.unicopia.short_morph_earth": "短效变陆马药水", "item.minecraft.potion.effect.unicopia.short_morph_earth": "短效变陆马药水",
"item.minecraft.splash_potion.effect.unicopia.short_morph_earth": "喷溅型短效变陆马药水", "item.minecraft.splash_potion.effect.unicopia.short_morph_earth": "喷溅型短效变陆马药水",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_earth": "滞留型短效变陆马药水", "item.minecraft.lingering_potion.effect.unicopia.short_morph_earth": "滞留型短效变陆马药水",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_earth": "短效变陆马之箭", "item.minecraft.tipped_arrow.effect.unicopia.short_morph_earth": "短效变陆马之箭",
"item.minecraft.potion.effect.unicopia.short_morph_unicorn": "短效变独角兽药水", "item.minecraft.potion.effect.unicopia.short_morph_unicorn": "短效变独角兽药水",
"item.minecraft.splash_potion.effect.unicopia.short_morph_unicorn": "喷溅型短效变独角兽药水", "item.minecraft.splash_potion.effect.unicopia.short_morph_unicorn": "喷溅型短效变独角兽药水",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_unicorn": "滞留型短效变独角兽药水", "item.minecraft.lingering_potion.effect.unicopia.short_morph_unicorn": "滞留型短效变独角兽药水",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_unicorn": "短效变独角兽之箭", "item.minecraft.tipped_arrow.effect.unicopia.short_morph_unicorn": "短效变独角兽之箭",
"item.minecraft.potion.effect.unicopia.short_morph_pegasus": "短效变天马药水", "item.minecraft.potion.effect.unicopia.short_morph_pegasus": "短效变天马药水",
"item.minecraft.splash_potion.effect.unicopia.short_morph_pegasus": "喷溅型短效变天马药水", "item.minecraft.splash_potion.effect.unicopia.short_morph_pegasus": "喷溅型短效变天马药水",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_pegasus": "滞留型短效变天马药水", "item.minecraft.lingering_potion.effect.unicopia.short_morph_pegasus": "滞留型短效变天马药水",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_pegasus": "短效变天马之箭", "item.minecraft.tipped_arrow.effect.unicopia.short_morph_pegasus": "短效变天马之箭",
"item.minecraft.potion.effect.unicopia.short_morph_changeling": "短效变幻形灵药水", "item.minecraft.potion.effect.unicopia.short_morph_changeling": "短效变幻形灵药水",
"item.minecraft.splash_potion.effect.unicopia.short_morph_changeling": "喷溅型短效变幻形灵药水", "item.minecraft.splash_potion.effect.unicopia.short_morph_changeling": "喷溅型短效变幻形灵药水",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_changeling": "滞留型短效变幻形灵药水", "item.minecraft.lingering_potion.effect.unicopia.short_morph_changeling": "滞留型短效变幻形灵药水",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_changeling": "短效变幻形灵之箭", "item.minecraft.tipped_arrow.effect.unicopia.short_morph_changeling": "短效变幻形灵之箭",
"item.minecraft.potion.effect.unicopia.short_morph_bat": "短效变夜骐药水", "item.minecraft.potion.effect.unicopia.short_morph_bat": "短效变夜骐药水",
"item.minecraft.splash_potion.effect.unicopia.short_morph_bat": "喷溅型短效变夜骐药水", "item.minecraft.splash_potion.effect.unicopia.short_morph_bat": "喷溅型短效变夜骐药水",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_bat": "滞留型短效变夜骐药水", "item.minecraft.lingering_potion.effect.unicopia.short_morph_bat": "滞留型短效变夜骐药水",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_bat": "短效变夜骐之箭", "item.minecraft.tipped_arrow.effect.unicopia.short_morph_bat": "短效变夜骐之箭",
"item.minecraft.potion.effect.unicopia.short_morph_kirin": "短效变麒麟药水", "item.minecraft.potion.effect.unicopia.short_morph_kirin": "短效变麒麟药水",
"item.minecraft.splash_potion.effect.unicopia.short_morph_kirin": "喷溅型短效变麒麟药水", "item.minecraft.splash_potion.effect.unicopia.short_morph_kirin": "喷溅型短效变麒麟药水",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_kirin": "滞留型短效变麒麟药水", "item.minecraft.lingering_potion.effect.unicopia.short_morph_kirin": "滞留型短效变麒麟药水",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_kirin": "短效变麒麟之箭", "item.minecraft.tipped_arrow.effect.unicopia.short_morph_kirin": "短效变麒麟之箭",
"item.minecraft.potion.effect.unicopia.short_morph_hippogriff": "短效变骏鹰药水", "item.minecraft.potion.effect.unicopia.short_morph_hippogriff": "短效变骏鹰药水",
"item.minecraft.splash_potion.effect.unicopia.short_morph_hippogriff": "喷溅型短效变骏鹰药水", "item.minecraft.splash_potion.effect.unicopia.short_morph_hippogriff": "喷溅型短效变骏鹰药水",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_hippogriff": "滞留型短效变骏鹰药水", "item.minecraft.lingering_potion.effect.unicopia.short_morph_hippogriff": "滞留型短效变骏鹰药水",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_hippogriff": "短效变骏鹰之箭", "item.minecraft.tipped_arrow.effect.unicopia.short_morph_hippogriff": "短效变骏鹰之箭",
"item.minecraft.potion.effect.unicopia.long_morph_earth": "长效变陆马药水", "item.minecraft.potion.effect.unicopia.long_morph_earth": "长效变陆马药水",
"item.minecraft.splash_potion.effect.unicopia.long_morph_earth": "喷溅型长效变陆马药水", "item.minecraft.splash_potion.effect.unicopia.long_morph_earth": "喷溅型长效变陆马药水",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_earth": "滞留型长效变陆马药水", "item.minecraft.lingering_potion.effect.unicopia.long_morph_earth": "滞留型长效变陆马药水",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_earth": "长效变陆马之箭", "item.minecraft.tipped_arrow.effect.unicopia.long_morph_earth": "长效变陆马之箭",
"item.minecraft.potion.effect.unicopia.long_morph_unicorn": "长效变独角兽药水", "item.minecraft.potion.effect.unicopia.long_morph_unicorn": "长效变独角兽药水",
"item.minecraft.splash_potion.effect.unicopia.long_morph_unicorn": "喷溅型长效变独角兽药水", "item.minecraft.splash_potion.effect.unicopia.long_morph_unicorn": "喷溅型长效变独角兽药水",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_unicorn": "滞留型长效变独角兽药水", "item.minecraft.lingering_potion.effect.unicopia.long_morph_unicorn": "滞留型长效变独角兽药水",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_unicorn": "长效变独角兽之箭", "item.minecraft.tipped_arrow.effect.unicopia.long_morph_unicorn": "长效变独角兽之箭",
"item.minecraft.potion.effect.unicopia.long_morph_pegasus": "长效变天马药水", "item.minecraft.potion.effect.unicopia.long_morph_pegasus": "长效变天马药水",
"item.minecraft.splash_potion.effect.unicopia.long_morph_pegasus": "喷溅型长效变天马药水", "item.minecraft.splash_potion.effect.unicopia.long_morph_pegasus": "喷溅型长效变天马药水",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_pegasus": "滞留型长效变天马药水", "item.minecraft.lingering_potion.effect.unicopia.long_morph_pegasus": "滞留型长效变天马药水",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_pegasus": "长效变天马之箭", "item.minecraft.tipped_arrow.effect.unicopia.long_morph_pegasus": "长效变天马之箭",
"item.minecraft.potion.effect.unicopia.long_morph_changeling": "长效变幻形灵药水", "item.minecraft.potion.effect.unicopia.long_morph_changeling": "长效变幻形灵药水",
"item.minecraft.splash_potion.effect.unicopia.long_morph_changeling": "喷溅型长效变幻形灵药水", "item.minecraft.splash_potion.effect.unicopia.long_morph_changeling": "喷溅型长效变幻形灵药水",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_changeling": "滞留型长效变幻形灵药水", "item.minecraft.lingering_potion.effect.unicopia.long_morph_changeling": "滞留型长效变幻形灵药水",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_changeling": "长效变幻形灵之箭", "item.minecraft.tipped_arrow.effect.unicopia.long_morph_changeling": "长效变幻形灵之箭",
"item.minecraft.potion.effect.unicopia.long_morph_bat": "长效变夜骐药水", "item.minecraft.potion.effect.unicopia.long_morph_bat": "长效变夜骐药水",
"item.minecraft.splash_potion.effect.unicopia.long_morph_bat": "喷溅型长效变夜骐药水", "item.minecraft.splash_potion.effect.unicopia.long_morph_bat": "喷溅型长效变夜骐药水",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_bat": "滞留型长效变夜骐药水", "item.minecraft.lingering_potion.effect.unicopia.long_morph_bat": "滞留型长效变夜骐药水",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_bat": "长效变夜骐之箭", "item.minecraft.tipped_arrow.effect.unicopia.long_morph_bat": "长效变夜骐之箭",
"item.minecraft.potion.effect.unicopia.long_morph_kirin": "长效变麒麟药水", "item.minecraft.potion.effect.unicopia.long_morph_kirin": "长效变麒麟药水",
"item.minecraft.splash_potion.effect.unicopia.long_morph_kirin": "喷溅型长效变麒麟药水", "item.minecraft.splash_potion.effect.unicopia.long_morph_kirin": "喷溅型长效变麒麟药水",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_kirin": "滞留型长效变麒麟药水", "item.minecraft.lingering_potion.effect.unicopia.long_morph_kirin": "滞留型长效变麒麟药水",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_kirin": "长效变麒麟之箭", "item.minecraft.tipped_arrow.effect.unicopia.long_morph_kirin": "长效变麒麟之箭",
"item.minecraft.potion.effect.unicopia.long_morph_hippogriff": "长效变骏鹰药水", "item.minecraft.potion.effect.unicopia.long_morph_hippogriff": "长效变骏鹰药水",
"item.minecraft.splash_potion.effect.unicopia.long_morph_hippogriff": "喷溅型长效变骏鹰药水", "item.minecraft.splash_potion.effect.unicopia.long_morph_hippogriff": "喷溅型长效变骏鹰药水",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_hippogriff": "滞留型长效变骏鹰药水", "item.minecraft.lingering_potion.effect.unicopia.long_morph_hippogriff": "滞留型长效变骏鹰药水",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_hippogriff": "长效变骏鹰之箭", "item.minecraft.tipped_arrow.effect.unicopia.long_morph_hippogriff": "长效变骏鹰之箭",
"potion.withChance": "%s 分之 1 的概率为 %s", "potion.withChance": "%s 分之 1 的概率为 %s",
"potion.potency.6": "VII", "potion.potency.6": "VII",
"spell.unicopia.frost": "霜冻", "spell.unicopia.frost": "霜冻",
"spell.unicopia.frost.lore": "触感发冷,这颗石会以雪覆盖它作用于的任何东西", "spell.unicopia.frost.lore": "触感发冷,这颗石会以雪覆盖它作用于的任何东西",
"spell.unicopia.hydrophobic": "排水", "spell.unicopia.hydrophobic": "排水",
"spell.unicopia.hydrophobic.lore": "在使用者周围产生一个保护性空腔,防止水进入", "spell.unicopia.hydrophobic.lore": "在使用者周围产生一个保护性空腔,防止水进入",
"spell.unicopia.chilling_breath": "凛冽之息", "spell.unicopia.chilling_breath": "凛冽之息",
@ -484,7 +488,7 @@
"spell.unicopia.scorch": "灼烧", "spell.unicopia.scorch": "灼烧",
"spell.unicopia.scorch.lore": "触感温暖,可以点燃有机物", "spell.unicopia.scorch.lore": "触感温暖,可以点燃有机物",
"spell.unicopia.flame": "火焰", "spell.unicopia.flame": "火焰",
"spell.unicopia.flame.lore": "这颗石燃烧着神奇的火焰", "spell.unicopia.flame.lore": "这颗石燃烧着神奇的火焰",
"spell.unicopia.infernal": "地狱", "spell.unicopia.infernal": "地狱",
"spell.unicopia.infernal.lore": "召唤下界的精华来侵染这个世界", "spell.unicopia.infernal.lore": "召唤下界的精华来侵染这个世界",
"spell.unicopia.fire_bolt": "火焰镭射", "spell.unicopia.fire_bolt": "火焰镭射",
@ -493,7 +497,7 @@
"spell.unicopia.shield.lore": "在使用者周围施放一个保护盾", "spell.unicopia.shield.lore": "在使用者周围施放一个保护盾",
"spell.unicopia.bubble": "泡泡", "spell.unicopia.bubble": "泡泡",
"spell.unicopia.bubble.lore": "将它击中的任何生物困在泡泡中", "spell.unicopia.bubble.lore": "将它击中的任何生物困在泡泡中",
"spell.unicopia.arcane_protection": "奥术保护", "spell.unicopia.arcane_protection": "奥术拮抗",
"spell.unicopia.arcane_protection.lore": "创建一个保护罩,其中无法施放任何法术", "spell.unicopia.arcane_protection.lore": "创建一个保护罩,其中无法施放任何法术",
"spell.unicopia.vortex": "奥术吸引", "spell.unicopia.vortex": "奥术吸引",
"spell.unicopia.vortex.lore": "产生吸力,以吸引其它目标", "spell.unicopia.vortex.lore": "产生吸力,以吸引其它目标",
@ -505,7 +509,7 @@
"spell.unicopia.mind_swap.lore": "暂时将施法者的意识交换到另一个实体或玩家的身体中", "spell.unicopia.mind_swap.lore": "暂时将施法者的意识交换到另一个实体或玩家的身体中",
"spell.unicopia.displacement": "换位", "spell.unicopia.displacement": "换位",
"spell.unicopia.displacement.lore": "将施法者的位置与另一个实体的位置交换", "spell.unicopia.displacement.lore": "将施法者的位置与另一个实体的位置交换",
"spell.unicopia.portal": "奥术裂", "spell.unicopia.portal": "奥术裂",
"spell.unicopia.portal.lore": "连接空间中的两个点,在其之间快速旅行", "spell.unicopia.portal.lore": "连接空间中的两个点,在其之间快速旅行",
"spell.unicopia.necromancy": "亡灵召唤", "spell.unicopia.necromancy": "亡灵召唤",
"spell.unicopia.necromancy.lore": "从阴间召唤亡灵爪牙", "spell.unicopia.necromancy.lore": "从阴间召唤亡灵爪牙",
@ -517,8 +521,8 @@
"spell.unicopia.light.lore": "召唤多个小光球跟随施法者", "spell.unicopia.light.lore": "召唤多个小光球跟随施法者",
"spell.unicopia.awkward": "拙劣", "spell.unicopia.awkward": "拙劣",
"spell.unicopia.awkward.lore": "不稳定的魔法", "spell.unicopia.awkward.lore": "不稳定的魔法",
"spell.unicopia.transformation": "变形", "spell.unicopia.transformation": "转化",
"spell.unicopia.transformation.lore": "将目标成其它东西", "spell.unicopia.transformation.lore": "将目标转化成其它东西",
"spell.unicopia.feather_fall": "缓降", "spell.unicopia.feather_fall": "缓降",
"spell.unicopia.feather_fall.lore": "减缓施法者和周围同伴的下落速度", "spell.unicopia.feather_fall.lore": "减缓施法者和周围同伴的下落速度",
"spell.unicopia.catapult": "击飞", "spell.unicopia.catapult": "击飞",
@ -527,13 +531,13 @@
"spell.unicopia.dispel_evil.lore": "驱散附近的任何邪恶力量。", "spell.unicopia.dispel_evil.lore": "驱散附近的任何邪恶力量。",
"trait.unicopia.strength.name": "力量", "trait.unicopia.strength.name": "力量",
"trait.unicopia.strength.description": "赋予身体以力量或增强耐力。\n魔中的力量要素越多,其效果就越猛烈,越持久。", "trait.unicopia.strength.description": "赋予身体以力量或增强耐力。\n魔中的力量要素越多,其效果就越猛烈,越持久。",
"trait.unicopia.focus.name": "聚焦", "trait.unicopia.focus.name": "聚焦",
"trait.unicopia.focus.description": "对魔咒增压,以使其聚焦能量并提高效率。\n向魔咒中添加聚焦要素将会减少魔力消耗同时增广多目标型魔咒的范围,使之命中更多目标。", "trait.unicopia.focus.description": "对魔法增压,以使其聚焦能量并提高效率。\n向魔法中添加聚焦要素将会减少魔力消耗同时增广多目标型魔法的范围,使之命中更多目标。",
"trait.unicopia.knowledge.name": "知识", "trait.unicopia.knowledge.name": "知识",
"trait.unicopia.knowledge.description": "科学技术与机械结合诞生出了联合收割机。\n有些魔需要一些…创造力。", "trait.unicopia.knowledge.description": "科学技术与机械结合诞生出了联合收割机。\n有些魔需要一些…创造力。",
"trait.unicopia.power.name": "能量", "trait.unicopia.power.name": "能量",
"trait.unicopia.power.description": "强力驱动。\n延长或强化魔的持续时间。", "trait.unicopia.power.description": "强力驱动。\n延长或强化魔的持续时间。",
"trait.unicopia.blood.name": "血液", "trait.unicopia.blood.name": "血液",
"trait.unicopia.blood.description": "以血祭血之神。", "trait.unicopia.blood.description": "以血祭血之神。",
"trait.unicopia.water.name": "水", "trait.unicopia.water.name": "水",
@ -541,7 +545,7 @@
"trait.unicopia.earth.name": "地", "trait.unicopia.earth.name": "地",
"trait.unicopia.earth.description": "第二号自然元素。从地里出来的东西都蕴含着这种能量。", "trait.unicopia.earth.description": "第二号自然元素。从地里出来的东西都蕴含着这种能量。",
"trait.unicopia.fire.name": "火", "trait.unicopia.fire.name": "火",
"trait.unicopia.fire.description": "第三号自然元素。与气元素互相协同,让你的魔增更加炸裂。", "trait.unicopia.fire.description": "第三号自然元素。与气元素互相协同,让你的魔增更加炸裂。",
"trait.unicopia.air.name": "气", "trait.unicopia.air.name": "气",
"trait.unicopia.air.description": "第四号自然元素。", "trait.unicopia.air.description": "第四号自然元素。",
"trait.unicopia.ice.name": "冰", "trait.unicopia.ice.name": "冰",
@ -559,7 +563,7 @@
"trait.unicopia.kindness.name": "善良", "trait.unicopia.kindness.name": "善良",
"trait.unicopia.kindness.description": "与和谐之元和欢笑元素互相协同,没什么比把欢乐带到这个世上更棒的事了。", "trait.unicopia.kindness.description": "与和谐之元和欢笑元素互相协同,没什么比把欢乐带到这个世上更棒的事了。",
"trait.unicopia.generosity.name": "慷慨", "trait.unicopia.generosity.name": "慷慨",
"trait.unicopia.generosity.description": "施展利他魔咒。\n可以用于增加魔咒的范围和威力,但对施法者不利。\n\n与协律元素和善良元素互相协同。\n含有这种要素的魔适合用来支援朋友。", "trait.unicopia.generosity.description": "施展利他魔法。\n可以用于增加魔法的范围和威力,但对施法者不利。\n\n与协律元素和善良元素互相协同。\n含有这种要素的魔适合用来支援朋友。",
"trait.unicopia.rot.name": "腐坏", "trait.unicopia.rot.name": "腐坏",
"trait.unicopia.rot.description": "死亡与毁灭踏足了这个世界。一切都会消亡,一切都将消亡。这既是历史,也是未来。", "trait.unicopia.rot.description": "死亡与毁灭踏足了这个世界。一切都会消亡,一切都将消亡。这既是历史,也是未来。",
"trait.unicopia.life.name": "生命", "trait.unicopia.life.name": "生命",
@ -578,16 +582,16 @@
"tag.unicopia.food_types.rotten_meat": "腐烂的肉", "tag.unicopia.food_types.rotten_meat": "腐烂的肉",
"tag.unicopia.food_types.raw_meat": "新鲜的肉", "tag.unicopia.food_types.raw_meat": "新鲜的肉",
"tag.unicopia.food_types.cooked_meat": "处理好的肉", "tag.unicopia.food_types.cooked_meat": "好的肉",
"tag.unicopia.food_types.raw_fish": "新鲜的鱼", "tag.unicopia.food_types.raw_fish": "新鲜的鱼",
"tag.unicopia.food_types.cooked_fish": "处理好的鱼", "tag.unicopia.food_types.cooked_fish": "好的鱼",
"tag.unicopia.food_types.raw_insect": "虫类", "tag.unicopia.food_types.raw_insect": "虫类",
"tag.unicopia.food_types.cooked_insect": "烤虫类", "tag.unicopia.food_types.cooked_insect": "烤虫类",
"tag.unicopia.food_types.love": "爱", "tag.unicopia.food_types.love": "爱",
"tag.unicopia.food_types.rocks": "石块", "tag.unicopia.food_types.rocks": "石块",
"tag.unicopia.food_types.pinecone": "坚果和种子", "tag.unicopia.food_types.pinecone": "坚果和种子",
"tag.unicopia.food_types.bat_ponys_delight": "夜骐的处理", "tag.unicopia.food_types.bat_ponys_delight": "夜骐乐食",
"tag.unicopia.food_types.cooked_sea_vegitables": "处理好的鱼类食物", "tag.unicopia.food_types.cooked_sea_vegitables": "好的鱼类食物",
"tag.unicopia.food_types.raw_sea_vegitables": "新鲜的鱼类食物", "tag.unicopia.food_types.raw_sea_vegitables": "新鲜的鱼类食物",
"tag.unicopia.food_types.shells": "海贝", "tag.unicopia.food_types.shells": "海贝",
"tag.unicopia.food_types.shelly": "海贝", "tag.unicopia.food_types.shelly": "海贝",
@ -616,24 +620,24 @@
"affliction.unicopia.empty": "无效果", "affliction.unicopia.empty": "无效果",
"affliction.unicopia.healing": "获得 %s%% 点生命值", "affliction.unicopia.healing": "获得 %s%% 点生命值",
"affliction.unicopia.cure_love_sickness": "治愈爱的病", "affliction.unicopia.cure_love_sickness": "治愈爱的病",
"affliction.unicopia.lose_hunger": "失去 %s%% 点饥饿值", "affliction.unicopia.lose_hunger": "失去 %s%% 点饥饿值",
"ability.unicopia.shoot": "发射魔法", "ability.unicopia.shoot": "发射魔法",
"ability.unicopia.shoot.with_spell": "发射 %s 魔", "ability.unicopia.shoot.with_spell": "发射 %s 魔",
"ability.unicopia.shoot.with_spell.active": "正在发射 %s 魔", "ability.unicopia.shoot.with_spell.active": "正在发射 %s 魔",
"ability.unicopia.shoot.with_spell.hand": "手持发射 %s 魔", "ability.unicopia.shoot.with_spell.hand": "手持发射 %s 魔",
"ability.unicopia.shoot.with_spell.replacing": "%s 魔咒已暂存,将优先发射 %s 魔咒", "ability.unicopia.shoot.with_spell.replacing": "%s 魔法已暂存,将优先发射 %s 魔法",
"ability.unicopia.cast": "原地施放魔法", "ability.unicopia.cast": "原地施放魔法",
"ability.unicopia.cast.with_spell": "原地施放 %s 魔", "ability.unicopia.cast.with_spell": "原地施放 %s 魔",
"ability.unicopia.cast.with_spell.active": "正在原地施放 %s 魔", "ability.unicopia.cast.with_spell.active": "正在原地施放 %s 魔",
"ability.unicopia.cast.with_spell.hand": "手持原地施放 %s 魔", "ability.unicopia.cast.with_spell.hand": "手持原地施放 %s 魔",
"ability.unicopia.cast.with_spell.replacing": "%s 魔咒已暂存,将优先原地施放 %s 魔咒", "ability.unicopia.cast.with_spell.replacing": "%s 魔法已暂存,将优先原地施放 %s 魔法",
"ability.unicopia.kirin_cast": "原地施放魔法", "ability.unicopia.kirin_cast": "原地施放魔法",
"ability.unicopia.kirin_cast.with_spell": "原地施放 %s 魔", "ability.unicopia.kirin_cast.with_spell": "原地施放 %s 魔",
"ability.unicopia.kirin_cast.with_spell.active": "正在原地施放 %s 魔", "ability.unicopia.kirin_cast.with_spell.active": "正在原地施放 %s 魔",
"ability.unicopia.kirin_cast.with_spell.hand": "手持原地施放 %s 魔", "ability.unicopia.kirin_cast.with_spell.hand": "手持原地施放 %s 魔",
"ability.unicopia.kirin_cast.with_spell.replacing": "%s 魔咒已暂存,将优先原地施放 %s 魔咒", "ability.unicopia.kirin_cast.with_spell.replacing": "%s 魔法已暂存,将优先原地施放 %s 魔法",
"ability.unicopia.dispell": "解除魔法", "ability.unicopia.dispell": "解除魔法",
"ability.unicopia.teleport": "瞬移", "ability.unicopia.teleport": "瞬移",
"ability.unicopia.teleport.far": "瞬移(穿墙)", "ability.unicopia.teleport.far": "瞬移(穿墙)",
@ -646,7 +650,7 @@
"ability.unicopia.pummel": "重蹄出击", "ability.unicopia.pummel": "重蹄出击",
"ability.unicopia.carry": "抱起/放下 乘客", "ability.unicopia.carry": "抱起/放下 乘客",
"ability.unicopia.toggle_flight": "起飞/降落", "ability.unicopia.toggle_flight": "起飞/降落",
"ability.unicopia.hang": "倒挂于天花板", "ability.unicopia.hang": "倒",
"ability.unicopia.eee": "尖叫", "ability.unicopia.eee": "尖叫",
"ability.unicopia.time_control": "控制 太阳/月亮", "ability.unicopia.time_control": "控制 太阳/月亮",
"ability.unicopia.feed": "吸取爱", "ability.unicopia.feed": "吸取爱",
@ -656,7 +660,7 @@
"ability.unicopia.rage": "发火", "ability.unicopia.rage": "发火",
"ability.unicopia.nirik_blast": "逆麟爆火", "ability.unicopia.nirik_blast": "逆麟爆火",
"ability.unicopia.screech": "尖啸", "ability.unicopia.screech": "尖啸",
"ability.unicopia.peck": "啄/鸣叫", "ability.unicopia.peck": "啄/鸣叫",
"ability.unicopia.peck.block.fled": "方块被吓跑了", "ability.unicopia.peck.block.fled": "方块被吓跑了",
"ability.unicopia.peck.block.unfased": "方块在你的威胁下仍泰然自若", "ability.unicopia.peck.block.unfased": "方块在你的威胁下仍泰然自若",
"ability.unicopia.dash": "飞行冲刺", "ability.unicopia.dash": "飞行冲刺",
@ -689,18 +693,18 @@
"gui.unicopia.tribe_selection.options.disabled": "选项不可用", "gui.unicopia.tribe_selection.options.disabled": "选项不可用",
"gui.unicopia.tribe_selection.describe.unicopia.earth": "加入陆马族", "gui.unicopia.tribe_selection.describe.unicopia.earth": "加入陆马族",
"gui.unicopia.tribe_selection.describe.unicopia.unicorn": "加入独角兽族,精通高阶魔法", "gui.unicopia.tribe_selection.describe.unicopia.unicorn": "加入独角兽族,精通奥术魔法",
"gui.unicopia.tribe_selection.describe.unicopia.pegasus": "加入天马族,与闪电天马一起翱翔", "gui.unicopia.tribe_selection.describe.unicopia.pegasus": "加入天马族,与闪电天马一起翱翔",
"gui.unicopia.tribe_selection.describe.unicopia.bat": "加入夜骐族,成为最黑暗的夜", "gui.unicopia.tribe_selection.describe.unicopia.bat": "加入夜骐族,成为最黑暗的夜",
"gui.unicopia.tribe_selection.describe.unicopia.kirin": "加入麒麟村,遵循沉默的誓言", "gui.unicopia.tribe_selection.describe.unicopia.kirin": "加入麒麟村,遵循沉默的誓言",
"gui.unicopia.tribe_selection.describe.unicopia.hippogriff": "加入骏鹰族,向你的邻居尖啸", "gui.unicopia.tribe_selection.describe.unicopia.hippogriff": "加入骏鹰族,向你的邻居尖啸",
"gui.unicopia.tribe_selection.describe.unicopia.changeling": "加入幻形灵蜂巢,你的女王需要你", "gui.unicopia.tribe_selection.describe.unicopia.changeling": "加入幻形灵王国,你的女王需要你",
"gui.unicopia.tribe_selection.confirm": "您已选择 %s", "gui.unicopia.tribe_selection.confirm": "您已选择 %s",
"gui.unicopia.tribe_selection.confirm.goods": "%s 拥有以下天赋:", "gui.unicopia.tribe_selection.confirm.goods": "%s 拥有以下天赋:",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.human": " - 是杂食动物,可以吃除了爱以外的所有食物", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.human": " - 是杂食动物,可以吃除了爱以外的所有食物",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.human": " - 对生拇指", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.human": " - 对生拇指",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.human": " - 直立行走", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.human": " - 直立行走",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.earth": " - 更强的击退力和魔抗力", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.earth": " - 更强的击退力和魔抗力",
@ -724,7 +728,7 @@
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.bat": " - 能够飞行,能通过训练提高耐力", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.bat": " - 能够飞行,能通过训练提高耐力",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.bat": " - 夜间看得更清楚", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.bat": " - 夜间看得更清楚",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.bat": " - 能够倒在方块底部", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.bat": " - 能够倒在方块底部",
"gui.unicopia.tribe_selection.confirm.goods.4.unicopia.bat": " - 有一种可怕但可爱,却仍然有点烦人的尖叫声", "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.bat": " - 有一种可怕但可爱,却仍然有点烦人的尖叫声",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.changeling": " - 能够在原地飞行和悬停", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.changeling": " - 能够在原地飞行和悬停",
@ -786,19 +790,377 @@
"gui.unicopia.tribe_selection.join": "加入种族", "gui.unicopia.tribe_selection.join": "加入种族",
"gui.unicopia.tribe_selection.cancel": "返回", "gui.unicopia.tribe_selection.cancel": "返回",
"gui.unicopia.spellbook.empty_spell_slot": "空的魔槽位", "gui.unicopia.spellbook.empty_spell_slot": "空的魔槽位",
"gui.unicopia.spellbook.page.inventory": "物品栏", "gui.unicopia.spellbook.page.inventory": "物品栏",
"gui.unicopia.spellbook.page.recipes": "魔配方", "gui.unicopia.spellbook.page.recipes": "魔配方",
"gui.unicopia.spellbook.page.recipes.empty": "已解锁 0 份魔配方", "gui.unicopia.spellbook.page.recipes.empty": "已解锁 0 份魔配方",
"gui.unicopia.spellbook.page.mana": "法力值", "gui.unicopia.spellbook.page.mana": "法力值",
"gui.unicopia.spellbook.page.level_requirement": "等级: %s",
"gui.unicopia.spellbook.page.requirements.entry.item": "- %1$sx %2$s", "gui.unicopia.spellbook.page.requirements.entry.item": "- %1$sx %2$s",
"gui.unicopia.spellbook.page.requirements.entry.trait": "- 至少 %1$sx %2$s 要素", "gui.unicopia.spellbook.page.requirements.entry.trait": "- 至少 %1$sx %2$s 要素",
"gui.unicopia.spellbook.page.requirements.entry.spell": "- %1$sx %2$s 石", "gui.unicopia.spellbook.page.requirements.entry.spell": "- %1$sx %2$s 石",
"gui.unicopia.action.spells_cleared": "移除所有的魔咒", "gui.unicopia.spellbook.recipe.requires": "需要:",
"gui.unicopia.action.no_spells_cleared": "你目前没有正在生效的魔咒", "gui.unicopia.spellbook.author1.sign_off": "奉公主圣旨",
"gui.unicopia.spellbook.author1.sign_off.b": "奉公主圣旨,附十分抱歉",
"gui.unicopia.spellbook.author1.name": "- 白胡子星璇",
"gui.unicopia.spellbook.author2.name": "- 森布拉 领主",
"gui.unicopia.spellbook.author3.name": "- XOXOX Lulu",
"gui.unicopia.spellbook.chapter.artefacts.status.unconfirmed": "目前状态:未知",
"gui.unicopia.spellbook.chapter.artefacts.status.confirmed": "目前状态:已确认",
"gui.unicopia.spellbook.chapter.artefacts.status.lost": "目前状态:失传",
"gui.unicopia.spellbook.chapter.introduction.p1.title": "前言",
"gui.unicopia.spellbook.chapter.introduction.p1.body": "无论谁持有这本书都要小心你所寻找的东西你可能不喜欢你找到的东西。§k致马国§r。",
"gui.unicopia.spellbook.chapter.introduction.p2.title": "第一章 小马国的魔法",
"gui.unicopia.spellbook.chapter.introduction.p2.body": "小马国充满了形形色色的魔法。然而在最近的事件之后很明显我们并不完全了解小马国世界的一切。这就是为什么公主让我研究各种形式的魔法所以我们可以利用它并且我希望能将我们从§k混沌的侵袭§r中拯救出来。",
"gui.unicopia.spellbook.chapter.introduction.p3.title": "1st Mare '12",
"gui.unicopia.spellbook.chapter.introduction.p3.1.body": "不寻常的石头",
"gui.unicopia.spellbook.chapter.introduction.p3.2.body": "当地小马所说的“晶石”,是世界各处常见的材料。农场小马一直在挖掘它们,并认为这是当地的美食,但我相信这些石头的能力比他们想象的要多得多。",
"gui.unicopia.spellbook.chapter.introduction.p4.title": "晶石",
"gui.unicopia.spellbook.chapter.introduction.p4.1.body": "我的研究尚未完成,但我可能偶然发现了一些东西。这些石头里具有很高的魔法潜能!比我以前见过的还要多!",
"gui.unicopia.spellbook.chapter.introduction.p4.2.body": "§m露娜想要—§r 我会继续尝试。祝我自己马到成功!如果我发现什么,我明天会通知你。",
"gui.unicopia.spellbook.chapter.introduction.p5.title": "2nd Mare '12",
"gui.unicopia.spellbook.chapter.introduction.p5.1.body": "我去,成功了! 圣 §k大公主的屁股脸蛋'§r 的确实奏效了,",
"gui.unicopia.spellbook.chapter.introduction.p5.2.body": "这太神奇了!这些可以做的比我想象的要多得多。想想我能给小马国带来的进步。晶石能源照明,加热,制冷,我再也不用在夏天坐着这个了——",
"gui.unicopia.spellbook.chapter.introduction.p5.3.body": "我正在超越自己。让我解释一下……",
"gui.unicopia.spellbook.chapter.introduction.p6.title": "魔法制作",
"gui.unicopia.spellbook.chapter.introduction.p6.1.body": "我在本书的开头画了一个指南来帮助你学习。",
"gui.unicopia.spellbook.chapter.introduction.p6.2.body": "将一颗原始晶石(它不能已经有魔法)放在中间,并在我标记的格中放置周围的材料。",
"gui.unicopia.spellbook.chapter.introduction.p6.3.body": "每种材料都会产生不同的效果,将材料靠得更近会增强它们对晶石的影响。",
"gui.unicopia.spellbook.chapter.introduction.p7.title": "3rd Mare '12",
"gui.unicopia.spellbook.chapter.introduction.p7.1.body": "我将开始记录我找到的魔法组合。其中一些非常明显,例如晶石+火=火晶石",
"gui.unicopia.spellbook.chapter.introduction.p7.2.body": "但有些东西不太清楚。例如,鸡蛋会给魔法增加哪些特性?需要进行大量实验。哦,我兴奋得头晕目眩!",
"gui.unicopia.spellbook.chapter.introduction.p8.title": "报废的晶石",
"gui.unicopia.spellbook.chapter.introduction.p8.1.body": "并非每种组合都有效。令马失望的是,现在我的房间里堆满了这些无用的石头。",
"gui.unicopia.spellbook.chapter.introduction.p8.2.body": "我不知道该怎么处理它们。它们没法吃,但当地小马不这么认为。",
"gui.unicopia.spellbook.chapter.introduction.p8.3.body": "它们仍然具有我赋予它们的要素,所以也许除了和小露娜一起建造岩石堡垒之外,我还能找到其他用途…",
"gui.unicopia.spellbook.chapter.introduction.p9.title": "13th Mare '12",
"gui.unicopia.spellbook.chapter.introduction.p9.1.body": "很抱歉我拖更了。我一直在努力研究不同的法术并决定要用什么方法。",
"gui.unicopia.spellbook.chapter.introduction.p9.2.body": "火系魔法非常有趣。火很容易获得。",
"gui.unicopia.spellbook.chapter.fire.p1.title": "第二章 火魔法",
"gui.unicopia.spellbook.chapter.fire.p2.title": "9th Jum '12",
"gui.unicopia.spellbook.chapter.fire.p2.1.body": "我花费的时间比预想中要长,都快一个月了,哈哈!但是,亲爱的读者,我向你隆重宣布,我发现了第一种元素魔法:火魔法。",
"gui.unicopia.spellbook.chapter.fire.p2.2.body": "暂时就这么叫,好吧?",
"gui.unicopia.spellbook.chapter.fire.scorch.1.body": "顾名思义,灼烧魔法就是用来灼烧的。通过赋予晶石火元素,可以让晶石发光和放热。",
"gui.unicopia.spellbook.chapter.fire.scorch.2.body": "你装填的火元素越多,晶石发光放热就越剧烈,但注意不要装过载了,不然它说不定什么时候就过火了。",
"gui.unicopia.spellbook.chapter.fire.flame.1.body": "对接触到的任何物体表面产生半径为3蹄的升温效果。",
"gui.unicopia.spellbook.chapter.fire.flame.2.body": "在急需用火或抵御风之魔时很有用。",
"gui.unicopia.spellbook.chapter.fire.p5.title": "10th Jum '12",
"gui.unicopia.spellbook.chapter.fire.p5.1.body": "有进展吗?",
"gui.unicopia.spellbook.chapter.fire.p5.2.body": "我成功地改进了先前的魔法,但还是缺点什么。一切都是有序且可预测的。",
"gui.unicopia.spellbook.chapter.fire.p5.3.body": "露娜建议我再加点火,但我可不想在塔楼上弄出更多烧焦的痕迹。要是让别的小马知道我在做什么的话,那就只能请浮士德保佑了…",
"gui.unicopia.spellbook.chapter.fire.p6.title": "火魔法 · 三",
"gui.unicopia.spellbook.chapter.fire.p6.1.body": "聚焦魔法",
"gui.unicopia.spellbook.chapter.fire.p6.2.body": "有些魔法通常需要精神高度集中才能施放,并且需要角稳的魔法师来控制,但我发现具有聚焦元素的物品可以很好地补充那些急躁法师所缺乏的专心。",
"gui.unicopia.spellbook.chapter.fire.p7.title": "火魔法 · 三(二)",
"gui.unicopia.spellbook.chapter.fire.p7.1.body": "任何你能找到的玻璃物品,如:眼珠、玻璃瓶,只要其中有透镜结构,都可以为魔法灌入聚焦要素。",
"gui.unicopia.spellbook.chapter.fire.p8.title": "片段2",
"gui.unicopia.spellbook.chapter.fire.p8.1.body": "我们今天去赶集了。要从塔楼里出来活动活动。露娜建议我们走近看看小马们在卖些什么,我同意了。",
"gui.unicopia.spellbook.chapter.fire.p8.2.body": "镇民们仍对我们持怀疑态度,不过谁也不能怪他们。至少露娜和其他的幼驹们相处得很好。",
"gui.unicopia.spellbook.chapter.fire.fire_bolt.1.body": "产生几束炽热的射线攻击目标。被击中的目标将被点燃。",
"gui.unicopia.spellbook.chapter.fire.fire_bolt.2.body": "- 增加聚焦要素能让弹道更准确。",
"gui.unicopia.spellbook.chapter.fire.fire_bolt.3.body": "- 当添加超过50个单位的聚焦要素时这些射线似乎会自己找准目标自瞄",
"gui.unicopia.spellbook.chapter.fire.p10.title": "火魔法 · 四",
"gui.unicopia.spellbook.chapter.fire.p10.1.body": "高能魔法",
"gui.unicopia.spellbook.chapter.fire.p10.2.body": "有些魔法需要聚焦,另一些则需要能量。使得其能加力或产生某些能量。",
"gui.unicopia.spellbook.chapter.fire.p10.3.body": "很少有独角兽有足够的能量来施放此类魔法,但好消息是我们身边并不缺乏能量要素。",
"gui.unicopia.spellbook.chapter.fire.p11.title": "火魔法 · 四(二)",
"gui.unicopia.spellbook.chapter.fire.p11.1.body": "源自地质构造的物体,如石头、金属和矿物,这些承受过重压的物体将会表现出力量元素。",
"gui.unicopia.spellbook.chapter.fire.p11.2.body": "和电有关的/导电的,可以用来驱动事物的物体,或者发光的东西也能提供能量要素。",
"gui.unicopia.spellbook.chapter.fire.p12.title": "11th Jum '12",
"gui.unicopia.spellbook.chapter.fire.p12.1.body": "今天有马来敲门。露娜很想去亲自接见,但我只能让她先去别的地方,因为来者是一位皇家信使。",
"gui.unicopia.spellbook.chapter.fire.p12.2.body": "我的研究似乎风评很差。皇室们很想知道我到底造了些什么。",
"gui.unicopia.spellbook.chapter.fire.p12.3.body": "他们自认为可以用我的研究成果在西线对抗。",
"gui.unicopia.spellbook.chapter.fire.p12.4.body": "他们决不能得逞。想到议会得到我的成果后会做些什么,我不禁打了个寒战。",
"gui.unicopia.spellbook.chapter.fire.p12.5.body": "补充",
"gui.unicopia.spellbook.chapter.fire.p12.6.body": "§m我听说皇室正下令研究这种法术的其它用途。用来…",
"gui.unicopia.spellbook.chapter.fire.p13.title": "20th Jum '12",
"gui.unicopia.spellbook.chapter.fire.p13.1.body": "我得到了皇室的消息。他们似乎很满意,至少目前是这样。而且同意了我在过冬时继续推进研究。",
"gui.unicopia.spellbook.chapter.fire.p13.2.body": "我不得不毁掉了最后的几条记录,我很害怕。",
"gui.unicopia.spellbook.chapter.fire.p14.title": "21st Jum '12",
"gui.unicopia.spellbook.chapter.fire.p14.1.body": "我明天应该去见 §k飓风司令§r。也许她能疏解我的困境。",
"gui.unicopia.spellbook.chapter.fire.shield.1.body": "学会施放护盾是每匹独角兽学习自卫的第一步。它用起来很简单,也是咒语入门的好切入点。",
"gui.unicopia.spellbook.chapter.fire.shield.2.body": "其缺点是消耗能量和精神力,不过我们可以用先前提到的方法,将消耗转接到晶石上。",
"gui.unicopia.spellbook.chapter.fire.shield.modifier.1": "+ 增加力量要素以扩大作用范围",
"gui.unicopia.spellbook.chapter.fire.p16.title": "保护 · 二",
"gui.unicopia.spellbook.chapter.fire.p16.1.body": "通过添加额外的要素,我能够对护盾进行微调,来控制特定群体能否进出护盾。",
"gui.unicopia.spellbook.chapter.fire.p16.2.body": "+ 添加生命元素 --> 所有动物可穿过\n+ 添加血液元素 --> 所有怪物可穿过\n+ 添加冰元素 --> 所有小马可穿过",
"gui.unicopia.spellbook.chapter.fire.p17.title": "保护 · 三",
"gui.unicopia.spellbook.chapter.fire.p17.1.body": "+ 添加慷慨元素,这样你就能将护盾放到你自己之外的地方",
"gui.unicopia.spellbook.chapter.fire.p18.title": "Scrap: 9th Jum '12",
"gui.unicopia.spellbook.chapter.fire.p18.1.body": "事实证明,火魔法有点…比我想得更不可预料。每次我感觉自己取得进展时,我都会莫名其妙地回到原点。",
"gui.unicopia.spellbook.chapter.fire.p18.2.body": "然而我现在不能停…我被告知西线那已经剑拔弩张了。它们让我快马加鞭搞出一些东西好让我们在与§k幻形灵风暴§r的战斗中占上风。",
"gui.unicopia.spellbook.chapter.ice.p1.title": "第三章 冰魔法",
"gui.unicopia.spellbook.chapter.ice.p2.title": "4th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p2.1.body": "这下有意思了。我承认这虽然很简单,但露娜一直喊我弄点冷东西帮我们度过这波热浪。",
"gui.unicopia.spellbook.chapter.ice.p2.2.body": "你只需要一颗晶石和某些冷的东西,比如雪球。",
"gui.unicopia.spellbook.chapter.ice.frost.1.body": "让半径三蹄内的物件表面凝上凛冽的气息。",
"gui.unicopia.spellbook.chapter.ice.frost.2.body": "直接从环境中剥夺物体的内能,使其性质剧变。",
"gui.unicopia.spellbook.chapter.ice.p4.title": "凛冽之息",
"gui.unicopia.spellbook.chapter.ice.p4.1.body": "使某些物体变得耐热。",
"gui.unicopia.spellbook.chapter.ice.p4.2.body": "这个魔法威力非常小,但是如果作用在船上,没准可以解决一些棘手情况。",
"gui.unicopia.spellbook.chapter.ice.p5.title": "5th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p5.1.body": "那些镇马昨晚肯定是开了场篝火晚会之类的,那会儿气味刺鼻,歌声婉转。",
"gui.unicopia.spellbook.chapter.ice.p5.2.body": "露娜,保佑她的心灵,一直喊我抽点时间陪她加入晚会。最后我被她从桌子边拽走了。",
"gui.unicopia.spellbook.chapter.ice.p5.3.body": "我还能说啥呢?她可是我心中的明灯啊。",
"gui.unicopia.spellbook.chapter.ice.p6.title": "篝火晚会",
"gui.unicopia.spellbook.chapter.ice.p6.1.body": "我们到达了篝火边,他们看到我们后的第一件事就是把一杯麦芽酒塞到我蹄上。我没喝,毕竟酒精对我来说可是个毒物,喝了会变成傻骡的。",
"gui.unicopia.spellbook.chapter.ice.p6.2.body": "露娜倒是挺享受篝火的,而且绝对没有偷喝麦芽酒!她几乎是立刻就和一匹镇里的小驹交上了朋友,那小驹应该是叫赛利还是啥的。她们玩了一整晚。",
"gui.unicopia.spellbook.chapter.ice.p7.title": "篝火晚会 · 二",
"gui.unicopia.spellbook.chapter.ice.p7.1.body": "在回去的路上,露娜和我讲起了她朋友告诉她的一些故事。这村里的传说挺多,这我倒是预料到了。",
"gui.unicopia.spellbook.chapter.ice.p7.2.body": "其中一个传说的主角是一个住在镇子边上一座闹鬼塔楼里的老术士。这老术士是谁我不必多说了。",
"gui.unicopia.spellbook.chapter.ice.p8.title": "6th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p8.1.body": "昨天晚上镇子里传来了一些奇怪的异响,非常奇怪的那种。我听到许多小马在大喊大叫,也许是失火了。",
"gui.unicopia.spellbook.chapter.ice.p8.2.body": "希望一切平安。",
"gui.unicopia.spellbook.chapter.ice.light.1.body": "给火焰镭射晶石加上些许生命与寒气,我创造了一种助力夜间视物的魔法。",
"gui.unicopia.spellbook.chapter.ice.light.2.body": "舞动之光将会召唤几个追随你的小光球。",
"gui.unicopia.spellbook.chapter.ice.light.modifier.1": "* 添加更多聚焦要素来延长魔法的作用时间",
"gui.unicopia.spellbook.chapter.ice.p10.title": "12th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p10.1.body": "昨晚的异响是越来越厉害了,而这次更近。整个镇子的气氛有所变化,很多曾经阳光向上的小马现在都变得郁郁寡欢了。",
"gui.unicopia.spellbook.chapter.ice.p10.2.body": "显然,有什么事正在发生,但是没有小马愿意告诉我。",
"gui.unicopia.spellbook.chapter.ice.p11.title": "15th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p11.1.body": "冬天就要来到,当我写下这些字时,最早一批的雪花已经从窗外落下来了。",
"gui.unicopia.spellbook.chapter.ice.p11.2.body": "当地马已经准备过冬了虽然总有些声音在抱怨那些被冻住的大地但总有些§k不太轻松的感觉§r。",
"gui.unicopia.spellbook.chapter.ice.p12.title": "17th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p12.1.body": "这儿的天气转变如此之快以至于把我惊到了。坎特城那边的天气管理做得很好,有了管控温度的魔法和天马辅助管理天气,我们甚至有时忘掉了大自然的狂野本性。",
"gui.unicopia.spellbook.chapter.ice.p12.2.body": "但这地方的陆马可享受不到那种奢华的待遇,他们得独自面对这变幻莫测的天气。",
"gui.unicopia.spellbook.chapter.ice.p13.title": "冻湖",
"gui.unicopia.spellbook.chapter.ice.p13.1.body": "就在今早,我在去集市的路上路过了塔楼山脚下的一个湖,那湖几乎是要全都冻上了。有几只小驹正在上面滑冰。",
"gui.unicopia.spellbook.chapter.ice.p13.2.body": "露娜问我可不可以让她和他们一起玩,我说不行,虽然现在想来不知道当时为什么要这么说,但我有一种预感,要出事……",
"gui.unicopia.spellbook.chapter.ice.p14.title": "17th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p14.1.body": "老天爷啊,公主在上,我-我不知道该从哪开始讲了,我的蹄子在发抖,大气喘不上来。我现在冻得要死,脑子里全都是刚才发生的画面。",
"gui.unicopia.spellbook.chapter.ice.p14.2.body": "我知道有什么地方不对劲,我-就知道,那个时间点我还没察觉,万幸我没让露娜去那冻湖上滑冰。",
"gui.unicopia.spellbook.chapter.ice.p15.title": "冻湖 · 二",
"gui.unicopia.spellbook.chapter.ice.p15.1.body": "让我们把时间线稍稍前推,你还记得那个有小驹在上面滑冰的冻湖吗?",
"gui.unicopia.spellbook.chapter.ice.p15.2.body": "好吧,在那之后我到了集市上,看那些摊位有没有草莓卖——结果一颗都没找着,可惜它们在之前的乱局中遗失了。",
"gui.unicopia.spellbook.chapter.ice.p16.title": "冻湖 · 三",
"gui.unicopia.spellbook.chapter.ice.p16.1.body": "当我在和贩子讨价还价时,我发现露娜在扯我的袍子,嘴里还在问发生什么事了。我听见四周忽然传来四蹄疾奔的声响,一匹匹小马从我们身边跑过去,没有一匹停下来告诉我们发生了什么,但是我确实听到了几句老粗口话。",
"gui.unicopia.spellbook.chapter.ice.p16.2.body": "他们正在奔向塔楼的方向,于是我也紧随着一起过去了。",
"gui.unicopia.spellbook.chapter.ice.p16.3.body": "我当时在想的是’起火?‘和‘我的实验室危险了?’",
"gui.unicopia.spellbook.chapter.ice.p16.4.body": "告诉你吧,我宁可是这两种情况,实际情况远比这糟,糟得多,我现在回想起来还心有余悸。",
"gui.unicopia.spellbook.chapter.ice.p17.title": "冻湖 · 四",
"gui.unicopia.spellbook.chapter.ice.p17.1.body": "早先我们到了湖附近时,我看见一大群马在岸上聚集起来。梯子和急救器械散落在湖岸上,“该怎么做”的喧嚷声此起彼伏。",
"gui.unicopia.spellbook.chapter.ice.p17.2.body": "凑近来看,我很快充分意识到了发生了什么事——我直接奔向湖水——冰面破裂,湖水冻得刺骨。",
"gui.unicopia.spellbook.chapter.ice.p17.3.body": "我反正就是跳进去了,用魔法拉开鞍包,掏出随身最后一块晶石并发动了里面那还未完善的魔法。",
"gui.unicopia.spellbook.chapter.ice.p17.4.body": "水从身边退去,我便冲下斜坡,越过干燥的湖底,飞身扑向落入湖中的小驹们。",
"gui.unicopia.spellbook.chapter.ice.p18.title": "冻湖 · 五",
"gui.unicopia.spellbook.chapter.ice.p18.1.body": "他们冻僵了,浑身湿透,甚至在魔法将水从他们的皮毛上驱走后仍然冷得发抖,我们将小驹们抬到岸上并给他们裹上毯子递上热饮。",
"gui.unicopia.spellbook.chapter.ice.p18.2.body": "镇民们坚持要给我递一张毯子,尽管我没有——也没可能把自己沾湿。",
"gui.unicopia.spellbook.chapter.ice.p18.3.body": "过了好一阵子,惊惧才从心中消散,我终于感觉喘上气,想起来要取消魔法了。",
"gui.unicopia.spellbook.chapter.ice.p18.4.body": "感谢公主,我们能及时赶到。",
"gui.unicopia.spellbook.chapter.ice.p19.title": "18th Trot '12",
"gui.unicopia.spellbook.chapter.ice.p19.1.body": "今早没看到有小驹的迹象,我敢笃定他们接下来的很长一段时间都不会靠近这个湖了。湖水半夜又冻上了,现在看上去很平静。",
"gui.unicopia.spellbook.chapter.ice.p19.2.body": "昨日缠在心头的不祥预感今天终于没了,我终于可以和露娜一起在岸上放松了。她现在不想再在湖里游泳了,这次我也不怪她了,毕竟我再也不想想往湖里钻了。",
"gui.unicopia.spellbook.chapter.ice.p20.title": "沙堡",
"gui.unicopia.spellbook.chapter.ice.p20.1.body": "露娜开始堆沙堡,趁她忙的时候,我决定继续钻研一下我的新魔法。",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.1.body": "将护盾魔法和霜冻晶石整合在一起,结果有点…比较奇怪。",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.2.body": "我叫它排水是因为它能将水从施法者周围排开。",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.modifier.1": "* 添加更多聚焦要素来延长魔法的作用时间",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.modifier.2": "* 添加慷慨要素来将魔法绑定在使用者身外的某个地方",
"gui.unicopia.spellbook.chapter.air.p1.title": "第四章 气魔法",
"gui.unicopia.spellbook.chapter.air.p2.title": "1st Hoof '12",
"gui.unicopia.spellbook.chapter.air.p1.1.body": "新的一月,新作一篇。小露娜已经厌烦坐在塔楼中一整天无所事事了(我又怎能怪她?毕竟我们在这都待两个月了)。",
"gui.unicopia.spellbook.chapter.air.p1.2.body": "作为一点自我奖励,我们打算去骏流瀑布的一个朋友那儿串串门,她叫飓风司令。",
"gui.unicopia.spellbook.chapter.air.p1.3.body": "司令盛情允许我翻阅她的藏书,好继续我的研究。我现在非常期待独角兽和天马魔法联合起来的效果。",
"gui.unicopia.spellbook.chapter.air.p3.title": "2nd Hoof '12",
"gui.unicopia.spellbook.chapter.air.p3.1.body": "呃,抱歉啊,附录里好像多出来了一些奇怪的条目。看起来有些小妖精动了我的笔记。",
"gui.unicopia.spellbook.chapter.air.p4.title": "气魔法 · 一",
"gui.unicopia.spellbook.chapter.air.p4.1.body": "天马魔法",
"gui.unicopia.spellbook.chapter.air.p4.2.body": "气魔法之于天马正如火之于独角兽,它们同样地难以控制。火主要应用于力量,摧毁,或是保护,而气则专注于灵活与自由运动。",
"gui.unicopia.spellbook.chapter.air.p4.3.body": "飓风司令热心地指点了一下我该如何从各种物体中分辨出这种元素。",
"gui.unicopia.spellbook.chapter.air.p4.4.body": "任何和飞行相关的,或者源自飞行生物的物体都很可能含有气元素。",
"gui.unicopia.spellbook.chapter.air.p4.5.body": "例如:羽毛。",
"gui.unicopia.spellbook.chapter.air.catapult.1.body": "这是独角兽意念移物能力的一个基础应用。击飞晶石能够将附近的任何方块或生物送上天。",
"gui.unicopia.spellbook.chapter.air.catapult.2.body": "再次作用在被击飞的物体时会将其推开。",
"gui.unicopia.spellbook.chapter.air.catapult.modifier.1": "* 可以向其中添加力量要素以增强效果",
"gui.unicopia.spellbook.chapter.air.bubble.1.body": "一个防御性的实用魔法。泡泡魔法会将目标困在一个巨大的肥皂泡中,让其毫无反抗之力。",
"gui.unicopia.spellbook.chapter.air.bubble.2.body": "再次施展即可戳破泡泡。",
"gui.unicopia.spellbook.chapter.air.p7.title": "8th Hoof '12",
"gui.unicopia.spellbook.chapter.air.p7.1.body": "在露娜和飓风司令不在的这段时间里,我应该会花一点时间来写个条目来记录我的发现。",
"gui.unicopia.spellbook.chapter.air.p7.2.body": "天马魔法有种野性的美,它不像我们这些需要后天学习的魔法,不需要条条框框和漫长的练习。",
"gui.unicopia.spellbook.chapter.air.p8.title": "天马",
"gui.unicopia.spellbook.chapter.air.p8.1.body": "天马魔法是感性而艺术的,它自心而生,不过也遵循着几条原则。",
"gui.unicopia.spellbook.chapter.air.p9.title": "天马 · 二",
"gui.unicopia.spellbook.chapter.air.p9.1.body": "正如他们建在云中的屋子,我还没读到过能产生这种效果的魔法,但如果你去感受——请不要用你的蹄子或是角,而是用心,用思维去感受,你将与魔法共鸣。",
"gui.unicopia.spellbook.chapter.air.p9.2.body": "云充盈着气元素与水元素,同时也包含着其他的元素,如能量,力量,生命,地。这些元素来自云雾变幻出的各种形状。",
"gui.unicopia.spellbook.chapter.air.p10.title": "天马 · 三",
"gui.unicopia.spellbook.chapter.air.p10.1.body": "我希望能继续推进研究,但我还是不太敢碰这种我尚不理解的魔法。",
"gui.unicopia.spellbook.chapter.air.p10.2.body": "要是我第一次到飓风司令那边去就把人家的房子给炸了,她没准一辈子都不会原谅我。",
"gui.unicopia.spellbook.chapter.air.feather_fall.1.body": "我扩展了保护晶石的保护范围,它现在可以保护范围内的数个生灵了。",
"gui.unicopia.spellbook.chapter.air.feather_fall.2.body": "这种复杂的结构不同寻常,理论上应该会减缓施法者和其同伴的下落速度。",
"gui.unicopia.spellbook.chapter.air.p12.title": "10th Hoof '12",
"gui.unicopia.spellbook.chapter.air.p12.1.body": "我和飓风司令、露娜吃过了晚餐,饭后便聊起了建筑,其中飓风提到了泰驹陵。",
"gui.unicopia.spellbook.chapter.air.p12.2.body": "露娜觉得作为一座城堡这名字也太搞笑了,于是我提醒了一下她,文化都是有差异的,要学会包容。",
"gui.unicopia.spellbook.chapter.air.p13.title": "21st Hoof '12",
"gui.unicopia.spellbook.chapter.air.p13.1.body": "写在返回§k特骡赫姆§r的前夜。尽管在云中邦的时光让我收获颇多但我还是想念着老地方赶紧躺回我那老床上。",
"gui.unicopia.spellbook.chapter.air.p13.2.body": "但是我还是没法对露娜开口。她现在正坐在床边,嘟着嘴,不满地看着我把一件件东西收回鞍包里。",
"gui.unicopia.spellbook.chapter.air.p14.title": "归家",
"gui.unicopia.spellbook.chapter.air.p14.1.body": "她一直和我说要留一会§m显然是想要和那前些天新认识的小天马多出去玩一回。",
"gui.unicopia.spellbook.chapter.air.p15.title": "22nd Hoof '12",
"gui.unicopia.spellbook.chapter.air.p15.1.body": "当我们飞过山巅时我不由自主地敬畏起了§k浮士德母亲§r所带给我们的一切。",
"gui.unicopia.spellbook.chapter.air.p15.2.body": "我花了一整天拉着露娜免得她掉下去,包括回答各种关于云像什么的问题。好在开气球的那位帮我分担了一点负担。",
"gui.unicopia.spellbook.chapter.air.p15.3.body": "在这远离尘嚣的地方,有那么一刻我真就把下面的世界忘掉了。我仿佛回到了那个一切都那么简单的时候,就在--",
"gui.unicopia.spellbook.chapter.air.p15.4.body": "然而西天爆发出的电光把一切都毁了。看起来远处有一场风暴,我当然希望这别是不祥之兆……",
"gui.unicopia.spellbook.chapter.dark_magic.p1.title": "第五章 奥术",
"gui.unicopia.spellbook.chapter.dark_magic.p2.title": "30th Hoof '12",
"gui.unicopia.spellbook.chapter.dark_magic.p2.1.body": "今天皇室那边来了新消息。西线的情况更糟了,尽管我目前的工作已经使足够使皇室满意,但他们还是想要逼迫我研发出更加具有破坏力的东西。",
"gui.unicopia.spellbook.chapter.dark_magic.p2.2.body": "我想要告诉信使我不能——",
"gui.unicopia.spellbook.chapter.dark_magic.p3.title": "3rd Slep '12",
"gui.unicopia.spellbook.chapter.dark_magic.p3.1.body": "话说在前头,我从来不想让任何小马将我的工作成果用于恶毒用途。我就是个彻彻底底的搞研究的。我的目标很纯粹,就想让世界和平而已。",
"gui.unicopia.spellbook.chapter.dark_magic.p4.title": "4th Slep '12",
"gui.unicopia.spellbook.chapter.dark_magic.p4.1.body": "如果不一瞥彼岸,我的魔法将毫无完成的希望。",
"gui.unicopia.spellbook.chapter.dark_magic.p4.2.body": "黑魔法,我也将其称之为奥术,它们是光明魔法与现实黑暗面的界限。",
"gui.unicopia.spellbook.chapter.dark_magic.vortex.1.body": "如果有马问你:“排斥魔法的反面是什么”,你应该如何回答?当然是吸引魔法了!",
"gui.unicopia.spellbook.chapter.dark_magic.vortex.2.body": "通过扭曲保护魔法的原始目标,我成功地重整了其功能,并创造出一种将物体和实体引向施法者的魔法。",
"gui.unicopia.spellbook.chapter.dark_magic.vortex.modifier.1": "+ 10x知识要素来将效果缩窄到仅作用于物品上",
"gui.unicopia.spellbook.chapter.dark_magic.vortex.modifier.2": "+ 添加聚焦要素来延长作用效果\n+ 添加力量要素来增广范围",
"gui.unicopia.spellbook.chapter.dark_magic.p6.title": "8th Slep '12",
"gui.unicopia.spellbook.chapter.dark_magic.p6.1.body": "针对吸引魔法的额外笔记",
"gui.unicopia.spellbook.chapter.dark_magic.p6.2.body": "今天露娜乱玩我的魔法合成表格,被我逮个正着,尽管之前我已经叫她我不在时不准进入我的研究室了。",
"gui.unicopia.spellbook.chapter.dark_magic.p6.3.body": "显然这事和赛利肯定有点关系,我现在不怎么记得了,但反正露娜在趁我出去买面包时溜进了我的研究室。",
"gui.unicopia.spellbook.chapter.dark_magic.p7.title": "奥术吸引 · 二",
"gui.unicopia.spellbook.chapter.dark_magic.p7.1.body": "其实并不是这个原因。我骂了她一顿,把她赶回了自己房间。不过当我清理她留下的一团乱麻时我留意到了晶石堆里的一样东西。",
"gui.unicopia.spellbook.chapter.dark_magic.p7.2.body": "真的,很难讲。这是一颗吸引晶石没错,但它不一样。",
"gui.unicopia.spellbook.chapter.dark_magic.p7.3.body": "它里面含有我未曾想到的要素,而它表现出来的……",
"gui.unicopia.spellbook.chapter.dark_magic.p8.title": "奥术吸引 · 二(续)",
"gui.unicopia.spellbook.chapter.dark_magic.p8.1.body": "好吧,我得把这推到明天了,还得忙着处理这周发生的各种麻烦事。",
"gui.unicopia.spellbook.chapter.dark_magic.p8.2.body": ">0 慷慨要素 --> ??",
"gui.unicopia.spellbook.chapter.dark_magic.p8.3.body": ">20 秩序要素 --> ???",
"gui.unicopia.spellbook.chapter.dark_magic.p9.title": "20th Slep '12",
"gui.unicopia.spellbook.chapter.dark_magic.p9.1.body": "根据他们的协议,议会送来了一些…补给品,来辅助我继续推进目前的研究方向。我一开始真有点震惊。",
"gui.unicopia.spellbook.chapter.dark_magic.p9.2.body": "这…东西…不管这玩意是什么,或者曾经是什么。",
"gui.unicopia.spellbook.chapter.dark_magic.p9.3.body": "这真的是我们在西线作战时要面对的的东西吗?",
"gui.unicopia.spellbook.chapter.dark_magic.p10.title": "21st Slep '12",
"gui.unicopia.spellbook.chapter.dark_magic.p10.1.body": "我已经把那…东西放在,在地下室里,门锁上了。",
"gui.unicopia.spellbook.chapter.dark_magic.p10.2.body": "我真的是再也没眼看它了,这东西虽然有一点马形,但也太……",
"gui.unicopia.spellbook.chapter.dark_magic.p10.3.body": "我绝对不能让露娜看见它。我已经把她送出去和让她和赛利过几晚,这期间该想想怎么办了。",
"gui.unicopia.spellbook.chapter.dark_magic.p11.title": "25th Slep '12",
"gui.unicopia.spellbook.chapter.dark_magic.p11.1.body": "抱歉拖更了这么久。事情有点…忙。",
"gui.unicopia.spellbook.chapter.dark_magic.p11.2.body": "我逐渐开始了解这些生物。以下是一些注解,我已经尽可能不去直视那东西了。",
"gui.unicopia.spellbook.chapter.dark_magic.p11.3.body": "它通体漆黑§k和虫子一样§r略像马形体表无毛。",
"gui.unicopia.spellbook.chapter.dark_magic.p11.4.body": "它所使用的魔法不正常,不是不正常,它就像我之前研究的那样,不自然而狂野。",
"gui.unicopia.spellbook.chapter.dark_magic.p11.5.body": "我绝对是可以在这开展一些测试的,但是我…应该吗?",
"gui.unicopia.spellbook.chapter.dark_magic.p11.6.body": "我想,这有条不该逾越的界线。",
"gui.unicopia.spellbook.chapter.dark_magic.transformation.1.body": "我先从利用它们的能力开始研究。这些能力发散而难以控制,我几乎没法预测其演变,但是这颗晶石有着非常显著的变形特性。",
"gui.unicopia.spellbook.chapter.dark_magic.transformation.2.body": "将这东西向其他生灵投射将有概率将他们转换成另一种生灵。",
"gui.unicopia.spellbook.chapter.dark_magic.reveal.1.body": "魔法解除境是抵抗变形/幻形魔法的第一道防线。",
"gui.unicopia.spellbook.chapter.dark_magic.reveal.2.body": "当施展时,它将强制使作用范围内处于伪装态的幻形灵现出真身。",
"gui.unicopia.spellbook.chapter.dark_magic.reveal.modifier.1": "* 加入力量要素来增广作用范围",
"gui.unicopia.spellbook.chapter.dark_magic.p14.title": "27th Slep '12",
"gui.unicopia.spellbook.chapter.dark_magic.p14.1.body": "最近几夜有点…难以入眠。",
"gui.unicopia.spellbook.chapter.dark_magic.p14.2.body": "我不知道该怎么说了,真的。露娜看起来完全不受影响,但是在太阳下山后的夜晚中,我发现躺着根本睡不着,即使附近村庄传来的声音已经恢复了。",
"gui.unicopia.spellbook.chapter.dark_magic.p15.title": "失眠",
"gui.unicopia.spellbook.chapter.dark_magic.p15.1.body": "昨天晚上,就在昨天晚上,我在观星台上打着哆嗦。空气变得凛寒无比,比每年这个时候还要冷得多,房间里燃烧着的炉火也仿佛被其镇压住了。",
"gui.unicopia.spellbook.chapter.dark_magic.p15.2.body": "我那关着…我的那啥的东西,就在墙后。",
"gui.unicopia.spellbook.chapter.dark_magic.p16.title": "失眠(续)",
"gui.unicopia.spellbook.chapter.dark_magic.p16.1.body": "我已经把那扇门锁上了,因为我发誓,每隔一小会,我都能听到有东西在那里挪动……",
"gui.unicopia.spellbook.chapter.dark_magic.p16.2.body": "神啊,我要发疯了吗?",
"gui.unicopia.spellbook.chapter.dark_magic.p17.title": "29th Slep '12",
"gui.unicopia.spellbook.chapter.dark_magic.p17.1.body": "马的,又来了!",
"gui.unicopia.spellbook.chapter.dark_magic.p17.2.body": "我以为昨晚的事情只是错觉,但我现在又听到了——我在发抖,我的蹄子在抖,写下这些话的时候我几乎捧不住书了。",
"gui.unicopia.spellbook.chapter.dark_magic.p17.3.body": "有东西——我听到了什么,好像窃窃私语——",
"gui.unicopia.spellbook.chapter.dark_magic.p18.title": "1st Croptober '12",
"gui.unicopia.spellbook.chapter.dark_magic.p18.1.body": "我从镇子里叫了外援,一位铁匠要过来安一把新锁,那种连陆马都踢不坏的那种。",
"gui.unicopia.spellbook.chapter.dark_magic.p18.2.body": "我觉得这还不够,那东西——不管它是什么,肯定有魔法,我得研究出一种魔法来解决我的失眠症。",
"gui.unicopia.spellbook.chapter.dark_magic.arcane_protection.1.body": "这个魔法会创造一个魔力结界,可以用于阻止其他的施法者。",
"gui.unicopia.spellbook.chapter.dark_magic.arcane_protection.2.body": "谁都不可以在结界范围内使用魔法了。",
"gui.unicopia.spellbook.chapter.dark_magic.arcane_protection.modifier.1": "* 加入力量要素来增广作用范围",
"gui.unicopia.spellbook.chapter.dark_magic.displacement.1.body": "施放这种魔法,一匹独角兽便可与其他生灵互换位置。",
"gui.unicopia.spellbook.chapter.dark_magic.p21.title": "3rd Croptober '12",
"gui.unicopia.spellbook.chapter.dark_magic.p21.1.body": "锁已经装好了,外加几项警示,我感觉放心了一点。",
"gui.unicopia.spellbook.chapter.dark_magic.p21.2.body": "晚上的动静消停了,尽管我总感觉自己还能听到……",
"gui.unicopia.spellbook.chapter.dark_magic.p22.title": "4th Cropt-",
"gui.unicopia.spellbook.chapter.dark_magic.mimic.1.body": "我已经可以利用这种奇怪生灵的能力,还有很多待研究的,但是现在我能将其特性注入一颗晶石中了。",
"gui.unicopia.spellbook.chapter.dark_magic.mimic.modifier.1": "* 添加聚焦要素来延长作用效果",
"gui.unicopia.spellbook.chapter.dark_magic.p24.1.body": "一股黑暗笼罩了小镇,自从那造物者来了都要嫌弃的生灵到来后,一切都变了。",
"gui.unicopia.spellbook.chapter.dark_magic.p24.2.body": "镇上的小马开始显现出缺少睡眠的症状,越来越显著了。今早我看见一匹可怜的雄驹,神情恍惚地走着,眼袋黝黑,面无血色。",
"gui.unicopia.spellbook.chapter.dark_magic.p25.1.body": "他的行为举止简直像一头僵尸,撞到我身上的时候都毫不在意。",
"gui.unicopia.spellbook.chapter.dark_magic.p26.title": "碎片",
"gui.unicopia.spellbook.chapter.dark_magic.p26.1.body": "§k还不够永远不够。爬行我感觉到爬行天啊爬行永无终结。",
"gui.unicopia.spellbook.chapter.dark_magic.p27.1.body": "失眠。我忍不了了,每天晚上都躺在床上等入眠。",
"gui.unicopia.spellbook.chapter.dark_magic.p27.2.body": "我以为我能够阻止它,挡住它,但我还能听到,那生物,冷啊,无情啊。",
"gui.unicopia.spellbook.chapter.dark_magic.p27.3.body": "我感觉靠近它时,身体就在流失什么。难道它是在…以我为食?",
"gui.unicopia.spellbook.chapter.dark_magic.p27.4.body": "不,不可能。",
"gui.unicopia.spellbook.chapter.dark_magic.p28.1.body": "我在清理实验室时候发现了这些陈旧的咒语笔记…潦草而难以整理,不过把任务完成足够了。",
"gui.unicopia.spellbook.chapter.dark_magic.dispel_evil.modifier.1": "* 加入力量要素来增广作用范围",
"gui.unicopia.spellbook.chapter.otherworldly.p1.title": "第六章 超越现实",
"gui.unicopia.spellbook.chapter.otherworldly.p2.title": "2nd Croptober '12",
"gui.unicopia.spellbook.chapter.otherworldly.p2.1.body": "本章将解析凌驾于本世界之上的超现实力量,潜入研究普通独角兽们所避而不谈的领域。",
"gui.unicopia.spellbook.chapter.otherworldly.p2.2.body": "此部分记录着超越顶级魔法的魔法,风险同样极高。请谨慎阅读,因为这不是纯洁心灵该踏足的领域。",
"gui.unicopia.spellbook.chapter.otherworldly.siphoning.1.body": "工作原理很简单,将某生物的生命强力吸出,并转移至施法者体内。",
"gui.unicopia.spellbook.chapter.otherworldly.necromancy.1.body": "此区域型魔法会洞穿异界,召唤出为其主作战的生命。",
"gui.unicopia.spellbook.chapter.otherworldly.necromancy.2.body": "此魔法单独使用时并不是很实用但是加入其他要素后可以用于有效对抗§k大批幻形灵§r。",
"gui.unicopia.spellbook.chapter.otherworldly.dark_vortex.1.body": "钻击纤薄的现实,此魔法将与异界奥术能量谐振,在现实空间中钻出一个黑洞。",
"gui.unicopia.spellbook.chapter.otherworldly.dark_vortex.2.body": "生成的黑洞质量巨大,会将接近事物吞噬殆尽,虽然它会提供巨大的能量,但供养它仍然非常危险。",
"gui.unicopia.spellbook.chapter.otherworldly.portal.1.body": "将前辈所制的换位魔法之功效和黑暗漩涡晶石结合在一起的话,其混沌的本性即被驯服。",
"gui.unicopia.spellbook.chapter.otherworldly.portal.2.body": "奥术裂缝魔法允许施法者在两个地点之间建立一座跨越空间的桥梁。从一侧进入的物体将以原速从另一侧穿出。",
"gui.unicopia.spellbook.chapter.otherworldly.mind_swap.1.body": "我推进了前辈对于幻形灵变形能力的研究,现在我可以利用混沌扭曲之力增强拟态魔法了。",
"gui.unicopia.spellbook.chapter.otherworldly.mind_swap.2.body": "心灵交换将拟态的效果推广到了两个生物体中,令其在有限的时间内交换躯体。",
"gui.unicopia.spellbook.chapter.otherworldly.mind_swap.3.body": "* 添加聚焦要素来延长作用效果",
"gui.unicopia.spellbook.chapter.artefacts.p1.title": "第七章 魔法造物",
"gui.unicopia.spellbook.chapter.artefacts.p2.title": "2nd Mare '12",
"gui.unicopia.spellbook.chapter.artefacts.p2.1.body": "接下来的内容是关于我研究过的一些著名造物的总结。",
"gui.unicopia.spellbook.chapter.artefacts.p2.2.body": "所有的造物并非皆有其踪,有些被证明是纯粹的传说,另有一些则是彻底的谣言,所以这些故事不能尽信。",
"gui.unicopia.spellbook.chapter.artefacts.crystal_heart.1.body": "多年前由一群独角兽打造,它的起源和目前下落皆不明。",
"gui.unicopia.spellbook.chapter.artefacts.crystal_heart.2.body": "有一些观点认为它是一种用于提供保护和补给的强大工具,会将将敌对生物的生命力量转移给施法者和其同伴。",
"gui.unicopia.spellbook.chapter.artefacts.crystal_heart.title": "5th Mare '12",
"gui.unicopia.spellbook.chapter.artefacts.crystal_heart.3.body": "另一些观点认为只有当它被摆放在一种由钻石块构成的特殊基座上时才会工作,与信标相似。",
"gui.unicopia.spellbook.chapter.artefacts.torn_page.title": "开裂的页面",
"gui.unicopia.spellbook.chapter.artefacts.torn_page.1.body": "§kaaa§r涉及§ka§r的§kaaa§r意图在§kaaa§r",
"gui.unicopia.spellbook.chapter.artefacts.torn_page.2.body": "§kAasa sasa fwefsd q43rgfd wqklmsdfl as, klasn.§r",
"gui.unicopia.spellbook.chapter.artefacts.torn_page.3.body": "建造材料:",
"gui.unicopia.spellbook.chapter.artefacts.crystal_podium.title": "水晶基座",
"gui.unicopia.spellbook.chapter.artefacts.altar.title": "祭坛",
"gui.unicopia.spellbook.chapter.artefacts.altar.1.body": "一座由一支早期§k独角兽族§r群§k打§r造的古§k代§r祭坛被认为是用于§k更加古§r老的魔§k法召§r唤仪式。",
"gui.unicopia.spellbook.chapter.artefacts.altar.2.body": "我们对这种神秘的构造§k知之§r甚少它们所蕴藏的秘密到现今仍是一个迷。",
"gui.unicopia.spellbook.chapter.artefacts.altar.3.body": "使§k用祭§r坛",
"gui.unicopia.spellbook.chapter.artefacts.dragon_breath_scroll.2.body": "用法是,呃,把某小马的名字打上去,然后拿在一只蹄中,把另一样东西拿在另一只蹄中,接下来就,呃,它们就会咻的一声飞走,这东西就去到那匹小马那边了。",
"gui.unicopia.spellbook.chapter.artefacts.dragon_breath_scroll.title": "2nd Hoof '12",
"gui.unicopia.spellbook.chapter.artefacts.dragon_breath_scroll.3.body": "P.S.星璇叔叔是大笨蛋。",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.1.body": "法师们曾经用它进行远距离交流,现在已经淘汰不用很久了。",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.2.body": "让一匹独角兽在其上签名并转交给其一朋友,这将使得某些特定的魔法效果从独角兽侧传播出去。",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.title": "13th Mare '12",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.3.body": "任何戴上了签过你名的手环的小马都可以从你施展的增效魔法中受益,也可以穿越保护魔法和盾牌魔法的结界。",
"gui.unicopia.spellbook.chapter.artefacts.friendship_bracelet.4.body": "法力消耗也会平摊到附近的联谊者身上。",
"gui.unicopia.spellbook.chapter.artefacts.spectral_clock.title": "14th Mare '12",
"gui.unicopia.spellbook.chapter.artefacts.spectral_clock.1.body": "与其说是件造物,倒不如说是个奇怪的饰品。上周露娜恰好把这东西从集市上带回家,一眼看过去还以为是个普通的坏钟,但是我却发现了其奇怪之处。",
"gui.unicopia.spellbook.chapter.artefacts.spectral_clock.2.body": "这个钟并不能指示时间。好吧,其实可以,只是不直观。更像是遵循着周围森林里某种植物的节律周期。",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.1.body": "这是飓风司令告诉我的,然而我没找到多少记载来佐证她的说法。",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.2.body": "其上的天马护符可以让穿戴者享受短暂的飞行,就像天马那样。",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.title": "21st Trot '12",
"gui.unicopia.spellbook.chapter.artefacts.pegasus_amulet.3.body": "它本是早期驻云中高地的独角兽大使所使用的辅助装备,但在和谈破裂后丢失了。",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.1.body": "这个是魔力法杖的前身——麦都布鲁的权杖,可在在术士施展长效法术时起到结构性支撑作用。",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.2.body": "它有着扭曲而斑驳的外观,其核心坚实无比,可以承载一匹成年雄驹的重量。",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.title": "22nd Trot '12",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.3.body": "由于其致密的结构和强劲的可燃性,所以必要时此物亦可当作攻击用的武器,或成为燃料。",
"gui.unicopia.spellbook.chapter.artefacts.meadowbrooks_staff.4.body": "为了在战斗中正确使用此物使用者须得使双蹄拽住其窄端在头上快速挥舞同时喊出“Fus Roh DAH”",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.1.body": "这是一种让非魔法生物也能使用魔法的辅助型工具,它们可以像独角兽那引导并驾驭魔法晶石内存的魔力。",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.title": "22nd Trot '12",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.2.body": "并非所有魔法都以相同的方式工作,但是对于魔法初学者来说,此物是个必备的基础工具。",
"gui.unicopia.spellbook.chapter.artefacts.magic_staff.3.body": "制作此物最简单的方式是把魔力晶石安装在一根接长木棍的末端。没错,多么革新的工艺啊,我就知道。",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.1.body": "一个强大的魔法造物,曾经被认为储存了格罗迦大王的力量。",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.2.body": "对于会使用它的小马来说,它可以将魔力从一个生物转移到另一个生物中。",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.title": "22nd Trot '12",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.3.body": "据推测,这项造物是在无序统治的时代用大熊座的爪子炼成的,可能是一件用于对抗统治者的武器。",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.4.body": "欲图染指其力量者的意志将会被其内在含有的堕落之力摧毁。",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.2.title": "格罗迦的铃铛 · 二",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.5.body": "传说其第一个所有者——格罗迦,因为铃铛被偷走而气得发疯了。",
"gui.unicopia.spellbook.chapter.artefacts.grogars_bell.6.body": "在无马之境,一座古城中,由一个不可战胜的怪物监守着。",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.1.body": "就像水晶之心一样,我们对这种魔法制品知之甚少,连它是否存在也不清楚。",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.title": "23nd Trot '12",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.2.body": "天角兽护符是一股强大的黑魔法力量,它是由一位匿名魔法师在尝试制造究极生物时的产物。",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.3.body": "它将所有种族的特征集合成了一个强大的统一体,但难以控制,成瘾性极高。所有尝试过戴上它的小马都非常快地被其强大的力量所征服,很少有小马愿意取下它,并在随之而来的戒断反应中幸存下来。",
"gui.unicopia.action.spells_cleared": "移除所有的魔法",
"gui.unicopia.action.no_spells_cleared": "你目前没有正在生效的魔法",
"chapter.unicopia.crafting": "制作魔咒", "chapter.unicopia.crafting": "制作魔",
"chapter.unicopia.profile": "简介", "chapter.unicopia.profile": "简介",
"chapter.unicopia.traits": "发现", "chapter.unicopia.traits": "发现",
"chapter.unicopia.introduction": "导论", "chapter.unicopia.introduction": "导论",
@ -922,7 +1284,7 @@
"enchantment.unicopia.clingy": "纠缠不休", "enchantment.unicopia.clingy": "纠缠不休",
"enchantment.unicopia.repulsion": "地心斥力", "enchantment.unicopia.repulsion": "地心斥力",
"enchantment.unicopia.heavy": "沉重", "enchantment.unicopia.heavy": "沉重",
"enchantment.unicopia.herds": "同仇敌忾", "enchantment.unicopia.herds": "戮力同心",
"enchantment.unicopia.want_it_need_it": "竞相争夺", "enchantment.unicopia.want_it_need_it": "竞相争夺",
"enchantment.unicopia.poisoned_joke": "毒玩笑", "enchantment.unicopia.poisoned_joke": "毒玩笑",
"enchantment.unicopia.stressed": "神经压迫", "enchantment.unicopia.stressed": "神经压迫",
@ -1040,15 +1402,15 @@
"death.attack.unicopia.love_draining.self": "%1$s 耗尽了自己所有的爱", "death.attack.unicopia.love_draining.self": "%1$s 耗尽了自己所有的爱",
"death.attack.unicopia.love_draining.player": "%1$s 的爱被 %2$s 抽干了", "death.attack.unicopia.love_draining.player": "%1$s 的爱被 %2$s 抽干了",
"death.attack.unicopia.life_draining": "%1$s 被吸干了", "death.attack.unicopia.life_draining": "%1$s 被吸干了",
"death.attack.unicopia.life_draining.self": "%1$s 被自己的魔杀死了", "death.attack.unicopia.life_draining.self": "%1$s 被自己的魔杀死了",
"death.attack.unicopia.life_draining.player": "%1$s 被 %2$s 施放的魔杀死了", "death.attack.unicopia.life_draining.player": "%1$s 被 %2$s 施放的魔杀死了",
"death.attack.unicopia.bat_screech": "%1$s 吓到了", "death.attack.unicopia.bat_screech": "%1$s 吓到了",
"death.attack.unicopia.bat_screech.self": "%1$s 吓到了自己", "death.attack.unicopia.bat_screech.self": "%1$s 吓到了自己",
"death.attack.unicopia.bat_screech.player": "%2$s 吓到了 %1$s", "death.attack.unicopia.bat_screech.player": "%2$s 吓到了 %1$s",
"death.attack.unicopia.bat_screech.item": "%1$s 被 %2$s 用 %3$s 吓到了", "death.attack.unicopia.bat_screech.item": "%1$s 被 %2$s 用 %3$s 吓到了",
"death.attack.unicopia.gravity_well_recoil": "%1$s 被拉成了意大利面条", "death.attack.unicopia.gravity_well_recoil": "%1$s 被拉成了意大利面条",
"death.attack.unicopia.gravity_well_recoil.player": "%1$s 被 %2$s 施放的魔拉成了意大利面条", "death.attack.unicopia.gravity_well_recoil.player": "%1$s 被 %2$s 施放的魔拉成了意大利面条",
"death.attack.unicopia.gravity_well_recoil.item": "%1$s 被 %2$s 用 %3$s 施放的魔拉成了意大利面条", "death.attack.unicopia.gravity_well_recoil.item": "%1$s 被 %2$s 用 %3$s 施放的魔拉成了意大利面条",
"death.attack.unicopia.gravity_well_recoil.self": "%1$s 把自己拉成了意大利面条", "death.attack.unicopia.gravity_well_recoil.self": "%1$s 把自己拉成了意大利面条",
"death.attack.unicopia.smash": "%1$s 被铁蹄压扁了", "death.attack.unicopia.smash": "%1$s 被铁蹄压扁了",
"death.attack.unicopia.smash.self": "%1$s 让自己被铁蹄压扁了", "death.attack.unicopia.smash.self": "%1$s 让自己被铁蹄压扁了",
@ -1123,55 +1485,55 @@
"painting.unicopia.equality.title": "平等", "painting.unicopia.equality.title": "平等",
"painting.unicopia.equality.author": "星光熠熠", "painting.unicopia.equality.author": "星光熠熠",
"unicopia.subtitle.flap_wings": "翅膀", "unicopia.subtitle.flap_wings": "翅膀:拍打",
"unicopia.subtitle.dash": "小马冲刺", "unicopia.subtitle.dash": "小马冲刺",
"unicopia.subtitle.wind_rush": "强风袭脸", "unicopia.subtitle.wind_rush": "强风袭脸",
"unicopia.subtitle.insects": "昆虫乱舞", "unicopia.subtitle.insects": "昆虫乱舞",
"unicopia.subtitle.changeling_buzz": "雄峰嗡嗡", "unicopia.subtitle.changeling_buzz": "幻形灵:嗡嗡",
"unicopia.subtitle.batpony_eeee": "夜骐尖叫", "unicopia.subtitle.batpony_eeee": "夜骐尖叫",
"unicopia.subtitle.sonar": "声呐脉冲", "unicopia.subtitle.sonar": "声呐脉冲",
"unicopia.subtitle.changeling.transform": "幻形灵 变形", "unicopia.subtitle.changeling.transform": "幻形灵变形",
"unicopia.subtitle.screech": "骏鹰尖啸", "unicopia.subtitle.screech": "骏鹰尖啸",
"unicopia.subtitle.pegasus.molt": "天马脱羽", "unicopia.subtitle.pegasus.molt": "天马脱羽",
"unicopia.subtitle.unicorn.teleport": "魔法泡泡", "unicopia.subtitle.unicorn.teleport": "魔法:啵",
"unicopia.subtitle.player.wololo": "Wololo", "unicopia.subtitle.player.wololo": "Wololo",
"unicopia.subtitle.entity.player.whistle": "玩家吹口哨", "unicopia.subtitle.entity.player.whistle": "玩家吹口哨",
"unicopia.subtitle.entity.player.kick": "玩家踢腿", "unicopia.subtitle.entity.player.kick": "玩家踢腿",
"unicopia.subtitle.magic_aura": "魔法嗡嗡", "unicopia.subtitle.magic_aura": "魔法嗡嗡",
"unicopia.subtitle.player.rebound": "玩家从墙上弹开", "unicopia.subtitle.player.rebound": "玩家从墙上弹开",
"unicopia.subtitle.screech": "玩家尖啸", "unicopia.subtitle.screech": "玩家尖啸",
"unicopia.subtitle.ears_ringing": "耳鸣", "unicopia.subtitle.ears_ringing": "耳鸣",
"unicopia.subtitle.heartbeat": "心悸", "unicopia.subtitle.heartbeat": "心悸",
"unicopia.subtitle.entity.artefact.ambient": "魔法嗡", "unicopia.subtitle.entity.artefact.ambient": "魔法嗡",
"unicopia.subtitle.entity.butterfly.hurt": "蝴蝶受伤", "unicopia.subtitle.entity.butterfly.hurt": "蝴蝶受伤",
"unicopia.subtitle.entity.twittermite.ambient": "雷光虫啾啾", "unicopia.subtitle.entity.twittermite.ambient": "雷光虫啾啾",
"unicopia.subtitle.entity.twittermite.death": "雷光虫死亡", "unicopia.subtitle.entity.twittermite.death": "雷光虫死亡",
"unicopia.subtitle.entity.twittermite.hurt": "雷光虫受伤", "unicopia.subtitle.entity.twittermite.hurt": "雷光虫受伤",
"unicopia.subtitle.entity.jar.throw": "扔出罐子", "unicopia.subtitle.entity.jar.throw": "罐子:被扔出",
"unicopia.subtitle.entity.crystal_heart.activate": "水晶之心激活", "unicopia.subtitle.entity.crystal_heart.activate": "水晶之心激活",
"unicopia.subtitle.entity.crystal_heart.deactivate": "水晶之心失效", "unicopia.subtitle.entity.crystal_heart.deactivate": "水晶之心失效",
"unicopia.subtitle.entity.sombra.ambient": "邪恶的笑声", "unicopia.subtitle.entity.sombra.ambient": "邪恶的笑声",
"unicopia.subtitle.entity.sombra.laugh": "黑晶王 笑", "unicopia.subtitle.entity.sombra.laugh": "黑晶王:大笑",
"unicopia.subtitle.entity.sombra.snicker": "黑晶王 暗笑", "unicopia.subtitle.entity.sombra.snicker": "黑晶王暗笑",
"unicopia.subtitle.item.amulet.charging": "护符充能", "unicopia.subtitle.item.amulet.charging": "护:正在充能",
"unicopia.subtitle.item.amulet.recharge": "护符已重充能", "unicopia.subtitle.item.amulet.recharge": "护已重充能",
"unicopia.subtitle.item.icarus_wings.resonate": "伊卡洛斯之翼 振翅", "unicopia.subtitle.item.icarus_wings.resonate": "伊卡洛斯之翼振翅",
"unicopia.subtitle.item.icarus_wings.corrupted": "伊卡洛斯之翼 已损坏", "unicopia.subtitle.item.icarus_wings.corrupted": "伊卡洛斯之翼已损坏",
"unicopia.subtitle.item.icarus_wings.warn": "伊卡洛斯之翼 正在收翅", "unicopia.subtitle.item.icarus_wings.warn": "伊卡洛斯之翼:翅膀消散",
"unicopia.subtitle.item.icarus_wings.break": "伊卡洛斯之翼 休息", "unicopia.subtitle.item.icarus_wings.break": "伊卡洛斯之翼:翅膀损毁",
"unicopia.subtitle.item.alicorn_amulet.curse": "天角兽护符 诅咒生效", "unicopia.subtitle.item.alicorn_amulet.curse": "天角兽护符诅咒生效",
"unicopia.subtitle.item.alicorn_amulet.ambient": "天角兽护符 低鸣", "unicopia.subtitle.item.alicorn_amulet.ambient": "天角兽护符低鸣",
"unicopia.subtitle.item.apple.rot": "苹果馊掉", "unicopia.subtitle.item.apple.rot": "苹果馊掉",
"unicopia.subtitle.item.bracelet.sign": "在手环上签名", "unicopia.subtitle.item.bracelet.sign": "手环:已签名",
"unicopia.subtitle.block.chitin.ambience": "飞溅", "unicopia.subtitle.block.chitin.ambience": "飞溅",
"unicopia.subtitle.block.slime_pustule.pop": "黏液泡破掉", "unicopia.subtitle.block.slime_pustule.pop": "黏液泡破掉",
"unicopia.subtitle.spell.cast.fail": "魔施展失败", "unicopia.subtitle.spell.cast.fail": "魔法:施展失败",
"unicopia.subtitle.spell.cast.success": "魔施展", "unicopia.subtitle.spell.cast.success": "魔法:施展",
"unicopia.subtitle.spell.cast.shoot": "独角发射", "unicopia.subtitle.spell.cast.shoot": "独角发射",
"unicopia.subtitle.spell.illusion.disperse": "幻形灵 现出原形", "unicopia.subtitle.spell.illusion.disperse": "幻形灵现出原形",
"unicopia.subtitle.spell.fire.shoot.bolt": "火焰镭射 发射", "unicopia.subtitle.spell.fire.shoot.bolt": "火焰镭射发射",
"unicopia.subtitle.spell.shield.projectile.burn": "箭矢燃烧", "unicopia.subtitle.spell.shield.projectile.burn": "箭矢燃烧",
"unicopia.subtitle.spell.transform.transmute.entity": "魔法泡泡", "unicopia.subtitle.spell.transform.transmute.entity": "魔法:啵",
"advancements.unicopia.root.title": "奇幻小马国", "advancements.unicopia.root.title": "奇幻小马国",
"advancements.unicopia.root.description": "一个充满魔法与冒险的世界", "advancements.unicopia.root.description": "一个充满魔法与冒险的世界",

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/template_fence_gate",
"textures": {
"texture": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/template_fence_gate_open",
"textures": {
"texture": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/template_fence_gate_wall",
"textures": {
"texture": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/template_fence_gate_wall_open",
"textures": {
"texture": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/fence_inventory",
"textures": {
"texture": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/fence_post",
"textures": {
"texture": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/fence_side",
"textures": {
"texture": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,8 @@
{
"parent": "minecraft:block/slab",
"textures": {
"bottom": "unicopia:block/zap_planks",
"side": "unicopia:block/zap_planks",
"top": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,8 @@
{
"parent": "minecraft:block/slab_top",
"textures": {
"bottom": "unicopia:block/zap_planks",
"side": "unicopia:block/zap_planks",
"top": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,8 @@
{
"parent": "minecraft:block/stairs",
"textures": {
"bottom": "unicopia:block/zap_planks",
"side": "unicopia:block/zap_planks",
"top": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,8 @@
{
"parent": "minecraft:block/inner_stairs",
"textures": {
"bottom": "unicopia:block/zap_planks",
"side": "unicopia:block/zap_planks",
"top": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,8 @@
{
"parent": "minecraft:block/outer_stairs",
"textures": {
"bottom": "unicopia:block/zap_planks",
"side": "unicopia:block/zap_planks",
"top": "unicopia:block/zap_planks"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/stripped_zap_log"
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/stripped_zap_wood"
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/zap_fence_inventory"
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/zap_fence_gate"
}

Some files were not shown because too many files have changed in this diff Show more