Ultimate Amiga

Games Corner => The Crypt of Bloodwych => Bloodwych Editors and Modifications => Topic started by: MrFlay on July 25, 2019, 09:20:53 AM

Title: Spells
Post by: MrFlay on July 25, 2019, 09:20:53 AM
I use these pages very often. Many thanks to all contributing persons here. :D

Since I continue my code, I have some unanswered questions.
Each spell has its own level of difficulty. For example, Vivify is too complex at the beginning. But with each level up, the exercise improves more and more.
Then there is the possibility to practice each spell individually.
Spells that succeed with bad chance are practiced faster.
It should also be dependent on the intelligence of the champion?

In summary, the exercise with a spell depends on the level and the individual exercise.

My question: Have you already decrypted the exact mechanism. How does this work in detail in the game? Where is this stored in memory?
I want to understand that from the point of view of a programmer.
Title: Re: Spells
Post by: Hungry Horace on July 25, 2019, 04:03:48 PM
I will confess I don’t know the mechanism, but if I have a chance I will dig through the uncommented 68000 code and at least work out the relevant area, and perhaps collectively we can get it worked through/commented
Title: Re: Spells
Post by: Hungry Horace on July 25, 2019, 04:45:52 PM
My only problem with this, is that I have been very productive on another project recently and any activity on Bloodwych with others always has the end result of distracting me!

I think it’s time the source code ended up on GitHub so that we can all work on it collectively ... even it’s just for comments.

I just need to be sure we have a compiled version being produced from the source. I did manage it the once!!

I wonder if BruceUncle is around to help clean up a couple of things....
Title: Re: Spells
Post by: Hungry Horace on July 25, 2019, 06:48:23 PM
Code: [Select]
bsr.s adrCd004E8E ;6112
bne.s adrCd004E86 ;6608
bsr adrCd006698 ;61001818
bsr adrCd00C85E ;610079DA
move.w #$0002,$0014(a5) ;3B7C00020014
rts ;4E75

bsr adrCd00665C ;610017CC
clr.w adrW_00505A.l ;42790000505A
move.b $0007(a5),adrB_00EE3E.l ;13ED00070000EE3E
move.b $0013(a4),d0 ;102C0013
bmi.s adrCd004E8C ;6BE6
subq.b #$03,d0 ;5700
beq.s adrCd004EBE ;6714
cmp.w #$0008,$0042(a5) ;0C6D00080042
bne.s adrCd004EBE ;660C
movem.l d0-d7/a0-a6,-(sp) ;48E7FFFE
bsr adrCd00332A ;6100E472
movem.l (sp)+,d0-d7/a0-a6 ;4CDF7FFF
subq.b #$04,$0007(a4) ;592C0007
bcc.s adrCd004EC8 ;6404
clr.b $0007(a4) ;422C0007
move.b #$0F,$001B(a4) ;197C000F001B
clr.b $0011(a4) ;422C0011
bsr adrCd00688C ;610019B8
move.b $0009(a4),d1 ;122C0009
sub.b d0,d1 ;9200
bcs adrCd004FD6 ;650000F8
move.b d1,$0009(a4) ;19410009
tst.b d0 ;4A00
bne.s adrCd004EFA ;6612
move.b $0013(a4),d0 ;102C0013
bsr adrCd006900 ;61001A12
lea RingUses.l,a0 ;41F90000EE32
subq.b #$01,$00(a0,d0.w) ;53300000
bsr adrCd0080CA ;610031CE
bsr adrCd006778 ;61001878
moveq #$00,d0 ;7000
move.b $0013(a4),d0 ;102C0013
lea adrEA00685E.l,a6 ;4DF90000685E
move.b $00(a6,d0.w),d1 ;12360000
addq.b #$05,d1 ;5A01
add.b $0015(a4),d1 ;D22C0015
cmp.b #$64,d1 ;0C010064
bcs.s adrCd004F20 ;6502
moveq #$64,d1 ;7264
move.b d1,$0015(a4) ;19410015
add.w d0,d0 ;D040
lea Spells_01_Armour.l,a0 ;41F90000505C
lea Spells_LookupTable.l,a6 ;4DF90000500C
add.w $00(a6,d0.w),a0 ;D0F60000
bsr adrCd005546 ;6100060E
add.b d0,d7 ;DE00
bmi.s adrCd004FB0 ;6B72
move.w d7,-(sp) ;3F07
bsr adrCd008498 ;61003556
move.w (sp)+,d7 ;3E1F
move.w $00(a6,d0.w),d1 ;32360000
and.w #$0007,d1 ;02410007
subq.w #$06,d1 ;5D41
bne.s adrCd004F5E ;660C
move.b $00(a6,d0.w),d1 ;12360000
and.w #$0003,d1 ;02410003
beq adrCd004FEE ;67000092
move.l a4,-(sp) ;2F0C
jsr (a0) ;4E90
moveq #$00,d0 ;7000
move.b adrB_00EE3E.l,d0 ;10390000EE3E
bsr adrCd004078 ;6100F10C
tst.w d1 ;4A41
bmi.s adrCd004F8E ;6B1C
beq.s adrCd004F86 ;6712
move.w d1,d7 ;3E01
tst.w $0042(a5) ;4A6D0042
bpl.s adrCd004F8E ;6A12
bsr adrCd007EF0 ;61002F72
bsr adrCd007ED2 ;61002F50
bra.s adrCd004F8E ;6008

