diff --git a/CHANGELOG.md b/CHANGELOG.md index 12506e0..3e49e02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.0.2] 2024-06-24 + +### Fixed + +- Fixed bug in which effects would disappear on the target's next turn + +### Added + +- Eidolon summon effect and helper action +- Companion "summon" effect and helper action + ## [3.0.1] 2024-06-18 ### Added diff --git a/src/module.json b/src/module.json index 9969456..092782b 100644 --- a/src/module.json +++ b/src/module.json @@ -8,7 +8,7 @@ } ], "url": "https://git.bloy.org/foundryvtt/swade-mb-helpers", - "version": "3.0.1", + "version": "3.0.2", "compatibility": { "minimum": "11", "verified": "11" diff --git a/src/module/powers/powers.js b/src/module/powers/powers.js index baf79e1..e4b0bb7 100644 --- a/src/module/powers/powers.js +++ b/src/module/powers/powers.js @@ -66,6 +66,8 @@ import { SummonPlanarAllyEffect, SummonAnimalEffect, SummonUndeadEffect, + SummonEidolonEffect, + SummonCompanionEffect, } from './summon.js'; import { TelekinesisEffect } from './telekinesis.js'; import { TeleportEffect } from './teleport.js'; @@ -77,6 +79,7 @@ import { ZombieEffect } from './zombie.js'; import { InquisitorJudgementEffect } from './inquisitor.js'; const PowerClasses = { + 'animal-companion': SummonCompanionEffect, 'arcane-protection': ArcaneProtectionEffect, 'baleful-polymorph': BalefulPolymorphEffect, banish: BanishEffect, @@ -90,6 +93,7 @@ const PowerClasses = { 'boost-trait': BoostLowerTraitEffect, burrow: BurrowEffect, burst: BurstEffect, + companion: SummonCompanionEffect, 'conceal-arcana': DetectConcealArcanaEffect, confusion: ConfusionEffect, 'conjure-item': ConjureItemEffect, @@ -106,6 +110,7 @@ const PowerClasses = { dispel: DispelEffect, divination: DivinationEffect, 'drain-power-points': DrainPowerPointsEffect, + eidolon: SummonEidolonEffect, 'elemental-manipulation': ElementalManipulationEffect, empathy: EmpathyEffect, entangle: EntangleEffect, @@ -158,6 +163,8 @@ const PowerClasses = { sound: SoundSilenceEffect, 'speak-language': SpeakLanguageEffect, stun: StunEffect, + summoner: SummonEidolonEffect, + 'summon-eidolon': SummonEidolonEffect, 'summon-ally': SummonAllyEffect, 'summon-animal': SummonAnimalEffect, 'summon-monster': SummonMonsterEffect, diff --git a/src/module/powers/shapeChange.js b/src/module/powers/shapeChange.js index b76ed01..3d0ea2f 100644 --- a/src/module/powers/shapeChange.js +++ b/src/module/powers/shapeChange.js @@ -12,7 +12,7 @@ export class ShapeChangeEffect extends ActorFolderEffect { } get duration() { - return this.data.duration ? 50 : 5; + return (this.data.duration ? 50 : 5) * (this.data.wildShape ? 2 : 1); } get isTargeted() { @@ -55,16 +55,27 @@ export class ShapeChangeEffect extends ActorFolderEffect { } get modifiers() { + const wildShape = !!this.source.actor.items.find((i) => i.type === 'edge' && i.system.swid === 'wild-shape'); return [ ...super.modifiers, { name: 'Duration', type: 'checkbox', value: 1, + default: false, id: 'duration', epic: false, effect: false, }, + { + name: 'Wild Shape (Druid)', + type: 'checkbox', + value: 0, + default: wildShape, + id: 'wildShape', + epic: false, + effect: false, + }, { name: 'Transform Other?', type: 'select', @@ -206,6 +217,10 @@ export class ShapeChangeEffect extends ActorFolderEffect { } export async function shapeChangeTokenDeleteHandler(token, options, userId) { + if (token.flags?.['multilevel-tokens']?.stoken) { + // if the deleted token is a dummy token from multilevel-tokens, ignore it + return; + } log('TOKEN DELETED |', token, options, userId); const sourceInfo = token.getFlag(moduleName, 'shapeChange'); if (!sourceInfo?.srcTokenId) { diff --git a/src/module/powers/summon.js b/src/module/powers/summon.js index 39f0bac..9e92a77 100644 --- a/src/module/powers/summon.js +++ b/src/module/powers/summon.js @@ -485,3 +485,47 @@ export class SummonUndeadEffect extends BaseAllyEffect { return 'icons/magic/death/skeleton-glow-yellow-black.webp'; } } + +export class SummonEidolonEffect extends BaseSummonEffect { + get name() { + return 'Eidolon'; + } + + get icon() { + return 'icons/environment/creatures/monster-barbed-carapace-purple.webp'; + } + + get basePowerPoints() { + return 0; + } + + get duration() { + return 0; + } + + get isTargeted() { + return false; + } + + get isRaisable() { + return false; + } + + get summonCount() { + return 1; + } + + get modifiers() { + return super.modifiers.filter((m) => m.id === 'actorId'); + } +} + +export class SummonCompanionEffect extends SummonEidolonEffect { + get name() { + return 'Companion'; + } + + get icon() { + return 'icons/creatures/mammals/dog-husky-white-blue.webp'; + } +} diff --git a/src/packs/common-actions/000005.ldb b/src/packs/common-actions/000005.ldb index 3088784..7541494 100644 Binary files a/src/packs/common-actions/000005.ldb and b/src/packs/common-actions/000005.ldb differ diff --git a/src/packs/common-actions/LOG b/src/packs/common-actions/LOG index 964c5b8..7f7bc4d 100644 --- a/src/packs/common-actions/LOG +++ b/src/packs/common-actions/LOG @@ -1,5 +1,5 @@ -2024/06/18-10:41:57.594700 7526dca00640 Delete type=3 #1 -2024/06/18-10:41:57.597427 7526db000640 Level-0 table #5: started -2024/06/18-10:41:57.598484 7526db000640 Level-0 table #5: 17134 bytes OK -2024/06/18-10:41:57.599441 7526db000640 Delete type=0 #3 -2024/06/18-10:41:57.599672 7526db000640 Manual compaction at level-0 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items.effects!RC1Nz6iph8wPPK1B.g9W5hJisq3MsCpZW' @ 0 : 0; will stop at (end) +2024/06/24-21:25:51.691281 7f0ee1fbd700 Delete type=3 #1 +2024/06/24-21:25:51.693418 7f0ee0fbb700 Level-0 table #5: started +2024/06/24-21:25:51.696862 7f0ee0fbb700 Level-0 table #5: 18330 bytes OK +2024/06/24-21:25:51.700171 7f0ee0fbb700 Delete type=0 #3 +2024/06/24-21:25:51.700246 7f0ee0fbb700 Manual compaction at level-0 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items.effects!RC1Nz6iph8wPPK1B.g9W5hJisq3MsCpZW' @ 0 : 0; will stop at (end) diff --git a/src/packs/common-actions/MANIFEST-000002 b/src/packs/common-actions/MANIFEST-000002 index 21aabab..eac4ccf 100644 Binary files a/src/packs/common-actions/MANIFEST-000002 and b/src/packs/common-actions/MANIFEST-000002 differ diff --git a/src/packs/gear/LOG b/src/packs/gear/LOG index 2b727e9..102ae3d 100644 --- a/src/packs/gear/LOG +++ b/src/packs/gear/LOG @@ -1,5 +1,5 @@ -2024/06/18-10:41:57.680100 70f947600640 Delete type=3 #1 -2024/06/18-10:41:57.682228 70f946c00640 Level-0 table #5: started -2024/06/18-10:41:57.683460 70f946c00640 Level-0 table #5: 6787 bytes OK -2024/06/18-10:41:57.684707 70f946c00640 Delete type=0 #3 -2024/06/18-10:41:57.684956 70f946c00640 Manual compaction at level-0 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) +2024/06/24-21:25:51.813834 7fd3f8fbd700 Delete type=3 #1 +2024/06/24-21:25:51.816127 7fd3f7d40700 Level-0 table #5: started +2024/06/24-21:25:51.819760 7fd3f7d40700 Level-0 table #5: 6787 bytes OK +2024/06/24-21:25:51.827595 7fd3f7d40700 Delete type=0 #3 +2024/06/24-21:25:51.827676 7fd3f7d40700 Manual compaction at level-0 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) diff --git a/src/packs/helper-actors/LOG b/src/packs/helper-actors/LOG index a1924ce..20aca2f 100644 --- a/src/packs/helper-actors/LOG +++ b/src/packs/helper-actors/LOG @@ -1,5 +1,5 @@ -2024/06/18-10:41:57.762408 7f3ebe800640 Delete type=3 #1 -2024/06/18-10:41:57.765316 7f3ebd800640 Level-0 table #5: started -2024/06/18-10:41:57.766837 7f3ebd800640 Level-0 table #5: 1751 bytes OK -2024/06/18-10:41:57.768732 7f3ebd800640 Delete type=0 #3 -2024/06/18-10:41:57.769025 7f3ebd800640 Manual compaction at level-0 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) +2024/06/24-21:25:51.937578 7f0e72fbe700 Delete type=3 #1 +2024/06/24-21:25:51.939623 7f0e71540700 Level-0 table #5: started +2024/06/24-21:25:51.943112 7f0e71540700 Level-0 table #5: 1751 bytes OK +2024/06/24-21:25:51.946116 7f0e71540700 Delete type=0 #3 +2024/06/24-21:25:51.946188 7f0e71540700 Manual compaction at level-0 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) diff --git a/src/packs/helper-macros/LOG b/src/packs/helper-macros/LOG index 093d627..c4947f8 100644 --- a/src/packs/helper-macros/LOG +++ b/src/packs/helper-macros/LOG @@ -1,5 +1,5 @@ -2024/06/18-10:41:57.843986 725194a00640 Delete type=3 #1 -2024/06/18-10:41:57.846307 72518f800640 Level-0 table #5: started -2024/06/18-10:41:57.847516 72518f800640 Level-0 table #5: 20105 bytes OK -2024/06/18-10:41:57.848771 72518f800640 Delete type=0 #3 -2024/06/18-10:41:57.848911 72518f800640 Manual compaction at level-0 from '!folders!8FWN37c0gcpAisAv' @ 72057594037927935 : 1 .. '!macros!ypFtlnrgQkzqLpxI' @ 0 : 0; will stop at (end) +2024/06/24-21:25:52.063889 7f3526ffd700 Delete type=3 #1 +2024/06/24-21:25:52.066002 7f35267fc700 Level-0 table #5: started +2024/06/24-21:25:52.069526 7f35267fc700 Level-0 table #5: 20105 bytes OK +2024/06/24-21:25:52.072473 7f35267fc700 Delete type=0 #3 +2024/06/24-21:25:52.072548 7f35267fc700 Manual compaction at level-0 from '!folders!8FWN37c0gcpAisAv' @ 72057594037927935 : 1 .. '!macros!ypFtlnrgQkzqLpxI' @ 0 : 0; will stop at (end) diff --git a/src/packs/module-docs/000005.ldb b/src/packs/module-docs/000005.ldb index 7492ed5..ee4ac18 100644 Binary files a/src/packs/module-docs/000005.ldb and b/src/packs/module-docs/000005.ldb differ diff --git a/src/packs/module-docs/LOG b/src/packs/module-docs/LOG index fe560de..b6f2e19 100644 --- a/src/packs/module-docs/LOG +++ b/src/packs/module-docs/LOG @@ -1,5 +1,5 @@ -2024/06/18-10:41:57.926511 710681e00640 Delete type=3 #1 -2024/06/18-10:41:57.929373 710680a00640 Level-0 table #5: started -2024/06/18-10:41:57.930861 710680a00640 Level-0 table #5: 20877 bytes OK -2024/06/18-10:41:57.932097 710680a00640 Delete type=0 #3 -2024/06/18-10:41:57.932311 710680a00640 Manual compaction at level-0 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!w4TImRTAiNiqDWeL.vQhO6BVdKZOubTUQ' @ 0 : 0; will stop at (end) +2024/06/24-21:25:52.185506 7f4b3a7bd700 Delete type=3 #1 +2024/06/24-21:25:52.187614 7f4b397bb700 Level-0 table #5: started +2024/06/24-21:25:52.190994 7f4b397bb700 Level-0 table #5: 21157 bytes OK +2024/06/24-21:25:52.194054 7f4b397bb700 Delete type=0 #3 +2024/06/24-21:25:52.194144 7f4b397bb700 Manual compaction at level-0 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!w4TImRTAiNiqDWeL.vQhO6BVdKZOubTUQ' @ 0 : 0; will stop at (end) diff --git a/src/packs/module-docs/MANIFEST-000002 b/src/packs/module-docs/MANIFEST-000002 index 74f2553..9a465b5 100644 Binary files a/src/packs/module-docs/MANIFEST-000002 and b/src/packs/module-docs/MANIFEST-000002 differ diff --git a/src/packsrc/common-actions/Companion_WfqlcSZ7OPaa7lR2.json b/src/packsrc/common-actions/Companion_WfqlcSZ7OPaa7lR2.json new file mode 100644 index 0000000..07b0479 --- /dev/null +++ b/src/packsrc/common-actions/Companion_WfqlcSZ7OPaa7lR2.json @@ -0,0 +1,58 @@ +{ + "name": "Companion", + "type": "action", + "folder": "rXqlP1phfPHNZrRT", + "_id": "WfqlcSZ7OPaa7lR2", + "img": "icons/creatures/mammals/dog-husky-white-blue.webp", + "system": { + "description": "

