diff --git a/projects/1.20-fabric/assets/1UNKNOWN/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/nbt.json b/projects/1.20-fabric/assets/1UNKNOWN/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/nbt.json
deleted file mode 100644
index 994547e82d04..000000000000
--- a/projects/1.20-fabric/assets/1UNKNOWN/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/nbt.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "Nature's Records",
- "category": "hexcasting:patterns",
- "icon": "minecraft:glow_ink_sac",
- "advancement": "hexcasting:enlightenment",
- "pages": [
- "So many things... Chest items? Tools breaking? Did I leave iron in my pack? Or was it beef?
How does Nature $(o)remember/$?
There’s... there $(l)must/$ be a $(o)structure/$ to it.
And if there is—
then I can $(o)shatter/$ it.
$(l)Nature will kneel. It must kneel./$"
- ]
-}
diff --git a/projects/1.20-fabric/assets/1UNKNOWN/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/nbt.json b/projects/1.20-fabric/assets/1UNKNOWN/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/nbt.json
deleted file mode 100644
index f744e32acf35..000000000000
--- a/projects/1.20-fabric/assets/1UNKNOWN/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/nbt.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "自然的记录",
- "category": "hexcasting:patterns",
- "icon": "minecraft:glow_ink_sac",
- "advancement": "hexcasting:enlightenment",
- "pages": [
- "信息太多了……箱子里的物品?工具有没有坏?我的包里是不是还有几锭铁?还是说留了几块牛肉?
自然到底是怎么$(o)记住/$的?
这些信息肯定……$(l)肯定/$有其$(o)结构/$。
要是真的有——
我就能$(o)打破/$它。
$(l)自然将臣服。它必然臣服。/$"
- ]
-}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/lists2.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/lists2.json
new file mode 100644
index 000000000000..99d3d82fe7c2
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/lists2.json
@@ -0,0 +1,99 @@
+{
+ "name": "Advanced Lists",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:birch_sign",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "These patterns seem to represent common operations I perform on lists. Though these are perfectly possible to do with normal $(l:patterns/lists)List Manipulation/$, it often requires more effort. Perhaps Nature willed them into existence to better understand what I'm doing... or perhaps they are my own invention?",
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:rotate",
+ "anchor": "hexic:rotate",
+ "input": "[a], int",
+ "output": "[a]",
+ "text": "Rotates the list leftward: an argument of 1 moves the first item of the list to the end. Negative numbers allow rotating the list rightward."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:take",
+ "anchor": "hexic:take/count",
+ "input": "[a], int",
+ "output": "[a]",
+ "text": "Selects the first few elements from the input list. If the number is negative, selects the last few elements instead."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:drop",
+ "anchor": "hexic:drop/count",
+ "input": "[a], int",
+ "output": "[a]",
+ "text": "Drops the first few elements from the input list; the dual to $(l:addon/hexic/lists2#hexic:take/count)$(action)Retention Distillation/$."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:take",
+ "anchor": "hexic:take/list",
+ "input": "[a], [int]",
+ "output": "[a]",
+ "text": "Selects from the list only elements corresponding to the given indices. Unlike $(l:patterns/lists#hexcasting:index)$(action)Selection Distillation/$, this cannot reorder or duplicate iotas."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:drop",
+ "anchor": "hexic:drop/list",
+ "input": "[a], [int]",
+ "output": "[a]",
+ "text": "Drops from the list iotas at the given indices. All other iotas are kept in the same order as the input."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:where",
+ "anchor": "hexic:where/bool",
+ "input": "[bool]",
+ "output": "[int]",
+ "text": "Creates a list of the indices for which True is present. For example, [True, False, True] becomes [0, 2]. I can also mix bools and ints in the input list."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:where",
+ "anchor": "hexic:where/num",
+ "input": "[num]",
+ "output": "[int]",
+ "text": "Adds each index to the list based on the value. For example, [1, 2, 3] becomes [0, 1, 1, 2, 2, 2]. Zero or negative numbers do not appear at all."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "header": "Exterior Distillation",
+ "op_id": "hexcasting:mul",
+ "anchor": "hexcasting:mul",
+ "input": "[a], [b]",
+ "output": "[[a, b]]",
+ "text": "Calculates the outer product of two lists. The resulting list has an entry for every possible pairing between the input lists."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "header": "Interior Distillation",
+ "op_id": "hexcasting:div",
+ "anchor": "hexcasting:div",
+ "input": "[a], [b]",
+ "output": "[[a, b]]",
+ "text": "Calculates the inner product of two lists. If the two lists were arranged side-by-side, the resulting list has one entry for every row (unpaired elements are skipped)."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:extract",
+ "anchor": "hexic:extract",
+ "input": "[a], int",
+ "output": "[a], [a], a",
+ "text": "Extracts an iota from the given list, and breaks the list apart around it. Returns all items before the iota, all items after the iota, and finally the iota itself."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:grep",
+ "anchor": "hexic:grep",
+ "input": "[a], [a → bool]",
+ "output": "[a]",
+ "text": "Discards iotas from the given list unless they satisfy the given predicate. Using $(l:patterns/meta#hexcasting:halt)$(action)Charon's Gambit/$ discards the current and all remaining iotas."
+ }
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/media_bundle.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/media_bundle.json
new file mode 100644
index 000000000000..0979edbf81b5
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/media_bundle.json
@@ -0,0 +1,16 @@
+
+{
+ "name": "Media Pouches",
+ "category": "hexcasting:items",
+ "icon": "hexic:small_preferred_bundle",
+ "sortnum": 1,
+ "pages": [
+ "Though a $(l:items/phials)$(item)Phial/$ is my ultimate goal for _media storage, knitting a pouch out of $(l:addon/hexic/mediaweave)$(item)mediaweave/$ may help me manage my amethyst better. Only a few cloths are needed to give me some decent capacity. Each pouch holds six slots, and I can extend their capacity to twelve with a bit more weave. A small pouch may go within a large pouch, but neither size can be placed within itself.",
+ "Upon Nature's request for _media, my pouches will offer themselves and their contents first of all; similarly, if I attempt to $(l:patterns/spells/hexcasting#hexcasting:recharge)$(action)Recharge/$ a pouch, the inserted _media will form a 'cloud' of sorts inside, which will settle into any $(l:items/hexcasting)$(item)trinket/$ or similar within.",
+ {
+ "type": "patchouli:text",
+ "advancement": "hexcasting:enlightenment",
+ "text": "Something strange about these pouches I have noticed. I can feel the _media $(o)hesitant/$— $(o)resistant/$, even— to leave the pouch. Only the media Nature— no, I— ask for is pulled from the pouch. As amethyst shatters inside, I feel the leftover _media bouncing, ping-ponging, $(o)trapped/$ in the walls until it evaporates. A battery within— my beloved $(l:items/phials)$(item)Phial/$, or an $(l:items/hexcasting)$(item)Artifact/$ of mine, could grab bits of this cloud, with none of the costs $(l:patterns/spells/hexcasting#hexcasting:recharge)$(action)directing the clouds myself/$ incurs."
+ }
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/mediaweave.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/mediaweave.json
new file mode 100644
index 000000000000..b18a138be653
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/mediaweave.json
@@ -0,0 +1,9 @@
+{
+ "name": "Mediaweave",
+ "category": "hexcasting:items",
+ "icon": "hexic:preferred_mediaweave",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "A perversion of $(l:hexcasting:patterns/spells/blockworks#hexcasting:edify)$(action)Edify Sapling/$ lets me knit a fabric out of wool and _media. It acts similar to a $(l:hexcasting:items/thought_knot)$(item)Thought-Knot/$, but can only hold _Hexes — standard iotas fizzle instead of embedding themselves in the fabric. Additionally, the weave, radiating with raw energy, can passively exert force on nearby _media, with no mind involved — nothing as powerful as a _Hex, but still useful nonetheless."
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/nbt.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/nbt.json
new file mode 100644
index 000000000000..3271904a1328
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/nbt.json
@@ -0,0 +1,58 @@
+{
+ "name": "Nature's Records",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:glow_ink_sac",
+ "advancement": "hexcasting:enlightenment",
+ "pages": [
+ "My studies have led me to understand the fabric undermining every facet of this world. Nature's memory manifests itself as a recursive structure of 'tags' of several types. I've documented these over the next few pages. Though many types of tag appear to be redundant with each other, I must keep in mind that they are not freely interchangeable — and since I am dealing directly with Nature's memories, such a mistake could be worse than fatal.",
+ "If everything in the world is merely reduced to a tag... what am I? Is my entire existence reducible to a pile of bytes? At least this gives me some comfort, knowing that the villagers I've sacrificed in my journey truly had no life of their own... what about mine? What am I? Were the words I am writing in this very book, just a manifestation of random ones and zeroes?$(2br)I best not ponder too much. Though I may pry into everything I wish in detail, doing so would suck the joy from this illusion.",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/lift1",
+ "op_id": "hexic:nbt/lift1",
+ "input": "number",
+ "output": "nbt",
+ "text": "Converts a number into a Byte tag: an integer between -128 and 127, inclusive."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/lift2",
+ "op_id": "hexic:nbt/lift2",
+ "input": "number",
+ "output": "nbt",
+ "text": "Converts a number into a Short tag, between -65536 and 65535."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/lift4",
+ "op_id": "hexic:nbt/lift4",
+ "input": "number",
+ "output": "nbt",
+ "text": "Converts a number into an Int tag, between roughly negative 2 billion and positive 2 billion."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/lift8",
+ "op_id": "hexic:nbt/lift8",
+ "input": "number",
+ "output": "nbt",
+ "text": "Converts a number into a Long tag: bounded to 9 quintillion, which I will likely never reach."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/liftd",
+ "op_id": "hexic:nbt/liftd",
+ "input": "number",
+ "output": "nbt",
+ "text": "Converts a number into a Double tag. Oddly, doubles seem to perfectly correspond to my knowledge of numbers, plus the ability to represent infinities and non-numbers."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/liftf",
+ "op_id": "hexic:nbt/liftf",
+ "input": "number",
+ "output": "nbt",
+ "text": "Converts a number into a Float tag. These seem similar to Doubles, albeit with less precision."
+ }
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/no.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/no.json
new file mode 100644
index 000000000000..b55112296580
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/no.json
@@ -0,0 +1,17 @@
+{
+ "name": "Nature's Revenge",
+ "advancement": "hexcasting:enlightenment",
+ "category": "hexcasting:patterns",
+ "icon": "arrow",
+ "pages": [
+ "No. No. No. I— I thought Horrible was bad— etched into every waking moment— no— no— it hurts— must draw— can't draw— what have I done— why must Nature be like this— ",
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:whatthefuck",
+ "anchor": "hexic:whatthefuck",
+ "input": "???",
+ "output": "???",
+ "text": "How could one even begin to draw this?"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/pen.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/pen.json
new file mode 100644
index 000000000000..abed241e06e3
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/pen.json
@@ -0,0 +1,9 @@
+{
+ "name": "Crystal Pens",
+ "icon": "hexic:preferred_pen",
+ "advancement": "hexcasting:root",
+ "category": "hexcasting:items",
+ "pages": [
+ "A pen made of amethyst allows me to sketch patterns in midair as input to my spells. Though I use my pen like a normal staff, patterns I draw with it are merely stored in an internal list rather than executed."
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/shard.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/shard.json
new file mode 100644
index 000000000000..22127f31fe36
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/shard.json
@@ -0,0 +1,10 @@
+{
+ "name": "Echo Shards",
+ "category": "hexcasting:items",
+ "icon": "minecraft:echo_shard",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "Ever since acquiring a few $(item)Echo Shards/$ from one of those ancient cities, my _Hexes have felt... restrained in a way, as if the shards were trying to absorb them. Holding a shard in my other hand would let it do so, and would let me release all of the patterns I've drawn at once.",
+ "This behavior seems rather useful for quickly casting prepared spells. For example, if I let my shard absorb a simple raycast Hex, I could release it all-at-once against an entity rather than having to catch it off-guard standing still. Patterns released from an $(item)Echo Shard/$ are cast against my staff stack, letting me use the newly-found entity by hand."
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/staffcast.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/staffcast.json
new file mode 100644
index 000000000000..20f43061f0ca
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/staffcast.json
@@ -0,0 +1,25 @@
+{
+ "name": "Staffcasting Patterns",
+ "category": "hexcasting:patterns",
+ "icon": "hexcasting:staff/mindsplice",
+ "pages": [
+ "These patterns force me to cast a _Hex as if I drew it by hand. There are two variants of this pattern: the Greater version keeps the stack from the outside, while the Lesser version uses my staff's stack. My ravenmind is preserved in both cases.",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:staffcast_factory",
+ "op_id": "hexic:staffcast_factory",
+ "input": "∀αβ. α, [α → β]",
+ "output": "β",
+ "text": "Coerces my staff to cast a _Hex. The hex uses the stack of the outer casting environment."
+ },
+ "Something's odd about how these patterns are named. I can simulate the Greater variant with merely a wrapper around the Lesser variant, but accessing the staff's stack itself is impossible with purely Greater. Does this not make Lesser strictly more powerful than Greater?",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:staffcast_factory/lazy",
+ "op_id": "hexic:staffcast_factory/lazy",
+ "input": "[? → ?]",
+ "output": "",
+ "text": "Coerces my staff to cast a _Hex. The hex uses the stack of the staff itself, but keeps the outer environment's ravenmind."
+ }
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/stringworms.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/stringworms.json
new file mode 100644
index 000000000000..1646daa2ec08
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexic/stringworms.json
@@ -0,0 +1,9 @@
+{
+ "name": "Stringworms",
+ "category": "hexcasting:items",
+ "advancement": "hexcasting:root",
+ "icon": "hexic:preferred_stringworm",
+ "pages": [
+ "A strange object I've discovered, stringworms are worm imitations made from fuzz. I'd imagine some people would have fun playing with them, but they have no use in my studies."
+ ]
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexxytongue/greater_reveal.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexxytongue/greater_reveal.json
new file mode 100644
index 000000000000..411d38f064f5
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/hexxytongue/greater_reveal.json
@@ -0,0 +1,18 @@
+{
+ "name": "Greater Reveal",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:bell",
+ "pages": [
+ "Though my _Hexes can use $(l:hexcasting:patterns/basics#hexcasting:print)$(action)Reveal/$ to transmit information to my mind, the resulting message is ephemeral — unless I stand still and reflect on what I've heard recently, it will slip away like anything else someone says. Additionally, constantly hammering my mind with iotas distracts me from more important things.",
+ "Thus, I've devised a new pattern of my own. It's similar to $(l:hexcasting:patterns/basics#hexcasting:print)$(action)Reveal/$, but the message is lodged well within my mind, and I forget it instantly if I replace it with something else. It can also take a list of messages, for convenience.",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexxytounge:reveal",
+ "op_id": "hexxytounge:reveal",
+ "input": "[iota] | iota",
+ "output": "",
+ "text": "Takes a list of iotas (or a single non-iota, which is treated as a list with one element) and embeds them in my mind persistently. Displayed iotas survive all methods that would clear a normal Reveal, and can only be cleared by another casting of Greater Reveal or my untimely demise."
+ },
+ "$(o)To be a Hexcaster is to glimpse a truth that might best be hidden./$"
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/phlib/maps.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/phlib/maps.json
new file mode 100644
index 000000000000..84fba50e30d4
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/phlib/maps.json
@@ -0,0 +1,65 @@
+{
+ "name": "Maps",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:filled_map",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "Maps are an efficient structure holding pairings of some iota to some other iota. While this is perfectly possible using merely list operations, dedicated map iotas use some arcane substance called a '$(thing)Hash/$'. While this doesn't reduce the $(o)operations/$ required to access a map, it desperately reduces the load on Nature, nearing O(1) for most access.",
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "phlib:empty_map",
+ "anchor": "phlib:empty_map",
+ "input": "",
+ "output": "map<⊥, ⊥>",
+ "text": "Creates a new empty map for my usage."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:add",
+ "anchor": "hexcasting:add",
+ "input": "map, map",
+ "output": "map",
+ "text": "Merges two maps together. Maps cannot have duplicate items: any entry in the latter map will override that in the first map."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:sub",
+ "anchor": "hexcasting:sub",
+ "input": "map, map",
+ "output": "map",
+ "text": "Removes every entry in the first map that is found in the second map. The values in the second map are ignored."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:index",
+ "anchor": "hexcasting:index",
+ "input": "map, k",
+ "output": "v?",
+ "text": "Disintegrates the map, returning only the value associated with the given key. O(1), unlike scanning a list."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:unappend",
+ "anchor": "hexcasting:unappend",
+ "input": "map",
+ "output": "map, (k, v)?",
+ "text": "Shaves off one element of a map. Which element gets shaved off is undefined and subject to Nature's whims. If used on an empty map, returns two nulls."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:replace",
+ "anchor": "hexcasting:replace",
+ "input": "map, k, v",
+ "output": "map",
+ "text": "Replaces the element associated with $(n)k/$ with $(n)v/$. If $(n)k/$ is not present in the map, the entry is created."
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:remove_from",
+ "anchor": "hexcasting:remove_from",
+ "input": "map, k",
+ "output": "map",
+ "text": "Throws out the map's association for the given key. If there is no matching association, the map is returned unchanged."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/lists2.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/lists2.json
new file mode 100644
index 000000000000..f6a13dc3b488
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/lists2.json
@@ -0,0 +1,99 @@
+{
+ "name": "高阶列表",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:birch_sign",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "这些图案似乎对应着我常对列表执行的操作。虽然说它们的功能可以用普通的$(l:patterns/lists)列表操作/$实现,但一般会更加麻烦。可能是自然为了理解我做的事而创造了它们……还是我自己发明了它们?",
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:rotate",
+ "anchor": "hexic:rotate",
+ "input": "[a], int",
+ "output": "[a]",
+ "text": "向左旋转列表:参数为 1 时,首个列表元素会移动到末尾。负数参数会向右旋转列表。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:take",
+ "anchor": "hexic:take/count",
+ "input": "[a], int",
+ "output": "[a]",
+ "text": "选出所给列表开头的若干元素。负数参数则选出末尾的若干元素。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:drop",
+ "anchor": "hexic:drop/count",
+ "input": "[a], int",
+ "output": "[a]",
+ "text": "删去列表开头的若干元素;它是$(l:addon/hexic/lists2#hexic:take/count)$(action)维持之馏化/$的对偶。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:take",
+ "anchor": "hexic:take/list",
+ "input": "[a], [int]",
+ "output": "[a]",
+ "text": "从列表中选出所给下标对应的元素。和$(l:patterns/lists#hexcasting:index)$(action)选择之馏化/$不同的是,此图案无法重排或复制 iota。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:drop",
+ "anchor": "hexic:drop/list",
+ "input": "[a], [int]",
+ "output": "[a]",
+ "text": "删去列表中所给下标的元素。其他 iota 的顺序不变。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:where",
+ "anchor": "hexic:where/bool",
+ "input": "[bool]",
+ "output": "[int]",
+ "text": "将输入中 True 所处位置的下标组为列表返回。例如,[True, False, True] 会变为 [0, 2]。输入列表中允许混用布尔值和整数。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:where",
+ "anchor": "hexic:where/num",
+ "input": "[num]",
+ "output": "[int]",
+ "text": "根据数值将各下标组为列表返回。例如,[1, 2, 3] 会变为 [0, 1, 1, 2, 2, 2]。0 和负数处的下标不会在返回值中出现。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "header": "外积之馏化",
+ "op_id": "hexcasting:mul",
+ "anchor": "hexcasting:mul",
+ "input": "[a], [b]",
+ "output": "[[a, b]]",
+ "text": "计算两列表的外积。即在两输入列表各取一个元素,将所有可能的值对组为列表返回。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "header": "内积之馏化",
+ "op_id": "hexcasting:div",
+ "anchor": "hexcasting:div",
+ "input": "[a], [b]",
+ "output": "[[a, b]]",
+ "text": "计算两列表的内积。即纵向排布两列表的元素,而后相邻排列两列表,将每行的元素对组为列表返回(跳过未配对的元素)。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:extract",
+ "anchor": "hexic:extract",
+ "input": "[a], int",
+ "output": "[a], [a], a",
+ "text": "从所给列表中取出 iota,并在该位置分割列表。返回指定 iota 左侧的所有元素,而后返回其右侧的所有元素,最后返回该 iota。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:grep",
+ "anchor": "hexic:grep",
+ "input": "[a], [a → bool]",
+ "output": "[a]",
+ "text": "从所给列表中移除不满足所给谓词的 iota。使用$(l:patterns/meta#hexcasting:halt)$(action)卡戎之策略/$会清除当前 iota 和后续所有 iota。"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/media_bundle.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/media_bundle.json
new file mode 100644
index 000000000000..22ff4f4f69ea
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/media_bundle.json
@@ -0,0 +1,16 @@
+
+{
+ "name": "媒质口袋",
+ "category": "hexcasting:items",
+ "icon": "hexic:small_preferred_bundle",
+ "sortnum": 1,
+ "pages": [
+ "$(l:items/phials)$(item)媒质之瓶/$是我在$(media)媒质/$存储研究上的终极目标,不过,用$(l:addon/hexic/mediaweave)$(item)媒质布匹/$编织出的口袋也可以协助我管理紫水晶。要的布匹数量不多,造出的口袋容量却不小。每个口袋都有六个槽位,再花少量布匹可以扩充到十二个。小号口袋可以放在大号口袋里面,但两者都不接受同尺寸的口袋。",
+ "在自然要求支付$(media)媒质/$时,口袋的内容物会优先消耗。与之类似,对口袋$(l:patterns/spells/hexcasting#hexcasting:recharge)$(action)重新充能/$时,充入的$(media)媒质/$会在口袋内形成某种“云”,而后就将凝集在口袋内的任意$(l:items/hexcasting)$(item)缀品/$及其类似物。",
+ {
+ "type": "patchouli:text",
+ "advancement": "hexcasting:enlightenment",
+ "text": "我注意到这些口袋有个怪性质。我能感受到,$(media)媒质/$$(o)不愿意/$,甚至是$(o)抗拒/$离开口袋。只有自然——不对,我——支取的媒质会离开。随着其中紫水晶的破碎,我能感受到残余的$(media)媒质/$在口袋中回弹、反弹,可以说是$(o)困在/$了口袋中,直到最终蒸发消散。口袋中的储库——我最爱的$(l:items/phials)$(item)媒质之瓶/$,或是$(l:items/hexcasting)$(item)造物/$——会自发吸引媒质云,$(l:patterns/spells/hexcasting#hexcasting:recharge)$(action)我亲自指引媒质云/$也因此不会产生消耗。"
+ }
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/mediaweave.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/mediaweave.json
new file mode 100644
index 000000000000..c070a5ae947d
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/mediaweave.json
@@ -0,0 +1,9 @@
+{
+ "name": "媒质布匹",
+ "category": "hexcasting:items",
+ "icon": "hexic:preferred_mediaweave",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "我化用了$(l:hexcasting:patterns/spells/blockworks#hexcasting:edify)$(action)启迪树苗/$,将羊毛和$(media)媒质/$编织成了布匹。它的行为与$(l:hexcasting:items/thought_knot)$(item)结念绳/$类似,但它只接受$(hex)咒术/$;其他的 iota 不会融入布匹而是会消散。此外,这块布匹还散发着能量,能常态向周围的$(media)媒质/$施加力,无需意识参与。没有比传统的$(hex)咒术/$强到哪里去,却依然很有用。"
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/nbt.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/nbt.json
new file mode 100644
index 000000000000..109ca36241aa
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/nbt.json
@@ -0,0 +1,58 @@
+{
+ "name": "自然的记录",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:glow_ink_sac",
+ "advancement": "hexcasting:enlightenment",
+ "pages": [
+ "我的研究向我揭示了这个世界中现实之纤维的方方面面。自然的记录表现为多个类型的“标签”构成的递归式结构。我在后面几页记述了它们。虽然有些类型在其他类型面前像是冗余,我也必须时刻小心,要记住它们不可随意互换。而因为我操纵的是自然的记录本身,犯下的错可能会远超所谓“致命”的范畴。",
+ "如果万事万物都能简化成标签……那我是什么?我的存在难道也能简化成一堆数据?不过这起码让我安了心,我先前牺牲的所有村民本质上没有它们自己的生命……那我呢?我是什么?我现在在这本书上写下的字,难道只是一串零和一?$(2br)我最好别想得太多。我能随意操控万事万物的所有侧面,想太多只会让这种能力变得无趣。",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/lift1",
+ "op_id": "hexic:nbt/lift1",
+ "input": "number",
+ "output": "nbt",
+ "text": "将数转变成字节标签:在 -128 到 127 之间(两端闭)的整数。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/lift2",
+ "op_id": "hexic:nbt/lift2",
+ "input": "number",
+ "output": "nbt",
+ "text": "将数转变成短整型标签:在 -65536 到 65535 之间。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/lift4",
+ "op_id": "hexic:nbt/lift4",
+ "input": "number",
+ "output": "nbt",
+ "text": "将数转变成整型标签:在大约负 20 亿到正 20 亿之间。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/lift8",
+ "op_id": "hexic:nbt/lift8",
+ "input": "number",
+ "output": "nbt",
+ "text": "将数转变成长整型标签:范围约是 900 京,大概率永远都超不出去。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/liftd",
+ "op_id": "hexic:nbt/liftd",
+ "input": "number",
+ "output": "nbt",
+ "text": "将数转变为双精度浮点型标签。奇怪的是,双精度浮点型似乎和我对数的认知完全一致,而且还有表示无限和非数的能力。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:nbt/liftf",
+ "op_id": "hexic:nbt/liftf",
+ "input": "number",
+ "output": "nbt",
+ "text": "将数转变为单精度浮点型标签。它们和双精度浮点型很相似,但其精度较低。"
+ }
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/no.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/no.json
new file mode 100644
index 000000000000..9115c93b8e43
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/no.json
@@ -0,0 +1,17 @@
+{
+ "name": "自然的复仇",
+ "advancement": "hexcasting:enlightenment",
+ "category": "hexcasting:patterns",
+ "icon": "arrow",
+ "pages": [
+ "不、不、不。我——我还觉得“可怕的东西”已经够糟了——没法从意识中消除——不——不——好痛——必须绘制——画不出来——我都做了什么——自然为什么要这样——",
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexic:whatthefuck",
+ "anchor": "hexic:whatthefuck",
+ "input": "???",
+ "output": "???",
+ "text": "到底要怎么画啊?"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/pen.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/pen.json
new file mode 100644
index 000000000000..a91624d1b714
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/pen.json
@@ -0,0 +1,9 @@
+{
+ "name": "咒笔",
+ "icon": "hexic:preferred_pen",
+ "advancement": "hexcasting:root",
+ "category": "hexcasting:items",
+ "pages": [
+ "由紫水晶制成的笔,能在空中绘制图案以用作法术的输入。咒笔的使用方法和普通的法杖类似,但用它绘制的图案只会存入内部列表,而不会执行。"
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/shard.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/shard.json
new file mode 100644
index 000000000000..f17c395b0d71
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/shard.json
@@ -0,0 +1,10 @@
+{
+ "name": "回响碎片",
+ "category": "hexcasting:items",
+ "icon": "minecraft:echo_shard",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "自从我在那些远古城市里找到几个$(item)回响碎片/$后,我就觉得我的$(hex)咒术/$有些……被限制了,好像那些碎片在吸收它们。在另一只手中持有回响碎片,它就会吸收我绘制的所有图案,而后在同一时刻一起施放。",
+ "此行为在快速施放写好的咒术时比较有用。比如说,让回响碎片吸收一则简单的射线追踪咒术,后续就可以对着实体一次性施放,而不用等它走神站着不动时再一个个图案绘制。$(item)回响碎片/$运行的图案会使用我的法杖栈。所以,前例追踪到的实体可在法杖处直接使用。"
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/staffcast.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/staffcast.json
new file mode 100644
index 000000000000..34432d911fcd
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/staffcast.json
@@ -0,0 +1,25 @@
+{
+ "name": "法杖施法图案",
+ "category": "hexcasting:patterns",
+ "icon": "hexcasting:staff/mindsplice",
+ "pages": [
+ "这些图案施放$(hex)咒术/$的方式与我亲自绘制图案一致。此类图案共有两种:卓越版本会借用外部栈,初等版本会使用法杖栈。两种图案均会保留渡鸦之思。",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:staffcast_factory",
+ "op_id": "hexic:staffcast_factory",
+ "input": "∀αβ. α, [α → β]",
+ "output": "β",
+ "text": "让法杖施放$(hex)咒术/$。施放时会使用外部施法环境的栈。"
+ },
+ "这些图案的名称有些怪。在初等版本外套一层包装器,即可模拟卓越版本;但仅使用卓越版本却完全无法访问法杖栈。严格说来,不应该是初等版本比卓越版本更强大吗?",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexic:staffcast_factory/lazy",
+ "op_id": "hexic:staffcast_factory/lazy",
+ "input": "[? → ?]",
+ "output": "",
+ "text": "让法杖施放$(hex)咒术/$。咒术会使用法杖自身的栈,但会保留其外部环境的渡鸦之思。"
+ }
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/stringworms.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/stringworms.json
new file mode 100644
index 000000000000..3d28595d3ed5
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexic/stringworms.json
@@ -0,0 +1,9 @@
+{
+ "name": "毛绒线虫",
+ "category": "hexcasting:items",
+ "advancement": "hexcasting:root",
+ "icon": "hexic:preferred_stringworm",
+ "pages": [
+ "毛绒线虫——我发现的一系列奇怪物品,它们是一团毛绒形成的、类似虫子的事物。有些人可能会跟它们玩得很开心,但我的研究里用不到它们。"
+ ]
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexxytongue/greater_reveal.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexxytongue/greater_reveal.json
new file mode 100644
index 000000000000..1fb3e22619f1
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/hexxytongue/greater_reveal.json
@@ -0,0 +1,18 @@
+{
+ "name": "卓越揭示",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:bell",
+ "pages": [
+ "虽然我的$(hex)咒术/$可以用$(l:hexcasting:patterns/basics#hexcasting:print)$(action)揭示/$向我的意识传输信息,所得的结果却总是难以把握。除非我站定,仔细想我刚刚听到了什么,不然它就会隐入到其他人说的话中,以至于完全无法分辨。而且,不断往意识里塞 iota 也让我根本没法专心做要紧的事情。",
+ "因此,我自己设计了一个图案。它的功能和$(l:hexcasting:patterns/basics#hexcasting:print)$(action)揭示/$类似,但发来的消息会牢牢嵌在我的意识里,而且一经替换就会立刻遗忘。为方便起见,它还能接受一个消息列表。",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "hexxytounge:reveal",
+ "op_id": "hexxytounge:reveal",
+ "input": "[iota] | iota",
+ "output": "",
+ "text": "接受 iota 列表(或单个非 iota,此时视作单元素列表)并永久性将其嵌入我的意识。清除普通揭示的方法无法清除此操作展示的 iota,而是只能通过再次施放卓越揭示或死亡清除。"
+ },
+ "$(o)成为咒术师,就是去探索本不应被知晓的真相。/$"
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/phlib/maps.json b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/phlib/maps.json
new file mode 100644
index 000000000000..8c88a1e2017f
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/phlib/maps.json
@@ -0,0 +1,65 @@
+{
+ "name": "映射",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:filled_map",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "映射是能存储 iota 对的高效结构。虽然这种功能只靠列表操作也能做到,但专门设计的映射 iota 用到了某种奥秘物件,称作“$(thing)哈希/$”。这种区别并不会减少访问映射所需$(o)运算符/$的数量,却能大幅降低自然的负载,大多数访问下接近于 O(1)。",
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "phlib:empty_map",
+ "anchor": "phlib:empty_map",
+ "input": "",
+ "output": "map<⊥, ⊥>",
+ "text": "创建一个空映射以供使用。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:add",
+ "anchor": "hexcasting:add",
+ "input": "map, map",
+ "output": "map",
+ "text": "合并两个映射。映射中不允许存在重复项:后一映射的项会覆盖前一映射的。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:sub",
+ "anchor": "hexcasting:sub",
+ "input": "map, map",
+ "output": "map",
+ "text": "从第一个映射中移除第二个映射的项。比对时忽略第二个映射中项的值。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:index",
+ "anchor": "hexcasting:index",
+ "input": "map, k",
+ "output": "v?",
+ "text": "拆解映射,返回与所给键相关的值。和扫描列表不一样,此操作的复杂度是 O(1)。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:unappend",
+ "anchor": "hexcasting:unappend",
+ "input": "map",
+ "output": "map, (k, v)?",
+ "text": "从映射中取出一个项。删去哪个项没有定论,完全由自然随意决定。对空映射使用时返回两个 Null。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:replace",
+ "anchor": "hexcasting:replace",
+ "input": "map, k, v",
+ "output": "map",
+ "text": "将键为 $(n)k/$ 的项的值换为 $(n)v/$。若映射内没有 $(n)k/$ 键,则新建项。"
+ },
+ {
+ "type": "hexcasting:pattern",
+ "op_id": "hexcasting:remove_from",
+ "anchor": "hexcasting:remove_from",
+ "input": "map, k",
+ "output": "map",
+ "text": "从映射中删去所给键对应的项。若未找到相应项,则原样返回映射。"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexic/lang/en_us.json b/projects/1.20-fabric/assets/modrinth-hexic/hexic/lang/en_us.json
new file mode 100644
index 000000000000..b2707d4c3344
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexic/lang/en_us.json
@@ -0,0 +1,174 @@
+{
+ "book.hexic.page.dye_offhand": "Imbues the item held in my offhand (e.g. a $(l:items/hexcasting)$(item)casting item/$) with the given pigment.",
+ "book.hexic.page.erase": "Erases the _Hex or iota contained within a dropped item or block. Costs one dust per item.",
+ "book.hexic.page.get_other_caster": "Adds the closest sentient being, excluding me, to the stack.",
+ "book.hexic.page.modulo": "Similar to Modulus, but differs for negative numbers: -8 %%₁ 3 = -2, but -8 %%₂ 3 = 1.",
+ "hexcasting.action.hexic:deleteworld": "Shatter Demiplane",
+ "hexcasting.action.hexic:drop": "Rejection Distillation",
+ "hexcasting.action.hexic:dye_offhand": "Apply Pigment",
+ "hexcasting.action.hexic:erase": "Erase Block",
+ "hexcasting.action.hexic:extract": "Excisor's Gambit",
+ "hexcasting.action.hexic:fox": "Vulpine Gambit",
+ "hexcasting.action.hexic:free": "Deallocator's Gambit",
+ "hexcasting.action.hexic:get_other_caster": "Dual's Reflection",
+ "hexcasting.action.hexic:grep": "Refinement Distillation",
+ "hexcasting.action.hexic:jvm/class_of_iota": "Classifier Purification II",
+ "hexcasting.action.hexic:jvm/class_of_payload": "Classifier Purification I",
+ "hexcasting.action.hexic:jvm/newinstance_boxed": "Constructor Purification I",
+ "hexcasting.action.hexic:jvm/newinstance_unboxed": "Constructor Purification II",
+ "hexcasting.action.hexic:make_cme": "Thoth's Pseudogambit",
+ "hexcasting.action.hexic:makeworld": "Conjure Demiplane",
+ "hexcasting.action.hexic:malloc": "Allocator's Purification",
+ "hexcasting.action.hexic:modulo": "Modulus Distillation II",
+ "hexcasting.action.hexic:nbt/deserialize": "Importer's Purification",
+ "hexcasting.action.hexic:nbt/lift1": "Secretary's Purification: Byte",
+ "hexcasting.action.hexic:nbt/lift2": "Secretary's Purification: Short",
+ "hexcasting.action.hexic:nbt/lift4": "Secretary's Purification: Integer",
+ "hexcasting.action.hexic:nbt/lift8": "Secretary's Purification: Long",
+ "hexcasting.action.hexic:nbt/liftd": "Secretary's Purification: Double",
+ "hexcasting.action.hexic:nbt/liftf": "Secretary's Purification: Float",
+ "hexcasting.action.hexic:nbt/literal/array1": "Secretary's Reflection: Vacant Byte Array",
+ "hexcasting.action.hexic:nbt/literal/array2": "Secretary's Reflection: Vacant Integer Array",
+ "hexcasting.action.hexic:nbt/literal/array4": "Secretary's Reflection: Vacant Long Array",
+ "hexcasting.action.hexic:nbt/literal/collection": "Secretary's Reflection: Collection",
+ "hexcasting.action.hexic:nbt/literal/list": "Secretary's Reflection: Vacant List",
+ "hexcasting.action.hexic:nbt/serialize": "Exporter's Purification",
+ "hexcasting.action.hexic:reveal": "Greater Reveal",
+ "hexcasting.action.hexic:rotate": "Ferris Distillation",
+ "hexcasting.action.hexic:snow": "Summon Snow",
+ "hexcasting.action.hexic:staffcast_factory": "Lani's Greater Gambit",
+ "hexcasting.action.hexic:staffcast_factory/lazy": "Lani's Lesser Gambit",
+ "hexcasting.action.hexic:take": "Retention Distillation",
+ "hexcasting.action.hexic:tripwire": "Tripwire Reflection",
+ "hexcasting.action.hexic:unfox": "Vulpine Expulsion",
+ "hexcasting.action.hexic:whatthefuck": "Suffering",
+ "hexcasting.action.hexic:where": "Deductive Purification",
+ "hexcasting.special.hexic:tuple": "Coupler's Gambit",
+ "hexcasting.special.hexic:tuple.n": "Coupler's Gambit %s",
+ "hexcasting.iota.hexic:nbt": "Tag",
+ "hexcasting.iota.hexic:tripwire": "Tripwire",
+ "hexcasting.iota.hexic:variant": "Concept",
+ "hexcasting.mishap.bad_block.hexic:erase": "a block holding a casting item or acting as an iota holder",
+ "hexcasting.mishap.bad_item.hexic:erase": "a casting item or iota holder",
+ "hexcasting.mishap.invalid_value.class.hexic:erase": "an item entity or vector",
+ "hexcasting.mishap.invalid_value.class.hexic:int_or_list": "§aint§r or §5[§aint§5]§r",
+ "hexdoc.hexic.description": "Miscellaneous neat features and QoL patterns for Hex Casting",
+ "hexdoc.hexic.title": "Hexic",
+ "hexic.bad_metatable": "Expected a map in the §a%s§r property but got %s",
+ "hexic.media.external": "Media",
+ "hexic.media.finite": "%s: %s/%s (%s)",
+ "hexic.media.infinite": "%s: %s",
+ "hexic.media.internal": "Trinkets",
+ "hexic.media_bundle.items": "%s/%s",
+ "hexic.spell_memory": "Hex memorized",
+ "item.hexic.black_mediaweave": "Black Mediaweave",
+ "item.hexic.blue_mediaweave": "Blue Mediaweave",
+ "item.hexic.brown_mediaweave": "Brown Mediaweave",
+ "item.hexic.cyan_mediaweave": "Cyan Mediaweave",
+ "item.hexic.gray_mediaweave": "Gray Mediaweave",
+ "item.hexic.green_mediaweave": "Green Mediaweave",
+ "item.hexic.large_black_bundle": "Large Black Media Pouch",
+ "item.hexic.large_blue_bundle": "Large Blue Media Pouch",
+ "item.hexic.large_brown_bundle": "Large Brown Media Pouch",
+ "item.hexic.large_cyan_bundle": "Large Cyan Media Pouch",
+ "item.hexic.large_gray_bundle": "Large Gray Media Pouch",
+ "item.hexic.large_green_bundle": "Large Green Media Pouch",
+ "item.hexic.large_light_blue_bundle": "Large Light Blue Media Pouch",
+ "item.hexic.large_light_gray_bundle": "Large Light Gray Media Pouch",
+ "item.hexic.large_lime_bundle": "Large Lime Media Pouch",
+ "item.hexic.large_magenta_bundle": "Large Magenta Media Pouch",
+ "item.hexic.large_orange_bundle": "Large Orange Media Pouch",
+ "item.hexic.large_pink_bundle": "Large Pink Media Pouch",
+ "item.hexic.large_purple_bundle": "Large Purple Media Pouch",
+ "item.hexic.large_red_bundle": "Large Red Media Pouch",
+ "item.hexic.large_white_bundle": "Large White Media Pouch",
+ "item.hexic.large_yellow_bundle": "Large Yellow Media Pouch",
+ "item.hexic.light_blue_mediaweave": "Light Blue Mediaweave",
+ "item.hexic.light_gray_mediaweave": "Light Gray Mediaweave",
+ "item.hexic.lime_mediaweave": "Lime Mediaweave",
+ "item.hexic.magenta_mediaweave": "Magenta Mediaweave",
+ "item.hexic.orange_mediaweave": "Orange Mediaweave",
+ "item.hexic.pen.black": "Black Pen",
+ "item.hexic.pen.blue": "Blue Pen",
+ "item.hexic.pen.brown": "Brown Pen",
+ "item.hexic.pen.cyan": "Cyan Pen",
+ "item.hexic.pen.gray": "Gray Pen",
+ "item.hexic.pen.green": "Green Pen",
+ "item.hexic.pen.light_blue": "Light Blue Pen",
+ "item.hexic.pen.light_gray": "Light Gray Pen",
+ "item.hexic.pen.lime": "Lime Pen",
+ "item.hexic.pen.magenta": "Magenta Pen",
+ "item.hexic.pen.orange": "Orange Pen",
+ "item.hexic.pen.pink": "Pink Pen",
+ "item.hexic.pen.purple": "Purple Pen",
+ "item.hexic.pen.red": "Red Pen",
+ "item.hexic.pen.white": "White Pen",
+ "item.hexic.pen.yellow": "Yellow Pen",
+ "item.hexic.pink_mediaweave": "Pink Mediaweave",
+ "item.hexic.purple_mediaweave": "Purple Mediaweave",
+ "item.hexic.red_mediaweave": "Red Mediaweave",
+ "item.hexic.small_black_bundle": "Black Media Pouch",
+ "item.hexic.small_blue_bundle": "Blue Media Pouch",
+ "item.hexic.small_brown_bundle": "Brown Media Pouch",
+ "item.hexic.small_cyan_bundle": "Cyan Media Pouch",
+ "item.hexic.small_gray_bundle": "Gray Media Pouch",
+ "item.hexic.small_green_bundle": "Green Media Pouch",
+ "item.hexic.small_light_blue_bundle": "Light Blue Media Pouch",
+ "item.hexic.small_light_gray_bundle": "Light Gray Media Pouch",
+ "item.hexic.small_lime_bundle": "Lime Media Pouch",
+ "item.hexic.small_magenta_bundle": "Magenta Media Pouch",
+ "item.hexic.small_orange_bundle": "Orange Media Pouch",
+ "item.hexic.small_pink_bundle": "Pink Media Pouch",
+ "item.hexic.small_purple_bundle": "Purple Media Pouch",
+ "item.hexic.small_red_bundle": "Red Media Pouch",
+ "item.hexic.small_white_bundle": "White Media Pouch",
+ "item.hexic.small_yellow_bundle": "Yellow Media Pouch",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_black": "Shimmering Black Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_blue": "Shimmering Blue Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_brown": "Shimmering Brown Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_cyan": "Shimmering Cyan Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_gray": "Shimmering Gray Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_green": "Shimmering Green Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_light_blue": "Shimmering Light Blue Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_light_gray": "Shimmering Light Gray Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_lime": "Shimmering Lime Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_magenta": "Shimmering Magenta Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_orange": "Shimmering Orange Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_pink": "Shimmering Pink Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_purple": "Shimmering Purple Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_red": "Shimmering Red Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_white": "Shimmering White Stringworm",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_yellow": "Shimmering Yellow Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_agender": "Shimmering Agender Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_aroace": "Shimmering Aroace Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_aromantic": "Shimmering Aromantic Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_asexual": "Shimmering Asexual Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_bisexual": "Shimmering Bisexual Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_demiboy": "Shimmering Demiboy Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_demigirl": "Shimmering Demigirl Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_gay": "Shimmering Gay Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_genderfluid": "Shimmering Genderfluid Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_genderqueer": "Shimmering Genderqueer Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_intersex": "Shimmering Intersex Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_lesbian": "Shimmering Lesbian Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_nonbinary": "Shimmering Non-Binary Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_pansexual": "Shimmering Pansexual Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_plural": "Shimmering Plural Stringworm",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_transgender": "Shimmering Transgender Stringworm",
+ "item.hexic.stringworm.item.oneironaut.pigment_flame": "Shimmering Flame Stringworm",
+ "item.hexic.stringworm.item.oneironaut.pigment_echo": "Shimmering Echo Stringworm",
+ "item.hexic.stringworm.item.oneironaut.pigment_noosphere": "Shimmering Noetic Stringworm",
+ "item.hexic.stringworm.item.oneironaut.pigment_frenzyflame": "Shimmering Frenzy Stringworm",
+ "item.hexic.stringworm_action": "Stringworm",
+ "item.hexic.stringworm_hex": "Stringworm",
+ "item.hexic.stringworm_media": "Stringworm",
+ "item.hexic.stringworm_pure": "Stringworm",
+ "item.hexic.stringworm_thing": "Stringworm",
+ "item.hexic.white_mediaweave": "White Mediaweave",
+ "item.hexic.wizard": "Wizard",
+ "item.hexic.yellow_mediaweave": "Yellow Mediaweave",
+ "itemGroup.hexic.group": "Hexic",
+ "tag.item.hexic.mediaweaves": "Mediaweave",
+ "text.hexic.or_map": "%s or map",
+ "text.hexic.pigment_holder_item": "an item storing a pigment"
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexic/lang/zh_cn.json b/projects/1.20-fabric/assets/modrinth-hexic/hexic/lang/zh_cn.json
new file mode 100644
index 000000000000..32663dd3a75a
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexic/lang/zh_cn.json
@@ -0,0 +1,174 @@
+{
+ "book.hexic.page.dye_offhand": "将所给染色剂内化到我副手中的物品(如$(l:items/hexcasting)$(item)施法物品/$)里。",
+ "book.hexic.page.erase": "清除物品实体或方块中的$(hex)咒术/$或 iota。每个物品消耗 1 个紫水晶粉。",
+ "book.hexic.page.get_other_caster": "将离我最近的有智慧存在压入栈,我自己不计入统计范围。",
+ "book.hexic.page.modulo": "与余数之馏化类似,但两者在负数上的表现不同:-8 %%₁ 3 = -2,而 -8 %%₂ 3 = 1。",
+ "hexcasting.action.hexic:deleteworld": "击碎半位面",
+ "hexcasting.action.hexic:drop": "拒斥之馏化",
+ "hexcasting.action.hexic:dye_offhand": "应用染色剂",
+ "hexcasting.action.hexic:erase": "清除方块",
+ "hexcasting.action.hexic:extract": "切除器之策略",
+ "hexcasting.action.hexic:fox": "狐狸之策略",
+ "hexcasting.action.hexic:free": "释放器之策略",
+ "hexcasting.action.hexic:get_other_caster": "对偶之精思",
+ "hexcasting.action.hexic:grep": "精炼之馏化",
+ "hexcasting.action.hexic:jvm/class_of_iota": "判类器之纯化,第二型",
+ "hexcasting.action.hexic:jvm/class_of_payload": "判类器之纯化,第一型",
+ "hexcasting.action.hexic:jvm/newinstance_boxed": "构造器之纯化,第一型",
+ "hexcasting.action.hexic:jvm/newinstance_unboxed": "构造器之纯化,第二型",
+ "hexcasting.action.hexic:make_cme": "托特之伪策略",
+ "hexcasting.action.hexic:makeworld": "构筑半位面",
+ "hexcasting.action.hexic:malloc": "分配器之纯化",
+ "hexcasting.action.hexic:modulo": "余数之馏化,第二型",
+ "hexcasting.action.hexic:nbt/deserialize": "导入器之纯化",
+ "hexcasting.action.hexic:nbt/lift1": "秘书之纯化:字节",
+ "hexcasting.action.hexic:nbt/lift2": "秘书之纯化:短整型",
+ "hexcasting.action.hexic:nbt/lift4": "秘书之纯化:整型",
+ "hexcasting.action.hexic:nbt/lift8": "秘书之纯化:长整型",
+ "hexcasting.action.hexic:nbt/liftd": "秘书之纯化:双精度浮点型",
+ "hexcasting.action.hexic:nbt/liftf": "秘书之纯化:单精度浮点型",
+ "hexcasting.action.hexic:nbt/literal/array1": "秘书之精思:空字节数组",
+ "hexcasting.action.hexic:nbt/literal/array2": "秘书之精思:空整型数组",
+ "hexcasting.action.hexic:nbt/literal/array4": "秘书之精思:空长整型数组",
+ "hexcasting.action.hexic:nbt/literal/collection": "秘书之精思:容器",
+ "hexcasting.action.hexic:nbt/literal/list": "秘书之精思:空列表",
+ "hexcasting.action.hexic:nbt/serialize": "导出器之纯化",
+ "hexcasting.action.hexic:reveal": "卓越揭示",
+ "hexcasting.action.hexic:rotate": "摩天轮之馏化",
+ "hexcasting.action.hexic:snow": "召雪",
+ "hexcasting.action.hexic:staffcast_factory": "Lani之卓越策略",
+ "hexcasting.action.hexic:staffcast_factory/lazy": "Lani之初等策略",
+ "hexcasting.action.hexic:take": "维持之馏化",
+ "hexcasting.action.hexic:tripwire": "绊线之精思",
+ "hexcasting.action.hexic:unfox": "狐狸之驱逐",
+ "hexcasting.action.hexic:whatthefuck": "苦痛",
+ "hexcasting.action.hexic:where": "演绎之纯化",
+ "hexcasting.special.hexic:tuple": "耦合器之策略",
+ "hexcasting.special.hexic:tuple.n": "耦合器之策略:%s",
+ "hexcasting.iota.hexic:nbt": "标签",
+ "hexcasting.iota.hexic:tripwire": "绊线",
+ "hexcasting.iota.hexic:variant": "概念",
+ "hexcasting.mishap.bad_block.hexic:erase": "一个存有施法物品或用于存储iota的方块",
+ "hexcasting.mishap.bad_item.hexic:erase": "一个施法物品或iota存储器",
+ "hexcasting.mishap.invalid_value.class.hexic:erase": "一个物品实体或向量",
+ "hexcasting.mishap.invalid_value.class.hexic:int_or_list": "§aint§r或§5[§aint§5]§r",
+ "hexdoc.hexic.description": "各种好用的特性和提升体验的图案,专为咒法学设计",
+ "hexdoc.hexic.title": "Hexic",
+ "hexic.bad_metatable": "§a%s§r质性中本应包含一个映射,而实际为%s",
+ "hexic.media.external": "媒质",
+ "hexic.media.finite": "%s:%s/%s(%s)",
+ "hexic.media.infinite": "%s:%s",
+ "hexic.media.internal": "缀品等",
+ "hexic.media_bundle.items": "%s/%s",
+ "hexic.spell_memory": "所记忆的咒术",
+ "item.hexic.black_mediaweave": "黑色媒质布匹",
+ "item.hexic.blue_mediaweave": "蓝色媒质布匹",
+ "item.hexic.brown_mediaweave": "棕色媒质布匹",
+ "item.hexic.cyan_mediaweave": "青色媒质布匹",
+ "item.hexic.gray_mediaweave": "灰色媒质布匹",
+ "item.hexic.green_mediaweave": "绿色媒质布匹",
+ "item.hexic.large_black_bundle": "大型黑色媒质口袋",
+ "item.hexic.large_blue_bundle": "大型蓝色媒质口袋",
+ "item.hexic.large_brown_bundle": "大型棕色媒质口袋",
+ "item.hexic.large_cyan_bundle": "大型青色媒质口袋",
+ "item.hexic.large_gray_bundle": "大型灰色媒质口袋",
+ "item.hexic.large_green_bundle": "大型绿色媒质口袋",
+ "item.hexic.large_light_blue_bundle": "大型淡蓝色媒质口袋",
+ "item.hexic.large_light_gray_bundle": "大型淡灰色媒质口袋",
+ "item.hexic.large_lime_bundle": "大型黄绿色媒质口袋",
+ "item.hexic.large_magenta_bundle": "大型品红色媒质口袋",
+ "item.hexic.large_orange_bundle": "大型橙色媒质口袋",
+ "item.hexic.large_pink_bundle": "大型粉红色媒质口袋",
+ "item.hexic.large_purple_bundle": "大型紫色媒质口袋",
+ "item.hexic.large_red_bundle": "大型红色媒质口袋",
+ "item.hexic.large_white_bundle": "大型白色媒质口袋",
+ "item.hexic.large_yellow_bundle": "大型黄色媒质口袋",
+ "item.hexic.light_blue_mediaweave": "淡蓝色媒质布匹",
+ "item.hexic.light_gray_mediaweave": "淡灰色媒质布匹",
+ "item.hexic.lime_mediaweave": "黄绿色媒质布匹",
+ "item.hexic.magenta_mediaweave": "品红色媒质布匹",
+ "item.hexic.orange_mediaweave": "橙色媒质布匹",
+ "item.hexic.pen.black": "黑色咒笔",
+ "item.hexic.pen.blue": "蓝色咒笔",
+ "item.hexic.pen.brown": "棕色咒笔",
+ "item.hexic.pen.cyan": "青色咒笔",
+ "item.hexic.pen.gray": "灰色咒笔",
+ "item.hexic.pen.green": "绿色咒笔",
+ "item.hexic.pen.light_blue": "淡蓝色咒笔",
+ "item.hexic.pen.light_gray": "淡灰色咒笔",
+ "item.hexic.pen.lime": "黄绿色咒笔",
+ "item.hexic.pen.magenta": "品红色咒笔",
+ "item.hexic.pen.orange": "橙色咒笔",
+ "item.hexic.pen.pink": "粉红色咒笔",
+ "item.hexic.pen.purple": "紫色咒笔",
+ "item.hexic.pen.red": "红色咒笔",
+ "item.hexic.pen.white": "白色咒笔",
+ "item.hexic.pen.yellow": "黄色咒笔",
+ "item.hexic.pink_mediaweave": "粉红色媒质布匹",
+ "item.hexic.purple_mediaweave": "紫色媒质布匹",
+ "item.hexic.red_mediaweave": "红色媒质布匹",
+ "item.hexic.small_black_bundle": "小型黑色媒质口袋",
+ "item.hexic.small_blue_bundle": "小型蓝色媒质口袋",
+ "item.hexic.small_brown_bundle": "小型棕色媒质口袋",
+ "item.hexic.small_cyan_bundle": "小型青色媒质口袋",
+ "item.hexic.small_gray_bundle": "小型灰色媒质口袋",
+ "item.hexic.small_green_bundle": "小型绿色媒质口袋",
+ "item.hexic.small_light_blue_bundle": "小型淡蓝色媒质口袋",
+ "item.hexic.small_light_gray_bundle": "小型淡灰色媒质口袋",
+ "item.hexic.small_lime_bundle": "小型黄绿色媒质口袋",
+ "item.hexic.small_magenta_bundle": "小型品红色媒质口袋",
+ "item.hexic.small_orange_bundle": "小型橙色媒质口袋",
+ "item.hexic.small_pink_bundle": "小型粉红色媒质口袋",
+ "item.hexic.small_purple_bundle": "小型紫色媒质口袋",
+ "item.hexic.small_red_bundle": "小型红色媒质口袋",
+ "item.hexic.small_white_bundle": "小型白色媒质口袋",
+ "item.hexic.small_yellow_bundle": "小型黄色媒质口袋",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_black": "闪亮的黑色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_blue": "闪亮的蓝色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_brown": "闪亮的棕色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_cyan": "闪亮的青色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_gray": "闪亮的灰色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_green": "闪亮的绿色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_light_blue": "闪亮的淡蓝色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_light_gray": "闪亮的淡灰色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_lime": "闪亮的黄绿色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_magenta": "闪亮的品红色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_orange": "闪亮的橙色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_pink": "闪亮的粉红色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_purple": "闪亮的紫色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_red": "闪亮的红色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_white": "闪亮的白色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.dye_colorizer_yellow": "闪亮的黄色毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_agender": "闪亮的无性别毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_aroace": "闪亮的无浪漫倾向无性恋毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_aromantic": "闪亮的无浪漫倾向毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_asexual": "闪亮的无性恋毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_bisexual": "闪亮的双性恋毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_demiboy": "闪亮的部分男性毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_demigirl": "闪亮的部分女性毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_gay": "闪亮的男同性恋毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_genderfluid": "闪亮的性别流体毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_genderqueer": "闪亮的性别酷儿毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_intersex": "闪亮的双性人毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_lesbian": "闪亮的女同性恋毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_nonbinary": "闪亮的非二元性别毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_pansexual": "闪亮的泛性恋毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_plural": "闪亮的多重人格毛绒线虫",
+ "item.hexic.stringworm.item.hexcasting.pride_colorizer_transgender": "闪亮的跨性别毛绒线虫",
+ "item.hexic.stringworm.item.oneironaut.pigment_flame": "闪亮的火焰毛绒线虫",
+ "item.hexic.stringworm.item.oneironaut.pigment_echo": "闪亮的回响毛绒线虫",
+ "item.hexic.stringworm.item.oneironaut.pigment_noosphere": "闪亮的智识毛绒线虫",
+ "item.hexic.stringworm.item.oneironaut.pigment_frenzyflame": "闪亮的狂热毛绒线虫",
+ "item.hexic.stringworm_action": "毛绒线虫",
+ "item.hexic.stringworm_hex": "毛绒线虫",
+ "item.hexic.stringworm_media": "毛绒线虫",
+ "item.hexic.stringworm_pure": "毛绒线虫",
+ "item.hexic.stringworm_thing": "毛绒线虫",
+ "item.hexic.white_mediaweave": "白色媒质布匹",
+ "item.hexic.wizard": "巫师",
+ "item.hexic.yellow_mediaweave": "黄色媒质布匹",
+ "itemGroup.hexic.group": "Hexic",
+ "tag.item.hexic.mediaweaves": "媒质布匹",
+ "text.hexic.or_map": "%s或映射",
+ "text.hexic.pigment_holder_item": "存有染色剂的物品"
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexxytongue/lang/en_us.json b/projects/1.20-fabric/assets/modrinth-hexic/hexxytongue/lang/en_us.json
new file mode 100644
index 000000000000..ca9146792a0d
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexxytongue/lang/en_us.json
@@ -0,0 +1,4 @@
+{
+ "hexcasting.action.hexxytounge:murmur": "Murmur Reflection",
+ "book.hexxytounge.page.murmur": "Finds the region of my mind known as the 'chat box' and adds its contents to the stack. If it cannot be found, adds Null instead."
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/hexxytongue/lang/zh_cn.json b/projects/1.20-fabric/assets/modrinth-hexic/hexxytongue/lang/zh_cn.json
new file mode 100644
index 000000000000..8137967cf173
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/hexxytongue/lang/zh_cn.json
@@ -0,0 +1,4 @@
+{
+ "hexcasting.action.hexxytounge:murmur": "私语之精思",
+ "book.hexxytounge.page.murmur": "找到我意识中名为“聊天栏”的区域,将其内容压栈;无法找到则返回 Null。"
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/phlib/lang/en_us.json b/projects/1.20-fabric/assets/modrinth-hexic/phlib/lang/en_us.json
new file mode 100644
index 000000000000..fad1a6610c3d
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/phlib/lang/en_us.json
@@ -0,0 +1,3 @@
+{
+ "hexcasting.action.phlib:empty_map": "Vacant Reflection: Map"
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-hexic/phlib/lang/zh_cn.json b/projects/1.20-fabric/assets/modrinth-hexic/phlib/lang/zh_cn.json
new file mode 100644
index 000000000000..4075961e77f1
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-hexic/phlib/lang/zh_cn.json
@@ -0,0 +1,3 @@
+{
+ "hexcasting.action.phlib:empty_map": "空无之精思:映射"
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-iotaworks/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/iotaworks/metatables.json b/projects/1.20-fabric/assets/modrinth-iotaworks/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/iotaworks/metatables.json
new file mode 100644
index 000000000000..4f9f676da1d9
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-iotaworks/hexcasting/patchouli_books/thehexbook/en_us/entries/addon/iotaworks/metatables.json
@@ -0,0 +1,39 @@
+{
+ "name": "Iota Patching",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:calibrated_sculk_sensor",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "I've discovered a way to create a new type of iota — an abhorrence against Nature of my own doing. This pattern weaves a 'sheath' of _media out of some iota, letting me customize several attributes of the new iota. Though this can make my spells more expressive, this ability is not to be taken lightly — I cannot imagine the mischief others would do with these 'patchwork' iotas.",
+ "To assemble a patchwork iota, I must provide four source iotas:$(br)$(li)The 'userdata' iota, passed to my overload _Hexes.$(li)The 'display' iota, visible to my eyes.$(li)A color for the iota, as an RGB vector in the 0-1 range.$(li)A pointer to an $(thing)overload map./$",
+ "Such an 'overload map' is merely a regular $(l:addon/phlib/maps)$(thing)Map/$ iota (mapping patterns to the _Hexes they should be replaced with), but stored within a $(l:properties)$(thing)Property/$. I assume that Nature's reason for boxing like this is to save space: it's likely I'll have many patched iotas all using the same overloads. This also gives me the convenience of updating every instance with merely $(l:properties#hexcellular:set_property)$(action)Schrödinger's Gambit/$, rather than finding and updating them all by hand.",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "iotaworks:metatable",
+ "op_id": "iotaworks:metatable",
+ "input": "iota, iota, vec, property",
+ "output": "patchwork",
+ "text": "$(br)Constructs a Patchwork iota from the userdata (iota stored inside), display iota (visible to my eyes), color, and an overload map."
+ },
+ {
+ "type": "patchouli:text",
+ "flag": "!mod:hexdoc",
+ "text": "These $(thing)overload maps/$ resemble a technique I've seen before — the concept of redefining patterns on a fundamental level resembles the moon cultists' (little time to explain) $(l:https://www.lua.org/pil/13.html)metatables/$, which allow associating a table with another table to redefine its operations. When my 'metamethods' are invoked, the userdata iota is pushed to the top of the stack. All other information about the patchwork disintegrates: I'll need to recreate it from scratch (maybe I should use a"
+ },
+ {
+ "type": "patchouli:text",
+ "flag": "!mod:hexdoc",
+ "text": "'constructor' macro?) if I want to return a new iota of the same type.$(br2)Important note: unlike these 'metatables' I've heard about, patchwork $(o)replaces/$ the behavior of the underlying iota. For example, operators such as won't work on two patchwork numbers unless I define it myself. However, I feel uneasy relying on this behavior — Nature will be perfectly happy to change this at any moment."
+ },
+ {
+ "type": "patchouli:text",
+ "flag": "mod:hexdoc",
+ "text": "These $(thing)overload maps/$ resemble a technique I've heard of before — the concept of redefining patterns on a fundamental level resembles the moon cultists' (little time to explain) $(l:https://www.lua.org/pil/13.html)metatables/$, which allow associating a table with another table to redefine its operations. When my 'metamethods' are invoked, the userdata iota is pushed to the top of the stack. All other information about the patchwork disintegrates: I'll need to recreate it from scratch (maybe I should use a 'constructor' macro?) if I want to return a new iota of the same type."
+ },
+ {
+ "type": "patchouli:text",
+ "flag": "mod:hexdoc",
+ "text": "Important note: unlike these 'metatables' I've heard about, patchwork $(o)replaces/$ the behavior of the underlying iota. For example, operators such as won't work on two patchwork numbers unless I define it myself. However, I feel uneasy relying on this behavior — Nature will be perfectly happy to change this at any moment."
+ }
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-iotaworks/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/iotaworks/metatables.json b/projects/1.20-fabric/assets/modrinth-iotaworks/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/iotaworks/metatables.json
new file mode 100644
index 000000000000..875b1a0e1704
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-iotaworks/hexcasting/patchouli_books/thehexbook/zh_cn/entries/addon/iotaworks/metatables.json
@@ -0,0 +1,39 @@
+{
+ "name": "Iota 修补",
+ "category": "hexcasting:patterns",
+ "icon": "minecraft:calibrated_sculk_sensor",
+ "advancement": "hexcasting:root",
+ "pages": [
+ "我找到了制造新种类 iota 的方法——由我对自然行径的憎恶催生。这个图案会在 iota 外部编织一层$(media)媒质/$“鞘”,以让我自定义新 iota 的多个属性。虽然这么做会让我的咒术更昂贵,但也不应轻视这种力量——我无法想象,其他人靠这些“修补”iota 能干出什么恶事。",
+ "构造修补 iota 时,必须提供 4 个来源 iota:$(br)$(li)自定义数据(userdata),真正传递给重载$(hex)咒术/$的 iota。$(li)所谓“展示”iota,我视角下 iota 的样子。$(li)Iota 的颜色,形式为 RGB 向量,分量值域为 0 到 1。$(li)指向$(thing)重载映射/$的指针。",
+ "此处提到的“重载映射”只是一个普通的$(l:addon/phlib/maps)$(thing)映射/$ iota(图案至$(hex)咒术/$的映射,后者替代前者执行),但需整体存储在$(l:properties)$(thing)质性/$内。我推测自然进行封装是为了省空间,因为我可能会在多个修补 iota 中用到同一个重载映射。这同时也方便我更新所有实例——用一条$(l:properties#hexcellular:set_property)$(action)薛定谔之策略/$就可以了,不需要逐一找出更新。",
+ {
+ "type": "hexcasting:pattern",
+ "anchor": "iotaworks:metatable",
+ "op_id": "iotaworks:metatable",
+ "input": "iota, iota, vec, property",
+ "output": "patchwork",
+ "text": "$(br)使用自定义数据(userdata,内部存储的 iota)、展示 iota(实际看见的 iota)、颜色、重载映射创建一个修补 iota。"
+ },
+ {
+ "type": "patchouli:text",
+ "flag": "!mod:hexdoc",
+ "text": "这些$(thing)重载映射/$和我之前见过的一种技巧很像:在基础层面上重新定义图案。那些月之邪教徒(没位置解释)用到的$(l:https://www.lua.org/pil/13.html)元表/$——关联两张表来重新定义运算符——也跟它很类似。每当唤起我这边的“元方法”时,即会将自定义数据压栈。修补 iota 的其他信息则都遗失了;如果要返回同种 iota,就需要从头再构建一遍。也许可以用个“构造”宏?"
+ },
+ {
+ "type": "patchouli:text",
+ "flag": "!mod:hexdoc",
+ "text": "重要注意事项:和我听说的“元表”不一样,修补会$(o)替换/$其下 iota 的行为。比如说,等运算符无法作用于两个修补后的数,除非我自行定义行为。不过,我总觉得这个特性不太值得信赖;自然随时都有可能修改这个特性。"
+ },
+ {
+ "type": "patchouli:text",
+ "flag": "mod:hexdoc",
+ "text": "这些$(thing)重载映射/$和我之前听过的一种技巧很像:在基础层面上重新定义图案。那些月之邪教徒(没位置解释)用到的$(l:https://www.lua.org/pil/13.html)元表/$——关联两张表来重新定义运算符——也跟它很类似。每当唤起我这边的“元方法”时,即会将自定义数据压栈。修补 iota 的其他信息则都遗失了;如果要返回同种 iota,就需要从头再构建一遍。也许可以用个“构造”宏?"
+ },
+ {
+ "type": "patchouli:text",
+ "flag": "mod:hexdoc",
+ "text": "重要注意事项:和我听说的“元表”不一样,修补会$(o)替换/$其下 iota 的行为。比如说,等运算符无法作用于两个修补后的数,除非我自行定义行为。不过,我总觉得这个特性不太值得信赖;自然随时都有可能修改这个特性。"
+ }
+ ]
+}
diff --git a/projects/1.20-fabric/assets/modrinth-iotaworks/iotaworks/lang/en_us.json b/projects/1.20-fabric/assets/modrinth-iotaworks/iotaworks/lang/en_us.json
new file mode 100644
index 000000000000..44c7dcb1a787
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-iotaworks/iotaworks/lang/en_us.json
@@ -0,0 +1,5 @@
+{
+ "modmenu.nameTranslation.iotaworks": "Iotaworks",
+ "modmenu.descriptionTranslation.iotaworks": "A Hex Casting addon for manipulating iotas.",
+ "hexcasting.action.iotaworks:metatable": "Patchwork Exaltation"
+}
\ No newline at end of file
diff --git a/projects/1.20-fabric/assets/modrinth-iotaworks/iotaworks/lang/zh_cn.json b/projects/1.20-fabric/assets/modrinth-iotaworks/iotaworks/lang/zh_cn.json
new file mode 100644
index 000000000000..b3fa2cb0a6bb
--- /dev/null
+++ b/projects/1.20-fabric/assets/modrinth-iotaworks/iotaworks/lang/zh_cn.json
@@ -0,0 +1,5 @@
+{
+ "modmenu.nameTranslation.iotaworks": "Iota工程",
+ "modmenu.descriptionTranslation.iotaworks": "能操纵iota本身的咒法学附属。",
+ "hexcasting.action.iotaworks:metatable": "修补之提整"
+}
\ No newline at end of file