move.w $0006(a5),d7 ;3E2D0006
bsr adrCd00CCD8 ;61007D4C
move.l (sp)+,a4 ;285F
move.l #adrL_007E22,a0 ;207C00007E22
add.l a4,a0 ;D1CC
moveq #$00,d0 ;7000
move.b $0013(a4),d0 ;102C0013
addq.b #$01,$00(a0,d0.w) ;52300000
bcc.s adrCd004FA8 ;6404
subq.b #$01,$00(a0,d0.w) ;53300000
lea NullString.l,a6 ;4DF90000CAE9
bra.s adrCd004FBE ; 600E

lea SpellFailedMsg.l,a6 ;4DF90000504C
move.w #$0004,adrW_00D92A.l ;33FC00040000D92A
move.b #$FF,$0013(a4) ;197C00FF0013
tst.b adrB_00505B.l ;4A390000505B
bne.s adrCd004FD4 ;6608
jsr LowerText.l ;4EB90000CFB8
moveq #$00,d0 ;7000

rts ;4E75

tst.b adrB_00505B.l ;4A390000505B
bne.s adrCd004FD4 ;66F6
lea adrEA00EA62.l,a6 ;4DF90000EA62
jsr LowerText.l ;4EB90000CFB8
moveq #$01,d0 ;7001
rts ;4E75

lea SpellFizzledMsg.l,a6 ;4DF900004FFE
move.w #$0008,adrW_00D92A.l ;33FC00080000D92A
bra.s adrCd004FBE ;60C0

dc.b 'SPELL FIZZLED' ;5350454C4C2046495A5A4C4544
dc.b $FF ;FF

dc.w Spells_01_Armour-Spells_01_Armour ;0000
dc.w Spells_02_Terror-Spells_01_Armour ;0022
dc.w Spells_03_Vitalise-Spells_01_Armour ;002A
dc.w Spells_04_Biguile-Spells_01_Armour ;0032
dc.w Spells_05_Deflect-Spells_01_Armour ;0062
dc.w Spells_06_Magelock-Spells_01_Armour ;0066
dc.w Spells_07_Conceal-Spells_01_Armour ;00DA
dc.w Spells_08_Warpower-Spells_01_Armour ;00F6
dc.w Spells_09_Missle-Spells_01_Armour ;00FC
dc.w Spells_10_Vanish-Spells_01_Armour ;0106
dc.w Spells_11_Paralyze-Spells_01_Armour ;010C
dc.w Spells_12_Alchemy-Spells_01_Armour ;0114
dc.w Spells_13_Confuse-Spells_01_Armour ;0174
dc.w Spells_14_Levitate-Spells_01_Armour ;017C
dc.w Spells_15_Antimage-Spells_01_Armour ;0182
dc.w Spells_16_Recharge-Spells_01_Armour ;0188
dc.w Spells_17_Trueview-Spells_01_Armour ;01CA
dc.w Spells_18_Renew-Spells_01_Armour ;01D0
dc.w Spells_19_Vivify-Spells_01_Armour ;0222
dc.w Spells_20_Dispell-Spells_01_Armour ;0258
dc.w Spells_21_Firepath-Spells_01_Armour ;0298
dc.w Spells_22_Illusion-Spells_01_Armour ;02A0
dc.w Spells_23_Compass-Spells_01_Armour ;02A6
dc.w Spells_24_Spelltap-Spells_01_Armour ;02AC
dc.w Spells_25_Disrupt-Spells_01_Armour ;02B2
dc.w Spells_26_Fireball-Spells_01_Armour ;02C0
dc.w Spells_27_Wychwind-Spells_01_Armour ;03C0
dc.w Spells_28_ArcBolt-Spells_01_Armour ;0412
dc.w Spells_29_Formwall-Spells_01_Armour ;041A
dc.w Spells_30_Summon-Spells_01_Armour ;048A
dc.w Spells_31_Blaze-Spells_01_Armour ;0490
dc.w Spells_32_Mindrock-Spells_01_Armour ;049E
dc.b 'SPELL FAILED' ;5350454C4C204641494C4544
dc.b $FF ;FF
dc.b $00 ;00
dc.b $00 ;00
dc.b $00 ;00

