diff --git a/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java b/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java index c89be939..58c64637 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java @@ -115,9 +115,9 @@ public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implemen } public void applyScryingLensOverlay(List> lines, - BlockState state, BlockPos pos, - Player observer, Level world, - Direction hitFace) { + BlockState state, BlockPos pos, + Player observer, Level world, + Direction hitFace) { if (world.getBlockEntity(pos) instanceof BlockEntityAbstractImpetus beai) { if (beai.getMedia() < 0) { lines.add(new Pair<>(new ItemStack(HexItems.AMETHYST_DUST), ItemCreativeUnlocker.infiniteMedia(world))); @@ -286,7 +286,6 @@ public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implemen new SpellCircleContext(this.getBlockPos(), bounds, this.activatorAlwaysInRange())); var harness = new CastingHarness(ctx); - var makeSound = false; BlockPos erroredPos = null; for (var tracked : this.trackedBlocks) { var bs = this.level.getBlockState(tracked); @@ -294,9 +293,6 @@ public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implemen var newPattern = cc.getPattern(tracked, bs, this.level); if (newPattern != null) { var info = harness.executeIota(new PatternIota(newPattern), splayer.getLevel()); - if (info.getMakesCastSound()) { - makeSound = true; - } if (!info.getResolutionType().getSuccess()) { erroredPos = tracked; break; @@ -305,11 +301,6 @@ public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implemen } } - if (makeSound) { - this.level.playSound(null, this.getBlockPos(), HexSounds.SPELL_CIRCLE_CAST, SoundSource.BLOCKS, - 2f, 1f); - } - if (erroredPos != null) { this.sfx(erroredPos, false); } else { @@ -541,19 +532,22 @@ public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implemen @Override public boolean canPlaceItem(int index, ItemStack stack) { - if (remainingMediaCapacity() == 0) + if (remainingMediaCapacity() == 0) { return false; + } - if (stack.is(HexItems.CREATIVE_UNLOCKER)) + if (stack.is(HexItems.CREATIVE_UNLOCKER)) { return true; + } var mediamount = extractMediaFromItem(stack, true); return mediamount > 0; } public int extractMediaFromItem(ItemStack stack, boolean simulate) { - if (this.media < 0) + if (this.media < 0) { return 0; + } return MediaHelper.extractMedia(stack, remainingMediaCapacity(), true, simulate); } @@ -576,8 +570,9 @@ public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implemen } public int remainingMediaCapacity() { - if (this.media < 0) + if (this.media < 0) { return 0; + } return Math.max(0, MAX_CAPACITY - this.media); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingContext.kt b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingContext.kt index 3c3aeb60..0ae90378 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingContext.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingContext.kt @@ -28,9 +28,18 @@ import kotlin.math.min data class CastingContext( val caster: ServerPlayer, val castingHand: InteractionHand, + val source: CastSource, val spellCircle: SpellCircleContext? = null ) { - constructor(caster: ServerPlayer, castingHand: InteractionHand) : this(caster, castingHand, null) + constructor(caster: ServerPlayer, castingHand: InteractionHand, source: CastSource) : this( + caster, + castingHand, + source, + null + ) + + constructor(caster: ServerPlayer, castingHand: InteractionHand, spellCircleContext: SpellCircleContext) : + this(caster, castingHand, CastSource.SPELL_CIRCLE, spellCircleContext) private var depth: Int = 0 @@ -223,7 +232,8 @@ data class CastingContext( DiscoveryHandlers.addOperativeSlotDiscoverer { val slots = mutableListOf() - val anchorSlot = if (it.castingHand == InteractionHand.MAIN_HAND) (it.caster.inventory.selected + 1) % 9 else 0 + val anchorSlot = + if (it.castingHand == InteractionHand.MAIN_HAND) (it.caster.inventory.selected + 1) % 9 else 0 slots.add(it.caster.getItemInHand(it.otherHand)) for (delta in 0 until 9) { @@ -234,4 +244,10 @@ data class CastingContext( } } } + + enum class CastSource { + STAFF, + PACKAGED_HEX, + SPELL_CIRCLE, + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt index d9a1f9db..c18a47d7 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt @@ -28,6 +28,8 @@ import net.minecraft.nbt.Tag import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import net.minecraft.server.level.ServerLevel +import net.minecraft.sounds.SoundSource +import net.minecraft.world.level.gameevent.GameEvent import net.minecraft.world.phys.Vec3 import kotlin.math.min @@ -92,7 +94,7 @@ class CastingHarness private constructor( // Initialize the continuation stack to a single top-level eval for all iotas. var continuation = SpellContinuation.Done.pushFrame(ContinuationFrame.Evaluate(SpellList.LList(0, iotas))) // Begin aggregating info - val info = TempControllerInfo(playSound = false, earlyExit = false) + val info = TempControllerInfo(earlyExit = false) var lastResolutionType = ResolvedPatternType.UNRESOLVED while (continuation is SpellContinuation.NotDone && !info.earlyExit) { // Take the top of the continuation stack... @@ -112,7 +114,8 @@ class CastingHarness private constructor( mishap, Mishap.Context(pattern ?: HexPattern(HexDir.WEST), operator) ) - ) + ), + EvalSound.MISHAP, ) } // Then write all pertinent data back to the harness for the next iteration. @@ -121,7 +124,7 @@ class CastingHarness private constructor( } continuation = result.continuation lastResolutionType = result.resolutionType - performSideEffects(info, result.sideEffects) + performSideEffects(info, result.sideEffects, result.sound) info.earlyExit = info.earlyExit || !lastResolutionType.success } @@ -133,7 +136,6 @@ class CastingHarness private constructor( val (stackDescs, parenDescs, ravenmind) = generateDescs() return ControllerInfo( - info.playSound, this.stack.isEmpty() && this.parenCount == 0 && !this.escapeNext, lastResolutionType, stackDescs, @@ -146,7 +148,7 @@ class CastingHarness private constructor( fun getUpdate(iota: Iota, world: ServerLevel, continuation: SpellContinuation): CastResult { try { this.handleParentheses(iota)?.let { (data, resolutionType) -> - return@getUpdate CastResult(continuation, data, resolutionType, listOf()) + return@getUpdate CastResult(continuation, data, resolutionType, listOf(), EvalSound.GENERIC) } return if (iota is PatternIota) { @@ -169,6 +171,7 @@ class CastingHarness private constructor( Mishap.Context(HexPattern(HexDir.WEST), null) ) ), + EvalSound.MISHAP ) } } catch (mishap: Mishap) { @@ -179,11 +182,16 @@ class CastingHarness private constructor( listOf( OperatorSideEffect.DoMishap( mishap, - Mishap.Context((iota as? PatternIota)?.pattern ?: HexPattern(HexDir.WEST), getOperatorForPattern(iota, world)) + Mishap.Context( + (iota as? PatternIota)?.pattern ?: HexPattern(HexDir.WEST), + getOperatorForPattern(iota, world) + ) ) ), + EvalSound.MISHAP ) } catch (exception: Exception) { + // This means something very bad has happened exception.printStackTrace() return CastResult( continuation, @@ -192,9 +200,13 @@ class CastingHarness private constructor( listOf( OperatorSideEffect.DoMishap( MishapError(exception), - Mishap.Context((iota as? PatternIota)?.pattern ?: HexPattern(HexDir.WEST), getOperatorForPattern(iota, world)) + Mishap.Context( + (iota as? PatternIota)?.pattern ?: HexPattern(HexDir.WEST), + getOperatorForPattern(iota, world) + ) ) - ) + ), + EvalSound.MISHAP ) } } @@ -268,11 +280,28 @@ class CastingHarness private constructor( hereFd } + var soundType = + if (this.ctx.source == CastingContext.CastSource.STAFF) EvalSound.GENERIC else EvalSound.NONE; + for (se in sideEffects) { + if (se is OperatorSideEffect.AttemptSpell) { + if (se.hasCastingSound) { + soundType = soundType.greaterOf(EvalSound.SPELL_BOINK) + } else { + // WITH CATLIKE TREAD + // UPON OUR PREY WE STEAL + soundType = EvalSound.NONE + break + } + } else if (se is OperatorSideEffect.DoMishap) { + soundType = EvalSound.MISHAP + } + } return CastResult( cont2, fd, ResolvedPatternType.EVALUATED, sideEffects, + soundType, ) } catch (mishap: Mishap) { @@ -281,19 +310,7 @@ class CastingHarness private constructor( null, mishap.resolutionType(ctx), listOf(OperatorSideEffect.DoMishap(mishap, Mishap.Context(newPat, actionIdPair?.first))), - ) - } catch (exception: Exception) { - exception.printStackTrace() - return CastResult( - continuation, - null, - ResolvedPatternType.ERRORED, - listOf( - OperatorSideEffect.DoMishap( - MishapError(exception), - Mishap.Context(newPat, actionIdPair?.first) - ) - ) + EvalSound.MISHAP ) } } @@ -301,19 +318,21 @@ class CastingHarness private constructor( /** * Execute the side effects of a pattern, updating our aggregated info. */ - fun performSideEffects(info: TempControllerInfo, sideEffects: List) { + fun performSideEffects(info: TempControllerInfo, sideEffects: List, sound: EvalSound) { for (haskellProgrammersShakingandCryingRN in sideEffects) { val mustStop = haskellProgrammersShakingandCryingRN.performEffect(this) if (mustStop) { info.earlyExit = true break } - - if (haskellProgrammersShakingandCryingRN is OperatorSideEffect.AttemptSpell && - haskellProgrammersShakingandCryingRN.hasCastingSound - ) { - info.playSound = true - } + } + sound.soundEvent()?.let { + this.ctx.world.playSound( + null, this.ctx.position.x, this.ctx.position.y, this.ctx.position.z, it, + SoundSource.PLAYERS, 1f, 1f + ) + // TODO: is it worth mixing in to the immut map and making our own game event with blackjack and hookers + this.ctx.world.gameEvent(this.ctx.caster, GameEvent.ITEM_INTERACT_FINISH, this.ctx.position) } } @@ -626,7 +645,6 @@ class CastingHarness private constructor( } data class TempControllerInfo( - var playSound: Boolean, var earlyExit: Boolean, ) @@ -635,5 +653,6 @@ class CastingHarness private constructor( val newData: FunctionalData?, val resolutionType: ResolvedPatternType, val sideEffects: List, + val sound: EvalSound, ) } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ContinuationFrame.kt b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ContinuationFrame.kt index 6e7dfb11..6c886b6c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ContinuationFrame.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ContinuationFrame.kt @@ -61,16 +61,16 @@ sealed interface ContinuationFrame { harness: CastingHarness ): CastResult { // If there are patterns left... - if (list.nonEmpty) { + return if (list.nonEmpty) { val newCont = if (list.cdr.nonEmpty) { // yay TCO // ...enqueue the evaluation of the rest of the patterns... continuation.pushFrame(Evaluate(list.cdr)) } else continuation // ...before evaluating the first one in the list. - return harness.getUpdate(list.car, level, newCont) + harness.getUpdate(list.car, level, newCont) } else { // If there are no patterns (e.g. empty Hermes), just return OK. - return CastResult(continuation, null, ResolvedPatternType.EVALUATED, listOf()) + CastResult(continuation, null, ResolvedPatternType.EVALUATED, listOf(), EvalSound.NONE) } } @@ -98,7 +98,8 @@ sealed interface ContinuationFrame { continuation, FunctionalData(harness.stack.toList(), 0, listOf(), false, harness.ravenmind), ResolvedPatternType.EVALUATED, - listOf() + listOf(), + EvalSound.NONE, ) } @@ -163,11 +164,13 @@ sealed interface ContinuationFrame { } val tStack = stack.toMutableList() tStack.add(stackTop) + // TODO: this means we could have Thoth casting do a different sound return CastResult( newCont, FunctionalData(tStack, 0, listOf(), false, harness.ravenmind), ResolvedPatternType.EVALUATED, - listOf() + listOf(), + EvalSound.NONE, ) } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ControllerInfo.kt b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ControllerInfo.kt index bfcb334e..64d60aba 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ControllerInfo.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ControllerInfo.kt @@ -6,7 +6,6 @@ import net.minecraft.nbt.CompoundTag * Information for the sake of the GUI. */ data class ControllerInfo( - val makesCastSound: Boolean, val isStackClear: Boolean, val resolutionType: ResolvedPatternType, val stack: List, @@ -14,3 +13,4 @@ data class ControllerInfo( val ravenmind: CompoundTag?, val parenCount: Int, ) + diff --git a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/EvalSound.kt b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/EvalSound.kt new file mode 100644 index 00000000..0e2a4f47 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/EvalSound.kt @@ -0,0 +1,34 @@ +package at.petrak.hexcasting.api.spell.casting + +import at.petrak.hexcasting.common.lib.HexSounds +import net.minecraft.sounds.SoundEvent + +/** + * Sound that plays as a side-effect-adjacent when casting + */ +enum class EvalSound { + /** Silence */ + NONE, + + /** The generic "bvwonh" sound for non-spell ops */ + GENERIC, + + /** The "bwoink!" for spell ops */ + SPELL_BOINK, + + /** The "gvwoh" for mishaps */ + MISHAP; + + /** + * Which sound type has the greater priority? + */ + fun greaterOf(that: EvalSound): EvalSound = + EvalSound.values()[maxOf(this.ordinal, that.ordinal)] + + fun soundEvent(): SoundEvent? = when (this) { + NONE -> null + GENERIC -> HexSounds.ADD_PATTERN + SPELL_BOINK -> HexSounds.ACTUALLY_CAST + MISHAP -> HexSounds.FAIL_PATTERN + } +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/OperatorSideEffect.kt b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/OperatorSideEffect.kt index 551930c3..bf5f98df 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/OperatorSideEffect.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/OperatorSideEffect.kt @@ -9,9 +9,7 @@ import at.petrak.hexcasting.api.spell.RenderedSpell import at.petrak.hexcasting.api.spell.mishaps.Mishap import at.petrak.hexcasting.api.utils.asTranslatedComponent import at.petrak.hexcasting.common.lib.HexItems -import at.petrak.hexcasting.common.lib.HexSounds import net.minecraft.Util -import net.minecraft.sounds.SoundSource import net.minecraft.world.item.DyeColor import net.minecraft.world.item.ItemStack @@ -44,6 +42,7 @@ sealed class OperatorSideEffect { this.spell.cast(harness.ctx) if (awardStat) harness.ctx.caster.awardStat(HexStatistics.SPELLS_CAST) + return false } } @@ -92,11 +91,6 @@ sealed class OperatorSideEffect { ) ) - harness.ctx.world.playSound( - null, harness.ctx.position.x, harness.ctx.position.y, harness.ctx.position.z, - HexSounds.FAIL_PATTERN, SoundSource.PLAYERS, 1f, 1f - ) - mishap.execute(harness.ctx, errorCtx, harness.stack) return true diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index a826a5b2..ffcc6d9b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -65,22 +65,6 @@ class GuiSpellcasting constructor( it.type = info.resolutionType } - val mc = Minecraft.getInstance() - if (info.resolutionType.success) { - mc.soundManager.play( - SimpleSoundInstance( - HexSounds.ADD_PATTERN, - SoundSource.PLAYERS, - 0.5f, - 1f + (Math.random().toFloat() - 0.5f) * 0.1f, - randSrc, - this.ambianceSoundInstance!!.x, - this.ambianceSoundInstance!!.y, - this.ambianceSoundInstance!!.z, - ) - ) - } - this.cachedStack = info.stack this.cachedParens = info.parenthesized this.cachedRavenmind = info.ravenmind diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/RegisterPatterns.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/RegisterPatterns.java index 84dc4509..bc17b4c7 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/RegisterPatterns.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/RegisterPatterns.java @@ -91,19 +91,29 @@ public class RegisterPatterns { // == Modify Stack == - PatternRegistry.mapPattern(HexPattern.fromAngles("aawdd", HexDir.EAST), modLoc("swap"), OpSwap.INSTANCE); + PatternRegistry.mapPattern(HexPattern.fromAngles("aawdd", HexDir.EAST), modLoc("swap"), + new OpTwiddling(2, new int[]{1, 0})); PatternRegistry.mapPattern(HexPattern.fromAngles("aaeaa", HexDir.EAST), modLoc("rotate"), - OpRotate.INSTANCE); + new OpTwiddling(3, new int[]{1, 2, 0})); + PatternRegistry.mapPattern(HexPattern.fromAngles("ddqdd", HexDir.NORTH_EAST), modLoc("rotate-reverse"), + new OpTwiddling(3, new int[]{2, 0, 1})); PatternRegistry.mapPattern(HexPattern.fromAngles("aadaa", HexDir.EAST), modLoc("duplicate"), - OpDuplicate.INSTANCE); - PatternRegistry.mapPattern(HexPattern.fromAngles("aadaadaa", HexDir.EAST), modLoc("duplicate_n"), - OpDuplicateN.INSTANCE); + new OpTwiddling(1, new int[]{0, 0})); PatternRegistry.mapPattern(HexPattern.fromAngles("aaedd", HexDir.EAST), modLoc("over"), - OpOver.INSTANCE); + new OpTwiddling(2, new int[]{0, 1, 0})); + PatternRegistry.mapPattern(HexPattern.fromAngles("ddqaa", HexDir.EAST), modLoc("tuck"), + new OpTwiddling(2, new int[]{1, 0, 1})); + PatternRegistry.mapPattern(HexPattern.fromAngles("aadadaaw", HexDir.EAST), modLoc("2dup"), + new OpTwiddling(2, new int[]{0, 1, 0, 1})); + PatternRegistry.mapPattern(HexPattern.fromAngles("qwaeawqaeaqa", HexDir.NORTH_WEST), modLoc("stack_len"), OpStackSize.INSTANCE); + PatternRegistry.mapPattern(HexPattern.fromAngles("aadaadaa", HexDir.EAST), modLoc("duplicate_n"), + OpDuplicateN.INSTANCE); PatternRegistry.mapPattern(HexPattern.fromAngles("ddad", HexDir.WEST), modLoc("fisherman"), OpFisherman.INSTANCE); + PatternRegistry.mapPattern(HexPattern.fromAngles("aada", HexDir.EAST), modLoc("fisherman/copy"), + OpFishermanButItCopies.INSTANCE); PatternRegistry.mapPattern(HexPattern.fromAngles("qaawdde", HexDir.SOUTH_EAST), modLoc("swizzle"), OpAlwinfyHasAscendedToABeingOfPureMath.INSTANCE); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBeep.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBeep.kt index a3fd5eca..a56c47d2 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBeep.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBeep.kt @@ -7,6 +7,7 @@ import at.petrak.hexcasting.api.spell.iota.Iota import at.petrak.hexcasting.common.network.MsgBeepAck import at.petrak.hexcasting.xplat.IXplatAbstractions import net.minecraft.world.level.block.state.properties.NoteBlockInstrument +import net.minecraft.world.level.gameevent.GameEvent import net.minecraft.world.phys.Vec3 object OpBeep : SpellAction { @@ -33,6 +34,7 @@ object OpBeep : SpellAction { private data class Spell(val target: Vec3, val note: Int, val instrument: NoteBlockInstrument) : RenderedSpell { override fun cast(ctx: CastingContext) { IXplatAbstractions.INSTANCE.sendPacketNear(target, 128.0, ctx.world, MsgBeepAck(target, note, instrument)) + ctx.world.gameEvent(null, GameEvent.NOTE_BLOCK_PLAY, target) } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpFishermanButItCopies.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpFishermanButItCopies.kt new file mode 100644 index 00000000..e0dc1218 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpFishermanButItCopies.kt @@ -0,0 +1,28 @@ +package at.petrak.hexcasting.common.casting.operators.stack + +import at.petrak.hexcasting.api.spell.Action +import at.petrak.hexcasting.api.spell.OperationResult +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.casting.SpellContinuation +import at.petrak.hexcasting.api.spell.getPositiveIntUnderInclusive +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.mishaps.MishapNotEnoughArgs + +object OpFishermanButItCopies : Action { + override fun operate( + continuation: SpellContinuation, + stack: MutableList, + ravenmind: Iota?, + ctx: CastingContext + ): OperationResult { + if (stack.size < 2) + throw MishapNotEnoughArgs(2, stack.size) + + val depth = stack.getPositiveIntUnderInclusive(stack.lastIndex, stack.size - 1) + stack.removeLast() + val fish = stack.get(stack.size - 1 - depth) + stack.add(fish) + + return OperationResult(continuation, stack, ravenmind, listOf()) + } +} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpOver.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpOver.kt deleted file mode 100644 index 63039b2a..00000000 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpOver.kt +++ /dev/null @@ -1,15 +0,0 @@ -package at.petrak.hexcasting.common.casting.operators.stack - -import at.petrak.hexcasting.api.spell.ConstMediaAction -import at.petrak.hexcasting.api.spell.casting.CastingContext -import at.petrak.hexcasting.api.spell.iota.Iota - -// Had never heard of this operation before i heard it from uxn, but turns out it's from forth -// see also http://www.forth.org/Ting/Forth-for-the-Complete-Idiot/Forth-79-Handy-Reference.pdf -// "fisherman's" is called "roll," apparently -object OpOver : ConstMediaAction { - override val argc: Int - get() = 2 - - override fun execute(args: List, ctx: CastingContext): List = listOf(args[0], args[1], args[0]) -} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpRotate.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpRotate.kt deleted file mode 100644 index 614d662c..00000000 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpRotate.kt +++ /dev/null @@ -1,13 +0,0 @@ -package at.petrak.hexcasting.common.casting.operators.stack - -import at.petrak.hexcasting.api.spell.ConstMediaAction -import at.petrak.hexcasting.api.spell.casting.CastingContext -import at.petrak.hexcasting.api.spell.iota.Iota - -// more Forth -object OpRotate : ConstMediaAction { - override val argc: Int - get() = 3 - - override fun execute(args: List, ctx: CastingContext): List = listOf(args[1], args[2], args[0]) -} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpSwap.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpSwap.kt deleted file mode 100644 index 0d76b3fc..00000000 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpSwap.kt +++ /dev/null @@ -1,14 +0,0 @@ -package at.petrak.hexcasting.common.casting.operators.stack - -import at.petrak.hexcasting.api.spell.ConstMediaAction -import at.petrak.hexcasting.api.spell.casting.CastingContext -import at.petrak.hexcasting.api.spell.iota.Iota - -object OpSwap : ConstMediaAction { - override val argc: Int - get() = 2 - - override fun execute(args: List, ctx: CastingContext): List { - return args.asReversed() - } -} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpDuplicate.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpTwiddling.kt similarity index 65% rename from Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpDuplicate.kt rename to Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpTwiddling.kt index abb7308c..76103535 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpDuplicate.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpTwiddling.kt @@ -4,9 +4,10 @@ import at.petrak.hexcasting.api.spell.ConstMediaAction import at.petrak.hexcasting.api.spell.casting.CastingContext import at.petrak.hexcasting.api.spell.iota.Iota -object OpDuplicate : ConstMediaAction { +class OpTwiddling(val argumentCount: Int, val lookup: IntArray) : ConstMediaAction { override val argc: Int - get() = 1 + get() = this.argumentCount - override fun execute(args: List, ctx: CastingContext): List = listOf(args[0], args[0]) -} + override fun execute(args: List, ctx: CastingContext): List = + this.lookup.map(args::get) +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java index acf16f75..2dd455bf 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java @@ -43,6 +43,7 @@ public class ItemStaff extends Item { } player.awardStat(Stats.ITEM_USED.get(this)); +// player.gameEvent(GameEvent.ITEM_INTERACT_START); return InteractionResultHolder.success(player.getItemInHand(hand)); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemPackagedHex.java b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemPackagedHex.java index 5331a4fc..2b2cbaa9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemPackagedHex.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemPackagedHex.java @@ -6,14 +6,12 @@ import at.petrak.hexcasting.api.spell.casting.CastingHarness; import at.petrak.hexcasting.api.spell.iota.Iota; import at.petrak.hexcasting.api.utils.NBTHelper; import at.petrak.hexcasting.common.lib.HexIotaTypes; -import at.petrak.hexcasting.common.lib.HexSounds; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundSource; import net.minecraft.stats.Stat; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; @@ -108,7 +106,7 @@ public abstract class ItemPackagedHex extends ItemMediaHolder implements HexHold return InteractionResultHolder.fail(stack); } var sPlayer = (ServerPlayer) player; - var ctx = new CastingContext(sPlayer, usedHand); + var ctx = new CastingContext(sPlayer, usedHand, CastingContext.CastSource.PACKAGED_HEX); var harness = new CastingHarness(ctx); var info = harness.executeIotas(instrs, sPlayer.getLevel()); @@ -123,11 +121,6 @@ public abstract class ItemPackagedHex extends ItemMediaHolder implements HexHold player.awardStat(stat); sPlayer.getCooldowns().addCooldown(this, 5); - if (info.getMakesCastSound()) { - sPlayer.level.playSound(null, sPlayer.getX(), sPlayer.getY(), sPlayer.getZ(), - HexSounds.ACTUALLY_CAST, SoundSource.PLAYERS, 1f, - 1f + ((float) Math.random() - 0.5f) * 0.2f); - } if (broken) { stack.shrink(1); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternAck.java b/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternAck.java index 3d4ed66e..3b9388be 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternAck.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternAck.java @@ -27,7 +27,6 @@ public record MsgNewSpellPatternAck(ControllerInfo info, int index) implements I public static MsgNewSpellPatternAck deserialize(ByteBuf buffer) { var buf = new FriendlyByteBuf(buffer); - var wasSpellCast = buf.readBoolean(); var isStackEmpty = buf.readBoolean(); var resolutionType = buf.readEnum(ResolvedPatternType.class); var index = buf.readInt(); @@ -39,13 +38,12 @@ public record MsgNewSpellPatternAck(ControllerInfo info, int index) implements I var parenCount = buf.readVarInt(); return new MsgNewSpellPatternAck( - new ControllerInfo(wasSpellCast, isStackEmpty, resolutionType, stack, parens, raven, parenCount), index + new ControllerInfo(isStackEmpty, resolutionType, stack, parens, raven, parenCount), index ); } @Override public void serialize(FriendlyByteBuf buf) { - buf.writeBoolean(this.info.getMakesCastSound()); buf.writeBoolean(this.info.isStackClear()); buf.writeEnum(this.info.getResolutionType()); buf.writeInt(this.index); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternSyn.java b/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternSyn.java index 6e8c836e..5e580312 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternSyn.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternSyn.java @@ -8,14 +8,12 @@ import at.petrak.hexcasting.api.spell.casting.ResolvedPatternType; import at.petrak.hexcasting.api.spell.iota.PatternIota; import at.petrak.hexcasting.api.spell.math.HexCoord; import at.petrak.hexcasting.api.spell.math.HexPattern; -import at.petrak.hexcasting.common.lib.HexSounds; import at.petrak.hexcasting.xplat.IXplatAbstractions; import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import java.util.ArrayList; @@ -62,6 +60,7 @@ public record MsgNewSpellPatternSyn(InteractionHand handUsed, HexPattern pattern public void handle(MinecraftServer server, ServerPlayer sender) { server.execute(() -> { + // TODO: should we maybe not put tons of logic in a packet class var held = sender.getItemInHand(this.handUsed); if (held.is(HexItemTags.STAVES)) { boolean autoFail = false; @@ -87,16 +86,10 @@ public record MsgNewSpellPatternSyn(InteractionHand handUsed, HexPattern pattern ControllerInfo clientInfo; if (autoFail) { var descs = harness.generateDescs(); - clientInfo = new ControllerInfo(false, harness.getStack().isEmpty(), ResolvedPatternType.INVALID, + clientInfo = new ControllerInfo(harness.getStack().isEmpty(), ResolvedPatternType.INVALID, descs.getFirst(), descs.getSecond(), descs.getThird(), harness.getParenCount()); } else { clientInfo = harness.executeIota(new PatternIota(this.pattern), sender.getLevel()); - - if (clientInfo.getMakesCastSound()) { - sender.level.playSound(null, sender.getX(), sender.getY(), sender.getZ(), - HexSounds.ACTUALLY_CAST, SoundSource.PLAYERS, 1f, - 1f + ((float) Math.random() - 0.5f) * 0.2f); - } } if (clientInfo.isStackClear()) { @@ -110,7 +103,8 @@ public record MsgNewSpellPatternSyn(InteractionHand handUsed, HexPattern pattern IXplatAbstractions.INSTANCE.setPatterns(sender, resolvedPatterns); } - IXplatAbstractions.INSTANCE.sendPacketToPlayer(sender, new MsgNewSpellPatternAck(clientInfo, resolvedPatterns.size() - 1)); + IXplatAbstractions.INSTANCE.sendPacketToPlayer(sender, + new MsgNewSpellPatternAck(clientInfo, resolvedPatterns.size() - 1)); } }); } diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.json b/Common/src/main/resources/assets/hexcasting/lang/en_us.json index 04ff528b..c75ebadb 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.json +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.json @@ -650,7 +650,7 @@ "hexcasting.page.mishaps.disabled.title": "Disallowed Action", "hexcasting.page.mishaps.disabled": "I tried to cast an action that has been disallowed by a server administrator.$(br2)Causes black sparks.", "hexcasting.page.mishaps.other.title": "Catastrophic Failure", - "hexcasting.page.mishaps.other": "A bug in the mod caused an iota of an invalid type or otherwise caused the spell to crash. $(l:https://https://github.com/gamma-delta/HexMod/issues)Please open a bug report!/$$(br2)Causes black sparks.", + "hexcasting.page.mishaps.other": "A bug in the mod caused an iota of an invalid type or otherwise caused the spell to crash. $(l:https://github.com/gamma-delta/HexMod/issues)Please open a bug report!/$$(br2)Causes black sparks.", "hexcasting.entry.stack": "Stacks", "hexcasting.page.stack.1": "A $(thing)Stack/$, also known as a \"LIFO\", is a concept borrowed from computer science. In short, it's a collection of things designed so that you can only interact with the most recently used thing.$(br2)Think of a stack of plates, where new plates are added to the top: if you want to interact with a plate halfway down the stack, you have to remove the plates above it in order to get ahold of it.", @@ -1171,9 +1171,9 @@ "hexcasting.entry.lore.experiment1": "Wooleye Instance Notes", "hexcasting.page.lore.experiment1.1": "$(italic)I only managed to find these five entries from this log./$$(br2)Detonation #26$(li)Location: Carpenter's North$(li)Population: 174$(li)Nodes Formed: 3$(li)Node Distance from Epicenter: 55-80m vertical, 85-156m horizontal$(li)Media Generation: 1320 uθ/min", "hexcasting.page.lore.experiment1.2": "Detonation #27$(li)Location: Brackenfalls$(li)Population: 79$(li)Nodes Formed: 1$(li)Node Distance from Epicenter: 95m vertical, 67m horizontal$(li)Media Generation: 412 uθ/min", - "hexcasting.page.lore.experiment1.3": "Detonation #28$(li)Location: Greyston(li)Population: approx. 1000$(li)Nodes Formed: 18$(li)Node Distance from Epicenter: 47-110m vertical, 59-289m horizontal$(li)Media Generation: 8478 uθ/min", + "hexcasting.page.lore.experiment1.3": "Detonation #28$(li)Location: Greyston$(li)Population: approx. 1000$(li)Nodes Formed: 18$(li)Node Distance from Epicenter: 47-110m vertical, 59-289m horizontal$(li)Media Generation: 8478 uθ/min", "hexcasting.page.lore.experiment1.4": "Detonation #29$(li)Location: Unnamed; village two days west of Greyston$(li)Population: 35$(li)Nodes Formed: 0$(li)Node Distance from Epicenter: N/A$(li)Media Generation: N/A$(br2)Note: inhabitants still affected in the normal way", - "hexcasting.page.lore.experiment1.5": "Detonation #30$(li)Location: Boiling Brook(li)Population: 231$(li)Nodes Formed: 4$(li)Node Distance from Epicenter: 61-89m vertical, 78-191m horizontal$(li)Media Generation: 1862 uθ/min", + "hexcasting.page.lore.experiment1.5": "Detonation #30$(li)Location: Boiling Brook$(li)Population: 231$(li)Nodes Formed: 4$(li)Node Distance from Epicenter: 61-89m vertical, 78-191m horizontal$(li)Media Generation: 1862 uθ/min", "hexcasting.page.lore.experiment1.6": "Conclusion: approx 60 needed for one node. Too few consumes them but does not provide enough energy for node formation. Little correlation between input count and breadth/depth.$(br2)Effects on inhabitants still consistently more severe than with single-target testing, especially the physical effects.", "hexcasting.entry.lore.experiment2": "Wooleye Interview Logs", diff --git a/Common/src/main/resources/assets/hexcasting/lang/zh_cn.json b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.json new file mode 100644 index 00000000..d437e9d9 --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.json @@ -0,0 +1,1196 @@ +{ + "item.hexcasting.book": "咒术笔记", + "item.hexcasting.oak_staff": "橡木法杖", + "item.hexcasting.spruce_staff": "云杉木法杖", + "item.hexcasting.birch_staff": "白桦木法杖", + "item.hexcasting.jungle_staff": "丛林木法杖", + "item.hexcasting.acacia_staff": "金合欢木法杖", + "item.hexcasting.dark_oak_staff": "深色橡木法杖", + "item.hexcasting.crimson_staff": "绯红木法杖", + "item.hexcasting.warped_staff": "诡异木法杖", + "item.hexcasting.edified_staff": "启迪木法杖", + "item.hexcasting.focus": "核心", + "item.hexcasting.focus.sealed": "密封核心", + "item.hexcasting.spellbook": "法术书", + "item.hexcasting.cypher": "杂件", + "item.hexcasting.trinket": "缀品", + "item.hexcasting.artifact": "造物", + "item.hexcasting.battery": "媒质之瓶", + "item.hexcasting.amethyst_dust": "紫水晶粉", + "item.hexcasting.charged_amethyst": "充能紫水晶", + "item.hexcasting.lens": "探知透镜", + "item.hexcasting.scroll_small": "小型卷轴", + "item.hexcasting.scroll_small.of": "是如何拿到此%s卷轴的", + "item.hexcasting.scroll_small.empty": "空白小型卷轴", + "item.hexcasting.scroll_medium": "中型卷轴", + "item.hexcasting.scroll_medium.of": "是如何拿到此%s卷轴的", + "item.hexcasting.scroll_medium.empty": "空白中型卷轴", + "item.hexcasting.scroll": "大型卷轴", + "item.hexcasting.scroll.of": "%s之远古卷轴", + "item.hexcasting.scroll.empty": "空白大型卷轴", + "item.hexcasting.abacus": "算盘", + "item.hexcasting.jeweler_hammer": "珠宝匠锤", + "item.hexcasting.sub_sandwich": "潜艇三明治", + "item.hexcasting.dye_colorizer_white": "白色染色剂", + "item.hexcasting.dye_colorizer_orange": "橙色染色剂", + "item.hexcasting.dye_colorizer_magenta": "品红色染色剂", + "item.hexcasting.dye_colorizer_light_blue": "淡蓝色染色剂", + "item.hexcasting.dye_colorizer_yellow": "黄色染色剂", + "item.hexcasting.dye_colorizer_lime": "黄绿色染色剂", + "item.hexcasting.dye_colorizer_pink": "粉红色染色剂", + "item.hexcasting.dye_colorizer_gray": "灰色染色剂", + "item.hexcasting.dye_colorizer_light_gray": "淡灰色染色剂", + "item.hexcasting.dye_colorizer_cyan": "青色染色剂", + "item.hexcasting.dye_colorizer_purple": "紫色染色剂", + "item.hexcasting.dye_colorizer_blue": "蓝色染色剂", + "item.hexcasting.dye_colorizer_brown": "棕色染色剂", + "item.hexcasting.dye_colorizer_green": "绿色染色剂", + "item.hexcasting.dye_colorizer_red": "红色染色剂", + "item.hexcasting.dye_colorizer_black": "黑色染色剂", + "item.hexcasting.pride_colorizer_agender": "无性别染色剂", + "item.hexcasting.pride_colorizer_aroace": "无浪漫倾向无性恋染色剂", + "item.hexcasting.pride_colorizer_aromantic": "无浪漫倾向染色剂", + "item.hexcasting.pride_colorizer_asexual": "无性恋染色剂", + "item.hexcasting.pride_colorizer_bisexual": "双性恋染色剂", + "item.hexcasting.pride_colorizer_demiboy": "部分男性染色剂", + "item.hexcasting.pride_colorizer_demigirl": "部分女性染色剂", + "item.hexcasting.pride_colorizer_gay": "男同性恋染色剂", + "item.hexcasting.pride_colorizer_genderfluid": "性别流体染色剂", + "item.hexcasting.pride_colorizer_genderqueer": "性别酷儿染色剂", + "item.hexcasting.pride_colorizer_intersex": "双性人染色剂", + "item.hexcasting.pride_colorizer_lesbian": "女同性恋染色剂", + "item.hexcasting.pride_colorizer_nonbinary": "非二元性别染色剂", + "item.hexcasting.pride_colorizer_pansexual": "泛性恋染色剂", + "item.hexcasting.pride_colorizer_plural": "多重人格染色剂", + "item.hexcasting.pride_colorizer_transgender": "跨性别染色剂", + "item.hexcasting.uuid_colorizer": "灵魂闪光染色剂", + "item.hexcasting.creative_unlocker": "媒质立方", + "item.hexcasting.creative_unlocker.for_emphasis": "无限媒质", + "item.hexcasting.creative_unlocker.tooltip": "食用以解锁所有有关%s的知识。", + "item.hexcasting.creative_unlocker.mod_name": "咒法学", + + "item.hexcasting.lore_fragment": "故事残卷", + "item.hexcasting.lore_fragment.all": "似乎我已找齐了此世界上的所有故事。", + + "entity.hexcasting.wall_scroll": "壁挂卷轴", + + "block.hexcasting.conjured": "构筑的方块", + "block.hexcasting.slate.blank": "空白石板", + "block.hexcasting.slate.written": "有图案的石板", + "block.hexcasting.empty_impetus": "空白促动石", + "block.hexcasting.directrix_redstone": "石匠导向石", + "block.hexcasting.empty_directrix": "空白导向石", + "block.hexcasting.impetus_rightclick": "工具匠促动石", + "block.hexcasting.impetus_look": "制箭师促动石", + "block.hexcasting.impetus_storedplayer": "牧师促动石", + "block.hexcasting.akashic_record": "阿卡夏记录", + "block.hexcasting.akashic_bookshelf": "阿卡夏书架", + "block.hexcasting.akashic_connector": "阿卡夏桥接块", + + "block.hexcasting.slate_block": "板岩块", + "block.hexcasting.amethyst_dust_block": "紫水晶粉块", + "block.hexcasting.amethyst_tiles": "紫水晶瓦", + "block.hexcasting.scroll_paper": "纸卷轴", + "block.hexcasting.ancient_scroll_paper": "远古纸卷轴", + "block.hexcasting.scroll_paper_lantern": "纸灯笼", + "block.hexcasting.ancient_scroll_paper_lantern": "远古纸灯笼", + "block.hexcasting.amethyst_sconce": "紫水晶灯台", + "block.hexcasting.edified_log": "启迪原木", + "block.hexcasting.stripped_edified_log": "去皮启迪原木", + "block.hexcasting.edified_wood": "启迪木", + "block.hexcasting.stripped_edified_wood": "去皮启迪木", + "block.hexcasting.edified_planks": "启迪木板", + "block.hexcasting.edified_panel": "启迪木块", + "block.hexcasting.edified_tile": "启迪木方砖", + "block.hexcasting.edified_door": "启迪木门", + "block.hexcasting.edified_trapdoor": "启迪木活板门", + "block.hexcasting.edified_stairs": "启迪木楼梯", + "block.hexcasting.edified_slab": "启迪木台阶", + "block.hexcasting.edified_button": "启迪木按钮", + "block.hexcasting.edified_pressure_plate": "启迪木压力板", + "block.hexcasting.amethyst_edified_leaves": "晶紫启迪树叶", + "block.hexcasting.aventurine_edified_leaves": "砂蓝启迪树叶", + "block.hexcasting.citrine_edified_leaves": "晶黄启迪树叶", + + "itemGroup.hexcasting": "咒法学", + "itemGroup.hexcasting.creative_tab": "咒法学", + + "hexcasting.tooltip.spellbook.page": "所选书页 %d/%d", + "hexcasting.tooltip.spellbook.page.sealed": "所选书页 %d/%d(%s)", + "hexcasting.tooltip.spellbook.page_with_name": "所选书页 %d/%d(“%s”)", + "hexcasting.tooltip.spellbook.page_with_name.sealed": "所选书页 %d/%d(“%s”)(%s)", + "hexcasting.tooltip.spellbook.sealed": "已密封", + "hexcasting.tooltip.spellbook.empty": "空白", + "hexcasting.tooltip.spellbook.empty.sealed": "空白(%s)", + "hexcasting.tooltip.abacus": "%d", + "hexcasting.tooltip.abacus.reset": "重置为0", + "hexcasting.tooltip.abacus.reset.nice": "nice", + "hexcasting.tooltip.lens.bee": "%s只蜜蜂", + "hexcasting.tooltip.lens.bee.single": "%s只蜜蜂", + "hexcasting.tooltip.lens.impetus.storedplayer": "与%s绑定", + "hexcasting.tooltip.lens.impetus.storedplayer.none": "未绑定", + "hexcasting.tooltip.lens.pattern.invalid": "无效图案", + "hexcasting.tooltip.lens.akashic.bookshelf.location": "记录于%s", + "hexcasting.tooltip.lens.akashic.record.count": "存有%s个iota", + "hexcasting.tooltip.lens.akashic.record.count.single": "存有%s个iota", + "hexcasting.tooltip.brainsweep.min_level": "%s级或以上", + "hexcasting.tooltip.brainsweep.level": "%s级", + "hexcasting.tooltip.brainsweep.product": "无意识的躯体", + "hexcasting.spelldata.onitem": "存有:%s", + "hexcasting.spelldata.anything": "任意", + "hexcasting.spelldata.unknown": "损坏的iota", + "hexcasting.spelldata.entity.whoknows": "未知实体", + "hexcasting.spelldata.akashic.nopos": "阿卡夏记录无法读取此处iota(这是个bug)", + + "hexcasting.tooltip.media": "%s 紫水晶粉", + "hexcasting.tooltip.media_amount": "含有:%s(%s)", + "hexcasting.tooltip.media_amount.advanced": "含有:%s/%s(%s)", + + "hexcasting.tooltip.list_contents": "[%s]", + "hexcasting.tooltip.pattern_iota": "HexPattern(%s)", + "hexcasting.tooltip.null_iota": "NULL", + "hexcasting.tooltip.boolean_true": "True", + "hexcasting.tooltip.boolean_false": "False", + + "hexcasting.iota.hexcasting:null": "Null", + "hexcasting.iota.hexcasting:double": "数", + "hexcasting.iota.hexcasting:boolean": "布尔值", + "hexcasting.iota.hexcasting:entity": "实体", + "hexcasting.iota.hexcasting:list": "列表", + "hexcasting.iota.hexcasting:pattern": "图案", + "hexcasting.iota.hexcasting:garbage": "垃圾", + "hexcasting.iota.hexcasting:vec3": "向量", + + "gui.hexcasting.spellcasting": "咒术网格", + "tag.hexcasting.staves": "咒术法杖", + "tag.hexcasting.edified_logs": "启迪原木", + "tag.hexcasting.edified_planks": "启迪木板", + "tag.hexcasting.phial_base": "空试剂瓶", + "emi.category.hexcasting.brainsweep": "剥离意识", + "emi.category.hexcasting.craft.battery": "制作试剂瓶", + "emi.category.hexcasting.edify": "启迪树苗", + "emi.category.hexcasting.villager_leveling": "职业等级", + "emi.category.hexcasting.villager_profession": "村民职业", + + "advancement.hexcasting:root": "咒法学研究", + "advancement.hexcasting:root.desc": "在地底深处找到并采集不断生长着的、凝聚的媒质", + "advancement.hexcasting:enlightenment": "获得启迪", + "advancement.hexcasting:enlightenment.desc": "施放咒术至生命将尽来击碎屏障", + "advancement.hexcasting:wasteful_cast": "勤俭节约……", + "advancement.hexcasting:wasteful_cast.desc": "施放咒术时浪费巨量媒质", + "advancement.hexcasting:big_cast": "……吃穿不缺", + "advancement.hexcasting:big_cast.desc": "耗费巨量媒质以施放一个咒术", + "advancement.hexcasting:y_u_no_cast_angy": "盲目绘制", + "advancement.hexcasting:y_u_no_cast_angy.desc": "尝试根据卷轴施放法术,然后失败", + "advancement.hexcasting:opened_eyes": "恍然大悟", + "advancement.hexcasting:opened_eyes.desc": "用你的一部分意识向自然换取一个咒术。让自然再拿些又会怎样呢?", + "advancement.hexcasting:lore": "咒法学故事", + "advancement.hexcasting:lore.desc": "阅读一份故事残卷", + "advancement.hexcasting:lore/terabithia1": "泰瑞宾西娅·斯蒂勒斯", + "advancement.hexcasting:lore/terabithia1.desc": "泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#1", + "advancement.hexcasting:lore/terabithia2": "泰瑞宾西娅·斯蒂勒斯", + "advancement.hexcasting:lore/terabithia2.desc": "泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#2", + "advancement.hexcasting:lore/terabithia3": "泰瑞宾西娅·斯蒂勒斯", + "advancement.hexcasting:lore/terabithia3.desc": "泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#3,第一部分", + "advancement.hexcasting:lore/terabithia4": "泰瑞宾西娅·斯蒂勒斯", + "advancement.hexcasting:lore/terabithia4.desc": "泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#3,第二部分", + "advancement.hexcasting:lore/terabithia5": "泰瑞宾西娅·斯蒂勒斯", + "advancement.hexcasting:lore/terabithia5.desc": "泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#4", + "advancement.hexcasting:lore/experiment1": "“毡障”实例笔记", + "advancement.hexcasting:lore/experiment2": "“毡障”采访日志", + "advancement.hexcasting:lore/inventory": "回收日志 #72", + + "stat.hexcasting.media_used": "消耗媒质数量(以紫水晶粉计)", + "stat.hexcasting.media_overcasted": "过度施法消耗媒质数量(以紫水晶粉计)", + "stat.hexcasting.patterns_drawn": "绘制图案次数", + "stat.hexcasting.spells_cast": "施放法术次数", + + "death.attack.hexcasting.overcast": "%s的意识消散为了能量", + "death.attack.hexcasting.shame": "%s真是可耻!", + + "command.hexcasting.pats.listing": "此世界特有的图案:", + "command.hexcasting.pats.all": "给予%s所有%d张卷轴", + "command.hexcasting.pats.specific.success": "给予%3$sID为%2$s的%1$s", + "command.hexcasting.recalc": "已重生成此世界特有图案", + "command.hexcasting.brainsweep": "已清除%s的意识", + "command.hexcasting.brainsweep.fail.badtype": "%s不是村民", + "command.hexcasting.brainsweep.fail.already": "%s早已没有了意识", + "hexcasting.pattern.unknown": "未知图案资源 %s", + "hexcasting.debug.media_withdrawn": "%s - 取出的媒质:%s", + "hexcasting.debug.media_withdrawn.with_dust": "%s - 取出的媒质:%s(计%s个紫水晶粉)", + "hexcasting.debug.media_inserted": "%s - 存入的媒质:%s", + "hexcasting.debug.media_inserted.with_dust": "%s - 存入的媒质:%s(计%s个紫水晶粉)", + "hexcasting.debug.all_media": "所有媒质", + "hexcasting.debug.infinite_media": "无限", + + "hexcasting.message.cant_overcast": "这个咒术需求的媒质量比我有的还多……我应该再算几遍。", + "hexcasting.message.cant_great_spell": "奇怪,法术没起效……也许我还不够熟练?", + + "hexcasting.subtitles.start_pattern": "开始绘制", + "hexcasting.subtitles.add_line": "绘制线段", + "hexcasting.subtitles.add_pattern": "绘制图案", + "hexcasting.subtitles.fail_pattern": "图案:失效", + "hexcasting.subtitles.ambiance": "咒术网格:嗡鸣", + "hexcasting.subtitles.cast": "咒术:施放", + "hexcasting.subtitles.abacus": "算盘:咔哒", + "hexcasting.subtitles.abacus.shake": "算盘:摇晃", + "hexcasting.subtitles.spellcircle.add_pattern": "法术环:噼啪作响", + "hexcasting.subtitles.spellcircle.fail": "法术环:失效", + "hexcasting.subtitles.spellcircle.cast": "法术环:施法", + "hexcasting.subtitles.scroll.dust": "卷轴:被施粉", + "hexcasting.subtitles.scroll.scribble": "卷轴:被涂写", + "hexcasting.subtitles.impetus.fletcher.tick": "制箭师促动石:咔哒", + "hexcasting.subtitles.impetus.cleric.register": "牧师促动石:叮~", + "hexcasting.subtitles.lore_fragment.read": "故事残卷:被阅读", + + "_comment": "hexcasting.spell.book keys override the name of a pattern in the patchouli book if present", + + "hexcasting.spell.book.hexcasting:get_entity_height": "测高仪之纯化", + "hexcasting.spell.book.hexcasting:get_entity/animal": "实体之纯化:动物", + "hexcasting.spell.book.hexcasting:get_entity/monster": "实体之纯化:怪物", + "hexcasting.spell.book.hexcasting:get_entity/item": "实体之纯化:物品", + "hexcasting.spell.book.hexcasting:get_entity/player": "实体之纯化:玩家", + "hexcasting.spell.book.hexcasting:get_entity/living": "实体之纯化:生物", + "hexcasting.spell.book.hexcasting:zone_entity": "区域之馏化:任意", + "hexcasting.spell.book.hexcasting:zone_entity/animal": "区域之馏化:动物", + "hexcasting.spell.book.hexcasting:zone_entity/monster": "区域之馏化:怪物", + "hexcasting.spell.book.hexcasting:zone_entity/item": "区域之馏化:物品", + "hexcasting.spell.book.hexcasting:zone_entity/player": "区域之馏化:玩家", + "hexcasting.spell.book.hexcasting:zone_entity/living": "区域之馏化:生物", + "hexcasting.spell.book.hexcasting:zone_entity/not_animal": "区域之馏化:非动物", + "hexcasting.spell.book.hexcasting:zone_entity/not_monster": "区域之馏化:非怪物", + "hexcasting.spell.book.hexcasting:zone_entity/not_item": "区域之馏化:非物品", + "hexcasting.spell.book.hexcasting:zone_entity/not_player": "区域之馏化:非玩家", + "hexcasting.spell.book.hexcasting:zone_entity/not_living": "区域之馏化:非生物", + "hexcasting.spell.book.hexcasting:mul_dot": "乘法之馏化", + "hexcasting.spell.book.hexcasting:div_cross": "除法之馏化", + "hexcasting.spell.book.hexcasting:arcsin": "反正弦之纯化", + "hexcasting.spell.book.hexcasting:arccos": "反余弦之纯化", + "hexcasting.spell.book.hexcasting:arctan": "反正切之纯化", + "hexcasting.spell.book.hexcasting:const/vec/x": "向量之精思,+X/-X型", + "hexcasting.spell.book.hexcasting:const/vec/y": "向量之精思,+Y/-Y型", + "hexcasting.spell.book.hexcasting:const/vec/z": "向量之精思,+Z/-Z型", + "hexcasting.spell.book.hexcasting:write/entity": "编年史家之策略", + "hexcasting.spell.book.hexcasting:number": "数字之精思", + "hexcasting.spell.book.hexcasting:mask": "簿记员之策略", + + "hexcasting.spell.hexcasting:const/null": "空元之精思", + "hexcasting.spell.hexcasting:const/vec/px": "向量之精思,+X型", + "hexcasting.spell.hexcasting:const/vec/py": "向量之精思,+Y型", + "hexcasting.spell.hexcasting:const/vec/pz": "向量之精思,+Z型", + "hexcasting.spell.hexcasting:const/vec/nx": "向量之精思,-X型", + "hexcasting.spell.hexcasting:const/vec/ny": "向量之精思,-Y型", + "hexcasting.spell.hexcasting:const/vec/nz": "向量之精思,-Z型", + "hexcasting.spell.hexcasting:const/vec/0": "向量之精思,零型", + "hexcasting.spell.hexcasting:const/true": "真之精思", + "hexcasting.spell.hexcasting:const/false": "假之精思", + "hexcasting.spell.hexcasting:const/double/pi": "弧之精思", + "hexcasting.spell.hexcasting:const/double/tau": "圆之精思", + "hexcasting.spell.hexcasting:const/double/e": "欧拉之精思", + + "hexcasting.spell.hexcasting:get_caster": "意识之精思", + "hexcasting.spell.hexcasting:entity_pos/eye": "指南针之纯化", + "hexcasting.spell.hexcasting:entity_pos/foot": "指南针之纯化,第二型", + "hexcasting.spell.hexcasting:get_entity_look": "照准仪之纯化", + "hexcasting.spell.hexcasting:get_entity_height": "测高仪之纯化", + "hexcasting.spell.hexcasting:get_entity_velocity": "步伐之纯化", + "hexcasting.spell.hexcasting:raycast": "弓箭手之馏化", + "hexcasting.spell.hexcasting:raycast/axis": "建筑师之馏化", + "hexcasting.spell.hexcasting:raycast/entity": "侦查员之馏化", + "hexcasting.spell.hexcasting:circle/impetus_pos": "指路石之精思", + "hexcasting.spell.hexcasting:circle/impetus_dir": "磁石之精思", + "hexcasting.spell.hexcasting:circle/bounds/min": "次要折角之精思", + "hexcasting.spell.hexcasting:circle/bounds/max": "主要折角之精思", + + "hexcasting.spell.hexcasting:append": "整合之馏化", + "hexcasting.spell.hexcasting:concat": "组合之馏化", + "hexcasting.spell.hexcasting:index": "选择之馏化", + "hexcasting.spell.hexcasting:list_size": "算盘之纯化", + "hexcasting.spell.hexcasting:singleton": "单体之纯化", + "hexcasting.spell.hexcasting:empty_list": "空无之精思", + "hexcasting.spell.hexcasting:reverse_list": "逆行之纯化", + "hexcasting.spell.hexcasting:last_n_list": "群体之策略", + "hexcasting.spell.hexcasting:splat": "群体之拆解", + "hexcasting.spell.hexcasting:index_of": "定位器之馏化", + "hexcasting.spell.hexcasting:list_remove": "切除器之馏化", + "hexcasting.spell.hexcasting:slice": "选择之提整", + "hexcasting.spell.hexcasting:modify_in_place": "外科医师之提整", + "hexcasting.spell.hexcasting:construct": "演讲者之馏化", + "hexcasting.spell.hexcasting:deconstruct": "演讲者之分解", + + "hexcasting.spell.hexcasting:get_entity": "实体之纯化", + "hexcasting.spell.hexcasting:get_entity/animal": "实体之纯化:动物", + "hexcasting.spell.hexcasting:get_entity/monster": "实体之纯化:怪物", + "hexcasting.spell.hexcasting:get_entity/item": "实体之纯化:物品", + "hexcasting.spell.hexcasting:get_entity/player": "实体之纯化:玩家", + "hexcasting.spell.hexcasting:get_entity/living": "实体之纯化:生物", + "hexcasting.spell.hexcasting:zone_entity": "区域之馏化:任意", + "hexcasting.spell.hexcasting:zone_entity/animal": "区域之馏化:动物", + "hexcasting.spell.hexcasting:zone_entity/monster": "区域之馏化:怪物", + "hexcasting.spell.hexcasting:zone_entity/item": "区域之馏化:物品", + "hexcasting.spell.hexcasting:zone_entity/player": "区域之馏化:玩家", + "hexcasting.spell.hexcasting:zone_entity/living": "区域之馏化:生物", + "hexcasting.spell.hexcasting:zone_entity/not_animal": "区域之馏化:非动物", + "hexcasting.spell.hexcasting:zone_entity/not_monster": "区域之馏化:非怪物", + "hexcasting.spell.hexcasting:zone_entity/not_item": "区域之馏化:非物品", + "hexcasting.spell.hexcasting:zone_entity/not_player": "区域之馏化:非玩家", + "hexcasting.spell.hexcasting:zone_entity/not_living": "区域之馏化:非生物", + + "hexcasting.spell.hexcasting:duplicate": "双子之分解", + "hexcasting.spell.hexcasting:duplicate_n": "双子之策略", + "hexcasting.spell.hexcasting:over": "狄俄斯库里之策略", + "hexcasting.spell.hexcasting:stack_len": "群体之精思", + "hexcasting.spell.hexcasting:swap": "弄臣之策略", + "hexcasting.spell.hexcasting:fisherman": "渔夫之策略", + "hexcasting.spell.hexcasting:swizzle": "骗徒之策略", + + "hexcasting.spell.hexcasting:and_bit": "交叉之馏化", + "hexcasting.spell.hexcasting:or_bit": "统一之馏化", + "hexcasting.spell.hexcasting:xor_bit": "排斥之馏化", + "hexcasting.spell.hexcasting:not_bit": "反相之纯化", + "hexcasting.spell.hexcasting:to_set": "唯一之纯化", + "hexcasting.spell.hexcasting:and": "合取之馏化", + "hexcasting.spell.hexcasting:or": "析取之馏化", + "hexcasting.spell.hexcasting:xor": "互斥之馏化", + + "hexcasting.spell.hexcasting:greater": "至大之馏化", + "hexcasting.spell.hexcasting:less": "至小之馏化", + "hexcasting.spell.hexcasting:greater_eq": "至大之馏化,第二型", + "hexcasting.spell.hexcasting:less_eq": "至小之馏化,第二型", + "hexcasting.spell.hexcasting:equals": "相等之馏化", + "hexcasting.spell.hexcasting:not_equals": "不等之馏化", + "hexcasting.spell.hexcasting:not": "取非之纯化", + "hexcasting.spell.hexcasting:bool_coerce": "占卜师之纯化", + "hexcasting.spell.hexcasting:if": "占卜师之提整", + + "hexcasting.spell.hexcasting:add": "加法之馏化", + "hexcasting.spell.hexcasting:sub": "减法之馏化", + "hexcasting.spell.hexcasting:mul_dot": "乘法之馏化", + "hexcasting.spell.hexcasting:div_cross": "除法之馏化", + "hexcasting.spell.hexcasting:abs_len": "长度之纯化", + "hexcasting.spell.hexcasting:pow_proj": "乘方之馏化", + "hexcasting.spell.hexcasting:floor": "取底之纯化", + "hexcasting.spell.hexcasting:ceil": "取顶之纯化", + "hexcasting.spell.hexcasting:modulo": "余数之馏化", + "hexcasting.spell.hexcasting:construct_vec": "向量之提整", + "hexcasting.spell.hexcasting:deconstruct_vec": "向量之拆解", + "hexcasting.spell.hexcasting:sin": "正弦之纯化", + "hexcasting.spell.hexcasting:cos": "余弦之纯化", + "hexcasting.spell.hexcasting:tan": "正切之纯化", + "hexcasting.spell.hexcasting:arcsin": "反正弦之纯化", + "hexcasting.spell.hexcasting:arccos": "反余弦之纯化", + "hexcasting.spell.hexcasting:arctan": "反正切之纯化", + "hexcasting.spell.hexcasting:random": "熵之精思", + "hexcasting.spell.hexcasting:logarithm": "对数之馏化", + "hexcasting.spell.hexcasting:coerce_axial": "轴向之纯化", + + "hexcasting.spell.hexcasting:read": "书吏之精思", + "hexcasting.spell.hexcasting:read/entity": "编年史家之纯化", + "hexcasting.spell.hexcasting:write": "书吏之策略", + "hexcasting.spell.hexcasting:write/entity": "编年史家之策略", + "hexcasting.spell.hexcasting:readable": "审计员之精思", + "hexcasting.spell.hexcasting:writable": "估价员之精思", + "hexcasting.spell.hexcasting:readable/entity": "审计员之纯化", + "hexcasting.spell.hexcasting:writable/entity": "估价员之纯化", + "hexcasting.spell.hexcasting:akashic/read": "阿卡夏之馏化", + "hexcasting.spell.hexcasting:akashic/write": "阿卡夏之策略", + "hexcasting.spell.hexcasting:read/local": "雾尼之精思", + "hexcasting.spell.hexcasting:write/local": "福金之策略", + + "hexcasting.spell.hexcasting:print": "揭示", + "hexcasting.spell.hexcasting:beep": "弹奏音符", + "hexcasting.spell.hexcasting:explode": "爆炸", + "hexcasting.spell.hexcasting:explode/fire": "火球", + "hexcasting.spell.hexcasting:add_motion": "驱动", + "hexcasting.spell.hexcasting:blink": "闪现", + "hexcasting.spell.hexcasting:break_block": "破坏方块", + "hexcasting.spell.hexcasting:place_block": "放置方块", + "hexcasting.spell.hexcasting:craft/cypher": "制作杂件", + "hexcasting.spell.hexcasting:craft/trinket": "制作缀品", + "hexcasting.spell.hexcasting:craft/artifact": "制作造物", + "hexcasting.spell.hexcasting:craft/battery": "制作试剂瓶", + "hexcasting.spell.hexcasting:recharge": "重新充能", + "hexcasting.spell.hexcasting:erase": "清除物品", + "hexcasting.spell.hexcasting:create_water": "制造水源", + "hexcasting.spell.hexcasting:destroy_water": "清除流体", + "hexcasting.spell.hexcasting:ignite": "点燃方块", + "hexcasting.spell.hexcasting:extinguish": "广域熄灭", + "hexcasting.spell.hexcasting:conjure_block": "构筑方块", + "hexcasting.spell.hexcasting:conjure_light": "构筑光源", + "hexcasting.spell.hexcasting:bonemeal": "催生", + "hexcasting.spell.hexcasting:edify": "启迪树苗", + "hexcasting.spell.hexcasting:colorize": "内化染色剂", + "hexcasting.spell.hexcasting:sentinel/create": "召唤哨卫", + "hexcasting.spell.hexcasting:sentinel/destroy": "驱除哨卫", + "hexcasting.spell.hexcasting:sentinel/get_pos": "定位哨卫", + "hexcasting.spell.hexcasting:sentinel/wayfind": "寻路至哨卫", + "hexcasting.spell.hexcasting:potion/weakness": "白阳西沉", + "hexcasting.spell.hexcasting:potion/levitation": "蓝阳西沉", + "hexcasting.spell.hexcasting:potion/wither": "黑阳西沉", + "hexcasting.spell.hexcasting:potion/poison": "红阳西沉", + "hexcasting.spell.hexcasting:potion/slowness": "绿阳西沉", + + "hexcasting.spell.hexcasting:potion/regeneration": "白阳当空", + "hexcasting.spell.hexcasting:potion/night_vision": "蓝阳当空", + "hexcasting.spell.hexcasting:potion/absorption": "黑阳当空", + "hexcasting.spell.hexcasting:potion/haste": "红阳当空", + "hexcasting.spell.hexcasting:potion/strength": "绿阳当空", + "hexcasting.spell.hexcasting:flight": "飞行", + "hexcasting.spell.hexcasting:lightning": "召雷", + "hexcasting.spell.hexcasting:summon_rain": "召雨", + "hexcasting.spell.hexcasting:dispel_rain": "驱雨", + "hexcasting.spell.hexcasting:create_lava": "制造熔岩", + "hexcasting.spell.hexcasting:teleport": "卓越传送", + "hexcasting.spell.hexcasting:brainsweep": "剥离意识", + "hexcasting.spell.hexcasting:sentinel/create/great": "召唤卓越哨卫", + + "hexcasting.spell.hexcasting:open_paren": "内省", + "hexcasting.spell.hexcasting:close_paren": "反思", + "hexcasting.spell.hexcasting:escape": "考察", + "hexcasting.spell.hexcasting:eval": "赫尔墨斯之策略", + "hexcasting.spell.hexcasting:for_each": "托特之策略", + "hexcasting.spell.hexcasting:halt": "卡戎之策略", + "hexcasting.spell.hexcasting:number": "数字之精思:%s", + "hexcasting.spell.hexcasting:mask": "簿记员之策略:%s", + "hexcasting.spell.null": "未知图案", + + "hexcasting.spell.hexcasting:interop/gravity/get": "引力之纯化", + "hexcasting.spell.hexcasting:interop/gravity/set": "改变引力", + "hexcasting.spell.hexcasting:interop/pehkui/get": "格列佛之纯化", + "hexcasting.spell.hexcasting:interop/pehkui/set": "改变缩放", + + "hexcasting.mishap.invalid_pattern": "该图案不对应任何操作", + "hexcasting.mishap.unescaped": "本应运行一个图案,实际却运行了%s", + "hexcasting.mishap.invalid_value": "%1$s本应在栈下标为%3$s处接受%2$s,实际却接受了%4$s", + "hexcasting.mishap.invalid_value.class.double": "一个数", + "hexcasting.mishap.invalid_value.class.boolean": "一个布尔值", + "hexcasting.mishap.invalid_value.class.vector": "一个向量", + "hexcasting.mishap.invalid_value.class.list": "一个列表", + "hexcasting.mishap.invalid_value.class.widget": "一个虚指", + "hexcasting.mishap.invalid_value.class.pattern": "一个图案", + "hexcasting.mishap.invalid_value.class.entity.item": "一个物品实体", + "hexcasting.mishap.invalid_value.class.entity.player": "一个玩家", + "hexcasting.mishap.invalid_value.class.entity.villager": "一个村民", + "hexcasting.mishap.invalid_value.class.entity.living": "一个生物", + "hexcasting.mishap.invalid_value.class.entity": "一个实体", + "hexcasting.mishap.invalid_value.class.unknown": "(未知,这是个bug)", + "hexcasting.mishap.invalid_value.numvec": "一个数或向量", + "hexcasting.mishap.invalid_value.numlist": "一个整数或列表", + "hexcasting.mishap.invalid_value.list.pattern": "一个由图案组成的列表", + "hexcasting.mishap.invalid_value.double.positive": "一个正数", + "hexcasting.mishap.invalid_value.double.positive.less": "一个小于%d的正数", + "hexcasting.mishap.invalid_value.double.positive.less.equal": "一个小于等于%d的正数", + "hexcasting.mishap.invalid_value.double.between": "一个介于%d和%d之间的数", + "hexcasting.mishap.invalid_value.int": "一个整数", + "hexcasting.mishap.invalid_value.int.positive": "一个正整数", + "hexcasting.mishap.invalid_value.int.positive.less": "一个小于%d的正整数", + "hexcasting.mishap.invalid_value.int.positive.less.equal": "一个小于等于%d的正整数", + "hexcasting.mishap.invalid_value.int.between": "一个介于%d和%d之间的整数", + "hexcasting.mishap.invalid_value.evaluatable": "可运行的事物", + "hexcasting.mishap.not_enough_args": "%s本应接受大于等于%s个参数,而实际栈中元素数为%s", + "hexcasting.mishap.no_args": "%s本应接受大于等于%s个参数,而实际为空栈", + "hexcasting.mishap.too_many_close_parens": "在绘制反思前未先绘制内省", + "hexcasting.mishap.location_too_far": "%s超出了%s的影响范围", + "hexcasting.mishap.location_out_of_world": "%s不在此世界内", + "hexcasting.mishap.location_too_close_to_out": "%s离世界边界太近了", + "hexcasting.mishap.wrong_dimension": "%1$s无法在%3$s中影响到%2$s", + "hexcasting.mishap.entity_too_far": "%s超出了%s的影响范围", + "hexcasting.mishap.immune_entity": "%s无法影响到%s", + "hexcasting.mishap.eval_too_deep": "递归深度过大", + "hexcasting.mishap.no_item": "%s需要%s,而实际无对应物品", + "hexcasting.mishap.no_item.offhand": "%s需要在另一只手里持有%s,而实际无对应物品", + "hexcasting.mishap.bad_entity": "%s需要%s,而实际接受了%s", + "hexcasting.mishap.bad_item": "%s需要%s,而实际持有%d个%s", + "hexcasting.mishap.bad_item.offhand": "%s需要在另一只手里持有%s,而实际持有%d个%s", + "hexcasting.mishap.bad_item.iota": "一个可以存储iota的地方", + "hexcasting.mishap.bad_item.iota.read": "一个可以读出iota的地方", + "hexcasting.mishap.bad_item.iota.write": "一个可以写入iota的地方", + "hexcasting.mishap.bad_item.iota.readonly": "一个能够接受%s的地方", + "hexcasting.mishap.bad_item.media": "含有媒质的物品", + "hexcasting.mishap.bad_item.media_for_battery": "天然含有媒质的物品", + "hexcasting.mishap.bad_item.only_one": "仅一个物品", + "hexcasting.mishap.bad_item.eraseable": "一个可清除的物品", + "hexcasting.mishap.bad_item.bottle": "一个玻璃瓶", + "hexcasting.mishap.bad_item.rechargable": "一个可重新充能的物品", + "hexcasting.mishap.bad_item.colorizer": "一个染色剂", + "hexcasting.mishap.bad_block": "本应在%2$s处接受%1$s,而实际接受了%3$s", + "hexcasting.mishap.bad_block.sapling": "一个树苗", + "hexcasting.mishap.bad_block.replaceable": "放置方块的地方", + "hexcasting.mishap.bad_brainsweep": "%s排斥此村民的意识", + "hexcasting.mishap.already_brainswept": "此村民已被使用", + "hexcasting.mishap.no_spell_circle": "%s需在法术环上执行", + "hexcasting.mishap.others_name": "试图侵犯%s的灵魂的隐私", + "hexcasting.mishap.others_name.self": "试图随意泄露我自己真名的秘密", + "hexcasting.mishap.divide_by_zero.divide": "试图用%2$s除%1$s", + "hexcasting.mishap.divide_by_zero.project": "试图将%s投影至%s", + "hexcasting.mishap.divide_by_zero.exponent": "试图计算%s的%s", + "hexcasting.mishap.divide_by_zero.logarithm": "试图计算%s以%s为底的对数", + "hexcasting.mishap.divide_by_zero.zero": "零", + "hexcasting.mishap.divide_by_zero.zero.power": "零次幂", + "hexcasting.mishap.divide_by_zero.zero.vec": "零向量", + "hexcasting.mishap.divide_by_zero.power": "%s次幂", + "hexcasting.mishap.divide_by_zero.sin": "%s的正弦", + "hexcasting.mishap.divide_by_zero.cos": "%s的余弦", + "hexcasting.mishap.no_akashic_record": "%s处无阿卡夏记录", + "hexcasting.mishap.disallowed": "%s已被服务器管理员禁止施法", + "hexcasting.mishap.disallowed_circle": "%s已被服务器管理员禁止使用法术环", + "hexcasting.mishap.invalid_spell_datum_type": "尝试将某无效类型的值用作SpellDatum:%s(class %s)。这是模组中的bug。", + "hexcasting.mishap.unknown": "%s抛出异常(%s)。这是模组中的bug。", + "hexcasting.mishap.shame": "你真是可耻!", + + "_comment": "Patchi stuff", + + "hexcasting.landing": "我似乎发现了一种全新的魔法,一种在六边形网格上画各式奇诡图案的魔法。它深深地迷住了我。我决定着手撰写一本笔记,以此记述我的想法和研究成果。$(br2)$(l:https://discord.gg/4xxHGYteWk)Discord 链接/$", + + "hexcasting.entry.basics": "初入咒法", + "hexcasting.entry.basics.desc": "研究这种魔法的人士会用$(l:items/staff)$(item)法杖/$在空中绘制奇异的图案来施放他们口中的“$(hex)咒术/$”,他们也会让$(l:items/hexcasting)$(item)强大的魔法物品/$替他们施法。我应该也可以这样做?", + + "hexcasting.entry.casting": "咒法学", + "hexcasting.entry.casting.desc": "我好像已经开始理解以前的咒法师们是如何施放$(hex)咒术/$的了!虽然有些复杂,但我坚信我能理清其中脉络。继续研究吧……", + + "hexcasting.entry.items": "物品", + "hexcasting.entry.items.desc": "这部分主要介绍我在研究过程中可能要用到的魔法物品和各类神秘物品。$(br2)这里面的许多物品似乎在和$(l:items/staff)$(item)法杖/$一起持有的时候就会起效。要谨慎考虑另一只手里要拿什么物品。", + + "hexcasting.entry.greatwork": "卓伟之作", + "hexcasting.entry.greatwork.desc": "我所见……甚多。我已……经历……湮灭与解构与重构。我已听闻世上的原子在被翻转而后被搅乱而后消散为能量时的尖啸。我已见我已见我已冂$(k)get stick bugged lmao/$", + + "hexcasting.entry.patterns": "图案", + "hexcasting.entry.patterns.desc": "我所发现的各式图案,和它们的功用。", + + "hexcasting.entry.spells": "法术", + "hexcasting.entry.spells.desc": "能以魔法影响到世界的图案和操作。", + + "hexcasting.entry.great_spells": "卓越法术", + "hexcasting.entry.great_spells.desc": "这类法术据信极难施放,但也极为强力。记载它们的文献极为少见(据称理由充分)。这也许只是某些消亡的老古董口中的胡言乱语,不过——它们只是简单的图案罢了,试试看又能出什么错呢?", + + + "_comment": "Basics", + + "hexcasting.entry.media": "媒质", + "hexcasting.page.media.1": "$(media)媒质/$是一种独立于意识的思维能量。所有生物都会在思考时产生痕量的$(media)媒质/$,而在这一思考过程结束后,产生的媒质就会被释放至环境中。$(br2)所谓施放$(hex)咒术/$,就是操纵$(media)媒质/$以产生有效影响的过程。", + "hexcasting.page.media.2": "$(media)媒质/$可以影响其他媒质,而这种影响的强度和种类都可通过将$(media)媒质/$绘制为各式图案来进行控制。$(p)研究这种魔法的学者则会使用接在木棍一端的浓缩的$(media)媒质/$。只要在空中按特定模式挥舞,学者们就能以足够的精度操控足量的$(media)媒质/$来影响世界,也即“$(hex)咒术/$”。", + "hexcasting.page.media.3": "遗憾的是,就算是感知能力较强的生物(也许我自己也算)也只能产生微量的$(media)媒质/$。只凭自己的大脑来施放咒术不太现实。$(br2)但传说地下有种特殊的矿床,$(media)媒质/$会在其中缓慢累积,并生长为晶体。$(p)真希望我能找到一处……", + + "hexcasting.entry.geodes": "晶洞", + "hexcasting.page.geodes.1": "啊哈!在地下挖矿时,我找到了一个巨大的、满溢着能量的晶洞。那些能量压迫着我的颅骨和思维。而现在,我手里就有一块那种压迫的来源,一块固体。传说是真的。这块固体$(italic)一定/$就是传说中$(media)媒质/$累积的产物。$(br2)这些$(l:items/amethyst)$(item)紫水晶/$肯定就是$(l:items/amethyst)$(thing)一种便于使用的、固态的$(media)媒质/$。", + "hexcasting.page.geodes.2": "似乎除了我往常碰到的$(l:items/amethyst)$(item)紫水晶碎片/$,这些水晶还会掉落些许粉末状的$(l:items/amethyst)$(item)紫水晶粉/$,也有可能掉落$(l:items/amethyst)$(item)充能紫水晶/$。而且好像附有时运的镐子挖出$(l:items/amethyst)$(item)充能紫水晶/$的概率更大。", + "hexcasting.page.geodes.3": "而在欣赏这些水晶的美时,我能感受到某种连接迅速闪过我的意识。就好像空气中的$(media)媒质/$正在流入我的脑海,正给予我更强的力量,正为我启迪全新知识……这种感觉真不错。$(br2)我总算是入门了!$(p)我要再读几遍那些古老的传说,我总算能理解我在读什么了。", + + "hexcasting.entry.couldnt_cast": "挫折", + "hexcasting.page.couldnt_cast.1": "为什么我就是施不了这个法术?!$(br2)我找到的卷轴货真价实。我能$(italic)感受/$到卷轴的嗡鸣——图案是真的,真的不能再真了。法术$(italic)就在里面/$。$(p)但感觉起来它好像处在某种薄膜的另一侧。我试过召唤它——它也想要起效——但它$(italic)做不到/$。", + "hexcasting.page.couldnt_cast.2": "好像那层屏障会因我施法时用的魔力而被缓慢地削弱。但就算我用尽全力——最大程度地专注,最精致的紫水晶,最精确的图案——它$(italic)就是不肯/$跨过那个屏障。真是惹人上火。难道我对魔法的研究就$(p)$(italic)止步于此/$了吗?就因为我无力施法,我就要放弃那些力量了吗?$(br2)深呼吸。我应该仔细回顾我曾学到的知识,就算可能加起来也没多少……", + "hexcasting.page.couldnt_cast.3": "……经过仔细回顾……我发现我自己发生了改变。$(p)似乎……拜$(l:items/amethyst)$(item)紫水晶/$所赐,我能仅凭我自身的意识和生命能量来施放法术,就和传说中说的一样。$(p)我不清楚我为什么做得到。只是……获得真知的代价就在那里,而我现在知道了那个代价是什么。我要去承受它。$(br2)幸运的是,我也清楚我的极限在哪里——我的生命力最旺盛时大概就相当于两个$(l:items/amethyst)$(item)充能紫水晶/$中的$(media)媒质/$。", + "hexcasting.page.couldnt_cast.4": "只是想想都让我打颤——直到现在,我都在研究中保持了自身意识的大体完整。但这样做的结果就是,我只建立了单向而脆弱的连接。$(p)我与屏障的另一侧是相连的,其间的屏障已因我的努力而受了削弱。而在屏障的另一侧,仅是简单的操作,就能带来永恒的荣耀。$(p)我想要拥有那份力量,是否就大错特错?", + + "hexcasting.entry.start_to_see": "我看到了什么?", + "hexcasting.page.start_to_see.1": "文献没有说错。自然出手了。", + "hexcasting.page.start_to_see.2": "那……那是……$(p)……那是我所经历过的$(italic)最糟糕/$的事了。我向自然呈现了我的规划,得来的是一个坚定的笑容和一种被撕裂的感受——我的一部分破碎了,就好像雨中四散的紫水晶粉。$(p)只是$(italic)存活/$下来都是极大的幸事,更不用说有精力写下这些了。这件事该到此为止,我应该在施放$(hex)咒术/$时多算几遍,绝不能再犯这样的错误。", + "hexcasting.page.start_to_see.3": "……但是。$(br2)但是在那最为神圣的一刻,我破碎的那一部分……它$(italic)看见了/$……$(l:greatwork/the_work)$(thing)一些东西/$。一个地方——也许是一件作品?(这种定义对……那种事物来说不值一提)$(p)和一张……一个薄膜-屏障-薄层-界限,将我和单纯的思维-能流-光-能量的领域隔绝开来。我记得——我看见-想到-回忆起-感受到——那个屏障的边缘变得模糊了,略微模糊了。$(p)我想要$(italic)穿过它/$。", + "hexcasting.page.start_to_see.4": "但我不应该。我也$(italic)清楚/$我不应该。那很危险。非常非常危险。跨越屏障需要的力量……我必须仅凭$(italic)一次施法/$就让我自己濒临死亡。$(br2)但我,就是,$(italic)不甘心/$。$(p)$(italic)这/$就是我魔法的集大成之作。这就是我所追求的$(#54398a)启迪/$。$(br2)我还想知道更多。我要再看到那场景。我$(italic)必将/$再见。$(p)我脆弱的意识和永恒的荣耀相比,又算得上什么呢?", + + + "_comment": "Casting", + + "hexcasting.entry.101": "咒术 101", + "hexcasting.page.101.1": "施放$(hex)咒术/$难度颇高,也难怪这门学问早已遗落!我必须要仔细回看我的笔记。$(br2)我可以手持$(l:items/staff)$(item)法杖/$按下$(k:use)来施放$(hex)咒术/$,而后就会浮现一个按六边形网格排列的点阵。然后便可在点阵上单击并拖动以在网格的$(media)媒质/$中绘制图案。绘制完一个图案就会立刻执行其对应的操作(详情见后)。", + "hexcasting.page.101.2": "当我绘制的图案足以施法时,网格就会消失,而累积起来的$(media)媒质/$也会被释放。按住$(k:sneak)时使用$(l:items/staff)$(item)法杖/$也能清空网格,如果完全不在乎会不会出现事故的话。(似乎我累积的$(media)媒质/$越多,就越有可能导致事故)$(br2)所以图案是如何起效的呢?简而言之:$(li)$(italic)图案/$会执行……$(li)$(italic)操作/$,其会操控……$(li)$(l:casting/stack)$(italic)栈/$,也即一列表的……$(li)$(italic)Iota/$,就是以单位计的信息。", + "hexcasting.page.101.3": "首先,$(thing)图案/$。它们是咒术的必需物,可用它们来操控周围的$(media)媒质/$。部分图案在被绘制时,会执行$(thing)操作/$。操作是$(italic)实际产生/$魔法效果的事物。所有图案都会以某种方式影响$(media)媒质/$,而当这些影响实际有用时,我们就称其为操作。$(br2)$(media)媒质/$是易变的,如果我绘制了无效的图案,栈上某处就会出现$(l:casting/influences)$(action)垃圾/$(详情见后)。", + "hexcasting.page.101.4.header": "示例", + "hexcasting.page.101.4": "有意思的是,图案整体的$(italic)方向/$完全不影响图案的功用。例如,上图中的两个图案都会执行名为$(l:patterns/basics#hexcasting:get_caster)$(action)意识之精思/$的操作。", + "hexcasting.page.101.5": "$(hex)咒术/$是通过按顺序绘制(有效的)图案施放的。每个操作都能完成如下几件事中的一件:$(li)获取有关环境的信息,然后将其置于栈顶。$(li)操控获取到的信息(例如加和两个数)。或者$(li)产生魔法效果,例如召唤闪电或产生爆炸。(这些操作被称为“法术”。)$(p)在开始施放$(hex)咒术/$时会自动创建一个空栈。操作会影响栈顶的若干元素。", + "hexcasting.page.101.6": "例如,$(l:patterns/basics#hexcasting:get_caster)$(action)意识之精思/$会创建一个代表$(italic)我/$,即施法者的 iota,并将其置于栈顶。$(l:patterns/basics#hexcasting:get_entity_pos)$(action)指南针之纯化/$会接受栈顶的 iota(前提是该 iota 代表一个实体),并将其转换为代表该实体位置的 iota。$(br2)所以,依序绘制上述图案就会在栈顶创建一个代表我的位置的 iota。", + "hexcasting.page.101.7": "$(thing)Iota/$ 可以代表诸如我、我的位置等具体事物,也可以代表其他几种能用$(thing)操作/$进行操控的事物。如下是一份全面介绍:$(li)数(某些文献称之为“双精度浮点数”)。$(li)向量,一种可代表世界中位置、运动或方向的,由三个数组成的集合。$(li)布尔值(简称“布尔”),一种代表真和假的抽象概念的的 iota。", + "hexcasting.page.101.8": "$(li)实体,如我自己、鸡、矿车等。$(li)虚指,一种代表抽象概念的奇怪的 iota。$(li)图案,用于制作魔法物品,也用在某些烧脑的咒术中,如$(italic)能施放其他法术的法术/$。还有$(li)列表,可由上述任意类型的 iota 构成的列表,其本身相当于一个 iota。", + "hexcasting.page.101.9": "当然,天上不会掉馅饼。所有法术和一些操作会消耗$(media)媒质/$。$(br2)我个人认为,$(hex)咒术/$有点像呈现在自然面前的一个对各类操作的规划。要这么类比的话,$(media)媒质/$便是用来为这个规划提供各式参数和运行支持的能源,而自然会接受你的规划并付诸实践。", + "hexcasting.page.101.10": "除此之外,似乎没人研究过每块$(l:items/amethyst)$(item)紫水晶/$到底含有$(italic)多少/$媒质。我只能得出,一个$(l:items/amethyst)$(item)紫水晶碎片/$大概和五个$(l:items/amethyst)$(item)紫水晶粉/$相当,而一个$(l:items/amethyst)$(item)充能紫水晶/$大概与十个相当。$(br2)而且奇怪之处在于$(l:items/amethyst)$(item)紫水晶/$的其余形态均不适于施放$(hex)咒术/$。推测是因为紫水晶块和晶簇固化程度过高,导致其无法被轻易拆散为$(media)媒质/$。", + "hexcasting.page.101.11": "还需格外注意的是每次操作会在执行时立刻消耗其所需的$(media)媒质/$,而非在整个咒术结束时消耗。而且,一次操作会消耗一个物品,如只需要一个$(l:items/amethyst)$(item)紫水晶粉/$量的$(media)媒质/$的操作也会消耗一个$(l:items/amethyst)$(item)充能紫水晶/$,前提是物品栏里只有充能紫水晶。$(br2)因此,将紫水晶粉碎是个不错的点子。勤俭节约,吃穿不缺。", + "hexcasting.page.101.12": "还要注意物品栏内一定要有足够的紫水晶。一些古代文献提及,自然也会将施法者的意识用作媒质。文献也有提到那种感觉很糟糕但又奇怪地让人兴奋,“……热烈地溶解入光与能量中……”。也许这就是为何先前的研究者们最终都疯了。我完全不觉得为力量而放弃部分意识会对身体有任何$(italic)好处/$。", + "hexcasting.page.101.13": "但也许确实有东西和文献所记述的有所不同了。在我的实验中,我从没遇到过文献中提到的情况。如果$(media)媒质/$不够了,法术只是单纯地施放不了,就好像有什么屏障在防止我被伤到一样。$(br2)对此刨根问底肯定能得出些有意思的结论,但现在就暂时认为它会保护我吧。", + "hexcasting.page.101.14": "我还发现了一则趣闻,主要讲述为何许多魔法研究者都近乎疯癫,是不错的休闲趣味读物,虽然对不上我这里的世界观。$(br2)$(italic)内容警告:部分肉体恐怖与暗示类材料。/$", + "hexcasting.page.101.14.link_text": "Goblin Punch", + "hexcasting.page.101.15": "最后,法术的影响是有距离限制的,最远大约是距离我 32 格处。若试图影响该范围外的事物,法术便不会生效。$(br2)尽管如此,我可以凭借代表玩家的 iota 在任何地方影响他们。当然影响仅限于玩家本身,若玩家周围的环境超出我的影响范围,那些位置便不受影响。$(br)必须谨慎考虑要不要给别人代表我的 iota。友善的$(hex)咒术师们/$可凭此助你行事,但那些心怀鬼胎的就不好说了。", + + "hexcasting.entry.vectors": "向量入门", + "hexcasting.page.vectors.1": "如果要深入研究,就要对向量相关的知识足够熟悉。我整理了些讲解向量知识的资料,以备不理解时之需。$(br2)首先,来一段富有启发性的视频。(译注:此为 B 站官方账号$(l:https://www.bilibili.com/video/BV1ys411472E)网址/$)", + "hexcasting.page.vectors.1.link_text": "3blue1brown", + "hexcasting.page.vectors.2": "此外,似乎操控 $(thing)Psi 能量/$的魔法师们(又称“术式师”)有一些对学徒理解向量大有裨益的课程,虽然他们命名能力不强。我会在后页冒昧地提供前往他们课程的链接。$(br2)他们使用了另一套术语:$(li)“术式”对应“操作”。$(li)“启动式”对应“法术”。$(li)“运算符”则对应不是法术的操作。", + "hexcasting.page.vectors.3": "链接在此。", + "hexcasting.page.vectors.3.link_text": "Psi Codex", + + "hexcasting.entry.mishaps": "事故", + "hexcasting.page.mishaps.1": "不幸的是,我(还)不是一个完美的生物。我经常会在研究中和施放$(hex)咒术/$时犯错。比如说,绘制错图案,或是对错误的 iota 进行操作。而自然一般不会宽容我的错误,从而导致$(italic)事故/$。", + "hexcasting.page.mishaps.2": "导致事故的图案会在网格中发红光。根据事故的类型,我能大致推断出其造成的有害后果。同时会有一簇红色与各色混合的火花四散开去,这主要是处理不当的$(media)媒质/$凝结为某种颜色的光所致。$(br2)聊天栏中则会出现一条错误信息,但某种纠缠不休的感觉告诉我这些都会在“模组更新”后发生改变,没人知道这意味着什么。我不该指望这些信息会一直出现。", + "hexcasting.page.mishaps.3": "而幸运的是,虽然所有事故导致的有害效果都$(italic)很烦人/$,但也都不会导致长期毁灭性后果。在哪里跌倒,就要在哪里站起来,然后继续前进……当然也可以换一条更好走的路。$(br2)我整理的所有事故如下所述。", + "hexcasting.page.mishaps.invalid_pattern.title": "无效图案", + "hexcasting.page.mishaps.invalid_pattern": "绘制的图案不对应任何操作。$(br2)产生黄色火花,并向栈顶压入一个$(l:casting/influences)$(action)垃圾/$。", + "hexcasting.page.mishaps.not_enough_iotas.title": "Iota 过少", + "hexcasting.page.mishaps.not_enough_iotas": "该操作需要比当前栈中元素数还多的 iota。$(br2)产生淡灰色火花,并向栈顶压入缺少的参数的数量个$(l:casting/influences)$(action)垃圾/$。", + "hexcasting.page.mishaps.incorrect_iota.title": "Iota 错误", + "hexcasting.page.mishaps.incorrect_iota": "该操作需要一种特定类型的 iota 作为参数,而实际 iota 无效。如果有多个 iota 无效,错误信息只会提示最靠近栈底的错误。$(br2)产生深灰色火花,无效的 iota 会被替换为$(l:casting/influences)$(action)垃圾/$。", + "hexcasting.page.mishaps.vector_out_of_range.title": "向量越界", + "hexcasting.page.mishaps.vector_out_of_range": "该操作试图影响在我影响范围之外的某一位置。$(br2)产生品红色火花,我手中的物品将会掉落并飞向对应位置。", + "hexcasting.page.mishaps.entity_out_of_range.title": "实体越界", + "hexcasting.page.mishaps.entity_out_of_range": "该操作试图影响在我影响范围之外的某一实体。$(br2)产生粉红色火花,我手中的物品将会掉落并飞向对应实体。", + "hexcasting.page.mishaps.entity_immune.title": "实体免疫", + "hexcasting.page.mishaps.entity_immune": "该操作试图影响某不会受其影响的实体。$(br2)产生蓝色火花,我手中的物品将会掉落并飞向对应实体。", + "hexcasting.page.mishaps.math_error.title": "数学错误", + "hexcasting.page.mishaps.math_error": "该操作违背了数学规律,例如试图除以零。$(br2)产生红色火花,压入一个$(l:casting/influences)$(action)垃圾/$,并且我的意识会被销蚀,扣去我当时生命力的一半。自然似乎对这种举动深感冒犯,而后便会报复性地惩罚$(italic)我/$。", + "hexcasting.page.mishaps.incorrect_item.title": "物品错误", + "hexcasting.page.mishaps.incorrect_item": "该操作需要某种物品,而我所提供的物品不合适。$(br2)产生棕色火花。如果在手中持有对应物品,则该物品会掉落在地。如果对应物品以实体形式存在,则其会被击飞。", + "hexcasting.page.mishaps.incorrect_block.title": "方块错误", + "hexcasting.page.mishaps.incorrect_block": "该操作需在目标位置存在某种方块,而该位置实际存在的方块不合适。$(br2)产生亮绿色火花,并在对应位置产生一次爆炸。这种爆炸似乎不会伤害到我、世界或是任何其他事物。就是挺吓人的。", + "hexcasting.page.mishaps.retrospection.title": "反思过急", + "hexcasting.page.mishaps.retrospection": "试图在绘制$(l:patterns/patterns_as_iotas#hexcasting:open_paren)$(action)内省/$前绘制$(l:patterns/patterns_as_iotas#hexcasting:close_paren)$(action)反思/$。$(br2)产生橙色火花,并压入一个$(l:patterns/patterns_as_iotas#hexcasting:close_paren)$(action)反思/$对应的图案。", + "hexcasting.page.mishaps.too_deep.title": "钻研过深", + "hexcasting.page.mishaps.too_deep": "在一个法术内以元运行方式运行过多法术。$(br2)产生暗蓝色火花,并使我窒息。", + "hexcasting.page.mishaps.true_name.title": "违犯他人", + "hexcasting.page.mishaps.true_name": "试图在某种永久性媒介中$(l:patterns/readwrite#hexcasting:write)$(action)存储/$代表另一位玩家的 iota。$(br2)产生黑色火花,并致盲大约一分钟。", + "hexcasting.page.mishaps.disabled.title": "禁用操作", + "hexcasting.page.mishaps.disabled": "试图执行被服务器管理员禁用的操作。$(br2)产生黑色火花。", + "hexcasting.page.mishaps.other.title": "灾难性故障", + "hexcasting.page.mishaps.other": "模组中的漏洞产生的无效类型的 iota 或是其他错误导致法术失效。$(l:https://github.com/gamma-delta/HexMod/issues)请报告该漏洞!/$$(br2)产生黑色火花。", + + "hexcasting.entry.stack": "栈", + "hexcasting.page.stack.1": "$(thing)栈/$,又被称为“后进先出表(LIFO)”,是计算机科学中的概念。简而言之,栈是一种只能与最近交互过的事物交互的事物的集合。$(br2)想象一摞盘子,新盘子会被放在其顶部。若想要与放在这摞盘子中间的某个盘子交互,你就必须先将它上面的所有盘子拿开才行。", + "hexcasting.page.stack.2": "因为栈非常简单,所以与其的交互种类屈指可数:$(li)$(italic)向其中加入事物/$,称为“入栈”/“push”。$(li)$(italic)移除最后加入的元素/$,称为“出栈”/“pop”。$(li)$(italic)校验或修改最后加入的元素/$,称为“检视”/“peek”。$(br)我们将最后加入的元素称为“栈顶元素”,就和盘子的类比差不多。$(p)举个例子,如果向栈压入 1 号元素,然后压入 2 号元素,然后弹出一个元素,这时栈顶元素便是 1 号元素。", + "hexcasting.page.stack.3": "操作(大致)都只能与栈以如上几种方式交互。它们会弹出部分它们感兴趣的 iota(称为“参数”或“实参”或“形参”),对它们进行处理,然后压入一定数目的结果。$(br2)当然,某些操作(例如$(l:patterns/basics#hexcasting:get_caster)$(action)意识之精思/$)可能不会弹出任何元素,而某些操作(尤其是法术)可能不会压入任何元素。", + "hexcasting.page.stack.4": "更复杂的操作都可用若干次入栈、出栈或检视操作实现。例如,$(l:patterns/stackmanip#hexcasting:swap)$(action)弄臣之策略/$交换栈顶两个元素的顺序。这可认为是弹出两个 iota 并以相反顺序重新压入。又例如,$(l:patterns/stackmanip#hexcasting:duplicate)$(action)双子之分解/$会复制栈顶元素,也即其检视栈顶并压入一个一样的元素。", + + "hexcasting.entry.naming": "操作命名法", + "hexcasting.page.naming.1": "古人给各类操作命的名确实很奇特,但我认为其中总有某种命名逻辑。$(br2)似乎各式操作均被分入了若干组,组内的操作命名方式类似——以其要移除和加入的 iota 个数命名。", + "hexcasting.page.naming.2": "$(li)$(thing)精思/$不出栈,入栈一个 iota。$(li)$(thing)纯化/$出栈一个,入栈一个。$(li)$(thing)馏化/$出栈两个,入栈一个。$(li)$(thing)提整/$出栈三个或更多,入栈一个。$(li)$(thing)分解/$出栈一个,入栈两个。$(li)$(thing)拆解/$出栈一个,入栈三个或更多。$(li)$(thing)策略/$则对应其余出栈入栈操作(或会以某种方式重新排列栈的操作)。", + "hexcasting.page.naming.3": "法术不受此命名法约束,而是以其效用命名。毕竟,能叫它$(l:patterns/spells/basic#hexcasting:explode)$(action)爆炸/$,为何还要起个像是“$(action)爆破兵之策略/$”的名字呢?", + + "hexcasting.entry.influences": "虚指", + "hexcasting.page.influences.1": "虚指非常……奇怪,至少能这么说。大部分 iota 都代表着世界中的某个实际事物,而虚指则代表着某些更为……抽象或无形的事物。$(br2)例如,我将一种虚指命名为 $(l:casting/influences)$(thing)Null/$,它似乎代表着“无”这种状态。当一个问题没有确切的答案时就会出现一个 Null,比如对着天空执行$(l:patterns/basics#hexcasting:raycast)$(action)弓箭手之馏化/$。", + "hexcasting.page.influences.2": "此外,我还发现了一组三个奇特的虚指,命名为$(l:patterns/patterns_as_iotas#hexcasting:escape)$(action)考察/$、$(l:patterns/patterns_as_iotas#hexcasting:open_paren)$(action)内省/$和$(l:patterns/patterns_as_iotas#hexcasting:close_paren)$(action)反思/$。它们似乎同时有着图案和虚指的性质,但实际作用却和这两者都不一样。我能用它们将图案作为 iota 加到栈中,而非执行图案对应的操作。$(l:patterns/patterns_as_iotas)相关笔记在此/$。", + "hexcasting.page.influences.3": "最后,似乎还有一组无限个虚指,它们都代表着一团紊乱的$(media)媒质/$。我称其为$(l:casting/influences)$(action)垃圾/$,因为它们毫无用处。它们似乎会因$(l:casting/mishaps)$(thing)事故/$而在栈中任意位置出现,呈现出来的则是一团乱麻。", + + "hexcasting.entry.mishaps2": "启迪后事故", + "hexcasting.page.mishaps2.1": "我发现了若干骇人的新事故。我绝不能向它们屈服。", + "hexcasting.page.mishaps2.bad_mindflay.title": "惰性剥离", + "hexcasting.page.mishaps2.bad_mindflay": "试图剥离已被剥除意识的村民的意识,或是试图剥离不适用于目标方块的生物的意识。$(br2)产生暗绿色火花,并杀死对应生物。倘若其他村民看到了,他们应该不会对此有什么好评价。", + "hexcasting.page.mishaps2.no_circle.title": "缺失法术环", + "hexcasting.page.mishaps2.no_circle": "试图直接执行只能在法术环内执行的操作。$(br2)产生淡蓝色火花,并将我物品栏中所有物品散落在地。", + "hexcasting.page.mishaps2.no_record.title": "缺失阿卡夏记录", + "hexcasting.page.mishaps2.no_record": "试图在无对应方块处访问$(l:greatwork/akashiclib)$(item)阿卡夏记录/$。$(br2)产生紫色火花,并消耗部分经验。", + + + "_comment": "Items", + + "hexcasting.entry.amethyst": "紫水晶", + "hexcasting.page.amethyst.dust": "在晶洞里破坏紫水晶会产生三种形态的紫水晶。紫水晶量最少的物品是一堆闪着光的粉末,含有较少量的$(media)媒质/$。", + "hexcasting.page.amethyst.shard": "第二种是紫水晶的碎片,也就是不是$(hex)咒术师/$的人们最为熟悉的。这种碎片大约含有 5 个$(l:items/amethyst)$(item)紫水晶粉/$量的$(media)媒质/$。", + "hexcasting.page.amethyst.crystal": "最后,偶尔能发现充盈着能量的大型水晶。它们含有大约 10 个$(l:items/amethyst)$(item)紫水晶粉/$(也即两个$(l:items/amethyst)$(item)紫水晶碎片/$)量的$(media)媒质/$。", + "hexcasting.page.amethyst.lore": "$(italic)老人叹了口气,对着火炉伸出了一只手。他回想起自己对周边山脉的记忆,从那些土地中汲取能量——就像他在泰瑞西亚城从札夫拿、河鼓、主教还有象牙塔中的其它法师身上学到的那样。他集中精神,从柴薪中升起的火焰摇摆扭动,最终形成了一抹温柔的微笑。/$", + + "hexcasting.entry.staff": "法杖", + "hexcasting.page.staff.1": "$(l:items/staff)$(item)法杖/$是我尝试施放各类$(hex)咒术/$的起点。手持时按下$(thing)$(k:use)/$,就算开始了施放$(hex)咒术/$的过程。然后单击拖动绘制图案就可以了。$(br2)它还是和单纯把一小块$(media)媒质/$放在木棍的一端有所不同,但不管怎么说,能用就行。", + "hexcasting.page.staff.crafting.header": "法杖", + "hexcasting.page.staff.crafting.desc": "$(italic)施法不规范,自己两行泪。/$", + + "hexcasting.entry.lens": "探知透镜", + "hexcasting.page.lens.1": "$(media)媒质/$在某些特殊情况下能和任何信息作用而产生奇异效果。而若是在玻璃上覆上薄薄一层媒质,就能……生出些独特的见地。$(br2)手持$(l:items/lens)$(item)探知透镜/$观察某些方块,就能给出一些额外信息。", + "hexcasting.page.lens.2": "例如,看向$(item)红石粉/$会给出其信号强度。我猜测随着研究的深入,还能发现新的额外信息。$(br2)此外,用$(l:items/staff)$(item)法杖/$施法时,在另一只手持有探知透镜就能缩短点与点的间距,从而能在网格上绘制更多图案。$(br2)我还可以把它当单片眼镜戴在头上。这样做能显示额外信息,但不会缩小网格。但没关系,总有两全其美的办法……", + "hexcasting.page.lens.crafting.desc": "$(italic)你必须学会……探知你所看到的事物。/$", + + "hexcasting.entry.focus": "核心", + "hexcasting.page.focus.1": "$(l:items/focus)$(item)核心/$能存储一个 iota。$(br2)合成核心时,其默认存有 $(l:casting/influences)$(thing)Null/$ 这一虚指。在另一只手持有$(l:items/focus)$(item)核心/$时,可以用$(l:patterns/readwrite#hexcasting:write)$(action)书吏之策略/$将栈顶元素弹出栈并写入其中。而使用$(l:patterns/readwrite#hexcasting:read)$(action)书吏之精思/$就会将$(l:items/focus)$(item)核心/$中的 iota 复制出来并压入栈中。", + "hexcasting.page.focus.2": "我突然想到,我可以在$(l:items/focus)$(item)核心/$中写入一个由图案组成的列表,将它们复制出来后用$(l:patterns/meta#hexcasting:eval)$(action)赫尔墨斯之策略/$运行就行了。这样就有了施放复杂法术和施放某法术其中一部分的简单方法,不用再在每次使用时全部重画一遍图案了。$(br2)它可以用作一个简易版$(l:items/hexcasting#artifact)$(item)造物/$,但我觉得将某些常用图案“组合”存到$(l:items/focus)$(item)核心/$中更方便,比如返回我在看哪里的图案组合。", + "hexcasting.page.focus.3": "另外,如果我在$(l:items/focus)$(item)核心/$中写入一个实体,然后在该实体死亡或消失后尝试复制,则$(l:patterns/readwrite#hexcasting:read)$(action)书吏之精思/$会压入一个 $(l:casting/influences)$(thing)Null/$。$(br2)最后,如果不希望$(l:items/focus)$(item)核心/$被覆写,可以将其与$(item)蜜脾/$合成来蜡封,这时对其使用$(l:patterns/readwrite#hexcasting:write)$(action)书吏之策略/$就会失败。$(l:patterns/spells/hexcasting#hexcasting:erase)$(action)清除物品/$则会将蜡封和其内容物一并清除。", + "hexcasting.page.focus.crafting.desc": "$(italic)毒苹果,毒虫子。/$", + + "hexcasting.entry.abacus": "算盘", + "hexcasting.page.abacus.1": "虽然有$(l:patterns/numbers)$(action)对应数的图案/$,但它们确实……过于复杂。$(br2)幸运的是,从前研究这门学问的大师们发明了一个名为“$(l:items/abacus)$(item)算盘/$”的天才般的装置,它们能极为方便地表示数。只需要在其上设定好,然后用$(l:patterns/readwrite#hexcasting:read)$(action)书吏之精思/$把值读出即可,就和读出$(l:items/focus)$(item)核心/$中 iota 的操作一样。", + "hexcasting.page.abacus.2": "操作方法是潜行时手持算盘滚动滚轮。如果是主手持算盘,则其数值会以 1 增加或减少,按住 Control 或 Command 时则以 10。若是副手持算盘,则其数值会以 0.1 增加或减少,按住 Control 或 Command 时则以 0.001。$(br2)也可以在潜行时手持算盘右击以重设为 0。", + "hexcasting.page.abacus.crafting.desc": "$(italic)数学?那是给聪明人用的!/$", + + "hexcasting.entry.spellbook": "法术书", + "hexcasting.page.spellbook.1": "$(l:items/spellbook)$(item)法术书/$是我研究成果的结晶。它像是一座满是$(l:items/focus)$(item)核心/$的图书馆。准确的说是最多能存放 $(thing)64/$ 个。$(br2)每一页都能存储一个 iota。手持法术书时,可在潜行时用滚轮自由选择当前活动页(存储和复制 iota 的目标页),也可在施放$(hex)咒术/$时副手手持,并直接用滚轮改变活动页。", + "hexcasting.page.spellbook.2": "就像$(l:items/focus)$(item)核心/$一样,法术书也有防覆写机制。将其和$(item)蜜脾/$合成就能给当前页上漆,从而防止$(l:patterns/readwrite#hexcasting:write)$(action)书吏之策略/$改变其内容。而清除也和$(l:items/focus)$(item)核心/$一样,使用$(l:patterns/spells/hexcasting#hexcasting:erase)$(action)清除物品/$就能同时去除漆封和当前页的内容。$(br2)也可在铁砧上改变当前书页的名字,方便查找。", + "hexcasting.page.spellbook.crafting.desc": "$(italic)巫师们喜欢阅读。大多数巫师经常阅读,而且睡前一定要读些什么确实是判断一个人是不是巫师的有效方法。/$", + + "hexcasting.entry.scroll": "卷轴", + "hexcasting.page.scroll.1": "$(l:items/scroll)$(item)卷轴/$能让分享图案画法变得十分方便。可用$(l:patterns/readwrite#hexcasting:write)$(action)书吏之策略/$将图案复制上去,然后该图案就会在物品提示栏内出现。$(br2)也可以将其放在墙上用作装饰或用于教学。就和画一样,卷轴也分大小,从 1x1 到 3x3 都有。对挂在墙上的卷轴使用$(l:items/amethyst)$(item)紫水晶粉/$就能显示绘制的笔画顺序。", + "hexcasting.page.scroll.2": "此外,我还在地牢和要塞里发现了所谓$(l:items/scroll)$(item)远古卷轴/$。它们记载了一些特殊法术的笔画顺序——$(thing)卓越法术/$,传闻是强大到凡人的意识无法承受的法术……$(br2)但如果那些“凡人”施放不了,那我觉得他们就不应该知道这些法术的存在。", + "hexcasting.page.scroll.crafting.desc": "$(italic)我用锐利的笔和学生的鲜血在洁白的纸上书写,探知着他们的秘密。/$", + + "hexcasting.entry.slate": "石板", + "hexcasting.page.slate.1": "$(l:items/slate)$(item)石板/$和$(l:items/scroll)$(item)卷轴/$类似,可以将图案复制上去并放置在世界中以展示该图案。$(br2)然而,我曾读到过某些粗略的故事,它们记述了一种用$(l:items/slate)$(item)石板/$组成的伟大结构,用来施放$(l:items/staff)$(item)法杖/$无法施放的$(l:greatwork/spellcircles)$(thing)伟大仪式/$。", + "hexcasting.page.slate.2": "也许我将来就会碰到这些知识。但就现在而言,我觉得它们非常适合装饰。$(br2)至少它们可被放在方块的任何一面,这点和$(l:items/scroll)$(item)卷轴/$不同。", + "hexcasting.page.slate.crafting.desc": "$(italic)这就是横竖撇捺了。要记牢。/$", + "hexcasting.page.slate.3": "我还发现了其他类型的$(l:items/slate)$(item)石板/$,它们并未刻有图案,但似乎内嵌有某种……奇怪的……异常构造。单单思考它们就让我头脑胀痛,就好像我的思维被它们的结构折弯,随着它们的回路流动,迷失在它们迷宫般的深渊中,迷失在迷失在迷失在导向到处理为——$(br2)……我的思维差点就被搅乱了。还是之后再做相关研究吧。", + + "hexcasting.entry.hexcasting": "施法物品", + "hexcasting.page.hexcasting.1": "虽然用$(l:items/staff)$(item)法杖/$直接施放$(hex)咒术/$确实足够灵活易用,但仅凭法杖重复施放同一种咒术就很烦人了。如果能将某些常用法术存储起来后续直接使用,就再方便不过了,同时也方便我与朋友分享这些$(hex)咒术/$。", + "hexcasting.page.hexcasting.2": "以下三种魔法物品就能做到这点:$(l:items/hexcasting)$(item)杂件/$,$(l:items/hexcasting)$(item)缀品/$和$(l:items/hexcasting)$(item)造物/$。所有三种物品都能存储$(hex)咒术/$对应的所有图案,且都有一个用来存储$(media)媒质/$的小电池。$(br2)手持时按下$(thing)$(k:use)/$就会消耗其内含的媒质像用法杖施法那样运行其中图案。", + "hexcasting.page.hexcasting.3": "每种物品都有自己的特点:$(br2)$(l:items/hexcasting)$(item)杂件/$很脆弱,在耗尽其内含的$(media)媒质/$后就会损坏,$(italic)不可/$重新充能。$(br2)$(l:items/hexcasting)$(item)缀品/$则只要还有剩余的$(media)媒质/$就能一直施法,但媒质耗尽后若不重新充能就无法使用。", + "hexcasting.page.hexcasting.4": "$(l:items/hexcasting)$(item)造物/$是三者之中最强力的——其内含的$(media)媒质/$耗尽后,它们还能消耗持有者物品栏内的$(l:items/amethyst)$(item)紫水晶/$来施放$(hex)咒术/$,就和用$(l:items/staff)$(item)法杖/$施法一样。不过这也意味着,一旦$(l:items/amethyst)$(item)紫水晶/$不够,继续施法可能会消耗施法者的意识。$(br2)而在工作台中合成魔法物品后,必须将$(hex)咒术/$以适合对应物品的法术写入其中。(也没什么其他办法。)$(l:patterns/spells/hexcasting)对应的图案详情见此。/$", + "hexcasting.page.hexcasting.5": "每次写入都需要栈上有一个实体和一个由图案构成的列表。这个实体必须是一个含有$(media)媒质/$的物品实体(也即掉落在地上的$(l:items/amethyst)$(item)紫水晶/$)。该实体会变成该魔法物品的内部电池。$(br2)似乎电池中的$(media)媒质/$不会像用$(l:items/staff)$(item)法杖/$施法那样以物品组为单位消耗。其中的$(media)媒质/$实际上会“溶解”入一个连续的能量池。因此,当物品中存有会消耗 1 个$(l:items/amethyst)$(item)紫水晶粉/$中媒质来施放的$(hex)咒术/$时,含有相当于 1 个$(l:items/amethyst)$(item)充能紫水晶/$中媒质的电池能支持施放该咒术 10 次。", + "hexcasting.page.hexcasting.crafting.desc": "$(italic)我们常说一句话,“魔法从不……”。它从不“就是行得通”,它不会随你操控。你不能光靠所谓魔法扔个火球,烧顿晚饭,或是把一帮劫匪变成青蛙和蜗牛。/$", + + "hexcasting.entry.phials": "媒质之瓶", + "hexcasting.page.phials.1": "我觉得……自然不愿意给我的研究留些余量的做法,令人非常不快。如果我手头只有$(l:items/amethyst)$(item)充能紫水晶/$,就算是最为基础的$(l:patterns/basics#hexcasting:raycast)$(action)弓箭手之馏化/$也会消耗一整块水晶,没利用的$(media)媒质/$就被浪费了。$(br2)幸运的是,我找到了一种解决问题的方法。", + "hexcasting.page.phials.2": "我找到了记载着一种注入了$(media)媒质/$的$(item)玻璃瓶/$的卷轴。施放$(hex)咒术/$时,法术会从这种试剂瓶中汲取$(media)媒质/$。液态的$(media)媒质/$便于按量使用,不会有媒质被浪费。它就和$(l:items/hexcasting)$(item)缀品/$的内部电池差不多,也一样可以用$(l:patterns/spells/hexcasting#hexcasting:recharge)$(action)重新充能/$补充媒质。", + "hexcasting.page.phials.3": "而不幸的是,用于$(italic)制作/$这种试剂瓶的技艺已经散佚了。我确实发现了$(l:patterns/great_spells/make_battery#hexcasting:craft/battery)$(thing)对应图案画法的提示/$,但具体绘制方法难以捉摸,怎么都画不对。不过我想只要勤学苦练就能修得真功。现在的话,浪费$(media)媒质/$是没法避免了……$(br2)但我不会一直囿于此处的。", + "hexcasting.page.phials.desc": "$(italic)玉液琼浆。/$", + + "hexcasting.entry.pigments": "染色剂", + "hexcasting.page.pigments.1": "虽然研究咒法学的古代研究者们的名字已不可考,但他们会用一种颜色来象征自己和自己的法术。倘若直接向自然呈上一种特殊的染色剂,就能“……以自然乐见的方式为某人的思维涂上颜色,并使个人代表色产生奇妙的变化。”", + "hexcasting.page.pigments.2": "我不懂它们工作的具体原理,但我相信我已琢磨出制造不同颜色的染色剂的配方了。若要使用染色剂,可手持之并以另一只手施放$(l:patterns/spells/colorize)$(action)内化染色剂/$。这会消耗对应染色剂并将我的意识涂为对应颜色。$(br2)染色剂会影响我用法杖施放$(hex)咒术/$时产生的火花的颜色,也会影响我的$(l:patterns/spells/sentinels)$(thing)哨卫/$的颜色。", + "hexcasting.page.pigments.colored.crafting.header": "色彩染色剂", + "hexcasting.page.pigments.colored.crafting.desc": "五彩缤纷的染色剂。", + "hexcasting.page.pigments.uuid.crafting.desc": "一种只属于我的染色剂。$(br2)$(italic)也含有许多还没被研究出来的我所特有的颜色。/$", + + "hexcasting.entry.edified": "启迪树", + "hexcasting.page.edified.1": "用$(l:patterns/spells/blockworks#hexcasting:edify)$(action)启迪树苗/$就能将部分$(media)媒质/$注入树苗,就能造出$(l:items/edified)$(thing)启迪树/$。它们又高又尖,树皮上有特殊纹理。树叶则有三种不同颜色。", + "hexcasting.page.edified.2": "我觉得这种木材与$(hex)咒法学/$有着紧密的联系。但就算真有,我也完全找不到这联系在哪。它和普通木头如出一辙,不同只在于颜色不一样。$(br2)就现在而言,它们是很好的装饰用方块。$(br2)当然,也可用斧来去皮。", + "hexcasting.page.edified.crafting.desc": "$(italic)它们那周身洁白的巨大而光滑的树干,仅凭自己支撑起了茂密的树冠,投下绿荫与静谧。/$", + + "hexcasting.entry.jeweler_hammer": "珠宝匠锤", + "hexcasting.page.jeweler_hammer.1": "在无数次摧毁$(media)媒质/$来源的惨痛经历后,我设计了一把用于防止手滑的工具。$(br2)将脆弱的晶态$(media)媒质/$用作镐的固定结,就得到了$(l:items/jeweler_hammer)$(item)珠宝匠锤/$。它和$(item)铁镐/$在许多方面完全一致,但珠宝匠锤不会破坏任何完整方块。", + "hexcasting.page.jeweler_hammer.crafting.desc": "$(italic)她小心翼翼地敲开那半块红宝石,让其中的灵体逸散而出。/$", + + "hexcasting.entry.decoration": "装饰性方块", + "hexcasting.page.decoration.1": "我在研究过程中发现了些挺美观的建筑方块的其他装饰品。制作方法整理如下。", + "hexcasting.page.decoration.ancient_scroll.crafting.desc": "棕色染料在仿制$(l:items/scroll)$(item)远古卷轴/$这方面表现非常出色。", + "hexcasting.page.decoration.tiles.crafting.desc": "$(l:items/decoration)$(item)紫水晶瓦/$也可在切石机内制作。$(br2)$(l:items/decoration)$(item)紫水晶粉块/$(见后页)受重力影响。", + "hexcasting.page.decoration.sconce.crafting.desc": "$(l:items/decoration)$(item)紫水晶灯台/$会发出光和粒子,并会产生悦耳的“叮铃”声。", + + + "_comment": "The Work", + + "hexcasting.entry.the_work": "卓伟之作", + "hexcasting.page.the_work.1": "我所见甚多。不可言之物。不可数之物。仅三词就能将我的意识从里翻到外然后把我的大脑抹在头颅黑暗的内壁然后腐朽为混沌和虚无。", + "hexcasting.page.the_work.2": "我已见断续的图案与酸蚀的设计图刻入我的眼睑。它们阴燃,它们舞蹈,它们嘲弄,它们$(italic)隐隐作痛/$。我突然有种强烈的$(italic)冲动/$,去绘制它们,创造它们,写就它们。将它们从我脆弱意识的黏糊桎梏中释放,让它们在世上再度闪耀荣光。$(p)众将见。$(p)众必将见。", + + "hexcasting.entry.brainsweeping": "关于意识的剥离", + "hexcasting.page.brainsweeping.1": "我解开了一个秘密。我得知了真相。我也无法忘记真相带来的恐惧。这种想法掠过我的脑海。$(br2)我曾相信——我曾愚蠢地$(italic)相信/$——$(media)媒质/$只是思维遗留下的剩余能量。但我现在$(italic)知道/$它究竟是什么了:它是思维$(italic)含有的/$能量。", + "hexcasting.page.brainsweeping.2": "媒质是在具有思维能力的生物思考时产生的,它的存在也使这些生物能够思考,就像是回环的绳结。我先前天真地拟人化为“自然”的实体实际上就是一个卓伟的媒质回环,又或许是所有回环的结合体,或者是……我思考它就会痛我有很多突触它们都能思考同时痛它们都能看见它们都能看见$(br2)我撑不住了。记笔记。赶快。", + "hexcasting.page.brainsweeping.3": "这个世界中的村民还留有能被提取的感知力。将这种感知力放在方块中,扭曲它,改变它。由不同的思维模式造就的精密图案,关于他们工作和生活的抽象神经通路,都被投射到无生气的固态物质的原子中。$(br2)这就是$(l:patterns/great_spells/brainsweep)$(action)剥离意识/$的用途,那个提取过程。需将村民实体和目标方块放在栈中。扭曲意识则要消耗 10 个$(l:items/amethyst)$(item)充能紫水晶/$。", + "hexcasting.page.brainsweeping.budding_amethyst": "如下是一种实际用途。这个剥离过程接受任何职业的村民,前提是他们足够熟练。其他配方则有更具体的要求。我再也不必为$(media)媒质/$亲身沉入地狱了。", + + "hexcasting.entry.spellcircles": "法术环", + "hexcasting.page.spellcircles.1": "我终于知道$(l:items/slate)$(item)石板/$的用途了。早已遗落的卓伟结构。镌刻其上的图案会按顺序自动运行。思维和能量在其中穿梭,一个接一个接一个接一个接一个穿梭穿梭穿梭——我不能我不能我不能跟着它的思维应该去理解。", + "hexcasting.page.spellcircles.2": "我需要$(l:greatwork/impetus)$(item)促动石/$作为一种自我维持的$(media)媒质/$波源来启动仪式。而产生的波就会随着$(l:items/slate)$(item)石板/$或是其他和这种波亲和性好的方块穿梭,一个接一个地收集碰到的图案。当波最终回到$(l:greatwork/impetus)$(item)促动石/$处时,所有碰到的图案就会按顺序运行。$(br2)$(media)媒质/$流出任何方块的方向必须唯一而确定,否则法术环会在分叉处失效。", + "hexcasting.page.spellcircles.3": "因此,法术“环”必须是一个封闭的图形,凹多边形和凸多边形均可,方向也随意。实际上,借助某些其他方块,法术环可在所有三个维度上随意排布。这种性质可能没什么大用,但我必须给大脑一点刺激,好让研究继续下去。", + "hexcasting.page.spellcircles.4": "真是精妙。法术环不会从我的物品栏或我的意识中汲取$(media)媒质/$,而是要通过漏斗(或类似装置)向$(l:greatwork/impetus)$(item)促动石/$提供晶态的$(media)媒质/$。$(br2)$(l:items/lens)$(item)探知透镜/$能以紫水晶粉为单位显示$(l:greatwork/impetus)$(item)促动石/$中的$(media)媒质/$量。", + "hexcasting.page.spellcircles.5": "然而,用法术环施放的法术有一个限制:它无法影响环外的事物。也即,它无法影响到能将整个法术环包起的最小长方体外的事物(有凹进部分的法术环仍能影响凹进部分内的事物)。", + "hexcasting.page.spellcircles.6": "在媒质波减弱前它只能通过有限个方块,但这个值很大,实际不大可能超过这个值。$(br2)相反地,有部分操作只能在法术环上执行,不过它们没有一个是法术。它们似乎都是处理法术环本身性质的操作。相关笔记$(l:patterns/circle)见此/$。", + "hexcasting.page.spellcircles.7": "我还在笔记中找到了一份草稿,是一个古代研究者使用的法术环。另一页上就是它的重绘图(挺抽象的)。$(br2)其中的图案会按逆时针运行,以$(l:patterns/basics#hexcasting:get_caster)$(action)意识之精思/$开始并以$(l:patterns/great_spells/teleport#hexcasting:teleport)$(action)卓越传送/$结束。", + "hexcasting.page.spellcircles.teleport_circle.title": "传送环", + + "hexcasting.entry.impetus": "促动石", + "hexcasting.page.impetus.1": "启动法术环需要复杂的$(media)媒质/$波动。就算是眼神最好的、手最稳的的凡人也比不上能将$(media)媒质/$编织为自我维持的衔尾蛇的$(l:greatwork/impetus)$(item)促动石/$那般厉害。$(br2)问题就在于意识里有太多无用的$(italic)垃圾/$。", + "hexcasting.page.impetus.2": "从……形而上学层面上讲——我不能再有这种想法了,我不能让自己的思维被搅乱,我的思维非常重要——流动的$(media)媒质/$会推动意识,意识也必须被推动以使这一过程启动。但是,意识中的许多思维让意识变得十分$(italic)笨重/$,没法灵活行动。$(br2)就和让工匠戴着连指手套去修手表一样。", + "hexcasting.page.impetus.3": "这个难题有许多种解决方案。可以通过冥想或类似手段放空意识,尽管我不清楚放空到能启动法术环的意识还有没有足够的力量去执行那些操作。$(br2)某些不光彩的化合物也能产生类似效果,但我不了解它们也不想了解它们。我绝不能沉沦于给大脑喂化学品。", + "hexcasting.page.impetus.4": "我选择的解决方案,是特种化一个意识。将其从神经的暴政中释放,剪去除$(media)媒质/$操控装置外的一切功用件,烙封除启动信号口外的一切接收端口。$(br2)我现在已较为熟练掌握的$(l:greatwork/brainsweeping)$(action)剥离意识/$过程就能很好地做到这些。村民的意识复杂到足以启动法术环,但也还没复杂到能抵御扭曲。", + "hexcasting.page.impetus.empty_impetus": "第一步,基床。虽然和纯粹的$(l:greatwork/impetus)$(item)促动石/$不大一样,但它能让$(media)媒质/$从箭头所指方向流出。这就提供了一种改变媒质波所在平面的方法。", + "hexcasting.page.impetus.impetus_rightclick": "第二步,转移意识。村民职业的不同意味着$(l:greatwork/impetus)$(item)促动石/$激活条件的不同。$(l:greatwork/impetus)$(item)工具匠促动石/$会在对其按下$(k:use)时启动。", + "hexcasting.page.impetus.impetus_storedplayer.1": "$(l:greatwork/impetus)$(item)牧师促动石/$必须绑定至某一玩家,对其使用存有代表玩家的 iota 的物品(例如$(l:items/focus)$(item)核心/$)即可。这之后,它会在收到红石信号时启动。", + "hexcasting.page.impetus.impetus_storedplayer.2": "这种$(l:greatwork/impetus)$(item)促动石/$也使得被绑定的玩家和他们周围一小块区域会一直受法术环影响。不管该玩家离法术环多远都会和站在法术环里一样。$(br2)用$(l:items/lens)$(item)探知透镜/$观察$(l:greatwork/impetus)$(item)牧师促动石/$就会显示被绑定的玩家。", + "hexcasting.page.impetus.impetus_look": "$(l:greatwork/impetus)$(item)制箭师促动石/$会在被注视一段时间后启动。", + + "hexcasting.entry.directrix": "导向石", + "hexcasting.page.directrix.1": "引导$(media)媒质/$比产生一个自我维持的媒质波简单许多。一般来说媒质波会在分叉处消散,但如果有一个用来指引的意识,媒质的流向就能被操控了。$(br2)这种操控所需的精度完全不比启动法术环的精度,我自己上都行……但封进一个意识实在是太方便了。", + "hexcasting.page.directrix.2": "$(l:greatwork/directrix)$(item)导向石/$会接受一个$(media)媒质/$波并决定它的流向,具体如何操控主要看其中的村民意识。$(br2)我不清楚是这个想法先找到我的,还是我的意识先产生这种想法的……如果这种想法是我的意识产生的,是我自己想出来的,那还能说是想法找到我吗?大脑是意识的容器意识是想法的容器想法思维容器思维全知思维全知——停,下。", + "hexcasting.page.directrix.empty_directrix": "第一步,基床……用“基底”这个名字会准确些。倘若没有意识引导,媒质的流向是由$(media)媒质/$波的微观涨落和环境决定的,换句话说,随机的。", + "hexcasting.page.directrix.directrix_redstone": "$(l:greatwork/directrix)$(item)石匠导向石/$会根据红石信号改变输出方向。没有信号的话,出口是$(media)媒质/$色的一端;有信号的话,出口是红石色的一端。", + + "hexcasting.entry.akashiclib": "阿卡夏图书馆", + "hexcasting.page.akashiclib.1": "我所知甚多,将所知存于某处是唯一正途。信息能用书本存储但徒手书写以眼阅读非常非常非常非常$(italic)缓慢/$。我需要更好的方法。并且我必将找到。$(br2)……我的意识每况愈下……不知道我还有没有时间赶在满溢头脑的知识消散之前记下它们。", + "hexcasting.page.akashiclib.2": "一座图书馆。我的计划,如下。$(br2)就和图案与操作的对应关系一样,我能以我自己的方式将自创的图案与 iota 对应起来。$(l:greatwork/akashiclib)$(item)阿卡夏记录/$是图书馆的控制核心,而每个$(l:greatwork/akashiclib)$(item)阿卡夏书架/$存储一个映射。它们必须互相连接,直接贴在一起,不超过 32 格。$(l:greatwork/akashiclib)$(item)阿卡夏桥接块/$没有存储功能但被视为连接方块,从而增加图书馆的大小。", + "hexcasting.page.akashiclib.akashic_record": "存储和分配图案非常简单但太过磨人,我还有更要紧的事要做。剥离一个精于此道的意识能省很多麻烦。", + "hexcasting.page.akashiclib.3": "图书馆的使用方法很简单,交给图书管理员一个图案,然后他把对应的 iota 交给你。共有两个相关图案,$(l:patterns/akashic_patterns)笔记在此/$。$(br2)对书架使用一张空白的$(l:items/scroll)$(item)卷轴/$就能将图案复制到$(l:items/scroll)$(item)卷轴/$上。潜行时右击书架就能清除其中数据。", + + "_comment": "Patterns", + + "hexcasting.entry.readers_guide": "如何阅读这一章节", + "hexcasting.page.readers_guide.1": "我将我找到的所有图案根据作用分为了几类。我也记下了它们的笔画顺序,前提是我在研究中发现了确切顺序。绘制起点标记为一个稍大的红点。$(br2)如果某个操作需要绘制多个图案才能执行,我会将那些图案排在一起。", + "hexcasting.page.readers_guide.2": "我$(italic)没法确定/$某些图案的笔顺,不过它们的形状是确定的。我猜测它们的画法就藏在某些古代的图书馆和地牢里。$(br2)我只会记录这类图案的外形,笔顺不记。", + "hexcasting.page.readers_guide.3": "我也会记下操作接受或修改的 iota 的类型,后接一个“→”,再后接这些操作产生的 iota 的类型。$(p)例如,“$(n)vector, number/$ → $(n)vector/$” 意味着该操作会从栈顶移除一个向量和一个数,然后压入一个向量;或者说,移除一个数,然后修改栈顶的向量。(数需在栈顶,向量则需直接处于数下方。)", + "hexcasting.page.readers_guide.4": "“→ $(n)entity/$”意味着该操作只会压入一个实体。“$(n)entity, vector/$ →”意味着该操作会弹出一个实体和一个向量,而不压入任何 iota。$(br2)再提一句,如果觉得标记笔顺的小点太慢或太难看清楚,可以按下 $(thing)Control 或 Command/$ 将图案以渐变显示,起始点最深,结束点最浅。卷轴和咒术网格也能这样!", + + "hexcasting.entry.basics_pattern": "基础图案", + "hexcasting.page.basics_pattern.get_caster": "返回我,也就是施法者。", + "hexcasting.page.basics_pattern.entity_pos/eye": "将栈顶的实体变为其眼部位置。这个图案比较适用于我自己。", + "hexcasting.page.basics_pattern.entity_pos/foot": "将栈顶的实体变为其所站位置。这个图案比较适用于其他实体。", + "hexcasting.page.basics_pattern.get_entity_look": "将栈顶的实体变为其视线方向上的单位向量。", + "hexcasting.page.basics_pattern.print": "向我展示栈顶的 iota。", + "hexcasting.page.basics_pattern.raycast.1": "将两个向量组合(分别表示位置和方向)并返回如下问题的答案:若我站在该位置并看向该方向,我会看到什么方块?消耗极少量$(media)媒质/$。", + "hexcasting.page.basics_pattern.raycast.2": "如果视线并未击中任何事物,所提供的向量会变为 $(l:casting/influences)$(thing)Null/$。$(br2)有一套常用的图案序列(常称“光线投射曼怛罗”),由$(action)意识之精思/$、$(action)指南针之纯化/$、$(action)意识之精思/$、$(action)照准仪之纯化/$、$(action)弓箭手之馏化/$组成。依次绘制就能返回我所看的方块的位置向量。", + "hexcasting.page.basics_pattern.raycast/axis.1": "与$(l:patterns/basics#hexcasting:raycast)$(action)弓箭手之馏化/$类似,但会返回如下问题的答案:我看着的是方块的$(italic)哪一面/$?消耗极少量$(media)媒质/$。", + "hexcasting.page.basics_pattern.raycast/axis.2": "更确切地说,它会返回所看面的$(italic)法向量/$,也即垂直于该面的单位向量。$(li)如果我看着地面,它会返回 (0, 1, 0)。$(li)如果我看着某方块面向南方的侧面,它会返回 (0, 0, 1)。", + "hexcasting.page.basics_pattern.raycast/entity": "与$(l:patterns/basics#hexcasting:raycast)$(action)弓箭手之馏化/$类似,但会返回我所看的$(italic)实体/$。消耗极少量$(media)媒质/$。", + "hexcasting.page.basics_pattern.get_entity_height": "将栈顶的实体变为其高度。", + "hexcasting.page.basics_pattern.get_entity_velocity": "将栈顶的实体变为其移动方向上的向量,其模长为实体的移动速度。", + + "hexcasting.entry.numbers": "数字常量", + "hexcasting.page.numbers.1": "没有绘制数字的简单方法,这点挺烦人的。自然屈尊为我们创造的方法如下。", + "hexcasting.page.numbers.2": "首先,绘制左页两图案中的一种,默认数值为 0。然后,每一画的$(italic)方向/$会以对应方式修改该数值。$(li)前方:加 1$(li)左前方:加 5$(li)右前方:加 10$(li)左后方:乘 2$(li)右后方:除以 2$(br)顺时针绘制,也即左页右图,会在绘制完成后取相反数(如左图逆时针绘制则不取)。$(p)绘制完成后会返回对应数。", + "hexcasting.page.numbers.example.10.header": "例图一", + "hexcasting.page.numbers.example.10": "该图案会返回 10。", + "hexcasting.page.numbers.example.7.header": "例图二", + "hexcasting.page.numbers.example.7": "该图案会返回 7:5 + 1 + 1。", + "hexcasting.page.numbers.example.-32.header": "例图三", + "hexcasting.page.numbers.example.-32": "该图案会返回 -32:(1 + 5 + 10) * 2 的相反数。", + "hexcasting.page.numbers.example.4.5.header": "例图四", + "hexcasting.page.numbers.example.4.5": "该图案会返回 4.5:5 / 2 + 1 + 1。", + "hexcasting.page.numbers.3": "某些情况下用$(l:items/abacus)$(item)算盘/$会更方便。但数字的“正确”画法也要了然于心。", + + "hexcasting.entry.math": "数学", + "hexcasting.page.math.numvec": "许多数学操作对数和向量都有效。这类参数记为“num/vec”。", + "hexcasting.page.math.add.1": "执行加法。", + "hexcasting.page.math.add.2": "操作如下:$(li)若栈顶为两个数,返回其和。$(li)若为一个数和一个向量,移除该数并将向量的每个分量与其相加。$(li)若为两个向量,将对应分量相加(也即 [1, 2, 3] + [0, 4, -1] = [1, 6, 2])。", + "hexcasting.page.math.sub.1": "执行减法。", + "hexcasting.page.math.sub.2": "操作如下:$(li)若栈顶为两个数,返回其差。$(li)若为一个数和一个向量,移除该数并将向量的每个分量与其相减。$(li)若为两个向量,将对应分量相减。$(br2)栈顶元素或其分量为减数,栈顶往下第二元素或其分量为被减数。", + "hexcasting.page.math.mul_dot.1": "执行乘法或点积。", + "hexcasting.page.math.mul_dot.2": "操作如下:$(li)若栈顶为两个数,返回其积。$(li)若为一个数和一个向量,移除该数并将向量的每个分量与其相乘。$(li)若为两个向量,计算其$(l:https://www.mathsisfun.com/algebra/vectors-dot-product.html)点积/$。", + "hexcasting.page.math.div_cross.1": "执行除法或叉积。", + "hexcasting.page.math.div_cross.2": "操作如下:$(li)若栈顶为两个数,返回其商。$(li)若为一个数和一个向量,移除该数并将向量的每个分量与其相除。$(li)若为两个向量,计算其$(l:https://www.mathsisfun.com/algebra/vectors-cross-product.html)叉积/$。$(br2)第一第二种情况下,栈顶元素或其分量为除数,栈顶往下第二元素或其分量为被除数。$(p)警告:绝对不可除以零!", + "hexcasting.page.math.abs_len.1": "计算绝对值或模长。", + "hexcasting.page.math.abs_len.2": "将一个数变为其绝对值,将一个向量变为其模长。", + "hexcasting.page.math.pow_proj.1": "执行乘方或向量射影。", + "hexcasting.page.math.pow_proj.2": "若栈顶为两个数,返回两数的乘方。$(li)若为一个数和一个向量,移除该数并计算向量的每个分量与该数的乘方。$(li)若为两个向量,计算栈顶向量对栈顶往下第二向量的$(l:https://en.wikipedia.org/wiki/Vector_projection)向量射影/$。$(br2)第一第二种情况下,栈顶元素或其分量为指数, 栈顶往下第二元素或其分量为底数。", + "hexcasting.page.math.floor": "对一个数取底,也即去掉小数部分取整。", + "hexcasting.page.math.ceil": "对一个数取顶,也即将小数部分不为零的数换为大于其的最小整数。", + "hexcasting.page.math.construct_vec": "将三个数作为向量的 X,Y,Z 分量组合(最下方为 X 分量)。", + "hexcasting.page.math.deconstruct_vec": "将一个向量拆分为其 X,Y,Z 分量(最下方为 X 分量)。", + "hexcasting.page.math.modulo": "取两数除法的余数。也即执行除法后$(italic)剩余/$的数。例如,5 %% 2 得 1,5 %% 3 得 2。", + "hexcasting.page.math.coerce_axial": "将一个向量变为与其夹角最小的轴向单位向量。零向量不受影响。", + "hexcasting.page.math.random": "返回一个 0 与 1 之间的随机数。", + + "hexcasting.entry.advanced_math": "高阶数学", + "hexcasting.page.advanced_math.sin": "计算所给角(弧度制)的正弦,也即该角在单位圆上的纵坐标。与 $(l:patterns/consts#hexcasting:const/double/pi)$(thing)π/$ 和 $(l:patterns/consts#hexcasting:const/double/tau)$(thing)τ/$ 的值有关。", + "hexcasting.page.advanced_math.cos": "计算所给角(弧度制)的余弦,也即该角在单位圆上的横坐标。与 $(l:patterns/consts#hexcasting:const/double/pi)$(thing)π/$ 和 $(l:patterns/consts#hexcasting:const/double/tau)$(thing)τ/$ 的值有关。", + "hexcasting.page.advanced_math.tan": "计算所给角(弧度制)的正切,也即该角在单位圆上的斜率。与 $(l:patterns/consts#hexcasting:const/double/pi)$(thing)π/$ 和 $(l:patterns/consts#hexcasting:const/double/tau)$(thing)τ/$ 的值有关。", + "hexcasting.page.advanced_math.arcsin": "计算所给数(绝对值小于 1)的反正弦,也即正弦为该值的角。与 $(l:patterns/consts#hexcasting:const/double/pi)$(thing)π/$ 和 $(l:patterns/consts#hexcasting:const/double/tau)$(thing)τ/$ 的值有关。", + "hexcasting.page.advanced_math.arccos": "计算所给数(绝对值小于 1)的反余弦,也即余弦为该值的角。与 $(l:patterns/consts#hexcasting:const/double/pi)$(thing)π/$ 和 $(l:patterns/consts#hexcasting:const/double/tau)$(thing)τ/$ 的值有关。", + "hexcasting.page.advanced_math.arctan": "计算所给数的反正切,也即正切为该值的角。与 $(l:patterns/consts#hexcasting:const/double/pi)$(thing)π/$ 和 $(l:patterns/consts#hexcasting:const/double/tau)$(thing)τ/$ 的值有关。", + "hexcasting.page.advanced_math.logarithm": "计算以栈顶元素为底的,栈顶往下第二元素为真数的对数。与 $(l:patterns/consts#hexcasting:const/double/e)$(thing)$(italic)e/$ 的值有关。", + + "hexcasting.entry.sets": "集合", + "hexcasting.page.sets.numlist": "集合操作比较奇怪,部分操作只能接受两个数或两个列表,一个数一个列表就不行。这类参数记为“num, num/list, list”。$(br2)当接受的是数时,它们将被视为所谓二进制的“位组”,也就是由 1 和 0、真和假、“开”和“关”组成的列表。", + "hexcasting.page.sets.or.1": "取两集合的并集。", + "hexcasting.page.sets.or.2": "操作如下:$(li)若栈顶为两个数,将其组合为在两个位组中有一个为 1 处为 1 的位组。$(li)若栈顶为两个列表,则创建一个由第一个列表中所有元素和第二个列表独有的元素组成的列表。和$(l:patterns/lists#hexcasting:concat)$(action)组合之馏化/$类似。", + "hexcasting.page.sets.and.1": "取两集合的交集。", + "hexcasting.page.sets.and.2": "操作如下:$(li)若栈顶为两个数,将其组合为仅在两个位组中$(italic)均/$为 1 处为 1 的位组。$(li)若栈顶为两个列表,则创建一个由第一个和第二个列表共有的元素组成的列表。", + "hexcasting.page.sets.xor.1": "取两集合中每个集合独有的元素集合。", + "hexcasting.page.sets.xor.2": "操作如下:$(li)若栈顶为两个数,将其组合为仅在两个位组中$(italic)仅一个/$为 1 处为 1 的位组。$(li)若栈顶为两个列表,则创建一个在两个列表中$(italic)仅出现一次/$的元素组成的列表。", + "hexcasting.page.sets.not": "对位组执行位非操作,将所有为 1 的比特换为 0,反之亦然。就我经验而言,这会使一个数变为其相反数,然后减 1。例如,0 会变成 -1,而 -100 会变成 99。", + "hexcasting.page.sets.to_set": "去除列表内重复的元素。", + + "hexcasting.entry.consts": "常量", + "hexcasting.page.consts.const/null": "返回 $(l:casting/influences)$(thing)Null/$ 这一虚指。", + "hexcasting.page.consts.const/true": "返回 $(thing)True/$。", + "hexcasting.page.consts.const/false": "返回 $(thing)False/$。", + "hexcasting.page.consts.const/vec/x": "左图(逆时针绘制)返回 [1, 0, 0];右图(顺时针绘制)返回 [-1, 0, 0]。", + "hexcasting.page.consts.const/vec/y": "左图(逆时针绘制)返回 [0, 1, 0];右图(顺时针绘制)返回 [0, -1, 0]。", + "hexcasting.page.consts.const/vec/z": "左图(逆时针绘制)返回 [0, 0, 1];右图(顺时针绘制)返回 [0, 0, -1]。", + "hexcasting.page.consts.const/vec/0": "返回 [0, 0, 0]。", + "hexcasting.page.consts.const/double/tau": "返回 τ,也即圆的弧度。", + "hexcasting.page.consts.const/double/pi": "返回 π,也即半圆的弧度。", + "hexcasting.page.consts.const/double/e": "返回 $(italic)e/$,也即自然对数的底。", + + "hexcasting.entry.stackmanip": "栈操作", + "hexcasting.page.stackmanip.pseudo-novice.title": "初学者之策略", + "hexcasting.page.stackmanip.pseudo-novice": "移除栈顶的 iota。", + "hexcasting.page.stackmanip.duplicate": "复制栈顶的 iota。", + "hexcasting.page.stackmanip.swap": "交换栈顶两个 iota 的位置。", + "hexcasting.page.stackmanip.rotate": "将栈顶往下第三元素拉至栈顶。[0, 1, 2] 变为 [1, 2, 0]。", + "hexcasting.page.stackmanip.over": "将栈顶往下第二元素复制至栈顶。[0, 1] 变为 [0, 1, 0]。", + "hexcasting.page.stackmanip.duplicate_n": "移除栈顶的数,然后将现在的栈顶元素复制该数次。(若所给数为 2,则栈顶会有两个同一元素。)", + "hexcasting.page.stackmanip.fisherman": "提出下标为所给数的元素并将其置于栈顶。", + "hexcasting.page.stackmanip.stack_len": "以数的形式压入栈中元素的个数。(例如,一个形如 [0, 1] 的栈会变为 [0, 1, 2]。)", + "hexcasting.page.stackmanip.last_n_list": "移除$(italic)所给数/$个元素,然后压入一个由其组成的列表。", + "hexcasting.page.stackmanip.splat": "移除栈顶的列表,然后依次压入其元素。", + "hexcasting.page.stackmanip.duplicate": "复制栈顶的 iota。", + "hexcasting.page.stackmanip.duplicate_n": "移除栈顶的数,然后将现在的栈顶元素复制该数次。(若所给数为 2,则栈顶会有两个同一元素。)", + "hexcasting.page.stackmanip.mask.1": "一组无限个根据凹槽和横线的顺序来保留或移除栈中元素的操作。", + "hexcasting.page.stackmanip.mask.2": "假如从左到右绘制书吏之策略,此操作操控的 iota 个数由其横向长度决定。从靠近栈底端开始计入,一条横线代表保留该处元素,一个凹槽代表移除该处元素。$(br2)如果栈从栈底起形如 $(italic)0, 1, 2/$ ,绘制左页例图一,则栈变为 $(italic)1/$;例图二会将栈变为 $(italic)0/$;例图三会将栈变为 $(italic)0, 2/$(栈底的 0 不受影响)。", + "hexcasting.page.stackmanip.swizzle.1": "根据所给数字代码重排栈顶若干元素。", + "hexcasting.page.stackmanip.swizzle.2": "我确实不知道数字代码和重排操作的完整对应关系,但我整理了一份对应表格,整理了最多六个元素的重排的编码。$(br2)如果要找延伸阅读资料,可以搜索“Lehmer Code”。", + "hexcasting.page.stackmanip.swizzle.link": "编码列表", + + "hexcasting.entry.logic": "逻辑运算", + "hexcasting.page.logic.bool_coerce": "将参数变换为布尔值。数 $(thing)0/$、$(l:influences#null)$(thing)Null/$,以及空列表会变为 False。其余所有则变为 True。", + "hexcasting.page.logic.not": "如果参数是 True,返回 False;如果参数是 False,返回 True。", + "hexcasting.page.logic.or": "如果至少有一个参数是 True,返回 True。否则返回 False。", + "hexcasting.page.logic.and": "如果两个参数都是 True,返回 True。否则返回 False。", + "hexcasting.page.logic.xor": "如果参数中仅一个是 True,返回 True。否则返回 False。", + "hexcasting.page.logic.if": "如果第一个参数是 True,保留第二个参数并移除第三个。否则保留第三个参数并移除第二个。", + "hexcasting.page.logic.equals": "如果第一个参数等于第二个(允许较小误差),返回 True。否则返回 False。", + "hexcasting.page.logic.not_equals": "如果第一个参数不等于第二个(允许较小误差),返回 True。否则返回 False。", + "hexcasting.page.logic.greater": "如果第一个参数大于第二个,返回 True. 否则返回 False。", + "hexcasting.page.logic.less": "如果第一个参数小于第二个,返回 True。否则返回 False。", + "hexcasting.page.logic.greater_eq": "如果第一个参数大于或等于第二个,返回 True。否则返回 False。", + "hexcasting.page.logic.less_eq": "如果第一个参数小于或等于第二个,返回 True。否则返回 False。", + + "hexcasting.entry.entities": "实体", + "hexcasting.page.entities.get_entity": "将栈顶位置向量变为该处实体(若无则返回 $(l:casting/influences)$(thing)Null/$)。", + "hexcasting.page.entities.get_entity/animal": "将栈顶位置向量变为该处动物(若无则返回 $(l:casting/influences)$(thing)Null/$)。", + "hexcasting.page.entities.get_entity/monster": "将栈顶位置向量变为该处怪物(若无则返回 $(l:casting/influences)$(thing)Null/$)。", + "hexcasting.page.entities.get_entity/item": "将栈顶位置向量变为该处物品实体(若无则返回 $(l:casting/influences)$(thing)Null/$)。", + "hexcasting.page.entities.get_entity/player": "将栈顶位置向量变为该处玩家(若无则返回 $(l:casting/influences)$(thing)Null/$)。", + "hexcasting.page.entities.get_entity/living": "将栈顶位置向量变为该处生物(若无则返回 $(l:casting/influences)$(thing)Null/$)。", + "hexcasting.page.entities.zone_entity/animal": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有动物的列表。", + "hexcasting.page.entities.zone_entity/not_animal": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有非动物实体的列表。", + "hexcasting.page.entities.zone_entity/monster": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有怪物的列表。", + "hexcasting.page.entities.zone_entity/not_monster": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有非怪物实体的列表。", + "hexcasting.page.entities.zone_entity/item": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有掉落的物品的列表。", + "hexcasting.page.entities.zone_entity/not_item": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有非物品实体的列表。", + "hexcasting.page.entities.zone_entity/player": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有玩家的列表。", + "hexcasting.page.entities.zone_entity/not_player": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有非玩家实体的列表。", + "hexcasting.page.entities.zone_entity/living": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有生物的列表。", + "hexcasting.page.entities.zone_entity/not_living": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有非生物实体的列表。", + "hexcasting.page.entities.zone_entity": "从栈顶获取位置及最大距离,返回该位置给定距离范围内所有实体的列表。", + + "hexcasting.entry.lists": "列表操作", + "hexcasting.page.lists.index": "移除栈顶的数,将栈顶的列表变为其中下标为该数(就是被移除的那个数)的元素。若该数越界,则将列表换为 $(l:casting/influences)$(thing)Null/$。", + "hexcasting.page.lists.slice": "移除栈顶的两个数,将栈顶的列表变为其中下标在两个数之间元素的子列表,包含下标下界,不含下标上界。例如,[0, 1, 2, 3, 4] 的 0, 2 子列表是 [0, 1]。", + "hexcasting.page.lists.append": "移除栈顶元素,将其加到栈顶列表的末尾。", + "hexcasting.page.lists.concat": "移除栈顶列表,将其中元素加到当前栈顶列表的末尾。", + "hexcasting.page.lists.empty_list": "压入一个空列表。", + "hexcasting.page.lists.singleton": "移除栈顶元素,而后返回一个仅包含该元素的列表。", + "hexcasting.page.lists.list_size": "移除栈顶列表,而后返回该列表中元素的个数。", + "hexcasting.page.lists.reverse_list": "倒置栈顶列表。", + "hexcasting.page.lists.index_of": "移除栈顶元素,并将栈顶列表变为该元素在其中第一次出现的位置(从 0 开始)。若没有出现过则返回 -1。", + "hexcasting.page.lists.list_remove": "移除栈顶的数,而后移除栈顶列表中下标为该数(就是被移除的那个数)的元素。", + "hexcasting.page.lists.modify_in_place": "移除栈顶元素和栈顶的数,而后将栈顶列表中下标为该数(就是被移除的那个数)变为该元素。若该数越界则不进行操作。", + "hexcasting.page.lists.last_n_list": "移除 $(italic)num/$ 个元素,并将这些元素加入列表并压入栈顶。", + "hexcasting.page.lists.splat": "移除栈顶列表,而后将其中元素全部压入栈顶。", + "hexcasting.page.lists.construct": "移除栈顶元素,将其加到栈顶列表的开头。", + "hexcasting.page.lists.deconstruct": "移除栈顶列表中的第一个元素,并将该元素压入栈顶。", + + "hexcasting.entry.patterns_as_iotas": "将图案用作 Iota", + "hexcasting.page.patterns_as_iotas.1": "咒法学中的一个怪异之处就是$(italic)图案本身/$也可被视为 iota ——其甚至能在施法时被压到栈中。$(br2)这就产生了一个问题:我怎么把图案用作 iota 呢?如果就只是画一遍,自然大概不会将其理解为“把它加到栈里”,而只会将其与操作对应起来。", + "hexcasting.page.patterns_as_iotas.2": "幸运的是,自然提供了一组专用于此道的$(l:casting/influences)虚指/$。$(br2)简而言之,$(l:patterns/patterns_as_iotas#hexcasting:escape)$(action)考察/$使我能将一个图案加到栈中,$(l:patterns/patterns_as_iotas#hexcasting:open_paren)$(action)内省/$和$(l:patterns/patterns_as_iotas#hexcasting:close_paren)$(action)反思/$则能加入一整个列表。", + "hexcasting.page.patterns_as_iotas.escape.1": "要使用$(l:patterns/patterns_as_iotas#hexcasting:escape)$(action)考察/$,先绘制它,然后绘制任意图案。第二个图案就会被加到栈中。", + "hexcasting.page.patterns_as_iotas.escape.2": "如果对计算机科学有足够了解的话,你可能能将其与“转义”/“escape”操作联系起来。$(br2)考察的一大用途是将某一图案复制到$(l:items/scroll)$(item)卷轴/$或$(l:items/slate)$(item)石板/$上,且要和$(l:patterns/readwrite#hexcasting:write)$(action)书吏之策略/$配合使用。这之后卷轴和石板就能拿来装饰了。", + "hexcasting.page.patterns_as_iotas.parens.1": "绘制$(l:patterns/patterns_as_iotas#hexcasting:open_paren)$(action)内省/$会让这之后绘制的图案不再与操作联系。而在绘制$(l:patterns/patterns_as_iotas#hexcasting:open_paren)$(action)反思/$后,之前绘制的图案就会作为一个列表加到栈中。", + "hexcasting.page.patterns_as_iotas.parens.2": "如果绘制内省后再绘制一个$(l:patterns/patterns_as_iotas#hexcasting:close_paren)$(action)内省/$,则它也将被加到列表中,而且需绘制$(italic)两次/$$(l:patterns/patterns_as_iotas#hexcasting:close_paren)$(action)反思/$才能回到正常施法模式。", + "hexcasting.page.patterns_as_iotas.parens.3": "而且,如果在绘制$(l:patterns/patterns_as_iotas#hexcasting:open_paren)$(action)内省/$和$(l:patterns/patterns_as_iotas#hexcasting:close_paren)$(action)反思/$前绘制一个$(l:patterns/patterns_as_iotas#hexcasting:escape)$(action)考察/$,就能绕过它们的特殊功能,并将它们作为普通图案加到栈中,且不会影响返回正常施法模式前要绘制的$(l:patterns/patterns_as_iotas#hexcasting:close_paren)$(action)反思/$个数。$(br2)如果在$(l:patterns/patterns_as_iotas#hexcasting:open_paren)$(action)考察中/$连续绘制两个$(l:patterns/patterns_as_iotas#hexcasting:escape)$(action)考察/$,只有第一个$(l:patterns/patterns_as_iotas#hexcasting:escape)$(action)考察/$会被加到栈中。", + + "hexcasting.entry.readwrite": "读取与写入", + "hexcasting.page.readwrite.1": "这一章节主要记述有关将 $(thing)iota/$ 写入永久性介质中的知识。几乎所有 iota 都可被写入合适的物品中,例如$(l:items/focus)$(item)核心/$和$(l:items/spellbook)$(item)法术书/$,而后可以将它们读出来。而某些物品,例如$(l:items/abacus)$(item)算盘/$,则只能被读取。$(br2)一般可从另一只手中的物品中读取或写入 iota。但若将物品丢出为物品实体,或是放在物品展示框中,则也可读取或写入。", + "hexcasting.page.readwrite.2": "我还能对其他实体执行上述两种操作。例如,可从一张壁挂$(l:items/scroll)$(item)卷轴/$中读出图案。$(br2)然而,貌似写入代表其他玩家的 iota 是不被允许的,只有我自己的能写入。我认为这和“真名”类似。也许是自然在阻止我们的真名落入敌手。如果我想把我的真名交给朋友,做个$(l:items/focus)$(item)核心/$给他们就好了。", + "hexcasting.page.readwrite.read": "复制另一只手所持物品中 iota,并将其压入栈顶。", + "hexcasting.page.readwrite.write": "移除栈顶 iota,并将其写入另一只手中的物品中。", + "hexcasting.page.readwrite.read/entity": "与$(l:patterns/readwrite#hexcasting:read)$(action)书吏之精思/$类似,但会将 iota 从某实体中读出,而非手中物品。", + "hexcasting.page.readwrite.write/entity": "与$(l:patterns/readwrite#hexcasting:read)$(action)书吏之策略/$类似,但会将 iota 写入某实体,而非手中物品。$(br2)有意思的是,我似乎没法以这种手段写入我自己的真名。但我总感觉要是真这么做了我的安全就会受到严重威胁。", + "hexcasting.page.readwrite.readable": "如果另一只手中物品存有可被读取的 iota,返回 True。否则返回 False。", + "hexcasting.page.readwrite.readable/entity": "与$(l:patterns/readwrite#hexcasting:readable)$(action)审计员之精思/$类似,但会检测实体可读性,而非手中物品。", + "hexcasting.page.readwrite.writable": "如果能将 iota 写入另一只手中的物品,返回 True。否则返回 False。", + "hexcasting.page.readwrite.writable/entity": "与$(l:patterns/readwrite#hexcasting:writable)$(action)估价员之精思/$类似,但会检测实体可写性,而非手中物品。", + "hexcasting.page.readwrite.local.title": "渡鸦之思", + "hexcasting.page.readwrite.local": "物品不是唯一一个能写入信息的地方,我也可以将其存到$(hex)咒术/$自身的$(media)媒质/$里,就和栈差不多。文献将其称为$(l:patterns/readwrite#hexcasting:local)$(thing)渡鸦之思/$。它能存有一个 iota,默认为 $(l:casting/influences)$(thing)Null/$,和$(l:items/focus)$(item)核心/$差不多。它在每次使用$(l:patterns/meta#hexcasting:for_each)$(action)托特之策略/$后保持不变,但也只能撑到$(hex)咒术/$结束。一旦施法结束,其值就会被清除。", + "hexcasting.page.readwrite.write/local": "移除栈顶 iota,并将其写入$(l:patterns/readwrite#hexcasting:local)$(thing)渡鸦之思/$,在施放$(hex)咒术/$的整个过程结束之前一直存在那里。", + "hexcasting.page.readwrite.read/local": "将$(l:patterns/readwrite#hexcasting:local)$(thing)渡鸦之思/$中的 iota 复制出来。(也许刚刚才用$(l:patterns/readwrite#hexcasting:write/local)$(action)福金之策略/$写进去。)", + + "hexcasting.entry.meta": "元运行", + "hexcasting.page.meta.eval.1": "移除栈顶的图案列表,然后就像我用$(l:items/staff)$(item)法杖/$施法一样依次运行(直到碰到$(l:patterns/meta#hexcasting:halt)$(action)卡戎之策略/$)。如果一个 iota 已用$(l:patterns/patterns_as_iotas#hexcasting:escape)$(action)考察/$或$(l:patterns/patterns_as_iotas#hexcasting:open_paren)$(action)类似手段/$作为图案加入栈中,那么该 iota 将在运行时被加到栈中。否则其将在非图案元素运行失败。", + "hexcasting.page.meta.eval.2": "若与$(l:items/focus)$(item)核心/$同时使用,它将提供$(italic)极为/$强大的操控能力。$(br2)距我找到的一张奇特卷轴所称,它还将自然的咒法体系变为了一个“图灵完备”的系统。$(br2)然而,$(hex)咒术/$能重复执行自身的次数是有限的——自然不会对失控的法术手软的!$(br2)此外,若让图案不在我的引导下操控能量,那么任何事故都可能导致后续操作不稳定甚至直接执行不了。", + "hexcasting.page.meta.for_each.1": "移除栈中的一个图案列表和一个列表,然后对后一列表中的每个元素运行前一图案列表中的图案。", + "hexcasting.page.meta.for_each.2": "更确切地说,对应后一列表中的每个元素,它将:$(li)创建一个新栈,其中包括当前栈中的所有元素和后一列表中的一个元素。$(li)绘制前一列表中的所有图案。$(li)将该栈中剩余的所有元素存进一个列表。$(br)在所有元素都运行一遍后,将该列表压入原本的栈中。$(br2)也难怪精通此操作的人都疯了。", + "hexcasting.page.meta.halt.1": "这个图案将强制停止$(hex)咒术/$的施放。它独自出现可能没什么用,我只要不绘制图案或是放下法杖就行了。", + "hexcasting.page.meta.halt.2": "但当与$(l:patterns/meta#hexcasting:eval)$(action)赫尔墨斯之策略/$或$(l:patterns/meta#hexcasting:for_each)$(action)托特之策略/$一起使用时,它就将发挥$(italic)大/$用。那些图案会碰到这个休止符,但$(hex)咒术/$本身不会停止,停止运行的是那些策略。它可以用来防止$(l:patterns/meta#hexcasting:for_each)$(action)托特之策略/$将每个 iota 都运行一遍。这便是逃离疯狂的密道。", + + "hexcasting.entry.circle_patterns": "法术环图案", + "hexcasting.page.circle_patterns.disclaimer": "这些图案只能在$(l:greatwork/spellcircles)$(item)法术环/$上运行。尝试用$(l:items/staff)$(item)法杖/$绘制它们会招致可怖的事故。", + "hexcasting.page.circle_patterns.circle/impetus_pos": "返回该法术环的$(l:greatwork/impetus)$(item)促动石/$的位置。", + "hexcasting.page.circle_patterns.circle/impetus_dir": "以单位向量返回该法术环的$(l:greatwork/impetus)$(item)促动石/$的面朝方向。", + "hexcasting.page.circle_patterns.circle/bounds/min": "返回该法术环影响范围的西北靠下转角的位置。", + "hexcasting.page.circle_patterns.circle/bounds/max": "返回该法术环影响范围的东南靠上转角的位置。", + + "hexcasting.entry.akashic_patterns": "阿卡夏图案", + "hexcasting.page.akashic_patterns.akashic/read": "在$(l:greatwork/akashiclib)$(item)阿卡夏记录/$处从$(l:greatwork/akashiclib)$(item)阿卡夏图书馆/$中读出所给图案对应的 iota。没有读取距离限制。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.akashic_patterns.akashic/write": "在$(l:greatwork/akashiclib)$(item)阿卡夏图书馆/$的$(l:greatwork/akashiclib)$(item)记录/$处将 iota 和所给图案对应起来。$(italic)有/$存储距离限制。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + + "_comment": "Normal Spells", + + "hexcasting.entry.itempicking": "处理物品", + "hexcasting.page.itempicking.1": "某些法术,例如$(l:patterns/spells/blockworks#hexcasting:place_block)$(action)放置方块/$,会消耗物品栏内的其他物品。在这种情况下,法术会先检索要用哪个物品,然后就会消耗物品栏内所有同种物品。$(br2)这一过程被称为“挑选物品”。", + "hexcasting.page.itempicking.2": "更具体地说:$(li)首先,法术会在快捷栏内$(l:items/staff)$(item)法杖所处位置的右侧/$依次搜索可用物品,搜到最右侧后便会从最左侧开始向右搜寻。若$(l:items/staff)$(item)法杖/$在副手,则会从快捷栏一号位开始搜索。$(li)然后,法术会从$(italic)物品栏内最靠后的位置/$开始消耗同种物品,且物品栏优先于快捷栏。", + "hexcasting.page.itempicking.3": "如此,我可以在快捷栏里放一些“选择器”用来告诉法术要用哪种方块,并在物品栏内放些同种方块防止供给不足。", + + "hexcasting.entry.basic_spell": "基础法术", + "hexcasting.page.basic_spell.explode.1": "移除栈顶的数和向量,并在所给位置产生一次强度为所给数的爆炸。", + "hexcasting.page.basic_spell.explode.2": "强度为 3 的爆炸与苦力怕的爆炸相当,4 则与 TNT 的相当。自然倒是不让我产生强度大于 10 的爆炸。$(br2)奇怪的是,这种爆炸伤不到我。也许是因为这爆炸是$(italic)我/$引起的?$(br2)强度为 0 时消耗极少量媒质,每加一级强度多消耗 3 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.basic_spell.explode.fire.1": "移除栈顶的数和向量,并在所给位置产生一次强度为所给数的带火焰的爆炸。", + "hexcasting.page.basic_spell.explode.fire.2": "消耗 1 个$(l:items/amethyst)$(item)紫水晶粉/$,每加一级强度多消耗 3 个$(l:items/amethyst)$(item)紫水晶粉/$。就和$(l:patterns/spells/basic#hexcasting:explode)$(action)爆炸/$一模一样,除了带点火。", + "hexcasting.page.basic_spell.add_motion": "移除栈顶的实体和表示方向的向量,然后将所给实体沿所给方向推动出去。驱动力的强度由向量的模长决定。$(br)消耗向量模长的平方个$(l:items/amethyst)$(item)紫水晶粉/$。除对某实体第一次使用外,其他情况额外消耗 1 个。", + "hexcasting.page.basic_spell.blink": "移除栈顶的实体和表示长度的数,然后将所给实体沿其视线方向向前传送所给长度格。$(br)每传送两格消耗大约 1 个$(l:items/amethyst)$(item)紫水晶碎片/$。", + "hexcasting.page.basic_spell.beep.1": "移除栈顶的一个向量和两个数。在指定位置以指定$(thing)乐器/$(由第一个数决定)弹奏$(thing)一个音/$(由第二个数决定)。消耗极少量$(media)媒质/$。", + "hexcasting.page.basic_spell.beep.2": "共有 16 种$(thing)乐器/$和 25 种$(thing)音高/$。两者的下标均从 0 开始。$(br2)这些乐器似乎就是$(item)音符盒/$对应的各种乐器,尽管其具体对应关系不得而知。$(br2)不管怎么说,用$(l:items/lens)$(item)探知透镜/$观察$(item)音符盒/$就能得知其乐器对应的数字。", + + "hexcasting.entry.blockworks": "方块工程", + "hexcasting.page.blockworks.place_block": "移除一个位置向量,然后挑选一个方块并放在给定位置。$(br)消耗极少量$(media)媒质/$。", + "hexcasting.page.blockworks.break_block": "移除一个位置向量,然后破坏给定位置的方块。此法术能破坏几乎所有钻石镐能破坏的方块。$(br)消耗略多于 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.blockworks.create_water": "在给定位置生成一格水(或给流体容器注入至多一桶水)。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.blockworks.destroy_water": "清空给定位置的流体容器,或是清除给定位置周围的液体。消耗大约 2 个$(l:items/amethyst)$(item)充能紫水晶/$。", + "hexcasting.page.blockworks.conjure_block": "在给定位置构筑一个空灵缥缈却坚硬可触的,闪着光的方块。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.blockworks.conjure_light": "在给定位置构筑一个发着我染色剂颜色的光的魔法光源。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.blockworks.bonemeal": "使目标位置的植物或树苗更快成长,就像对其施以$(item)骨粉/$一样。消耗略多于 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.blockworks.edify": "将$(media)媒质/$强制注入目标位置的树苗,使其长为$(l:items/edified)$(thing)启迪树/$。消耗大约 1 个$(l:items/amethyst)$(item)充能紫水晶/$。", + "hexcasting.page.blockworks.ignite": "在给定位置上方生火,就像在该位置使用$(item)火焰弹/$一样。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.blockworks.extinguish": "熄灭周围较大区域内的火焰。消耗大约 6 个$(l:items/amethyst)$(item)紫水晶粉/$。", + + "hexcasting.entry.nadirs": "天底法术", + "hexcasting.page.nadirs.1": "此类法术会给予某一实体一个负面药水效果。它们都接受一个实体作为效果受体,和一两个数。其中第一个数是持续时间,第二个数(若有)是效果强度(以 1 起始)。$(br2)每种法术都有一个“基础消耗”,实际消耗为基础消耗乘以效果强度的平方。", + "hexcasting.page.nadirs.2": "距某些传说所言,这些法术和它们的姊妹法术——$(l:patterns/great_spells/zeniths)$(action)天顶法术/$,都是“……由另一个世界的魔法启发的。在那个世界里,强大的魔法师会从四处收集魔法并决斗至死。不幸的是,许多信息都没翻译过来……”$(br2)也许这就是它们名字怪异的原因。", + "hexcasting.page.nadirs.potion/weakness": "给予$(thing)虚弱/$。每 10 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.nadirs.potion/levitation": "给予$(thing)飘浮/$。每 5 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.nadirs.potion/wither": "给予$(thing)凋零/$。每 1 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.nadirs.potion/poison": "给予$(thing)中毒/$。每 3 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.nadirs.potion/slowness": "给予$(thing)缓慢/$。每 5 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + + "hexcasting.entry.hexcasting_spell": "制作施法物品", + "hexcasting.page.hexcasting_spell.basics": "这三个法术都能制作$(l:items/hexcasting)$(thing)用于施放$(hex)咒术/$的物品/$。$(br)它们都要求我在另一只手上手持对应的基础物品,并且需提供两个参数:需运行的图案和一个用作电池的$(l:items/amethyst)$(item)紫水晶/$物品实体。$(br2)详情参见$(l:items/hexcasting)此条目/$。", + "hexcasting.page.hexcasting_spell.craft/cypher": "消耗大约 1 个$(l:items/amethyst)$(item)充能紫水晶/$。", + "hexcasting.page.hexcasting_spell.craft/trinket": "消耗大约 5 个$(l:items/amethyst)$(item)充能紫水晶/$。", + "hexcasting.page.hexcasting_spell.craft/artifact": "消耗大约 10 个$(l:items/amethyst)$(item)充能紫水晶/$。", + "hexcasting.page.hexcasting_spell.recharge.1": "给另一只手中的能装$(media)媒质/$的物品重新充能。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶碎片/$。", + "hexcasting.page.hexcasting_spell.recharge.2": "此法术的施放方式和制作施法物品所用法术的类似。提供一个$(l:items/amethyst)$(item)紫水晶/$物品实体,就能给另一只手中物品的$(media)媒质/$电池重新充能。$(br2)此法术$(italic)不能/$充入超过电池大小的媒质。", + "hexcasting.page.hexcasting_spell.erase.1": "清除另一只手中写有$(hex)咒术/$的物品。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.hexcasting_spell.erase.2": "此法术也会清除物品内存储的$(media)媒质/$,将其释放给自然并将物品恢复到其初始状态。如此就能回收利用容易出错的$(l:items/hexcasting)$(item)缀品/$了。$(br2)此法术也能清除$(l:items/focus)$(item)核心/$和$(l:items/spellbook)$(item)法术书/$书页内容,同时去除其上密封。", + + "hexcasting.entry.sentinels": "哨卫", + "hexcasting.page.sentinels.1": "$(italic)去吧!现在一切都已完成,$(br)只须留着一个人作哨卫。/$$(br2)$(l:patterns/spells/sentinels)$(thing)哨卫/$是一种能被$(hex)咒术/$召唤出的神秘力量,就和亲人或是侍卫一样。对我而言,它是一个旋转着的几何体,而其他人看不见它。", + "hexcasting.page.sentinels.2": "它有些有趣的性质:$(li)它似乎不可被触摸,没人摸得到它。$(li)只有我的$(hex)咒术/$才能与之交互。$(li)一旦召唤,在被驱除前它都将留在原位。$(li)只要我离它足够近,我就能透过方块看见它。", + "hexcasting.page.sentinels.sentinel/create": "在给定位置召唤哨卫$(l:patterns/spells/sentinels)$(thing)哨卫/$。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.sentinels.sentinel/destroy": "将我的$(l:patterns/spells/sentinels)$(thing)哨卫/$从世界中驱除出去。消耗极少量$(media)媒质/$。", + "hexcasting.page.sentinels.sentinel/get_pos": "将我的$(l:patterns/spells/sentinels)$(thing)哨卫/$的位置加到栈中,若并未召唤则加入一个 $(l:casting/influences)$(thing)Null/$。消耗极少量$(media)媒质/$。", + "hexcasting.page.sentinels.sentinel/wayfind": "将栈顶的位置向量变为从我的位置指向$(l:patterns/spells/sentinels)$(thing)哨卫/$的单位向量,若并未召唤则变为 $(l:casting/influences)$(thing)Null/$。消耗极少量$(media)媒质/$。", + + "hexcasting.page.colorize": "我需要在施法时在另一只手中持有$(l:items/pigments)$(item)染色剂/$。施法后,染色剂将被消耗而我意识的颜色也将永久改变(至少是在再次施法前)。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + + "hexcasting.page.create_lava.1": "在给定位置生成一格熔岩(或给流体容器注入至多一桶熔岩)。消耗大约 1 个$(l:items/amethyst)$(item)充能紫水晶/$。", + "hexcasting.page.create_lava.2": "建议不要声张自己知道这个法术。某些植物学家对此……比较敏感,至少我听说是这样。$(br2)也罢,确实没人说过探究宇宙最深层的秘密是什么好干的活。", + + "hexcasting.entry.weather_manip": "天气操控", + "hexcasting.page.weather_manip.lightning": "我能命令苍穹!此法术会在我所想之处召唤一道落雷。消耗大约 3 个$(l:items/amethyst)$(item)紫水晶碎片/$。", + "hexcasting.page.weather_manip.summon_rain": "我能控制云彩!此法术会在我所处世界各处召来雨水。消耗大约 1 个$(l:items/amethyst)$(item)充能紫水晶/$。若已在下雨就无效。", + "hexcasting.page.weather_manip.dispel_rain": "召雨的反面。此法术会将我所处世界的雨水驱离。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶碎片/$。若未在下雨就无效。", + + "hexcasting.page.flight.1": "飞行的力量!我已使自然屈膝臣服。但自然懂得复仇,它无时无刻不在盼望着我打破与它的条约,这样它就能打折我的腿。", + "hexcasting.page.flight.2": "实体(必须是玩家)将被给予飞行的力量。第一个数字是飞行能持续的时间,第二个数字则是允许飞行区域的半径。如果该玩家飞出了那个区域,或是在空中时时间耗尽,他们所藐视的引力就会出手。极尽其能。$(br2)每米半径、每秒持续时间消耗 1/4 个$(l:items/amethyst)$(item)紫水晶粉/$。", + + "hexcasting.page.teleport.1": "比$(l:patterns/spells/basic#hexcasting:blink)$(action)闪现/$更为强大,此法术能让我传送到世界上几乎任何一处!当然它也有极限,但可比我熟悉的施法距离要远得$(italic)多/$。", + "hexcasting.page.teleport.2": "实体会按所给向量偏移出其原有位置。它似乎一直会消耗大约 10 个$(l:items/amethyst)$(item)充能紫水晶/$,不论传送距离。$(br2)当然这种传送也不是尽善尽美的,在传送如玩家般复杂的实体时,实体身上的物品就不会$(italic)非常/$安稳了,它们可能会散落在目的地周围。还有,传送的实体将会被强制从其所乘坐的无生命载具中卸下……但我曾读到过动物可以一起被传送,大概吧。", + + "hexcasting.entry.zeniths": "天顶法术", + "hexcasting.page.zeniths.1": "此类法术会给予某一实体一个正面药水效果,与$(l:patterns/spells/nadirs)$(action)天底法术/$类似。然而,它们的$(media)媒质/$消耗会按效果强度的$(italic)立方/$计算。", + "hexcasting.page.zeniths.potion/regeneration": "给予$(thing)生命恢复/$。每 1 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.zeniths.potion/night_vision": "给予$(thing)夜视/$。每 5 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.zeniths.potion/absorption": "给予$(thing)伤害吸收/$。每 1 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.zeniths.potion/haste": "给予$(thing)急迫/$。每 3 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.zeniths.potion/strength": "给予$(thing)力量/$。每 3 秒持续时间的基础消耗为 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + + "hexcasting.page.greater_sentinel.1": "召唤一个比普通$(l:patterns/spells/sentinels)$(thing)哨卫/$要强大的哨卫。消耗大约 2 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "hexcasting.page.greater_sentinel.2": "卓越$(l:patterns/spells/sentinels)$(thing)哨卫/$除了看上去更奇特外和不用卓越法术召唤的哨卫一样。然而,我法术的生效范围会扩展到卓越$(l:patterns/spells/sentinels)$(thing)哨卫/$周围小范围处,大概是哨卫周围 16 格内。换句话说,不管我在世界上何处,我都能与卓越$(l:patterns/spells/sentinels)$(thing)哨卫/$周围的方块交互(尽管仍会受到“区块加载”这一神秘力量的影响)。", + + "hexcasting.page.make_battery.1": "将$(media)媒质/$注入一个玻璃瓶,从而制成$(l:items/phials)$(item)试剂瓶/$。", + "hexcasting.page.make_battery.2": "和用于$(l:patterns/spells/hexcasting)$(action)制作施法物品/$的法术类似,我需要在另一只手中拿着一个$(item)玻璃瓶/$,并提供一个$(l:items/amethyst)$(item)紫水晶/$物品实体作为参数。更多信息参见$(l:items/phials)此页/$。$(br2)消耗大约 1 个$(l:items/amethyst)$(item)充能紫水晶/$。", + + "hexcasting.page.brainsweep_spell.1": "我搞不懂这个法术……说实话,我也不清楚我到底想不想搞懂。", + + "hexcasting.entry.lore": "故事", + "hexcasting.entry.lore.desc": "我发现了些与我所研究的学问没有直接关系的信件和文本。但是,其中也许记载了某些历史上发生过的事。还是需要好好读读……", + + "hexcasting.entry.lore.terabithia1": "泰瑞宾西娅·斯蒂勒斯,#1", + "hexcasting.page.lore.terabithia1.1": "$(italic)完整标题:泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#1/$$(br2)亲爱的爸爸,$(br)我对你攒钱送我来大图书馆的感激之情与日俱增。在这里学到的知识真是不可思议!我实在没法把我所见所想全部描述出来……能来这里真是太棒了。", + "hexcasting.page.lore.terabithia1.2": "我写这封信时正坐在主穹顶下,它是由咒法学学生联合会维护和保养的。他们在穹顶顶部设置了某种奇特的装置,由此就能捕获从勤奋苦攻的学生的课桌中逸散出来的散在思维能量,至少我了解到的是这样。我的舍友阿曼妮塔就在钻研这门学问,她也非常愿意滔滔不绝地为我解释其中原理,尽管我得承认我听不大懂。", + "hexcasting.page.lore.terabithia1.3": "就我的理解而言,我们思考的过程——也就是驱动我写这封信和你读这封信的无形机制——并不那么有效。一小部分能量会逸散到环境中,就和马车的车轴在长途跋涉后摸起来会有点烫一样。这些散在能量叫做“媒质”。一个人的散在媒质微不足道,但成百上千位主穹顶下的思考者加在一起就不得了了,甚至还会出现乘数效应。再配上某些天才般的装置,这些媒质就能被固化为某种紫色的水晶。", + "hexcasting.page.lore.terabithia1.4": "有关她所研究的学问就讲这么多了。我今天和地质学学生联合会进行的第一次勘探告一段落啦!出发前没能写封信对不起啦,时间过得太快了。我们前去大图书馆东边一道裂谷里冒险,还在层层岩石和土壤底下扎营过了夜。当然,我们只探索了洞穴里光照良好且勘探完全的地方。不过就我觉得,在洞穴里过夜比在地表要安全得多,尽管我还是被狠狠地吓到了!", + "hexcasting.page.lore.terabithia1.5": "还好夜里没发生什么坏事,之后我们就往更深的地方去勘探本地矿脉了。我们在找的是一种稀有的紫色水晶矿脉,称作“紫水晶”,它们只以痕量出现在地层中。可惜的是,我们什么都没找到,只能两手空空地返回地表。", + "hexcasting.page.lore.terabithia1.6": "现在再想,这种“紫水晶”的外观描述貌似和阿曼妮塔所讲的媒质水晶极为类似。它们要是会自然形成于地底该怎么样,光是想想都兴奋!不过想来也是不大可能的吧……", + "hexcasting.page.lore.terabithia1.7": "作为一名学生,我每三个月能在阿卡夏邮局免费送一封信。但你也知道,我并不是很富裕……恐怕这是唯一一种能和你说上话的方式了。你攒钱回信我再感激不过,但我们之间的联系机会恐怕不会很多。不过我认为,我在这能学到的知识可能远超贷款上写的数字的价值。我大概会是家族中第一个不当农民的人吧!", + "hexcasting.page.lore.terabithia1.8": "我想,我三个月后会再写封信的。$(br2)你亲爱的,$(br)泰瑞宾西娅·斯蒂勒斯", + + "hexcasting.entry.lore.terabithia2": "泰瑞宾西娅·斯蒂勒斯,#2", + "hexcasting.page.lore.terabithia2.1": "$(italic)完整标题:泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#2/$$(br2)亲爱的爸爸,$(br)……天哪,试着把过去三个月的经历全写进信里真是件难事。这么难办的事居然是我免费得来的奇迹赐予的!我可真是辛苦。", + "hexcasting.page.lore.terabithia2.2": "我在地质学联合会的研究正稳步推进。我们又进行了一次实地考察,这次范围更深,直到灰色的岩石隐去而硬质的片状板岩出现的地方。那里的岩石会在脚下碎成令人窒息的粉末……脚下的危险已经需要格外注意,更不用说那些藏身于黑暗的生物。(我之前曾遇到过这种生物一两次,但我知道你会为我经受生死考验而坐立难安,所以就不提了。)", + "hexcasting.page.lore.terabithia2.3": "不过,我们确实发现了一些之前所说的紫水晶。在某次小型勘探中我们发现了个只有丁点水晶的小矿脉。我们需要严格遵守勘探规章,所以找到的紫水晶需全部取走并立刻上交给联合会中的学长。这整条规定在我看来从里到外都很荒诞。他们把这当做重要至极而绝密的事件,又把考察交给来这总共还不到六个月的新生去做,还就在那么几平方分米大的地方用足足十二把探矿镐开采总共十克都不到的东西……", + "hexcasting.page.lore.terabithia2.4": "我完全想不到这么做的理由。一位图书管理员给我推荐了本宝石百科,其中提到紫水晶的用途接近于零。它主要被用于制作某些特种玻璃和镜片,也基本算是没什么用。$(br2)让我来猜的话,我会觉得紫水晶和他们口中的媒质是一种东西,就和我上次说的一样。", + "hexcasting.page.lore.terabithia2.5": "假如这是真的,那那些严格的保密措施和学长们对质疑的排斥,也许就是因为这是大图书馆的原创性研究成果,而大图书馆不想让某些竞争对手知晓这些。$(br2)然而,这个理论有点站不住脚。矿洞中发现的紫水晶和阿曼妮塔给我看的那些媒质水晶确实很相像,但并不完全一致。也许要把两者放在一起才能看出端倪,不过媒质有种奇特的嗡鸣和振动感,而紫水晶没有。", + "hexcasting.page.lore.terabithia2.6": "也许在紫水晶上感受不到嗡鸣和振动只是因为身处地下所造成的压力。我唯一一次摸到紫水晶时手一直在抖,而且触感确实很轻盈,不过对我而言两者的触感并不完全一致。两者的折射率略有不同。$(br2)如果有机会在矿洞外碰见紫水晶,我一定要问下阿曼妮塔她能不能用紫水晶施咒。似乎每次我们碰面她都新学到了些奇妙的技艺。", + "hexcasting.page.lore.terabithia2.7": "就在上周,她不靠任何支撑物就把我悬到了空中!轻微的刺痛感,身体比空气还轻盈,但衣服又还是原本的重量……这种感觉非常奇怪。不过我确实很庆幸她在效果结束前把我拉到了床的正上方。$(br2)你亲爱的,$(br)泰瑞宾西娅·斯蒂勒斯", + + "hexcasting.entry.lore.terabithia3": "泰瑞宾西娅·斯蒂勒斯,#3,1/2", + "hexcasting.page.lore.terabithia3.1": "$(italic)完整标题:泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#3,第一部分/$$(br2)亲爱的爸爸,$(br)自从上次写信以来发生了两桩怪事。$(br2)第一件,负责管理入门等级咒法学联合会学生的教授失踪了。没人知道他去了哪里。他的办公室和住所都被锁上了,但里面还是那副乱糟糟的样子。", + "hexcasting.page.lore.terabithia3.2": "更奇怪的是,不管大图书馆的学生怎么激那帮冗杂官僚里管行政的人员,送去的信件都被一一打回。就连其他教授都不愿谈及他。$(br2)也正如你可能在想的,阿曼妮塔十分沮丧。不管大图书馆派来哪位教授接任,都不如原先的教授那样理解和愿意帮助初学者们。", + "hexcasting.page.lore.terabithia3.3": "但是,这还不是两件事里更怪的那件。这件事——我很希望之后不要再碰到比这还骇人的事了——发生在我和地质学联合会的又一次考察中,我们计划前去某个村庄附近考察。", + "hexcasting.page.lore.terabithia3.4": "通常去居民点附近考察时,我们要与村庄的村长或长老进行长时间的磋商,以确定我们的行为受到许可,并划定我们能去的地方和能做的事。但这次不一样,这次没有磋商。在出发的两天前我们才刚被告知这次我们要跟着咒法学联合会的一位学长去。", + "hexcasting.page.lore.terabithia3.5": "我们在村庄附近的密林中扎营,不知道为什么不选附近的平原。支帐篷的地方几乎没法看到村庄。在刚到那天的晚上我铺开睡袋时,周围是死一般的寂静。就算我们看不见村庄我们也应该能听到村庄里的声音。但是在地表呆着的整段时间里,我却几乎听不见半点声响。", + "hexcasting.page.lore.terabithia3.6": "我听到的为数不多的声音都像是劳作时会发出的那种,比如锤子砸到铁砧上的响声和锄头翻土的噪声。我完全没听到任何人说话。$(br2)第二天早晨我们就备好灯笼进入了地下。", + "hexcasting.page.lore.terabithia3.7": "我们没被告知我们到底要找什么,但有学生听说我们是来找紫水晶的,这貌似说得通。我已练出能在矿洞壁上发现任何一小点紫色闪光的能力,但就在灰色岩石和黑色板岩的交界处,我面前却出现了一座奇观。$(br2)那是一整个紫水晶晶洞,快有十个我那么高,里面随着灯光闪着紫色光芒,洞壁的每一面都被尖锐的紫色水晶覆盖。那些紫水晶比我来大图书馆之后整个探险组挖到的加起来还多。", + "hexcasting.page.lore.terabithia3.8": "我们每人被发了一副手套并被告知加紧开采。和我们同行的一位学长拿出了一个奇特的淡紫色盒子,高层人员会拿这种盒子来装东西,我和其他学生则兢兢业业地把那些玻璃质水晶从墙上砸下后放到盒子里去。外层脆性水晶的后方似乎有两种更为致密的构造。一种和外层水晶类似,但另一种更为……我词穷了。", + "hexcasting.page.lore.terabithia3.9": "“重要”这词也不合适,但这是我能想到的最贴切的形容了。它有一种特殊的……庄重感,就好像它上面的 X 形暗色深槽有某种神圣的意味。但由于某种理由,我们被严令禁止触摸它们。偶尔某名学生的镐子会不小心搞碎一块,那名学生就会被严厉责骂。尽管我全身心地投入繁复的开采工作,我还是感觉……格外的清醒。这种感受很混杂:我的思维非常清晰,但同时我感受到如果我放下手头工作去探究那种感受的话,可能就探究个没完了。", + "hexcasting.page.lore.terabithia3.10": "就好像每次吸气,我脑袋里就竖起一个路标,我能感受到它正坚定地为我指示正确的道路,然而实际上指向的却是一座陡崖。我甩了甩头又继续开采,这似乎对无视那些路标有点用处。$(br2)不过我成功偷藏了一小块水晶碎片。$(br2)我们采矿采了快一整天,到学长的时间计指示太阳快落山时我们几乎把剩下的水晶都挖完了。", + "hexcasting.page.lore.terabithia3.11": "就在我们要离开的时候,我又留意到先前禁止我们开采的那些水晶,它们暗色的深槽里似乎新出现了晶芽,就好像它们从中长出来了一样。我所知的地质学中有关水晶的所有知识都表明,这些水晶需要成千上万年才能长成,但仅在一天之内,新水晶就在我的眼前凭空出现了。我想学长们的开采禁令确实有道理,大概吧。", + "hexcasting.page.lore.terabithia3.12": "回到地表的路程中没发生什么事,我们也正好在太阳落山的时候回到了营地。非常抱歉,信纸快用完了。阿卡夏信笺只够写这些字但这故事值得两封信一起寄应该能同时到$(br2)你亲爱的,$(br)泰瑞宾西娅·斯蒂勒斯", + + "hexcasting.entry.lore.terabithia4": "泰瑞宾西娅·斯蒂勒斯,#3,2/2", + "hexcasting.page.lore.terabithia4.1": "$(italic)完整标题:泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#3,第二部分/$$(br2)亲爱的爸爸,$(br)正如我所说,信纸不够了,故事剩余部分就放在这份信里了。我们正好在太阳落山时回到了营地。而那天晚上的经历是整个奇怪考察中最为骇人的。", + "hexcasting.page.lore.terabithia4.2": "我半夜醒来想去方便一下。云层把月亮完全遮住了,我在森林中迷了路,找不回营地。但我又害怕夜晚的那些怪物,于是决定要去村庄里找个地方睡觉。至少那里是安全的。", + "hexcasting.page.lore.terabithia4.3": "村庄倒是很好找,尽管村庄里没有一点声音。就算这么晚了旅店不说人来人往也绝不会悄无声息。但从旅馆的门缝里看去,我却没能发现任何人的踪影。$(br2)我敲了敲一间房子的门,没有回应。再敲旁边的两间,也都没有回应,甚至感觉就像是房子一直空着一样。", + "hexcasting.page.lore.terabithia4.4": "我的心跳得越来越快,但又铆足勇气进下一间房里看看。我想不管房里住着什么人,他都会理解的。至少,能听见另一个人的声音就安心了,就算他们不让我在房里过夜起码也能安心。$(br2)房子很小,只够挤下一张床和一个制图台。我看见床上躺了人,就试着安慰我自己村子里的人不过是睡得很熟罢了。然后我转头就要离开。", + "hexcasting.page.lore.terabithia4.5": "但就在这时云层散开了,月光洒到了床上的生物上。$(br2)我忍不住叫了出来,它的眼睛也应声睁开。它……长得很怪异,很明显不是人类,反倒像是某种人类的退化产物。它的额头拔得很高,它的身体矮胖而笨拙,我想拿“它”这个字形容比较合适。我面前的那个生物明显没有人类的智慧,尽管它看起来像是人类。", + "hexcasting.page.lore.terabithia4.6": "它的视线直接对准了我——它的眼睛暗淡而了无智慧,就和绵羊的一样!它开了口,但发出的声音仅是对言语的无情亵渎——是一声令人颤栗的哼叫。", + "hexcasting.page.lore.terabithia4.7": "我落荒而逃。在月光的照耀下,我透过道旁的窗户瞥见了其他镇民,他们都已被扭曲到长得和我先前所见的那个$(italic)怪物/$一模一样。我迅速跑回森林里,一心只想逃离那些扭曲的脸孔和那恐怖的动物般的眼睛。$(br2)多亏月光,营地好找多了。不过好像没人注意到我失踪了一段时间,还好还好。我躺回了我的睡袋,整晚一直在想方设法忘记那段经历。", + "hexcasting.page.lore.terabithia4.8": "但从这封信里也能看出,我并没能忘掉。那个扭曲的身影仍萦绕在我的梦境里。我只要想到那东西曾经可能是个人类就脊背发凉。$(br2)回到大图书馆后,我就给阿曼妮塔看了偷带回来的水晶碎片。她肯定了我的猜想:这是一块媒质水晶。但她完全无法想象地下居然有满是这种水晶的巨大晶洞。", + "hexcasting.page.lore.terabithia4.9": "她还提到了某些有意思的事情:媒质水晶和真正的紫水晶都能用于制造先前我提过的特种玻璃。媒质水晶和紫水晶的晶体构造和物理性质几乎完全一致,而这和媒质的魔法性质没有关系,她是这么说的。$(br2)我最后没把遭遇满村怪物的经历告诉她。", + "hexcasting.page.lore.terabithia4.10": "我知道我们家生活拮据,也知道从家里送一封信过来有多贵,但我求你,求你能给我一句忠告。我自从那时起一直心慌意乱,能读到你的信就是莫大的安慰。$(br2)你亲爱的,$(br)泰瑞宾西娅·斯蒂勒斯", + + "hexcasting.entry.lore.terabithia5": "泰瑞宾西娅·斯蒂勒斯,#4", + "hexcasting.page.lore.terabithia5.1": "$(italic)完整标题:泰瑞宾西娅·斯蒂勒斯寄给她父亲的信,#4/$$(br2)阿曼妮塔消失了。$(br2)我完全不知道她去了哪里,爸爸。最后一次看到她是在晚饭时,她还在和其他人讨论学生失踪的情况,但那之后——", + "hexcasting.page.lore.terabithia5.2": "之后——之后她也不见了。但没人谈起她。我太害怕了,爸爸,他们是都知道些什么吗?每个人都会有个朋友突然$(italic)消失/$,消失得无影无踪。$(br2)他们都去$(italic)哪里/$了?", + "hexcasting.page.lore.terabithia5.3": "他们还一直在叫停设施和活动——我有好几周没和地质学联合会去考察了,穹顶上所有收集媒质的装置也不见了,药剂学联合会几个月没出现了……就好像大图书馆被白蚁啃到只剩了副空壳。$(br2)我觉得他们也开始审查我们写的信了……", + "hexcasting.page.lore.terabithia5.4": "写下这封信需要莫大的勇气,但我已没有勇气来和其他人说这件事。假如学院里没人能出去的话,我希望你能把消息传出去……把消息传到偏僻如布雷肯法尔的地方只是我的痴心妄想,但求求你了,爸爸,求求你尽你所能。爸爸,一定要记住他们……阿曼妮塔·黎博拉(Amanita Libera)、贾思敏·沃德(Jasmine Ward)、西奥多·查……(Theodore Cha...)求求你了,一定要记住他们……我把责任强加于你,只求你能原谅我的懦弱。", + "hexcasting.page.lore.terabithia5.5": "我写不了字了,手一直在抖,求你救救我们吧。", + + "hexcasting.entry.lore.inventory": "回收日志 #72", + "hexcasting.page.lore.inventory.1": "39 号牢房,回收日志 #72,监禁中心 β 座$(br2)囚犯名称:拉斐尔·巴尔$(br)罪行:知晓“毡障”计划$(br)牢房空置原因:死亡$(br)备注:牢房墙壁上大片区域涂写有如下文字。", + "hexcasting.page.lore.inventory.2": "我闭眼时能看见六边形。$(br2)那些图案,它们侵入我的眼睑、我的意识、我的梦境。我的意识在清醒和混乱中反复,就像挂在绳上摇晃的水晶,有时随光闪烁,有时被光吞噬。", + "hexcasting.page.lore.inventory.3": "我今天更清醒了。也许。我不知道。我都不知道我还算不算累。长时间的疲劳早已使我麻木,甚至有其他东西来刺我眼睛我都感觉不到了。我感受不到疲劳。但疲劳是真实的。$(br2)我的骨头是脆弱的。我的关节是粗糙尖锐的。", + "hexcasting.page.lore.inventory.4": "有时我能想起我来这的原因。我记得我对某些我所知的过于张扬了……我记得我在某间很亮的房间中被告知了些什么。我记得我的思维被凝成玻璃,被粉碎,被融化,又重新结晶,然后重复重复重复重复重复就像有人想让我忘记比那还糟是想让我活着同时杀死我,我的自我,我的 iota 没了意义因为没有观察者只有躯体但我瞒过了他们我居然做到了", + "hexcasting.page.lore.inventory.5": "他们觉得他们把我摧毁得能用毛毡盖眼哄骗我但我是清醒的清醒到能感到痛苦$(br2)我不睡觉但我醒来时我不敢把硬壳从我眼睛上搓掉不然会割破皮而且我不想看见紫色闪光", + "hexcasting.page.lore.inventory.6": "他们没杀我,因为我丈夫有我的核心,我死了他会知道。但他不是咒术师所以他没法凭他自己找到我。我走投无$(br2)思考很甬苦。真的很痛苦。思维是累赘而累赘被印在无数细小的水晶上", + "hexcasting.page.lore.inventory.7": "我记得那个明亮房间里的医生强迫我吸入某种类似沙子的东西,但更锐还非常痛。一开始只是黏膜试图吸住玻璃渣的物理性创伤但之后他们把指甲插到我的刺激反应里他们说几句话就能做到$(br2)我记得去露营时看到联合会成员围着一个村庄铺设法术环然后地面就开始振动", + "hexcasting.page.lore.inventory.8": "没了时间观念。有时我觉得我能看到未来,因为那些场景好像说得通但现在不可能发生因为我知道我余生就呆在这了因为亮房里的人这么说了。我能看到我整个人倒了过来我的颅骨裂成两半里面都是长矛样的淌着血的不是紫水晶的东西扎穿一块满是皱纹还幻想自己是蝴蝶的三磅重的脂肪和肉", + "hexcasting.page.lore.inventory.9": "我希望我的学生们还好。我为什么会这么想?累赘。他们告诉我我是累赘,他们不满足于摧毁我,他们还想让我觉得这是我应得的。不用棍棒摧毁身体,而以言语击垮精神。就算他们把我放出去也没人会信我因为我看起来就像一个沉溺于过度施法的瘾君子$(br2)但他们还是把我琐着我不知道这算不算仁慈", + "hexcasting.page.lore.inventory.10": "周围这么多媒质我试过好多次施法逃出去或是至少减轻痛苦但那些扫过我的意识的图案在我试着绘制时不停窃笑溶解。我似乎记得我被迫忘记它们,我记得卓伟的互相连接的知识体系被凿空并在刻意忽视的重压下碎裂但回忆起忘记你曾记得你学过的东西再痛苦不过", + "hexcasting.page.lore.inventory.11": "也许我已在过度施法依赖症的晚期中的晚期了,我听见图案裁进我眼睛和眼睑间的空间,我神经的紫色边缘。强迫自己相信什么是真实的和我没在受折磨有意义吗。我该受折磨。如果我再也不能和其他人谈这件事为什么还要尝试呢", + "hexcasting.page.lore.inventory.12": "他们要吧世界上所有人都杀了不是吗大图书馆要吃东西和我一……我上次乞东西是什么时候$(br2)所有人都要吃东西但他们做不到如果所有农夫都死了并且所有农耕知识都被埋到地底下去他们就做不到也许有人能发现真相并把那窝人沾沾自喜的破脸熔成蜡油", + "hexcasting.page.lore.inventory.13": "也许某天醒来会疑惑我们留给他们的冬西会疑惑为何地底有无数洞穴隧道但没人聪明到去开采$(br2)我能看见他们在读这些东西 。他们 …… 会不屑一顾", + + "hexcasting.entry.lore.experiment1": "“毡障”实例笔记", + "hexcasting.page.lore.experiment1.1": "$(italic)我只从这份日志中找到了如下五份记录。/$$(br2)质震 #26$(li)位置:北卡彭特镇$(li)人口:174$(li)形成节点数:3$(li)节点距质源距离:垂直距离 55-80 m,水平距离 85-156 m$(li)媒质生成速率:1320 uθ/min", + "hexcasting.page.lore.experiment1.2": "质震 #27$(li)位置:布雷肯法尔$(li)人口:79$(li)形成节点数:1$(li)节点距质源距离:垂直距离 95 m,水平距离 67 m$(li)媒质生成速率:412 uθ/min", + "hexcasting.page.lore.experiment1.3": "质震 #28$(li)位置:格雷斯顿$(li)人口:大约 1000$(li)形成节点数:18$(li)节点距质源距离:垂直距离 47-110 m,水平距离 59-289 m$(li)媒质生成速率:8478 uθ/min", + "hexcasting.page.lore.experiment1.4": "质震 #29$(li)位置:无名村庄,格雷斯顿以西两天路程$(li)人口:35$(li)形成节点数:0$(li)节点距质源距离:N/A$(li)媒质生成速率:N/A$(br2)注:居民仍以正常形式被影响", + "hexcasting.page.lore.experiment1.5": "质震 #30$(li)位置:沸溪镇$(li)人口:231$(li)形成节点数:4$(li)节点距质源距离:垂直距离 61-89 m,水平距离 78-191 m$(li)媒质生成速率:1862 uθ/min", + "hexcasting.page.lore.experiment1.6": "总结:一个节点需要大约 60 个。数量过少时其仍将被消耗,但不会生成足以形成节点的能量。输入个数与垂直水平距离之间相关性很小。$(br2)对群体居民的影响效果(身体机能尤甚)仍比单目标测试时的强,一如往常。", + + "hexcasting.entry.lore.experiment2": "“毡障”采访日志", + "hexcasting.page.lore.experiment2.1": "$(italic)这些文件中许多内容都已被编辑。剩余可读文本如下。/$$(br2)对象 #1 “A.E.”$(br)执行程序后立刻停止挣扎。面部与四肢松弛,但可不受协助站立。当不受看管时,对象会出神地做其先前职业(场地管理员)中常做的动作。", + "hexcasting.page.lore.experiment2.2": "实验程序执行后较短时间内心率极高,但由于对象在此之前处于极度恐慌状态,该现象是非决定性的。所得晶芽生成速率为 35 uθ/min。$(br)……$(br)对象 #4 “P.I.”$(br)对 P.I. 进行心理测试。对象理解物体恒存性,具有空间感知力,有基础数学逻辑推理能力。难以完成全新任务。$(br2)……", + "hexcasting.page.lore.experiment2.3": "对象 #7 “T.C.”$(br)对象同意对其执行程序。程序执行几小时后结果与其他对象类似:能站立,能执行简单任务。$(br2)……$(br2)对象 #11 “R.S.”$(br)执行程序前接受镇定,其剂量控制为能使对象在执行程序时醒来……$(br2)……", + "hexcasting.page.lore.experiment2.4": "对象 #23 “A.L.”$(br)相较其他对象,其保有更强的语言能力。在几小时内,其语言能力退化至只能组织混乱的句子,而后则至仅能说出“泰瑞”一个词。$(br2)待进一步测试:实验程序分别如何影响咒术师和非咒术师?$(br2)……", + + "hexcasting.entry.interop": "模组联动", + "hexcasting.entry.interop.desc": "好像我装了某些能和咒法学联动的模组!详情如下。", + "hexcasting.page.interop.1": "$(hex)咒法学/$是一门多用途的学问。如果世界能被某些其他力量$(italic)改变/$,那么有可能$(hex)咒法学/$可以和它们和谐相处,协同使用。", + "hexcasting.page.interop.2": "应当谨记,自然似乎在这些方面耗费的精力较少,可能会出现奇怪的现象和漏洞。我相信模组制作者们会尽他们所能来纠正这些错误,但也必须理解这只是他们的业余爱好。$(br2)也许我会发现某些协同力量带来的法术在平衡性上表现不佳。我想我应该有足够的自控力不去滥用。", + "hexcasting.page.interop.3": "最后,如果对剧情和故事感兴趣,就应理解试验这些协同力量时所做的笔记只会是些琐事。", + + "hexcasting.entry.interop.gravity": "Gravity Changer", + "hexcasting.page.interop.gravity.1": "我发现了获取与改变实体所受引力的操作。挺有趣,也挺让人头晕。$(br2)有趣的是,虽然$(l:patterns/great_spells/flight)$(action)飞行/$是一种卓越法术,且也能操控引力,但这些法术似乎不是这样操控的。我不能理解……也许模组制作者们只是想让玩家们玩得开心。", + "hexcasting.page.interop.gravity.get": "获取所给实体的所受引力的主方向上的单位向量。对大多数实体而言,此向量会是向下的:<0, -1, 0>。", + "hexcasting.page.interop.gravity.set": "设置所给实体所受引力的主方向。所给向量会被转换为与其夹角最小的轴向单位向量,如同$(l:patterns/math#hexcasting:coerce_axial)$(action)轴向之纯化/$那样。消耗大约 1 个$(l:items/amethyst)$(item)充能紫水晶/$。", + + "hexcasting.entry.interop.pehkui": "Pehkui", + "hexcasting.page.interop.pehkui.1": "我发现了改变实体大小,和得知它们相较原本究竟变了多少的方法。", + "hexcasting.page.interop.pehkui.get": "获取实体的大小倍数,也即当前大小和原本大小的比值。对大多数实体而言,此值为 1。", + "hexcasting.page.interop.pehkui.set": "设置实体的大小倍数,需传入一个与其原本大小的比值。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶碎片/$。" +} diff --git a/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json b/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json index 5b6c40af..6df092ec 100644 --- a/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json +++ b/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json @@ -12,6 +12,8 @@ "macros": { "$(thing)": "$(#8d6acc)", "$(action)": "$(#fc77be)", + "$(media)": "$(#74b3f2)", + "$(hex)": "$(#b38ef3)", "_Media": "$(#74b3f2)Media/$", "_media": "$(#74b3f2)media/$", "_Hexcasters": "$(#b38ef3)Hexcasters/$", diff --git a/Fabric/build.gradle b/Fabric/build.gradle index 84433481..9ee65819 100644 --- a/Fabric/build.gradle +++ b/Fabric/build.gradle @@ -47,6 +47,17 @@ repositories { name = "TerraformersMC" url = "https://maven.terraformersmc.com/releases/" } + exclusiveContent { + forRepository { + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + } + } + filter { + includeGroup "maven.modrinth" + } + } } dependencies { @@ -97,6 +108,12 @@ dependencies { // We can't figure out what it is // so i'm just including a fresher version modImplementation("com.terraformersmc:modmenu:4.1.0") + + // i am speed + // sodium is causing frustum mixin errors so don't use it +// modImplementation "maven.modrinth:sodium:${sodiumVersion}" + modImplementation "maven.modrinth:lithium:${lithiumVersion}" + modImplementation "maven.modrinth:phosphor:${phosphorVersion}" } tasks.withType(JavaCompile) { diff --git a/Fabric/gradle.properties b/Fabric/gradle.properties index 690a5437..09ad6fbf 100644 --- a/Fabric/gradle.properties +++ b/Fabric/gradle.properties @@ -11,3 +11,8 @@ emiVersion=0.4.0+1.19 gravityApiVersion=0.7.12+fabric clothConfigVersion=8.2.88 trinketsVersion=3.4.0 + +# Optimizations +sodiumVersion=mc1.19.2-0.4.4 +lithiumVersion=mc1.19.2-0.10.2 +phosphorVersion=mc1.19.x-0.8.1 diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCHarness.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCHarness.java index c811bee0..083246d0 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCHarness.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCHarness.java @@ -19,7 +19,7 @@ public class CCHarness implements Component { } public CastingHarness getHarness(InteractionHand hand) { - var ctx = new CastingContext(this.owner, hand); + var ctx = new CastingContext(this.owner, hand, CastingContext.CastSource.STAFF); if (this.lazyLoadedTag.isEmpty()) { return new CastingHarness(ctx); } else { diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java index f6d87421..0d5d251b 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java @@ -424,7 +424,8 @@ public class FabricXplatImpl implements IXplatAbstractions { @Override public boolean isBreakingAllowed(Level world, BlockPos pos, BlockState state, Player player) { - return PlayerBlockBreakEvents.BEFORE.invoker().beforeBlockBreak(world, player, pos, state, world.getBlockEntity(pos)); + return PlayerBlockBreakEvents.BEFORE.invoker() + .beforeBlockBreak(world, player, pos, state, world.getBlockEntity(pos)); } @Override diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java index bdc44e81..214e98e2 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java @@ -232,7 +232,8 @@ public class ForgeXplatImpl implements IXplatAbstractions { @Override public CastingHarness getHarness(ServerPlayer player, InteractionHand hand) { - var ctx = new CastingContext(player, hand); + // This is always from a staff because we don't need to load the harness when casting from item + var ctx = new CastingContext(player, hand, CastingContext.CastSource.STAFF); return CastingHarness.fromNBT(player.getPersistentData().getCompound(TAG_HARNESS), ctx); } diff --git a/gradle.properties b/gradle.properties index 12aaed13..bb222251 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ jetbrainsAnnotationsVersion=23.0.0 minecraftVersion=1.19.2 kotlinVersion=1.7.20 -modVersion=1.0 +modVersion=0.10.0 paucalVersion=0.5.0 patchouliVersion=77