diff --git a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java index 105994f61d..6f17226b16 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java @@ -47,10 +47,13 @@ public interface ClientConfigAccess { double gridSnapThreshold(); + boolean clickingTogglesDrawing(); + boolean DEFAULT_CTRL_TOGGLES_OFF_STROKE_ORDER = false; boolean DEFAULT_INVERT_SPELLBOOK_SCROLL = false; boolean DEFAULT_INVERT_ABACUS_SCROLL = false; double DEFAULT_GRID_SNAP_THRESHOLD = 0.5; + boolean DEFAULT_CLICKING_TOGGLES_DRAWING = false; } public interface ServerConfigAccess { diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index a039b5264b..0a9f66cd2b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -131,7 +131,16 @@ class GuiSpellcasting constructor( if (super.mouseClicked(mxOut, myOut, pButton)) { return true } + if (HexConfig.client().clickingTogglesDrawing()) { + return if (this.drawState is PatternDrawState.BetweenPatterns) + drawStart(mxOut, myOut) + else + drawEnd() + } + return drawStart(mxOut, myOut) + } + private fun drawStart(mxOut: Double, myOut: Double): Boolean { val mx = Mth.clamp(mxOut, 0.0, this.width.toDouble()) val my = Mth.clamp(myOut, 0.0, this.height.toDouble()) if (this.drawState is PatternDrawState.BetweenPatterns) { @@ -156,11 +165,23 @@ class GuiSpellcasting constructor( return false } + override fun mouseMoved(mxOut: Double, myOut: Double) { + super.mouseMoved(mxOut, myOut) + + if (HexConfig.client().clickingTogglesDrawing() && this.drawState !is PatternDrawState.BetweenPatterns) + drawMove(mxOut, myOut) + } + override fun mouseDragged(mxOut: Double, myOut: Double, pButton: Int, pDragX: Double, pDragY: Double): Boolean { if (super.mouseDragged(mxOut, myOut, pButton, pDragX, pDragY)) { return true } + if (HexConfig.client().clickingTogglesDrawing()) + return false + return drawMove(mxOut, myOut) + } + private fun drawMove(mxOut: Double, myOut: Double): Boolean { val mx = Mth.clamp(mxOut, 0.0, this.width.toDouble()) val my = Mth.clamp(myOut, 0.0, this.height.toDouble()) @@ -237,7 +258,12 @@ class GuiSpellcasting constructor( if (super.mouseReleased(mx, my, pButton)) { return true } + if (HexConfig.client().clickingTogglesDrawing()) + return false + return drawEnd() + } + private fun drawEnd(): Boolean { when (this.drawState) { PatternDrawState.BetweenPatterns -> {} is PatternDrawState.JustStarted -> { diff --git a/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 index 20c7e04591..bb7ff4f4fd 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 @@ -35,7 +35,7 @@ of: "是如何拿到此%s卷轴的", empty: "空白中型卷轴", }, - + scroll: { "": "大型卷轴", of: "%s之远古卷轴", @@ -152,7 +152,7 @@ bricks_small: "板岩小型砖", pillar: "板岩柱", }, - + amethyst_: { dust_block: "紫水晶粉块", tiles: "紫水晶瓦", @@ -300,8 +300,12 @@ "": "咒术网格吸附阈值", "@Tooltip": "使用法杖时,吸附至另一点所需划过的距离,0.5意味着需划过50%(取值0.5~1)", }, + clickingTogglesDrawing: { + "": "单击切换绘制与否", + "@Tooltip": "单击即可开始或结束绘制,无需按住拖动", + }, }, - + server: { opBreakHarvestLevel: { "": "破坏方块挖掘等级", @@ -408,18 +412,21 @@ }, "death.attack.hexcasting": { - overcast: "%s的意识消散为了能量", + overcast: { + "": "%s的意识消散为了能量", + player: "在与%2$s战斗时,%1$s的意识消散为了能量" + }, }, "command.hexcasting": { recalc: "已重生成此世界特有图案", - + pats: { listing: "此世界特有的图案:", all: "给予%s所有%d张卷轴", "specific.success": "给予%3$sID为%2$s的%1$s", }, - + brainsweep: { "": "已清除%s的意识", "fail.badtype": "%s不是生物", @@ -473,7 +480,7 @@ many_exits: "%s处的媒质流的可选去路过多", no_closure: "%s处的媒质流无法返回促动石" }, - + lens: { "pattern.invalid": "无效图案", bee: { @@ -498,7 +505,7 @@ level: "%s级", product: "无意识的躯体", }, - + media: "%d 紫水晶粉", media_amount: "含有:%s(%s)", "media_amount.advanced": "含有:%s/%s(%s)", @@ -556,7 +563,7 @@ // TODO: the +1 is kind of janky scry_sight: "探知视觉" }, - + // Action localizations action: { @@ -601,7 +608,7 @@ }, append: "整合之馏化", - unappend: "派生之馏化", + unappend: "派生之分解", index: "选择之馏化", singleton: "单体之纯化", empty_list: "空无之精思", @@ -728,6 +735,7 @@ bonemeal: "催生", edify: "启迪树苗", colorize: "内化染色剂", + cycle_variant: "施法者之魅力", "sentinel/": { create: "召唤哨卫", @@ -766,6 +774,7 @@ "eval/cc": "伊里斯之策略", for_each: "托特之策略", halt: "卡戎之策略", + thanatos: "塔纳托斯之精思", "interop/": { "gravity/": { @@ -849,7 +858,7 @@ garbage: "垃圾", vec3: "向量", }, - + mishap: { "": "%s:%s", @@ -878,7 +887,7 @@ project: "试图将%s投影至%s", exponent: "试图计算%s的%s", logarithm: "试图计算%s以%s为底的对数", - + zero: { "": "零", power: "零次幂", @@ -899,6 +908,7 @@ disallowed_circle: "已被服务器管理员禁用于法术环", invalid_spell_datum_type: "尝试将某无效类型的值用作SpellDatum:%s(class %s)。这是模组中的bug。", unknown: "抛出异常(%s)。这是模组中的bug。", + stack_size: "超出了栈的大小上限", invalid_value: { "": "本应在栈下标为%2$s处接受%1$s,而实际接受了%3$s", @@ -925,7 +935,7 @@ numvec: "一个数或向量", numlist: "一个整数或列表", "list.pattern": "一个由图案组成的列表", - + double: { positive: { "": "一个正数", @@ -960,7 +970,7 @@ bad_item: { "": "需要%s,而实际持有%d个%s", offhand: "需要在另一只手里持有%s,而实际持有%d个%s", - + iota: { "": "一个可以存储iota的地方", read: "一个可以读出iota的地方", @@ -983,7 +993,7 @@ sapling: "一个树苗", replaceable: "一个可放置方块的地方", }, - + "circle.bool_directrix": { no_bool: "%s处的iota实际为%s,而非布尔值", empty_stack: "%s处的栈为空栈" @@ -1039,7 +1049,7 @@ "": "模组联动", desc: "好像我装了某些能和咒法学联动的模组!详情如下。" }, - + patterns: { "": "图案", desc: "我所发现的各式图案,和它们的功用。", @@ -1051,7 +1061,7 @@ great_spells: { "": "卓越法术", desc: "这类法术据信极难施放,但也极为强力。\ - 记载它们的文献极为少见(据称理由充分)。\ + 记载它们的文献极为$(l:items/scroll)少见/$(据称理由充分)。\ 这也许只是某些消亡的老古董口中的胡言乱语,不过——它们只是简单的图案罢了。$(br2)\ 试试看又能出什么错呢?", }, @@ -1275,6 +1285,9 @@ "not_enough_iotas.title": "Iota 过少", not_enough_iotas: "该操作需要比当前栈中元素数还多的 iota。$(br2)产生淡灰色火花,并向栈顶压入缺少的参数的数量个$(l:casting/influences)$(action)垃圾/$。", + "stack_size.title": "Iota 过大", + "stack_size": "试图施放超出栈大小限制的法术。$(br2)产生黑色火花,我的整个栈变为仅含有单个$(l:casting/influences)$(action)垃圾/$。", + "incorrect_iota.title": "Iota 错误", incorrect_iota: "该操作需要一种特定类型的 iota 作为参数,而实际 iota 无效。如果有多个 iota 无效,错误信息只会提示最靠近栈底的错误。$(br2)产生深灰色火花,无效的 iota 会被替换为$(l:casting/influences)$(action)垃圾/$。", @@ -1336,10 +1349,10 @@ "bad_mindflay.title": "惰性剥离", bad_mindflay: "试图剥离已被剥除意识的生物的意识,或是试图剥离不适用于目标方块的生物的意识。$(br2)产生暗绿色火花,并杀死对应生物。倘若被村民看到了,他们应该不会对此有什么好评价。", - + "no_circle.title": "缺失法术环", no_circle: "试图直接执行只能在法术环内执行的操作。$(br2)产生淡蓝色火花,并将我物品栏中所有物品散落在地。", - + "no_record.title": "缺失阿卡夏记录", no_record: "试图在无对应方块处访问$(l:greatwork/akashiclib)$(item)阿卡夏记录/$。$(br2)产生紫色火花,并消耗部分经验。", }, @@ -1382,7 +1395,7 @@ abacus: { "1": "虽然有$(l:patterns/numbers)$(action)对应数的图案/$,但它们确实……过于复杂。$(br2)幸运的是,从前研究这门学问的大师们发明了一个名为“$(l:items/abacus)$(item)算盘/$”的天才般的装置,它们能极为方便地表示数。只需要在其上设定好,然后用$(l:patterns/readwrite#hexcasting:read)$(action)书吏之精思/$把值读出即可,就和读出$(l:items/focus)$(item)核心/$中 iota 的操作一样。", - "2": "操作方法是潜行时手持算盘滚动滚轮。如果是主手持算盘,则其数值会以 1 增加或减少,按住 Control 或 Command 时则以 10。若是副手持算盘,则其数值会以 0.1 增加或减少,按住 Control 或 Command 时则以 0.001。$(br2)也可以在潜行时手持算盘右击以重设为 0。", + "2": "操作方法是潜行时手持算盘滚动滚轮。如果是主手持算盘,则其数值会以 1 增加或减少,按住 $(k:sprint) 时则以 10。若是副手持算盘,则其数值会以 0.1 增加或减少,按住 $(k:sprint) 时则以 0.001。$(br2)也可以在潜行时手持算盘右击以重设为 0。", "crafting.desc": "$(italic)数学?那是给聪明人用的!/$", }, @@ -1485,7 +1498,7 @@ empty_impetus: "第一步,基床。虽然和纯粹的$(l:greatwork/impetus)$(item)促动石/$不大一样,但它能让$(media)媒质/$从箭头所指方向流出。这就提供了一种改变媒质波所在平面的方法。", impetus_rightclick: "第二步,转移意识。村民职业的不同意味着$(l:greatwork/impetus)$(item)促动石/$激活条件的不同。$(l:greatwork/impetus)$(item)工具匠促动石/$会在对其按下$(k:use)时启动。", impetus_storedplayer: { - "1": "$(l:greatwork/impetus)$(item)牧师促动石/$必须绑定至某一玩家,对其使用存有代表玩家的 iota 的物品(例如$(l:items/focus)$(item)核心/$)即可。这之后,它会在收到红石信号时启动。", + "1": "$(l:greatwork/impetus)$(item)牧师促动石/$会在接收到红石信号时启动。也可绑定至某一玩家,对其使用存有代表玩家的 iota 的物品(例如$(l:items/focus)$(item)核心/$)即可。", "2": "这种$(l:greatwork/impetus)$(item)促动石/$也使得被绑定的玩家和他们周围一小块区域会一直受法术环影响。不管该玩家离法术环多远都会和站在法术环里一样。$(br2)用$(l:items/lens)$(item)探知透镜/$观察$(l:greatwork/impetus)$(item)牧师促动石/$就会显示被绑定的玩家。", }, impetus_look: "$(l:greatwork/impetus)$(item)制箭师促动石/$会在被注视一段时间后启动。", @@ -1587,8 +1600,8 @@ floor: "对一个数取底,也即去掉小数部分取整。或对向量的每个分量取底。", ceil: "对一个数取顶,也即将小数部分不为零的数换为大于其的最小整数。或对向量的每个分量取顶。", - construct_vec: "将三个数作为向量的 X,Y,Z 分量组合(最下方为 X 分量)。", - deconstruct_vec: "将一个向量拆分为其 X,Y,Z 分量(最下方为 X 分量)。", + construct_vec: "将三个数作为向量的 X,Y,Z 分量组合(自底向上排列)。", + deconstruct_vec: "将一个向量拆分为其 X,Y,Z 分量(自底向上排列)。", modulo: "取两数除法的余数。也即执行除法后$(italic)剩余/$的数。例如,5 %% 2 得 1,5 %% 3 得 2。或对向量的每个分量执行上述操作。", coerce_axial: "若栈顶为向量,则返回与其夹角最小的轴向单位向量;零向量不受影响。若栈顶为数,则返回该数的符号;所给数为正则返回 1,为负则返回 -1,0 不受影响。", random: "返回一个 0 与 1 之间的随机数。", @@ -1669,7 +1682,7 @@ }, logic: { - bool_coerce: "将参数变换为布尔值。数 $(thing)0/$、$(l:casting/influences)$(thing)Null/$,以及空列表会变为 False。其余所有则变为 True。", + bool_coerce: "将参数变换为布尔值。数 $(thing)0/$、$(l:casting/influences)$(thing)Null/$、False,以及空列表会变为 False。其余所有则变为 True。", bool_to_number: "将布尔值变换为数。True 变为 $(thing)1/$, False 变为 $(thing)0/$。", not: "如果参数是 True,返回 False;如果参数是 False,返回 True。", or: "如果至少有一个参数是 True,返回 True。否则返回 False。", @@ -1772,6 +1785,8 @@ "eval/cc.1": "此图案和$(l:patterns/meta#hexcasting:eval)$(action)赫尔墨斯之策略/$类似,也能运行图案或依次运行图案列表,但会在开始之前将一独特的“跳转” iota 压入栈中。", "eval/cc.2": "当执行至“跳转” iota 时,法术会直接跳过图案列表中剩余的图案至列表尾部。$(p)当然因为已经有了$(l:patterns/meta#hexcasting:halt)$(action)卡戎之策略/$,这种性质难免显得有些冗余。不过它能以可控方式退出$(italic)多层嵌套/$调用的$(l:patterns/meta#hexcasting:eval)$(action)赫尔墨斯之策略/$,而卡戎之策略只能退出一层。$(p)“跳转” iota 甚至会在所有策略都执行完毕后还留在栈上……真是细思恐极。", + + "thanatos.1": "将$(hex)咒术/$仍能运行的图案数压入列表。每运行一个图案,所得数即减少 1。" }, circle_patterns: { @@ -1812,7 +1827,7 @@ blockworks: { place_block: "移除一个位置向量,然后挑选一个方块并放在给定位置。$(br)消耗大约 1/8 个$(l:items/amethyst)$(item)紫水晶粉/$。", - break_block: "移除一个位置向量,然后破坏给定位置的方块。此法术能破坏几乎所有钻石镐能破坏的方块。$(br)消耗大约 1/8 个$(l:items/amethyst)$(item)紫水晶粉/$。", + break_block: "移除一个位置向量,然后破坏给定位置的方块。此法术能破坏几乎所有钻石镐能破坏的方块。$(br)消耗大约 1/8 个$(l:items/amethyst)$(item)紫水晶粉/$。破坏$(l:patterns/spells/blockworks#hexcasting:conjure_block)$(action)构筑的方块/$或$(l:patterns/spells/blockworks#hexcasting:conjure_light)$(action)构筑的光源/$时仅消耗极少量媒质。", create_water: "在给定位置生成一格水(或给流体容器注入至多一桶水)。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", destroy_water: "清空给定位置的流体容器,或是清除给定位置周围的液体。消耗大约 2 个$(l:items/amethyst)$(item)充能紫水晶/$。", conjure_block: "在给定位置构筑一个空灵缥缈却坚硬可触的,闪着光的方块。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", @@ -1859,12 +1874,14 @@ colorize: "我需要在施法时在另一只手中持有$(l:items/pigments)$(item)染色剂/$。施法后,染色剂将被消耗而我意识的颜色也将永久改变(至少是在再次施法前)。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + cycle_variant: "我制造的一些物品极易受$(media)媒质/$的影响。另一只手持有$(l:items/hexcasting)$(item)杂件/$、$(l:items/hexcasting)$(item)缀品/$、$(l:items/hexcasting)$(item)造物/$、$(l:items/focus)$(item)核心/$、$(l:items/spellbook)$(item)法术书/$时,可以使用此法术更改它们的外表。消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + flights: { "1": "尽管无法掌握自由飞行的力量,我还是找到了若干能将物体滞空的方法,但各种方法各有缺陷。$(br2)所有种类的飞行法术都会产生微量多余$(media)媒质/$。在法术效果将要结束时,其会产生越来越多红色和黑色的火花。", "2": "当然,也有其他种类的飞行法术。例如,将$(l:patterns/spells/basic#hexcasting:add_motion)$(action)驱动/$和$(l:patterns/spells/nadirs#hexcasting:potion/levitation)$(action)蓝阳西沉/$结合使用的类飞行技术自古代起就多有运用。$(br2)我还听说过一种能给予滑翔能力的,可以穿在背上的薄透翼膜。研究表明,被称为“$(l:patterns/great_spells/altiora)$(action)翱翔/$”的卓越法术也许能模仿这种翼膜的功用。", "range.1": "受范围限制的飞行法术。", - "range.2": "第二参数代表水平方向上的半径(以米计),在此范围内,法术能保持稳定。走出该范围就会结束该法术,滞空的物体会直接坠向地面。但只要一直呆在这个范围内,法术的效果便会无限持续。此法术还会额外产生微量$(media)媒质/$用以标记安全区域中心点。$(br2)每米安全范围消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", + "range.2": "第二参数代表水平方向上的半径(以米计),在此范围内,法术能保持稳定。走出该范围就会结束该法术,滞空的物体会直接坠向地面。但只要一直待在这个范围内,法术的效果便会无限持续。此法术还会额外产生微量$(media)媒质/$用以标记安全区域中心点。$(br2)每米安全范围消耗大约 1 个$(l:items/amethyst)$(item)紫水晶粉/$。", "time.1": "受时间限制的飞行法术。", "time.2": "第二参数代表持续时间(以秒计),在此限制内,法术能保持稳定。持续时间超过限制就会结束该法术,滞空的物体会直接坠向地面。$(br2)此法术相对较昂贵,每秒持续时间消耗大约 1 个$(l:items/amethyst)$(item)充能紫水晶/$。我觉得它极其适合长途旅行。", @@ -1888,7 +1905,7 @@ "teleport/great": { "1": "比$(l:patterns/spells/basic#hexcasting:blink)$(action)闪现/$更为强大,此法术能让我传送到世界上几乎任何一处!当然它也有极限,但可比我熟悉的施法距离要远得$(italic)多/$。", - "2": "实体会按所给向量偏移出其原有位置。它似乎一直会消耗大约 10 个$(l:items/amethyst)$(item)充能紫水晶/$,不论传送距离。$(br2)当然这种传送也不是尽善尽美的,在传送如玩家般复杂的实体时,实体身上的物品就不会$(italic)非常/$安稳了,它们可能会散落在目的地周围。还有,传送的实体将会被强制从其所乘坐的无生命载具中卸下……但我曾读到过动物可以一起被传送,大概吧。", + "2": "实体会被移动至所给向量处。奇怪的是,这个向量似乎代表了偏差值,而非世界中的绝对位置;比如,使用$(l:patterns/consts#hexcasting:const/vec/x)$(action)向量之精思,+X 型/$时,目标实体会被传送到原有位置恰好 1 格以东处。它似乎一直会消耗大约 10 个$(l:items/amethyst)$(item)充能紫水晶/$,不论传送距离。$(br2)当然这种传送也不是尽善尽美的,在传送如玩家般复杂的实体时,实体身上的物品就不会$(italic)非常/$安稳了,它们可能会散落在目的地周围。还有,传送的实体将会被强制从其所乘坐的无生命载具中卸下……但我曾读到过动物可以一起被传送,大概吧。", }, zeniths: { @@ -1941,7 +1958,7 @@ "2": "更奇怪的是,不管大图书馆的学生怎么激那帮冗杂官僚里管行政的人员,送去的信件都还被一一打回。连其他教授都不愿谈及他。$(br2)也正如你可能在担心的,阿曼妮塔十分沮丧。无论大图书馆派来哪位教授接任,都不如原先的教授那样善解人意和乐于助人。", "3": "但是,这还不是最怪的那件事。这件事——我很希望之后不要再碰到比这还骇人的事了——发生在我和地质学联合会的又一次考察中,我们计划前去某个村庄附近。", "4": "通常去居民点附近考察时,我们要与村庄的村长或长老进行长时间的磋商,以确定我们的行为是被允许的,并划定我们能去的地方和能做的事。但这次不一样,这次没有磋商。出发前两天我们才被告知这次要跟着咒法学联合会的一位学长去。", - "5": "我们在村庄附近的密林中扎营,不知道为什么不选附近的平原。支帐篷的地方几乎看不到村庄。在刚到那天的晚上,我铺开睡袋时,周围是死一般的寂静。就算我们看不见村庄,我们也应该能听到村庄里的声音。但是在地表呆着的整段时间里,我却几乎什么都听不见。", + "5": "我们在村庄附近的密林中扎营,不知道为什么不选附近的平原。支帐篷的地方几乎看不到村庄。在刚到那天的晚上,我铺开睡袋时,周围是死一般的寂静。就算我们看不见村庄,我们也应该能听到村庄里的声音。但是在地表待着的整段时间里,我却几乎什么都听不见。", "6": "我听到的为数不多的声音都像是劳作时发出的那种,比如锤子砸到铁砧上的响声和锄头翻土的噪声。我完全没听到说话声。$(br2)第二天早晨我们就备好灯笼进入了地下。", "7": "我们没被告知到底要找什么,但有学生听说我们是来找紫水晶的,这貌似说得通。我早已练出能在矿洞壁上瞄中任何一小点紫色闪光的绝技,但就在灰色岩石和黑色板岩的交界处,我面前却赫然出现了一座奇观。$(br2)那是一整个紫水晶晶洞,快有十个我那么高,并随着灯光闪着紫色光芒,洞壁的每一面都被尖锐的紫色水晶覆盖。那些紫水晶比我来大图书馆之后整个探险组挖到的所有加起来还多。", "8": "我们每人被发了一副手套并被告知加紧开采。和我们同行的一位学长拿出了一个奇特的淡紫色盒子,高层人员会拿这种盒子来装东西,我和其他学生则兢兢业业地把那些玻璃质水晶从墙上砸下,然后放到盒子里去。外层脆性水晶的基座后方似乎有两种更为致密的构造。一种和外层水晶类似,但另一种更为……我词穷了。", @@ -1980,7 +1997,7 @@ "5": "他们觉得他们把我摧毁得能用毛毡盖眼哄骗我但我是清醒的清醒到能感到痛苦$(br2)我不睡觉但我醒来时我不敢把硬壳从我眼睛上搓掉不然会割破皮而且我不想看见紫色闪光", "6": "他们没杀我,因为我丈夫有我的核心,我死了他会知道。但他不是咒术师所以他没法凭他自己找到我。我走投无$(br2)思考很甬苦。真的很痛苦。思维是累赘累赘印在无数细小水晶上", "7": "我记得那个明亮房间里的医生强迫我吸入某种类似沙子的东西,但更锐利还非常痛。一开始只是黏膜试图吸住玻璃渣的物理性创伤但之后他们把指甲插到我的刺激反应里他们说几句话就能做到$(br2)我记得去露营时看到联合会成员围着一个村庄铺设法术环然后地面就开始震动", - "8": "没了时间观念。有时我觉得我能看到未来,因为那些场景好像说得通但现在不可能发生因为我知道我余生就呆在这了因为亮房里的人这么说了。我能看到我整个人倒了过来我的颅骨裂成两半里面都是长矛样的淌着血的不是紫水晶的东西扎穿一块满是皱纹还幻想自己是蝴蝶的三磅重的脂肪和肉", + "8": "没了时间观念。有时我觉得我能看到未来,因为那些场景好像说得通但现在不可能发生因为我知道我余生就待在这了因为亮房里的人这么说了。我能看到我整个人倒了过来我的颅骨裂成两半里面都是长矛样的淌着血的不是紫水晶的东西扎穿一块满是皱纹还幻想自己是蝴蝶的三磅重的脂肪和肉", "9": "我希望我的学生们还好。我为什么会这么想?累赘。他们告诉我我是累赘,他们不满足于摧毁我,他们还想让我觉得这是我应得的。不用棍棒摧毁身体,而以言语击垮精神。就算他们把我放出去也没人会信我因为我看起来就像一个沉溺于过度施法的瘾君子$(br2)但他们还是把我琐着我不知道这算不算仁慈", "10": "周围这么多媒质我试过好多次施法逃出去或是至少减轻痛苦但那些扫过我的意识的图案在我试着绘制时不停窃笑溶解。我似乎记得我被迫忘记它们,我记得卓伟的互相连接的知识体系被凿空并在刻意忽视的重压下碎裂但回忆起忘记你曾记得你学过的东西再痛苦不过", "11": "也许我已在过度施法依赖症的晚期中的晚期了,我听见图案裁进我眼睛和眼睑间的空间,我神经的紫色边缘。强迫自己相信什么是真实的和我没在受折磨有意义吗。我该受折磨。如果我再也不能和其他人谈这件事为什么还要尝试呢", @@ -2012,7 +2029,7 @@ "3": "最后,如果对剧情和故事感兴趣,就应理解试验这些协同力量时所做的笔记只会是些琐事。", gravity: { - "1": "我发现了获取与改变实体所受引力的操作。挺有趣,也挺让人头晕。$(br2)有趣的是,虽然$(l:patterns/great_spells/flight)$(action)飞行/$是一种卓越法术,且也能操控引力,但这些法术似乎不是这样操控的。我不能理解……也许模组制作者们只是想让玩家们玩得开心。", + "1": "我发现了获取与改变实体所受引力的操作。挺有趣,也挺让人头晕。$(br2)有趣的是,虽然$(l:patterns/spells/flight)$(action)飞行/$的范围和持续时间有限,且也能操控引力,但这些法术的操控方式似乎有所区别。我不能理解……也许模组制作者们只是想让玩家们玩得开心。", get: "获取所给实体的所受引力的主方向上的单位向量。对大多数实体而言,此向量会是向下的:<0, -1, 0>。", set: "设置所给实体所受引力的主方向。所给向量会被转换为与其夹角最小的轴向单位向量,如同$(l:patterns/math#hexcasting:coerce_axial)$(action)轴向之纯化/$那样。消耗大约 1 个$(l:items/amethyst)$(item)充能紫水晶/$。", }, diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/cyclevariant.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/cyclevariant.json new file mode 100644 index 0000000000..bcbb7d9de7 --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/cyclevariant.json @@ -0,0 +1,18 @@ +{ + "name": "hexcasting.action.hexcasting:cycle_variant", + "category": "hexcasting:patterns/spells", + "icon": "minecraft:smithing_table", + "sortnum": 6, + "advancement": "hexcasting:root", + "read_by_default": true, + "pages": [ + { + "type": "hexcasting:pattern", + "op_id": "hexcasting:cycle_variant", + "anchor": "hexcasting:cycle_variant", + "input": "", + "output": "", + "text": "hexcasting.page.cycle_variant" + } + ] +} diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/flight.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/flight.json index 5f06e65e25..f3f74392a6 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/flight.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/flight.json @@ -3,7 +3,7 @@ "category": "hexcasting:patterns/spells", "icon": "minecraft:feather", "advancement": "hexcasting:root", - "sortnum": 6, + "sortnum": 7, "read_by_default": true, "pages": [ "hexcasting.page.flights.1", diff --git a/Common/src/main/resources/assets/hexcasting/sounds/abacus1.ogg b/Common/src/main/resources/assets/hexcasting/sounds/abacus1.ogg index a9a9c04f02..99dacb396c 100644 Binary files a/Common/src/main/resources/assets/hexcasting/sounds/abacus1.ogg and b/Common/src/main/resources/assets/hexcasting/sounds/abacus1.ogg differ diff --git a/Common/src/main/resources/assets/hexcasting/sounds/abacus2.ogg b/Common/src/main/resources/assets/hexcasting/sounds/abacus2.ogg index 42b0dd7639..8dc3e5c269 100644 Binary files a/Common/src/main/resources/assets/hexcasting/sounds/abacus2.ogg and b/Common/src/main/resources/assets/hexcasting/sounds/abacus2.ogg differ diff --git a/Common/src/main/resources/assets/hexcasting/sounds/abacus3.ogg b/Common/src/main/resources/assets/hexcasting/sounds/abacus3.ogg index b83de311da..89be48b9c0 100644 Binary files a/Common/src/main/resources/assets/hexcasting/sounds/abacus3.ogg and b/Common/src/main/resources/assets/hexcasting/sounds/abacus3.ogg differ diff --git a/Common/src/main/resources/assets/hexcasting/sounds/abacus_shake.ogg b/Common/src/main/resources/assets/hexcasting/sounds/abacus_shake.ogg index 6e40a78f92..e3fa9ba8d2 100644 Binary files a/Common/src/main/resources/assets/hexcasting/sounds/abacus_shake.ogg and b/Common/src/main/resources/assets/hexcasting/sounds/abacus_shake.ogg differ diff --git a/Common/src/main/resources/assets/hexcasting/sounds/add_segment.ogg b/Common/src/main/resources/assets/hexcasting/sounds/add_segment.ogg index 4ecc75109c..f30e728b32 100644 Binary files a/Common/src/main/resources/assets/hexcasting/sounds/add_segment.ogg and b/Common/src/main/resources/assets/hexcasting/sounds/add_segment.ogg differ diff --git a/Common/src/main/resources/assets/hexcasting/sounds/cast/hermes.ogg b/Common/src/main/resources/assets/hexcasting/sounds/cast/hermes.ogg index 8d128b5d14..bbe25305ad 100644 Binary files a/Common/src/main/resources/assets/hexcasting/sounds/cast/hermes.ogg and b/Common/src/main/resources/assets/hexcasting/sounds/cast/hermes.ogg differ diff --git a/Common/src/main/resources/assets/hexcasting/sounds/cast/thoth.ogg b/Common/src/main/resources/assets/hexcasting/sounds/cast/thoth.ogg index f46de4e630..7a4011d4b1 100644 Binary files a/Common/src/main/resources/assets/hexcasting/sounds/cast/thoth.ogg and b/Common/src/main/resources/assets/hexcasting/sounds/cast/thoth.ogg differ diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java index 7622e7cf8f..4680f8c1a1 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java @@ -132,6 +132,8 @@ public static final class Client implements HexConfig.ClientConfigAccess, Config private boolean invertAbacusScrollDirection = DEFAULT_INVERT_SPELLBOOK_SCROLL; @ConfigEntry.Gui.Tooltip private double gridSnapThreshold = DEFAULT_GRID_SNAP_THRESHOLD; + @ConfigEntry.Gui.Tooltip + private boolean clickingTogglesDrawing = DEFAULT_CLICKING_TOGGLES_DRAWING; @Override public void validatePostLoad() throws ValidationException { @@ -157,6 +159,11 @@ public boolean invertAbacusScrollDirection() { public double gridSnapThreshold() { return gridSnapThreshold; } + + @Override + public boolean clickingTogglesDrawing() { + return clickingTogglesDrawing; + } } @Config(name = "server") diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java index 507d1fece7..bf219312fc 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java @@ -82,6 +82,7 @@ public static class Client implements HexConfig.ClientConfigAccess { private static ForgeConfigSpec.BooleanValue invertSpellbookScrollDirection; private static ForgeConfigSpec.BooleanValue invertAbacusScrollDirection; private static ForgeConfigSpec.DoubleValue gridSnapThreshold; + private static ForgeConfigSpec.BooleanValue clickingTogglesDrawing; public Client(ForgeConfigSpec.Builder builder) { ctrlTogglesOffStrokeOrder = builder.comment( @@ -98,6 +99,9 @@ public Client(ForgeConfigSpec.Builder builder) { "When using a staff, the distance from one dot you have to go to snap to the next dot, where 0.5 " + "means 50% of the way.") .defineInRange("gridSnapThreshold", DEFAULT_GRID_SNAP_THRESHOLD, 0.5, 1.0); + clickingTogglesDrawing = builder.comment( + "Whether you click to start and stop drawing instead of clicking and dragging") + .define("clickingTogglesDrawing", DEFAULT_CLICKING_TOGGLES_DRAWING); } @Override @@ -119,6 +123,11 @@ public boolean ctrlTogglesOffStrokeOrder() { public double gridSnapThreshold() { return gridSnapThreshold.get(); } + + @Override + public boolean clickingTogglesDrawing() { + return clickingTogglesDrawing.get(); + } } public static class Server implements HexConfig.ServerConfigAccess {