Title: Re: Spells
Post by: MrFlay on July 26, 2019, 08:30:27 AM
Thank you for your honest answer.

I know the assembler code of Bloodwych, it is very complex.
When I saw the code for the first time, I did not understand anything.
Also after some time I think I understand 68k assembler just too bad to master that.
So how can I help with that?  :-[

Are you still working directly on Amiga hardware? I use Linux with a PC.
Is an Amiga bloodwych version still useful?
Would you like to bring Bloodwych to other operating systems?
What is your goal?

My approach is to have a C++ version of Bloodwych, which is tested against the behavior of the Amiga version.
If the correct behavior can't be found then it has to be simulated as well as possible (as Bloodwych HTML did).

Therefore, it would help me a lot to collect all the information about the magic system of Bloodwych.
Title: Re: Spells
Post by: adrazar on July 26, 2019, 01:20:55 PM
I had a look at the code dump, it would appear the interesting things happen in the two subroutines adrCd005546 and adrCd008498. I could check out those too if you'd post them next :D
Title: Re: Spells
Post by: Hungry Horace on July 26, 2019, 03:04:15 PM
My goal is to have a perfect recompile of Bloodwych for the Amiga, which I can the insert edited data (maps, graphics, etc) into and /or include the option for some enhancements, which again, are informed by data blocks (ie something you can export from an editor)

I’ve already done a lot of this, with my Book of Skulls modification... for example many of the monsters have names - not just Zendick! - but my 68k code hacks are not clever enough to say, allow a machine which shoots arrows instead of arc bolts. Or create a new type of armour with “deflects” arrows (like the “deflect” spell)... or even show a different monster on screen when you walk onto the completion square!

On the Zx Spectrum there have been similar projects such as “Jet Set Willy 64” an enhanced version of the classic game which can still be run on the original machine.

A fully commented set of code would allow these type of enhanced mods which overall still work with the original game mechanics, and also allow others to port it onto other newer hardware.

I still love to use original Amiga hardware, but I also emulate., so i do most of my investigations on there!
Title: Re: Spells
Post by: Hungry Horace on July 26, 2019, 03:05:20 PM
I had a look at the code dump, it would appear the interesting things happen in the two subroutines adrCd005546 and adrCd008498. I could check out those too if you'd post them next :D

I will grab those tonight for you ;)
Title: Re: Spells
Post by: Hungry Horace on July 28, 2019, 09:51:25 PM
There’s a random number generator after his routine so I stopped there (and shortly after “view spell” which I assume is more of a gfx routine.

Code: [Select]
moveq #$03,d6 ;7C03
moveq #$02,d5 ;7A02
bsr.s adrCd005556 ;610A
add.w d0,d6 ;DC40
dbra d5,adrLp00554A ;51CDFFFA
move.w d6,d0 ;3006
rts ;4E75

move.w adrW_0055AA.l,d0 ;3039000055AA
addq.w #$01,d0 ;5240
mulu #$B640,d0 ;C0FCB640
move.l d0,d1 ;2200
asl.l #$04,d0 ;E980
add.l d1,d0 ;D081
move.w #$0511,d1 ;323C0511
moveq #$00,d3 ;7600
divu d1,d0 ;80C1
bvc.s adrCd005580 ;680E
move.w d0,d2 ;3400
clr.w d0 ;4240
swap d0 ;4840
divu d1,d0 ;80C1
move.w d0,d3 ;3600
move.w d2,d0 ;3002
bra.s adrCd00556E ;60EE

subq.w #$01,d1 ;5341
swap d0 ;4840
move.w d3,d0 ;3003
swap d0 ;4840
divu d1,d0 ;80C1
clr.w d0 ;4240
swap d0 ;4840
move.w d0,adrW_0055AA.l ;33C0000055AA
moveq #$06,d1 ;7206
divu d1,d0 ;80C1
bvc.s adrCd0055A6 ;680C
move.w d0,d2 ;3400
clr.w d0 ;4240
swap d0 ;4840
divu d1,d0 ;80C1
move.w d2,d0 ;3002
bra.s adrCd005596 ;60F0

swap d0 ;4840
rts ;4E75

dc.b $03 ;03
Title: Re: Spells
Post by: Hungry Horace on July 28, 2019, 09:55:24 PM
This one seems like a more generic bit of code and includes the “coord to map” routine, so probably it is used to make the spell have an effect on areas around it.

Code: [Select]
move.l $001C(a5),d7 ;2E2D001C
move.l adrL_00EE78.l,a6 ;2C790000EE78
move.w d7,d0 ;3007
mulu adrW_00EE70.l,d0 ;C0F90000EE70
swap d7 ;4847
add.w d7,d0 ;D047
swap d7 ;4847
add.w d0,d0 ;D040
add.w adrW_00EE76.l,d0 ;D0790000EE76
rts ;4E75
Title: Re: Spells
Post by: MrFlay on July 29, 2019, 08:13:03 AM
Regardless of the posted assembler code (thanks for posting), I would like to to summarize:
A spell can refer to a single champion (armour, warpower ...), to the whole party (vitalise), to the field in front of the party or it's a projectile spell. A spell has a magic class or form (green=serpent, blue=moon ...), a value of difficulty, an experience value and a learned flag (a name, four runes and a description of course).
Did I forget something?

The remaining values (cool down timer, intelligence, vitalize ...) should be derived from the champion values.
The game behavior should be derived completely from these values.
Please correct me if I'm wrong.
I hope the assembler code brings a better clarification.
Title: Re: Spells
Post by: Hungry Horace on July 29, 2019, 08:51:27 AM
The only thing I think you missed , should be the most obvious!

That the characters class determines difficulty, eg wizards, adventures, cutpurses then warriors. (Possibly the last two are equal)

I believe the intelligence of a character may also determine the maximum number of spell points made available to them (increased on each level gain) . Certainly they are not all equal.
Title: Re: Spells
Post by: adrazar on July 29, 2019, 01:54:07 PM
Ok, the first subroutine generates 2D6 + 3 :P
The other indicates that spells fizzle depending map content.. (did I just make it obvious that I've never played this game? :o)

This was a bit clarifying but didn't get me a lot closer to completing the picture, unfortunately :/. And there are still at least six subroutines that could be affecting the casting abilities in some way. Maybe the easiest way to proceed would be to simply attach the entire file and have me go through each them?

One more thing: a4 (and maybe a5) seems to point to a "struct" which I guess must have something to do with the character stats. Any already known details about this struct would be great to have. :)
Title: Re: Spells
Post by: MrFlay on July 29, 2019, 03:40:52 PM
This can be found here in the forum under "Hacking: A Guide to the Data-Structure of Bloodwych" at "Champion Data Structure".
Title: Re: Spells
Post by: Hungry Horace on July 29, 2019, 04:33:19 PM
I will also have a look at getting the source on GitHub , plus the data blocks etc.

Perhaps it is time I moved all of the hacking guide stuff on there as well.
Title: Re: Spells
Post by: adrazar on July 29, 2019, 05:23:17 PM
This can be found here in the forum under "Hacking: A Guide to the Data-Structure of Bloodwych" at "Champion Data Structure".
Awesome, that looks right :D
Title: Re: Spells
Post by: Hungry Horace on July 29, 2019, 08:49:44 PM
Right, i've set up the GitHub, it is here:


I've managed to compile it, and the final code does work, but it's not identical to the original. I am testing it with WHDLoad which bypasses the copy-protection.

It could be my DevPac settings which are stopping this being the same. I am not familiar enough with Devpac to tell.

A resource (.rs) file, as provided by BruceUncle, is also included.

I would really like to get this producing an identical file first, then perhaps contributor can either comment-up what is happening and/or at least get us some 'human' labels in there!
Title: Re: Spells
Post by: MrFlay on July 30, 2019, 08:08:07 AM
A big thank you for the great work!  8)
There was already a lot of work going on, as I see.

