From 17c866e1cfd807a190a65d045be077bb7b9f96cc Mon Sep 17 00:00:00 2001 From: Carifio24 Date: Mon, 9 Feb 2026 00:15:47 -0500 Subject: [PATCH 1/3] Add Eberron: Forge of the Artificer sourcebook. --- app/src/main/java/dnd/jon/spellbook/Source.java | 1 + app/src/main/res/values-pt/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 5 insertions(+) diff --git a/app/src/main/java/dnd/jon/spellbook/Source.java b/app/src/main/java/dnd/jon/spellbook/Source.java index ed5bce67..47fb0ec5 100755 --- a/app/src/main/java/dnd/jon/spellbook/Source.java +++ b/app/src/main/java/dnd/jon/spellbook/Source.java @@ -39,6 +39,7 @@ public class Source implements NameDisplayable { static final Source BOOK_OF_MT = new Source(R.string.bmt_name, R.string.bmt_code, "The Book of Many Things", "BMT", false); static final Source PLAYERS_HANDBOOK_2024 = new Source(R.string.phb_2024_name, R.string.phb_2024_code, "Player's Handbook (2024)", "PHB24", true); static final Source HEROES_OF_FAERUN = new Source(R.string.frhof_name, R.string.frhof_code, "Forgotten Realms: Heroes of Faerûn", "FRHF", false); + static final Source EBERRON_FORGE_ARTIFICER = new Source(R.string.efa_name, R.string.efa_code, "Eberron: Forge of the Artificer", "EFA", false); // Constructor private Source(int value, int displayNameID, int codeID, String internalName, String internalCode, boolean core, boolean created) { diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 2b76c6eb..799fc8bd 100755 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -424,6 +424,7 @@ Sigil e as Terras Distantes O Livro de Muitas Coisas Reinos Esquecidos: Heróis de Faerûn + Eberron: A Forja do Artífice LDJ14 @@ -443,6 +444,7 @@ STD LMC REHF + EFA Nome diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ddf4930e..65c59bbd 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -426,6 +426,7 @@ Sigil and the Outlands The Book of Many Things Forgotten Realms: Heroes of Faerûn + Eberron: Forge of the Artificer PHB14 @@ -445,6 +446,7 @@ SO BMT FRHF + EFA Name From 1f02d74102911a8da15e8278c6cf06eac233c3f7 Mon Sep 17 00:00:00 2001 From: Carifio24 Date: Mon, 9 Feb 2026 00:16:01 -0500 Subject: [PATCH 2/3] Add Homunculus Servant spell. --- app/src/main/assets/Spells_en.json | 28 ++++++++++++++++++++++++++++ app/src/main/assets/Spells_pt.json | 28 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/app/src/main/assets/Spells_en.json b/app/src/main/assets/Spells_en.json index e93427dc..06213b68 100644 --- a/app/src/main/assets/Spells_en.json +++ b/app/src/main/assets/Spells_en.json @@ -27700,5 +27700,33 @@ "range": "60 feet", "ruleset": "2024", "school": "Abjuration" + }, + { + "casting_time": "1 hour", + "classes": [ + "Artificer" + ], + "components": [ + "V", + "S", + "M" + ], + "desc": "You summon a special homunculus in an unoccupied space within range. This creature uses the Homunculus Servant stat block. If you already have a homunculus from this spell, the homunculus is replaced by the new one. You determine the homunculus's appearance, such as a mechanical-looking bird, winged vial, or miniature animate cauldron.\n\nCombat. The homunculus is an ally to you and your allies. In combat, it shares your Initiative count, but it takes its turn immediately after yours. It obeys your commands (no action required by you). If you don't issue any, it takes the Dodge action and uses its movement to avoid danger.", + "duration": "Instantaneous", + "higher_level": "Use the spell slot's level for the spell's level in the stat block.", + "id": 941, + "level": 2, + "locations": [ + { + "page": 21, + "sourcebook": "EFA" + } + ], + "material": "A gem worth 100+ gp", + "name": "Homunculus Servant", + "range": "10 feet", + "ritual": true, + "ruleset": "2024", + "school": "Conjuration" } ] diff --git a/app/src/main/assets/Spells_pt.json b/app/src/main/assets/Spells_pt.json index 17d10a46..3aa48fa0 100644 --- a/app/src/main/assets/Spells_pt.json +++ b/app/src/main/assets/Spells_pt.json @@ -26592,5 +26592,33 @@ "range": "18 metros", "ruleset": "2024", "school": "Abjuração" + }, + { + "casting_time": "1 hora", + "classes": [ + "Artífice" + ], + "components": [ + "V", + "S", + "M" + ], + "desc": "Você invoca um homúnculo especial em um espaço desocupado dentro do alcance. Essa criatura usa o bloco de estatísticas de Servo Homúnculo. Se você já tiver um homúnculo conjurado por esta magia, o homúnculo anterior é substituído pelo novo. Você determina a aparência do homúnculo, como um pássaro mecânico, um frasco alado ou um caldeirão animado em miniatura.\n\nCombate. O homúnculo é um aliado seu e de seus companheiros. Em combate, ele compartilha sua contagem de Iniciativa, mas age imediatamente após o seu turno. Ele obedece aos seus comandos (nenhuma ação é necessária de sua parte). Se você não lhe der nenhuma ordem, ele realiza a ação de Esquivar e usa seu movimento para evitar o perigo.", + "duration": "Instantânea", + "higher_level":"Utilize o nível do espaço de magia para determinar o nível da magia no bloco de estatísticas.", + "id": 941, + "level": 2, + "locations": [ + { + "page": 21, + "sourcebook": "EFA" + } + ], + "material": "Uma joia no valor de mais de 100 peças de ouro", + "name": "Servo Homúnculo", + "range": "3 metros", + "ritual": true, + "ruleset": "2024", + "school": "Conjuração" } ] \ No newline at end of file From b1ee5be40b3b993c78c0d7d3d22134ecedec6322 Mon Sep 17 00:00:00 2001 From: Carifio24 Date: Mon, 9 Feb 2026 01:19:37 -0500 Subject: [PATCH 3/3] Add new source to next version and update tests. --- .../androidTest/java/dnd/jon/spellbook/InstrumentTest.java | 4 ++-- app/src/main/java/dnd/jon/spellbook/Spellbook.java | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/dnd/jon/spellbook/InstrumentTest.java b/app/src/androidTest/java/dnd/jon/spellbook/InstrumentTest.java index 7d938a9a..f5922e2d 100755 --- a/app/src/androidTest/java/dnd/jon/spellbook/InstrumentTest.java +++ b/app/src/androidTest/java/dnd/jon/spellbook/InstrumentTest.java @@ -289,7 +289,7 @@ public void testParseSpellList() { try (ActivityScenario scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity(activity -> { final SpellbookViewModel viewModel = new ViewModelProvider(activity).get(SpellbookViewModel.class); - assertEquals(viewModel.getAllSpells().size(), 920); + assertEquals(viewModel.getAllSpells().size(), 941); }); } } @@ -303,7 +303,7 @@ public void testParseSpellListPt() { final Application application = activity.getApplication(); final SpellbookViewModel viewModel = new SpellbookViewModel(application); viewModel.updateSpellsForLocale(ptLocale); - assertEquals(viewModel.getAllSpells().size(), 920); + assertEquals(viewModel.getAllSpells().size(), 941); }); } } diff --git a/app/src/main/java/dnd/jon/spellbook/Spellbook.java b/app/src/main/java/dnd/jon/spellbook/Spellbook.java index 768995c7..c1588708 100755 --- a/app/src/main/java/dnd/jon/spellbook/Spellbook.java +++ b/app/src/main/java/dnd/jon/spellbook/Spellbook.java @@ -27,6 +27,7 @@ class Spellbook { static final Version V_3_7_0 = new Version(3, 7, 0); static final Version V_4_1_0 = new Version(4, 1, 0); static final Version V_4_5_0 = new Version(4, 5, 0); + static final Version V_4_6_0 = new Version(4, 6, 0); // static final Version[] VERSIONS = { V_2_0_0, V_2_10_0, V_2_11_0, V_2_11_0, V_2_12_0, V_2_13_0, // V_3_0_4, V_3_0_6 }; @@ -42,6 +43,7 @@ class Spellbook { put(V_3_7_0, Arrays.asList(Source.BOOK_OF_MT)); put(V_4_1_0, Arrays.asList(Source.PLAYERS_HANDBOOK_2024)); put(V_4_5_0, Arrays.asList(Source.HEROES_OF_FAERUN)); + put(V_4_6_0, Arrays.asList(Source.EBERRON_FORGE_ARTIFICER)); }}; static Collection newSourcesForVersion(Version version) {