Animal Companions, guard dogs, familiars, etc

", + "notes": "", + "source": "", + "swid": "companion", + "additionalStats": {}, + "favorite": false, + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "E4Pbzvi0": { + "name": "Place Companion", + "type": "macro", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "", + "uuid": "Compendium.swade-mb-helpers.helper-macros.Macro.AjuA11hQ48UJNwlH", + "macroActor": "self", + "isHeavyWeapon": false + } + } + }, + "choiceSets": [] + }, + "effects": [], + "sort": 0, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.4.1", + "coreVersion": "11.315", + "createdTime": 1719281390401, + "modifiedTime": 1719281480747, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!items!WfqlcSZ7OPaa7lR2" +} diff --git a/src/packsrc/common-actions/Eidolon_jlcWxKDqboK2xLzV.json b/src/packsrc/common-actions/Eidolon_jlcWxKDqboK2xLzV.json new file mode 100644 index 0000000..c171c77 --- /dev/null +++ b/src/packsrc/common-actions/Eidolon_jlcWxKDqboK2xLzV.json @@ -0,0 +1,58 @@ +{ + "name": "Eidolon", + "type": "action", + "folder": "rXqlP1phfPHNZrRT", + "_id": "jlcWxKDqboK2xLzV", + "img": "icons/environment/creatures/monster-barbed-carapace-purple.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "swid": "eidolon", + "additionalStats": {}, + "favorite": false, + "category": "Savage Pathfinder (Summoner)", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "E4Pbzvi0": { + "name": "Summon Eidolon", + "type": "macro", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "", + "uuid": "Compendium.swade-mb-helpers.helper-macros.Macro.AjuA11hQ48UJNwlH", + "macroActor": "self", + "isHeavyWeapon": false + } + } + }, + "choiceSets": [] + }, + "effects": [], + "sort": 0, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.4.1", + "coreVersion": "11.315", + "createdTime": 1719281279098, + "modifiedTime": 1719281348612, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!items!jlcWxKDqboK2xLzV" +} diff --git a/src/packsrc/module-docs/Macros_Mw1g2Fx5dp4SoqVP.json b/src/packsrc/module-docs/Macros_Mw1g2Fx5dp4SoqVP.json index 7569aa1..7ac5399 100644 --- a/src/packsrc/module-docs/Macros_Mw1g2Fx5dp4SoqVP.json +++ b/src/packsrc/module-docs/Macros_Mw1g2Fx5dp4SoqVP.json @@ -38,7 +38,7 @@ }, { "sort": 200000, - "name": "Summoning & Spiritual Weapon", + "name": "Summoning, Spiritual Weapon, and Companions", "type": "text", "_id": "9kDcPyCrI6hbF0qA", "title": { @@ -48,7 +48,7 @@ "image": {}, "text": { "format": 1, - "content": "

The Summon effects (Summon Ally, Summon Monster, Summon Nature's Ally, Summon Animal, Summon Planar Ally, Summon Undead, Zombie, and Spiritual Weapon (a modifier on Smite)) expect to have zero targets, and depends on the existence of an Actor folder called \"Summonables/<POWER>\" on the Actor sidebar (eg \"Summonables/Summon Ally\"). For the specialty summon effects (Summon Monster and the like) the folder is \"Summonables/Creatures\" for a shared folder. If this folder has subfolders, they'll be used by the macro to sort the list of available summonables. In the Summonables/<POWER> folder and subfolders, place the Actors that are available for summoning.

Template Actors

The Summonables/<POWER> folders are enhanced by template npc actors. If present, these enable additional automation when using some aspects of SWADE or SWPF summoning.

Summon Animal, Summon Monster, Summon Nature's Ally, Summon Planar Ally, Summon Undead

The specialty summon powers use a shared folder \"Summonables/Creatures\", with summoning costs and per-power availability set by the Set Summoning Cost macro. There are no template actors for Summonables/Creatures.

Summon Ally

The Summon Ally power requires some additional setup:

  1. an NPC actor called \"Mirror Self\" that has your version of the Construct and Fearless special abilities (only)

  2. (optional but recommended) the additional template actors described below

\"Summonables/Summon Ally\" also benefit from \"raise_template\", \"combat-edge_template\", \"flight_template\", in addition to \"raise_template\" mentioned above. In all template actors, please ensure that no two Items are named exactly the same (eg an Edge named 'Frenzy' and an action named 'Frenzy' will not work) due to a limitation in WarpGate.

(I cannot include these template actors in this module because a) they'd be different for SWADE and SWPF, and b) I can't redistribute the embedded abilities as it is copyrighted material).

raise_template

this npc actor should have your handmade or purchased system content's Resilient ability and any effects embedded in that ability.

combat-edge_template

This npc actor should have every combat edge you want to support dragged to the actor.

flight_template

This npc actor should have a Flight Item (probably a special ability) and/or the Flying active effect.

Zombie

The Zombie power requires an additional step as well. Raises are different for Zombie, as are some other effects. Zombie therefore does not require a \"raise_template\", but does need an \"armed_template\" which should have (only) Items that represent a hand weapon and a ranged weapon.

Spiritual Weapon

Smite's Spiritual Weapon works as a separate macro from the effect macro, selected using the 'Spiritual Weapon' modifier on the main power, that summons a spiritual weapon. Put the potential Spiritual Weapon tokens in a Summonables/Spiritual Weapon folder. The macro will copy the specified arcane skill from the summoner, but the spiritual weapon actor should have a weapon object with a swid of 'spritual-weapon'. This item will be modified with an action for the arcane skill, and if a raise the damage will be increased.

" + "content": "

The Summon effects (Summon Ally, Summon Monster, Summon Nature's Ally, Summon Animal, Summon Planar Ally, Summon Undead, Zombie, and Spiritual Weapon (a modifier on Smite)) expect to have zero targets, and depends on the existence of an Actor folder called \"Summonables/<POWER>\" on the Actor sidebar (eg \"Summonables/Summon Ally\"). For the specialty summon effects (Summon Monster and the like) the folder is \"Summonables/Creatures\" for a shared folder. If this folder has subfolders, they'll be used by the macro to sort the list of available summonables. In the Summonables/<POWER> folder and subfolders, place the Actors that are available for summoning.

Template Actors

The Summonables/<POWER> folders are enhanced by template npc actors. If present, these enable additional automation when using some aspects of SWADE or SWPF summoning.

Summon Animal, Summon Monster, Summon Nature's Ally, Summon Planar Ally, Summon Undead

The specialty summon powers use a shared folder \"Summonables/Creatures\", with summoning costs and per-power availability set by the Set Summoning Cost macro. There are no template actors for Summonables/Creatures.

Summon Ally

The Summon Ally power requires some additional setup:

  1. an NPC actor called \"Mirror Self\" that has your version of the Construct and Fearless special abilities (only)

  2. (optional but recommended) the additional template actors described below

\"Summonables/Summon Ally\" also benefit from \"raise_template\", \"combat-edge_template\", \"flight_template\", in addition to \"raise_template\" mentioned above. In all template actors, please ensure that no two Items are named exactly the same (eg an Edge named 'Frenzy' and an action named 'Frenzy' will not work) due to a limitation in WarpGate.

(I cannot include these template actors in this module because a) they'd be different for SWADE and SWPF, and b) I can't redistribute the embedded abilities as it is copyrighted material).

raise_template

this npc actor should have your handmade or purchased system content's Resilient ability and any effects embedded in that ability.

combat-edge_template

This npc actor should have every combat edge you want to support dragged to the actor.

flight_template

This npc actor should have a Flight Item (probably a special ability) and/or the Flying active effect.

Zombie

The Zombie power requires an additional step as well. Raises are different for Zombie, as are some other effects. Zombie therefore does not require a \"raise_template\", but does need an \"armed_template\" which should have (only) Items that represent a hand weapon and a ranged weapon.

Spiritual Weapon

Smite's Spiritual Weapon works as a separate macro from the effect macro, selected using the 'Spiritual Weapon' modifier on the main power, that summons a spiritual weapon. Put the potential Spiritual Weapon tokens in a Summonables/Spiritual Weapon folder. The macro will copy the specified arcane skill from the summoner, but the spiritual weapon actor should have a weapon object with a swid of 'spritual-weapon'. This item will be modified with an action for the arcane skill, and if a raise the damage will be increased.

Eidolons and Companions

Two actions exist in the 'SWADE MB Common Actions' compendium: Eidolon and Companion. These act as 'summoning' powers with an infinite duration for the Summoner's Eidolon and for any other companions a player may need to place on the map. Their folders are Summonables/Eidolon and Summonables/Companion respectively, and work best when each named actor gets their own subfolder.

" }, "video": { "controls": true, @@ -65,7 +65,7 @@ "systemVersion": "3.4.1", "coreVersion": "11.315", "createdTime": 1695617584063, - "modifiedTime": 1718163652096, + "modifiedTime": 1719281763900, "lastModifiedBy": "sVoCvBU1knmXzoYe" }, "_key": "!journal.pages!Mw1g2Fx5dp4SoqVP.9kDcPyCrI6hbF0qA" @@ -471,7 +471,7 @@ "systemVersion": "3.4.1", "coreVersion": "11.315", "createdTime": 1678169291843, - "modifiedTime": 1718163809765, + "modifiedTime": 1719281763900, "lastModifiedBy": "sVoCvBU1knmXzoYe" }, "_id": "Mw1g2Fx5dp4SoqVP",