A ReadMe.txt in each folder might be quite handy, which explains the file structure of all contained files.

for example:
  Interchange File Format (IFF) 8SVX audio files

In this way, information from this forum would be included there.
('kill two birds with one stone')  ;)
Title: Spells
Post by: Hungry Horace on July 30, 2019, 10:43:07 PM
I've started working on my Excel labelling sheet macros again.

This has a list of resourced labels and will find/replace accordingly.

I am working on a function to add in data blocks / files as well, although i want some validation checking on that (that the data file and declared data in the code are the same, or at least the same size!!)

i will also look at a system for adding code comments that are in the spreadsheet as well. This way it is all recovered if reverting back to a previous ReSourced code

There's quite a few 'offset labels' (e.g. label+2 ) which are created as unique labels that will need fixing, as sometimes they jump into the data blocks. (Like ChampionData+2) which is a cheap way of arriving at the worn armour
Title: Re: Spells
Post by: adrazar on July 31, 2019, 08:49:13 PM
I've figured out the rules for determining spell casting success/failure, but the presentation here will have to wait till tomorrow. However, I could mention one thing right away; I found that all spells are practiced equally fast regardless of difficulty, contrary to what was said in the first post. If that is clearly a wrong conclusion then I should probably look further into some of the later subroutines.
Title: Re: Spells
Post by: Hungry Horace on July 31, 2019, 11:34:59 PM
Ffs.... tapatalk crashed mid reply....  and it’s a long one! Here I go again....

