This commit is contained in:
gamma-delta 2022-02-07 16:23:46 -06:00
commit f573b461a2
55 changed files with 631 additions and 308 deletions

22
.github/workflows/gradle.yml vendored Normal file
View file

@ -0,0 +1,22 @@
name: Java CI with Gradle
on:
[push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: build
- uses: actions/upload-artifact@v2
if: github.event_name != 'pull_request'
with:
name: Package
path: build/libs

25
.github/workflows/publish.yml vendored Normal file
View file

@ -0,0 +1,25 @@
name: Publish tag
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
env:
TAG_NAME: ${{ github.ref_name }}
steps:
- uses: actions/checkout@v2
- name: Set up JDK
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: build
- name: Release
uses: softprops/action-gh-release@v1
with:
files: build/libs/*

View file

@ -21,6 +21,11 @@ version = '0.5.0-dev.5'
group = 'at.petra-k.hexcasting' // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = 'hexcasting'
if (System.getenv('TAG_NAME') != null) {
version = System.getenv('TAG_NAME').substring(1)
println 'Version overridden to tag version ' + version
}
// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17.
java.toolchain.languageVersion = JavaLanguageVersion.of(17)

View file

@ -111,7 +111,7 @@ afecba3144e00505977a4ab4de7940f949ab7818 data/hexcasting/loot_modifiers/scroll_d
0e8c8a56161586a4021487b27059ca151465af67 data/hexcasting/loot_modifiers/scroll_jungle.json
50e7ad657a0ab43f3bd632120e09f109791aaf34 data/hexcasting/loot_modifiers/scroll_shipwreck.json
7ffa361bd8a108b504fe450749b42997dc898e5e data/hexcasting/loot_modifiers/scroll_stronghold_library.json
2a8ed63d969c2a7ce3e49f87018374c4c5cb56d0 data/hexcasting/recipes/artifact.json
6e6e4d01097c10316892e274f33cb0faaf9dc0df data/hexcasting/recipes/artifact.json
27164ae64cf43091f25946cc15dfcace2c903b2b data/hexcasting/recipes/cypher.json
33fed8fb8e34df026e1eea0df8161c7f842a8648 data/hexcasting/recipes/dye_colorizer_black.json
c36caf44a941a4abc44a15141eba8fe634c76fb8 data/hexcasting/recipes/dye_colorizer_blue.json

View file

@ -12,50 +12,9 @@
"A": {
"item": "hexcasting:charged_amethyst"
},
"D": [
{
"item": "minecraft:music_disc_11"
},
{
"item": "minecraft:music_disc_13"
},
{
"item": "minecraft:music_disc_cat"
},
{
"item": "minecraft:music_disc_chirp"
},
{
"item": "minecraft:music_disc_far"
},
{
"item": "minecraft:music_disc_blocks"
},
{
"item": "minecraft:music_disc_mall"
},
{
"item": "minecraft:music_disc_mellohi"
},
{
"item": "minecraft:music_disc_otherside"
},
{
"item": "minecraft:music_disc_pigstep"
},
{
"item": "minecraft:music_disc_stal"
},
{
"item": "minecraft:music_disc_strad"
},
{
"item": "minecraft:music_disc_wait"
},
{
"item": "minecraft:music_disc_ward"
"D": {
"tag": "minecraft:music_discs"
}
]
},
"result": {
"item": "hexcasting:artifact"

View file

@ -4,12 +4,16 @@ import at.petrak.hexcasting.api.OperationResult
import at.petrak.hexcasting.api.Operator
import at.petrak.hexcasting.api.Operator.Companion.getChecked
import at.petrak.hexcasting.api.SpellDatum
import at.petrak.hexcasting.common.casting.CastException
import at.petrak.hexcasting.common.casting.CastingContext
import at.petrak.hexcasting.common.casting.CastingHarness
import at.petrak.hexcasting.common.casting.OperatorSideEffect
object OpForEach : Operator {
override fun operate(stack: MutableList<SpellDatum<*>>, ctx: CastingContext): OperationResult {
if (stack.size < 2)
throw CastException(CastException.Reason.NOT_ENOUGH_ARGS, 2, stack.size)
val instrs: List<SpellDatum<*>> = stack.getChecked(stack.lastIndex - 1)
val datums: List<SpellDatum<*>> = stack.getChecked(stack.lastIndex)
stack.removeLastOrNull()

View file

@ -94,7 +94,7 @@
"hexcasting.spell.hexcasting:zone_entity/monster": "Zone Dstln.: Monster",
"hexcasting.spell.hexcasting:zone_entity/item": "Zone Dstln.: Item",
"hexcasting.spell.hexcasting:zone_entity/player": "Zone Dstln.: Player",
"hexcasting.spell.hexcasting:zone_entity/not_living": "Zone Dstln.: Non-Living",
"hexcasting.spell.hexcasting:zone_entity/living": "Zone Dstln.: Living",
"hexcasting.spell.hexcasting:zone_entity/not_animal": "Zone Dstln.: Non-Animal",
"hexcasting.spell.hexcasting:zone_entity/not_monster": "Zone Dstln.: Non-Monster",
"hexcasting.spell.hexcasting:zone_entity/not_item": "Zone Dstln.: Non-Item",
@ -164,5 +164,313 @@
"hexcasting.spell.hexcasting:const/vec/pz": "Vector Reflection +Z",
"hexcasting.spell.hexcasting:const/vec/nx": "Vector Reflection -X",
"hexcasting.spell.hexcasting:const/vec/ny": "Vector Reflection -Y",
"hexcasting.spell.hexcasting:const/vec/nz": "Vector Reflection -Z"
"hexcasting.spell.hexcasting:const/vec/nz": "Vector Reflection -Z",
"hexcasting.entry.great_spells": "Great Spells",
"hexcasting.page.great_spells1": "The spells catalogued here are purported to be of legendary difficulty and power, scarcely recorded (and for good reason). It's probably just traditionalists' hogwash, though-- a pattern's a pattern. What could go wrong?",
"hexcasting.entry.spells": "Spells",
"hexcasting.page.spells1": "Patterns and actions that perform a magical effect on the world.",
"hexcasting.entry.basics": "Getting Started",
"hexcasting.page.basics1": "The practitioners of this art would cast their so-called Hexes by drawing strange patterns in the air with a staff-- or craft powerful magical items to do the casting for them. How might I do the same?",
"hexcasting.entry.casting": "Hex Casting",
"hexcasting.page.casting1": "I've started to understand how the old masters cast their Hexes! It's a bit complicated, but I'm sure I can figure it out. Let's see...",
"hexcasting.entry.greatwork": "The Great Work",
"hexcasting.page.greatwork1": "I have seen... so much. I have... experienced... annihilation and deconstruction and reconstruction. I have seen the atoms of the world screaming as they were inverted and subverted and demoted to energy. I have seen I have seen I have s$(k)get stick bugged lmao/$",
"hexcasting.entry.items": "Items",
"hexcasting.page.items1": "I devote this section to the magical and mysterious items I might encounter in my studies.$(br2)It seems like many of these items have uses when held alongside my staff. I suppose I will have to choose what goes in my other hand carefully.",
"hexcasting.entry.patterns": "Patterns",
"hexcasting.page.patterns1": "A list of all the patterns in the mod.",
"hexcasting.entry.couldnt_cast": "A Frusturation",
"hexcasting.page.couldnt_cast1": "ARGH! Why won't it let me cast the spell?!$(br2)The scroll I found rings with authenticity. I can feel it, right there. The pattern is true. The spell is RIGHT THERE on the other side of some membrane, and it tried to come over but it COULD NOT.",
"hexcasting.page.couldnt_cast2": "It felt like that barrier got a $(italic)little/$ weaker from the power banging against it from the other side, but it REFUSES to cross through. It's maddening. THIS is what my studies into the arcane give me? An impotence at my crowning moment?$(br2)I should take a deep breath. I should meditate on what I have learned, even if it wasn't very much...",
"hexcasting.page.couldnt_cast3": "I have discovered one thing. It seems ... I may have unlocked the ability, or perhaps curse, to cast spells using my health instead of $(item)amethyst/$, like I read about in those old legends. I'm not sure why I think this. It just... the truth is there, and I see it.$(br2)I even get a sense of scale; I would get approximately two $(item)Charged Amethyst/$'s worth of _media out of my health at its prime.",
"hexcasting.page.couldnt_cast4": "I shudder to think about it-- I've managed to keep my mind mostly intact so far --but there's a tenuous link here, between me and some other side. The walls have thinned from that trauma, and the glory is right there. I find myself wanting to try it.",
"hexcasting.entry.geodes": "Geodes",
"hexcasting.page.geodes1": "Aha! While mining deep underground, I found an enormous geode resonating with energy-- energy which pressed against my skull and my thoughts. This $(italic)must/$ be the place spoken about in legends where _media accumulates.$(br2)These amethyst crystals must contain a $(thing)convenient, solidified form of _Media/$.",
"hexcasting.page.geodes2": "It appears that, in addition to the $(item)Amethyst Shards/$ I usually see, these crystals can also drop $(item)Amethyst Dust/$ and $(item)Charged Amethyst Crystals/$. It looks like I'll have a better chance of finding $(item)Charged Amethyst Crystals/$ by using a Fortune pickaxe.",
"hexcasting.page.geodes3": "As I take the beauty of the geode in, I can feel connections flashing wildly in my mind. It's like the _media in the air is entering me, empowering me, elucidating me... It feels wonderful.$(br2)Finally, my study into the arcane is starting to make some sense!$(p)Let me reread those old legends again, now that I know what I'm looking at.",
"hexcasting.entry.media": "Media",
"hexcasting.page.media1": "_Media is a form of mental energy external to a mind. All living creatures generate trace amounts of _media when thinking about anything; after the thought is finished, the media is released into the environment.$(br2)The art of casting $(thing)Hexes/$ is all about manipulating _media to do your bidding.",
"hexcasting.page.media2": "_Media can exert influences on other media-- the strength and type of influence can be manipulated by drawing _media out into patterns.$(p)Scholars of the art used a concentrated blob of _media on the end of a stick: by waving it in the air in precise configurations, they were able to manipulate enough _media with enough precision to influence the world itself, in the form of a Hex.",
"hexcasting.page.media3": "Sadly, even a fully sentient being (like myself, presumably) can only generate miniscule amounts of _media. It would be quite impractical to try and use my own brainpower to cast Hexes.$(br2)But legend has it that there are underground deposits where _media slowly accumulates, growing into crystalline forms deep under the earth.$(p)If I could just find one of those...",
"hexcasting.entry.start_to_see": "WHAT DID I SEE",
"hexcasting.page.start_to_see1": "The texts weren't lying. Nature took its due.",
"hexcasting.page.start_to_see2": "That was... one of the worst things I've experienced. I offered my plan, and Nature smiled firmly at me and ripped away a part of myself alongside my payment. I feel lucky to have $(italic)survived/$, much less have sagacity enough to write this.$(br2)I should declare the matter closed, double-check my math before I cast any more _Hexes, and make sure I have the _media I need...",
"hexcasting.page.start_to_see3": "...But.$(br2)For the scarcest instant, that part of myself ... saw ... $(italic)something/$. A place, or a design perhaps-- I was abstract enough that there was no distinction. A ... membrane separating myself from a realm of raw thought and light and energy. I remember-- or, I don't remember, but I find myself thinking of --the barrier fuzzing at the edges just a little bit. I wanted $(italic)through./$",
"hexcasting.page.start_to_see4": "I know I shouldn't. It's dangerous. It's too dangerous. I'd have to bring myself within a hairsbreadth of Death.$(br2)But I'm SO CLOSE. $(italic)THIS/$ is the culmination of my art, the $(#54398a)Enlightenment/$ I've been seeking.$(br2)I need more. I need to see it again. What is the price of my mortal mind against immortal glory? Just once more... I need to see it. I WILL see it.",
"hexcasting.entry.101": "Hexing 101",
"hexcasting.page.1011": "Casting a _Hex is quite difficult-- no wonder this art was lost to time! I'll have to re-read my notes carefully.$(br2)I can start a _Hex by pressing $(k:use) with a $(item)Staff/$ in my hand-- this will cause a hexagonal grid of dots to appear in front of me. Then I can click and drag from dot to dot to draw patterns in the _media of the grid; finishing a pattern will run its corresponding action (more on that later).",
"hexcasting.page.1012": "Once I've drawn enough patterns to cast a spell, the grid will disappear as the _media I've stored up is released. I can also press Escape if I want to quit early, if I don't mind the chance of a small mishap. (It seems that the more _media I've built up, the more likely I'll meet misfortune.)$(br2)So how do patterns work? In short:$(li)$(italic)Patterns/$ will execute...$(li)$(italic)Actions/$, which manipulate...$(li)$(italic)The Stack/$, which is a list of...$(li)$(italic)Iotas/$, which are simply units of information.",
"hexcasting.page.1013": "First, $(thing)patterns/$. These are essential-- they're what I use to manipulate the _media around me. Certain patterns, when drawn, will cause $(thing)actions/$ to happen. Actions are what actually $(italic)do/$ the magic; all patterns influence _media in particular ways, and when those influences end up doing something useful, we call it an action.$(br2)_Media can be fickle: if I draw an invalid pattern, I'll get some garbage result somewhere on my stack (read on...)",
"hexcasting.page.1014header": "An Example",
"hexcasting.page.1014": "It's interesting to note that the $(italic)rotation/$ of a pattern doesn't seem to matter at all. These two patterns both perform the $(l:patterns/basics#hexcasting:get_caster)$(action)Mind's Reflection/$, for example.",
"hexcasting.page.1015": "A _Hex is cast by drawing (valid) actions in sequence. Each action might do one of a few things:$(li)Gather some information about the environment, leaving it on the top of the stack;$(li)manipulate the info gathered (e.g. adding two numbers); or$(li)perform some magical effect, like summoning lightning or an explosion. (These actions are called \"spells.\")$(p)When I start casting a _Hex, it creates an empty stack. Actions manipulate the top of that stack.",
"hexcasting.page.1016": "For example, the $(l:patterns/basics#hexcasting:get_caster)$(action)Mind's Reflection/$ will create an iota representing $(italic)me/$, the caster, and add it to the top of the stack. The $(l:patterns/basics#hexcasting:get_entity_pos)$(action)Compass Purification/$ will take the iota at the top the stack, if it represents an entity, and transform it into an iota representing that entity's location.$(br2)So, drawing those patterns in that order would result in an iota on the stack representing my position.",
"hexcasting.page.1017": "$(thing)Iotas/$ can represent things like myself or my position, but there are several other types I can manipulate with $(thing)Actions$(0). Here's a comprehensive list:$(li)Numbers (which some legends called \"doubles\");$(li)Vectors, a collection of three numbers representing a position, movement, or direction in the world;",
"hexcasting.page.1018": "$(li)Entities, like myself, chickens, and minecarts;$(li)Influences, peculiar types of iota that seem to represent abstract ideas;$(li)Patterns themselves, used for crafting magic items and truly mind-boggling feats like $(italic)spells that cast other spells/$; and$(li)A list of several of the above, gathered into a single iota.",
"hexcasting.page.1019": "Of course, there's no such thing as a free lunch. All spells, and certain other actions, require _media as payment.$(br2)The best I can figure, a _Hex is a little bit like a plan of action presented to Nature-- in this analogy, the _media is used to provide the arguments to back it up, so Nature will accept your plan and carry it out.",
"hexcasting.page.10110": "That aside, it doesn't seem like anyone has done much research on exactly how $(italic)much/$ any particular piece of amethyst is valued. The best I can tell, an $(item)Amethyst Shard/$ is worth about five pieces of $(item)Amethyst Dust/$, and a $(item)Charged Amethyst Crystal/$ is worth about ten.$(br2)Strangely enough, it seems like no other form of amethyst is suitable to be used in the casting of a _Hex. I suspect that whole blocks or crystals are too solid to be easily unraveled into _media.",
"hexcasting.page.10111": "It's also worth noting that each action will consume the _media it needs immediately, rather than all at once when the Hex finishes. Also, an action will always consume entire items-- an action that only requires one $(item)Amethyst Dust/$'s worth of _media will consume an entire $(item)Charged Amethyst Crystal/$, if that's all that's present in my inventory.$(br2)Thus, it might be a good idea to bring dust for spellcasting too-- waste not, want not...",
"hexcasting.page.10112": "I should also be careful to make sure I actually have enough Amethyst in my inventory-- if not, it seems Nature is happy to use my own mind as payment instead. The old texts describe the feeling as awful but strangely euphoric, \"[...] an effervescent dissolution into light and energy...\"$(br)Perhaps this is why all the old practitioners of the art went mad. I can't imagine burning pieces of my mind for power is $(italic)healthy/$.",
"hexcasting.page.10113": "Or, it $(italic) should/$ be like that. In my experiments, I've never managed to do it; if I run out of _media, the spell will simply fail to cast. It feels as if there's some sort of ... barrier in my mind that appears when I try. $(br2)It would be interesting to get to the bottom of the conundrum, but for now I suppose it keeps me safe.",
"hexcasting.page.10114": "I have also found an amusing tidbit on why so many practitioners of magic in general seem to go mad, which I may like as some light and flavorful reading not canonical to my world.$(br2)$(italic)Content Warning: some body horror and suggestive elements./$",
"hexcasting.page.10114_link_text": "Goblin Punch",
"hexcasting.page.10115": "Finally, it seems spells have a maximum range of influence, about 32 blocks from my position. Trying to affect anything outside of that will cause the spell to fail.",
"hexcasting.entry.influences": "Influences",
"hexcasting.page.influences1": "Influences are ... strange, to say the least. Whereas most iotas seem to represent something about the world, influences represent ... something more abstract and formless.$(br2)For example, one influence I've named Null seems to represent nothing at all. It's created when there isn't a suitable answer to a question asked, such as the Entity Distillation on a block with no entity there.",
"hexcasting.page.influences2": "In addition, I've discovered a curious triplet of influences I've named Consideration, Introspection, and Retrospection. I can use these to add patterns to my stack as iotas, instead of matching them to actions. $(l:casting/patterns_as_iotas)My notes on the subject are here/$.",
"hexcasting.page.influences3": "Finally, there is an influence, or perhaps infinite family of influences, that seem to just be a tangled mess of _media. I've named it $(action)Garbage/$, as it is completely useless. It appears somewhere in my stack when I drawn an invalid pattern, and viewing it through a $(l:items/lens)$(item)Scrying Lens/$ just gives a nonsense jumble.",
"hexcasting.entry.mishaps": "Mishaps",
"hexcasting.page.mishaps1": "Unfortunately, I am not a perfect being. I make mistakes from time to time, including when casting _Hexes. For example, I might misdraw a pattern, or try an invoke an action with the wrong types of iotas. And usually, Nature does not look kindly on my mistakes, causing what is called a $(italic)mishap/$.",
"hexcasting.page.mishaps2": "I expected some kind of horrible recompense for mishaps, some kind of alchemical disaster or virile illness as I have heard troubled the Thaumaturges of the past... but instead, I just get a cryptic (if helpful) message in my chat. How convenient!$(br2)However, a nagging feeling at the back of my mind tells me I should expect worse consequences once the \"mod updates,\" whatever that means. Perhaps I am not as immune to the madness that seems to afflict practitioners of this art as I thought.",
"hexcasting.entry.naming": "Naming Actions",
"hexcasting.page.naming1": "The names given to actions by the ancients were certainly peculiar, but I think there's a certain kind of logic to them.$(br2)There seem to be certain groups of actions with common names, named for the number of iotas they remove from and add to the stack.",
"hexcasting.page.naming2": "$(li)A $(thing)Reflection/$ pops nothing and pushes some number.$(li)A $(thing)Purification/$ pops one and pushes one.$(li)A $(thing)Distillation/$ pops two and pushes one.$(li)An $(thing)Exaltation/$ pops three or more and pushes one.$(li)A $(thing)Decomposition/$ pops one argument and pushes two.$(li)A $(thing)Disintegration/$ pops one and pushes three or more.$(li)Finally, a $(thing)Gambit/$ pushes or pops some other number.",
"hexcasting.page.naming3": "Spells seem to be exempt from this nomenclature and are more or less named after what they do-- after all, why call it a $(thing)Demoman's Gambit/$ when you could just say $(thing)Explosion/$?",
"hexcasting.entry.patterns_as_iotas": "Patterns as Iotas",
"hexcasting.page.patterns_as_iotas1": "One of the many peculiarities of the art is that $(italic)patterns themselves/$ can act as iotas, and be put onto my stack when casting.$(br2)This raises a fairly obvious question: how do I express them? If I were to simply draw a pattern, how would I inform Nature of my intent to have it matched to an action instead of adding it to my stack as an iota?",
"hexcasting.page.patterns_as_iotas2": "Fortunately, Nature has provided me with a set of $(l:casting/influences)influences/$ that I can use to work with patterns directly.$(br2)In short, $(action)Consideration/$ lets me add one pattern to the stack, and $(action)Introspection/$ and $(action)Retrospection/$ let me add a whole list.",
"hexcasting.page.patterns_as_iotas3": "To use $(action)Consideration/$, I draw it, then another arbitrary pattern. That second pattern is added to the stack.",
"hexcasting.page.patterns_as_iotas4": "I may find it helpful to think of this as \"escaping\" the pattern onto the stack, if I happen to be familiar with the term from computer science.$(br2)To be honest, I haven't found too much use for this pattern yet, but I imagine it could be helpful with advanced _Hexes casting other _Hexes.",
"hexcasting.page.patterns_as_iotas5": "Drawing $(action)Introspection/$ makes my drawing of patterns act differently, for a time. Until I draw $(action)Retrospection/$, any pattern I draw is saved to a list. Then, when I draw $(action)Retrospection/$, the list is pushed to the stack as a list iota.",
"hexcasting.page.patterns_as_iotas6": "If I draw another $(action)Introspection/$, it will still be saved, but I'll then have to draw $(italic)two/$ $(action)Retrospection/$s to get back to normal casting.",
"hexcasting.page.patterns_as_iotas7": "Also, I can escape the special behavior of $(action)Intro/Retrospection/$ by drawing a $(action)Consideration/$ before them, which will simply add them to the list without affecting the number of each I need to draw to return to normal.$(br2)If I draw two $(action)Consideration/$s in a row while introspecting, it will add the second pattern to the list.",
"hexcasting.entry.stack": "Stacks",
"hexcasting.page.stack1": "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 a hold of it.",
"hexcasting.page.stack2": "Because a stack is so simple, there's only so many things you can do with it:$(li)$(italic)Adding something to it/$, known formally as pushing,$(li)$(italic)Removing the last added element/$, known as popping, or$(li)$(italic)Examining or modifying the last added element/$, known as peeking.$(br)We call the last-added element the \"top\" of the stack, in accordance with the dinner plate analogy.$(p)As an example, if we push 1 to a stack, then push 2, then pop, the top of the stack is now 1.",
"hexcasting.page.stack3": "Actions are (on the most part) restricted to interacting with the casting stack in these ways. They will pop some iotas they're interested in (known as \"arguments\" or \"parameters\"), process them, and push some number of results.$(br2)Of course, some actions (e.g. the $(l:patterns/basics#hexcasting:get_caster)$(action)Mind's Reflection/$) might pop no arguments, and some actions (particularly spells) might push nothing afterwards.",
"hexcasting.page.stack4": "Even more complicated actions can be expressed in terms of pushing, popping, and peeking. For example, the $(l:patterns/stackmanip#hexcasting:swap)$(action)Jester's Gambit/$ swaps the top two items of the stack. This can be thought of as popping two items and pushing them in opposite order. For another, $(l:patterns/stackmanip#hexcasting:duplicate)$(action)Gemini Decomposition/$ duplicates the top of the stack-- in other words, it peeks the stack and pushes a copy of what it finds.",
"hexcasting.entry.vectors": "A Primer on Vectors",
"hexcasting.page.vectors1": "It seems I will need to be adroit with vectors if I am to get anywhere in my studies. I have compiled some resources here on vectors if I find I do not know how to work with them.$(br2)First off, an enlightening video on the topic.",
"hexcasting.page.vectors1_link_text": "3blue1brown",
"hexcasting.page.vectors2": "Additionally, it seems that the mages who manipulated $(thing)Psi energy/$ (the so-called \"spellslingers\"), despite their poor naming sense, had some quite-effective lessons on vectors to teach their acolytes. I've taken the liberty of linking to one of their texts on the next page.$(br2)They seem to have used different language for their spellcasting:$(li)A \"Spell Piece\" was their name for an action;$(li)a \"Trick\" was their name for a spell; and$(li)an \"Operator\" was their name for a non-spell action.",
"hexcasting.page.vectors3": "Link here.",
"hexcasting.page.vectors3_link_text": "Psi Codex",
"hexcasting.entry.the_work": "The Work",
"hexcasting.page.the_work1": "I have seen so many things. Unspeakable things. Innumerable things. I could write three words and turn my mind inside-out and smear my brains across the shadowed walls of my skull to decay into fluff and nothing.",
"hexcasting.page.the_work2": "I have seen staccato-needle patterns and acrid-etched schematics written to the inside of my eyelids. They smolder there, dancing, taunting, aching. I am possessed by an intense need to draw them, create them, form them, liberate them from the gluey shackles of my mortal mind, present them in their Glory to the world so all can see them. All will see. All will see.",
"hexcasting.entry.amethyst": "Amethyst",
"hexcasting.page.amethyst1": "It seems that I'll find three different forms of amethyst when breaking a crystal inside a geode. The smallest denomination seems to be a small pile of shimmering dust, worth a relatively small amount of _media.",
"hexcasting.page.amethyst2": "The second is a whole shard of amethyst, of the type non-Hexers might be used to. This has about as much _media inside as five $(item)Amethyst Dust/$s.",
"hexcasting.page.amethyst3": "Finally, I'll rarely find a large crystal crackling with energy. This has about as much _media inside as ten units of $(item)Amethyst Dust/$s (or two $(item)Amethyst Shard/$s).",
"hexcasting.page.amethyst4": "$(italic)The old man sighed and raised a hand toward the fire. He unlocked a part of his brain that held the memories of the mountains around them. He pulled the energies from those lands, as he learned to do in Terisia City with Drafna, Hurkyl, the archimandrite, and the other mages of the Ivory Towers. He concentrated, and the flames writhed as they rose from the logs, twisting upon themselves until they finally formed a soft smile./$",
"hexcasting.entry.focus": "Focus",
"hexcasting.page.focus1": "A $(item)Focus/$ can store a single iota.$(br2)When I craft it, it holds the Null influence by default. Using the $(action)$(l:patterns/meta#OpWrite)Scribe's Gambit/$ while holding a $(item)Focus/$ in my other hand will remove the top of the stack and save it into the $(item)Focus/$. Using the $(action)$(l:patterns/meta#OpRead)Scribe's Reflection/$ will copy whatever iota's in the $(item)Focus/$ and add it to the stack.",
"hexcasting.page.focus2": "$(italic)Poison apples, poison worms./$",
"hexcasting.page.focus3": "It occurs to me that I could conceivably store a whole list of patterns in a $(item)Focus/$, then recall them and evaluate them with $(l:patterns/meta#OpEval)$(action)Hermes' Gambit/$. This way I can cast complex spells, or parts of spells, without having to draw them over and over.$(br2)I could use this like a slightly less convenient $(l:items/hexcasting#artifact)$(item)Artifact/$, but I think I could get much better dividends by putting common \"phrases\" in a $(item)Focus/$, like the patterns for figuring out where I'm looking.",
"hexcasting.page.focus4": "Also, if I store an entity in a $(item)Focus/$ and try to recall it after the referenced entity has died or otherwise disappeared, the $(action)Scribe's Reflection/$ will add Null to the stack instead.",
"hexcasting.entry.hexcasting": "Hexcasting Items",
"hexcasting.page.hexcasting1": "Although the flexibility that casting _Hexes \"on the go\" with my $(l:items/staff)$(item)Staff/$ is quite helpful, it's a huge pain to have to wave it around repeatedly just to accomplish a common task. If I could save a common spell for later reuse, it would simplify things a lot-- and allow me to share my _Hexes with friends, too.",
"hexcasting.page.hexcasting2": "To do this, I can craft one of three types of magic items: $(item)Cypher/$s, $(item)Trinket/$s, or $(item)Artifact/$s. All of them hold the patterns of a given _Hex inside, along with a small battery containing _media.$(br2)Simply holding one and pressing $(thing)$(k:use)/$ will cast the patterns inside, as if the holder had cast them out of a staff, using its internal battery.",
"hexcasting.page.hexcasting3": "Each item has its own quirks:$(br2)$(item)Cypher/$s are single-use, destroyed after the _Hex is cast;$(br2)$(item)Trinket/$s can be cast as much as the holder likes, as long as there's enough _media left, but become useless afterwards;",
"hexcasting.page.hexcasting4": "$(item)Artifact/$s are the most powerful of all-- after their _media is depleted, they can use $(l:items/amethyst)$(item)Amethyst/$ from the holder's inventory to pay for the _Hex, just as I do when casting with a $(item)Staff/$. Of course, this also means the spell might consume their mind if there's not enough $(item)Amethyst/$.$(br2)Once I've made an empty magic item in a mundane crafting bench, I infuse the _Hex into it using (what else but) a spell appropriate to the item. $(l:patterns/spells/hexcasting)I've catalogued the patterns here./$",
"hexcasting.page.hexcasting5": "Each infusion spell requires an entity and a list of patterns on the stack. The entity must be a _media-holding item entity (i.e. amethyst crystals, dropped on the ground); the entity is consumed and forms the battery.$(br2)Usefully, it seems that the _media in the battery is not consumed in chunks as it is when casting with a $(item)Staff/$-- rather, the _media \"melts down\" into one continuous pool. Thus, if I store a _Hex that only costs one $(item)Amethyst Dust/$'s worth of mana, a $(item)Charged Crystal/$ used as the battery will allow me to cast it 10 times.",
"hexcasting.page.hexcasting6": "$(italic)We have a saying in our field: \"Magic isn't\". It doesn't \"just work,\" it doesn't respond to your thoughts, you can't throw fireballs or create a roast dinner from thin air or turn a bunch of muggers into frogs and snails./$",
"hexcasting.entry.lens": "Scrying Lens",
"hexcasting.page.lens1": "This curiosity is in a strange, transitory state. Not too long ago, it allowed me to see the iotas on my stack, but now it seems I have that ability without the assistance of a lens.$(br2)I best keep my old ones around, though-- I have the feeling they will have use in the future.",
"hexcasting.page.lens2": "$(italic)You must learn... to see what you are looking at./$",
"hexcasting.entry.pigments": "Pigments",
"hexcasting.page.pigments1": "Although the names of the old practitioners of my art were lost to time, they were often known for a color, emblematic of them and their spells. It seems a special kind of pigment, offered to Nature in the right way, would \"[...] paint one's thoughts in a manner pleasing to Nature, inducing a miraculous change in color.\"",
"hexcasting.page.pigments2": "I'm not certain on the specifics of how it works, but I believe I have isolated the formulae for many different colors of pigments. To use one, I hold it in my other hand while casting $(l:patterns/spells/colorize)$(action)Internalize Pigment/$, which will consume the pigment and mark my mind with that color.$(br2)The pigments seem to affect the color of the spare media coming out of a staff when I cast a _Hex, as well as my $(l:patterns/sentinels)$(thing)Sentinel/$.",
"hexcasting.page.pigments3header": "Chromatic Colorizers",
"hexcasting.page.pigments3": "Pigments all the colors of the rainbow.",
"hexcasting.page.pigments4": "And finally, a pigment with a color wholly unique to me.$(br2)$(italic)And all the colors I am inside have not been invented yet./$",
"hexcasting.entry.spellbook": "Spellbook",
"hexcasting.page.spellbook1": "A $(item)Spellbook/$ is the culmination of my art-- it acts like an entire library of $(l:items/focus)$(item)Foci/$.$(br2)Each page can hold a single iota, and I can select the active page (the page that iotas are saved to and copied from) by sneak-scrolling while holding it, or simply holding it in my off-hand and scrolling while casting a _Hex.",
"hexcasting.page.spellbook2": "$(italic)Wizards love words. Most of them read a great deal, and indeed one strong sign of a potential wizard is the inability to get to sleep without reading something first.",
"hexcasting.entry.staff": "Staff",
"hexcasting.page.staff1": "A $(item)Staff/$ is my entry point into casting all _Hexes, large and small. By holding it and pressing $(thing)$(k:use)/$, I begin casting a _Hex; then I can click and drag to draw patterns.$(br2)It's little more than a chunk of _media on the end of a stick; that's all that's needed, after all.",
"hexcasting.page.staff2": "$(italic)Don't fight; flame, light; ignite; burn bright./$",
"hexcasting.page.create_lava1": "Summon a block of lava or insert a bucket's worth into a block at the given position. Costs about one $(item)Charged Amethyst/$.",
"hexcasting.page.flight1": "The power of flight! I have wrestled Nature to its knees. But Nature is vengeful, and itches for me to break its contract so it may break my shins.",
"hexcasting.page.flight2": "The entity (which must be a player) will be endowed with flight. The first number is the number of seconds they may fly for, and the second number is the radius of the zone they may fly in. If the recipient exits that zone, or their timer runs out while midair, the gravity that they spurned will get its revenge. Painfully.$(br2)It costs approximately 1 $(item)Amethyst Dust/$ multiplied by the radius, per second of flight.",
"hexcasting.page.greater_sentinel1": "Summon a greater version of my $(l:patterns/sentinels)$(thing)Sentinel/$. Costs about 2 $(item)Amethyst Dust/$s.",
"hexcasting.page.greater_sentinel2": "The stronger sentinel acts like the normal one I can summon without the use of a Great Spell, if a little more visually interesting. However, the range in which my spells can work is extended to a small region around my greater sentinel, about 16 blocks. In other words, no matter where in the world I am, I can interact with things around my sentinel (the mysterious forces of chunkloading notwithstanding).",
"hexcasting.page.teleport1": "Far more powerful than $(l:patterns/spells/basic#OpBlink)$(action)Blink/$, this spell lets me teleport nearly anywhere in the entire world! There does seem to be a limit, but it is $(italic)much/$ greater than the normal radius of influence I am used to.",
"hexcasting.page.teleport2": "The entity will be teleported by the given vector, which is an offset from its given position. No matter the distance, it always seems to cost about ten $(item)Charged Crystal/$s.$(br2)The transference is not perfect, and it seems when teleporting something as complex as a player, their inventory doesn't $(italic)quite/$ stay attached.",
"hexcasting.entry.weather_manip": "Weather Manipulation",
"hexcasting.page.weather_manip1": "I command the heavens! This spell will summon a bolt of lightning to strike the earth where I direct it. Costs about 3 $(item)Amethyst Shard/$s.",
"hexcasting.page.weather_manip2": "I control the clouds! This spell will summon rain across the world I cast it upon. Costs about 2 $(item)Amethyst Shard/$s. Does nothing if it is already raining.",
"hexcasting.page.weather_manip3": "A counterpart to summoning rain. This spell will dispel rain across the world I cast it upon. Costs about 1 $(item)Amethyst Shard/$. Does nothing if the skies are already clear.",
"hexcasting.entry.zeniths": "Zeniths",
"hexcasting.page.zeniths1": "This family of spells all impart a positive potion effect upon an entity.$(br2)See the $(l:patterns/spells/nadirs)$(action)Nadirs/$ for more information.",
"hexcasting.page.zeniths2": "Bestows regeneration. Base cost is one $(item)Amethyst Dust/$ per second.",
"hexcasting.page.zeniths3": "Bestows night vision. Base cost is one $(item)Amethyst Dust/$ per 5 seconds.",
"hexcasting.page.zeniths4": "Bestows absorption. Base cost is one $(item)Amethyst Dust/$ per second.",
"hexcasting.page.zeniths5": "Bestows haste. Base cost is one $(item)Amethyst Dust/$ per 3 seconds.",
"hexcasting.page.zeniths6": "Bestows strength. Base cost is one $(item)Amethyst Dust/$ per 3 seconds.",
"hexcasting.entry.basic_spell": "Basic Spells",
"hexcasting.page.basic_spell1": "Remove a number and vector from the stack, then create an explosion at the given location with the given power.",
"hexcasting.page.basic_spell2": "A power of 3 is about as much as a Creeper's blast; 4 is about as much as a TNT blast. Nature refuses to give me a blast of more than 10 power, though.$(br2)Costs about one $(item)Amethyst Shard/$, plus an extra $(item)Amethyst Shard/$ per point of explosion power.",
"hexcasting.page.basic_spell3": "Remove a number and vector from the stack, then create a fiery explosion at the given location with the given power.",
"hexcasting.page.basic_spell4": "Costs three $(item)Amethyst Shards/$, plus about one extra $(item)Amethyst Shard/$ per point of explosion power. Otherwise, the same as $(l:hexcasting:patterns/spells/basic#OpExplode)$(action)Explosion/$, except with fire.",
"hexcasting.page.basic_spell5": "Remove an entity and direction from the stack, then give a push to the given entity in the given direction. The strength of the impulse is determined by the length of the vector.$(br)Costs units of $(item)Amethyst Dust/$ proportional to the square of the length of the vector; thus a push vector of length 5 would consume five $(item)Amethyst Shards$(0) or equivalent.",
"hexcasting.page.basic_spell6": "Remove an entity and length from the stack, then teleport the given entity along its look vector by the given length.$(br)Costs about 1 $(item)Amethyst Shard/$s times the the distance teleported.",
"hexcasting.entry.blockworks": "Blockworks",
"hexcasting.page.blockworks1": "Remove a location from the stack, then pick a block item and place it at the given location.$(br)Costs about 1 $(item)Amethyst Dust/$.",
"hexcasting.page.blockworks2": "Remove a location from the stack, then break the block at the given location. This spell can break nearly anything a Diamond Pickaxe can break.$(br)Costs about 3 $(item)Amethyst Dust/$s.",
"hexcasting.page.blockworks3": "Summon a block of water or insert a bucket's worth into a block at the given position. Costs about one $(item)Amethyst Dust/$.",
"hexcasting.page.blockworks4": "Destroy a great deal of water around the given position. Costs about two $(item)Amethyst Crystal/$s.",
"hexcasting.page.blockworks5": "Conjure a barrier, using my colorizer. Costs about one $(item)Amethyst Dust/$.",
"hexcasting.page.blockworks6": "Conjure a magical light, using my colorizer. Costs about one $(item)Amethyst Dust/$.",
"hexcasting.page.blockworks7": "Encourage a plant or sapling at the target position to grow, as if $(item)Bonemeal/$ was applied. Costs about one $(item)Amethyst Dust/$.",
"hexcasting.page.colorize1": "I must be holding a $(item)Pigment/$ in my other hand to cast this spell. When I do, it will consume the dye and permanently change my internal pigment (at least, until I cast the spell again). Costs about 1 $(item)Amethyst Dust/$.",
"hexcasting.entry.hexcasting_spell": "Crafting Hexcasting Items",
"hexcasting.page.hexcasting_spell1": "These three spells each create an item that casts a _Hex.$(br)They all require me to hold the empty item in my off-hand, and require two things: the list of patterns to be cast, and an entity representing a dropped stack of $(item)Amethyst/$ to form the item's battery.$(br2)See $(l:items/hexcasting)this entry/$ for more information.",
"hexcasting.page.hexcasting_spell2": "Costs about one $(item)Charged Amethyst/$.",
"hexcasting.page.hexcasting_spell3": "Costs about five $(item)Charged Amethyst/$s.",
"hexcasting.page.hexcasting_spell4": "Costs about ten $(item)Charged Amethyst/$s.",
"hexcasting.page.hexcasting_spell5": "Recharge a _media-containing item in my other hand. Costs about one $(item)Charged Amethyst/$.",
"hexcasting.page.hexcasting_spell6": "This spell is cast in a similar method to the crafting spells; an entity representing a dropped stack of $(item)Amethyst/$ is provided, and recharges the _media battery of the item in my other hand.$(br2)This spell $(italic)cannot/$ recharge the item farther than its original battery size.",
"hexcasting.page.hexcasting_spell7": "Erase a hex-containing item in my other hand. Costs about one $(item)Amethyst Dust/$.",
"hexcasting.page.hexcasting_spell8": "This spell voids all media stored inside the item I am erasing. The pressure inside the item from the stored media is incredible. It's all the spell can do to safely disarm it; to try and recover it would be unthinkable.",
"hexcasting.entry.itempicking": "Working with Items",
"hexcasting.page.itempicking1": "Certain spells, such as $(l:hexcasting:patterns/spells/blockworks#OpPlaceBlock)$(action)Place Block/$, will consume additional items from my inventory. When this happens, the spell will first look for the item to use, and then draw from all such items in my inventory.$(br2)This process is called \"picking an item.\"",
"hexcasting.page.itempicking2": "More specifically:$(li)First, the spell will search for the first valid item in my hotbar to the $(italic)right of my staff/$, wrapping around at the right-hand side, and starting at the first slot if my staff is in my off-hand.$(li)Second, the spell will draw that item from as $(italic)far back in my inventory/$ as possible, prioritizing the main inventory over the hotbar.",
"hexcasting.page.itempicking3": "This way, I can keep a \"chooser\" item on my hotbar to tell the spell what to use, and fill the rest of my inventory with that item to keep the spell well-stocked.",
"hexcasting.entry.nadirs": "Nadirs",
"hexcasting.page.nadirs1": "This family of spells all impart a negative potion effect upon an entity. They all take an entity, the recipient, and one or two numbers, the first being the duration and the second, if present, being the potency (starting at 1).$(br2)Each one has a \"base cost;\" the actual cost is equal to that base cost, multiplied by the potency.",
"hexcasting.page.nadirs2": "According to certain legends, these spells and their sisters, the $(l:patterns/great_spells/zeniths)$(action)Zeniths/$, were \"[...] inspired by a world near to this one, where powerful wizards would gather magic from the land and hold duels to the death. Unfortunately, much was lost in the translation ...\"$(br2)Perhaps that is the reason for their peculiar names.",
"hexcasting.page.nadirs3": "Bestows weakness. Base cost is one $(item)Amethyst Dust/$ per 10 seconds.",
"hexcasting.page.nadirs4": "Bestows levitation. Base cost is one $(item)Amethyst Dust/$ per 5 seconds.",
"hexcasting.page.nadirs5": "Bestows withering. Base cost is one $(item)Amethyst Dust/$ per second.",
"hexcasting.page.nadirs6": "Bestows poison. Base cost is one $(item)Amethyst Dust/$ per 3 seconds.",
"hexcasting.page.nadirs7": "Bestows slowness. Base cost is one $(item)Amethyst Dust/$ per 5 seconds.",
"hexcasting.entry.basics_pattern": "Basic Patterns",
"hexcasting.page.basics_pattern1": "Adds me, the caster, to the stack.",
"hexcasting.page.basics_pattern2": "Transforms an entity on the stack into its position.",
"hexcasting.page.basics_pattern3": "Transforms an entity on the stack into the direction it's looking in, as a unit vector.",
"hexcasting.page.basics_pattern4": "Displays the top iota of the stack to me.",
"hexcasting.page.basics_pattern5": "Combines two vectors (a position and a direction) into the answer to the question: If I stood at the position and looked in the direction, what block would I be looking at?",
"hexcasting.page.basics_pattern6": "If it doesn't hit anything, the vectors will combine into Null.$(br2)For example, casting this with my own position and look vectors will return the coordinates of the block I am looking at.",
"hexcasting.page.basics_pattern7": "Like $(l:patterns/basics#hexcasting:raycast)$(action)Archer's Distillation$(/l), but instead returns a vector representing the answer to the question: Which $(italic)side/$ of the block am I looking at?",
"hexcasting.page.basics_pattern8": "More specifically, it returns the $(italic)normal vector/$ of the face hit, or a vector with length 1 pointing perpendicular to the face.$(li)If I am looking at a floor, it will return (0, 1, 0).$(li)If I am looking at the south face of a block, it will return (0, 0, 1).$(br)",
"hexcasting.page.basics_pattern9": "Like $(l:patterns/basics#hexcasting:raycast)$(action)Archer's Distillation$(/l), but instead returns the $(italic)entity/$ I am looking at.",
"hexcasting.entry.consts": "Constants",
"hexcasting.page.consts1": "The left-hand counter-clockwise pattern adds (1, 0, 0) to the stack; the right-hand clockwise pattern adds (-1, 0, 0).",
"hexcasting.page.consts2": "The left-hand counter-clockwise pattern adds (0, 1, 0) to the stack; the right-hand clockwise pattern adds (0, -1, 0).",
"hexcasting.page.consts3": "The left-hand counter-clockwise pattern adds (0, 0, 1); the right-hand clockwise pattern adds (0, 0, -1).",
"hexcasting.page.consts4": "Adds the Null influence to the top of the stack.",
"hexcasting.entry.entities": "Entities",
"hexcasting.page.entities1": "Transform the position on the stack into the entity at that location (or null if there isn't one).",
"hexcasting.page.entities2": "Transform the position on the stack into the animal at that location (or null if there isn't one).",
"hexcasting.page.entities3": "Transform the position on the stack into the monster at that location (or null if there isn't one).",
"hexcasting.page.entities4": "Transform the position on the stack into the dropped item at that location (or null if there isn't one).",
"hexcasting.page.entities5": "Transform the position on the stack into the player at that location (or null if there isn't one).",
"hexcasting.page.entities6": "Transform the position on the stack into the living creature at that location (or null if there isn't one).",
"hexcasting.page.entities7": "$(br)Take a position and maximum distance on the stack, and combine them into a list of animals near the position.",
"hexcasting.page.entities8": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-animal entities near the position.",
"hexcasting.page.entities9": "$(br)Take a position and maximum distance on the stack, and combine them into a list of monsters near the position.",
"hexcasting.page.entities10": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-monster entities near the position.",
"hexcasting.page.entities11": "$(br)Take a position and maximum distance on the stack, and combine them into a list of dropped items near the position.",
"hexcasting.page.entities12": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-dropped-item entities near the position.",
"hexcasting.page.entities13": "$(br)Take a position and maximum distance on the stack, and combine them into a list of players near the position.",
"hexcasting.page.entities14": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-player characters near the position.",
"hexcasting.page.entities15": "$(br)Take a position and maximum distance on the stack, and combine them into a list of living creatures near the position.",
"hexcasting.page.entities16": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-living entities near the position.",
"hexcasting.page.entities17": "$(br)Take a position and maximum distance on the stack, and combine them into a list of all entities near the position.",
"hexcasting.entry.lists": "List Manipulation",
"hexcasting.page.lists1": "Remove the number at the top of the stack, then replace the list at the top with the nth element of that list (where n is the number you removed). Replaces the list with Null if the number is out of bounds.",
"hexcasting.page.lists2": "Remove the top of the stack, then add it to the end of the list at the top of the stack.",
"hexcasting.page.lists3": "Remove the list at the top of the stack, then add all its elements to the end of the list at the top of the stack.",
"hexcasting.entry.math": "Math",
"hexcasting.page.math1": "Many mathematical operations function on both numbers and vectors. Such arguments are written as \"num/vec\".",
"hexcasting.page.math2": "Perform addition.",
"hexcasting.page.math3": "As such:$(li)With two numbers at the top of the stack, combines them into their sum.$(li)With a number and a vector, removes the number from the stack and adds it to each element of the vector.$(li)With two vectors, combines them by summing corresponding components into a new vector (i.e. [1, 2, 3] + [0, 4, -1] = [1, 6, 2]).",
"hexcasting.page.math4": "Perform subtraction.",
"hexcasting.page.math5": "As such:$(li)With two numbers at the top of the stack, combines them into their difference.$(li)With a number and a vector, removes the number from the stack and subtracts it from each element of the vector.$(li)With two vectors, combines them by subtracting each component.$(br2)In all cases, the top of the stack or its components are subtracted $(italic)from/$ the second-from-the-top.",
"hexcasting.page.math6": "Perform multiplication or the dot product.",
"hexcasting.page.math7": "As such:$(li)With two numbers, combines them into their product.$(li)With a number and a vector, removes the number from the stack and multiplies each component of the vector by that number.$(li)With two vectors, combines them into their $(l:https://www.mathsisfun.com/algebra/vectors-dot-product.html)dot product/$.",
"hexcasting.page.math8": "Perform division or the cross product.",
"hexcasting.page.math9": "As such:$(li)With two numbers, combines them into their quotient.$(li)With a number and a vector, removes the number and divides it by each element of the vector.$(li)With two vectors, combines them into their $(l:https://www.mathsisfun.com/algebra/vectors-cross-product.html)cross product/$.$(br2)In the first and second cases, the top of the stack or its components comprise the dividend, and the second-from-the-top or its components are the divisor.$(p)WARNING: Never divide by zero!",
"hexcasting.page.math10": "Compute the absolute value or length.",
"hexcasting.page.math11": "Replaces a number with its absolute value, or a vector with its length.",
"hexcasting.page.math12": "Perform exponentiation or vector projection.",
"hexcasting.page.math13": "$(li)With two numbers, combines them by raising the first to the power of the second.$(li)With a number and a vector, removes the number and raises each component of the vector to the number's power.$(li)With two vectors, combines them into the $(l:https://en.wikipedia.org/wiki/Vector_projection)vector projection/$ of the top of the stack onto the second-from-the-top.$(br2)In the first and second cases, the first argument or its components are the base, and the second argument or its components are the exponent.",
"hexcasting.page.math14": "Combine three numbers at the top of the stack into a vector's X, Y, and Z components (top to bottom).",
"hexcasting.page.math15": "Split a vector into its X, Y, and Z components (top to bottom).",
"hexcasting.entry.meta": "Meta-evaluation",
"hexcasting.page.meta1": "Remove the top iota from the stack and save it into the $(item)Focus/$ or $(item)Spellbook/$ in my other hand.",
"hexcasting.page.meta2": "Copy the iota stored in the $(item)Focus/$ or $(item)Spellbook/$ in my other hand, and add it to the stack.",
"hexcasting.page.meta3": "Remove a list of patterns from the stack, then cast them sequentially, as if I had drawn them myself with my $(item)Staff/$.$(br)Costs about one $(item)Amethyst Shard/$.",
"hexcasting.page.meta4": "This can be $(italic)very/$ powerful in tandem with $(l:items/focus)$(item)Foci/$.$(br2)It also makes the bureaucracy of Nature a \"Turing-complete\" system, according to one esoteric scroll I found.$(br2)However, it seems there's a limit to how many times a _Hex can cast itself-- Nature doesn't look kindly on runaway spells!$(br2)In addition, with the energies swirling as wildly as they are, any mishap will cause the evaluation to become too unstable and immediately exit.",
"hexcasting.page.meta5": "Remove a list of patterns and a list from the stack, then cast the given pattern over each element of the second list.$(br)Costs about one $(item)Charged Amethyst/$.",
"hexcasting.page.meta6": "More specifically, for each element in the second list, it will:$(li)Creates a new stack, with everything on the current stack plus that element$(li)Draw all the patterns in the first list$(li)Save all the iotas remaining on the stack to a list$(br)Then, after all is said and done, pushes the list of saved iotas onto the main stack.$(br2)No wonder all the practitioners of this art go mad.",
"hexcasting.entry.numbers": "Numbers",
"hexcasting.page.numbers1header": "Numerical Reflection",
"hexcasting.page.numbers1": "Irritatingly, there is no easy way to draw numbers. Here is the method Nature deigned to give us.",
"hexcasting.page.numbers2": "First, I draw one of the two shapes shown on the other page. Next, the $(italic)angles/$ following will modify a running count starting at 0.$(li)Forward: Add 1$(li)Left: Add 5$(li)Right: Add 10$(li)Sharp Left: Multiply by 2$(li)Sharp Right: Divide by 2.$(br)The clockwise version of the pattern, on the right of the other page, will negate the value at the very end. (The left-hand counter-clockwise version keeps the number positive).$(p)Once I finish drawing, the number's pushed to the top of the stack.",
"hexcasting.page.numbers3header": "Example 1",
"hexcasting.page.numbers3": "This pattern pushes 10.",
"hexcasting.page.numbers4header": "Example 2",
"hexcasting.page.numbers4": "This pattern pushes 7: 5 + 1 + 1.",
"hexcasting.page.numbers5header": "Example 3",
"hexcasting.page.numbers5": "This pattern pushes -32: negate 1 + 5 + 10 * 2.",
"hexcasting.page.numbers6header": "Example 4",
"hexcasting.page.numbers6": "This pattern pushes 4.5: 5 / 2 + 1 + 1.",
"hexcasting.entry.readers_guide": "How to Read this Section",
"hexcasting.page.readers_guide1": "I've divided all the valid patterns I've found into sections based on what they do, more or less. I've written down the stroke order of the patterns as well, if I managed to find it in my studies, with the start of the pattern marked with a red dot.$(br2)If an action is cast by multiple patterns, as is the case with some simple actions, I'll write them all side-by-side.",
"hexcasting.page.readers_guide2": "For a few patterns, however, I was $(italic)not/$ able to find the stroke order, just the shape. I suspect the order to draw them in are out there, locked away in the ancient libraries and dungeons of the world.$(br2)In such cases I just draw the pattern without any information on the order to draw it in.",
"hexcasting.page.readers_guide3": "I also write the types of iota that the action will consume or modify, a \"\u2192\", and the types of iota the action will create.$(p)For example, \"$(n)vector, number/$ \u2192 $(n)vector/$\" means the action will remove a vector and a number from the top of the stack, and then add a vector; or, put another way, will remove a number from the stack, and then modify the vector at the top of the stack. (The number needs to be on the top of the stack, with the vector right below it.)",
"hexcasting.page.readers_guide4": "\"\u2192 $(n)entity/$\" means it'll just push an entity. \"$(n)entity, vector/$ \u2192\" means it removes an entity and a vector, and doesn't push anything.$(br2)Finally, if I find the little dot marking the stroke order too slow or confusing, I can press $(thing)Control/Command/$ to display a gradient, where the start of the pattern is darkest and the end is lightest. This works on scrolls and when casting, too!",
"hexcasting.entry.sentinels": "Sentinels",
"hexcasting.page.sentinels1": "$(italic)Hence, away! Now all is well,$(br)One aloof stand sentinel./$$(br2)A $(thing)Sentinel/$ is a mysterious force I can summon to assist in the casting of _Hexes, like a familiar or guardian spirit. It appears as a spinning geometric shape to my eyes, but is invisible to everyone else.",
"hexcasting.page.sentinels2": "It has several interesting properties:$(li)It does not appear to be an entity; no one else can interact with it.$(li)Once summoned, it stays in place until banished.$(li)I am always able to see it, even through blocks.",
"hexcasting.page.sentinels3": "Summon my sentinel at the given position. Costs about 1 $(item)Amethyst Dust/$.",
"hexcasting.page.sentinels4": "Banish my sentinel, and remove it from the world. Costs a negligible amount of _media.",
"hexcasting.page.sentinels5": "Add the position of my sentinel to the stack, or Null if it isn't summoned. Costs a negligible amount of _media.",
"hexcasting.page.sentinels6": "Transform the position vector on the top of the stack into a normalized vector pointing from its old position to my sentinel, or Null if it isn't summoned. Costs a negligible amount of _media.",
"hexcasting.entry.stackmanip": "Stack Manipulation",
"hexcasting.page.stackmanip1": "Removes the top of the stack and does nothing with it. This is handy when I make a mistake.",
"hexcasting.page.stackmanip2": "Duplicates the top iota of the stack.",
"hexcasting.page.stackmanip3": "Swaps the top two iotas of the stack.",
"hexcasting.page.stackmanip4": "Grabs the nth element in the stack and brings it to the top.",
"hexcasting.page.stackmanip5": "The Fisherman's Gambit takes a number and reaches that far $(italic)down/$ the stack-- pulling it from its original position up to the top of the stack. For example, using the Gambit with the number 2 will pull the second item on the stack to the top, effectively acting as a more-cumbersome Jester's Gambit. Using the Gambit with a negative number, a fraction, or a length larger than the stack will dredge all sorts of unknowable patterns from the aether, and is liable to cause a mishap."
}

View file

@ -1,6 +1,6 @@
{
"name": "Getting Started",
"name": "hexcasting.entry.basics",
"icon": "minecraft:amethyst_shard",
"description": "The practitioners of this art would cast their so-called Hexes by drawing strange patterns in the air with a staff-- or craft powerful magical items to do the casting for them. How might I do the same?",
"description": "hexcasting.page.basics1",
"sortnum": 0
}

View file

@ -1,6 +1,6 @@
{
"name": "Hex Casting",
"name": "hexcasting.entry.casting",
"icon": "hexcasting:wand",
"description": "I've started to understand how the old masters cast their Hexes! It's a bit complicated, but I'm sure I can figure it out. Let's see...",
"description": "hexcasting.page.casting1",
"sortnum": 1
}

View file

@ -1,6 +1,6 @@
{
"name": "The Great Work",
"description": "I have seen... so much. I have... experienced... annihilation and deconstruction and reconstruction. I have seen the atoms of the world screaming as they were inverted and subverted and demoted to energy. I have seen I have seen I have s$(k)get stick bugged lmao/$",
"name": "hexcasting.entry.greatwork",
"description": "hexcasting.page.greatwork1",
"icon": "minecraft:music_disc_11",
"sortnum": 3,
"secret": true,

View file

@ -1,6 +1,6 @@
{
"name": "Items",
"name": "hexcasting.entry.items",
"icon": "hexcasting:focus",
"description": "I devote this section to the magical and mysterious items I might encounter in my studies.$(br2)It seems like many of these items have uses when held alongside my staff. I suppose I will have to choose what goes in my other hand carefully.",
"description": "hexcasting.page.items1",
"sortnum": 2
}

View file

@ -1,6 +1,6 @@
{
"name": "Patterns",
"name": "hexcasting.entry.patterns",
"icon": "minecraft:bookshelf",
"description": "A list of all the patterns in the mod.",
"description": "hexcasting.page.patterns1",
"sortnum": 100
}

View file

@ -1,7 +1,7 @@
{
"name": "Great Spells",
"name": "hexcasting.entry.great_spells",
"icon": "minecraft:textures/mob_effect/conduit_power.png",
"description": "The spells catalogued here are purported to be of legendary difficulty and power, scarcely recorded (and for good reason). It's probably just traditionalists' hogwash, though-- a pattern's a pattern. What could go wrong?",
"description": "hexcasting.page.great_spells1",
"parent": "hexcasting:patterns",
"sortnum": 1
}

View file

@ -1,7 +1,7 @@
{
"name": "Spells",
"name": "hexcasting.entry.spells",
"icon": "minecraft:textures/item/enchanted_book.png",
"description": "Patterns and actions that perform a magical effect on the world.",
"description": "hexcasting.page.spells1",
"parent": "hexcasting:patterns",
"sortnum": 0
}

View file

@ -1,5 +1,5 @@
{
"name": "A Frusturation",
"name": "hexcasting.entry.couldnt_cast",
"category": "hexcasting:basics",
"icon": "minecraft:textures/mob_effect/nausea.png",
"priority": true,
@ -8,19 +8,19 @@
"pages": [
{
"type": "patchouli:text",
"text": "ARGH! Why won't it let me cast the spell?!$(br2)The scroll I found rings with authenticity. I can feel it, right there. The pattern is true. The spell is RIGHT THERE on the other side of some membrane, and it tried to come over but it COULD NOT."
"text": "hexcasting.page.couldnt_cast1"
},
{
"type": "patchouli:text",
"text": "It felt like that barrier got a $(italic)little/$ weaker from the power banging against it from the other side, but it REFUSES to cross through. It's maddening. THIS is what my studies into the arcane give me? An impotence at my crowning moment?$(br2)I should take a deep breath. I should meditate on what I have learned, even if it wasn't very much..."
"text": "hexcasting.page.couldnt_cast2"
},
{
"type": "patchouli:text",
"text": "I have discovered one thing. It seems ... I may have unlocked the ability, or perhaps curse, to cast spells using my health instead of $(item)amethyst/$, like I read about in those old legends. I'm not sure why I think this. It just... the truth is there, and I see it.$(br2)I even get a sense of scale; I would get approximately two $(item)Charged Amethyst/$'s worth of _media out of my health at its prime."
"text": "hexcasting.page.couldnt_cast3"
},
{
"type": "patchouli:text",
"text": "I shudder to think about it-- I've managed to keep my mind mostly intact so far --but there's a tenuous link here, between me and some other side. The walls have thinned from that trauma, and the glory is right there. I find myself wanting to try it."
"text": "hexcasting.page.couldnt_cast4"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Geodes",
"name": "hexcasting.entry.geodes",
"icon": "minecraft:budding_amethyst",
"category": "hexcasting:basics",
"sortnum": 2,
@ -7,15 +7,15 @@
"pages": [
{
"type": "patchouli:text",
"text": "Aha! While mining deep underground, I found an enormous geode resonating with energy-- energy which pressed against my skull and my thoughts. This $(italic)must/$ be the place spoken about in legends where _media accumulates.$(br2)These amethyst crystals must contain a $(thing)convenient, solidified form of _Media/$."
"text": "hexcasting.page.geodes1"
},
{
"type": "patchouli:text",
"text": "It appears that, in addition to the $(item)Amethyst Shards/$ I usually see, these crystals can also drop $(item)Amethyst Dust/$ and $(item)Charged Amethyst Crystals/$. It looks like I'll have a better chance of finding $(item)Charged Amethyst Crystals/$ by using a Fortune pickaxe."
"text": "hexcasting.page.geodes2"
},
{
"type": "patchouli:text",
"text": "As I take the beauty of the geode in, I can feel connections flashing wildly in my mind. It's like the _media in the air is entering me, empowering me, elucidating me... It feels wonderful.$(br2)Finally, my study into the arcane is starting to make some sense!$(p)Let me reread those old legends again, now that I know what I'm looking at."
"text": "hexcasting.page.geodes3"
}
]
}

View file

@ -1,20 +1,20 @@
{
"name": "Media",
"name": "hexcasting.entry.media",
"icon": "hexcasting:amethyst_dust",
"category": "hexcasting:basics",
"priority": true,
"pages": [
{
"type": "patchouli:text",
"text": "_Media is a form of mental energy external to a mind. All living creatures generate trace amounts of _media when thinking about anything; after the thought is finished, the media is released into the environment.$(br2)The art of casting $(thing)Hexes/$ is all about manipulating _media to do your bidding."
"text": "hexcasting.page.media1"
},
{
"type": "patchouli:text",
"text": "_Media can exert influences on other media-- the strength and type of influence can be manipulated by drawing _media out into patterns.$(p)Scholars of the art used a concentrated blob of _media on the end of a stick: by waving it in the air in precise configurations, they were able to manipulate enough _media with enough precision to influence the world itself, in the form of a Hex."
"text": "hexcasting.page.media2"
},
{
"type": "patchouli:text",
"text": "Sadly, even a fully sentient being (like myself, presumably) can only generate miniscule amounts of _media. It would be quite impractical to try and use my own brainpower to cast Hexes.$(br2)But legend has it that there are underground deposits where _media slowly accumulates, growing into crystalline forms deep under the earth.$(p)If I could just find one of those..."
"text": "hexcasting.page.media3"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "WHAT DID I SEE",
"name": "hexcasting.entry.start_to_see",
"category": "hexcasting:basics",
"icon": "minecraft:textures/mob_effect/blindness.png",
"priority": true,
@ -8,19 +8,19 @@
"pages": [
{
"type": "patchouli:text",
"text": "The texts weren't lying. Nature took its due."
"text": "hexcasting.page.start_to_see1"
},
{
"type": "patchouli:text",
"text": "That was... one of the worst things I've experienced. I offered my plan, and Nature smiled firmly at me and ripped away a part of myself alongside my payment. I feel lucky to have $(italic)survived/$, much less have sagacity enough to write this.$(br2)I should declare the matter closed, double-check my math before I cast any more _Hexes, and make sure I have the _media I need..."
"text": "hexcasting.page.start_to_see2"
},
{
"type": "patchouli:text",
"text": "...But.$(br2)For the scarcest instant, that part of myself ... saw ... $(italic)something/$. A place, or a design perhaps-- I was abstract enough that there was no distinction. A ... membrane separating myself from a realm of raw thought and light and energy. I remember-- or, I don't remember, but I find myself thinking of --the barrier fuzzing at the edges just a little bit. I wanted $(italic)through./$"
"text": "hexcasting.page.start_to_see3"
},
{
"type": "patchouli:text",
"text": "I know I shouldn't. It's dangerous. It's too dangerous. I'd have to bring myself within a hairsbreadth of Death.$(br2)But I'm SO CLOSE. $(italic)THIS/$ is the culmination of my art, the $(#54398a)Enlightenment/$ I've been seeking.$(br2)I need more. I need to see it again. What is the price of my mortal mind against immortal glory? Just once more... I need to see it. I WILL see it."
"text": "hexcasting.page.start_to_see4"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Hexing 101",
"name": "hexcasting.entry.101",
"category": "hexcasting:casting",
"icon": "hexcasting:wand",
"advancement": "hexcasting:root",
@ -7,20 +7,20 @@
"pages": [
{
"type": "patchouli:text",
"text": "Casting a _Hex is quite difficult-- no wonder this art was lost to time! I'll have to re-read my notes carefully.$(br2)I can start a _Hex by pressing $(k:use) with a $(item)Staff/$ in my hand-- this will cause a hexagonal grid of dots to appear in front of me. Then I can click and drag from dot to dot to draw patterns in the _media of the grid; finishing a pattern will run its corresponding action (more on that later)."
"text": "hexcasting.page.1011"
},
{
"type": "patchouli:text",
"text": "Once I've drawn enough patterns to cast a spell, the grid will disappear as the _media I've stored up is released. I can also press Escape if I want to quit early, if I don't mind the chance of a small mishap. (It seems that the more _media I've built up, the more likely I'll meet misfortune.)$(br2)So how do patterns work? In short:$(li)$(italic)Patterns/$ will execute...$(li)$(italic)Actions/$, which manipulate...$(li)$(italic)The Stack/$, which is a list of...$(li)$(italic)Iotas/$, which are simply units of information."
"text": "hexcasting.page.1012"
},
{
"type": "patchouli:text",
"text": "First, $(thing)patterns/$. These are essential-- they're what I use to manipulate the _media around me. Certain patterns, when drawn, will cause $(thing)actions/$ to happen. Actions are what actually $(italic)do/$ the magic; all patterns influence _media in particular ways, and when those influences end up doing something useful, we call it an action.$(br2)_Media can be fickle: if I draw an invalid pattern, I'll get some garbage result somewhere on my stack (read on...)"
"text": "hexcasting.page.1013"
},
{
"type": "hexcasting:manual_pattern_nosig",
"header": "An Example",
"text": "It's interesting to note that the $(italic)rotation/$ of a pattern doesn't seem to matter at all. These two patterns both perform the $(l:patterns/basics#hexcasting:get_caster)$(action)Mind's Reflection/$, for example.",
"header": "hexcasting.page.1014header",
"text": "hexcasting.page.1014",
"patterns": [
{
"startdir": "NORTH_EAST",
@ -35,49 +35,49 @@
},
{
"type": "patchouli:text",
"text": "A _Hex is cast by drawing (valid) actions in sequence. Each action might do one of a few things:$(li)Gather some information about the environment, leaving it on the top of the stack;$(li)manipulate the info gathered (e.g. adding two numbers); or$(li)perform some magical effect, like summoning lightning or an explosion. (These actions are called \"spells.\")$(p)When I start casting a _Hex, it creates an empty stack. Actions manipulate the top of that stack."
"text": "hexcasting.page.1015"
},
{
"type": "patchouli:text",
"text": "For example, the $(l:patterns/basics#hexcasting:get_caster)$(action)Mind's Reflection/$ will create an iota representing $(italic)me/$, the caster, and add it to the top of the stack. The $(l:patterns/basics#hexcasting:get_entity_pos)$(action)Compass Purification/$ will take the iota at the top the stack, if it represents an entity, and transform it into an iota representing that entity's location.$(br2)So, drawing those patterns in that order would result in an iota on the stack representing my position."
"text": "hexcasting.page.1016"
},
{
"type": "patchouli:text",
"text": "$(thing)Iotas/$ can represent things like myself or my position, but there are several other types I can manipulate with $(thing)Actions$(0). Here's a comprehensive list:$(li)Numbers (which some legends called \"doubles\");$(li)Vectors, a collection of three numbers representing a position, movement, or direction in the world;"
"text": "hexcasting.page.1017"
},
{
"type": "patchouli:text",
"text": "$(li)Entities, like myself, chickens, and minecarts;$(li)Influences, peculiar types of iota that seem to represent abstract ideas;$(li)Patterns themselves, used for crafting magic items and truly mind-boggling feats like $(italic)spells that cast other spells/$; and$(li)A list of several of the above, gathered into a single iota."
"text": "hexcasting.page.1018"
},
{
"type": "patchouli:text",
"text": "Of course, there's no such thing as a free lunch. All spells, and certain other actions, require _media as payment.$(br2)The best I can figure, a _Hex is a little bit like a plan of action presented to Nature-- in this analogy, the _media is used to provide the arguments to back it up, so Nature will accept your plan and carry it out."
"text": "hexcasting.page.1019"
},
{
"type": "patchouli:text",
"text": "That aside, it doesn't seem like anyone has done much research on exactly how $(italic)much/$ any particular piece of amethyst is valued. The best I can tell, an $(item)Amethyst Shard/$ is worth about five pieces of $(item)Amethyst Dust/$, and a $(item)Charged Amethyst Crystal/$ is worth about ten.$(br2)Strangely enough, it seems like no other form of amethyst is suitable to be used in the casting of a _Hex. I suspect that whole blocks or crystals are too solid to be easily unraveled into _media."
"text": "hexcasting.page.10110"
},
{
"type": "patchouli:text",
"text": "It's also worth noting that each action will consume the _media it needs immediately, rather than all at once when the Hex finishes. Also, an action will always consume entire items-- an action that only requires one $(item)Amethyst Dust/$'s worth of _media will consume an entire $(item)Charged Amethyst Crystal/$, if that's all that's present in my inventory.$(br2)Thus, it might be a good idea to bring dust for spellcasting too-- waste not, want not..."
"text": "hexcasting.page.10111"
},
{
"type": "patchouli:text",
"text": "I should also be careful to make sure I actually have enough Amethyst in my inventory-- if not, it seems Nature is happy to use my own mind as payment instead. The old texts describe the feeling as awful but strangely euphoric, \"[...] an effervescent dissolution into light and energy...\"$(br)Perhaps this is why all the old practitioners of the art went mad. I can't imagine burning pieces of my mind for power is $(italic)healthy/$."
"text": "hexcasting.page.10112"
},
{
"type": "patchouli:text",
"text": "Or, it $(italic) should/$ be like that. In my experiments, I've never managed to do it; if I run out of _media, the spell will simply fail to cast. It feels as if there's some sort of ... barrier in my mind that appears when I try. $(br2)It would be interesting to get to the bottom of the conundrum, but for now I suppose it keeps me safe."
"text": "hexcasting.page.10113"
},
{
"type": "patchouli:link",
"text": "I have also found an amusing tidbit on why so many practitioners of magic in general seem to go mad, which I may like as some light and flavorful reading not canonical to my world.$(br2)$(italic)Content Warning: some body horror and suggestive elements./$",
"link_text": "Goblin Punch",
"text": "hexcasting.page.10114",
"link_text": "hexcasting.page.10114_link_text",
"url": "https://goblinpunch.blogspot.com/2014/05/a-digression-about-wizards.html"
},
{
"type": "patchouli:text",
"text": "Finally, it seems spells have a maximum range of influence, about 32 blocks from my position. Trying to affect anything outside of that will cause the spell to fail."
"text": "hexcasting.page.10115"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Influences",
"name": "hexcasting.entry.influences",
"category": "hexcasting:casting",
"icon": "minecraft:spyglass",
"sortnum": 3,
@ -7,15 +7,15 @@
"pages": [
{
"type": "patchouli:text",
"text": "Influences are ... strange, to say the least. Whereas most iotas seem to represent something about the world, influences represent ... something more abstract and formless.$(br2)For example, one influence I've named Null seems to represent nothing at all. It's created when there isn't a suitable answer to a question asked, such as the Entity Distillation on a block with no entity there."
"text": "hexcasting.page.influences1"
},
{
"type": "patchouli:text",
"text": "In addition, I've discovered a curious triplet of influences I've named Consideration, Introspection, and Retrospection. I can use these to add patterns to my stack as iotas, instead of matching them to actions. $(l:casting/patterns_as_iotas)My notes on the subject are here/$."
"text": "hexcasting.page.influences2"
},
{
"type": "patchouli:text",
"text": "Finally, there is an influence, or perhaps infinite family of influences, that seem to just be a tangled mess of _media. I've named it $(action)Garbage/$, as it is completely useless. It appears somewhere in my stack when I drawn an invalid pattern, and viewing it through a $(l:items/lens)$(item)Scrying Lens/$ just gives a nonsense jumble."
"text": "hexcasting.page.influences3"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Mishaps",
"name": "hexcasting.entry.mishaps",
"category": "hexcasting:casting",
"icon": "minecraft:textures/mob_effect/poison.png",
"priority": "true",
@ -8,11 +8,11 @@
"pages": [
{
"type": "patchouli:text",
"text": "Unfortunately, I am not a perfect being. I make mistakes from time to time, including when casting _Hexes. For example, I might misdraw a pattern, or try an invoke an action with the wrong types of iotas. And usually, Nature does not look kindly on my mistakes, causing what is called a $(italic)mishap/$."
"text": "hexcasting.page.mishaps1"
},
{
"type": "patchouli:text",
"text": "I expected some kind of horrible recompense for mishaps, some kind of alchemical disaster or virile illness as I have heard troubled the Thaumaturges of the past... but instead, I just get a cryptic (if helpful) message in my chat. How convenient!$(br2)However, a nagging feeling at the back of my mind tells me I should expect worse consequences once the \"mod updates,\" whatever that means. Perhaps I am not as immune to the madness that seems to afflict practitioners of this art as I thought."
"text": "hexcasting.page.mishaps2"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Naming Actions",
"name": "hexcasting.entry.naming",
"category": "hexcasting:casting",
"icon": "minecraft:name_tag",
"sortnum": 2,
@ -7,15 +7,15 @@
"pages": [
{
"type": "patchouli:text",
"text": "The names given to actions by the ancients were certainly peculiar, but I think there's a certain kind of logic to them.$(br2)There seem to be certain groups of actions with common names, named for the number of iotas they remove from and add to the stack."
"text": "hexcasting.page.naming1"
},
{
"type": "patchouli:text",
"text": "$(li)A $(thing)Reflection/$ pops nothing and pushes some number.$(li)A $(thing)Purification/$ pops one and pushes one.$(li)A $(thing)Distillation/$ pops two and pushes one.$(li)An $(thing)Exaltation/$ pops three or more and pushes one.$(li)A $(thing)Decomposition/$ pops one argument and pushes two.$(li)A $(thing)Disintegration/$ pops one and pushes three or more.$(li)Finally, a $(thing)Gambit/$ pushes or pops some other number."
"text": "hexcasting.page.naming2"
},
{
"type": "patchouli:text",
"text": "Spells seem to be exempt from this nomenclature and are more or less named after what they do-- after all, why call it a $(thing)Demoman's Gambit/$ when you could just say $(thing)Explosion/$?"
"text": "hexcasting.page.naming3"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Patterns as Iotas",
"name": "hexcasting.entry.patterns_as_iotas",
"category": "hexcasting:casting",
"icon": "minecraft:emerald",
"sortnum": 3,
@ -7,17 +7,17 @@
"pages": [
{
"type": "patchouli:text",
"text": "One of the many peculiarities of the art is that $(italic)patterns themselves/$ can act as iotas, and be put onto my stack when casting.$(br2)This raises a fairly obvious question: how do I express them? If I were to simply draw a pattern, how would I inform Nature of my intent to have it matched to an action instead of adding it to my stack as an iota?"
"text": "hexcasting.page.patterns_as_iotas1"
},
{
"type": "patchouli:text",
"text": "Fortunately, Nature has provided me with a set of $(l:casting/influences)influences/$ that I can use to work with patterns directly.$(br2)In short, $(action)Consideration/$ lets me add one pattern to the stack, and $(action)Introspection/$ and $(action)Retrospection/$ let me add a whole list."
"text": "hexcasting.page.patterns_as_iotas2"
},
{
"type": "hexcasting:pattern",
"op_id": "hexcasting:escape",
"anchor": "hexcasting:escape",
"text": "To use $(action)Consideration/$, I draw it, then another arbitrary pattern. That second pattern is added to the stack.",
"text": "hexcasting.page.patterns_as_iotas3",
"patterns": {
"startdir": "WEST",
"signature": "qqqaw"
@ -25,13 +25,13 @@
},
{
"type": "patchouli:text",
"text": "I may find it helpful to think of this as \"escaping\" the pattern onto the stack, if I happen to be familiar with the term from computer science.$(br2)To be honest, I haven't found too much use for this pattern yet, but I imagine it could be helpful with advanced _Hexes casting other _Hexes."
"text": "hexcasting.page.patterns_as_iotas4"
},
{
"type": "hexcasting:pattern",
"op_id": "hexcasting:open_paren",
"anchor": "hexcasting:open_paren",
"text": "Drawing $(action)Introspection/$ makes my drawing of patterns act differently, for a time. Until I draw $(action)Retrospection/$, any pattern I draw is saved to a list. Then, when I draw $(action)Retrospection/$, the list is pushed to the stack as a list iota.",
"text": "hexcasting.page.patterns_as_iotas5",
"patterns": {
"startdir": "WEST",
"signature": "qqq"
@ -41,7 +41,7 @@
"type": "hexcasting:pattern",
"op_id": "hexcasting:close_paren",
"anchor": "hexcasting:close_paren",
"text": "If I draw another $(action)Introspection/$, it will still be saved, but I'll then have to draw $(italic)two/$ $(action)Retrospection/$s to get back to normal casting.",
"text": "hexcasting.page.patterns_as_iotas6",
"patterns": {
"startdir": "EAST",
"signature": "eee"
@ -49,7 +49,7 @@
},
{
"type": "patchouli:text",
"text": "Also, I can escape the special behavior of $(action)Intro/Retrospection/$ by drawing a $(action)Consideration/$ before them, which will simply add them to the list without affecting the number of each I need to draw to return to normal.$(br2)If I draw two $(action)Consideration/$s in a row while introspecting, it will add the second pattern to the list."
"text": "hexcasting.page.patterns_as_iotas7"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Stacks",
"name": "hexcasting.entry.stack",
"category": "hexcasting:casting",
"icon": "minecraft:piston",
"sortnum": 1,
@ -7,19 +7,19 @@
"pages": [
{
"type": "patchouli:text",
"text": "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 a hold of it."
"text": "hexcasting.page.stack1"
},
{
"type": "patchouli:text",
"text": "Because a stack is so simple, there's only so many things you can do with it:$(li)$(italic)Adding something to it/$, known formally as pushing,$(li)$(italic)Removing the last added element/$, known as popping, or$(li)$(italic)Examining or modifying the last added element/$, known as peeking.$(br)We call the last-added element the \"top\" of the stack, in accordance with the dinner plate analogy.$(p)As an example, if we push 1 to a stack, then push 2, then pop, the top of the stack is now 1."
"text": "hexcasting.page.stack2"
},
{
"type": "patchouli:text",
"text": "Actions are (on the most part) restricted to interacting with the casting stack in these ways. They will pop some iotas they're interested in (known as \"arguments\" or \"parameters\"), process them, and push some number of results.$(br2)Of course, some actions (e.g. the $(l:patterns/basics#hexcasting:get_caster)$(action)Mind's Reflection/$) might pop no arguments, and some actions (particularly spells) might push nothing afterwards."
"text": "hexcasting.page.stack3"
},
{
"type": "patchouli:text",
"text": "Even more complicated actions can be expressed in terms of pushing, popping, and peeking. For example, the $(l:patterns/stackmanip#hexcasting:swap)$(action)Jester's Gambit/$ swaps the top two items of the stack. This can be thought of as popping two items and pushing them in opposite order. For another, $(l:patterns/stackmanip#hexcasting:duplicate)$(action)Gemini Decomposition/$ duplicates the top of the stack-- in other words, it peeks the stack and pushes a copy of what it finds."
"text": "hexcasting.page.stack4"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "A Primer on Vectors",
"name": "hexcasting.entry.vectors",
"category": "hexcasting:casting",
"icon": "minecraft:arrow",
"priority": true,
@ -8,18 +8,18 @@
"pages": [
{
"type": "patchouli:link",
"text": "It seems I will need to be adroit with vectors if I am to get anywhere in my studies. I have compiled some resources here on vectors if I find I do not know how to work with them.$(br2)First off, an enlightening video on the topic.",
"link_text": "3blue1brown",
"text": "hexcasting.page.vectors1",
"link_text": "hexcasting.page.vectors1_link_text",
"url": "https://www.youtube.com/watch?v=fNk_zzaMoSs"
},
{
"type": "patchouli:text",
"text": "Additionally, it seems that the mages who manipulated $(thing)Psi energy/$ (the so-called \"spellslingers\"), despite their poor naming sense, had some quite-effective lessons on vectors to teach their acolytes. I've taken the liberty of linking to one of their texts on the next page.$(br2)They seem to have used different language for their spellcasting:$(li)A \"Spell Piece\" was their name for an action;$(li)a \"Trick\" was their name for a spell; and$(li)an \"Operator\" was their name for a non-spell action."
"text": "hexcasting.page.vectors2"
},
{
"type": "patchouli:link",
"text": "Link here.",
"link_text": "Psi Codex",
"text": "hexcasting.page.vectors3",
"link_text": "hexcasting.page.vectors3_link_text",
"url": "https://psi.vazkii.us/codex.php#vectorPrimer"
}
]

View file

@ -1,5 +1,5 @@
{
"name": "The Work",
"name": "hexcasting.entry.the_work",
"category": "hexcasting:greatwork",
"icon": "minecraft:nether_star",
"priority": true,
@ -8,11 +8,11 @@
"pages": [
{
"type": "patchouli:text",
"text": "I have seen so many things. Unspeakable things. Innumerable things. I could write three words and turn my mind inside-out and smear my brains across the shadowed walls of my skull to decay into fluff and nothing."
"text": "hexcasting.page.the_work1"
},
{
"type": "patchouli:text",
"text": "I have seen staccato-needle patterns and acrid-etched schematics written to the inside of my eyelids. They smolder there, dancing, taunting, aching. I am possessed by an intense need to draw them, create them, form them, liberate them from the gluey shackles of my mortal mind, present them in their Glory to the world so all can see them. All will see. All will see."
"text": "hexcasting.page.the_work2"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Amethyst",
"name": "hexcasting.entry.amethyst",
"icon": "minecraft:amethyst_shard",
"category": "hexcasting:items",
"priority": true,
@ -11,25 +11,25 @@
"item": "hexcasting:amethyst_dust",
"anchor": "dust",
"link_recipe": true,
"text": "It seems that I'll find three different forms of amethyst when breaking a crystal inside a geode. The smallest denomination seems to be a small pile of shimmering dust, worth a relatively small amount of _media."
"text": "hexcasting.page.amethyst1"
},
{
"type": "patchouli:spotlight",
"item": "minecraft:amethyst_shard",
"anchor": "shard",
"link_recipe": true,
"text": "The second is a whole shard of amethyst, of the type non-Hexers might be used to. This has about as much _media inside as five $(item)Amethyst Dust/$s."
"text": "hexcasting.page.amethyst2"
},
{
"type": "patchouli:spotlight",
"item": "hexcasting:charged_amethyst",
"anchor": "charged",
"link_recipe": true,
"text": "Finally, I'll rarely find a large crystal crackling with energy. This has about as much _media inside as ten units of $(item)Amethyst Dust/$s (or two $(item)Amethyst Shard/$s)."
"text": "hexcasting.page.amethyst3"
},
{
"type": "patchouli:text",
"text": "$(italic)The old man sighed and raised a hand toward the fire. He unlocked a part of his brain that held the memories of the mountains around them. He pulled the energies from those lands, as he learned to do in Terisia City with Drafna, Hurkyl, the archimandrite, and the other mages of the Ivory Towers. He concentrated, and the flames writhed as they rose from the logs, twisting upon themselves until they finally formed a soft smile./$"
"text": "hexcasting.page.amethyst4"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Focus",
"name": "hexcasting.entry.focus",
"icon": "hexcasting:focus",
"category": "hexcasting:items",
"sortnum": 2,
@ -7,20 +7,20 @@
"pages": [
{
"type": "patchouli:text",
"text": "A $(item)Focus/$ can store a single iota.$(br2)When I craft it, it holds the Null influence by default. Using the $(action)$(l:patterns/meta#OpWrite)Scribe's Gambit/$ while holding a $(item)Focus/$ in my other hand will remove the top of the stack and save it into the $(item)Focus/$. Using the $(action)$(l:patterns/meta#OpRead)Scribe's Reflection/$ will copy whatever iota's in the $(item)Focus/$ and add it to the stack."
"text": "hexcasting.page.focus1"
},
{
"type": "patchouli:crafting",
"recipe": "hexcasting:focus",
"text": "$(italic)Poison apples, poison worms./$"
"text": "hexcasting.page.focus2"
},
{
"type": "patchouli:text",
"text": "It occurs to me that I could conceivably store a whole list of patterns in a $(item)Focus/$, then recall them and evaluate them with $(l:patterns/meta#OpEval)$(action)Hermes' Gambit/$. This way I can cast complex spells, or parts of spells, without having to draw them over and over.$(br2)I could use this like a slightly less convenient $(l:items/hexcasting#artifact)$(item)Artifact/$, but I think I could get much better dividends by putting common \"phrases\" in a $(item)Focus/$, like the patterns for figuring out where I'm looking."
"text": "hexcasting.page.focus3"
},
{
"type": "patchouli:text",
"text": "Also, if I store an entity in a $(item)Focus/$ and try to recall it after the referenced entity has died or otherwise disappeared, the $(action)Scribe's Reflection/$ will add Null to the stack instead."
"text": "hexcasting.page.focus4"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Hexcasting Items",
"name": "hexcasting.entry.hexcasting",
"category": "hexcasting:items",
"icon": "hexcasting:artifact{patterns:[]}",
"sortnum": 4,
@ -7,23 +7,23 @@
"pages": [
{
"type": "patchouli:text",
"text": "Although the flexibility that casting _Hexes \"on the go\" with my $(l:items/staff)$(item)Staff/$ is quite helpful, it's a huge pain to have to wave it around repeatedly just to accomplish a common task. If I could save a common spell for later reuse, it would simplify things a lot-- and allow me to share my _Hexes with friends, too."
"text": "hexcasting.page.hexcasting1"
},
{
"type": "patchouli:text",
"text": "To do this, I can craft one of three types of magic items: $(item)Cypher/$s, $(item)Trinket/$s, or $(item)Artifact/$s. All of them hold the patterns of a given _Hex inside, along with a small battery containing _media.$(br2)Simply holding one and pressing $(thing)$(k:use)/$ will cast the patterns inside, as if the holder had cast them out of a staff, using its internal battery."
"text": "hexcasting.page.hexcasting2"
},
{
"type": "patchouli:text",
"text": "Each item has its own quirks:$(br2)$(item)Cypher/$s are single-use, destroyed after the _Hex is cast;$(br2)$(item)Trinket/$s can be cast as much as the holder likes, as long as there's enough _media left, but become useless afterwards;"
"text": "hexcasting.page.hexcasting3"
},
{
"type": "patchouli:text",
"text": "$(item)Artifact/$s are the most powerful of all-- after their _media is depleted, they can use $(l:items/amethyst)$(item)Amethyst/$ from the holder's inventory to pay for the _Hex, just as I do when casting with a $(item)Staff/$. Of course, this also means the spell might consume their mind if there's not enough $(item)Amethyst/$.$(br2)Once I've made an empty magic item in a mundane crafting bench, I infuse the _Hex into it using (what else but) a spell appropriate to the item. $(l:patterns/spells/hexcasting)I've catalogued the patterns here./$"
"text": "hexcasting.page.hexcasting4"
},
{
"type": "patchouli:text",
"text": "Each infusion spell requires an entity and a list of patterns on the stack. The entity must be a _media-holding item entity (i.e. amethyst crystals, dropped on the ground); the entity is consumed and forms the battery.$(br2)Usefully, it seems that the _media in the battery is not consumed in chunks as it is when casting with a $(item)Staff/$-- rather, the _media \"melts down\" into one continuous pool. Thus, if I store a _Hex that only costs one $(item)Amethyst Dust/$'s worth of mana, a $(item)Charged Crystal/$ used as the battery will allow me to cast it 10 times."
"text": "hexcasting.page.hexcasting5"
},
{
"type": "patchouli:crafting",
@ -35,7 +35,7 @@
"type": "patchouli:crafting",
"anchor": "artifact",
"recipe": "hexcasting:artifact",
"text": "$(italic)We have a saying in our field: \"Magic isn't\". It doesn't \"just work,\" it doesn't respond to your thoughts, you can't throw fireballs or create a roast dinner from thin air or turn a bunch of muggers into frogs and snails./$"
"text": "hexcasting.page.hexcasting6"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Scrying Lens",
"name": "hexcasting.entry.lens",
"icon": "hexcasting:lens",
"category": "hexcasting:items",
"advancement": "hexcasting:root",
@ -7,12 +7,12 @@
"pages": [
{
"type": "patchouli:text",
"text": "This curiosity is in a strange, transitory state. Not too long ago, it allowed me to see the iotas on my stack, but now it seems I have that ability without the assistance of a lens.$(br2)I best keep my old ones around, though-- I have the feeling they will have use in the future."
"text": "hexcasting.page.lens1"
},
{
"type": "patchouli:crafting",
"recipe": "hexcasting:lens",
"text": "$(italic)You must learn... to see what you are looking at./$"
"text": "hexcasting.page.lens2"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Pigments",
"name": "hexcasting.entry.pigments",
"category": "hexcasting:items",
"icon": "hexcasting:uuid_colorizer",
"sortnum": 5,
@ -8,16 +8,16 @@
"pages": [
{
"type": "patchouli:text",
"text": "Although the names of the old practitioners of my art were lost to time, they were often known for a color, emblematic of them and their spells. It seems a special kind of pigment, offered to Nature in the right way, would \"[...] paint one's thoughts in a manner pleasing to Nature, inducing a miraculous change in color.\""
"text": "hexcasting.page.pigments1"
},
{
"type": "patchouli:text",
"text": "I'm not certain on the specifics of how it works, but I believe I have isolated the formulae for many different colors of pigments. To use one, I hold it in my other hand while casting $(l:patterns/spells/colorize)$(action)Internalize Pigment/$, which will consume the pigment and mark my mind with that color.$(br2)The pigments seem to affect the color of the spare media coming out of a staff when I cast a _Hex, as well as my $(l:patterns/sentinels)$(thing)Sentinel/$."
"text": "hexcasting.page.pigments2"
},
{
"type": "hexcasting:crafting_multi",
"heading": "Chromatic Colorizers",
"text": "Pigments all the colors of the rainbow.",
"heading": "hexcasting.page.pigments3header",
"text": "hexcasting.page.pigments3",
"recipes": [
"hexcasting:dye_colorizer_white",
"hexcasting:dye_colorizer_orange",
@ -74,7 +74,7 @@
{
"type": "patchouli:crafting",
"recipe": "hexcasting:uuid_colorizer",
"text": "And finally, a pigment with a color wholly unique to me.$(br2)$(italic)And all the colors I am inside have not been invented yet./$"
"text": "hexcasting.page.pigments4"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Spellbook",
"name": "hexcasting.entry.spellbook",
"category": "hexcasting:items",
"icon": "hexcasting:spellbook",
"sortnum": 3,
@ -7,12 +7,12 @@
"pages": [
{
"type": "patchouli:text",
"text": "A $(item)Spellbook/$ is the culmination of my art-- it acts like an entire library of $(l:items/focus)$(item)Foci/$.$(br2)Each page can hold a single iota, and I can select the active page (the page that iotas are saved to and copied from) by sneak-scrolling while holding it, or simply holding it in my off-hand and scrolling while casting a _Hex."
"text": "hexcasting.page.spellbook1"
},
{
"type": "patchouli:crafting",
"recipe": "hexcasting:spellbook",
"text": "$(italic)Wizards love words. Most of them read a great deal, and indeed one strong sign of a potential wizard is the inability to get to sleep without reading something first."
"text": "hexcasting.page.spellbook2"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Staff",
"name": "hexcasting.entry.staff",
"icon": "hexcasting:wand",
"category": "hexcasting:items",
"priority": true,
@ -8,12 +8,12 @@
"pages": [
{
"type": "patchouli:text",
"text": "A $(item)Staff/$ is my entry point into casting all _Hexes, large and small. By holding it and pressing $(thing)$(k:use)/$, I begin casting a _Hex; then I can click and drag to draw patterns.$(br2)It's little more than a chunk of _media on the end of a stick; that's all that's needed, after all."
"text": "hexcasting.page.staff1"
},
{
"type": "patchouli:crafting",
"recipe": "hexcasting:wand",
"text": "$(italic)Don't fight; flame, light; ignite; burn bright./$"
"text": "hexcasting.page.staff2"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Basic Patterns",
"name": "hexcasting.entry.basics_pattern",
"category": "hexcasting:patterns",
"icon": "minecraft:wooden_pickaxe",
"sortnum": 0,
@ -12,7 +12,7 @@
"anchor": "hexcasting:get_caster",
"input": "",
"output": "entity",
"text": "Adds me, the caster, to the stack."
"text": "hexcasting.page.basics_pattern1"
},
{
"type": "hexcasting:pattern",
@ -21,7 +21,7 @@
"anchor": "OpEntityPos",
"input": "entity",
"output": "vector",
"text": "Transforms an entity on the stack into its position.",
"text": "hexcasting.page.basics_pattern2",
"patterns": [
{
"startdir": "SOUTH_WEST",
@ -40,7 +40,7 @@
"anchor": "hexcasting:get_entity_look",
"input": "entity",
"output": "vector",
"text": "Transforms an entity on the stack into the direction it's looking in, as a unit vector."
"text": "hexcasting.page.basics_pattern3"
},
{
"type": "hexcasting:pattern",
@ -48,7 +48,7 @@
"anchor": "hexcasting:print",
"input": "any",
"output": "any",
"text": "Displays the top iota of the stack to me."
"text": "hexcasting.page.basics_pattern4"
},
{
"type": "hexcasting:pattern",
@ -56,11 +56,11 @@
"anchor": "hexcasting:raycast",
"input": "vector, vector",
"output": "vector",
"text": "Combines two vectors (a position and a direction) into the answer to the question: If I stood at the position and looked in the direction, what block would I be looking at?"
"text": "hexcasting.page.basics_pattern5"
},
{
"type": "patchouli:text",
"text": "If it doesn't hit anything, the vectors will combine into Null.$(br2)For example, casting this with my own position and look vectors will return the coordinates of the block I am looking at."
"text": "hexcasting.page.basics_pattern6"
},
{
"type": "hexcasting:pattern",
@ -68,11 +68,11 @@
"anchor": "hexcasting:raycast/axis",
"input": "vector, vector",
"output": "vector",
"text": "Like $(l:patterns/basics#hexcasting:raycast)$(action)Archer's Distillation$(/l), but instead returns a vector representing the answer to the question: Which $(italic)side/$ of the block am I looking at?"
"text": "hexcasting.page.basics_pattern7"
},
{
"type": "patchouli:text",
"text": "More specifically, it returns the $(italic)normal vector/$ of the face hit, or a vector with length 1 pointing perpendicular to the face.$(li)If I am looking at a floor, it will return (0, 1, 0).$(li)If I am looking at the south face of a block, it will return (0, 0, 1).$(br)"
"text": "hexcasting.page.basics_pattern8"
},
{
"type": "hexcasting:pattern",
@ -80,7 +80,7 @@
"anchor": "hexcasting:raycast/entity",
"input": "vector, vector",
"output": "entity",
"text": "Like $(l:patterns/basics#hexcasting:raycast)$(action)Archer's Distillation$(/l), but instead returns the $(italic)entity/$ I am looking at."
"text": "hexcasting.page.basics_pattern9"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Constants",
"name": "hexcasting.entry.consts",
"category": "hexcasting:patterns",
"icon": "minecraft:bedrock",
"sortnum": 3,
@ -11,7 +11,7 @@
"header": "Axial Reflection +X/-X",
"input": "",
"output": "vector",
"text": "The left-hand counter-clockwise pattern adds (1, 0, 0) to the stack; the right-hand clockwise pattern adds (-1, 0, 0).",
"text": "hexcasting.page.consts1",
"patterns": [{
"startdir": "NORTH_WEST",
"signature": "qqqqqea",
@ -28,7 +28,7 @@
"header": "Axial Reflection +Y/-Y",
"input": "",
"output": "vector",
"text": "The left-hand counter-clockwise pattern adds (0, 1, 0) to the stack; the right-hand clockwise pattern adds (0, -1, 0).",
"text": "hexcasting.page.consts2",
"patterns": [{
"startdir": "NORTH_WEST",
"signature": "qqqqqew",
@ -45,7 +45,7 @@
"header": "Axial Reflection +Z/-Z",
"input": "",
"output": "vector",
"text": "The left-hand counter-clockwise pattern adds (0, 0, 1); the right-hand clockwise pattern adds (0, 0, -1).",
"text": "hexcasting.page.consts3",
"patterns": [{
"startdir": "NORTH_WEST",
"signature": "qqqqqed",
@ -62,7 +62,7 @@
"op_id": "hexcasting:const/null",
"input": "",
"output": "influence",
"text": "Adds the Null influence to the top of the stack."
"text": "hexcasting.page.consts4"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Entities",
"name": "hexcasting.entry.entities",
"category": "hexcasting:patterns",
"icon": "minecraft:pig_spawn_egg",
"sortnum": 4,
@ -12,7 +12,7 @@
"anchor": "hexcasting:get_entity",
"input": "vector",
"output": "entity or null",
"text": "Transform the position on the stack into the entity at that location (or null if there isn't one)."
"text": "hexcasting.page.entities1"
},
{
"type": "hexcasting:pattern",
@ -20,7 +20,7 @@
"anchor": "hexcasting:get_entity/animal",
"input": "vector",
"output": "entity or null",
"text": "Transform the position on the stack into the animal at that location (or null if there isn't one)."
"text": "hexcasting.page.entities2"
},
{
"type": "hexcasting:pattern",
@ -28,7 +28,7 @@
"anchor": "hexcasting:get_entity/monster",
"input": "vector",
"output": "entity or null",
"text": "Transform the position on the stack into the monster at that location (or null if there isn't one)."
"text": "hexcasting.page.entities3"
},
{
"type": "hexcasting:pattern",
@ -36,7 +36,7 @@
"anchor": "hexcasting:get_entity/item",
"input": "vector",
"output": "entity or null",
"text": "Transform the position on the stack into the dropped item at that location (or null if there isn't one)."
"text": "hexcasting.page.entities4"
},
{
"type": "hexcasting:pattern",
@ -44,7 +44,7 @@
"anchor": "hexcasting:get_entity/player",
"input": "vector",
"output": "entity or null",
"text": "Transform the position on the stack into the player at that location (or null if there isn't one)."
"text": "hexcasting.page.entities5"
},
{
"type": "hexcasting:pattern",
@ -52,7 +52,7 @@
"anchor": "hexcasting:get_entity/living",
"input": "vector",
"output": "entity or null",
"text": "Transform the position on the stack into the living creature at that location (or null if there isn't one)."
"text": "hexcasting.page.entities6"
},
{
"type": "hexcasting:pattern",
@ -60,7 +60,7 @@
"anchor": "hexcasting:zone_entity/animal",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of animals near the position."
"text": "hexcasting.page.entities7"
},
{
"type": "hexcasting:pattern",
@ -68,7 +68,7 @@
"anchor": "hexcasting:zone_entity/not_animal",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-animal entities near the position."
"text": "hexcasting.page.entities8"
},
{
"type": "hexcasting:pattern",
@ -76,7 +76,7 @@
"anchor": "hexcasting:zone_entity/monster",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of monsters near the position."
"text": "hexcasting.page.entities9"
},
{
"type": "hexcasting:pattern",
@ -84,7 +84,7 @@
"anchor": "hexcasting:zone_entity/not_monster",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-monster entities near the position."
"text": "hexcasting.page.entities10"
},
{
"type": "hexcasting:pattern",
@ -92,7 +92,7 @@
"anchor": "hexcasting:zone_entity/item",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of dropped items near the position."
"text": "hexcasting.page.entities11"
},
{
"type": "hexcasting:pattern",
@ -100,7 +100,7 @@
"anchor": "hexcasting:zone_entity/not_item",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-dropped-item entities near the position."
"text": "hexcasting.page.entities12"
},
{
"type": "hexcasting:pattern",
@ -108,7 +108,7 @@
"anchor": "hexcasting:zone_entity/player",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of players near the position."
"text": "hexcasting.page.entities13"
},
{
"type": "hexcasting:pattern",
@ -116,7 +116,7 @@
"anchor": "hexcasting:zone_entity/not_player",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-player characters near the position."
"text": "hexcasting.page.entities14"
},
{
"type": "hexcasting:pattern",
@ -124,7 +124,7 @@
"anchor": "hexcasting:zone_entity/living",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of living creatures near the position."
"text": "hexcasting.page.entities15"
},
{
"type": "hexcasting:pattern",
@ -132,7 +132,7 @@
"anchor": "hexcasting:zone_entity/not_living",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of non-living entities near the position."
"text": "hexcasting.page.entities16"
},
{
"type": "hexcasting:pattern",
@ -140,7 +140,7 @@
"anchor": "hexcasting:zone_entity",
"input": "vector, number",
"output": "list of entities",
"text": "$(br)Take a position and maximum distance on the stack, and combine them into a list of all entities near the position."
"text": "hexcasting.page.entities17"
}
]
}

View file

@ -12,7 +12,7 @@
"anchor": "hexcasting:create_lava",
"input": "vector",
"output": "",
"text": "Summon a block of lava or insert a bucket's worth into a block at the given position. Costs about one $(item)Charged Amethyst/$."
"text": "hexcasting.page.create_lava1"
}
]
}

View file

@ -12,11 +12,11 @@
"anchor": "hexcasting:flight",
"input": "entity, number, number",
"output": "",
"text": "The power of flight! I have wrestled Nature to its knees. But Nature is vengeful, and itches for me to break its contract so it may break my shins."
"text": "hexcasting.page.flight1"
},
{
"type": "patchouli:text",
"text": "The entity (which must be a player) will be endowed with flight. The first number is the number of seconds they may fly for, and the second number is the radius of the zone they may fly in. If the recipient exits that zone, or their timer runs out while midair, the gravity that they spurned will get its revenge. Painfully.$(br2)It costs approximately 1 $(item)Amethyst Dust/$ multiplied by the radius, per second of flight."
"text": "hexcasting.page.flight2"
}
]
}

View file

@ -9,11 +9,11 @@
{
"type": "hexcasting:pattern",
"op_id": "hexcasting:sentinel/create/great",
"text": "Summon a greater version of my $(l:patterns/sentinels)$(thing)Sentinel/$. Costs about 2 $(item)Amethyst Dust/$s."
"text": "hexcasting.page.greater_sentinel1"
},
{
"type": "patchouli:text",
"text": "The stronger sentinel acts like the normal one I can summon without the use of a Great Spell, if a little more visually interesting. However, the range in which my spells can work is extended to a small region around my greater sentinel, about 16 blocks. In other words, no matter where in the world I am, I can interact with things around my sentinel (the mysterious forces of chunkloading notwithstanding)."
"text": "hexcasting.page.greater_sentinel2"
}
]
}

View file

@ -13,11 +13,11 @@
"input": "entity, vector",
"output": "",
"hex_size": 8,
"text": "Far more powerful than $(l:patterns/spells/basic#OpBlink)$(action)Blink/$, this spell lets me teleport nearly anywhere in the entire world! There does seem to be a limit, but it is $(italic)much/$ greater than the normal radius of influence I am used to."
"text": "hexcasting.page.teleport1"
},
{
"type": "patchouli:text",
"text": "The entity will be teleported by the given vector, which is an offset from its given position. No matter the distance, it always seems to cost about ten $(item)Charged Crystal/$s.$(br2)The transference is not perfect, and it seems when teleporting something as complex as a player, their inventory doesn't $(italic)quite/$ stay attached."
"text": "hexcasting.page.teleport2"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Weather Manipulation",
"name": "hexcasting.entry.weather_manip",
"category": "hexcasting:patterns/great_spells",
"icon": "minecraft:textures/mob_effect/levitation.png",
"sortnum": 1,
@ -13,7 +13,7 @@
"input": "vector",
"output": "",
"hex_size": 6,
"text": "I command the heavens! This spell will summon a bolt of lightning to strike the earth where I direct it. Costs about 3 $(item)Amethyst Shard/$s."
"text": "hexcasting.page.weather_manip1"
},
{
"type": "hexcasting:pattern",
@ -22,7 +22,7 @@
"input": "",
"output": "",
"hex_size": 6,
"text": "I control the clouds! This spell will summon rain across the world I cast it upon. Costs about 2 $(item)Amethyst Shard/$s. Does nothing if it is already raining."
"text": "hexcasting.page.weather_manip2"
},
{
"type": "hexcasting:pattern",
@ -31,7 +31,7 @@
"input": "",
"output": "",
"hex_size": 6,
"text": "A counterpart to summoning rain. This spell will dispel rain across the world I cast it upon. Costs about 1 $(item)Amethyst Shard/$. Does nothing if the skies are already clear."
"text": "hexcasting.page.weather_manip3"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Zeniths",
"name": "hexcasting.entry.zeniths",
"category": "hexcasting:patterns/great_spells",
"icon": "minecraft:potion{Potion:'minecraft:regeneration'}",
"advancement": "hexcasting:root",
@ -8,7 +8,7 @@
"pages": [
{
"type": "patchouli:text",
"text": "This family of spells all impart a positive potion effect upon an entity.$(br2)See the $(l:patterns/spells/nadirs)$(action)Nadirs/$ for more information."
"text": "hexcasting.page.zeniths1"
},
{
"type": "hexcasting:pattern",
@ -16,7 +16,7 @@
"anchor": "hexcasting:potion/regeneration",
"input": "entity, number, number",
"output": "",
"text": "Bestows regeneration. Base cost is one $(item)Amethyst Dust/$ per second."
"text": "hexcasting.page.zeniths2"
},
{
"type": "hexcasting:pattern",
@ -24,7 +24,7 @@
"anchor": "hexcasting:potion/night_vision",
"input": "entity, number",
"output": "",
"text": "Bestows night vision. Base cost is one $(item)Amethyst Dust/$ per 5 seconds."
"text": "hexcasting.page.zeniths3"
},
{
"type": "hexcasting:pattern",
@ -32,7 +32,7 @@
"anchor": "hexcasting:potion/absorption",
"input": "entity, number, number",
"output": "",
"text": "Bestows absorption. Base cost is one $(item)Amethyst Dust/$ per second."
"text": "hexcasting.page.zeniths4"
},
{
"type": "hexcasting:pattern",
@ -40,7 +40,7 @@
"anchor": "hexcasting:potion/haste",
"input": "entity, number, number",
"output": "",
"text": "Bestows haste. Base cost is one $(item)Amethyst Dust/$ per 3 seconds."
"text": "hexcasting.page.zeniths5"
},
{
"type": "hexcasting:pattern",
@ -48,7 +48,7 @@
"anchor": "hexcasting:potion/strength",
"input": "entity, number, number",
"output": "",
"text": "Bestows strength. Base cost is one $(item)Amethyst Dust/$ per 3 seconds."
"text": "hexcasting.page.zeniths6"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "List Manipulation",
"name": "hexcasting.entry.lists",
"category": "hexcasting:patterns",
"icon": "minecraft:oak_sign",
"sortnum": 5,
@ -12,7 +12,7 @@
"anchor": "hexcasting:index",
"input": "list, number",
"output": "any",
"text": "Remove the number at the top of the stack, then replace the list at the top with the nth element of that list (where n is the number you removed). Replaces the list with Null if the number is out of bounds."
"text": "hexcasting.page.lists1"
},
{
"type": "hexcasting:pattern",
@ -20,7 +20,7 @@
"anchor": "hexcasting:append",
"input": "list, any",
"output": "any",
"text": "Remove the top of the stack, then add it to the end of the list at the top of the stack."
"text": "hexcasting.page.lists2"
},
{
"type": "hexcasting:pattern",
@ -28,7 +28,7 @@
"anchor": "hexcasting:concat",
"input": "list, list",
"output": "list",
"text": "Remove the list at the top of the stack, then add all its elements to the end of the list at the top of the stack."
"text": "hexcasting.page.lists3"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Math",
"name": "hexcasting.entry.math",
"category": "hexcasting:patterns",
"icon": "minecraft:stick",
"sortnum": 2,
@ -8,7 +8,7 @@
"pages": [
{
"type": "patchouli:text",
"text": "Many mathematical operations function on both numbers and vectors. Such arguments are written as \"num/vec\"."
"text": "hexcasting.page.math1"
},
{
"type": "patchouli:empty"
@ -19,11 +19,11 @@
"anchor": "hexcasting:add",
"input": "num/vec, num/vec",
"output": "num/vec",
"text": "Perform addition."
"text": "hexcasting.page.math2"
},
{
"type": "patchouli:text",
"text": "As such:$(li)With two numbers at the top of the stack, combines them into their sum.$(li)With a number and a vector, removes the number from the stack and adds it to each element of the vector.$(li)With two vectors, combines them by summing corresponding components into a new vector (i.e. [1, 2, 3] + [0, 4, -1] = [1, 6, 2])."
"text": "hexcasting.page.math3"
},
{
"type": "hexcasting:pattern",
@ -31,11 +31,11 @@
"anchor": "hexcasting:sub",
"input": "num/vec, num/vec",
"output": "num/vec",
"text": "Perform subtraction."
"text": "hexcasting.page.math4"
},
{
"type": "patchouli:text",
"text": "As such:$(li)With two numbers at the top of the stack, combines them into their difference.$(li)With a number and a vector, removes the number from the stack and subtracts it from each element of the vector.$(li)With two vectors, combines them by subtracting each component.$(br2)In all cases, the top of the stack or its components are subtracted $(italic)from/$ the second-from-the-top."
"text": "hexcasting.page.math5"
},
{
"type": "hexcasting:pattern",
@ -43,11 +43,11 @@
"anchor": "hexcasting:mul_dot",
"input": "num/vec, num/vec",
"output": "num/vec",
"text": "Perform multiplication or the dot product."
"text": "hexcasting.page.math6"
},
{
"type": "patchouli:text",
"text": "As such:$(li)With two numbers, combines them into their product.$(li)With a number and a vector, removes the number from the stack and multiplies each component of the vector by that number.$(li)With two vectors, combines them into their $(l:https://www.mathsisfun.com/algebra/vectors-dot-product.html)dot product/$."
"text": "hexcasting.page.math7"
},
{
"type": "hexcasting:pattern",
@ -55,11 +55,11 @@
"anchor": "hexcasting:div_cross",
"input": "num/vec, num/vec",
"output": "num/vec",
"text": "Perform division or the cross product."
"text": "hexcasting.page.math8"
},
{
"type": "patchouli:text",
"text": "As such:$(li)With two numbers, combines them into their quotient.$(li)With a number and a vector, removes the number and divides it by each element of the vector.$(li)With two vectors, combines them into their $(l:https://www.mathsisfun.com/algebra/vectors-cross-product.html)cross product/$.$(br2)In the first and second cases, the top of the stack or its components comprise the dividend, and the second-from-the-top or its components are the divisor.$(p)WARNING: Never divide by zero!"
"text": "hexcasting.page.math9"
},
{
"type": "hexcasting:pattern",
@ -67,11 +67,11 @@
"anchor": "hexcasting:abs_len",
"input": "num/vec",
"output": "number",
"text": "Compute the absolute value or length."
"text": "hexcasting.page.math10"
},
{
"type": "patchouli:text",
"text": "Replaces a number with its absolute value, or a vector with its length."
"text": "hexcasting.page.math11"
},
{
"type": "hexcasting:pattern",
@ -79,11 +79,11 @@
"anchor": "hexcasting:pow_proj",
"input": "num/vec, num/vec",
"output": "num/vec",
"text": "Perform exponentiation or vector projection."
"text": "hexcasting.page.math12"
},
{
"type": "patchouli:text",
"text": "$(li)With two numbers, combines them by raising the first to the power of the second.$(li)With a number and a vector, removes the number and raises each component of the vector to the number's power.$(li)With two vectors, combines them into the $(l:https://en.wikipedia.org/wiki/Vector_projection)vector projection/$ of the top of the stack onto the second-from-the-top.$(br2)In the first and second cases, the first argument or its components are the base, and the second argument or its components are the exponent."
"text": "hexcasting.page.math13"
},
{
"type": "hexcasting:pattern",
@ -91,7 +91,7 @@
"anchor": "hexcasting:construct_vec",
"input": "num, num, num",
"output": "vector",
"text": "Combine three numbers at the top of the stack into a vector's X, Y, and Z components (top to bottom)."
"text": "hexcasting.page.math14"
},
{
"type": "hexcasting:pattern",
@ -99,7 +99,7 @@
"anchor": "hexcasting:deconstruct_vec",
"input": "vector",
"output": "num, num, num",
"text": "Split a vector into its X, Y, and Z components (top to bottom)."
"text": "hexcasting.page.math15"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Meta-evaluation",
"name": "hexcasting.entry.meta",
"category": "hexcasting:patterns",
"icon": "minecraft:shulker_box",
"sortnum": 6,
@ -12,7 +12,7 @@
"anchor": "hexcasting:write",
"input": "any",
"output": "",
"text": "Remove the top iota from the stack and save it into the $(item)Focus/$ or $(item)Spellbook/$ in my other hand."
"text": "hexcasting.page.meta1"
},
{
"type": "hexcasting:pattern",
@ -20,7 +20,7 @@
"anchor": "hexcasting:read",
"input": "",
"output": "any",
"text": "Copy the iota stored in the $(item)Focus/$ or $(item)Spellbook/$ in my other hand, and add it to the stack."
"text": "hexcasting.page.meta2"
},
{
"type": "hexcasting:pattern",
@ -28,11 +28,11 @@
"anchor": "hexcasting:eval",
"input": "list of patterns",
"output": "many",
"text": "Remove a list of patterns from the stack, then cast them sequentially, as if I had drawn them myself with my $(item)Staff/$.$(br)Costs about one $(item)Amethyst Shard/$."
"text": "hexcasting.page.meta3"
},
{
"type": "patchouli:text",
"text": "This can be $(italic)very/$ powerful in tandem with $(l:items/focus)$(item)Foci/$.$(br2)It also makes the bureaucracy of Nature a \"Turing-complete\" system, according to one esoteric scroll I found.$(br2)However, it seems there's a limit to how many times a _Hex can cast itself-- Nature doesn't look kindly on runaway spells!$(br2)In addition, with the energies swirling as wildly as they are, any mishap will cause the evaluation to become too unstable and immediately exit."
"text": "hexcasting.page.meta4"
},
{
"type": "hexcasting:pattern",
@ -40,11 +40,11 @@
"anchor": "hexcasting:for_each",
"input": "list of patterns, list",
"output": "many",
"text": "Remove a list of patterns and a list from the stack, then cast the given pattern over each element of the second list.$(br)Costs about one $(item)Charged Amethyst/$."
"text": "hexcasting.page.meta5"
},
{
"type": "patchouli:text",
"text": "More specifically, for each element in the second list, it will:$(li)Creates a new stack, with everything on the current stack plus that element$(li)Draw all the patterns in the first list$(li)Save all the iotas remaining on the stack to a list$(br)Then, after all is said and done, pushes the list of saved iotas onto the main stack.$(br2)No wonder all the practitioners of this art go mad."
"text": "hexcasting.page.meta6"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Numbers",
"name": "hexcasting.entry.numbers",
"category": "hexcasting:patterns",
"icon": "minecraft:comparator",
"sortnum": 1,
@ -8,12 +8,12 @@
"pages": [
{
"type": "hexcasting:manual_pattern",
"header": "Numerical Reflection",
"header": "hexcasting.page.numbers1header",
"anchor": "Numbers",
"input": "",
"input": "hexcasting.page.numbers1",
"output": "number",
"args": "-> number",
"text": "Irritatingly, there is no easy way to draw numbers. Here is the method Nature deigned to give us.",
"text": "",
"patterns": [{
"startdir": "SOUTH_EAST",
"signature": "aqaa"
@ -25,12 +25,12 @@
},
{
"type": "patchouli:text",
"text": "First, I draw one of the two shapes shown on the other page. Next, the $(italic)angles/$ following will modify a running count starting at 0.$(li)Forward: Add 1$(li)Left: Add 5$(li)Right: Add 10$(li)Sharp Left: Multiply by 2$(li)Sharp Right: Divide by 2.$(br)The clockwise version of the pattern, on the right of the other page, will negate the value at the very end. (The left-hand counter-clockwise version keeps the number positive).$(p)Once I finish drawing, the number's pushed to the top of the stack."
"text": "hexcasting.page.numbers2"
},
{
"type": "hexcasting:manual_pattern_nosig",
"header": "Example 1",
"text": "This pattern pushes 10.",
"header": "hexcasting.page.numbers3header",
"text": "hexcasting.page.numbers3",
"patterns": {
"startdir": "SOUTH_EAST",
"signature": "aqaae"
@ -38,8 +38,8 @@
},
{
"type": "hexcasting:manual_pattern_nosig",
"header": "Example 2",
"text": "This pattern pushes 7: 5 + 1 + 1.",
"header": "hexcasting.page.numbers4header",
"text": "hexcasting.page.numbers4",
"patterns": {
"startdir": "SOUTH_WEST",
"signature": "aqaaqww"
@ -47,8 +47,8 @@
},
{
"type": "hexcasting:manual_pattern_nosig",
"header": "Example 3",
"text": "This pattern pushes -32: negate 1 + 5 + 10 * 2.",
"header": "hexcasting.page.numbers5header",
"text": "hexcasting.page.numbers5",
"patterns": {
"startdir": "NORTH_EAST",
"signature": "deddwqea"
@ -56,8 +56,8 @@
},
{
"type": "hexcasting:manual_pattern_nosig",
"header": "Example 4",
"text": "This pattern pushes 4.5: 5 / 2 + 1 + 1.",
"header": "hexcasting.page.numbers6header",
"text": "hexcasting.page.numbers6",
"patterns": {
"startdir": "SOUTH_EAST",
"signature": "aqaaqdww"

View file

@ -1,5 +1,5 @@
{
"name": "How to Read this Section",
"name": "hexcasting.entry.readers_guide",
"category": "hexcasting:patterns",
"icon": "minecraft:knowledge_book",
"advancement": "hexcasting:root",
@ -7,21 +7,21 @@
"pages": [
{
"type": "patchouli:text",
"text": "I've divided all the valid patterns I've found into sections based on what they do, more or less. I've written down the stroke order of the patterns as well, if I managed to find it in my studies, with the start of the pattern marked with a red dot.$(br2)If an action is cast by multiple patterns, as is the case with some simple actions, I'll write them all side-by-side."
"text": "hexcasting.page.readers_guide1"
},
{
"type": "patchouli:spotlight",
"item": "hexcasting:scroll",
"link_recipe": true,
"text": "For a few patterns, however, I was $(italic)not/$ able to find the stroke order, just the shape. I suspect the order to draw them in are out there, locked away in the ancient libraries and dungeons of the world.$(br2)In such cases I just draw the pattern without any information on the order to draw it in."
"text": "hexcasting.page.readers_guide2"
},
{
"type": "patchouli:text",
"text": "I also write the types of iota that the action will consume or modify, a \"\u2192\", and the types of iota the action will create.$(p)For example, \"$(n)vector, number/$ \u2192 $(n)vector/$\" means the action will remove a vector and a number from the top of the stack, and then add a vector; or, put another way, will remove a number from the stack, and then modify the vector at the top of the stack. (The number needs to be on the top of the stack, with the vector right below it.)"
"text": "hexcasting.page.readers_guide3"
},
{
"type": "patchouli:text",
"text": "\"\u2192 $(n)entity/$\" means it'll just push an entity. \"$(n)entity, vector/$ \u2192\" means it removes an entity and a vector, and doesn't push anything.$(br2)Finally, if I find the little dot marking the stroke order too slow or confusing, I can press $(thing)Control/Command/$ to display a gradient, where the start of the pattern is darkest and the end is lightest. This works on scrolls and when casting, too!"
"text": "hexcasting.page.readers_guide4"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Sentinels",
"name": "hexcasting.entry.sentinels",
"category": "hexcasting:patterns",
"icon": "minecraft:purple_candle",
"sortnum": 7,
@ -8,11 +8,11 @@
"pages": [
{
"type": "patchouli:text",
"text": "$(italic)Hence, away! Now all is well,$(br)One aloof stand sentinel./$$(br2)A $(thing)Sentinel/$ is a mysterious force I can summon to assist in the casting of _Hexes, like a familiar or guardian spirit. It appears as a spinning geometric shape to my eyes, but is invisible to everyone else."
"text": "hexcasting.page.sentinels1"
},
{
"type": "patchouli:text",
"text": "It has several interesting properties:$(li)It does not appear to be an entity; no one else can interact with it.$(li)Once summoned, it stays in place until banished.$(li)I am always able to see it, even through blocks."
"text": "hexcasting.page.sentinels2"
},
{
"type": "hexcasting:pattern",
@ -20,7 +20,7 @@
"anchor": "hexcasting:sentinel/create",
"input": "vector",
"output": "",
"text": "Summon my sentinel at the given position. Costs about 1 $(item)Amethyst Dust/$."
"text": "hexcasting.page.sentinels3"
},
{
"type": "hexcasting:pattern",
@ -28,7 +28,7 @@
"anchor": "hexcasting:sentinel/destroy",
"input": "",
"output": "",
"text": "Banish my sentinel, and remove it from the world. Costs a negligible amount of _media."
"text": "hexcasting.page.sentinels4"
},
{
"type": "hexcasting:pattern",
@ -36,7 +36,7 @@
"anchor": "hexcasting:sentinel/get_pos",
"input": "",
"output": "vector",
"text": "Add the position of my sentinel to the stack, or Null if it isn't summoned. Costs a negligible amount of _media."
"text": "hexcasting.page.sentinels5"
},
{
"type": "hexcasting:pattern",
@ -44,7 +44,7 @@
"anchor": "hexcasting:sentinel/wayfind",
"input": "vector",
"output": "vector",
"text": "Transform the position vector on the top of the stack into a normalized vector pointing from its old position to my sentinel, or Null if it isn't summoned. Costs a negligible amount of _media."
"text": "hexcasting.page.sentinels6"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Basic Spells",
"name": "hexcasting.entry.basic_spell",
"category": "hexcasting:patterns/spells",
"icon": "minecraft:bookshelf",
"sortnum": 0,
@ -12,11 +12,11 @@
"anchor": "hexcasting:explode",
"input": "vector, number",
"output": "",
"text": "Remove a number and vector from the stack, then create an explosion at the given location with the given power."
"text": "hexcasting.page.basic_spell1"
},
{
"type": "patchouli:text",
"text": "A power of 3 is about as much as a Creeper's blast; 4 is about as much as a TNT blast. Nature refuses to give me a blast of more than 10 power, though.$(br2)Costs about one $(item)Amethyst Shard/$, plus an extra $(item)Amethyst Shard/$ per point of explosion power."
"text": "hexcasting.page.basic_spell2"
},
{
"type": "hexcasting:pattern",
@ -24,11 +24,11 @@
"anchor": "hexcasting:explode/fire",
"input": "vector, number",
"output": "",
"text": "Remove a number and vector from the stack, then create a fiery explosion at the given location with the given power."
"text": "hexcasting.page.basic_spell3"
},
{
"type": "patchouli:text",
"text": "Costs three $(item)Amethyst Shards/$, plus about one extra $(item)Amethyst Shard/$ per point of explosion power. Otherwise, the same as $(l:hexcasting:patterns/spells/basic#OpExplode)$(action)Explosion/$, except with fire."
"text": "hexcasting.page.basic_spell4"
},
{
"type": "hexcasting:pattern",
@ -36,7 +36,7 @@
"anchor": "hexcasting:add_motion",
"input": "entity, vector",
"output": "",
"text": "Remove an entity and direction from the stack, then give a push to the given entity in the given direction. The strength of the impulse is determined by the length of the vector.$(br)Costs units of $(item)Amethyst Dust/$ proportional to the square of the length of the vector; thus a push vector of length 5 would consume five $(item)Amethyst Shards$(0) or equivalent."
"text": "hexcasting.page.basic_spell5"
},
{
"type": "hexcasting:pattern",
@ -44,7 +44,7 @@
"anchor": "hexcasting:blink",
"input": "entity, number",
"output": "",
"text": "Remove an entity and length from the stack, then teleport the given entity along its look vector by the given length.$(br)Costs about 1 $(item)Amethyst Shard/$s times the the distance teleported."
"text": "hexcasting.page.basic_spell6"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Blockworks",
"name": "hexcasting.entry.blockworks",
"category": "hexcasting:patterns/spells",
"icon": "minecraft:cobblestone",
"sortnum": 1,
@ -12,7 +12,7 @@
"anchor": "hexcasting:place_block",
"input": "vector",
"output": "",
"text": "Remove a location from the stack, then pick a block item and place it at the given location.$(br)Costs about 1 $(item)Amethyst Dust/$."
"text": "hexcasting.page.blockworks1"
},
{
"type": "hexcasting:pattern",
@ -20,7 +20,7 @@
"anchor": "hexcasting:break_block",
"input": "vector",
"output": "",
"text": "Remove a location from the stack, then break the block at the given location. This spell can break nearly anything a Diamond Pickaxe can break.$(br)Costs about 3 $(item)Amethyst Dust/$s."
"text": "hexcasting.page.blockworks2"
},
{
"type": "hexcasting:pattern",
@ -28,7 +28,7 @@
"anchor": "hexcasting:create_water",
"input": "vector",
"output": "",
"text": "Summon a block of water or insert a bucket's worth into a block at the given position. Costs about one $(item)Amethyst Dust/$."
"text": "hexcasting.page.blockworks3"
},
{
"type": "hexcasting:pattern",
@ -36,7 +36,7 @@
"anchor": "hexcasting:destroy_water",
"input": "vector",
"output": "",
"text": "Destroy a great deal of water around the given position. Costs about two $(item)Amethyst Crystal/$s."
"text": "hexcasting.page.blockworks4"
},
{
"type": "hexcasting:pattern",
@ -44,7 +44,7 @@
"anchor": "hexcasting:conjure_block",
"input": "vector",
"output": "",
"text": "Conjure a barrier, using my colorizer. Costs about one $(item)Amethyst Dust/$."
"text": "hexcasting.page.blockworks5"
},
{
"type": "hexcasting:pattern",
@ -52,7 +52,7 @@
"anchor": "hexcasting:conjure_light",
"input": "vector",
"output": "",
"text": "Conjure a magical light, using my colorizer. Costs about one $(item)Amethyst Dust/$."
"text": "hexcasting.page.blockworks6"
},
{
"type": "hexcasting:pattern",
@ -60,7 +60,7 @@
"anchor": "hexcasting:bonemeal",
"input": "vector",
"output": "",
"text": "Encourage a plant or sapling at the target position to grow, as if $(item)Bonemeal/$ was applied. Costs about one $(item)Amethyst Dust/$."
"text": "hexcasting.page.blockworks7"
}
]
}

View file

@ -12,7 +12,7 @@
"anchor": "hexcasting:colorize",
"input": "",
"output": "",
"text": "I must be holding a $(item)Pigment/$ in my other hand to cast this spell. When I do, it will consume the dye and permanently change my internal pigment (at least, until I cast the spell again). Costs about 1 $(item)Amethyst Dust/$."
"text": "hexcasting.page.colorize1"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Crafting Hexcasting Items",
"name": "hexcasting.entry.hexcasting_spell",
"category": "hexcasting:patterns/spells",
"icon": "hexcasting:artifact{patterns:[]}",
"sortnum": 3,
@ -8,7 +8,7 @@
"pages": [
{
"type": "patchouli:text",
"text": "These three spells each create an item that casts a _Hex.$(br)They all require me to hold the empty item in my off-hand, and require two things: the list of patterns to be cast, and an entity representing a dropped stack of $(item)Amethyst/$ to form the item's battery.$(br2)See $(l:items/hexcasting)this entry/$ for more information."
"text": "hexcasting.page.hexcasting_spell1"
},
{
"type": "hexcasting:pattern",
@ -16,7 +16,7 @@
"anchor": "hexcasting:craft/cypher",
"input": "entity, list of patterns",
"output": "",
"text": "Costs about one $(item)Charged Amethyst/$."
"text": "hexcasting.page.hexcasting_spell2"
},
{
"type": "hexcasting:pattern",
@ -24,7 +24,7 @@
"anchor": "hexcasting:craft/trinket",
"input": "entity, list of patterns",
"output": "",
"text": "Costs about five $(item)Charged Amethyst/$s.",
"text": "hexcasting.page.hexcasting_spell3",
"hex_size": 8
},
{
@ -33,7 +33,7 @@
"anchor": "hexcasting:craft/artifact",
"input": "entity, list of patterns",
"output": "",
"text": "Costs about ten $(item)Charged Amethyst/$s.",
"text": "hexcasting.page.hexcasting_spell4",
"hex_size": 5
},
{
@ -42,11 +42,11 @@
"anchor": "hexcasting:recharge",
"input": "entity",
"output": "",
"text": "Recharge a _media-containing item in my other hand. Costs about one $(item)Charged Amethyst/$."
"text": "hexcasting.page.hexcasting_spell5"
},
{
"type": "patchouli:text",
"text": "This spell is cast in a similar method to the crafting spells; an entity representing a dropped stack of $(item)Amethyst/$ is provided, and recharges the _media battery of the item in my other hand.$(br2)This spell $(italic)cannot/$ recharge the item farther than its original battery size."
"text": "hexcasting.page.hexcasting_spell6"
},
{
"type": "hexcasting:pattern",
@ -54,11 +54,11 @@
"anchor": "hexcasting:erase",
"input": "",
"output": "",
"text": "Erase a hex-containing item in my other hand. Costs about one $(item)Amethyst Dust/$."
"text": "hexcasting.page.hexcasting_spell7"
},
{
"type": "patchouli:text",
"text": "This spell voids all media stored inside the item I am erasing. The pressure inside the item from the stored media is incredible. It's all the spell can do to safely disarm it; to try and recover it would be unthinkable."
"text": "hexcasting.page.hexcasting_spell8"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Working with Items",
"name": "hexcasting.entry.itempicking",
"category": "hexcasting:patterns/spells",
"icon": "minecraft:item_frame",
"advancement": "hexcasting:root",
@ -8,15 +8,15 @@
"pages": [
{
"type": "patchouli:text",
"text": "Certain spells, such as $(l:hexcasting:patterns/spells/blockworks#OpPlaceBlock)$(action)Place Block/$, will consume additional items from my inventory. When this happens, the spell will first look for the item to use, and then draw from all such items in my inventory.$(br2)This process is called \"picking an item.\""
"text": "hexcasting.page.itempicking1"
},
{
"type": "patchouli:text",
"text": "More specifically:$(li)First, the spell will search for the first valid item in my hotbar to the $(italic)right of my staff/$, wrapping around at the right-hand side, and starting at the first slot if my staff is in my off-hand.$(li)Second, the spell will draw that item from as $(italic)far back in my inventory/$ as possible, prioritizing the main inventory over the hotbar."
"text": "hexcasting.page.itempicking2"
},
{
"type": "patchouli:text",
"text": "This way, I can keep a \"chooser\" item on my hotbar to tell the spell what to use, and fill the rest of my inventory with that item to keep the spell well-stocked."
"text": "hexcasting.page.itempicking3"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Nadirs",
"name": "hexcasting.entry.nadirs",
"category": "hexcasting:patterns/spells",
"icon": "minecraft:potion{Potion:'minecraft:poison'}",
"advancement": "hexcasting:root",
@ -8,11 +8,11 @@
"pages": [
{
"type": "patchouli:text",
"text": "This family of spells all impart a negative potion effect upon an entity. They all take an entity, the recipient, and one or two numbers, the first being the duration and the second, if present, being the potency (starting at 1).$(br2)Each one has a \"base cost;\" the actual cost is equal to that base cost, multiplied by the potency."
"text": "hexcasting.page.nadirs1"
},
{
"type": "patchouli:text",
"text": "According to certain legends, these spells and their sisters, the $(l:patterns/great_spells/zeniths)$(action)Zeniths/$, were \"[...] inspired by a world near to this one, where powerful wizards would gather magic from the land and hold duels to the death. Unfortunately, much was lost in the translation ...\"$(br2)Perhaps that is the reason for their peculiar names."
"text": "hexcasting.page.nadirs2"
},
{
"type": "hexcasting:pattern",
@ -20,7 +20,7 @@
"anchor": "hexcasting:potion/weakness",
"input": "entity, number, number",
"output": "",
"text": "Bestows weakness. Base cost is one $(item)Amethyst Dust/$ per 10 seconds."
"text": "hexcasting.page.nadirs3"
},
{
"type": "hexcasting:pattern",
@ -28,7 +28,7 @@
"anchor": "hexcasting:potion/levitation",
"input": "entity, number",
"output": "",
"text": "Bestows levitation. Base cost is one $(item)Amethyst Dust/$ per 5 seconds."
"text": "hexcasting.page.nadirs4"
},
{
"type": "hexcasting:pattern",
@ -36,7 +36,7 @@
"anchor": "hexcasting:potion/wither",
"input": "entity, number, number",
"output": "",
"text": "Bestows withering. Base cost is one $(item)Amethyst Dust/$ per second."
"text": "hexcasting.page.nadirs5"
},
{
"type": "hexcasting:pattern",
@ -44,7 +44,7 @@
"anchor": "hexcasting:potion/poison",
"input": "entity, number, number",
"output": "",
"text": "Bestows poison. Base cost is one $(item)Amethyst Dust/$ per 3 seconds."
"text": "hexcasting.page.nadirs6"
},
{
"type": "hexcasting:pattern",
@ -52,7 +52,7 @@
"anchor": "hexcasting:potion/slowness",
"input": "entity, number, number",
"output": "",
"text": "Bestows slowness. Base cost is one $(item)Amethyst Dust/$ per 5 seconds."
"text": "hexcasting.page.nadirs7"
}
]
}

View file

@ -1,5 +1,5 @@
{
"name": "Stack Manipulation",
"name": "hexcasting.entry.stackmanip",
"category": "hexcasting:patterns",
"icon": "minecraft:piston",
"sortnum": 3,
@ -12,7 +12,7 @@
"anchor": "hexcasting:undo",
"input": "any",
"output": "",
"text": "Removes the top of the stack and does nothing with it. This is handy when I make a mistake."
"text": "hexcasting.page.stackmanip1"
},
{
"type": "hexcasting:pattern",
@ -20,7 +20,7 @@
"anchor": "hexcasting:duplicate",
"input": "any",
"output": "any, any",
"text": "Duplicates the top iota of the stack."
"text": "hexcasting.page.stackmanip2"
},
{
"type": "hexcasting:pattern",
@ -28,7 +28,7 @@
"anchor": "hexcasting:swap",
"input": "any, any",
"output": "any, any",
"text": "Swaps the top two iotas of the stack."
"text": "hexcasting.page.stackmanip3"
},
{
"type": "patchouli:empty"
@ -39,11 +39,11 @@
"anchor": "hexcasting:fisherman",
"input": "num",
"output": "any",
"text": "Grabs the nth element in the stack and brings it to the top."
"text": "hexcasting.page.stackmanip4"
},
{
"type": "patchouli:text",
"text": "The Fisherman's Gambit takes a number and reaches that far $(italic)down/$ the stack-- pulling it from its original position up to the top of the stack. For example, using the Gambit with the number 2 will pull the second item on the stack to the top, effectively acting as a more-cumbersome Jester's Gambit. Using the Gambit with a negative number, a fraction, or a length larger than the stack will dredge all sorts of unknowable patterns from the aether, and is liable to cause a mishap."
"text": "hexcasting.page.stackmanip5"
}
]
}