···11<center>
2233-<img height="200" src="src/main/resources/assets/hexic/icon.png" title="hexic icon: a blue stringworm" width="200"/>
33+<img height="200" src="https://codeberg.org/api/v1/repos/poollovernathan/hexic/raw/src/main/resources/assets/hexic/icon.png" title="hexic icon: a blue stringworm" width="200"/>
4455<h1 style="margin-top: 0">hexic</h1>
66···3232* hexical Hopper can be used with kinetic's Conduits; bypasses ambit
33333434[hexcasting]: https://modrinth.com/mod/hex-casting
3535-[siege]: https://hexic.pool.net.eu.org/siege.html3535+[siege]: https://hexic.pool.net.eu.org/siege.html
3636+3737+---
3838+3939+## development
4040+4141+put code in the following files:
4242+4343+* [`EarlyRiser.scala`](src/main/scala/org/eu/net/pool/hexic/EarlyRiser.scala) — something that needs to get loaded before launch, e.g. agents
4444+* [`Utils.scala`](src/main/scala/org/eu/net/pool/hexic/Utils.scala) — utilities that aren't specifically related to the mod
4545+* [`Hexic.scala`](src/main/scala/org/eu/net/pool/hexic/Hexic.scala) — anything else
4646+4747+## building
4848+4949+there are three major ways to build:
5050+5151+* **nix**: `nix-shell`, `gradle runDatagen`, `gradle build`
5252+* **manual**: install aseprite, go, jujutsu, imagemagick, gradle 8.14, and gnu m4, then `gradle runDatagen; gradle build` as usual
5353+5454+### docker
5555+5656+isolated container environment gives you a guarantee of build reproducibility, if you don't care about build speed
5757+5858+* **simple local build**: `docker build . -f build.Dockerfile -o some/output/path/`
5959+* **build without cloning**: `docker build https://codeberg.org/poollovernathan/hexic.git#main --build-arg BUILDKIT_CONTEXT_KEEP_GIT_DIR=1 -f build.Dockerfile -o some/output/path/`
6060+6161+you can optimize your builds by using the cache, which requires creating a build container: `docker buildx create --driver docker-container --name hexic-builder`
6262+6363+* **precached local build**: `docker build . -f build.Dockerfile -o some/output/path/ --builder hexic-builder --cache-from docker.pool.net.eu.org/hexic:cache`
6464+* **precached build without cloning**: `docker build https://codeberg.org/poollovernathan/hexic.git#main --build-arg BUILDKIT_CONTEXT_KEEP_GIT_DIR=1 -f build.Dockerfile -o some/output/path/ --builder hexic-builder --cache-from docker.pool.net.eu.org/hexic:cache`
+15
TODO.md
···11+# before next release
22+* `ktwznkmp` making Noetic Gateway always go to a demiplane's center
33+* `ktwznkmp` special demiplane iota handling
44+* demiplane rupturing
55+* implement table stuff
66+* chisel texture
77+* table in-inventory model
88+# probably soon
99+* `szrotpky` filtering and sorting would be nice to have
1010+* The Suffering / Ascension
1111+* document demiplanes
1212+* document snow pattern
1313+* document parathoth
1414+# at some point
1515+* spellminds
···11-{
22- "name": "Strings: An Addendum",
33- "icon": "minecraft:string",
44- "category": "hexcasting:patterns",
55- "pages": [
66- "For some strange reason, I feel the need to document this pattern in a separate chapter, despite its resemblance to $(l:patterns/strings#moreiotas:string/chat/caster)Whisper Reflection/$ — something about \"mods shouldn't modify other mods' entries\" and all that.",
77- {
88- "type": "hexcasting:pattern",
99- "op_id": "hexic:murmur",
1010- "anchor": "hexic:murmur",
1111- "input": "",
1212- "output": "str",
1313- "text": "Adds the phrase on the $(o)tip of my tongue/$ to the stack, regardless of whether I intend to say it."
1414- }
1515- ]
1616-}
···1111 "anchor": "hexic:rotate",
1212 "input": "[a], int",
1313 "output": "[a]",
1414- "text": "Rotates the array leftward: an argument of 1 moves the first item of the list to the end. Negative numbers allow rotating the list rightward."
1414+ "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."
1515 },
1616 {
1717 "type": "hexcasting:pattern",
···6060 "input": "[num]",
6161 "output": "[int]",
6262 "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."
6363+ },
6464+ {
6565+ "type": "hexcasting:pattern",
6666+ "op_id": "hexcasting:mul",
6767+ "anchor": "hexcasting:mul",
6868+ "input": "[a], [b]",
6969+ "output": "[[a, b]]",
7070+ "text": "Calculates the outer product of two lists. The resulting list has an entry for every possible pairing between the input lists."
7171+ },
7272+ {
7373+ "type": "hexcasting:pattern",
7474+ "op_id": "hexcasting:mul",
7575+ "anchor": "hexcasting:mul",
7676+ "input": "[a], [b]",
7777+ "output": "[[a, b]]",
7878+ "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)."
7979+ },
8080+ {
8181+ "type": "hexcasting:pattern",
8282+ "op_id": "hexic:extract",
8383+ "anchor": "hexic:extract",
8484+ "input": "[a], int",
8585+ "output": "[a], [a], a",
8686+ "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."
8787+ },
8888+ {
8989+ "type": "hexcasting:pattern",
9090+ "op_id": "hexic:grep",
9191+ "anchor": "hexic:grep",
9292+ "input": "[a], [a → bool]",
9393+ "output": "[a]",
9494+ "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."
6395 }
6496 ]
6597}