Firstly thank you for even looking at this! It is appreciated!!!

Are you saying that becoming more proficient at spells is simply dependent on the character becoming better at magic overall, and does not directly link to learning the individual spell being cast?

This I could believe.

The spell definitely has a difficulty - it is called “cast” in game and is shown as a small bar. The fuller the bar the more likely a spell will be cast successfully, and the easier a spell is to cast, the more powerful some are.

Some spells with power include FirePath which will last longer and damage more with a better cast, and Summon, which brings a wandering monster into being (his strength and hitpoints are determined by his level, which also affects what colour he is so you get a good visual indicator immediately)

As well as “learning”, I believe cast can be improved by:

- Being a wizard (instead of a warrior for example!)
- Casting a spell of the same colour/class as the character
- choosing to spend more spell points on the cast (if your character has them available)
- holding a wand of the same colour/class in your hand
- presumably depending on the characters intelligence

However, for each spell to have a “learnt” value, (which would need at minimum 4 values, but 8 seems more likely, and with 32 spells to choose from, across 16 characters this would require a data block of (I think) at least 64 bytes.... I am hopeful I would have noticed such a block being referred to when cutting up the data of that was the case.

Now if you tell me that every character has a single byte which is used for “spell ability learnt” I would not be at all surprised as there are 1 or 2 bytes of character data (one of which I am sure relates to spells and is changed when the game starts) which I have never managed to work out.
Title: Re: Spells
Post by: adrazar on August 01, 2019, 03:32:21 PM
In the context of Click_LaunchSpellFromBook, the two unknown bytes in the champion data structure are used this way:
Byte 13 (hex) is the number of the spell that the player attempts to cast.
Byte 14 (hex) is the spell power boost gained by spending additional mana.

Well, what I meant about practicing a spell will be clear in a moment.. ("spoiler": each spell is practiced individually by counting the number of times it has succeeded (all champions contribute to the same count). A high number of successes increase the chances of further successes for that particular spell.)

In the following I will say that champions, wands, rings and spells matches if their colour matches.

Mana Cost

(Attempting to cast a spell always reduces vitality (Byte 07) by 4 to a minimum of 0, and sets the attack cooldown timer (Byte 1B) to 15, but neither of these two stats have any effect on the spell success chance.)

Each spell has a base mana cost that is derived from the first row of this table:

|               1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  |
|              ------------------------------------------------------------------------------------------------------------------------------  |
| Spellcost     1   2   2   1   1   2   2   3   1   3   2   5   2   2   4   5   3   3   7   3   4   4   2   5   8   3   7   4   5   6   6   4  |
| Difficulty   14  15  14  14  13  14  14  15  14  15  14  18  15  15  17  16  15  16  36  16  17  19  14  18  24  16  22  16  17  19  18  16  |
                                                               Table 1: Spells

The base mana cost is

     2 * (Spellcost + 1)

e.g. spell 10 has base cost 8.
If an attack bonus/penalty is applied to the spell (Byte 14), the base value is adjusted according to the next table.

| Attack modifier   ..  -3  -2  -1   0   +1   +2   +3   +4   +5   +6   +7   +8   +9  +10  +11  +12 |
|                   ------------------------------------------------------------------------------ |
| Additional mana   ..  -3  -2  -1   0    3    6   10   15   21   28   36   45   55   66   78   91 |
                                   Table 2: Attack modifiers

Mana used on a single spell can't exceed 99.

If the champion wears a ring matching the spell, a charge from that will be spent instead of using mana.
Such spells are always cast unmodified (no attack bonus/penalty).

Casting success

If a champion matches the spell or is wielding a wand matching the spell, the base attack is given in Table 3A.
Otherwise the base attack is given in Table 3B.

+---------------------------------------+     +---------------------------------------+
|   #Successes         Base attack      |     |   #Successes         Base attack      |
|   ----------       ----------------   |     |   ----------       ----------------   |
|     0 - 4           0 + (X - 0)/1     |     |     0 - 9           0 + (X - 0)/2     |
|     5 - 14          5 + (X - 5)/2     |     |    10 - 29          5 + (X - 10)/4    |
|    15 - 34         10 + (X - 15)/4    |     |    30 - 69         10 + (X - 30)/8    |
|    35 - 74         15 + (X - 35)/8    |     |    70 - 127        15 + (X - 70)/16   |
|    75 - 127        20 + (X - 75)/16   |     +---------------------------------------+
+---------------------------------------+           Table 3B: Non-matching spell
         Table 3A: Matching spell

Here #Successes is the accumulated number of times the spell has succeeded. (The count stops increasing after 127 successes)

The base attack is adjusted by caster class:

|  Class:       Matching bonus       Level bonus    |
|  -------      --------------      -------------   |
|  Warrior            +3            +2 / 4 levels   |
|  Wizard             +5            +2 / 1 level    |
|  Adventurer         +4            +2 / 2 levels   |
|  Cutpurse           +4            +2 / 4 levels   |
               Table 4: Class bonuses

The matching bonus of Table 4 applies when the champion matches the spell. If the champion does not match but is wielding a wand that matches the spell, a matching bonus of +3 is used instead.
The level bonus is based on the level of the champion (Byte 0).

Next the attack bonus/penalty from mana adjustment (Byte 14) is added to the result.
A further +5 is added if a PowerStaff is equipped.

Now subtract the spell difficulty found in Table 1.
Finally the Spell Cool Down Timer (Byte 15), is subtracted from the result. Only half the Spell Cool Down Timer is subtracted if spell, equipped wand and champion are all matching.
Spell Cool Down Timer then increases by Spellcost+5 (ref. Table 1) to a maximum of 100.

If the final attack value plus 3D6 is less than 0 the spell fails, otherwise the spell succeeds. :)

The roll was of course the more natural 3D6 (three dice of value 0-5 plus 3)
Title: Re: Spells
Post by: Hungry Horace on August 01, 2019, 07:47:40 PM
wow, that is a lot of information, and very detailed, thank you!

You might need to give me a little time to take all this in before i comment too far. I will have a look at how to get this into the game-data/resourced code and labels.... plus getting this into the wiki / hacking guide!

quick - someone give him another bit of code to work through ;)
Title: Re: Spells
Post by: Hungry Horace on August 01, 2019, 09:57:26 PM
For references:

Label adrEA00685E = Spell  Cost table
Label adrB_00683E = Spell Difficulty table

Just getting my head around how i'm going to go through the section to get this understood in the code.
Title: Re: Spells
Post by: MrFlay on August 06, 2019, 05:27:11 PM
I'm back from vacation and very happy about the great news.
Soon will take a closer look at this. Thank you all!  8)