From 6ad14e6fc88b3a80d1dd9a28fa01bf10abe4cd53 Mon Sep 17 00:00:00 2001 From: gamma-delta <29877714+gamma-delta@users.noreply.github.com> Date: Sun, 12 Jun 2022 15:06:10 -0500 Subject: [PATCH] close #101 ... well, more like touch up --- .../casting/operators/spells/OpBlink.kt | 2 +- .../casting/operators/spells/OpBreakBlock.kt | 8 ++------ .../casting/operators/spells/OpExplode.kt | 10 ++++++---- .../casting/operators/spells/OpExtinguish.kt | 2 +- .../casting/operators/spells/OpPlaceBlock.kt | 2 +- .../casting/operators/spells/OpRecharge.kt | 14 ++++++-------- .../OpTheOnlyReasonAnyoneDownloadedPsi.kt | 8 ++------ .../assets/hexcasting/lang/en_us.json | 18 +++++++++--------- art/slate_bg.png | Bin 0 -> 45191 bytes 9 files changed, 28 insertions(+), 36 deletions(-) create mode 100644 art/slate_bg.png diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBlink.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBlink.kt index fb59c18e..ad0f2675 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBlink.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBlink.kt @@ -37,7 +37,7 @@ object OpBlink : SpellOperator { return Triple( Spell(target, delta), - ManaConstants.SHARD_UNIT * delta.roundToInt(), + ManaConstants.SHARD_UNIT * (delta * 0.5).roundToInt(), listOf( ParticleSpray.cloud(targetMiddlePos, 2.0, 50), ParticleSpray.burst(targetMiddlePos.add(dvec), 2.0, 100) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBreakBlock.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBreakBlock.kt index e89ea4d9..abd9706b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBreakBlock.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBreakBlock.kt @@ -2,11 +2,7 @@ package at.petrak.hexcasting.common.casting.operators.spells import at.petrak.hexcasting.api.misc.ManaConstants import at.petrak.hexcasting.api.mod.HexConfig -import at.petrak.hexcasting.api.spell.getChecked -import at.petrak.hexcasting.api.spell.ParticleSpray -import at.petrak.hexcasting.api.spell.RenderedSpell -import at.petrak.hexcasting.api.spell.SpellDatum -import at.petrak.hexcasting.api.spell.SpellOperator +import at.petrak.hexcasting.api.spell.* import at.petrak.hexcasting.api.spell.casting.CastingContext import at.petrak.hexcasting.xplat.IXplatAbstractions import net.minecraft.core.BlockPos @@ -26,7 +22,7 @@ object OpBreakBlock : SpellOperator { val centered = Vec3.atCenterOf(BlockPos(pos)) return Triple( Spell(pos), - ManaConstants.DUST_UNIT * 2, + (ManaConstants.DUST_UNIT * 1.125).toInt(), listOf(ParticleSpray.burst(centered, 1.0)) ) } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExplode.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExplode.kt index f7a987a2..8d664d3a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExplode.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExplode.kt @@ -19,10 +19,12 @@ class OpExplode(val fire: Boolean) : SpellOperator { val pos = args.getChecked(0, argc) val strength = args.getChecked(1, argc) ctx.assertVecInRange(pos) + val clampedStrength = Mth.clamp(strength, 0.0, 10.0) + val cost = ManaConstants.DUST_UNIT * (3 * clampedStrength + if (fire) 0.125 else 1.0) return Triple( - Spell(pos, strength, this.fire), - ((1 + Mth.clamp(strength.toFloat(), 0f, 10f) + if (this.fire) 2 else 0) * ManaConstants.SHARD_UNIT).toInt(), - listOf(ParticleSpray.burst(pos, strength, 50)) + Spell(pos, clampedStrength, this.fire), + cost.toInt(), + listOf(ParticleSpray.burst(pos, clampedStrength, 50)) ) } @@ -36,7 +38,7 @@ class OpExplode(val fire: Boolean) : SpellOperator { pos.x, pos.y, pos.z, - Mth.clamp(strength.toFloat(), 0f, 10f), + strength.toFloat(), this.fire, Explosion.BlockInteraction.BREAK ) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExtinguish.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExtinguish.kt index 3db24880..30df546f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExtinguish.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExtinguish.kt @@ -27,7 +27,7 @@ object OpExtinguish : SpellOperator { return Triple( Spell(target), - ManaConstants.CRYSTAL_UNIT, + ManaConstants.DUST_UNIT * 6, listOf(ParticleSpray.burst(target, 1.0)) ) } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpPlaceBlock.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpPlaceBlock.kt index bfc30b9a..8948f0a6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpPlaceBlock.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpPlaceBlock.kt @@ -44,7 +44,7 @@ object OpPlaceBlock : SpellOperator { return Triple( Spell(target), - ManaConstants.DUST_UNIT, + ManaConstants.DUST_UNIT / 8, listOf(ParticleSpray.cloud(Vec3.atCenterOf(pos), 1.0)) ) } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpRecharge.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpRecharge.kt index b56c0966..c9dc25ce 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpRecharge.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpRecharge.kt @@ -1,12 +1,7 @@ package at.petrak.hexcasting.common.casting.operators.spells import at.petrak.hexcasting.api.misc.ManaConstants - -import at.petrak.hexcasting.api.spell.getChecked -import at.petrak.hexcasting.api.spell.ParticleSpray -import at.petrak.hexcasting.api.spell.RenderedSpell -import at.petrak.hexcasting.api.spell.SpellDatum -import at.petrak.hexcasting.api.spell.SpellOperator +import at.petrak.hexcasting.api.spell.* import at.petrak.hexcasting.api.spell.casting.CastingContext import at.petrak.hexcasting.api.spell.mishaps.MishapBadItem import at.petrak.hexcasting.api.spell.mishaps.MishapBadOffhandItem @@ -48,8 +43,11 @@ object OpRecharge : SpellOperator { if (mana.mana >= mana.maxMana) return null - return Triple(Spell(entity), - ManaConstants.CRYSTAL_UNIT, listOf(ParticleSpray.burst(entity.position(), 0.5))) + return Triple( + Spell(entity), + ManaConstants.SHARD_UNIT, + listOf(ParticleSpray.burst(entity.position(), 0.5)) + ) } private data class Spell(val itemEntity: ItemEntity) : RenderedSpell { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpTheOnlyReasonAnyoneDownloadedPsi.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpTheOnlyReasonAnyoneDownloadedPsi.kt index bb7ac432..71c8c7fd 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpTheOnlyReasonAnyoneDownloadedPsi.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpTheOnlyReasonAnyoneDownloadedPsi.kt @@ -1,11 +1,7 @@ package at.petrak.hexcasting.common.casting.operators.spells import at.petrak.hexcasting.api.misc.ManaConstants -import at.petrak.hexcasting.api.spell.getChecked -import at.petrak.hexcasting.api.spell.ParticleSpray -import at.petrak.hexcasting.api.spell.RenderedSpell -import at.petrak.hexcasting.api.spell.SpellDatum -import at.petrak.hexcasting.api.spell.SpellOperator +import at.petrak.hexcasting.api.spell.* import at.petrak.hexcasting.api.spell.casting.CastingContext import net.minecraft.core.BlockPos import net.minecraft.core.Direction @@ -28,7 +24,7 @@ object OpTheOnlyReasonAnyoneDownloadedPsi : SpellOperator { return Triple( Spell(target), - ManaConstants.DUST_UNIT, + (ManaConstants.DUST_UNIT + 1.125).toInt(), listOf(ParticleSpray.burst(Vec3.atCenterOf(BlockPos(target)), 1.0)) ) } diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.json b/Common/src/main/resources/assets/hexcasting/lang/en_us.json index d86d4ef1..7a70ad00 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.json +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.json @@ -899,25 +899,25 @@ "hexcasting.entry.basic_spell": "Basic Spells", "hexcasting.page.basic_spell.explode.1": "Remove a number and vector from the stack, then create an explosion at the given location with the given power.", - "hexcasting.page.basic_spell.explode.2": "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)Strangely, this explosion doesn't seem to harm me. Perhaps it's because $(italic)I/$ am the one exploding?$(br2)Costs about one $(l:items/amethyst)$(item)Amethyst Shard/$, plus an extra $(l:items/amethyst)$(item)Amethyst Shard/$ per point of explosion power.", + "hexcasting.page.basic_spell.explode.2": "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)Strangely, this explosion doesn't seem to harm me. Perhaps it's because $(italic)I/$ am the one exploding?$(br2)Costs a negligible amount at power 0, plus 3 extra $(l:items/amethyst)$(item)Amethyst Dust/$s per point of explosion power.", "hexcasting.page.basic_spell.explode.fire.1": "Remove a number and vector from the stack, then create a fiery explosion at the given location with the given power.", - "hexcasting.page.basic_spell.explode.fire.2": "Costs three $(l:items/amethyst)$(item)Amethyst Shards/$, plus about one extra $(l:items/amethyst)$(item)Amethyst Shard/$ per point of explosion power. Otherwise, the same as $(l:patterns/spells/basic#hexcasting:explode)$(action)Explosion/$, except with fire.", + "hexcasting.page.basic_spell.explode.fire.2": "Costs one $(l:items/amethyst)$(item)Amethyst Dust/$, plus about 3 extra $(l:items/amethyst)$(item)Amethyst Dust/$s per point of explosion power. Otherwise, the same as $(l:patterns/spells/basic#hexcasting:explode)$(action)Explosion/$, except with fire.", "hexcasting.page.basic_spell.add_motion": "Remove an entity and direction from the stack, then give a shove 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 $(l:items/amethyst)$(item)Amethyst Dust/$ equal to the square of the length of the vector.", - "hexcasting.page.basic_spell.blink": "Remove an entity and length from the stack, then teleport the given entity along its look vector by the given length.$(br)Costs about one $(l:items/amethyst)$(item)Amethyst Shard/$ per block travelled.", + "hexcasting.page.basic_spell.blink": "Remove an entity and length from the stack, then teleport the given entity along its look vector by the given length.$(br)Costs about one $(l:items/amethyst)$(item)Amethyst Shard/$ per two blocks travelled.", "hexcasting.page.basic_spell.beep.1": "Remove a vector and two numbers from the stack. Plays an $(thing)instrument/$ defined by the first number at the given location, with a $(thing)note/$ defined by the second number. Costs a negligible amount of _media.", "hexcasting.page.basic_spell.beep.2": "There appear to be 16 different $(thing)instruments/$ and 25 different $(thing)notes/$. Both are indexed by zero.$(br2)These seem to be the same instruments I can produce with a $(item)Note Block/$, though the reason for each instrument's number being what it is eludes me.$(br2)Either way, I can find the numbers I need to use by inspecting a $(item)Note Block/$ through a $(l:items/lens)$(item)Scrying Lens/$.", "hexcasting.entry.blockworks": "Blockworks", - "hexcasting.page.blockworks.place_block": "Remove a location from the stack, then pick a block item and place it at the given location.$(br)Costs about one $(l:items/amethyst)$(item)Amethyst Dust/$.", - "hexcasting.page.blockworks.break_block": "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 two $(l:items/amethyst)$(item)Amethyst Dust/$.", + "hexcasting.page.blockworks.place_block": "Remove a location from the stack, then pick a block item and place it at the given location.$(br)Costs a negligible amount of _media.", + "hexcasting.page.blockworks.break_block": "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 a bit more than one $(l:items/amethyst)$(item)Amethyst Dust/$.", "hexcasting.page.blockworks.create_water": "Summon a block of water (or insert a bucket's worth) into a block at the given position. Costs about one $(l:items/amethyst)$(item)Amethyst Dust/$.", "hexcasting.page.blockworks.destroy_water": "Destroy a great deal of liquid (not just water) around the given position. Costs about two $(l:items/amethyst)$(item)Charged Amethyst/$.", "hexcasting.page.blockworks.conjure_block": "Conjure an ethereal, but solid, block that sparkles with my pigment at the given position. Costs about one $(l:items/amethyst)$(item)Amethyst Dust/$.", "hexcasting.page.blockworks.conjure_light": "Conjure a magical light that softly glows with my pigment at the given position. Costs about one $(l:items/amethyst)$(item)Amethyst Dust/$.", - "hexcasting.page.blockworks.bonemeal": "Encourage a plant or sapling at the target position to grow, as if $(item)Bonemeal/$ was applied. Costs about one $(l:items/amethyst)$(item)Amethyst Dust/$.", + "hexcasting.page.blockworks.bonemeal": "Encourage a plant or sapling at the target position to grow, as if $(item)Bonemeal/$ was applied. Costs a bit more than one $(l:items/amethyst)$(item)Amethyst Dust/$.", "hexcasting.page.blockworks.edify": "Forcibly infuse _media into the sapling at the target position, causing it to grow into an $(l:items/edified)$(thing)Edified Tree/$. Costs about one $(l:items/amethyst)$(item)Charged Crystal/$.", "hexcasting.page.blockworks.ignite": "Start a fire on top of the given location, as if a $(item)Fire Charge/$ was applied. Costs about one $(l:items/amethyst)$(item)Amethyst Dust/$.", - "hexcasting.page.blockworks.extinguish": "Extinguish blocks in a large area. Costs about one $(l:items/amethyst)$(item)Charged Amethyst/$.", + "hexcasting.page.blockworks.extinguish": "Extinguish blocks in a large area. Costs about six $(l:items/amethyst)$(item)Amethyst Dust/$s.", "hexcasting.entry.nadirs": "Nadirs", "hexcasting.page.nadirs.1": "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 squared.", @@ -933,10 +933,10 @@ "hexcasting.page.hexcasting_spell.craft/cypher": "Costs about one $(l:items/amethyst)$(item)Charged Amethyst/$.", "hexcasting.page.hexcasting_spell.craft/trinket": "Costs about five $(l:items/amethyst)$(item)Charged Amethysts/$.", "hexcasting.page.hexcasting_spell.craft/artifact": "Costs about ten $(l:items/amethyst)$(item)Charged Amethysts/$.", - "hexcasting.page.hexcasting_spell.recharge.1": "Recharge a _media-containing item in my other hand. Costs about one $(l:items/amethyst)$(item)Charged Amethyst/$.", + "hexcasting.page.hexcasting_spell.recharge.1": "Recharge a _media-containing item in my other hand. Costs about one $(l:items/amethyst)$(item)Amethyst Shard/$.", "hexcasting.page.hexcasting_spell.recharge.2": "This spell is cast in a similar method to the crafting spells; an entity representing a dropped stack of $(l:items/amethyst)$(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_spell.erase.1": "Clear a _Hex-containing item in my other hand. Costs about one $(l:items/amethyst)$(item)Amethyst Dust/$.", - "hexcasting.page.hexcasting_spell.erase.2": "The spell will also void all the _media stored inside the item, releasing it back to Nature and returning the item to a perfectly clean slate. This way, I can re-use $(l:items/hexcasting)$(item)Trinkets/$ I have put an erroneous spell into, for example.$(br2)This also works to clear a $(l:items/focus)$(item)Focus/$ or $(l:items/spellbook)$(item)Spellbook/$, unsealing them in the process.", + "hexcasting.page.hexcasting_spell.erase.2": "The spell will also void all the _media stored inside the item, releasing it back to Nature and returning the item to a perfectly clean slate. This way, I can re-use $(l:items/hexcasting)$(item)Trinkets/$ I have put an erroneous spell into, for example.$(br2)This also works to clear a $(l:items/focus)$(item)Focus/$ or $(l:items/spellbook)$(item)Spellbook/$ page, unsealing them in the process.", "hexcasting.entry.sentinels": "Sentinels", "hexcasting.page.sentinels.1": "$(italic)Hence, away! Now all is well,$(br)One aloof stand sentinel./$$(br2)A $(l:patterns/spells/sentinels)$(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.", diff --git a/art/slate_bg.png b/art/slate_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef75c3c7f91a236690f469748112aba594be550 GIT binary patch literal 45191 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 S4bk?`{C3ildB1t-kN*V`6Wf*m literal 0 HcmV?d00001